summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/apps/opie-console/TEWidget.cpp4
-rw-r--r--noncore/apps/opie-console/TEWidget.h2
2 files changed, 3 insertions, 3 deletions
diff --git a/noncore/apps/opie-console/TEWidget.cpp b/noncore/apps/opie-console/TEWidget.cpp
index 3d010cb..444924b 100644
--- a/noncore/apps/opie-console/TEWidget.cpp
+++ b/noncore/apps/opie-console/TEWidget.cpp
@@ -1,1364 +1,1364 @@
1/* ------------------------------------------------------------------------ */ 1/* ------------------------------------------------------------------------ */
2/* */ 2/* */
3/* [TEWidget.C] Terminal Emulation Widget */ 3/* [TEWidget.C] Terminal Emulation Widget */
4/* */ 4/* */
5/* ------------------------------------------------------------------------ */ 5/* ------------------------------------------------------------------------ */
6/* */ 6/* */
7/* Copyright (c) 1997,1998 by Lars Doelle <lars.doelle@on-line.de> */ 7/* Copyright (c) 1997,1998 by Lars Doelle <lars.doelle@on-line.de> */
8/* */ 8/* */
9/* This file is part of Konsole - an X terminal for KDE */ 9/* This file is part of Konsole - an X terminal for KDE */
10/* */ 10/* */
11/* ------------------------------------------------------------------------ */ 11/* ------------------------------------------------------------------------ */
12/* */ 12/* */
13/* Ported Konsole to Qt/Embedded */ 13/* Ported Konsole to Qt/Embedded */
14/* */ 14/* */
15/* Copyright (C) 2000 by John Ryland <jryland@trolltech.com> */ 15/* Copyright (C) 2000 by John Ryland <jryland@trolltech.com> */
16/* */ 16/* */
17/* -------------------------------------------------------------------------- */ 17/* -------------------------------------------------------------------------- */
18/*! \class TEWidget 18/*! \class TEWidget
19 19
20 \brief Visible screen contents 20 \brief Visible screen contents
21 21
22 This class is responsible to map the `image' of a terminal emulation to the 22 This class is responsible to map the `image' of a terminal emulation to the
23 display. All the dependency of the emulation to a specific GUI or toolkit is 23 display. All the dependency of the emulation to a specific GUI or toolkit is
24 localized here. Further, this widget has no knowledge about being part of an 24 localized here. Further, this widget has no knowledge about being part of an
25 emulation, it simply work within the terminal emulation framework by exposing 25 emulation, it simply work within the terminal emulation framework by exposing
26 size and key events and by being ordered to show a new image. 26 size and key events and by being ordered to show a new image.
27 27
28 <ul> 28 <ul>
29 <li> The internal image has the size of the widget (evtl. rounded up) 29 <li> The internal image has the size of the widget (evtl. rounded up)
30 <li> The external image used in setImage can have any size. 30 <li> The external image used in setImage can have any size.
31 <li> (internally) the external image is simply copied to the internal 31 <li> (internally) the external image is simply copied to the internal
32 when a setImage happens. During a resizeEvent no painting is done 32 when a setImage happens. During a resizeEvent no painting is done
33 a paintEvent is expected to follow anyway. 33 a paintEvent is expected to follow anyway.
34 </ul> 34 </ul>
35 35
36 \sa TEScreen \sa Emulation 36 \sa TEScreen \sa Emulation
37*/ 37*/
38 38
39/* FIXME: 39/* FIXME:
40 - 'image' may also be used uninitialized (it isn't in fact) in resizeEvent 40 - 'image' may also be used uninitialized (it isn't in fact) in resizeEvent
41 - 'font_a' not used in mouse events 41 - 'font_a' not used in mouse events
42 - add destructor 42 - add destructor
43*/ 43*/
44 44
45/* TODO 45/* TODO
46 - evtl. be sensitive to `paletteChange' while using default colors. 46 - evtl. be sensitive to `paletteChange' while using default colors.
47 - set different 'rounding' styles? I.e. have a mode to show clipped chars? 47 - set different 'rounding' styles? I.e. have a mode to show clipped chars?
48*/ 48*/
49 49
50// #include "config.h" 50// #include "config.h"
51#include "TEWidget.h" 51#include "TEWidget.h"
52#include "session.h" 52#include "session.h"
53#include <qpe/config.h> 53#include <qpe/config.h>
54 54
55#include <qapplication.h> 55#include <qapplication.h>
56#include <qcursor.h> 56#include <qcursor.h>
57#include <qregexp.h> 57#include <qregexp.h>
58#include <qpainter.h> 58#include <qpainter.h>
59#include <qclipboard.h> 59#include <qclipboard.h>
60#include <qstyle.h> 60#include <qstyle.h>
61#include <qfile.h> 61#include <qfile.h>
62#include <qdragobject.h> 62#include <qdragobject.h>
63#include <qvbox.h> 63#include <qvbox.h>
64 64
65#include <stdio.h> 65#include <stdio.h>
66#include <stdlib.h> 66#include <stdlib.h>
67#include <unistd.h> 67#include <unistd.h>
68#include <ctype.h> 68#include <ctype.h>
69#include <sys/stat.h> 69#include <sys/stat.h>
70#include <sys/types.h> 70#include <sys/types.h>
71#include <signal.h> 71#include <signal.h>
72 72
73#include <assert.h> 73#include <assert.h>
74 74
75 75
76 76
77// #include "TEWidget.moc" 77// #include "TEWidget.moc"
78//#include <kapp.h> 78//#include <kapp.h>
79//#include <kcursor.h> 79//#include <kcursor.h>
80//#include <kurl.h> 80//#include <kurl.h>
81//#include <kdebug.h> 81//#include <kdebug.h>
82//#include <klocale.h> 82//#include <klocale.h>
83 83
84#define HERE printf("%s(%d): %s\n",__FILE__,__LINE__,__FUNCTION__) 84#define HERE printf("%s(%d): %s\n",__FILE__,__LINE__,__FUNCTION__)
85#define HCNT(Name) // { static int cnt = 1; printf("%s(%d): %s %d\n",__FILE__,__LINE__,Name,cnt++); } 85#define HCNT(Name) // { static int cnt = 1; printf("%s(%d): %s %d\n",__FILE__,__LINE__,Name,cnt++); }
86 86
87#define loc(X,Y) ((Y)*columns+(X)) 87#define loc(X,Y) ((Y)*columns+(X))
88 88
89//FIXME: the rim should normally be 1, 0 only when running in full screen mode. 89//FIXME: the rim should normally be 1, 0 only when running in full screen mode.
90#define rimX 0 // left/right rim width 90#define rimX 0 // left/right rim width
91#define rimY 0 // top/bottom rim high 91#define rimY 0 // top/bottom rim high
92 92
93#define yMouseScroll 1 93#define yMouseScroll 1
94// scroll increment used when dragging selection at top/bottom of window. 94// scroll increment used when dragging selection at top/bottom of window.
95 95
96/* Button XPM */ 96/* Button XPM */
97namespace { 97namespace {
98static char * menu_xpm[] = { 98static char * menu_xpm[] = {
99"12 12 5 1", 99"12 12 5 1",
100 " c None", 100 " c None",
101 ".c #000000", 101 ".c #000000",
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 hposition = 0;
359 359
360 setMouseMarks(TRUE); 360 setMouseMarks(TRUE);
361 setVTFont( QFont("fixed") ); 361 setVTFont( QFont("fixed") );
362 setColorTable(base_color_table); // init color table 362 setColorTable(base_color_table); // init color table
363 363
364 qApp->installEventFilter( this ); //FIXME: see below 364 qApp->installEventFilter( this ); //FIXME: see below
365// KCursor::setAutoHideCursor( this, true ); 365// KCursor::setAutoHideCursor( this, true );
366 366
367 // Init DnD //////////////////////////////////////////////////////////////// 367 // Init DnD ////////////////////////////////////////////////////////////////
368 currentSession = NULL; 368 currentSession = NULL;
369// setAcceptDrops(true); // attempt 369// setAcceptDrops(true); // attempt
370// m_drop = new QPopupMenu(this); 370// m_drop = new QPopupMenu(this);
371// m_drop->insertItem( QString("Paste"), 0); 371// m_drop->insertItem( QString("Paste"), 0);
372// m_drop->insertItem( QString("cd"), 1); 372// m_drop->insertItem( QString("cd"), 1);
373// connect(m_drop, SIGNAL(activated(int)), SLOT(drop_menu_activated(int))); 373// connect(m_drop, SIGNAL(activated(int)), SLOT(drop_menu_activated(int)));
374 374
375 // we need focus so that the auto-hide cursor feature works 375 // we need focus so that the auto-hide cursor feature works
376 setFocus(); 376 setFocus();
377 setFocusPolicy( WheelFocus ); 377 setFocusPolicy( WheelFocus );
378} 378}
379 379
380//FIXME: make proper destructor 380//FIXME: make proper destructor
381// Here's a start (David) 381// Here's a start (David)
382TEWidget::~TEWidget() 382TEWidget::~TEWidget()
383{ 383{
384 qApp->removeEventFilter( this ); 384 qApp->removeEventFilter( this );
385 if (image) free(image); 385 if (image) free(image);
386} 386}
387 387
388/* ------------------------------------------------------------------------- */ 388/* ------------------------------------------------------------------------- */
389/* */ 389/* */
390/* Display Operations */ 390/* Display Operations */
391/* */ 391/* */
392/* ------------------------------------------------------------------------- */ 392/* ------------------------------------------------------------------------- */
393 393
394/*! 394/*!
395 attributed string draw primitive 395 attributed string draw primitive
396*/ 396*/
397 397
398void TEWidget::drawAttrStr(QPainter &paint, QRect rect, 398void TEWidget::drawAttrStr(QPainter &paint, QRect rect,
399 QString& str, ca attr, BOOL pm, BOOL clear) 399 QString& str, ca attr, BOOL pm, BOOL clear)
400{ 400{
401 if (pm && color_table[attr.b].transparent) 401 if (pm && color_table[attr.b].transparent)
402 { 402 {
403 paint.setBackgroundMode( TransparentMode ); 403 paint.setBackgroundMode( TransparentMode );
404 if (clear) erase(rect); 404 if (clear) erase(rect);
405 } 405 }
406 else 406 else
407 { 407 {
408 if (blinking) 408 if (blinking)
409 paint.fillRect(rect, color_table[attr.b].color); 409 paint.fillRect(rect, color_table[attr.b].color);
410 else 410 else
411 { 411 {
412 paint.setBackgroundMode( OpaqueMode ); 412 paint.setBackgroundMode( OpaqueMode );
413 paint.setBackgroundColor( color_table[attr.b].color ); 413 paint.setBackgroundColor( color_table[attr.b].color );
414 } 414 }
415 } 415 }
416 416
417 if (color_table[attr.f].bold) 417 if (color_table[attr.f].bold)
418 paint.setPen(QColor( 0x8F, 0x00, 0x00 )); 418 paint.setPen(QColor( 0x8F, 0x00, 0x00 ));
419 else 419 else
420 paint.setPen(color_table[attr.f].color); 420 paint.setPen(color_table[attr.f].color);
421 421
422 paint.drawText(rect.x(),rect.y()+font_a, str); 422 paint.drawText(rect.x(),rect.y()+font_a, str);
423 423
424 if (attr.r & RE_UNDERLINE) 424 if (attr.r & RE_UNDERLINE)
425 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 );
426} 426}
427 427
428/*! 428/*!
429 The image can only be set completely. 429 The image can only be set completely.
430 430
431 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.
432*/ 432*/
433 433
434void TEWidget::setImage(const ca* const newimg, int lines, int columns) 434void TEWidget::setImage(const ca* const newimg, int lines, int columns)
435{ int y,x,len; 435{ int y,x,len;
436 const QPixmap* pm = backgroundPixmap(); 436 const QPixmap* pm = backgroundPixmap();
437 QPainter paint; 437 QPainter paint;
438 setUpdatesEnabled(FALSE); 438 setUpdatesEnabled(FALSE);
439 paint.begin( this ); 439 paint.begin( this );
440HCNT("setImage"); 440HCNT("setImage");
441 441
442 QPoint tL = contentsRect().topLeft(); 442 QPoint tL = contentsRect().topLeft();
443 int tLx = tL.x(); 443 int tLx = tL.x();
444 int tLy = tL.y(); 444 int tLy = tL.y();
445 hasBlinker = FALSE; 445 hasBlinker = FALSE;
446 446
447 int cf = -1; // undefined 447 int cf = -1; // undefined
448 int cb = -1; // undefined 448 int cb = -1; // undefined
449 int cr = -1; // undefined 449 int cr = -1; // undefined
450 450
451 int lins = QMIN(this->lines, QMAX(0,lines )); 451 int lins = QMIN(this->lines, QMAX(0,lines ));
452 int cols = QMIN(this->columns,QMAX(0,columns)); 452 int cols = QMIN(this->columns,QMAX(0,columns));
453 QChar *disstrU = new QChar[cols]; 453 QChar *disstrU = new QChar[cols];
454 454
455//{ static int cnt = 0; printf("setImage %d\n",cnt++); } 455//{ static int cnt = 0; printf("setImage %d\n",cnt++); }
456 for (y = 0; y < lins; y++) 456 for (y = 0; y < lins; y++)
457 { 457 {
458 const ca* lcl = &image[y*this->columns]; 458 const ca* lcl = &image[y*this->columns];
459 const ca* const ext = &newimg[y*columns]; 459 const ca* const ext = &newimg[y*columns];
460 if (!resizing) // not while resizing, we're expecting a paintEvent 460 if (!resizing) // not while resizing, we're expecting a paintEvent
461 for (x = 0; x < cols; x++) 461 for (x = 0; x < cols; x++)
462 { 462 {
463 hasBlinker |= (ext[x].r & RE_BLINK); 463 hasBlinker |= (ext[x].r & RE_BLINK);
464 if (ext[x] != lcl[x]) 464 if (ext[x] != lcl[x])
465 { 465 {
466 cr = ext[x].r; 466 cr = ext[x].r;
467 cb = ext[x].b; 467 cb = ext[x].b;
468 if (ext[x].f != cf) cf = ext[x].f; 468 if (ext[x].f != cf) cf = ext[x].f;
469 int lln = cols - x; 469 int lln = cols - x;
470 disstrU[0] = fontMap(ext[x+0].c); 470 disstrU[0] = fontMap(ext[x+0].c);
471 for (len = 1; len < lln; len++) 471 for (len = 1; len < lln; len++)
472 { 472 {
473 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 ||
474 ext[x+len] == lcl[x+len] ) 474 ext[x+len] == lcl[x+len] )
475 break; 475 break;
476 disstrU[len] = fontMap(ext[x+len].c); 476 disstrU[len] = fontMap(ext[x+len].c);
477 } 477 }
478 QString unistr(disstrU,len); 478 QString unistr(disstrU,len);
479 drawAttrStr(paint, 479 drawAttrStr(paint,
480 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),
481 unistr, ext[x], pm != NULL, true); 481 unistr, ext[x], pm != NULL, true);
482 x += len - 1; 482 x += len - 1;
483 } 483 }
484 } 484 }
485 // finally, make `image' become `newimg'. 485 // finally, make `image' become `newimg'.
486 memcpy((void*)lcl,(const void*)ext,cols*sizeof(ca)); 486 memcpy((void*)lcl,(const void*)ext,cols*sizeof(ca));
487 } 487 }
488 drawFrame( &paint ); 488 drawFrame( &paint );
489 paint.end(); 489 paint.end();
490 setUpdatesEnabled(TRUE); 490 setUpdatesEnabled(TRUE);
491 if ( hasBlinker && !blinkT->isActive()) blinkT->start(1000); // 1000 ms 491 if ( hasBlinker && !blinkT->isActive()) blinkT->start(1000); // 1000 ms
492 if (!hasBlinker && blinkT->isActive()) { blinkT->stop(); blinking = FALSE; } 492 if (!hasBlinker && blinkT->isActive()) { blinkT->stop(); blinking = FALSE; }
493 delete [] disstrU; 493 delete [] disstrU;
494} 494}
495 495
496// paint Event //////////////////////////////////////////////////// 496// paint Event ////////////////////////////////////////////////////
497 497
498/*! 498/*!
499 The difference of this routine vs. the `setImage' is, 499 The difference of this routine vs. the `setImage' is,
500 that the drawing does not include a difference analysis 500 that the drawing does not include a difference analysis
501 between the old and the new image. Instead, the internal 501 between the old and the new image. Instead, the internal
502 image is used and the painting bound by the PaintEvent box. 502 image is used and the painting bound by the PaintEvent box.
503*/ 503*/
504 504
505void TEWidget::paintEvent( QPaintEvent* pe ) 505void TEWidget::paintEvent( QPaintEvent* pe )
506{ 506{
507 507
508//{ static int cnt = 0; printf("paint %d\n",cnt++); } 508//{ static int cnt = 0; printf("paint %d\n",cnt++); }
509 const QPixmap* pm = backgroundPixmap(); 509 const QPixmap* pm = backgroundPixmap();
510 QPainter paint; 510 QPainter paint;
511 setUpdatesEnabled(FALSE); 511 setUpdatesEnabled(FALSE);
512 paint.begin( this ); 512 paint.begin( this );
513 paint.setBackgroundMode( TransparentMode ); 513 paint.setBackgroundMode( TransparentMode );
514HCNT("paintEvent"); 514HCNT("paintEvent");
515 515
516 // Note that the actual widget size can be slightly larger 516 // Note that the actual widget size can be slightly larger
517 // that the image (the size is truncated towards the smaller 517 // that the image (the size is truncated towards the smaller
518 // number of characters in `resizeEvent'. The paint rectangle 518 // number of characters in `resizeEvent'. The paint rectangle
519 // 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
520 // of one character. 520 // of one character.
521 521
522 QRect rect = pe->rect().intersect(contentsRect()); 522 QRect rect = pe->rect().intersect(contentsRect());
523 523
524 QPoint tL = contentsRect().topLeft(); 524 QPoint tL = contentsRect().topLeft();
525 int tLx = tL.x(); 525 int tLx = tL.x();
526 int tLy = tL.y(); 526 int tLy = tL.y();
527 527
528 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));
529 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));
530 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));
531 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));
532 532
533 /* 533 /*
534 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,
535 rect.left(), rect.right(), rect.top(), rect.bottom()); 535 rect.left(), rect.right(), rect.top(), rect.bottom());
536 */ 536 */
537 537
538 // if (pm != NULL && color_table[image->b].transparent) 538 // if (pm != NULL && color_table[image->b].transparent)
539 // erase(rect); 539 // erase(rect);
540 // 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.
541 541
542 QChar *disstrU = new QChar[columns]; 542 QChar *disstrU = new QChar[columns];
543 for (int y = luy; y <= rly; y++) 543 for (int y = luy; y <= rly; y++)
544 for (int x = lux; x <= rlx; x++) 544 for (int x = lux; x <= rlx; x++)
545 { 545 {
546 int len = 1; 546 int len = 1;
547 disstrU[0] = fontMap(image[loc(x,y)].c); 547 disstrU[0] = fontMap(image[loc(x,y)].c);
548 int cf = image[loc(x,y)].f; 548 int cf = image[loc(x,y)].f;
549 int cb = image[loc(x,y)].b; 549 int cb = image[loc(x,y)].b;
550 int cr = image[loc(x,y)].r; 550 int cr = image[loc(x,y)].r;
551 while (x+len <= rlx && 551 while (x+len <= rlx &&
552 image[loc(x+len,y)].f == cf && 552 image[loc(x+len,y)].f == cf &&
553 image[loc(x+len,y)].b == cb && 553 image[loc(x+len,y)].b == cb &&
554 image[loc(x+len,y)].r == cr ) 554 image[loc(x+len,y)].r == cr )
555 { 555 {
556 disstrU[len] = fontMap(image[loc(x+len,y)].c); 556 disstrU[len] = fontMap(image[loc(x+len,y)].c);
557 len += 1; 557 len += 1;
558 } 558 }
559 QString unistr(disstrU,len); 559 QString unistr(disstrU,len);
560 drawAttrStr(paint, 560 drawAttrStr(paint,
561 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),
562 unistr, image[loc(x,y)], pm != NULL, false); 562 unistr, image[loc(x,y)], pm != NULL, false);
563 x += len - 1; 563 x += len - 1;
564 } 564 }
565 delete [] disstrU; 565 delete [] disstrU;
566 drawFrame( &paint ); 566 drawFrame( &paint );
567 paint.end(); 567 paint.end();
568 setUpdatesEnabled(TRUE); 568 setUpdatesEnabled(TRUE);
569} 569}
570 570
571void TEWidget::blinkEvent() 571void TEWidget::blinkEvent()
572{ 572{
573 blinking = !blinking; 573 blinking = !blinking;
574 repaint(FALSE); 574 repaint(FALSE);
575} 575}
576 576
577/* ------------------------------------------------------------------------- */ 577/* ------------------------------------------------------------------------- */
578/* */ 578/* */
579/* Resizing */ 579/* Resizing */
580/* */ 580/* */
581/* ------------------------------------------------------------------------- */ 581/* ------------------------------------------------------------------------- */
582 582
583void TEWidget::resizeEvent(QResizeEvent* ev) 583void TEWidget::resizeEvent(QResizeEvent* ev)
584{ 584{
585// printf("resize: %d,%d\n",ev->size().width(),ev->size().height()); 585// printf("resize: %d,%d\n",ev->size().width(),ev->size().height());
586 //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);
587 //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);
588 //printf("curren: %d,%d\n",width(),height()); 588 //printf("curren: %d,%d\n",width(),height());
589HCNT("resizeEvent"); 589HCNT("resizeEvent");
590 590
591 // see comment in `paintEvent' concerning the rounding. 591 // see comment in `paintEvent' concerning the rounding.
592 //FIXME: could make a routine here; check width(),height() 592 //FIXME: could make a routine here; check width(),height()
593 assert(ev->size().width() == width()); 593 assert(ev->size().width() == width());
594 assert(ev->size().height() == height()); 594 assert(ev->size().height() == height());
595 595
596 propagateSize(); 596 propagateSize();
597} 597}
598 598
599void TEWidget::propagateSize() 599void TEWidget::propagateSize()
600{ 600{
601 ca* oldimg = image; 601 ca* oldimg = image;
602 int oldlin = lines; 602 int oldlin = lines;
603 int oldcol = columns; 603 int oldcol = columns;
604 makeImage(); 604 makeImage();
605 // we copy the old image to reduce flicker 605 // we copy the old image to reduce flicker
606 int lins = QMIN(oldlin,lines); 606 int lins = QMIN(oldlin,lines);
607 int cols = QMIN(oldcol,columns); 607 int cols = QMIN(oldcol,columns);
608 if (oldimg) 608 if (oldimg)
609 { 609 {
610 for (int lin = 0; lin < lins; lin++) 610 for (int lin = 0; lin < lins; lin++)
611 memcpy((void*)&image[columns*lin], 611 memcpy((void*)&image[columns*lin],
612 (void*)&oldimg[oldcol*lin],cols*sizeof(ca)); 612 (void*)&oldimg[oldcol*lin],cols*sizeof(ca));
613 free(oldimg); //FIXME: try new,delete 613 free(oldimg); //FIXME: try new,delete
614 } 614 }
615 else 615 else
616 clearImage(); 616 clearImage();
617 617
618 //NOTE: control flows from the back through the chest right into the eye. 618 //NOTE: control flows from the back through the chest right into the eye.
619 // `emu' will call back via `setImage'. 619 // `emu' will call back via `setImage'.
620 620
621 resizing = TRUE; 621 resizing = TRUE;
622 emit changedImageSizeSignal(lines, columns); // expose resizeEvent 622 emit changedImageSizeSignal(lines, columns); // expose resizeEvent
623 resizing = FALSE; 623 resizing = FALSE;
624} 624}
625 625
626/* ------------------------------------------------------------------------- */ 626/* ------------------------------------------------------------------------- */
627/* */ 627/* */
628/* Scrollbar */ 628/* Scrollbar */
629/* */ 629/* */
630/* ------------------------------------------------------------------------- */ 630/* ------------------------------------------------------------------------- */
631 631
632void TEWidget::scrollChanged(int) 632void TEWidget::scrollChanged(int)
633{ 633{
634 emit changedHistoryCursor(scrollbar->value()); //expose 634 emit changedHistoryCursor(scrollbar->value()); //expose
635} 635}
636 636
637void TEWidget::hscrollChanged(int loc) 637void TEWidget::hscrollChanged(int loc)
638{ 638{
639 hposition = loc; 639 hposition = loc;
640 propagateSize(); 640 propagateSize();
641 update(); 641 update();
642} 642}
643 643
644void TEWidget::setScroll(int cursor, int slines) 644void TEWidget::setScroll(int cursor, int slines)
645{ 645{
646 disconnect(scrollbar, SIGNAL(valueChanged(int)), this, SLOT(scrollChanged(int))); 646 disconnect(scrollbar, SIGNAL(valueChanged(int)), this, SLOT(scrollChanged(int)));
647 scrollbar->setRange(0,slines); 647 scrollbar->setRange(0,slines);
648 scrollbar->setSteps(1,lines); 648 scrollbar->setSteps(1,lines);
649 scrollbar->setValue(cursor); 649 scrollbar->setValue(cursor);
650 connect(scrollbar, SIGNAL(valueChanged(int)), this, SLOT(scrollChanged(int))); 650 connect(scrollbar, SIGNAL(valueChanged(int)), this, SLOT(scrollChanged(int)));
651} 651}
652 652
653void TEWidget::setScrollbarLocation(int loc) 653void TEWidget::setScrollbarLocation(int loc)
654{ 654{
655 if (scrollLoc == loc) return; // quickly 655 if (scrollLoc == loc) return; // quickly
656 scrollLoc = loc; 656 scrollLoc = loc;
657 propagateSize(); 657 propagateSize();
658 update(); 658 update();
659} 659}
660 660
661/* ------------------------------------------------------------------------- */ 661/* ------------------------------------------------------------------------- */
662/* */ 662/* */
663/* Mouse */ 663/* Mouse */
664/* */ 664/* */
665/* ------------------------------------------------------------------------- */ 665/* ------------------------------------------------------------------------- */
666 666
667/*! 667/*!
668 Three different operations can be performed using the mouse, and the 668 Three different operations can be performed using the mouse, and the
669 routines in this section serve all of them: 669 routines in this section serve all of them:
670 670
671 1) The press/release events are exposed to the application 671 1) The press/release events are exposed to the application
672 2) Marking (press and move left button) and Pasting (press middle button) 672 2) Marking (press and move left button) and Pasting (press middle button)
673 3) The right mouse button is used from the configuration menu 673 3) The right mouse button is used from the configuration menu
674 674
675 NOTE: During the marking process we attempt to keep the cursor within 675 NOTE: During the marking process we attempt to keep the cursor within
676 the bounds of the text as being displayed by setting the mouse position 676 the bounds of the text as being displayed by setting the mouse position
677 whenever the mouse has left the text area. 677 whenever the mouse has left the text area.
678 678
679 Two reasons to do so: 679 Two reasons to do so:
680 1) QT does not allow the `grabMouse' to confine-to the TEWidget. 680 1) QT does not allow the `grabMouse' to confine-to the TEWidget.
681 Thus a `XGrapPointer' would have to be used instead. 681 Thus a `XGrapPointer' would have to be used instead.
682 2) Even if so, this would not help too much, since the text area 682 2) Even if so, this would not help too much, since the text area
683 of the TEWidget is normally not identical with it's bounds. 683 of the TEWidget is normally not identical with it's bounds.
684 684
685 The disadvantage of the current handling is, that the mouse can visibly 685 The disadvantage of the current handling is, that the mouse can visibly
686 leave the bounds of the widget and is then moved back. Because of the 686 leave the bounds of the widget and is then moved back. Because of the
687 current construction, and the reasons mentioned above, we cannot do better 687 current construction, and the reasons mentioned above, we cannot do better
688 without changing the overall construction. 688 without changing the overall construction.
689*/ 689*/
690 690
691/*! 691/*!
692*/ 692*/
693 693
694void TEWidget::mousePressEvent(QMouseEvent* ev) 694void TEWidget::mousePressEvent(QMouseEvent* ev)
695{ 695{
696//printf("press [%d,%d] %d\n",ev->x()/font_w,ev->y()/font_h,ev->button()); 696//printf("press [%d,%d] %d\n",ev->x()/font_w,ev->y()/font_h,ev->button());
697 if ( !contentsRect().contains(ev->pos()) ) return; 697 if ( !contentsRect().contains(ev->pos()) ) return;
698 QPoint tL = contentsRect().topLeft(); 698 QPoint tL = contentsRect().topLeft();
699 int tLx = tL.x(); 699 int tLx = tL.x();
700 int tLy = tL.y(); 700 int tLy = tL.y();
701 701
702 word_selection_mode = FALSE; 702 word_selection_mode = FALSE;
703 703
704//printf("press top left [%d,%d] by=%d\n",tLx,tLy, bY); 704//printf("press top left [%d,%d] by=%d\n",tLx,tLy, bY);
705 if ( ev->button() == LeftButton) 705 if ( ev->button() == LeftButton)
706 { 706 {
707 QPoint pos = QPoint((ev->x()-tLx-blX)/font_w,(ev->y()-tLy-bY)/font_h); 707 QPoint pos = QPoint((ev->x()-tLx-blX)/font_w,(ev->y()-tLy-bY)/font_h);
708 708
709 if ( ev->state() & ControlButton ) preserve_line_breaks = FALSE ; 709 if ( ev->state() & ControlButton ) preserve_line_breaks = FALSE ;
710 710
711 if (mouse_marks || (ev->state() & ShiftButton)) 711 if (mouse_marks || (ev->state() & ShiftButton))
712 { 712 {
713 emit clearSelectionSignal(); 713 emit clearSelectionSignal();
714 iPntSel = pntSel = pos; 714 iPntSel = pntSel = pos;
715 actSel = 1; // left mouse button pressed but nothing selected yet. 715 actSel = 1; // left mouse button pressed but nothing selected yet.
716 grabMouse( /*crossCursor*/ ); // handle with care! 716 grabMouse( /*crossCursor*/ ); // handle with care!
717 } 717 }
718 else 718 else
719 { 719 {
720 emit mouseSignal( 0, pos.x() + 1, pos.y() + 1 ); // left button 720 emit mouseSignal( 0, pos.x() + 1, pos.y() + 1 ); // left button
721 } 721 }
722 } 722 }
723 if ( ev->button() == MidButton ) 723 if ( ev->button() == MidButton )
724 { 724 {
725 emitSelection(); 725 emitSelection();
726 } 726 }
727 if ( ev->button() == RightButton ) // Configure 727 if ( ev->button() == RightButton ) // Configure
728 { 728 {
729 emit configureRequest( this, ev->state()&(ShiftButton|ControlButton), ev->x(), ev->y() ); 729 emit configureRequest( this, ev->state()&(ShiftButton|ControlButton), ev->x(), ev->y() );
730 } 730 }
731} 731}
732 732
733void TEWidget::mouseMoveEvent(QMouseEvent* ev) 733void TEWidget::mouseMoveEvent(QMouseEvent* ev)
734{ 734{
735 // for auto-hiding the cursor, we need mouseTracking 735 // for auto-hiding the cursor, we need mouseTracking
736 if (ev->state() == NoButton ) return; 736 if (ev->state() == NoButton ) return;
737 737
738 if (actSel == 0) return; 738 if (actSel == 0) return;
739 739
740 // don't extend selection while pasting 740 // don't extend selection while pasting
741 if (ev->state() & MidButton) return; 741 if (ev->state() & MidButton) return;
742 742
743 //if ( !contentsRect().contains(ev->pos()) ) return; 743 //if ( !contentsRect().contains(ev->pos()) ) return;
744 QPoint tL = contentsRect().topLeft(); 744 QPoint tL = contentsRect().topLeft();
745 int tLx = tL.x(); 745 int tLx = tL.x();
746 int tLy = tL.y(); 746 int tLy = tL.y();
747 int scroll = scrollbar->value(); 747 int scroll = scrollbar->value();
748 748
749 // we're in the process of moving the mouse with the left button pressed 749 // we're in the process of moving the mouse with the left button pressed
750 // the mouse cursor will kept catched within the bounds of the text in 750 // the mouse cursor will kept catched within the bounds of the text in
751 // this widget. 751 // this widget.
752 752
753 // Adjust position within text area bounds. See FIXME above. 753 // Adjust position within text area bounds. See FIXME above.
754 QPoint pos = ev->pos(); 754 QPoint pos = ev->pos();
755 if ( pos.x() < tLx+blX ) pos.setX( tLx+blX ); 755 if ( pos.x() < tLx+blX ) pos.setX( tLx+blX );
756 if ( pos.x() > tLx+blX+columns*font_w-1 ) pos.setX( tLx+blX+columns*font_w ); 756 if ( pos.x() > tLx+blX+columns*font_w-1 ) pos.setX( tLx+blX+columns*font_w );
757 if ( pos.y() < tLy+bY ) pos.setY( tLy+bY ); 757 if ( pos.y() < tLy+bY ) pos.setY( tLy+bY );
758 if ( pos.y() > tLy+bY+lines*font_h-1 ) pos.setY( tLy+bY+lines*font_h-1 ); 758 if ( pos.y() > tLy+bY+lines*font_h-1 ) pos.setY( tLy+bY+lines*font_h-1 );
759 // check if we produce a mouse move event by this 759 // check if we produce a mouse move event by this
760 if ( pos != ev->pos() ) cursor().setPos(mapToGlobal(pos)); 760 if ( pos != ev->pos() ) cursor().setPos(mapToGlobal(pos));
761 761
762 if ( pos.y() == tLy+bY+lines*font_h-1 ) 762 if ( pos.y() == tLy+bY+lines*font_h-1 )
763 { 763 {
764 scrollbar->setValue(scrollbar->value()+yMouseScroll); // scrollforward 764 scrollbar->setValue(scrollbar->value()+yMouseScroll); // scrollforward
765 } 765 }
766 if ( pos.y() == tLy+bY ) 766 if ( pos.y() == tLy+bY )
767 { 767 {
768 scrollbar->setValue(scrollbar->value()-yMouseScroll); // scrollback 768 scrollbar->setValue(scrollbar->value()-yMouseScroll); // scrollback
769 } 769 }
770 770
771 QPoint here = QPoint((pos.x()-tLx-blX)/font_w,(pos.y()-tLy-bY)/font_h); 771 QPoint here = QPoint((pos.x()-tLx-blX)/font_w,(pos.y()-tLy-bY)/font_h);
772 QPoint ohere; 772 QPoint ohere;
773 bool swapping = FALSE; 773 bool swapping = FALSE;
774 774
775 if ( word_selection_mode ) 775 if ( word_selection_mode )
776 { 776 {
777 // Extend to word boundaries 777 // Extend to word boundaries
778 int i; 778 int i;
779 int selClass; 779 int selClass;
780 780
781 bool left_not_right = ( here.y() < iPntSel.y() || 781 bool left_not_right = ( here.y() < iPntSel.y() ||
782 here.y() == iPntSel.y() && here.x() < iPntSel.x() ); 782 here.y() == iPntSel.y() && here.x() < iPntSel.x() );
783 bool old_left_not_right = ( pntSel.y() < iPntSel.y() || 783 bool old_left_not_right = ( pntSel.y() < iPntSel.y() ||
784 pntSel.y() == iPntSel.y() && pntSel.x() < iPntSel.x() ); 784 pntSel.y() == iPntSel.y() && pntSel.x() < iPntSel.x() );
785 swapping = left_not_right != old_left_not_right; 785 swapping = left_not_right != old_left_not_right;
786 786
787 // Find left (left_not_right ? from here : from start) 787 // Find left (left_not_right ? from here : from start)
788 QPoint left = left_not_right ? here : iPntSel; 788 QPoint left = left_not_right ? here : iPntSel;
789 i = loc(left.x(),left.y()); 789 i = loc(left.x(),left.y());
790 selClass = charClass(image[i].c); 790 selClass = charClass(image[i].c);
791 while ( left.x() > 0 && charClass(image[i-1].c) == selClass ) 791 while ( left.x() > 0 && charClass(image[i-1].c) == selClass )
792 { i--; left.rx()--; } 792 { i--; left.rx()--; }
793 793
794 // Find left (left_not_right ? from start : from here) 794 // Find left (left_not_right ? from start : from here)
795 QPoint right = left_not_right ? iPntSel : here; 795 QPoint right = left_not_right ? iPntSel : here;
796 i = loc(right.x(),right.y()); 796 i = loc(right.x(),right.y());
797 selClass = charClass(image[i].c); 797 selClass = charClass(image[i].c);
798 while ( right.x() < columns-1 && charClass(image[i+1].c) == selClass ) 798 while ( right.x() < columns-1 && charClass(image[i+1].c) == selClass )
799 { i++; right.rx()++; } 799 { i++; right.rx()++; }
800 800
801 // Pick which is start (ohere) and which is extension (here) 801 // Pick which is start (ohere) and which is extension (here)
802 if ( left_not_right ) 802 if ( left_not_right )
803 { 803 {
804 here = left; ohere = right; 804 here = left; ohere = right;
805 } 805 }
806 else 806 else
807 { 807 {
808 here = right; ohere = left; 808 here = right; ohere = left;
809 } 809 }
810 } 810 }
811 811
812 if (here == pntSel && scroll == scrollbar->value()) return; // not moved 812 if (here == pntSel && scroll == scrollbar->value()) return; // not moved
813 813
814 if ( word_selection_mode ) { 814 if ( word_selection_mode ) {
815 if ( actSel < 2 || swapping ) { 815 if ( actSel < 2 || swapping ) {
816 emit beginSelectionSignal( ohere.x(), ohere.y() ); 816 emit beginSelectionSignal( ohere.x(), ohere.y() );
817 } 817 }
818 } else if ( actSel < 2 ) { 818 } else if ( actSel < 2 ) {
819 emit beginSelectionSignal( pntSel.x(), pntSel.y() ); 819 emit beginSelectionSignal( pntSel.x(), pntSel.y() );
820 } 820 }
821 821
822 actSel = 2; // within selection 822 actSel = 2; // within selection
823 pntSel = here; 823 pntSel = here;
824 emit extendSelectionSignal( here.x(), here.y() ); 824 emit extendSelectionSignal( here.x(), here.y() );
825} 825}
826 826
827void TEWidget::mouseReleaseEvent(QMouseEvent* ev) 827void TEWidget::mouseReleaseEvent(QMouseEvent* ev)
828{ 828{
829//printf("release [%d,%d] %d\n",ev->x()/font_w,ev->y()/font_h,ev->button()); 829//printf("release [%d,%d] %d\n",ev->x()/font_w,ev->y()/font_h,ev->button());
830 if ( ev->button() == LeftButton) 830 if ( ev->button() == LeftButton)
831 { 831 {
832 if ( actSel > 1 ) emit endSelectionSignal(preserve_line_breaks); 832 if ( actSel > 1 ) emit endSelectionSignal(preserve_line_breaks);
833 preserve_line_breaks = TRUE; 833 preserve_line_breaks = TRUE;
834 actSel = 0; 834 actSel = 0;
835 835
836 //FIXME: emits a release event even if the mouse is 836 //FIXME: emits a release event even if the mouse is
837 // outside the range. The procedure used in `mouseMoveEvent' 837 // outside the range. The procedure used in `mouseMoveEvent'
838 // applies here, too. 838 // applies here, too.
839 839
840 QPoint tL = contentsRect().topLeft(); 840 QPoint tL = contentsRect().topLeft();
841 int tLx = tL.x(); 841 int tLx = tL.x();
842 int tLy = tL.y(); 842 int tLy = tL.y();
843 843
844 if (!mouse_marks && !(ev->state() & ShiftButton)) 844 if (!mouse_marks && !(ev->state() & ShiftButton))
845 emit mouseSignal( 3, // release 845 emit mouseSignal( 3, // release
846 (ev->x()-tLx-blX)/font_w + 1, 846 (ev->x()-tLx-blX)/font_w + 1,
847 (ev->y()-tLy-bY)/font_h + 1 ); 847 (ev->y()-tLy-bY)/font_h + 1 );
848 releaseMouse(); 848 releaseMouse();
849 } 849 }
850} 850}
851 851
852void TEWidget::mouseDoubleClickEvent(QMouseEvent* ev) 852void TEWidget::mouseDoubleClickEvent(QMouseEvent* ev)
853{ 853{
854 if ( ev->button() != LeftButton) return; 854 if ( ev->button() != LeftButton) return;
855 855
856 QPoint tL = contentsRect().topLeft(); 856 QPoint tL = contentsRect().topLeft();
857 int tLx = tL.x(); 857 int tLx = tL.x();
858 int tLy = tL.y(); 858 int tLy = tL.y();
859 QPoint pos = QPoint((ev->x()-tLx-blX)/font_w,(ev->y()-tLy-bY)/font_h); 859 QPoint pos = QPoint((ev->x()-tLx-blX)/font_w,(ev->y()-tLy-bY)/font_h);
860 860
861 // pass on double click as two clicks. 861 // pass on double click as two clicks.
862 if (!mouse_marks && !(ev->state() & ShiftButton)) 862 if (!mouse_marks && !(ev->state() & ShiftButton))
863 { 863 {
864 emit mouseSignal( 0, pos.x()+1, pos.y()+1 ); // left button 864 emit mouseSignal( 0, pos.x()+1, pos.y()+1 ); // left button
865 emit mouseSignal( 3, pos.x()+1, pos.y()+1 ); // release 865 emit mouseSignal( 3, pos.x()+1, pos.y()+1 ); // release
866 emit mouseSignal( 0, pos.x()+1, pos.y()+1 ); // left button 866 emit mouseSignal( 0, pos.x()+1, pos.y()+1 ); // left button
867 return; 867 return;
868 } 868 }
869 869
870 870
871 emit clearSelectionSignal(); 871 emit clearSelectionSignal();
872 QPoint bgnSel = pos; 872 QPoint bgnSel = pos;
873 QPoint endSel = QPoint((ev->x()-tLx-blX)/font_w,(ev->y()-tLy-bY)/font_h); 873 QPoint endSel = QPoint((ev->x()-tLx-blX)/font_w,(ev->y()-tLy-bY)/font_h);
874 int i = loc(bgnSel.x(),bgnSel.y()); 874 int i = loc(bgnSel.x(),bgnSel.y());
875 iPntSel = bgnSel; 875 iPntSel = bgnSel;
876 876
877 word_selection_mode = TRUE; 877 word_selection_mode = TRUE;
878 878
879 // find word boundaries... 879 // find word boundaries...
880 int selClass = charClass(image[i].c); 880 int selClass = charClass(image[i].c);
881 { 881 {
882 // set the start... 882 // set the start...
883 int x = bgnSel.x(); 883 int x = bgnSel.x();
884 while ( x > 0 && charClass(image[i-1].c) == selClass ) 884 while ( x > 0 && charClass(image[i-1].c) == selClass )
885 { i--; x--; } 885 { i--; x--; }
886 bgnSel.setX(x); 886 bgnSel.setX(x);
887 emit beginSelectionSignal( bgnSel.x(), bgnSel.y() ); 887 emit beginSelectionSignal( bgnSel.x(), bgnSel.y() );
888 888
889 // set the end... 889 // set the end...
890 i = loc( endSel.x(), endSel.y() ); 890 i = loc( endSel.x(), endSel.y() );
891 x = endSel.x(); 891 x = endSel.x();
892 while( x < columns-1 && charClass(image[i+1].c) == selClass ) 892 while( x < columns-1 && charClass(image[i+1].c) == selClass )
893 { i++; x++ ; } 893 { i++; x++ ; }
894 endSel.setX(x); 894 endSel.setX(x);
895 actSel = 2; // within selection 895 actSel = 2; // within selection
896 emit extendSelectionSignal( endSel.x(), endSel.y() ); 896 emit extendSelectionSignal( endSel.x(), endSel.y() );
897 emit endSelectionSignal(preserve_line_breaks); 897 emit endSelectionSignal(preserve_line_breaks);
898 preserve_line_breaks = TRUE; 898 preserve_line_breaks = TRUE;
899 } 899 }
900} 900}
901 901
902void TEWidget::focusInEvent( QFocusEvent * ) 902void TEWidget::focusInEvent( QFocusEvent * )
903{ 903{
904 904
905 // do nothing, to prevent repainting 905 // do nothing, to prevent repainting
906} 906}
907 907
908 908
909void TEWidget::focusOutEvent( QFocusEvent * ) 909void TEWidget::focusOutEvent( QFocusEvent * )
910{ 910{
911 // do nothing, to prevent repainting 911 // do nothing, to prevent repainting
912} 912}
913 913
914bool TEWidget::focusNextPrevChild( bool next ) 914bool TEWidget::focusNextPrevChild( bool next )
915{ 915{
916 if (next) 916 if (next)
917 return false; // This disables changing the active part in konqueror 917 return false; // This disables changing the active part in konqueror
918 // when pressing Tab 918 // when pressing Tab
919 return QFrame::focusNextPrevChild( next ); 919 return QFrame::focusNextPrevChild( next );
920} 920}
921 921
922 922
923int TEWidget::charClass(char ch) const 923int TEWidget::charClass(char ch) const
924{ 924{
925 // This might seem like overkill, but imagine if ch was a Unicode 925 // This might seem like overkill, but imagine if ch was a Unicode
926 // character (Qt 2.0 QChar) - it might then be sensible to separate 926 // character (Qt 2.0 QChar) - it might then be sensible to separate
927 // the different language ranges, etc. 927 // the different language ranges, etc.
928 928
929 if ( isspace(ch) ) return ' '; 929 if ( isspace(ch) ) return ' ';
930 930
931 static const char *word_characters = ":@-./_~"; 931 static const char *word_characters = ":@-./_~";
932 if ( isalnum(ch) || strchr(word_characters, ch) ) 932 if ( isalnum(ch) || strchr(word_characters, ch) )
933 return 'a'; 933 return 'a';
934 934
935 // Everything else is weird 935 // Everything else is weird
936 return 1; 936 return 1;
937} 937}
938 938
939void TEWidget::setMouseMarks(bool on) 939void TEWidget::setMouseMarks(bool on)
940{ 940{
941 mouse_marks = on; 941 mouse_marks = on;
942 setCursor( mouse_marks ? ibeamCursor : arrowCursor ); 942 setCursor( mouse_marks ? ibeamCursor : arrowCursor );
943} 943}
944 944
945/* ------------------------------------------------------------------------- */ 945/* ------------------------------------------------------------------------- */
946/* */ 946/* */
947/* Clipboard */ 947/* Clipboard */
948/* */ 948/* */
949/* ------------------------------------------------------------------------- */ 949/* ------------------------------------------------------------------------- */
950 950
951#undef KeyPress 951#undef KeyPress
952 952
953void TEWidget::emitSelection() 953void TEWidget::emitSelection()
954// Paste Clipboard by simulating keypress events 954// Paste Clipboard by simulating keypress events
955{ 955{
956#ifndef QT_NO_CLIPBOARD 956#ifndef QT_NO_CLIPBOARD
957 QString text = QApplication::clipboard()->text(); 957 QString text = QApplication::clipboard()->text();
958 if ( ! text.isNull() ) 958 if ( ! text.isNull() )
959 { 959 {
960 text.replace(QRegExp("\n"), "\r"); 960 text.replace(QRegExp("\n"), "\r");
961 QKeyEvent e(QEvent::KeyPress, 0, -1, 0, text); 961 QKeyEvent e(QEvent::KeyPress, 0, -1, 0, text);
962 emit keyPressedSignal(&e); // expose as a big fat keypress event 962 emit keyPressedSignal(&e); // expose as a big fat keypress event
963 emit clearSelectionSignal(); 963 emit clearSelectionSignal();
964 } 964 }
965#endif 965#endif
966} 966}
967 967
968void TEWidget::emitText(QString text) 968void TEWidget::emitText(QString text)
969{ 969{
970 QKeyEvent e(QEvent::KeyPress, 0, -1, 0, text); 970 QKeyEvent e(QEvent::KeyPress, 0, -1, 0, text);
971 emit keyPressedSignal(&e); // expose as a big fat keypress event 971 emit keyPressedSignal(&e); // expose as a big fat keypress event
972} 972}
973 973
974void TEWidget::pasteClipboard( ) 974void TEWidget::pasteClipboard( )
975{ 975{
976 emitSelection(); 976 emitSelection();
977} 977}
978 978
979void TEWidget::setSelection(const QString& t) 979void TEWidget::setSelection(const QString& t)
980{ 980{
981#ifndef QT_NO_CLIPBOARD 981#ifndef QT_NO_CLIPBOARD
982 // Disconnect signal while WE set the clipboard 982 // Disconnect signal while WE set the clipboard
983 QObject *cb = QApplication::clipboard(); 983 QObject *cb = QApplication::clipboard();
984 QObject::disconnect( cb, SIGNAL(dataChanged()), 984 QObject::disconnect( cb, SIGNAL(dataChanged()),
985 this, SLOT(onClearSelection()) ); 985 this, SLOT(onClearSelection()) );
986 986
987 QApplication::clipboard()->setText(t); 987 QApplication::clipboard()->setText(t);
988 988
989 QObject::connect( cb, SIGNAL(dataChanged()), 989 QObject::connect( cb, SIGNAL(dataChanged()),
990 this, SLOT(onClearSelection()) ); 990 this, SLOT(onClearSelection()) );
991#endif 991#endif
992} 992}
993 993
994void TEWidget::onClearSelection() 994void TEWidget::onClearSelection()
995{ 995{
996 emit clearSelectionSignal(); 996 emit clearSelectionSignal();
997} 997}
998 998
999/* ------------------------------------------------------------------------- */ 999/* ------------------------------------------------------------------------- */
1000/* */ 1000/* */
1001/* Keyboard */ 1001/* Keyboard */
1002/* */ 1002/* */
1003/* ------------------------------------------------------------------------- */ 1003/* ------------------------------------------------------------------------- */
1004 1004
1005//FIXME: an `eventFilter' has been installed instead of a `keyPressEvent' 1005//FIXME: an `eventFilter' has been installed instead of a `keyPressEvent'
1006// due to a bug in `QT' or the ignorance of the author to prevent 1006// due to a bug in `QT' or the ignorance of the author to prevent
1007// repaint events being emitted to the screen whenever one leaves 1007// repaint events being emitted to the screen whenever one leaves
1008// or reenters the screen to/from another application. 1008// or reenters the screen to/from another application.
1009// 1009//
1010// Troll says one needs to change focusInEvent() and focusOutEvent(), 1010// Troll says one needs to change focusInEvent() and focusOutEvent(),
1011// which would also let you have an in-focus cursor and an out-focus 1011// which would also let you have an in-focus cursor and an out-focus
1012// cursor like xterm does. 1012// cursor like xterm does.
1013 1013
1014// for the auto-hide cursor feature, I added empty focusInEvent() and 1014// for the auto-hide cursor feature, I added empty focusInEvent() and
1015// focusOutEvent() so that update() isn't called. 1015// focusOutEvent() so that update() isn't called.
1016// For auto-hide, we need to get keypress-events, but we only get them when 1016// For auto-hide, we need to get keypress-events, but we only get them when
1017// we have focus. 1017// we have focus.
1018 1018
1019void TEWidget::doScroll(int lines) 1019void TEWidget::doScroll(int lines)
1020{ 1020{
1021 scrollbar->setValue(scrollbar->value()+lines); 1021 scrollbar->setValue(scrollbar->value()+lines);
1022} 1022}
1023 1023
1024bool TEWidget::eventFilter( QObject *obj, QEvent *e ) 1024bool TEWidget::eventFilter( QObject *obj, QEvent *e )
1025{ 1025{
1026 if ( (e->type() == QEvent::Accel || 1026 if ( (e->type() == QEvent::Accel ||
1027 e->type() == QEvent::AccelAvailable ) && qApp->focusWidget() == this ) { 1027 e->type() == QEvent::AccelAvailable ) && qApp->focusWidget() == this ) {
1028 static_cast<QKeyEvent *>( e )->ignore(); 1028 static_cast<QKeyEvent *>( e )->ignore();
1029 return true; 1029 return true;
1030 } 1030 }
1031 if ( obj != this /* when embedded */ && obj != parent() /* when standalone */ ) 1031 if ( obj != this /* when embedded */ && obj != parent() /* when standalone */ )
1032 return FALSE; // not us 1032 return FALSE; // not us
1033 if ( e->type() == QEvent::Wheel) { 1033 if ( e->type() == QEvent::Wheel) {
1034 QApplication::sendEvent(scrollbar, e); 1034 QApplication::sendEvent(scrollbar, e);
1035 } 1035 }
1036 1036
1037#ifdef FAKE_CTRL_AND_ALT 1037#ifdef FAKE_CTRL_AND_ALT
1038 static bool control = FALSE; 1038 static bool control = FALSE;
1039 static bool alt = FALSE; 1039 static bool alt = FALSE;
1040// qDebug(" Has a keyboard with no CTRL and ALT keys, but we fake it:"); 1040// qDebug(" Has a keyboard with no CTRL and ALT keys, but we fake it:");
1041 bool dele=FALSE; 1041 bool dele=FALSE;
1042 if ( e->type() == QEvent::KeyPress || e->type() == QEvent::KeyRelease ) { 1042 if ( e->type() == QEvent::KeyPress || e->type() == QEvent::KeyRelease ) {
1043 QKeyEvent* ke = (QKeyEvent*)e; 1043 QKeyEvent* ke = (QKeyEvent*)e;
1044 bool keydown = e->type() == QEvent::KeyPress || ke->isAutoRepeat(); 1044 bool keydown = e->type() == QEvent::KeyPress || ke->isAutoRepeat();
1045 switch (ke->key()) { 1045 switch (ke->key()) {
1046 case Key_F9: // let this be "Control" 1046 case Key_F9: // let this be "Control"
1047 control = keydown; 1047 control = keydown;
1048 e = new QKeyEvent(QEvent::KeyPress, Key_Control, 0, ke->state()); 1048 e = new QKeyEvent(QEvent::KeyPress, Key_Control, 0, ke->state());
1049 dele=TRUE; 1049 dele=TRUE;
1050 break; 1050 break;
1051 case Key_F13: // let this be "Alt" 1051 case Key_F13: // let this be "Alt"
1052 alt = keydown; 1052 alt = keydown;
1053 e = new QKeyEvent(QEvent::KeyPress, Key_Alt, 0, ke->state()); 1053 e = new QKeyEvent(QEvent::KeyPress, Key_Alt, 0, ke->state());
1054 dele=TRUE; 1054 dele=TRUE;
1055 break; 1055 break;
1056 default: 1056 default:
1057 if ( control ) { 1057 if ( control ) {
1058 int a = toupper(ke->ascii())-64; 1058 int a = toupper(ke->ascii())-64;
1059 if ( a >= 0 && a < ' ' ) { 1059 if ( a >= 0 && a < ' ' ) {
1060 e = new QKeyEvent(e->type(), ke->key(), 1060 e = new QKeyEvent(e->type(), ke->key(),
1061 a, ke->state()|ControlButton, QChar(a,0)); 1061 a, ke->state()|ControlButton, QChar(a,0));
1062 dele=TRUE; 1062 dele=TRUE;
1063 } 1063 }
1064 } 1064 }
1065 if ( alt ) { 1065 if ( alt ) {
1066 e = new QKeyEvent(e->type(), ke->key(), 1066 e = new QKeyEvent(e->type(), ke->key(),
1067 ke->ascii(), ke->state()|AltButton, ke->text()); 1067 ke->ascii(), ke->state()|AltButton, ke->text());
1068 dele=TRUE; 1068 dele=TRUE;
1069 } 1069 }
1070 } 1070 }
1071 } 1071 }
1072#endif 1072#endif
1073 1073
1074 if ( e->type() == QEvent::KeyPress ) { 1074 if ( e->type() == QEvent::KeyPress ) {
1075 QKeyEvent* ke = (QKeyEvent*)e; 1075 QKeyEvent* ke = (QKeyEvent*)e;
1076 actSel=0; // Key stroke implies a screen update, so TEWidget won't 1076 actSel=0; // Key stroke implies a screen update, so TEWidget won't
1077 // know where the current selection is. 1077 // know where the current selection is.
1078 1078
1079// qDebug("key pressed is 0x%x",ke->key()); 1079// qDebug("key pressed is 0x%x",ke->key());
1080 1080
1081 if( ke->state() == ShiftButton && ke->key() == Key_Tab) { //lets hardcode this sucker 1081 if( ke->state() == ShiftButton && ke->key() == Key_Tab) { //lets hardcode this sucker
1082 1082
1083// qDebug("key pressed 2 is 0x%x",ke->key()); 1083// qDebug("key pressed 2 is 0x%x",ke->key());
1084 emitText("\\"); // expose 1084 emitText("\\"); // expose
1085 } else 1085 } else
1086 emit keyPressedSignal(ke); // expose 1086 emit keyPressedSignal(ke); // expose
1087 ke->accept(); 1087 ke->accept();
1088#ifdef FAKE_CTRL_AND_ALT 1088#ifdef FAKE_CTRL_AND_ALT
1089 if ( dele ) delete e; 1089 if ( dele ) delete e;
1090#endif 1090#endif
1091 return true; // stop the event 1091 return true; // stop the event
1092 } 1092 }
1093 if ( e->type() == QEvent::Enter ) { 1093 if ( e->type() == QEvent::Enter ) {
1094 QObject::disconnect( (QObject*)cb, SIGNAL(dataChanged()), 1094 QObject::disconnect( (QObject*)cb, SIGNAL(dataChanged()),
1095 this, SLOT(onClearSelection()) ); 1095 this, SLOT(onClearSelection()) );
1096 } 1096 }
1097 if ( e->type() == QEvent::Leave ) { 1097 if ( e->type() == QEvent::Leave ) {
1098 QObject::connect( (QObject*)cb, SIGNAL(dataChanged()), 1098 QObject::connect( (QObject*)cb, SIGNAL(dataChanged()),
1099 this, SLOT(onClearSelection()) ); 1099 this, SLOT(onClearSelection()) );
1100 } 1100 }
1101 return QFrame::eventFilter( obj, e ); 1101 return QFrame::eventFilter( obj, e );
1102} 1102}
1103 1103
1104/* ------------------------------------------------------------------------- */ 1104/* ------------------------------------------------------------------------- */
1105/* */ 1105/* */
1106/* Frame */ 1106/* Frame */
1107/* */ 1107/* */
1108/* ------------------------------------------------------------------------- */ 1108/* ------------------------------------------------------------------------- */
1109 1109
1110void TEWidget::frameChanged() 1110void TEWidget::frameChanged()
1111{ 1111{
1112 propagateSize(); 1112 propagateSize();
1113 update(); 1113 update();
1114} 1114}
1115 1115
1116/* ------------------------------------------------------------------------- */ 1116/* ------------------------------------------------------------------------- */
1117/* */ 1117/* */
1118/* Sound */ 1118/* Sound */
1119/* */ 1119/* */
1120/* ------------------------------------------------------------------------- */ 1120/* ------------------------------------------------------------------------- */
1121 1121
1122void TEWidget::Bell() 1122void TEWidget::Bell()
1123{ 1123{
1124 QApplication::beep(); 1124 QApplication::beep();
1125} 1125}
1126 1126
1127/* ------------------------------------------------------------------------- */ 1127/* ------------------------------------------------------------------------- */
1128/* */ 1128/* */
1129/* Auxiluary */ 1129/* Auxiluary */
1130/* */ 1130/* */
1131/* ------------------------------------------------------------------------- */ 1131/* ------------------------------------------------------------------------- */
1132 1132
1133void TEWidget::clearImage() 1133void TEWidget::clearImage()
1134// initialize the image 1134// initialize the image
1135// for internal use only 1135// for internal use only
1136{ 1136{
1137 for (int y = 0; y < lines; y++) 1137 for (int y = 0; y < lines; y++)
1138 for (int x = 0; x < columns; x++) 1138 for (int x = 0; x < columns; x++)
1139 { 1139 {
1140 image[loc(x,y)].c = 0xff; //' '; 1140 image[loc(x,y)].c = 0xff; //' ';
1141 image[loc(x,y)].f = 0xff; //DEFAULT_FORE_COLOR; 1141 image[loc(x,y)].f = 0xff; //DEFAULT_FORE_COLOR;
1142 image[loc(x,y)].b = 0xff; //DEFAULT_BACK_COLOR; 1142 image[loc(x,y)].b = 0xff; //DEFAULT_BACK_COLOR;
1143 image[loc(x,y)].r = 0xff; //DEFAULT_RENDITION; 1143 image[loc(x,y)].r = 0xff; //DEFAULT_RENDITION;
1144 } 1144 }
1145} 1145}
1146 1146
1147// Create Image /////////////////////////////////////////////////////// 1147// Create Image ///////////////////////////////////////////////////////
1148 1148
1149void TEWidget::calcGeometry() 1149void TEWidget::calcGeometry()
1150{ 1150{
1151 //FIXME: set rimX == rimY == 0 when running in full screen mode. 1151 //FIXME: set rimX == rimY == 0 when running in full screen mode.
1152 1152
1153 int showhscrollbar = 1; 1153 int showhscrollbar = 1;
1154 int hwidth = 0; 1154 int hwidth = 0;
1155 int dcolumns; 1155 int dcolumns;
1156 1156
1157 if(vcolumns == 0) showhscrollbar = 0; 1157 if(vcolumns == 0) showhscrollbar = 0;
1158 if(showhscrollbar == 1) hwidth = QApplication::style().scrollBarExtent().width(); 1158 if(showhscrollbar == 1) hwidth = QApplication::style().scrollBarExtent().width();
1159 1159
1160 scrollbar->resize(QApplication::style().scrollBarExtent().width(), 1160 scrollbar->resize(QApplication::style().scrollBarExtent().width(),
1161 contentsRect().height() - hwidth); 1161 contentsRect().height() - hwidth);
1162 1162
1163 if(!showhscrollbar) cornerButton()->move(0, 0); 1163 if(!showhscrollbar) cornerButton()->move(0, 0);
1164 else cornerButton()->move(contentsRect().width() - hwidth, contentsRect().height() - hwidth); 1164 else cornerButton()->move(contentsRect().width() - hwidth, contentsRect().height() - hwidth);
1165 1165
1166 1166
1167 switch(scrollLoc) 1167 switch(scrollLoc)
1168 { 1168 {
1169 case SCRNONE : 1169 case SCRNONE :
1170 columns = ( contentsRect().width() - 2 * rimX ) / font_w; 1170 columns = ( contentsRect().width() - 2 * rimX ) / font_w;
1171 dcolumns = columns; 1171 dcolumns = columns;
1172 if(vcolumns) columns = vcolumns; 1172 if(vcolumns) columns = vcolumns;
1173 blX = (contentsRect().width() - (columns*font_w) ) / 2; 1173 blX = (contentsRect().width() - (columns*font_w) ) / 2;
1174 if(showhscrollbar) 1174 if(showhscrollbar)
1175 blX = -hposition * font_w; 1175 blX = -hposition * font_w;
1176 brX = blX; 1176 brX = blX;
1177 scrollbar->hide(); 1177 scrollbar->hide();
1178 break; 1178 break;
1179 case SCRLEFT : 1179 case SCRLEFT :
1180 columns = ( contentsRect().width() - 2 * rimX - scrollbar->width()) / font_w; 1180 columns = ( contentsRect().width() - 2 * rimX - scrollbar->width()) / font_w;
1181 dcolumns = columns; 1181 dcolumns = columns;
1182 if(vcolumns) columns = vcolumns; 1182 if(vcolumns) columns = vcolumns;
1183 brX = (contentsRect().width() - (columns*font_w) - scrollbar->width() ) / 2; 1183 brX = (contentsRect().width() - (columns*font_w) - scrollbar->width() ) / 2;
1184 if(showhscrollbar) 1184 if(showhscrollbar)
1185 brX = -hposition * font_w; 1185 brX = -hposition * font_w;
1186 blX = brX + scrollbar->width(); 1186 blX = brX + scrollbar->width();
1187 scrollbar->move(contentsRect().topLeft()); 1187 scrollbar->move(contentsRect().topLeft());
1188 scrollbar->show(); 1188 scrollbar->show();
1189 break; 1189 break;
1190 case SCRRIGHT: 1190 case SCRRIGHT:
1191 columns = ( contentsRect().width() - 2 * rimX - scrollbar->width()) / font_w; 1191 columns = ( contentsRect().width() - 2 * rimX - scrollbar->width()) / font_w;
1192 dcolumns = columns; 1192 dcolumns = columns;
1193 if(vcolumns) columns = vcolumns; 1193 if(vcolumns) columns = vcolumns;
1194 blX = (contentsRect().width() - (columns*font_w) - scrollbar->width() ) / 2; 1194 blX = (contentsRect().width() - (columns*font_w) - scrollbar->width() ) / 2;
1195 if(showhscrollbar) 1195 if(showhscrollbar)
1196 blX = -hposition * font_w; 1196 blX = -hposition * font_w;
1197 brX = blX; 1197 brX = blX;
1198 scrollbar->move(contentsRect().topRight() - QPoint(scrollbar->width()-1,0)); 1198 scrollbar->move(contentsRect().topRight() - QPoint(scrollbar->width()-1,0));
1199 scrollbar->show(); 1199 scrollbar->show();
1200 break; 1200 break;
1201 } 1201 }
1202 //FIXME: support 'rounding' styles 1202 //FIXME: support 'rounding' styles
1203 lines = ( contentsRect().height() - 2 * rimY ) / font_h; 1203 lines = ( contentsRect().height() - 2 * rimY ) / font_h;
1204 bY = (contentsRect().height() - (lines *font_h)) / 2; 1204 bY = (contentsRect().height() - (lines *font_h)) / 2;
1205 1205
1206 if(showhscrollbar == 1) 1206 if(showhscrollbar == 1)
1207 { 1207 {
1208 hscrollbar->resize(contentsRect().width() - hwidth, hwidth); 1208 hscrollbar->resize(contentsRect().width() - hwidth, hwidth);
1209 hscrollbar->setRange(0, vcolumns - dcolumns); 1209 hscrollbar->setRange(0, vcolumns - dcolumns);
1210 1210
1211 QPoint p = contentsRect().bottomLeft(); 1211 QPoint p = contentsRect().bottomLeft();
1212 hscrollbar->move(QPoint(p.x(), p.y() - hwidth)); 1212 hscrollbar->move(QPoint(p.x(), p.y() - hwidth));
1213 hscrollbar->show(); 1213 hscrollbar->show();
1214 } 1214 }
1215 else hscrollbar->hide(); 1215 else hscrollbar->hide();
1216 1216
1217 if(showhscrollbar == 1) 1217 if(showhscrollbar == 1)
1218 { 1218 {
1219 lines = lines - (hwidth / font_h) - 1; 1219 lines = lines - (hwidth / font_h) - 1;
1220 if(lines < 1) lines = 1; 1220 if(lines < 1) lines = 1;
1221 } 1221 }
1222} 1222}
1223 1223
1224void TEWidget::makeImage() 1224void TEWidget::makeImage()
1225//FIXME: rename 'calcGeometry? 1225//FIXME: rename 'calcGeometry?
1226{ 1226{
1227 calcGeometry(); 1227 calcGeometry();
1228 image = (ca*) malloc(lines*columns*sizeof(ca)); 1228 image = (ca*) malloc(lines*columns*sizeof(ca));
1229 clearImage(); 1229 clearImage();
1230} 1230}
1231 1231
1232// calculate the needed size 1232// calculate the needed size
1233QSize TEWidget::calcSize(int cols, int lins) const 1233QSize TEWidget::calcSize(int cols, int lins) const
1234{ 1234{
1235 int frw = width() - contentsRect().width(); 1235 int frw = width() - contentsRect().width();
1236 int frh = height() - contentsRect().height(); 1236 int frh = height() - contentsRect().height();
1237 int scw = (scrollLoc==SCRNONE?0:scrollbar->width()); 1237 int scw = (scrollLoc==SCRNONE?0:scrollbar->width());
1238 return QSize( font_w*cols + 2*rimX + frw + scw, font_h*lins + 2*rimY + frh ); 1238 return QSize( font_w*cols + 2*rimX + frw + scw, font_h*lins + 2*rimY + frh );
1239} 1239}
1240 1240
1241QSize TEWidget::sizeHint() const 1241QSize TEWidget::sizeHint() const
1242{ 1242{
1243 return size(); 1243 return size();
1244} 1244}
1245 1245
1246void TEWidget::styleChange(QStyle &) 1246void TEWidget::styleChange(QStyle &)
1247{ 1247{
1248 propagateSize(); 1248 propagateSize();
1249} 1249}
1250 1250
1251#ifndef QT_NO_DRAGANDDROP 1251#ifdef QT_NO_DRAGANDDROP_FOO
1252 1252
1253/* --------------------------------------------------------------------- */ 1253/* --------------------------------------------------------------------- */
1254/* */ 1254/* */
1255/* Drag & Drop */ 1255/* Drag & Drop */
1256/* */ 1256/* */
1257/* --------------------------------------------------------------------- */ 1257/* --------------------------------------------------------------------- */
1258 1258
1259 1259
1260void TEWidget::dragEnterEvent(QDragEnterEvent* e) 1260void TEWidget::dragEnterEvent(QDragEnterEvent* e)
1261{ 1261{
1262 e->accept(QTextDrag::canDecode(e) || 1262 e->accept(QTextDrag::canDecode(e) ||
1263 QUriDrag::canDecode(e)); 1263 QUriDrag::canDecode(e));
1264} 1264}
1265 1265
1266void TEWidget::dropEvent(QDropEvent* event) 1266void TEWidget::dropEvent(QDropEvent* event)
1267{ 1267{
1268 // The current behaviour when url(s) are dropped is 1268 // The current behaviour when url(s) are dropped is
1269 // * if there is only ONE url and if it's a LOCAL one, ask for paste or cd 1269 // * if there is only ONE url and if it's a LOCAL one, ask for paste or cd
1270 // * in all other cases, just paste 1270 // * in all other cases, just paste
1271 // (for non-local ones, or for a list of URLs, 'cd' is nonsense) 1271 // (for non-local ones, or for a list of URLs, 'cd' is nonsense)
1272 QStrList strlist; 1272 QStrList strlist;
1273 int file_count = 0; 1273 int file_count = 0;
1274 dropText = ""; 1274 dropText = "";
1275 bool bPopup = true; 1275 bool bPopup = true;
1276 1276
1277 if(QUriDrag::decode(event, strlist)) { 1277 if(QUriDrag::decode(event, strlist)) {
1278 if (strlist.count()) { 1278 if (strlist.count()) {
1279 for(const char* p = strlist.first(); p; p = strlist.next()) { 1279 for(const char* p = strlist.first(); p; p = strlist.next()) {
1280 if(file_count++ > 0) { 1280 if(file_count++ > 0) {
1281 dropText += " "; 1281 dropText += " ";
1282 bPopup = false; // more than one file, don't popup 1282 bPopup = false; // more than one file, don't popup
1283 } 1283 }
1284 1284
1285/* 1285/*
1286 KURL url(p); 1286 KURL url(p);
1287 if (url.isLocalFile()) { 1287 if (url.isLocalFile()) {
1288 dropText += url.path(); // local URL : remove protocol 1288 dropText += url.path(); // local URL : remove protocol
1289 } 1289 }
1290 else { 1290 else {
1291 dropText += url.prettyURL(); 1291 dropText += url.prettyURL();
1292 bPopup = false; // a non-local file, don't popup 1292 bPopup = false; // a non-local file, don't popup
1293 } 1293 }
1294*/ 1294*/
1295 1295
1296 } 1296 }
1297 1297
1298 if (bPopup) 1298 if (bPopup)
1299 // m_drop->popup(pos() + event->pos()); 1299 // m_drop->popup(pos() + event->pos());
1300 m_drop->popup(mapToGlobal(event->pos())); 1300 m_drop->popup(mapToGlobal(event->pos()));
1301 else 1301 else
1302 { 1302 {
1303 if (currentSession) { 1303 if (currentSession) {
1304 currentSession->getEmulation()->sendString(dropText.local8Bit()); 1304 currentSession->getEmulation()->sendString(dropText.local8Bit());
1305 } 1305 }
1306// kdDebug() << "Drop:" << dropText.local8Bit() << "\n"; 1306// kdDebug() << "Drop:" << dropText.local8Bit() << "\n";
1307 } 1307 }
1308 } 1308 }
1309 } 1309 }
1310 else if(QTextDrag::decode(event, dropText)) { 1310 else if(QTextDrag::decode(event, dropText)) {
1311// kdDebug() << "Drop:" << dropText.local8Bit() << "\n"; 1311// kdDebug() << "Drop:" << dropText.local8Bit() << "\n";
1312 if (currentSession) { 1312 if (currentSession) {
1313 currentSession->getEmulation()->sendString(dropText.local8Bit()); 1313 currentSession->getEmulation()->sendString(dropText.local8Bit());
1314 } 1314 }
1315 // Paste it 1315 // Paste it
1316 } 1316 }
1317} 1317}
1318#endif 1318#endif
1319 1319
1320 1320
1321void TEWidget::drop_menu_activated(int) 1321void TEWidget::drop_menu_activated(int)
1322{ 1322{
1323#ifndef QT_NO_DRAGANDDROP 1323#ifdef QT_NO_DRAGANDDROP_FOO
1324 switch (item) 1324 switch (item)
1325 { 1325 {
1326 case 0: // paste 1326 case 0: // paste
1327 currentSession->getEmulation()->sendString(dropText.local8Bit()); 1327 currentSession->getEmulation()->sendString(dropText.local8Bit());
1328// KWM::activate((Window)this->winId()); 1328// KWM::activate((Window)this->winId());
1329 break; 1329 break;
1330 case 1: // cd ... 1330 case 1: // cd ...
1331 currentSession->getEmulation()->sendString("cd "); 1331 currentSession->getEmulation()->sendString("cd ");
1332 struct stat statbuf; 1332 struct stat statbuf;
1333 if ( ::stat( QFile::encodeName( dropText ), &statbuf ) == 0 ) 1333 if ( ::stat( QFile::encodeName( dropText ), &statbuf ) == 0 )
1334 { 1334 {
1335 if ( !S_ISDIR(statbuf.st_mode) ) 1335 if ( !S_ISDIR(statbuf.st_mode) )
1336 { 1336 {
1337/* 1337/*
1338 KURL url; 1338 KURL url;
1339 url.setPath( dropText ); 1339 url.setPath( dropText );
1340 dropText = url.directory( true, false ); // remove filename 1340 dropText = url.directory( true, false ); // remove filename
1341*/ 1341*/
1342 } 1342 }
1343 } 1343 }
1344 dropText.replace(QRegExp(" "), "\\ "); // escape spaces 1344 dropText.replace(QRegExp(" "), "\\ "); // escape spaces
1345 currentSession->getEmulation()->sendString(dropText.local8Bit()); 1345 currentSession->getEmulation()->sendString(dropText.local8Bit());
1346 currentSession->getEmulation()->sendString("\n"); 1346 currentSession->getEmulation()->sendString("\n");
1347// KWM::activate((Window)this->winId()); 1347// KWM::activate((Window)this->winId());
1348 break; 1348 break;
1349 } 1349 }
1350#endif 1350#endif
1351} 1351}
1352 1352
1353QPushButton* TEWidget::cornerButton() { 1353QPushButton* TEWidget::cornerButton() {
1354 return m_cornerButton; 1354 return m_cornerButton;
1355} 1355}
1356 1356
1357void TEWidget::setWrapAt(int columns) 1357void TEWidget::setWrapAt(int columns)
1358{ 1358{
1359 vcolumns = columns; 1359 vcolumns = columns;
1360 propagateSize(); 1360 propagateSize();
1361 update(); 1361 update();
1362} 1362}
1363 1363
1364 1364
diff --git a/noncore/apps/opie-console/TEWidget.h b/noncore/apps/opie-console/TEWidget.h
index 6ff731b..900a659 100644
--- a/noncore/apps/opie-console/TEWidget.h
+++ b/noncore/apps/opie-console/TEWidget.h
@@ -1,214 +1,214 @@
1/* ----------------------------------------------------------------------- */ 1/* ----------------------------------------------------------------------- */
2/* */ 2/* */
3/* [te_widget.h] Terminal Emulation Widget */ 3/* [te_widget.h] Terminal Emulation Widget */
4/* */ 4/* */
5/* ----------------------------------------------------------------------- */ 5/* ----------------------------------------------------------------------- */
6/* */ 6/* */
7/* Copyright (c) 1997,1998 by Lars Doelle <lars.doelle@on-line.de> */ 7/* Copyright (c) 1997,1998 by Lars Doelle <lars.doelle@on-line.de> */
8/* */ 8/* */
9/* This file is part of Konsole - an X terminal for KDE */ 9/* This file is part of Konsole - an X terminal for KDE */
10/* */ 10/* */
11/* ----------------------------------------------------------------------- */ 11/* ----------------------------------------------------------------------- */
12/* */ 12/* */
13/* Ported Konsole to Qt/Embedded */ 13/* Ported Konsole to Qt/Embedded */
14/* */ 14/* */
15/* Copyright (C) 2000 by John Ryland <jryland@trolltech.com> */ 15/* Copyright (C) 2000 by John Ryland <jryland@trolltech.com> */
16/* */ 16/* */
17/* -------------------------------------------------------------------------- */ 17/* -------------------------------------------------------------------------- */
18#ifndef TE_WIDGET_H 18#ifndef TE_WIDGET_H
19#define TE_WIDGET_H 19#define TE_WIDGET_H
20 20
21#include <qwidget.h> 21#include <qwidget.h>
22#include <qlabel.h> 22#include <qlabel.h>
23#include <qtimer.h> 23#include <qtimer.h>
24#include <qcolor.h> 24#include <qcolor.h>
25#include <qkeycode.h> 25#include <qkeycode.h>
26#include <qscrollbar.h> 26#include <qscrollbar.h>
27 27
28#include <qpopupmenu.h> 28#include <qpopupmenu.h>
29#include <qpushbutton.h> 29#include <qpushbutton.h>
30 30
31#include "TECommon.h" 31#include "TECommon.h"
32 32
33extern unsigned short vt100_graphics[32]; 33extern unsigned short vt100_graphics[32];
34 34
35 35
36 36
37 37
38 38
39class TESession; 39class TESession;
40 40
41// class Konsole; 41// class Konsole;
42 42
43class TEWidget : public QFrame 43class TEWidget : public QFrame
44// a widget representing attributed text 44// a widget representing attributed text
45{ 45{
46 Q_OBJECT 46 Q_OBJECT
47 47
48// friend class Konsole; 48// friend class Konsole;
49 49
50public: 50public:
51 51
52 TEWidget(QWidget *parent=0, const char *name=0); 52 TEWidget(QWidget *parent=0, const char *name=0);
53 virtual ~TEWidget(); 53 virtual ~TEWidget();
54 54
55public: 55public:
56 56
57 QColor getDefaultBackColor(); 57 QColor getDefaultBackColor();
58 QPushButton *cornerButton(); 58 QPushButton *cornerButton();
59 59
60 const ColorEntry* getColorTable() const; 60 const ColorEntry* getColorTable() const;
61 const ColorEntry* getdefaultColorTable() const; 61 const ColorEntry* getdefaultColorTable() const;
62 void setColorTable(const ColorEntry table[]); 62 void setColorTable(const ColorEntry table[]);
63 63
64 void setScrollbarLocation(int loc); 64 void setScrollbarLocation(int loc);
65 enum { SCRNONE=0, SCRLEFT=1, SCRRIGHT=2 }; 65 enum { SCRNONE=0, SCRLEFT=1, SCRRIGHT=2 };
66 66
67 void setScroll(int cursor, int lines); 67 void setScroll(int cursor, int lines);
68 void doScroll(int lines); 68 void doScroll(int lines);
69 69
70 void emitSelection(); 70 void emitSelection();
71 71
72 void setWrapAt(int columns); 72 void setWrapAt(int columns);
73 73
74public: 74public:
75 75
76 void setImage(const ca* const newimg, int lines, int columns); 76 void setImage(const ca* const newimg, int lines, int columns);
77 77
78 int Lines() { return lines; } 78 int Lines() { return lines; }
79 int Columns() { return columns; } 79 int Columns() { return columns; }
80 80
81 void calcGeometry(); 81 void calcGeometry();
82 void propagateSize(); 82 void propagateSize();
83 QSize calcSize(int cols, int lins) const; 83 QSize calcSize(int cols, int lins) const;
84 84
85 QSize sizeHint() const; 85 QSize sizeHint() const;
86 86
87public: 87public:
88 88
89 void Bell(); 89 void Bell();
90 void emitText(QString text); 90 void emitText(QString text);
91 void pasteClipboard(); 91 void pasteClipboard();
92 92
93signals: 93signals:
94 94
95 void keyPressedSignal(QKeyEvent *e); 95 void keyPressedSignal(QKeyEvent *e);
96 void mouseSignal(int cb, int cx, int cy); 96 void mouseSignal(int cb, int cx, int cy);
97 void changedImageSizeSignal(int lines, int columns); 97 void changedImageSizeSignal(int lines, int columns);
98 void changedHistoryCursor(int value); 98 void changedHistoryCursor(int value);
99 void configureRequest( TEWidget*, int state, int x, int y ); 99 void configureRequest( TEWidget*, int state, int x, int y );
100 100
101 void clearSelectionSignal(); 101 void clearSelectionSignal();
102 void beginSelectionSignal( const int x, const int y ); 102 void beginSelectionSignal( const int x, const int y );
103 void extendSelectionSignal( const int x, const int y ); 103 void extendSelectionSignal( const int x, const int y );
104 void endSelectionSignal(const BOOL preserve_line_breaks); 104 void endSelectionSignal(const BOOL preserve_line_breaks);
105 105
106 106
107protected: 107protected:
108 108
109 virtual void styleChange( QStyle& ); 109 virtual void styleChange( QStyle& );
110 110
111 bool eventFilter( QObject *, QEvent * ); 111 bool eventFilter( QObject *, QEvent * );
112 112
113 void drawAttrStr(QPainter &paint, QRect rect, 113 void drawAttrStr(QPainter &paint, QRect rect,
114 QString& str, ca attr, BOOL pm, BOOL clear); 114 QString& str, ca attr, BOOL pm, BOOL clear);
115 void paintEvent( QPaintEvent * ); 115 void paintEvent( QPaintEvent * );
116 116
117 void resizeEvent(QResizeEvent*); 117 void resizeEvent(QResizeEvent*);
118 118
119 void fontChange(const QFont &font); 119 void fontChange(const QFont &font);
120 void frameChanged(); 120 void frameChanged();
121 121
122 void mouseDoubleClickEvent(QMouseEvent* ev); 122 void mouseDoubleClickEvent(QMouseEvent* ev);
123 void mousePressEvent( QMouseEvent* ); 123 void mousePressEvent( QMouseEvent* );
124 void mouseReleaseEvent( QMouseEvent* ); 124 void mouseReleaseEvent( QMouseEvent* );
125 void mouseMoveEvent( QMouseEvent* ); 125 void mouseMoveEvent( QMouseEvent* );
126 126
127 void focusInEvent( QFocusEvent * ); 127 void focusInEvent( QFocusEvent * );
128 void focusOutEvent( QFocusEvent * ); 128 void focusOutEvent( QFocusEvent * );
129 bool focusNextPrevChild( bool next ); 129 bool focusNextPrevChild( bool next );
130 130
131#ifndef QT_NO_DRAGANDDROP 131#ifdef QT_NO_DRAGANDDROP_FOO_BAR_
132 // Dnd 132 // Dnd
133 void dragEnterEvent(QDragEnterEvent* event); 133 void dragEnterEvent(QDragEnterEvent* event);
134 void dropEvent(QDropEvent* event); 134 void dropEvent(QDropEvent* event);
135#endif 135#endif
136 136
137 virtual int charClass(char) const; 137 virtual int charClass(char) const;
138 138
139 void clearImage(); 139 void clearImage();
140 140
141public: 141public:
142 const QPixmap *backgroundPixmap(); 142 const QPixmap *backgroundPixmap();
143 143
144 void setSelection(const QString &t); 144 void setSelection(const QString &t);
145 145
146 virtual void setFont(const QFont &); 146 virtual void setFont(const QFont &);
147 void setVTFont(const QFont &); 147 void setVTFont(const QFont &);
148 QFont getVTFont(); 148 QFont getVTFont();
149 149
150 void setMouseMarks(bool on); 150 void setMouseMarks(bool on);
151 151
152public slots: 152public slots:
153 153
154 void onClearSelection(); 154 void onClearSelection();
155 155
156protected slots: 156protected slots:
157 157
158 void scrollChanged(int value); 158 void scrollChanged(int value);
159 void hscrollChanged(int value); 159 void hscrollChanged(int value);
160 void blinkEvent(); 160 void blinkEvent();
161 161
162private: 162private:
163 163
164 QChar (*fontMap)(QChar); // possible vt100 font extention 164 QChar (*fontMap)(QChar); // possible vt100 font extention
165 165
166 bool fixed_font; // has fixed pitch 166 bool fixed_font; // has fixed pitch
167 int font_h; // height 167 int font_h; // height
168 int font_w; // width 168 int font_w; // width
169 int font_a; // ascend 169 int font_a; // ascend
170 170
171 int blX; // actual offset (left) 171 int blX; // actual offset (left)
172 int brX; // actual offset (right) 172 int brX; // actual offset (right)
173 int bY; // actual offset 173 int bY; // actual offset
174 174
175 int lines; 175 int lines;
176 int columns; 176 int columns;
177 ca *image; // [lines][columns] 177 ca *image; // [lines][columns]
178 178
179 ColorEntry color_table[TABLE_COLORS]; 179 ColorEntry color_table[TABLE_COLORS];
180 180
181 BOOL resizing; 181 BOOL resizing;
182 bool mouse_marks; 182 bool mouse_marks;
183 183
184 void makeImage(); 184 void makeImage();
185 185
186 QPoint iPntSel; // initial selection point 186 QPoint iPntSel; // initial selection point
187 QPoint pntSel; // current selection point 187 QPoint pntSel; // current selection point
188 int actSel; // selection state 188 int actSel; // selection state
189 BOOL word_selection_mode; 189 BOOL word_selection_mode;
190 BOOL preserve_line_breaks; 190 BOOL preserve_line_breaks;
191 191
192 QPushButton *m_cornerButton; 192 QPushButton *m_cornerButton;
193 QClipboard* cb; 193 QClipboard* cb;
194 QScrollBar* scrollbar, *hscrollbar; 194 QScrollBar* scrollbar, *hscrollbar;
195 int scrollLoc; 195 int scrollLoc;
196 int hposition, vcolumns; 196 int hposition, vcolumns;
197 197
198//#define SCRNONE 0 198//#define SCRNONE 0
199//#define SCRLEFT 1 199//#define SCRLEFT 1
200//#define SCRRIGHT 2 200//#define SCRRIGHT 2
201 201
202 BOOL blinking; // hide text in paintEvent 202 BOOL blinking; // hide text in paintEvent
203 BOOL hasBlinker; // has characters to blink 203 BOOL hasBlinker; // has characters to blink
204 QTimer* blinkT; // active when hasBlinker 204 QTimer* blinkT; // active when hasBlinker
205 QPopupMenu* m_drop; 205 QPopupMenu* m_drop;
206 QString dropText; 206 QString dropText;
207 public: 207 public:
208 // current session in this widget 208 // current session in this widget
209 TESession *currentSession; 209 TESession *currentSession;
210private slots: 210private slots:
211 void drop_menu_activated(int item); 211 void drop_menu_activated(int item);
212}; 212};
213 213
214#endif // TE_WIDGET_H 214#endif // TE_WIDGET_H