summaryrefslogtreecommitdiff
authorjosef <josef>2002-10-26 14:31:47 (UTC)
committer josef <josef>2002-10-26 14:31:47 (UTC)
commita4a1722ba3a2874adef57e0c04093814c0dc4f8f (patch) (unidiff)
treec8bf31f6c5e035a4d3e0b9412d7a6d523eb167db
parent2bd985c4f5a5c27260e6057a1ca8a2e0e586acbb (diff)
downloadopie-a4a1722ba3a2874adef57e0c04093814c0dc4f8f.zip
opie-a4a1722ba3a2874adef57e0c04093814c0dc4f8f.tar.gz
opie-a4a1722ba3a2874adef57e0c04093814c0dc4f8f.tar.bz2
- one-line fix:
+hposition = 0; Initialization should work correctly now
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/apps/opie-console/TEWidget.cpp1
1 files changed, 1 insertions, 0 deletions
diff --git a/noncore/apps/opie-console/TEWidget.cpp b/noncore/apps/opie-console/TEWidget.cpp
index d1ff85e..1c83710 100644
--- a/noncore/apps/opie-console/TEWidget.cpp
+++ b/noncore/apps/opie-console/TEWidget.cpp
@@ -102,512 +102,513 @@ static char * menu_xpm[] = {
102 "+c #FFFDAD", 102 "+c #FFFDAD",
103 "@c #FFFF00", 103 "@c #FFFF00",
104 "#c #E5E100", 104 "#c #E5E100",
105" ", 105" ",
106" ", 106" ",
107" ......... ", 107" ......... ",
108" .+++++++. ", 108" .+++++++. ",
109" .+@@@@#. ", 109" .+@@@@#. ",
110" .+@@@#. ", 110" .+@@@#. ",
111" .+@@#. ", 111" .+@@#. ",
112" .+@#. ", 112" .+@#. ",
113" .+#. ", 113" .+#. ",
114" .+. ", 114" .+. ",
115" .. ", 115" .. ",
116" "}; 116" "};
117 117
118} 118}
119 119
120 120
121/* ------------------------------------------------------------------------- */ 121/* ------------------------------------------------------------------------- */
122/* */ 122/* */
123/* Colors */ 123/* Colors */
124/* */ 124/* */
125/* ------------------------------------------------------------------------- */ 125/* ------------------------------------------------------------------------- */
126 126
127//FIXME: the default color table is in session.C now. 127//FIXME: the default color table is in session.C now.
128// We need a way to get rid of this one, here. 128// We need a way to get rid of this one, here.
129static const ColorEntry base_color_table[TABLE_COLORS] = 129static const ColorEntry base_color_table[TABLE_COLORS] =
130// The following are almost IBM standard color codes, with some slight 130// The following are almost IBM standard color codes, with some slight
131// gamma correction for the dim colors to compensate for bright X screens. 131// gamma correction for the dim colors to compensate for bright X screens.
132// It contains the 8 ansiterm/xterm colors in 2 intensities. 132// It contains the 8 ansiterm/xterm colors in 2 intensities.
133{ 133{
134 // Fixme: could add faint colors here, also. 134 // Fixme: could add faint colors here, also.
135 // normal 135 // normal
136 ColorEntry(QColor(0x00,0x00,0x00), 0, 0 ), ColorEntry( QColor(0xB2,0xB2,0xB2), 1, 0 ), // Dfore, Dback 136 ColorEntry(QColor(0x00,0x00,0x00), 0, 0 ), ColorEntry( QColor(0xB2,0xB2,0xB2), 1, 0 ), // Dfore, Dback
137 ColorEntry(QColor(0x00,0x00,0x00), 0, 0 ), ColorEntry( QColor(0xB2,0x18,0x18), 0, 0 ), // Black, Red 137 ColorEntry(QColor(0x00,0x00,0x00), 0, 0 ), ColorEntry( QColor(0xB2,0x18,0x18), 0, 0 ), // Black, Red
138 ColorEntry(QColor(0x18,0xB2,0x18), 0, 0 ), ColorEntry( QColor(0xB2,0x68,0x18), 0, 0 ), // Green, Yellow 138 ColorEntry(QColor(0x18,0xB2,0x18), 0, 0 ), ColorEntry( QColor(0xB2,0x68,0x18), 0, 0 ), // Green, Yellow
139 ColorEntry(QColor(0x18,0x18,0xB2), 0, 0 ), ColorEntry( QColor(0xB2,0x18,0xB2), 0, 0 ), // Blue, Magenta 139 ColorEntry(QColor(0x18,0x18,0xB2), 0, 0 ), ColorEntry( QColor(0xB2,0x18,0xB2), 0, 0 ), // Blue, Magenta
140 ColorEntry(QColor(0x18,0xB2,0xB2), 0, 0 ), ColorEntry( QColor(0xB2,0xB2,0xB2), 0, 0 ), // Cyan, White 140 ColorEntry(QColor(0x18,0xB2,0xB2), 0, 0 ), ColorEntry( QColor(0xB2,0xB2,0xB2), 0, 0 ), // Cyan, White
141 // intensiv 141 // intensiv
142 ColorEntry(QColor(0x00,0x00,0x00), 0, 1 ), ColorEntry( QColor(0xFF,0xFF,0xFF), 1, 0 ), 142 ColorEntry(QColor(0x00,0x00,0x00), 0, 1 ), ColorEntry( QColor(0xFF,0xFF,0xFF), 1, 0 ),
143 ColorEntry(QColor(0x68,0x68,0x68), 0, 0 ), ColorEntry( QColor(0xFF,0x54,0x54), 0, 0 ), 143 ColorEntry(QColor(0x68,0x68,0x68), 0, 0 ), ColorEntry( QColor(0xFF,0x54,0x54), 0, 0 ),
144 ColorEntry(QColor(0x54,0xFF,0x54), 0, 0 ), ColorEntry( QColor(0xFF,0xFF,0x54), 0, 0 ), 144 ColorEntry(QColor(0x54,0xFF,0x54), 0, 0 ), ColorEntry( QColor(0xFF,0xFF,0x54), 0, 0 ),
145 ColorEntry(QColor(0x54,0x54,0xFF), 0, 0 ), ColorEntry( QColor(0xB2,0x18,0xB2), 0, 0 ), 145 ColorEntry(QColor(0x54,0x54,0xFF), 0, 0 ), ColorEntry( QColor(0xB2,0x18,0xB2), 0, 0 ),
146 ColorEntry(QColor(0x54,0xFF,0xFF), 0, 0 ), ColorEntry( QColor(0xFF,0xFF,0xFF), 0, 0 ) 146 ColorEntry(QColor(0x54,0xFF,0xFF), 0, 0 ), ColorEntry( QColor(0xFF,0xFF,0xFF), 0, 0 )
147}; 147};
148 148
149/* Note that we use ANSI color order (bgr), while IBMPC color order is (rgb) 149/* Note that we use ANSI color order (bgr), while IBMPC color order is (rgb)
150 150
151 Code 0 1 2 3 4 5 6 7 151 Code 0 1 2 3 4 5 6 7
152 ----------- ------- ------- ------- ------- ------- ------- ------- ------- 152 ----------- ------- ------- ------- ------- ------- ------- ------- -------
153 ANSI (bgr) Black Red Green Yellow Blue Magenta Cyan White 153 ANSI (bgr) Black Red Green Yellow Blue Magenta Cyan White
154 IBMPC (rgb) Black Blue Green Cyan Red Magenta Yellow White 154 IBMPC (rgb) Black Blue Green Cyan Red Magenta Yellow White
155*/ 155*/
156 156
157QColor TEWidget::getDefaultBackColor() 157QColor TEWidget::getDefaultBackColor()
158{ 158{
159 return color_table[DEFAULT_BACK_COLOR].color; 159 return color_table[DEFAULT_BACK_COLOR].color;
160} 160}
161 161
162const ColorEntry* TEWidget::getColorTable() const 162const ColorEntry* TEWidget::getColorTable() const
163{ 163{
164 return color_table; 164 return color_table;
165} 165}
166 166
167const ColorEntry* TEWidget::getdefaultColorTable() const 167const ColorEntry* TEWidget::getdefaultColorTable() const
168{ 168{
169 return base_color_table; 169 return base_color_table;
170} 170}
171 171
172 172
173const QPixmap *TEWidget::backgroundPixmap() 173const QPixmap *TEWidget::backgroundPixmap()
174{ 174{
175 static QPixmap *bg = new QPixmap("~/qpim/main/pics/faded_bg.xpm"); 175 static QPixmap *bg = new QPixmap("~/qpim/main/pics/faded_bg.xpm");
176 const QPixmap *pm = bg; 176 const QPixmap *pm = bg;
177 return pm; 177 return pm;
178} 178}
179 179
180void TEWidget::setColorTable(const ColorEntry table[]) 180void TEWidget::setColorTable(const ColorEntry table[])
181{ 181{
182 for (int i = 0; i < TABLE_COLORS; i++) color_table[i] = table[i]; 182 for (int i = 0; i < TABLE_COLORS; i++) color_table[i] = table[i];
183 183
184 const QPixmap* pm = backgroundPixmap(); 184 const QPixmap* pm = backgroundPixmap();
185 if (!pm) setBackgroundColor(color_table[DEFAULT_BACK_COLOR].color); 185 if (!pm) setBackgroundColor(color_table[DEFAULT_BACK_COLOR].color);
186 update(); 186 update();
187} 187}
188 188
189//FIXME: add backgroundPixmapChanged. 189//FIXME: add backgroundPixmapChanged.
190 190
191/* ------------------------------------------------------------------------- */ 191/* ------------------------------------------------------------------------- */
192/* */ 192/* */
193/* Font */ 193/* Font */
194/* */ 194/* */
195/* ------------------------------------------------------------------------- */ 195/* ------------------------------------------------------------------------- */
196 196
197/* 197/*
198 The VT100 has 32 special graphical characters. The usual vt100 extended 198 The VT100 has 32 special graphical characters. The usual vt100 extended
199 xterm fonts have these at 0x00..0x1f. 199 xterm fonts have these at 0x00..0x1f.
200 200
201 QT's iso mapping leaves 0x00..0x7f without any changes. But the graphicals 201 QT's iso mapping leaves 0x00..0x7f without any changes. But the graphicals
202 come in here as proper unicode characters. 202 come in here as proper unicode characters.
203 203
204 We treat non-iso10646 fonts as VT100 extended and do the requiered mapping 204 We treat non-iso10646 fonts as VT100 extended and do the requiered mapping
205 from unicode to 0x00..0x1f. The remaining translation is then left to the 205 from unicode to 0x00..0x1f. The remaining translation is then left to the
206 QCodec. 206 QCodec.
207*/ 207*/
208 208
209// assert for i in [0..31] : vt100extended(vt100_graphics[i]) == i. 209// assert for i in [0..31] : vt100extended(vt100_graphics[i]) == i.
210 210
211unsigned short vt100_graphics[32] = 211unsigned short vt100_graphics[32] =
212{ // 0/8 1/9 2/10 3/11 4/12 5/13 6/14 7/15 212{ // 0/8 1/9 2/10 3/11 4/12 5/13 6/14 7/15
213 0x0020, 0x25C6, 0x2592, 0x2409, 0x240c, 0x240d, 0x240a, 0x00b0, 213 0x0020, 0x25C6, 0x2592, 0x2409, 0x240c, 0x240d, 0x240a, 0x00b0,
214 0x00b1, 0x2424, 0x240b, 0x2518, 0x2510, 0x250c, 0x2514, 0x253c, 214 0x00b1, 0x2424, 0x240b, 0x2518, 0x2510, 0x250c, 0x2514, 0x253c,
215 0xF800, 0xF801, 0x2500, 0xF803, 0xF804, 0x251c, 0x2524, 0x2534, 215 0xF800, 0xF801, 0x2500, 0xF803, 0xF804, 0x251c, 0x2524, 0x2534,
216 0x252c, 0x2502, 0x2264, 0x2265, 0x03C0, 0x2260, 0x00A3, 0x00b7 216 0x252c, 0x2502, 0x2264, 0x2265, 0x03C0, 0x2260, 0x00A3, 0x00b7
217}; 217};
218 218
219static QChar vt100extended(QChar c) 219static QChar vt100extended(QChar c)
220{ 220{
221 switch (c.unicode()) 221 switch (c.unicode())
222 { 222 {
223 case 0x25c6 : return 1; 223 case 0x25c6 : return 1;
224 case 0x2592 : return 2; 224 case 0x2592 : return 2;
225 case 0x2409 : return 3; 225 case 0x2409 : return 3;
226 case 0x240c : return 4; 226 case 0x240c : return 4;
227 case 0x240d : return 5; 227 case 0x240d : return 5;
228 case 0x240a : return 6; 228 case 0x240a : return 6;
229 case 0x00b0 : return 7; 229 case 0x00b0 : return 7;
230 case 0x00b1 : return 8; 230 case 0x00b1 : return 8;
231 case 0x2424 : return 9; 231 case 0x2424 : return 9;
232 case 0x240b : return 10; 232 case 0x240b : return 10;
233 case 0x2518 : return 11; 233 case 0x2518 : return 11;
234 case 0x2510 : return 12; 234 case 0x2510 : return 12;
235 case 0x250c : return 13; 235 case 0x250c : return 13;
236 case 0x2514 : return 14; 236 case 0x2514 : return 14;
237 case 0x253c : return 15; 237 case 0x253c : return 15;
238 case 0xf800 : return 16; 238 case 0xf800 : return 16;
239 case 0xf801 : return 17; 239 case 0xf801 : return 17;
240 case 0x2500 : return 18; 240 case 0x2500 : return 18;
241 case 0xf803 : return 19; 241 case 0xf803 : return 19;
242 case 0xf804 : return 20; 242 case 0xf804 : return 20;
243 case 0x251c : return 21; 243 case 0x251c : return 21;
244 case 0x2524 : return 22; 244 case 0x2524 : return 22;
245 case 0x2534 : return 23; 245 case 0x2534 : return 23;
246 case 0x252c : return 24; 246 case 0x252c : return 24;
247 case 0x2502 : return 25; 247 case 0x2502 : return 25;
248 case 0x2264 : return 26; 248 case 0x2264 : return 26;
249 case 0x2265 : return 27; 249 case 0x2265 : return 27;
250 case 0x03c0 : return 28; 250 case 0x03c0 : return 28;
251 case 0x2260 : return 29; 251 case 0x2260 : return 29;
252 case 0x00a3 : return 30; 252 case 0x00a3 : return 30;
253 case 0x00b7 : return 31; 253 case 0x00b7 : return 31;
254 } 254 }
255 return c; 255 return c;
256} 256}
257 257
258static QChar identicalMap(QChar c) 258static QChar identicalMap(QChar c)
259{ 259{
260 return c; 260 return c;
261} 261}
262 262
263void TEWidget::fontChange(const QFont &) 263void TEWidget::fontChange(const QFont &)
264{ 264{
265 QFontMetrics fm(font()); 265 QFontMetrics fm(font());
266 font_h = fm.height(); 266 font_h = fm.height();
267 font_w = fm.maxWidth(); 267 font_w = fm.maxWidth();
268 font_a = fm.ascent(); 268 font_a = fm.ascent();
269//printf("font_h: %d\n",font_h); 269//printf("font_h: %d\n",font_h);
270//printf("font_w: %d\n",font_w); 270//printf("font_w: %d\n",font_w);
271//printf("font_a: %d\n",font_a); 271//printf("font_a: %d\n",font_a);
272//printf("charset: %s\n",QFont::encodingName(font().charSet()).ascii()); 272//printf("charset: %s\n",QFont::encodingName(font().charSet()).ascii());
273//printf("rawname: %s\n",font().rawName().ascii()); 273//printf("rawname: %s\n",font().rawName().ascii());
274 fontMap = 274 fontMap =
275#if QT_VERSION < 300 275#if QT_VERSION < 300
276 strcmp(QFont::encodingName(font().charSet()).ascii(),"iso10646") 276 strcmp(QFont::encodingName(font().charSet()).ascii(),"iso10646")
277 ? vt100extended 277 ? vt100extended
278 : 278 :
279#endif 279#endif
280 identicalMap; 280 identicalMap;
281 propagateSize(); 281 propagateSize();
282 update(); 282 update();
283} 283}
284 284
285void TEWidget::setVTFont(const QFont& f) 285void TEWidget::setVTFont(const QFont& f)
286{ 286{
287 QFrame::setFont(f); 287 QFrame::setFont(f);
288} 288}
289 289
290QFont TEWidget::getVTFont() { 290QFont TEWidget::getVTFont() {
291 return font(); 291 return font();
292} 292}
293 293
294void TEWidget::setFont(const QFont &) 294void TEWidget::setFont(const QFont &)
295{ 295{
296 // ignore font change request if not coming from konsole itself 296 // ignore font change request if not coming from konsole itself
297} 297}
298 298
299/* ------------------------------------------------------------------------- */ 299/* ------------------------------------------------------------------------- */
300/* */ 300/* */
301/* Constructor / Destructor */ 301/* Constructor / Destructor */
302/* */ 302/* */
303/* ----------------------------------------------------------------------- */ 303/* ----------------------------------------------------------------------- */
304 304
305 305
306 306
307TEWidget::TEWidget(QWidget *parent, const char *name) : QFrame(parent,name) 307TEWidget::TEWidget(QWidget *parent, const char *name) : QFrame(parent,name)
308{ 308{
309#ifndef QT_NO_CLIPBOARD 309#ifndef QT_NO_CLIPBOARD
310 cb = QApplication::clipboard(); 310 cb = QApplication::clipboard();
311 QObject::connect( (QObject*)cb, SIGNAL(dataChanged()), 311 QObject::connect( (QObject*)cb, SIGNAL(dataChanged()),
312 this, SLOT(onClearSelection()) ); 312 this, SLOT(onClearSelection()) );
313#endif 313#endif
314 314
315 315
316 scrollbar = new QScrollBar( this ); 316 scrollbar = new QScrollBar( this );
317 scrollbar->setCursor( arrowCursor ); 317 scrollbar->setCursor( arrowCursor );
318 connect(scrollbar, SIGNAL(valueChanged(int)), this, SLOT(scrollChanged(int))); 318 connect(scrollbar, SIGNAL(valueChanged(int)), this, SLOT(scrollChanged(int)));
319 319
320 hscrollbar = new QScrollBar( Qt::Horizontal, this ); 320 hscrollbar = new QScrollBar( Qt::Horizontal, this );
321 hscrollbar->setCursor( arrowCursor ); 321 hscrollbar->setCursor( arrowCursor );
322 connect(hscrollbar, SIGNAL(valueChanged(int)), this, SLOT(hscrollChanged(int))); 322 connect(hscrollbar, SIGNAL(valueChanged(int)), this, SLOT(hscrollChanged(int)));
323 323
324 m_cornerButton = new QPushButton( this ); 324 m_cornerButton = new QPushButton( this );
325 m_cornerButton->setPixmap( QPixmap( (const char**)menu_xpm ) ); 325 m_cornerButton->setPixmap( QPixmap( (const char**)menu_xpm ) );
326 m_cornerButton->setMaximumSize( 14, 14 ); 326 m_cornerButton->setMaximumSize( 14, 14 );
327 m_cornerButton->hide(); 327 m_cornerButton->hide();
328 328
329 Config cfg("Konsole"); 329 Config cfg("Konsole");
330 cfg.setGroup("ScrollBar"); 330 cfg.setGroup("ScrollBar");
331 switch( cfg.readNumEntry("Position",2)){ 331 switch( cfg.readNumEntry("Position",2)){
332 case 0: 332 case 0:
333 scrollLoc = SCRNONE; 333 scrollLoc = SCRNONE;
334 break; 334 break;
335 case 1: 335 case 1:
336 scrollLoc = SCRLEFT; 336 scrollLoc = SCRLEFT;
337 break; 337 break;
338 case 2: 338 case 2:
339 scrollLoc = SCRRIGHT; 339 scrollLoc = SCRRIGHT;
340 break; 340 break;
341 }; 341 };
342 342
343 blinkT = new QTimer(this); 343 blinkT = new QTimer(this);
344 connect(blinkT, SIGNAL(timeout()), this, SLOT(blinkEvent())); 344 connect(blinkT, SIGNAL(timeout()), this, SLOT(blinkEvent()));
345 // blinking = FALSE; 345 // blinking = FALSE;
346 blinking = TRUE; 346 blinking = TRUE;
347 347
348 resizing = FALSE; 348 resizing = FALSE;
349 actSel = 0; 349 actSel = 0;
350 image = 0; 350 image = 0;
351 lines = 1; 351 lines = 1;
352 columns = 1; 352 columns = 1;
353 font_w = 1; 353 font_w = 1;
354 font_h = 1; 354 font_h = 1;
355 font_a = 1; 355 font_a = 1;
356 word_selection_mode = FALSE; 356 word_selection_mode = FALSE;
357 vcolumns = 0; 357 vcolumns = 0;
358 hposition = 0;
358 359
359 setMouseMarks(TRUE); 360 setMouseMarks(TRUE);
360 setVTFont( QFont("fixed") ); 361 setVTFont( QFont("fixed") );
361 setColorTable(base_color_table); // init color table 362 setColorTable(base_color_table); // init color table
362 363
363 qApp->installEventFilter( this ); //FIXME: see below 364 qApp->installEventFilter( this ); //FIXME: see below
364// KCursor::setAutoHideCursor( this, true ); 365// KCursor::setAutoHideCursor( this, true );
365 366
366 // Init DnD //////////////////////////////////////////////////////////////// 367 // Init DnD ////////////////////////////////////////////////////////////////
367 currentSession = NULL; 368 currentSession = NULL;
368// setAcceptDrops(true); // attempt 369// setAcceptDrops(true); // attempt
369// m_drop = new QPopupMenu(this); 370// m_drop = new QPopupMenu(this);
370// m_drop->insertItem( QString("Paste"), 0); 371// m_drop->insertItem( QString("Paste"), 0);
371// m_drop->insertItem( QString("cd"), 1); 372// m_drop->insertItem( QString("cd"), 1);
372// connect(m_drop, SIGNAL(activated(int)), SLOT(drop_menu_activated(int))); 373// connect(m_drop, SIGNAL(activated(int)), SLOT(drop_menu_activated(int)));
373 374
374 // we need focus so that the auto-hide cursor feature works 375 // we need focus so that the auto-hide cursor feature works
375 setFocus(); 376 setFocus();
376 setFocusPolicy( WheelFocus ); 377 setFocusPolicy( WheelFocus );
377} 378}
378 379
379//FIXME: make proper destructor 380//FIXME: make proper destructor
380// Here's a start (David) 381// Here's a start (David)
381TEWidget::~TEWidget() 382TEWidget::~TEWidget()
382{ 383{
383 qApp->removeEventFilter( this ); 384 qApp->removeEventFilter( this );
384 if (image) free(image); 385 if (image) free(image);
385} 386}
386 387
387/* ------------------------------------------------------------------------- */ 388/* ------------------------------------------------------------------------- */
388/* */ 389/* */
389/* Display Operations */ 390/* Display Operations */
390/* */ 391/* */
391/* ------------------------------------------------------------------------- */ 392/* ------------------------------------------------------------------------- */
392 393
393/*! 394/*!
394 attributed string draw primitive 395 attributed string draw primitive
395*/ 396*/
396 397
397void TEWidget::drawAttrStr(QPainter &paint, QRect rect, 398void TEWidget::drawAttrStr(QPainter &paint, QRect rect,
398 QString& str, ca attr, BOOL pm, BOOL clear) 399 QString& str, ca attr, BOOL pm, BOOL clear)
399{ 400{
400 if (pm && color_table[attr.b].transparent) 401 if (pm && color_table[attr.b].transparent)
401 { 402 {
402 paint.setBackgroundMode( TransparentMode ); 403 paint.setBackgroundMode( TransparentMode );
403 if (clear) erase(rect); 404 if (clear) erase(rect);
404 } 405 }
405 else 406 else
406 { 407 {
407 if (blinking) 408 if (blinking)
408 paint.fillRect(rect, color_table[attr.b].color); 409 paint.fillRect(rect, color_table[attr.b].color);
409 else 410 else
410 { 411 {
411 paint.setBackgroundMode( OpaqueMode ); 412 paint.setBackgroundMode( OpaqueMode );
412 paint.setBackgroundColor( color_table[attr.b].color ); 413 paint.setBackgroundColor( color_table[attr.b].color );
413 } 414 }
414 } 415 }
415 416
416 if (color_table[attr.f].bold) 417 if (color_table[attr.f].bold)
417 paint.setPen(QColor( 0x8F, 0x00, 0x00 )); 418 paint.setPen(QColor( 0x8F, 0x00, 0x00 ));
418 else 419 else
419 paint.setPen(color_table[attr.f].color); 420 paint.setPen(color_table[attr.f].color);
420 421
421 paint.drawText(rect.x(),rect.y()+font_a, str); 422 paint.drawText(rect.x(),rect.y()+font_a, str);
422 423
423 if (attr.r & RE_UNDERLINE) 424 if (attr.r & RE_UNDERLINE)
424 paint.drawLine(rect.left(), rect.y()+font_a+1, rect.right(),rect.y()+font_a+1 ); 425 paint.drawLine(rect.left(), rect.y()+font_a+1, rect.right(),rect.y()+font_a+1 );
425} 426}
426 427
427/*! 428/*!
428 The image can only be set completely. 429 The image can only be set completely.
429 430
430 The size of the new image may or may not match the size of the widget. 431 The size of the new image may or may not match the size of the widget.
431*/ 432*/
432 433
433void TEWidget::setImage(const ca* const newimg, int lines, int columns) 434void TEWidget::setImage(const ca* const newimg, int lines, int columns)
434{ int y,x,len; 435{ int y,x,len;
435 const QPixmap* pm = backgroundPixmap(); 436 const QPixmap* pm = backgroundPixmap();
436 QPainter paint; 437 QPainter paint;
437 setUpdatesEnabled(FALSE); 438 setUpdatesEnabled(FALSE);
438 paint.begin( this ); 439 paint.begin( this );
439HCNT("setImage"); 440HCNT("setImage");
440 441
441 QPoint tL = contentsRect().topLeft(); 442 QPoint tL = contentsRect().topLeft();
442 int tLx = tL.x(); 443 int tLx = tL.x();
443 int tLy = tL.y(); 444 int tLy = tL.y();
444 hasBlinker = FALSE; 445 hasBlinker = FALSE;
445 446
446 int cf = -1; // undefined 447 int cf = -1; // undefined
447 int cb = -1; // undefined 448 int cb = -1; // undefined
448 int cr = -1; // undefined 449 int cr = -1; // undefined
449 450
450 int lins = QMIN(this->lines, QMAX(0,lines )); 451 int lins = QMIN(this->lines, QMAX(0,lines ));
451 int cols = QMIN(this->columns,QMAX(0,columns)); 452 int cols = QMIN(this->columns,QMAX(0,columns));
452 QChar *disstrU = new QChar[cols]; 453 QChar *disstrU = new QChar[cols];
453 454
454//{ static int cnt = 0; printf("setImage %d\n",cnt++); } 455//{ static int cnt = 0; printf("setImage %d\n",cnt++); }
455 for (y = 0; y < lins; y++) 456 for (y = 0; y < lins; y++)
456 { 457 {
457 const ca* lcl = &image[y*this->columns]; 458 const ca* lcl = &image[y*this->columns];
458 const ca* const ext = &newimg[y*columns]; 459 const ca* const ext = &newimg[y*columns];
459 if (!resizing) // not while resizing, we're expecting a paintEvent 460 if (!resizing) // not while resizing, we're expecting a paintEvent
460 for (x = 0; x < cols; x++) 461 for (x = 0; x < cols; x++)
461 { 462 {
462 hasBlinker |= (ext[x].r & RE_BLINK); 463 hasBlinker |= (ext[x].r & RE_BLINK);
463 if (ext[x] != lcl[x]) 464 if (ext[x] != lcl[x])
464 { 465 {
465 cr = ext[x].r; 466 cr = ext[x].r;
466 cb = ext[x].b; 467 cb = ext[x].b;
467 if (ext[x].f != cf) cf = ext[x].f; 468 if (ext[x].f != cf) cf = ext[x].f;
468 int lln = cols - x; 469 int lln = cols - x;
469 disstrU[0] = fontMap(ext[x+0].c); 470 disstrU[0] = fontMap(ext[x+0].c);
470 for (len = 1; len < lln; len++) 471 for (len = 1; len < lln; len++)
471 { 472 {
472 if (ext[x+len].f != cf || ext[x+len].b != cb || ext[x+len].r != cr || 473 if (ext[x+len].f != cf || ext[x+len].b != cb || ext[x+len].r != cr ||
473 ext[x+len] == lcl[x+len] ) 474 ext[x+len] == lcl[x+len] )
474 break; 475 break;
475 disstrU[len] = fontMap(ext[x+len].c); 476 disstrU[len] = fontMap(ext[x+len].c);
476 } 477 }
477 QString unistr(disstrU,len); 478 QString unistr(disstrU,len);
478 drawAttrStr(paint, 479 drawAttrStr(paint,
479 QRect(blX+tLx+font_w*x,bY+tLy+font_h*y,font_w*len,font_h), 480 QRect(blX+tLx+font_w*x,bY+tLy+font_h*y,font_w*len,font_h),
480 unistr, ext[x], pm != NULL, true); 481 unistr, ext[x], pm != NULL, true);
481 x += len - 1; 482 x += len - 1;
482 } 483 }
483 } 484 }
484 // finally, make `image' become `newimg'. 485 // finally, make `image' become `newimg'.
485 memcpy((void*)lcl,(const void*)ext,cols*sizeof(ca)); 486 memcpy((void*)lcl,(const void*)ext,cols*sizeof(ca));
486 } 487 }
487 drawFrame( &paint ); 488 drawFrame( &paint );
488 paint.end(); 489 paint.end();
489 setUpdatesEnabled(TRUE); 490 setUpdatesEnabled(TRUE);
490 if ( hasBlinker && !blinkT->isActive()) blinkT->start(1000); // 1000 ms 491 if ( hasBlinker && !blinkT->isActive()) blinkT->start(1000); // 1000 ms
491 if (!hasBlinker && blinkT->isActive()) { blinkT->stop(); blinking = FALSE; } 492 if (!hasBlinker && blinkT->isActive()) { blinkT->stop(); blinking = FALSE; }
492 delete [] disstrU; 493 delete [] disstrU;
493} 494}
494 495
495// paint Event //////////////////////////////////////////////////// 496// paint Event ////////////////////////////////////////////////////
496 497
497/*! 498/*!
498 The difference of this routine vs. the `setImage' is, 499 The difference of this routine vs. the `setImage' is,
499 that the drawing does not include a difference analysis 500 that the drawing does not include a difference analysis
500 between the old and the new image. Instead, the internal 501 between the old and the new image. Instead, the internal
501 image is used and the painting bound by the PaintEvent box. 502 image is used and the painting bound by the PaintEvent box.
502*/ 503*/
503 504
504void TEWidget::paintEvent( QPaintEvent* pe ) 505void TEWidget::paintEvent( QPaintEvent* pe )
505{ 506{
506 507
507//{ static int cnt = 0; printf("paint %d\n",cnt++); } 508//{ static int cnt = 0; printf("paint %d\n",cnt++); }
508 const QPixmap* pm = backgroundPixmap(); 509 const QPixmap* pm = backgroundPixmap();
509 QPainter paint; 510 QPainter paint;
510 setUpdatesEnabled(FALSE); 511 setUpdatesEnabled(FALSE);
511 paint.begin( this ); 512 paint.begin( this );
512 paint.setBackgroundMode( TransparentMode ); 513 paint.setBackgroundMode( TransparentMode );
513HCNT("paintEvent"); 514HCNT("paintEvent");
514 515
515 // Note that the actual widget size can be slightly larger 516 // Note that the actual widget size can be slightly larger
516 // that the image (the size is truncated towards the smaller 517 // that the image (the size is truncated towards the smaller
517 // number of characters in `resizeEvent'. The paint rectangle 518 // number of characters in `resizeEvent'. The paint rectangle
518 // can thus be larger than the image, but less then the size 519 // can thus be larger than the image, but less then the size
519 // of one character. 520 // of one character.
520 521
521 QRect rect = pe->rect().intersect(contentsRect()); 522 QRect rect = pe->rect().intersect(contentsRect());
522 523
523 QPoint tL = contentsRect().topLeft(); 524 QPoint tL = contentsRect().topLeft();
524 int tLx = tL.x(); 525 int tLx = tL.x();
525 int tLy = tL.y(); 526 int tLy = tL.y();
526 527
527 int lux = QMIN(columns-1, QMAX(0,(rect.left() - tLx - blX ) / font_w)); 528 int lux = QMIN(columns-1, QMAX(0,(rect.left() - tLx - blX ) / font_w));
528 int luy = QMIN(lines-1, QMAX(0,(rect.top() - tLy - bY ) / font_h)); 529 int luy = QMIN(lines-1, QMAX(0,(rect.top() - tLy - bY ) / font_h));
529 int rlx = QMIN(columns-1, QMAX(0,(rect.right() - tLx - blX ) / font_w)); 530 int rlx = QMIN(columns-1, QMAX(0,(rect.right() - tLx - blX ) / font_w));
530 int rly = QMIN(lines-1, QMAX(0,(rect.bottom() - tLy - bY ) / font_h)); 531 int rly = QMIN(lines-1, QMAX(0,(rect.bottom() - tLy - bY ) / font_h));
531 532
532 /* 533 /*
533 printf("paintEvent: %d..%d, %d..%d (%d..%d, %d..%d)\n",lux,rlx,luy,rly, 534 printf("paintEvent: %d..%d, %d..%d (%d..%d, %d..%d)\n",lux,rlx,luy,rly,
534 rect.left(), rect.right(), rect.top(), rect.bottom()); 535 rect.left(), rect.right(), rect.top(), rect.bottom());
535 */ 536 */
536 537
537 // if (pm != NULL && color_table[image->b].transparent) 538 // if (pm != NULL && color_table[image->b].transparent)
538 // erase(rect); 539 // erase(rect);
539 // BL: I have no idea why we need this, and it breaks the refresh. 540 // BL: I have no idea why we need this, and it breaks the refresh.
540 541
541 QChar *disstrU = new QChar[columns]; 542 QChar *disstrU = new QChar[columns];
542 for (int y = luy; y <= rly; y++) 543 for (int y = luy; y <= rly; y++)
543 for (int x = lux; x <= rlx; x++) 544 for (int x = lux; x <= rlx; x++)
544 { 545 {
545 int len = 1; 546 int len = 1;
546 disstrU[0] = fontMap(image[loc(x,y)].c); 547 disstrU[0] = fontMap(image[loc(x,y)].c);
547 int cf = image[loc(x,y)].f; 548 int cf = image[loc(x,y)].f;
548 int cb = image[loc(x,y)].b; 549 int cb = image[loc(x,y)].b;
549 int cr = image[loc(x,y)].r; 550 int cr = image[loc(x,y)].r;
550 while (x+len <= rlx && 551 while (x+len <= rlx &&
551 image[loc(x+len,y)].f == cf && 552 image[loc(x+len,y)].f == cf &&
552 image[loc(x+len,y)].b == cb && 553 image[loc(x+len,y)].b == cb &&
553 image[loc(x+len,y)].r == cr ) 554 image[loc(x+len,y)].r == cr )
554 { 555 {
555 disstrU[len] = fontMap(image[loc(x+len,y)].c); 556 disstrU[len] = fontMap(image[loc(x+len,y)].c);
556 len += 1; 557 len += 1;
557 } 558 }
558 QString unistr(disstrU,len); 559 QString unistr(disstrU,len);
559 drawAttrStr(paint, 560 drawAttrStr(paint,
560 QRect(blX+tLx+font_w*x,bY+tLy+font_h*y,font_w*len,font_h), 561 QRect(blX+tLx+font_w*x,bY+tLy+font_h*y,font_w*len,font_h),
561 unistr, image[loc(x,y)], pm != NULL, false); 562 unistr, image[loc(x,y)], pm != NULL, false);
562 x += len - 1; 563 x += len - 1;
563 } 564 }
564 delete [] disstrU; 565 delete [] disstrU;
565 drawFrame( &paint ); 566 drawFrame( &paint );
566 paint.end(); 567 paint.end();
567 setUpdatesEnabled(TRUE); 568 setUpdatesEnabled(TRUE);
568} 569}
569 570
570void TEWidget::blinkEvent() 571void TEWidget::blinkEvent()
571{ 572{
572 blinking = !blinking; 573 blinking = !blinking;
573 repaint(FALSE); 574 repaint(FALSE);
574} 575}
575 576
576/* ------------------------------------------------------------------------- */ 577/* ------------------------------------------------------------------------- */
577/* */ 578/* */
578/* Resizing */ 579/* Resizing */
579/* */ 580/* */
580/* ------------------------------------------------------------------------- */ 581/* ------------------------------------------------------------------------- */
581 582
582void TEWidget::resizeEvent(QResizeEvent* ev) 583void TEWidget::resizeEvent(QResizeEvent* ev)
583{ 584{
584// printf("resize: %d,%d\n",ev->size().width(),ev->size().height()); 585// printf("resize: %d,%d\n",ev->size().width(),ev->size().height());
585 //printf("approx: %d,%d\n",ev->size().width()/font_w,ev->size().height()/font_h); 586 //printf("approx: %d,%d\n",ev->size().width()/font_w,ev->size().height()/font_h);
586 //printf("leaves: %d,%d\n",ev->size().width()%font_w,ev->size().height()%font_h); 587 //printf("leaves: %d,%d\n",ev->size().width()%font_w,ev->size().height()%font_h);
587 //printf("curren: %d,%d\n",width(),height()); 588 //printf("curren: %d,%d\n",width(),height());
588HCNT("resizeEvent"); 589HCNT("resizeEvent");
589 590
590 // see comment in `paintEvent' concerning the rounding. 591 // see comment in `paintEvent' concerning the rounding.
591 //FIXME: could make a routine here; check width(),height() 592 //FIXME: could make a routine here; check width(),height()
592 assert(ev->size().width() == width()); 593 assert(ev->size().width() == width());
593 assert(ev->size().height() == height()); 594 assert(ev->size().height() == height());
594 595
595 propagateSize(); 596 propagateSize();
596} 597}
597 598
598void TEWidget::propagateSize() 599void TEWidget::propagateSize()
599{ 600{
600 ca* oldimg = image; 601 ca* oldimg = image;
601 int oldlin = lines; 602 int oldlin = lines;
602 int oldcol = columns; 603 int oldcol = columns;
603 makeImage(); 604 makeImage();
604 // we copy the old image to reduce flicker 605 // we copy the old image to reduce flicker
605 int lins = QMIN(oldlin,lines); 606 int lins = QMIN(oldlin,lines);
606 int cols = QMIN(oldcol,columns); 607 int cols = QMIN(oldcol,columns);
607 if (oldimg) 608 if (oldimg)
608 { 609 {
609 for (int lin = 0; lin < lins; lin++) 610 for (int lin = 0; lin < lins; lin++)
610 memcpy((void*)&image[columns*lin], 611 memcpy((void*)&image[columns*lin],
611 (void*)&oldimg[oldcol*lin],cols*sizeof(ca)); 612 (void*)&oldimg[oldcol*lin],cols*sizeof(ca));
612 free(oldimg); //FIXME: try new,delete 613 free(oldimg); //FIXME: try new,delete
613 } 614 }