summaryrefslogtreecommitdiff
authorhrw <hrw>2005-10-18 13:56:12 (UTC)
committer hrw <hrw>2005-10-18 13:56:12 (UTC)
commit0f25331618ea6cac8a59f2c2298a9e1684748b97 (patch) (unidiff)
treeeb734f970761359b4fd61166936b87550e2e1b2d
parent9f41cd10ef92daa889f86cb43793dc75de18e786 (diff)
downloadopie-0f25331618ea6cac8a59f2c2298a9e1684748b97.zip
opie-0f25331618ea6cac8a59f2c2298a9e1684748b97.tar.gz
opie-0f25331618ea6cac8a59f2c2298a9e1684748b97.tar.bz2
fixed bug #1647 - Opie-console doesn't respect scroll-bar on left side
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--ChangeLog1
-rw-r--r--noncore/apps/opie-console/TEWidget.cpp25
2 files changed, 16 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index 2922afd..24ae63c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,342 +1,343 @@
1 2005-??-??Opie 1.2.2 1 2005-??-??Opie 1.2.2
2 2
3 3
4 New Features 4 New Features
5 ------------ 5 ------------
6 * Appearance: Added configuration options to set smallIconSize, bigIconSize, useBigPixmaps (hrw) 6 * Appearance: Added configuration options to set smallIconSize, bigIconSize, useBigPixmaps (hrw)
7 7
8 Fixed Bugs 8 Fixed Bugs
9 ---------- 9 ----------
10 * #1695 - Date selector use too small fontsize on VGA screen (hrw) 10 * #1695 - Date selector use too small fontsize on VGA screen (hrw)
11 * #1686 - opie-console lack UI setting for switching scrollbar (hrw) 11 * #1686 - opie-console lack UI setting for switching scrollbar (hrw)
12 * #1647 - Opie-console doesn't respect scroll-bar on left side (hrw)
12 * #1624 - Button settngs changes are applied only after restart (hrw) 13 * #1624 - Button settngs changes are applied only after restart (hrw)
13 * #1492 - Backup and Restore does not show list of backups to restore on start (hrw) 14 * #1492 - Backup and Restore does not show list of backups to restore on start (hrw)
14 * n.a. - remove hardcoded font size from wellenreiter (hrw) 15 * n.a. - remove hardcoded font size from wellenreiter (hrw)
15 * n.a. - added patch to build QT/E 2.3.10 with gc 4.x.x (hrw) 16 * n.a. - added patch to build QT/E 2.3.10 with gc 4.x.x (hrw)
16 17
17 2005-09-11Opie 1.2.1 18 2005-09-11Opie 1.2.1
18 19
19 20
20 New Features 21 New Features
21 ------------ 22 ------------
22 * OpieStumbler: Scans WiFi networks using the wireless extension scanning (skyhusker) 23 * OpieStumbler: Scans WiFi networks using the wireless extension scanning (skyhusker)
23 * Opie-Reader: Support for document formats ArriereGo and Reb, add flite output (tim,pohly) 24 * Opie-Reader: Support for document formats ArriereGo and Reb, add flite output (tim,pohly)
24 * Opie-Networksettings: Add support for wlan-ng devices and improve WEP handling (Dirk Opfer) 25 * Opie-Networksettings: Add support for wlan-ng devices and improve WEP handling (Dirk Opfer)
25 * Wellenreiter: Remove Joining networks - use OpieStumbler for that (mickeyl) 26 * Wellenreiter: Remove Joining networks - use OpieStumbler for that (mickeyl)
26 * Opie-Mobilemsg has gone unsupported - it never really worked and there will be a replacement (mickeyl) 27 * Opie-Mobilemsg has gone unsupported - it never really worked and there will be a replacement (mickeyl)
27 * Opie-Tabmanager has gone unsupported - it barely works and there is not much of a use of it anyway (mickeyl) 28 * Opie-Tabmanager has gone unsupported - it barely works and there is not much of a use of it anyway (mickeyl)
28 * Checkbook: Added configuration option to use smaller font for checkbook transaction tab (hrw) 29 * Checkbook: Added configuration option to use smaller font for checkbook transaction tab (hrw)
29 * ZSafe: Made UI conform to Opie standards (drw) 30 * ZSafe: Made UI conform to Opie standards (drw)
30 * Today Addressbook plugin: Fixed configuration to show/not show birthdays, use checkboxes for selection (hrw) 31 * Today Addressbook plugin: Fixed configuration to show/not show birthdays, use checkboxes for selection (hrw)
31 * Opie-Console: Read initial fixed font configuration from qpe.conf (mickeyl) 32 * Opie-Console: Read initial fixed font configuration from qpe.conf (mickeyl)
32 * Opie-PcmciaApplet: Configure insert/resume actions and bind unsupported cards (mickeyl) 33 * Opie-PcmciaApplet: Configure insert/resume actions and bind unsupported cards (mickeyl)
33 * SysInfo: Remove CPU tab and add Devices tab instead (mickeyl) 34 * SysInfo: Remove CPU tab and add Devices tab instead (mickeyl)
34 * Opie-smb: Added Opie front end for Samba (ljp) 35 * Opie-smb: Added Opie front end for Samba (ljp)
35 * Opie-Bluetooth: Replace obex send implementation and patch libopieobex and the bluetoothapplet (Michael Haynie) 36 * Opie-Bluetooth: Replace obex send implementation and patch libopieobex and the bluetoothapplet (Michael Haynie)
36 * Opieplayer: rudimentary podcast support (ljp) 37 * Opieplayer: rudimentary podcast support (ljp)
37 38
38 Fixed Bugs 39 Fixed Bugs
39 ---------- 40 ----------
40 * #1377 - Suspend Powermanagement when switched to another VT (mickeyl) 41 * #1377 - Suspend Powermanagement when switched to another VT (mickeyl)
41 - We actually suspend the complete Opie now in that case. 42 - We actually suspend the complete Opie now in that case.
42 * #1384 - Battery status updated improperly when charging (skyhusker) 43 * #1384 - Battery status updated improperly when charging (skyhusker)
43 * #1476 - Wrong order of application entries in the O-menu (skyhusker) 44 * #1476 - Wrong order of application entries in the O-menu (skyhusker)
44 * #1514 - Remove usage of cardmon/pcmcia picture in applications. pcmcia is now an inline picture (mickeyl) 45 * #1514 - Remove usage of cardmon/pcmcia picture in applications. pcmcia is now an inline picture (mickeyl)
45 * #1535- Missing line break and unnecessary location shown with Today-Calendar plugin (deller) 46 * #1535- Missing line break and unnecessary location shown with Today-Calendar plugin (deller)
46 * #1543 - Time Settings: "predict" tab is displayed twice after reopen (hrw) 47 * #1543 - Time Settings: "predict" tab is displayed twice after reopen (hrw)
47 * #1546 - Battery applet popup is not always large enough to show jacket remaining info (skyhusker) 48 * #1546 - Battery applet popup is not always large enough to show jacket remaining info (skyhusker)
48 * #1557 - Light&Power-Settings don't store warning intervall and warning levels (skyhusker) 49 * #1557 - Light&Power-Settings don't store warning intervall and warning levels (skyhusker)
49 * #1565 - crash-fix in odevice.cpp while scanning the distribution table (deller) 50 * #1565 - crash-fix in odevice.cpp while scanning the distribution table (deller)
50 * #1614 - Make Opie-console start in $HOME instead of / (skyhusker) 51 * #1614 - Make Opie-console start in $HOME instead of / (skyhusker)
51 * #1635 - opie-today, datebook-plugin does not show notes (skyhusker) 52 * #1635 - opie-today, datebook-plugin does not show notes (skyhusker)
52 * #1665 - Opie-IRC displays the host prepended to the message when peer is using and ipv6 address (skyhusker) 53 * #1665 - Opie-IRC displays the host prepended to the message when peer is using and ipv6 address (skyhusker)
53 * #1666 - Opie-IRC does not allow to add !channels in config asautojoin ones (skyhusker) 54 * #1666 - Opie-IRC does not allow to add !channels in config asautojoin ones (skyhusker)
54 * #1667 - Opie-IRC does not show messages from !channel (skyhusker) 55 * #1667 - Opie-IRC does not show messages from !channel (skyhusker)
55 * #1679 - Security PIN plugin is QVGA sized (hrw) 56 * #1679 - Security PIN plugin is QVGA sized (hrw)
56 * #1682 - Properly resize tab control in OTabWidget (drw) 57 * #1682 - Properly resize tab control in OTabWidget (drw)
57 * n.a. - always show volume and wireless applet popups inside visible screen (deller) 58 * n.a. - always show volume and wireless applet popups inside visible screen (deller)
58 * n.a. - scale O-Menu-Applets appropriately (mickeyl) 59 * n.a. - scale O-Menu-Applets appropriately (mickeyl)
59 * n.a. - libopienet: fix bugs in wireless scanning and setting SSID (skyhusker) 60 * n.a. - libopienet: fix bugs in wireless scanning and setting SSID (skyhusker)
60 * n.a. - Wellenreiter: relax WE version matching test a bit (mickeyl) 61 * n.a. - Wellenreiter: relax WE version matching test a bit (mickeyl)
61 * n.a. - scale BluezApplet appropriately and use larger icons (mickeyl) 62 * n.a. - scale BluezApplet appropriately and use larger icons (mickeyl)
62 * n.a. - memoryapplet: fix crash in memoryapplet on kernels without swap support (seneca cunningham) 63 * n.a. - memoryapplet: fix crash in memoryapplet on kernels without swap support (seneca cunningham)
63 * n.a. - networksettings: ignore hostap control interfaces wifi* (mickeyl) 64 * n.a. - networksettings: ignore hostap control interfaces wifi* (mickeyl)
64 * n.a. - Today Addressbook plugin fix configuration to show/not show birthdays, use checkboxes for selection (hrw) 65 * n.a. - Today Addressbook plugin fix configuration to show/not show birthdays, use checkboxes for selection (hrw)
65 * n.a. - remove hardcoded font size from netsystemtime (hrw) 66 * n.a. - remove hardcoded font size from netsystemtime (hrw)
66 * n.a. - remove hardcoded font size from checkbook graphs (hrw) 67 * n.a. - remove hardcoded font size from checkbook graphs (hrw)
67 * n.a. - Dagger - fixes for Sword 1.5.8, morph tag x-refs, closing last tab crash (drw) 68 * n.a. - Dagger - fixes for Sword 1.5.8, morph tag x-refs, closing last tab crash (drw)
68 69
69 70
70 Internal 71 Internal
71 -------- 72 --------
72 * Make BluezApplet use OTaskbarApplet (mickeyl) 73 * Make BluezApplet use OTaskbarApplet (mickeyl)
73 * libopiecore: rewrite OFileNotification to use the Linux 2.6 inotify interface (mickeyl) 74 * libopiecore: rewrite OFileNotification to use the Linux 2.6 inotify interface (mickeyl)
74 * libopiecore: add ODirNotification - recursive directory notifications (mickeyl) 75 * libopiecore: add ODirNotification - recursive directory notifications (mickeyl)
75 * libopienet: Skip hostap control interfaces 'wifi' and improve robustness in ONetworkInterface (mickeyl) 76 * libopienet: Skip hostap control interfaces 'wifi' and improve robustness in ONetworkInterface (mickeyl)
76 * libopieui: Remove OVersatileView and OVersatileViewItem (mickeyl) 77 * libopieui: Remove OVersatileView and OVersatileViewItem (mickeyl)
77 * libopienet: Miscellaneous API cleanups (mickeyl) 78 * libopienet: Miscellaneous API cleanups (mickeyl)
78 * libopiecore: Add linux pcmcia system abstraction classes (mickeyl) 79 * libopiecore: Add linux pcmcia system abstraction classes (mickeyl)
79 * libopiecore: ODevice now knows the default gfx driver to use (mteira,mickeyl) 80 * libopiecore: ODevice now knows the default gfx driver to use (mteira,mickeyl)
80 * libopiecore: Add support for the Sharp SL-C3100 "Borzoi" (mickeyl) 81 * libopiecore: Add support for the Sharp SL-C3100 "Borzoi" (mickeyl)
81 * libopiecore: Add support for the new Linux Inputsystem Switches type [necessary for auto rotation in 2.6.13] (mickeyl) 82 * libopiecore: Add support for the new Linux Inputsystem Switches type [necessary for auto rotation in 2.6.13] (mickeyl)
82 * Remove assumptions about default gfx driver ("Transformed") all over the place (mteira,mickeyl) 83 * Remove assumptions about default gfx driver ("Transformed") all over the place (mteira,mickeyl)
83 * Fix / Optimize number of scanned directories (ljp) 84 * Fix / Optimize number of scanned directories (ljp)
84 * Use five point mouse calibration to make calibrated mouse drivers work on newer Zaurii (rp,mickeyl) 85 * Use five point mouse calibration to make calibrated mouse drivers work on newer Zaurii (rp,mickeyl)
85 86
86 2005-03-25Opie 1.2.0 87 2005-03-25Opie 1.2.0
87 88
88 Fixed Bugs 89 Fixed Bugs
89 ---------- 90 ----------
90 * #1613 - AdvancedFM - scale toolbar icons appropriately (drw) 91 * #1613 - AdvancedFM - scale toolbar icons appropriately (drw)
91 * #1620 - OFileSelector - show the button on press and not on press on hold (alwin) 92 * #1620 - OFileSelector - show the button on press and not on press on hold (alwin)
92 * #1473 - Opie-Eye - Same as #1620 but we lack a common FileSystem Button class (zecke) 93 * #1473 - Opie-Eye - Same as #1620 but we lack a common FileSystem Button class (zecke)
93 * n.a. - PackageManager - fix bug where messages show up multiple times in install dialog (drw) 94 * n.a. - PackageManager - fix bug where messages show up multiple times in install dialog (drw)
94 * n.a.- make qpeglobal.h include qglobal.h (zecke) 95 * n.a.- make qpeglobal.h include qglobal.h (zecke)
95 96
96 2005-03-20Opie 1.2.0-rc1 97 2005-03-20Opie 1.2.0-rc1
97 98
98 99
99 New Features 100 New Features
100 ------------ 101 ------------
101 * Launcher: Support a static background pixmap (mickeyl) 102 * Launcher: Support a static background pixmap (mickeyl)
102 * LauncherSettings: Choose whether to have a static background pixmap (mickeyl) 103 * LauncherSettings: Choose whether to have a static background pixmap (mickeyl)
103 * PackageManager supports the 'lists_dir' ipkg configuration option (drw) 104 * PackageManager supports the 'lists_dir' ipkg configuration option (drw)
104 * Added hi-res inline images for large resolution devices (drw) 105 * Added hi-res inline images for large resolution devices (drw)
105 * Improved launcher icons for consistency (ar) 106 * Improved launcher icons for consistency (ar)
106 * Datebook: Added plugin system to datebook so holidays and birthdays from contacts may displayed in datebook (alwin) 107 * Datebook: Added plugin system to datebook so holidays and birthdays from contacts may displayed in datebook (alwin)
107 108
108 Fixed Bugs 109 Fixed Bugs
109 ---------- 110 ----------
110 * #1236 - VCards contained empty home and work address entries causing Palms to crash (eilers) 111 * #1236 - VCards contained empty home and work address entries causing Palms to crash (eilers)
111 * #1412 - Launcher Settings - fixed default settings for background in Edit tab dialog (drw) 112 * #1412 - Launcher Settings - fixed default settings for background in Edit tab dialog (drw)
112 * #1472 - Opie textedit now check for unsaved changes on ESC key (ljp) 113 * #1472 - Opie textedit now check for unsaved changes on ESC key (ljp)
113 * #1474 - Implement GUI for Scrollbars on the Left in Appearance (zecke) 114 * #1474 - Implement GUI for Scrollbars on the Left in Appearance (zecke)
114 * #1482 - Fix double '/' in paths (zecke) 115 * #1482 - Fix double '/' in paths (zecke)
115 * #1536 - Autosave of custom locations in opie backup (ar) 116 * #1536 - Autosave of custom locations in opie backup (ar)
116 * #1539 - Fixed displaying too long path in the delete dialog in opie-eye (zecke) 117 * #1539 - Fixed displaying too long path in the delete dialog in opie-eye (zecke)
117 * #1540 - Implemented deletion of DocLnks in opie-eye (zecke) 118 * #1540 - Implemented deletion of DocLnks in opie-eye (zecke)
118 * #1542 - Fixed Todo crash when priority < 1 or > 5 (drw) 119 * #1542 - Fixed Todo crash when priority < 1 or > 5 (drw)
119 * #1550 - Browse for alarm sound start in QPEDIR/sounds/ (zecke) 120 * #1550 - Browse for alarm sound start in QPEDIR/sounds/ (zecke)
120 * #1554 - Fixed Opie-Console name in .desktop file (mickeyl) 121 * #1554 - Fixed Opie-Console name in .desktop file (mickeyl)
121 * #1556 - Start to look for sound files in /opt/QtPalmtop/sounds (zecke) 122 * #1556 - Start to look for sound files in /opt/QtPalmtop/sounds (zecke)
122 * #1558 - Fixed opie-login breaking opie startup (mickeyl) 123 * #1558 - Fixed opie-login breaking opie startup (mickeyl)
123 * #1560 - Fixed Opie-Console picking up the wrong shell (bluelightning) 124 * #1560 - Fixed Opie-Console picking up the wrong shell (bluelightning)
124 * #1570 - Confirmation needed befor Restore a backup and overwrite local data (ar) 125 * #1570 - Confirmation needed befor Restore a backup and overwrite local data (ar)
125 * #1591 - Addressbook sortorder changed by clicking on column 0 (eilers) 126 * #1591 - Addressbook sortorder changed by clicking on column 0 (eilers)
126 * #1599 - Security - change recommendation for opie-multiauth to opie-securityplugin (gints) 127 * #1599 - Security - change recommendation for opie-multiauth to opie-securityplugin (gints)
127 * #1604 - Checkbook crashed on startup (drw) 128 * #1604 - Checkbook crashed on startup (drw)
128 * #1608 - Addressbook crashed after search, which may caused by not initialzed member variable (eilers) 129 * #1608 - Addressbook crashed after search, which may caused by not initialzed member variable (eilers)
129 * #1608 - QueryByExampe-Datediff on SQL database did not worked properly (eilers) 130 * #1608 - QueryByExampe-Datediff on SQL database did not worked properly (eilers)
130 * n.a. - Netsystemtime - fixed UI to prevent error dialog from displaying when it shouldn't, get rid of some compiler warnings (drw) 131 * n.a. - Netsystemtime - fixed UI to prevent error dialog from displaying when it shouldn't, get rid of some compiler warnings (drw)
131 * n.a. - PackageManager - fixed where last package in status file was not shown as installed when it should be (drw) 132 * n.a. - PackageManager - fixed where last package in status file was not shown as installed when it should be (drw)
132 * n.a. - PackageManager - fixed bug where lists_dir was not being honored at startup (drw) 133 * n.a. - PackageManager - fixed bug where lists_dir was not being honored at startup (drw)
133 * n.a. - PackageManager - provided default value for lists_dir when none is entered in configuration dialog (drw) 134 * n.a. - PackageManager - provided default value for lists_dir when none is entered in configuration dialog (drw)
134 * n.a. - OTabWidget - fixed scroll buttons, fix display position of tabs (drw) 135 * n.a. - OTabWidget - fixed scroll buttons, fix display position of tabs (drw)
135 * n.a. - AddressBook - fixed sorting by 'File As' name (drw) 136 * n.a. - AddressBook - fixed sorting by 'File As' name (drw)
136 * n.a. - AddressBook - fixed category handling for 'All' and 'Unfiled' (eilers) 137 * n.a. - AddressBook - fixed category handling for 'All' and 'Unfiled' (eilers)
137 * n.a. - AddressBook - fixed letter picker record selection and sort records afterwards (drw) 138 * n.a. - AddressBook - fixed letter picker record selection and sort records afterwards (drw)
138 139
139 Internal 140 Internal
140 -------- 141 --------
141 * Worked around bug in Qt/Embedded 2.3.10: qt_version() returns 231 (mickeyl) 142 * Worked around bug in Qt/Embedded 2.3.10: qt_version() returns 231 (mickeyl)
142 * Killed the need for weak symbols in QtE (zecke) 143 * Killed the need for weak symbols in QtE (zecke)
143 * Added optional building libqpe without inline images (mickeyl) 144 * Added optional building libqpe without inline images (mickeyl)
144 * OColorButton - fixed so does not emit a colorSelected signal inside of resizeEvent (drw) 145 * OColorButton - fixed so does not emit a colorSelected signal inside of resizeEvent (drw)
145 146
146 2005-02-03Opie 1.1.9 147 2005-02-03Opie 1.1.9
147 148
148 New Features 149 New Features
149 ------------ 150 ------------
150 * Number of icon columns in Launcher is customizable through Launcher.conf (hrw,zecke,mickeyl) 151 * Number of icon columns in Launcher is customizable through Launcher.conf (hrw,zecke,mickeyl)
151 * Number of icon columns in Launcher is customizable through LauncherSettings (mickeyl) 152 * Number of icon columns in Launcher is customizable through LauncherSettings (mickeyl)
152 * Usability enhancements in OpieIRC (skyhusker) 153 * Usability enhancements in OpieIRC (skyhusker)
153 154
154 Fixed Bugs 155 Fixed Bugs
155 ---------- 156 ----------
156 * #1501 - Fixed bug in todo sql backend (eilers) 157 * #1501 - Fixed bug in todo sql backend (eilers)
157 * #1505 - Added more Swap sizes in memoryapplet (mickeyl) 158 * #1505 - Added more Swap sizes in memoryapplet (mickeyl)
158 * #1525 - Hopefully fixed double alarms and not removing alarms set with the Clock application (zecke) 159 * #1525 - Hopefully fixed double alarms and not removing alarms set with the Clock application (zecke)
159 * #1533 - Security Owner Dialog (shown in case of unsuccessfull authentiacation) wasn't able to display information in non latin1 encoding (zecke) 160 * #1533 - Security Owner Dialog (shown in case of unsuccessfull authentiacation) wasn't able to display information in non latin1 encoding (zecke)
160 * n.a. - Removed hard coded font sizes in a couple of inputmethods (mickeyl) 161 * n.a. - Removed hard coded font sizes in a couple of inputmethods (mickeyl)
161 * n.a. - Removed MediumDlg appearing prior to FirstUsage wizard (i.e. calibration) (mickeyl) 162 * n.a. - Removed MediumDlg appearing prior to FirstUsage wizard (i.e. calibration) (mickeyl)
162 * n.a. - Fixed numerous buglets in OpieIRC (skyhusker) 163 * n.a. - Fixed numerous buglets in OpieIRC (skyhusker)
163 164
164 Internal 165 Internal
165 -------- 166 --------
166 * Added the Qtopia 1.7 SDK macros for quick-apps to easa compilation of 3rd party apps against our headers (mickeyl) 167 * Added the Qtopia 1.7 SDK macros for quick-apps to easa compilation of 3rd party apps against our headers (mickeyl)
167 * You can now use the Opie build system in combination with a OpenEmbedded staging area which makes a nice cross development environment (mickeyl) 168 * You can now use the Opie build system in combination with a OpenEmbedded staging area which makes a nice cross development environment (mickeyl)
168 * Made Opie compilable with Qt/Embedded 2.3.10 (ar) 169 * Made Opie compilable with Qt/Embedded 2.3.10 (ar)
169 * Changed Launcher to get default orientation from ODevice w/ QWS_DISPLAY overriding (mickeyl) 170 * Changed Launcher to get default orientation from ODevice w/ QWS_DISPLAY overriding (mickeyl)
170 * Build tree cleanups (mickeyl) 171 * Build tree cleanups (mickeyl)
171 172
172 2004-11-26Opie 1.1.8 173 2004-11-26Opie 1.1.8
173 174
174 New Features 175 New Features
175 ------------ 176 ------------
176 * PackageManager supports installation of local ipkg files (drw) 177 * PackageManager supports installation of local ipkg files (drw)
177 * PackageManager supports linking of applications to root (drw) 178 * PackageManager supports linking of applications to root (drw)
178 * PackageManager supports src/gz feeds (drw,wimpie) 179 * PackageManager supports src/gz feeds (drw,wimpie)
179 * Added a syslog information tab to sysinfo (mickeyl) 180 * Added a syslog information tab to sysinfo (mickeyl)
180 * Added new, more consistent, PIM icons + a GIMP teplate (ar) 181 * Added new, more consistent, PIM icons + a GIMP teplate (ar)
181 182
182 Fixed Bugs 183 Fixed Bugs
183 ---------- 184 ----------
184 * #1017 - Tetrix doesn't display correctly for high resolution screens (drw) 185 * #1017 - Tetrix doesn't display correctly for high resolution screens (drw)
185 * #1269 - VCards were imported into personal area if it was activated (eilers) 186 * #1269 - VCards were imported into personal area if it was activated (eilers)
186 * #1464 - Packagemanager dont set active filter after install a package (drw) 187 * #1464 - Packagemanager dont set active filter after install a package (drw)
187 * #1479 - Improved VCard-Parser to import VCards created by Evolution 2 and Apple Addressbook (eilers) 188 * #1479 - Improved VCard-Parser to import VCards created by Evolution 2 and Apple Addressbook (eilers)
188 * #1493 - Fixed one column layout bug of the launcher (hrw) 189 * #1493 - Fixed one column layout bug of the launcher (hrw)
189 * n.a. - PackageManager - (Minor UI tweak) in filter dialog, when option is enabled, set focus to widget that corresponds to that option (drw) 190 * n.a. - PackageManager - (Minor UI tweak) in filter dialog, when option is enabled, set focus to widget that corresponds to that option (drw)
190 * n.a. - PackageManager - (Minor UI tweak) fix double entry in source feed configuration when adding a new feed (drw) 191 * n.a. - PackageManager - (Minor UI tweak) fix double entry in source feed configuration when adding a new feed (drw)
191 * n.a. - Battery Applet - fix sizing of battery info popup (drw,mickeyl) 192 * n.a. - Battery Applet - fix sizing of battery info popup (drw,mickeyl)
192 193
193 Internal 194 Internal
194 -------- 195 --------
195 * Moved libopie1 to unsupported (mickeyl) 196 * Moved libopie1 to unsupported (mickeyl)
196 * Implemented generic queryByExample() with incremental searching. A lot of internal changes of the Pim2-library (eilers) 197 * Implemented generic queryByExample() with incremental searching. A lot of internal changes of the Pim2-library (eilers)
197 * Added fast and full featured and incremental sorted() for SQL addressbook backend (eilers) 198 * Added fast and full featured and incremental sorted() for SQL addressbook backend (eilers)
198 199
199 2004-11-14Opie 1.1.7 200 2004-11-14Opie 1.1.7
200 201
201 New Features 202 New Features
202 ------------ 203 ------------
203 * libOpieDB now uses SQLite V3 instead V2. Remember to upgrade your database files! (eilers) 204 * libOpieDB now uses SQLite V3 instead V2. Remember to upgrade your database files! (eilers)
204 * Backup now uses the busy indicator when backing up and restore (ar) 205 * Backup now uses the busy indicator when backing up and restore (ar)
205 * OpiePlayer2 gained adding of Directories to the playlist (zecke) 206 * OpiePlayer2 gained adding of Directories to the playlist (zecke)
206 * OpiePlayer2 better error handling (zecke) 207 * OpiePlayer2 better error handling (zecke)
207 * OpiePlayer2 progress indication while streaming (zecke) 208 * OpiePlayer2 progress indication while streaming (zecke)
208 * OpiePlayer2 ported to use libxine 1.0.0-rc6a (brad,zecke) 209 * OpiePlayer2 ported to use libxine 1.0.0-rc6a (brad,zecke)
209 * Ported brightnessapplet from Qtopia 1.7 (mickeyl) 210 * Ported brightnessapplet from Qtopia 1.7 (mickeyl)
210 * Opie-Eye got a Digital Camera File Backend (alwin,zecke) 211 * Opie-Eye got a Digital Camera File Backend (alwin,zecke)
211 * Support for Tuxpad1 of Tradesquare.NL (mickeyl,zecke) 212 * Support for Tuxpad1 of Tradesquare.NL (mickeyl,zecke)
212 * Opie-Console use Custom Font and Size in a Profile (harlekin) 213 * Opie-Console use Custom Font and Size in a Profile (harlekin)
213 * Opie-Console transparently log the Output and Input to a file (harlekin) 214 * Opie-Console transparently log the Output and Input to a file (harlekin)
214 * Added new O-menu icon to lock the PDA immediately: opie-lockapplet (clem) 215 * Added new O-menu icon to lock the PDA immediately: opie-lockapplet (clem)
215 * Opie-Security now hides the plugin-based authentication tabs if no auth. plugin package is installed (clem) 216 * Opie-Security now hides the plugin-based authentication tabs if no auth. plugin package is installed (clem)
216 * Opie-Security gained a 'test authentication' button (clem) 217 * Opie-Security gained a 'test authentication' button (clem)
217 * Opie-Eye got a more unique layout (menubar), a slideshow, user can setup some defaults 218 * Opie-Eye got a more unique layout (menubar), a slideshow, user can setup some defaults
218 * Opie-Mail improve the handling of POP mail boxes (alwin) 219 * Opie-Mail improve the handling of POP mail boxes (alwin)
219 * Both Opie-Eye and Opie-Mail were greatly improved due the hard work of Rajko Albrecht(alwin) 220 * Both Opie-Eye and Opie-Mail were greatly improved due the hard work of Rajko Albrecht(alwin)
220 * Opie IRC - backports of the 'NeIRC fork' (zecke) 221 * Opie IRC - backports of the 'NeIRC fork' (zecke)
221 222
222 Fixed Bugs 223 Fixed Bugs
223 ---------- 224 ----------
224 * #501 - Pickboard is able to show 'Umlaute' (TT,zecke) 225 * #501 - Pickboard is able to show 'Umlaute' (TT,zecke)
225 * #608 - Make Opie usable for left handed users (zecke) 226 * #608 - Make Opie usable for left handed users (zecke)
226 * #957 - Import of VCards/VTodos/VEvents with BASE64 encoding (ljp,zecke) 227 * #957 - Import of VCards/VTodos/VEvents with BASE64 encoding (ljp,zecke)
227 * #1245 - Opie-Go 'paused' (zecke) 228 * #1245 - Opie-Go 'paused' (zecke)
228 * #1358 - DocTab didn't show any MimeTypes (was fixed earlier) (zecke) 229 * #1358 - DocTab didn't show any MimeTypes (was fixed earlier) (zecke)
229 * #1380 - QDateBookAccess::remove() doesn't remove entries (eilers, zecke) 230 * #1380 - QDateBookAccess::remove() doesn't remove entries (eilers, zecke)
230 * #1395 - Build VNC Backend with gcc3.4 231 * #1395 - Build VNC Backend with gcc3.4
231 * #1440 - The icon of opie-mobilemsg is missing (CoreDump) 232 * #1440 - The icon of opie-mobilemsg is missing (CoreDump)
232 * #1426 - Add missing opie-bartender Icon (CoreDump) 233 * #1426 - Add missing opie-bartender Icon (CoreDump)
233 * #1445 - Opie-Sheet Has No Icon (CoreDump) 234 * #1445 - Opie-Sheet Has No Icon (CoreDump)
234 * #1448 - Brightness Applet added (mickeyl) 235 * #1448 - Brightness Applet added (mickeyl)
235 * #1450 - ZSame didn't clear the bonus item after winning a game (zecke) 236 * #1450 - ZSame didn't clear the bonus item after winning a game (zecke)
236 * #1482 - Fix OFileSelector to be able to sort by size (zecke) 237 * #1482 - Fix OFileSelector to be able to sort by size (zecke)
237 * n.a. - Opie-mail: fixed some crasher, some layout-problems 238 * n.a. - Opie-mail: fixed some crasher, some layout-problems
238 * n.a. - Converted applications to not hardcode /opt/QtPalmtop but to use QPEApplication::qpeDir (zecke) 239 * n.a. - Converted applications to not hardcode /opt/QtPalmtop but to use QPEApplication::qpeDir (zecke)
239 * n.a. - Converted usage of qpeDir() not to include a '/' as first charachter of the string (zecke) 240 * n.a. - Converted usage of qpeDir() not to include a '/' as first charachter of the string (zecke)
240 * n.a. - Build system: Enable distcc and ccache when crosscompiling too, and use them everywhere we can (clem) 241 * n.a. - Build system: Enable distcc and ccache when crosscompiling too, and use them everywhere we can (clem)
241 * n.a. - Build system: Fix deps in several config.in (and fix scripts/deps.pl too) to stop breaking builds, especially with make -j highNumber (clem) 242 * n.a. - Build system: Fix deps in several config.in (and fix scripts/deps.pl too) to stop breaking builds, especially with make -j highNumber (clem)
242 * n.a. - Removed hardcoded icon size in a couple of applets (mickeyl) 243 * n.a. - Removed hardcoded icon size in a couple of applets (mickeyl)
243 244
244 Internal 245 Internal
245 -------- 246 --------
246 * Opie-Qashmoney has been moved to unsupported (mickeyl) 247 * Opie-Qashmoney has been moved to unsupported (mickeyl)
247 * Opie-Ubrowser has been moved to unsupported (mickeyl) 248 * Opie-Ubrowser has been moved to unsupported (mickeyl)
248 249
249 2004-09-17Opie 1.1.6 250 2004-09-17Opie 1.1.6
250 251
251 New Features 252 New Features
252 ------------ 253 ------------
253 * Fifteen gained configurable number of items (zecke) 254 * Fifteen gained configurable number of items (zecke)
254 * Fifteen can have custom background images (zecke) 255 * Fifteen can have custom background images (zecke)
255 * Added daemonizing capabilities to QWS Server [via Qt/Embedded] (mickeyl) 256 * Added daemonizing capabilities to QWS Server [via Qt/Embedded] (mickeyl)
256 * Integrated the new security framework into libopie2 (zecke,clem) 257 * Integrated the new security framework into libopie2 (zecke,clem)
257 * Converted the launcher to use the new security framework (zecke) 258 * Converted the launcher to use the new security framework (zecke)
258 * Backup can now handle custom locations for backup and restore (ar) 259 * Backup can now handle custom locations for backup and restore (ar)
259 * Implemented right-on-hold feedback (wimpie,zecke) 260 * Implemented right-on-hold feedback (wimpie,zecke)
260 * Lots of new features in opie-reader (tim,pohly) 261 * Lots of new features in opie-reader (tim,pohly)
261 * Build system cleanups (schurig) 262 * Build system cleanups (schurig)
262 263
263 Fixed Bugs 264 Fixed Bugs
264 -------- 265 --------
265 * #1005 - Fixed backup to CompactFlash (ar) 266 * #1005 - Fixed backup to CompactFlash (ar)
266 * #1167 - Fixed Opie write crashing on more text than one page (ar) 267 * #1167 - Fixed Opie write crashing on more text than one page (ar)
267 * #1225 - Fixed repeated light flashing on Zaurus with keyz (mickeyl) 268 * #1225 - Fixed repeated light flashing on Zaurus with keyz (mickeyl)
268 * #1359 - Fixed bookmarks in Gutenbrowser (ljp) 269 * #1359 - Fixed bookmarks in Gutenbrowser (ljp)
269 * #1361 - Fixed auto upercase in Opie-Addressbook (eilers) 270 * #1361 - Fixed auto upercase in Opie-Addressbook (eilers)
270 * #1370 - Pimconverter now reacts on cancel key (eilers) 271 * #1370 - Pimconverter now reacts on cancel key (eilers)
271 * #1376 - Bring back the capslock/numlock display (zecke) 272 * #1376 - Bring back the capslock/numlock display (zecke)
272 * #1383 - Language settings now warns about losing open apps (Markus Litz) 273 * #1383 - Language settings now warns about losing open apps (Markus Litz)
273 * #1393 - Fixed line wrap issues in opie-console for the default profile (mickeyl) 274 * #1393 - Fixed line wrap issues in opie-console for the default profile (mickeyl)
274 * #1394 - Fixed oversized headline in opie-login (coredump) 275 * #1394 - Fixed oversized headline in opie-login (coredump)
275 * #1396 - Opie-console captures the escape key and vim is working (zecke) 276 * #1396 - Opie-console captures the escape key and vim is working (zecke)
276 * #1401 - Scrollbar is now only visible if necessary in DocTab (mickeyl) 277 * #1401 - Scrollbar is now only visible if necessary in DocTab (mickeyl)
277 278
278 2004-07-06Opie 1.1.4 279 2004-07-06Opie 1.1.4
279 280
280 New Features 281 New Features
281 ------------ 282 ------------
282 * Added four themes courtesy Robert Griebl (http://www.softforge.de/zstyle) 283 * Added four themes courtesy Robert Griebl (http://www.softforge.de/zstyle)
283 * Added Conversion tool for pim-data (eilers) 284 * Added Conversion tool for pim-data (eilers)
284 * Introduced new OPimAccessFactory and OBackendFactory which simplyfies database access (eilers) 285 * Introduced new OPimAccessFactory and OBackendFactory which simplyfies database access (eilers)
285 * Modified the PIM API for providing generic use of OPimRecords (eilers) 286 * Modified the PIM API for providing generic use of OPimRecords (eilers)
286 * Clicking on the application symbol now iterates over the application's top level widgets if already raised (zecke) 287 * Clicking on the application symbol now iterates over the application's top level widgets if already raised (zecke)
287 288
288 Fixed Bugs 289 Fixed Bugs
289 -------- 290 --------
290 * #1068 - Country Drop Down Box Off Screen 291 * #1068 - Country Drop Down Box Off Screen
291 * #1291 - Opie tinykate does not open .desktop files (ar) 292 * #1291 - Opie tinykate does not open .desktop files (ar)
292 * #1291 - Opie sheet not saving correctly (ar) 293 * #1291 - Opie sheet not saving correctly (ar)
293 * #1294 - Opie does not know about British Summer Time 294 * #1294 - Opie does not know about British Summer Time
294 * #1314 - Drawpad initialization (mickeyl) 295 * #1314 - Drawpad initialization (mickeyl)
295 * #1317 - Packagemanager crashes on hold-down or install (chicken) 296 * #1317 - Packagemanager crashes on hold-down or install (chicken)
296 * #1321 - Batteryapplet graphic glitch (harlekin) 297 * #1321 - Batteryapplet graphic glitch (harlekin)
297 * #1324 - ZSafe not starting up (mickeyl) 298 * #1324 - ZSafe not starting up (mickeyl)
298 * #1328 - Personal Home Address fields is trimmed to 1char (eilers) 299 * #1328 - Personal Home Address fields is trimmed to 1char (eilers)
299 * #1327 - Opie-mail ipk does not depend on libopiedb2 (chicken) 300 * #1327 - Opie-mail ipk does not depend on libopiedb2 (chicken)
300 * #1345 - Networksettingsplugin wlan plugin dependency on libpcap0 (mickeyl) 301 * #1345 - Networksettingsplugin wlan plugin dependency on libpcap0 (mickeyl)
301 * #1348 - Datebook dependency on libopiedb2 (chicken) 302 * #1348 - Datebook dependency on libopiedb2 (chicken)
302 * #1328 - Switched SQLDatabase and VCards char encoding from latin1 to unicode (eilers) 303 * #1328 - Switched SQLDatabase and VCards char encoding from latin1 to unicode (eilers)
303 304
304 2004-04-25Opie 1.1.3 305 2004-04-25Opie 1.1.3
305 306
306 * Introduced first implementation of SQL-Support using SQLite (eilers) 307 * Introduced first implementation of SQL-Support using SQLite (eilers)
307 * Added a new Gutenberg Project reader app - opie-gutenbrowser (ljp) 308 * Added a new Gutenberg Project reader app - opie-gutenbrowser (ljp)
308 * Added a real system graffiti character set (brad) 309 * Added a real system graffiti character set (brad)
309 * Added Generic Keyconfig Widget (zecke) 310 * Added Generic Keyconfig Widget (zecke)
310 * Improved Screenshotapplet and Drawpad integration. You can now open a screenshot in drawpad and take notes (zecke) 311 * Improved Screenshotapplet and Drawpad integration. You can now open a screenshot in drawpad and take notes (zecke)
311 * Added new Bible reader app - opie-dagger (drw) 312 * Added new Bible reader app - opie-dagger (drw)
312 * Added a new Image Viewer. Work is ongoing (zecke,alwin) 313 * Added a new Image Viewer. Work is ongoing (zecke,alwin)
313 * Added namespace usage in libopie2 and everywhere (zecke,alwin) 314 * Added namespace usage in libopie2 and everywhere (zecke,alwin)
314 * Enabled the possibility to pass command line arguments to applications (mickeyl) 315 * Enabled the possibility to pass command line arguments to applications (mickeyl)
315 * Added an about applet showing some credits and information about Opie (mickeyl) 316 * Added an about applet showing some credits and information about Opie (mickeyl)
316 * Added benchmarking functionality to sysinfo (mickeyl) 317 * Added benchmarking functionality to sysinfo (mickeyl)
317 * Added applet and configuration application for switching hardware keyboard layouts (alwin) 318 * Added applet and configuration application for switching hardware keyboard layouts (alwin)
318 * Ported applications from libopie1 to libopie2* (drw,ar,alwin) 319 * Ported applications from libopie1 to libopie2* (drw,ar,alwin)
319 * Imported fullscreen and font improvements from the Qkonsole fork to embeddedkonsole (waspe) 320 * Imported fullscreen and font improvements from the Qkonsole fork to embeddedkonsole (waspe)
320 * Clean-up of package information in control files (drw) 321 * Clean-up of package information in control files (drw)
321 * Repaired mediummount which was broken since integrating the quicklauncher (alwin) 322 * Repaired mediummount which was broken since integrating the quicklauncher (alwin)
322 * Improved big-screen support (zecke,ar) 323 * Improved big-screen support (zecke,ar)
323 * Improved multikeyboard support, added keyboard layout switching applet (mouse) 324 * Improved multikeyboard support, added keyboard layout switching applet (mouse)
324 * Added a new mail client based on libetpan (harlekin,alwin,jgf) 325 * Added a new mail client based on libetpan (harlekin,alwin,jgf)
325 * Added new package manager - opie-packagemanager (drw) 326 * Added new package manager - opie-packagemanager (drw)
326 * Improved light-n-power for C7x0 (mickeyl) 327 * Improved light-n-power for C7x0 (mickeyl)
327 * Added automatic rotation support for C7x0 (treke) 328 * Added automatic rotation support for C7x0 (treke)
328 * Split libopie1 up into a set of smaller - functionally grouped - libraries (mickeyl) 329 * Split libopie1 up into a set of smaller - functionally grouped - libraries (mickeyl)
329 * Added scanning the wireless network neighbourhood to networksettings (mickeyl) 330 * Added scanning the wireless network neighbourhood to networksettings (mickeyl)
330 331
331 2003-11-29Opie 1.0.3 332 2003-11-29Opie 1.0.3
332 333
333 * Released as Version 1.0.3 334 * Released as Version 1.0.3
334 * Improved i18n (various contributors) 335 * Improved i18n (various contributors)
335 * Reduced application startup time by integrating the TT quicklauncher (zecke,harlekin) 336 * Reduced application startup time by integrating the TT quicklauncher (zecke,harlekin)
336 * Made the Documents Tab optional (mickeyl) 337 * Made the Documents Tab optional (mickeyl)
337 * Integrated basic support for HP iPAQ 54xx and the Jornada 5xx (chicken) 338 * Integrated basic support for HP iPAQ 54xx and the Jornada 5xx (chicken)
338 339
339 2003-08-04Opie 1.0.0 340 2003-08-04Opie 1.0.0
340 341
341 * Released as Version 1.0.0 342 * Released as Version 1.0.0
342 * Including a PPP module for easy dial up (tille,harlekin,zecke) 343 * Including a PPP module for easy dial up (tille,harlekin,zecke)
diff --git a/noncore/apps/opie-console/TEWidget.cpp b/noncore/apps/opie-console/TEWidget.cpp
index 1199e4f..117f6dd 100644
--- a/noncore/apps/opie-console/TEWidget.cpp
+++ b/noncore/apps/opie-console/TEWidget.cpp
@@ -1,1100 +1,1105 @@
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 <qpe/config.h> 52#include <qpe/config.h>
53 53
54#include <qapplication.h> 54#include <qapplication.h>
55#include <qclipboard.h> 55#include <qclipboard.h>
56 56
57#include <stdio.h> 57#include <stdio.h>
58#include <stdlib.h> 58#include <stdlib.h>
59#include <unistd.h> 59#include <unistd.h>
60#include <ctype.h> 60#include <ctype.h>
61#include <sys/stat.h> 61#include <sys/stat.h>
62#include <sys/types.h> 62#include <sys/types.h>
63#include <signal.h> 63#include <signal.h>
64 64
65#include <assert.h> 65#include <assert.h>
66 66
67 67
68 68
69// #include "TEWidget.moc" 69// #include "TEWidget.moc"
70//#include <kapp.h> 70//#include <kapp.h>
71//#include <kcursor.h> 71//#include <kcursor.h>
72//#include <kurl.h> 72//#include <kurl.h>
73//#include <kdebug.h> 73//#include <kdebug.h>
74//#include <klocale.h> 74//#include <klocale.h>
75 75
76#define HERE printf("%s(%d): %s\n",__FILE__,__LINE__,__FUNCTION__) 76#define HERE printf("%s(%d): %s\n",__FILE__,__LINE__,__FUNCTION__)
77#define HCNT(Name) // { static int cnt = 1; printf("%s(%d): %s %d\n",__FILE__,__LINE__,Name,cnt++); } 77#define HCNT(Name) // { static int cnt = 1; printf("%s(%d): %s %d\n",__FILE__,__LINE__,Name,cnt++); }
78 78
79#define loc(X,Y) ((Y)*columns+(X)) 79#define loc(X,Y) ((Y)*columns+(X))
80 80
81//FIXME: the rim should normally be 1, 0 only when running in full screen mode. 81//FIXME: the rim should normally be 1, 0 only when running in full screen mode.
82#define rimX 0 // left/right rim width 82#define rimX 0 // left/right rim width
83#define rimY 0 // top/bottom rim high 83#define rimY 0 // top/bottom rim high
84 84
85#define yMouseScroll 1 85#define yMouseScroll 1
86// scroll increment used when dragging selection at top/bottom of window. 86// scroll increment used when dragging selection at top/bottom of window.
87 87
88/* Button XPM */ 88/* Button XPM */
89namespace { 89namespace {
90static char * menu_xpm[] = { 90static char * menu_xpm[] = {
91"12 12 5 1", 91"12 12 5 1",
92 " c None", 92 " c None",
93 ".c #000000", 93 ".c #000000",
94 "+c #FFFDAD", 94 "+c #FFFDAD",
95 "@c #FFFF00", 95 "@c #FFFF00",
96 "#c #E5E100", 96 "#c #E5E100",
97" ", 97" ",
98" ", 98" ",
99" ......... ", 99" ......... ",
100" .+++++++. ", 100" .+++++++. ",
101" .+@@@@#. ", 101" .+@@@@#. ",
102" .+@@@#. ", 102" .+@@@#. ",
103" .+@@#. ", 103" .+@@#. ",
104" .+@#. ", 104" .+@#. ",
105" .+#. ", 105" .+#. ",
106" .+. ", 106" .+. ",
107" .. ", 107" .. ",
108" "}; 108" "};
109 109
110} 110}
111 111
112 112
113/* ------------------------------------------------------------------------- */ 113/* ------------------------------------------------------------------------- */
114/* */ 114/* */
115/* Colors */ 115/* Colors */
116/* */ 116/* */
117/* ------------------------------------------------------------------------- */ 117/* ------------------------------------------------------------------------- */
118 118
119//FIXME: the default color table is in session.C now. 119//FIXME: the default color table is in session.C now.
120// We need a way to get rid of this one, here. 120// We need a way to get rid of this one, here.
121static const ColorEntry base_color_table[TABLE_COLORS] = 121static const ColorEntry base_color_table[TABLE_COLORS] =
122// The following are almost IBM standard color codes, with some slight 122// The following are almost IBM standard color codes, with some slight
123// gamma correction for the dim colors to compensate for bright X screens. 123// gamma correction for the dim colors to compensate for bright X screens.
124// It contains the 8 ansiterm/xterm colors in 2 intensities. 124// It contains the 8 ansiterm/xterm colors in 2 intensities.
125{ 125{
126 // Fixme: could add faint colors here, also. 126 // Fixme: could add faint colors here, also.
127 // normal 127 // normal
128 ColorEntry(QColor(0x00,0x00,0x00), 0, 0 ), ColorEntry( QColor(0xB2,0xB2,0xB2), 1, 0 ), // Dfore, Dback 128 ColorEntry(QColor(0x00,0x00,0x00), 0, 0 ), ColorEntry( QColor(0xB2,0xB2,0xB2), 1, 0 ), // Dfore, Dback
129 ColorEntry(QColor(0x00,0x00,0x00), 0, 0 ), ColorEntry( QColor(0xB2,0x18,0x18), 0, 0 ), // Black, Red 129 ColorEntry(QColor(0x00,0x00,0x00), 0, 0 ), ColorEntry( QColor(0xB2,0x18,0x18), 0, 0 ), // Black, Red
130 ColorEntry(QColor(0x18,0xB2,0x18), 0, 0 ), ColorEntry( QColor(0xB2,0x68,0x18), 0, 0 ), // Green, Yellow 130 ColorEntry(QColor(0x18,0xB2,0x18), 0, 0 ), ColorEntry( QColor(0xB2,0x68,0x18), 0, 0 ), // Green, Yellow
131 ColorEntry(QColor(0x18,0x18,0xB2), 0, 0 ), ColorEntry( QColor(0xB2,0x18,0xB2), 0, 0 ), // Blue, Magenta 131 ColorEntry(QColor(0x18,0x18,0xB2), 0, 0 ), ColorEntry( QColor(0xB2,0x18,0xB2), 0, 0 ), // Blue, Magenta
132 ColorEntry(QColor(0x18,0xB2,0xB2), 0, 0 ), ColorEntry( QColor(0xB2,0xB2,0xB2), 0, 0 ), // Cyan, White 132 ColorEntry(QColor(0x18,0xB2,0xB2), 0, 0 ), ColorEntry( QColor(0xB2,0xB2,0xB2), 0, 0 ), // Cyan, White
133 // intensiv 133 // intensiv
134 ColorEntry(QColor(0x00,0x00,0x00), 0, 1 ), ColorEntry( QColor(0xFF,0xFF,0xFF), 1, 0 ), 134 ColorEntry(QColor(0x00,0x00,0x00), 0, 1 ), ColorEntry( QColor(0xFF,0xFF,0xFF), 1, 0 ),
135 ColorEntry(QColor(0x68,0x68,0x68), 0, 0 ), ColorEntry( QColor(0xFF,0x54,0x54), 0, 0 ), 135 ColorEntry(QColor(0x68,0x68,0x68), 0, 0 ), ColorEntry( QColor(0xFF,0x54,0x54), 0, 0 ),
136 ColorEntry(QColor(0x54,0xFF,0x54), 0, 0 ), ColorEntry( QColor(0xFF,0xFF,0x54), 0, 0 ), 136 ColorEntry(QColor(0x54,0xFF,0x54), 0, 0 ), ColorEntry( QColor(0xFF,0xFF,0x54), 0, 0 ),
137 ColorEntry(QColor(0x54,0x54,0xFF), 0, 0 ), ColorEntry( QColor(0xB2,0x18,0xB2), 0, 0 ), 137 ColorEntry(QColor(0x54,0x54,0xFF), 0, 0 ), ColorEntry( QColor(0xB2,0x18,0xB2), 0, 0 ),
138 ColorEntry(QColor(0x54,0xFF,0xFF), 0, 0 ), ColorEntry( QColor(0xFF,0xFF,0xFF), 0, 0 ) 138 ColorEntry(QColor(0x54,0xFF,0xFF), 0, 0 ), ColorEntry( QColor(0xFF,0xFF,0xFF), 0, 0 )
139}; 139};
140 140
141/* Note that we use ANSI color order (bgr), while IBMPC color order is (rgb) 141/* Note that we use ANSI color order (bgr), while IBMPC color order is (rgb)
142 142
143 Code 0 1 2 3 4 5 6 7 143 Code 0 1 2 3 4 5 6 7
144 ----------- ------- ------- ------- ------- ------- ------- ------- ------- 144 ----------- ------- ------- ------- ------- ------- ------- ------- -------
145 ANSI (bgr) Black Red Green Yellow Blue Magenta Cyan White 145 ANSI (bgr) Black Red Green Yellow Blue Magenta Cyan White
146 IBMPC (rgb) Black Blue Green Cyan Red Magenta Yellow White 146 IBMPC (rgb) Black Blue Green Cyan Red Magenta Yellow White
147*/ 147*/
148 148
149QColor TEWidget::getDefaultBackColor() 149QColor TEWidget::getDefaultBackColor()
150{ 150{
151 return color_table[DEFAULT_BACK_COLOR].color; 151 return color_table[DEFAULT_BACK_COLOR].color;
152} 152}
153 153
154const ColorEntry* TEWidget::getColorTable() const 154const ColorEntry* TEWidget::getColorTable() const
155{ 155{
156 return color_table; 156 return color_table;
157} 157}
158 158
159const ColorEntry* TEWidget::getdefaultColorTable() const 159const ColorEntry* TEWidget::getdefaultColorTable() const
160{ 160{
161 return base_color_table; 161 return base_color_table;
162} 162}
163 163
164 164
165const QPixmap *TEWidget::backgroundPixmap() 165const QPixmap *TEWidget::backgroundPixmap()
166{ 166{
167 static QPixmap *bg = new QPixmap("~/qpim/main/pics/faded_bg.xpm"); 167 static QPixmap *bg = new QPixmap("~/qpim/main/pics/faded_bg.xpm");
168 const QPixmap *pm = bg; 168 const QPixmap *pm = bg;
169 return pm; 169 return pm;
170} 170}
171 171
172void TEWidget::setColorTable(const ColorEntry table[]) 172void TEWidget::setColorTable(const ColorEntry table[])
173{ 173{
174 for (int i = 0; i < TABLE_COLORS; i++) color_table[i] = table[i]; 174 for (int i = 0; i < TABLE_COLORS; i++) color_table[i] = table[i];
175 175
176 const QPixmap* pm = backgroundPixmap(); 176 const QPixmap* pm = backgroundPixmap();
177 if (!pm) setBackgroundColor(color_table[DEFAULT_BACK_COLOR].color); 177 if (!pm) setBackgroundColor(color_table[DEFAULT_BACK_COLOR].color);
178 update(); 178 update();
179} 179}
180 180
181//FIXME: add backgroundPixmapChanged. 181//FIXME: add backgroundPixmapChanged.
182 182
183/* ------------------------------------------------------------------------- */ 183/* ------------------------------------------------------------------------- */
184/* */ 184/* */
185/* Font */ 185/* Font */
186/* */ 186/* */
187/* ------------------------------------------------------------------------- */ 187/* ------------------------------------------------------------------------- */
188 188
189/* 189/*
190 The VT100 has 32 special graphical characters. The usual vt100 extended 190 The VT100 has 32 special graphical characters. The usual vt100 extended
191 xterm fonts have these at 0x00..0x1f. 191 xterm fonts have these at 0x00..0x1f.
192 192
193 QT's iso mapping leaves 0x00..0x7f without any changes. But the graphicals 193 QT's iso mapping leaves 0x00..0x7f without any changes. But the graphicals
194 come in here as proper unicode characters. 194 come in here as proper unicode characters.
195 195
196 We treat non-iso10646 fonts as VT100 extended and do the requiered mapping 196 We treat non-iso10646 fonts as VT100 extended and do the requiered mapping
197 from unicode to 0x00..0x1f. The remaining translation is then left to the 197 from unicode to 0x00..0x1f. The remaining translation is then left to the
198 QCodec. 198 QCodec.
199*/ 199*/
200 200
201// assert for i in [0..31] : vt100extended(vt100_graphics[i]) == i. 201// assert for i in [0..31] : vt100extended(vt100_graphics[i]) == i.
202 202
203unsigned short vt100_graphics[32] = 203unsigned short vt100_graphics[32] =
204{ // 0/8 1/9 2/10 3/11 4/12 5/13 6/14 7/15 204{ // 0/8 1/9 2/10 3/11 4/12 5/13 6/14 7/15
205 0x0020, 0x25C6, 0x2592, 0x2409, 0x240c, 0x240d, 0x240a, 0x00b0, 205 0x0020, 0x25C6, 0x2592, 0x2409, 0x240c, 0x240d, 0x240a, 0x00b0,
206 0x00b1, 0x2424, 0x240b, 0x2518, 0x2510, 0x250c, 0x2514, 0x253c, 206 0x00b1, 0x2424, 0x240b, 0x2518, 0x2510, 0x250c, 0x2514, 0x253c,
207 0xF800, 0xF801, 0x2500, 0xF803, 0xF804, 0x251c, 0x2524, 0x2534, 207 0xF800, 0xF801, 0x2500, 0xF803, 0xF804, 0x251c, 0x2524, 0x2534,
208 0x252c, 0x2502, 0x2264, 0x2265, 0x03C0, 0x2260, 0x00A3, 0x00b7 208 0x252c, 0x2502, 0x2264, 0x2265, 0x03C0, 0x2260, 0x00A3, 0x00b7
209}; 209};
210 210
211static QChar vt100extended(QChar c) 211static QChar vt100extended(QChar c)
212{ 212{
213 switch (c.unicode()) 213 switch (c.unicode())
214 { 214 {
215 case 0x25c6 : return 1; 215 case 0x25c6 : return 1;
216 case 0x2592 : return 2; 216 case 0x2592 : return 2;
217 case 0x2409 : return 3; 217 case 0x2409 : return 3;
218 case 0x240c : return 4; 218 case 0x240c : return 4;
219 case 0x240d : return 5; 219 case 0x240d : return 5;
220 case 0x240a : return 6; 220 case 0x240a : return 6;
221 case 0x00b0 : return 7; 221 case 0x00b0 : return 7;
222 case 0x00b1 : return 8; 222 case 0x00b1 : return 8;
223 case 0x2424 : return 9; 223 case 0x2424 : return 9;
224 case 0x240b : return 10; 224 case 0x240b : return 10;
225 case 0x2518 : return 11; 225 case 0x2518 : return 11;
226 case 0x2510 : return 12; 226 case 0x2510 : return 12;
227 case 0x250c : return 13; 227 case 0x250c : return 13;
228 case 0x2514 : return 14; 228 case 0x2514 : return 14;
229 case 0x253c : return 15; 229 case 0x253c : return 15;
230 case 0xf800 : return 16; 230 case 0xf800 : return 16;
231 case 0xf801 : return 17; 231 case 0xf801 : return 17;
232 case 0x2500 : return 18; 232 case 0x2500 : return 18;
233 case 0xf803 : return 19; 233 case 0xf803 : return 19;
234 case 0xf804 : return 20; 234 case 0xf804 : return 20;
235 case 0x251c : return 21; 235 case 0x251c : return 21;
236 case 0x2524 : return 22; 236 case 0x2524 : return 22;
237 case 0x2534 : return 23; 237 case 0x2534 : return 23;
238 case 0x252c : return 24; 238 case 0x252c : return 24;
239 case 0x2502 : return 25; 239 case 0x2502 : return 25;
240 case 0x2264 : return 26; 240 case 0x2264 : return 26;
241 case 0x2265 : return 27; 241 case 0x2265 : return 27;
242 case 0x03c0 : return 28; 242 case 0x03c0 : return 28;
243 case 0x2260 : return 29; 243 case 0x2260 : return 29;
244 case 0x00a3 : return 30; 244 case 0x00a3 : return 30;
245 case 0x00b7 : return 31; 245 case 0x00b7 : return 31;
246 } 246 }
247 return c; 247 return c;
248} 248}
249 249
250static QChar identicalMap(QChar c) 250static QChar identicalMap(QChar c)
251{ 251{
252 return c; 252 return c;
253} 253}
254 254
255void TEWidget::fontChange(const QFont &) 255void TEWidget::fontChange(const QFont &)
256{ 256{
257 QFontMetrics fm(font()); 257 QFontMetrics fm(font());
258 font_h = fm.height(); 258 font_h = fm.height();
259 font_w = fm.maxWidth(); 259 font_w = fm.maxWidth();
260 font_a = fm.ascent(); 260 font_a = fm.ascent();
261//printf("font_h: %d\n",font_h); 261//printf("font_h: %d\n",font_h);
262//printf("font_w: %d\n",font_w); 262//printf("font_w: %d\n",font_w);
263//printf("font_a: %d\n",font_a); 263//printf("font_a: %d\n",font_a);
264//printf("charset: %s\n",QFont::encodingName(font().charSet()).ascii()); 264//printf("charset: %s\n",QFont::encodingName(font().charSet()).ascii());
265//printf("rawname: %s\n",font().rawName().ascii()); 265//printf("rawname: %s\n",font().rawName().ascii());
266 fontMap = 266 fontMap =
267#if QT_VERSION < 0x030000 267#if QT_VERSION < 0x030000
268 strcmp(QFont::encodingName(font().charSet()).ascii(),"iso10646") 268 strcmp(QFont::encodingName(font().charSet()).ascii(),"iso10646")
269 ? vt100extended 269 ? vt100extended
270 : 270 :
271#endif 271#endif
272 identicalMap; 272 identicalMap;
273 propagateSize(); 273 propagateSize();
274 update(); 274 update();
275} 275}
276 276
277void TEWidget::setVTFont(const QFont& f) 277void TEWidget::setVTFont(const QFont& f)
278{ 278{
279 QFrame::setFont(f); 279 QFrame::setFont(f);
280} 280}
281 281
282QFont TEWidget::getVTFont() { 282QFont TEWidget::getVTFont() {
283 return font(); 283 return font();
284} 284}
285 285
286void TEWidget::setFont(const QFont &) 286void TEWidget::setFont(const QFont &)
287{ 287{
288 // ignore font change request if not coming from konsole itself 288 // ignore font change request if not coming from konsole itself
289} 289}
290 290
291/* ------------------------------------------------------------------------- */ 291/* ------------------------------------------------------------------------- */
292/* */ 292/* */
293/* Constructor / Destructor */ 293/* Constructor / Destructor */
294/* */ 294/* */
295/* ----------------------------------------------------------------------- */ 295/* ----------------------------------------------------------------------- */
296 296
297 297
298 298
299TEWidget::TEWidget(QWidget *parent, const char *name) : QFrame(parent,name) 299TEWidget::TEWidget(QWidget *parent, const char *name) : QFrame(parent,name)
300{ 300{
301#ifndef QT_NO_CLIPBOARD 301#ifndef QT_NO_CLIPBOARD
302 cb = QApplication::clipboard(); 302 cb = QApplication::clipboard();
303 QObject::connect( (QObject*)cb, SIGNAL(dataChanged()), 303 QObject::connect( (QObject*)cb, SIGNAL(dataChanged()),
304 this, SLOT(onClearSelection()) ); 304 this, SLOT(onClearSelection()) );
305#endif 305#endif
306 306
307 307
308 scrollbar = new QScrollBar( this ); 308 scrollbar = new QScrollBar( this );
309 scrollbar->setCursor( arrowCursor ); 309 scrollbar->setCursor( arrowCursor );
310 connect(scrollbar, SIGNAL(valueChanged(int)), this, SLOT(scrollChanged(int))); 310 connect(scrollbar, SIGNAL(valueChanged(int)), this, SLOT(scrollChanged(int)));
311 311
312 hscrollbar = new QScrollBar( Qt::Horizontal, this ); 312 hscrollbar = new QScrollBar( Qt::Horizontal, this );
313 hscrollbar->setCursor( arrowCursor ); 313 hscrollbar->setCursor( arrowCursor );
314 connect(hscrollbar, SIGNAL(valueChanged(int)), this, SLOT(hscrollChanged(int))); 314 connect(hscrollbar, SIGNAL(valueChanged(int)), this, SLOT(hscrollChanged(int)));
315 315
316 m_cornerButton = new QPushButton( this ); 316 m_cornerButton = new QPushButton( this );
317 m_cornerButton->setPixmap( QPixmap( (const char**)menu_xpm ) ); 317 m_cornerButton->setPixmap( QPixmap( (const char**)menu_xpm ) );
318 m_cornerButton->setMaximumSize( 14, 14 ); 318 m_cornerButton->setMaximumSize( 14, 14 );
319 m_cornerButton->hide(); 319 m_cornerButton->hide();
320 320
321 Config cfg("Konsole"); 321 Config cfg("Konsole");
322 cfg.setGroup("ScrollBar"); 322 cfg.setGroup("ScrollBar");
323 switch( cfg.readNumEntry("Position",2)){ 323
324 case 0: 324 scrollLoc = cfg.readNumEntry("Position", -1);
325 scrollLoc = SCRNONE; 325
326 break; 326 // bugfix for #1647
327 case 1: 327 // if user set 'show scrollbar on left' then let it be on left
328 scrollLoc = SCRLEFT; 328 // but only if it is not set in opie-console itself
329 break; 329 if(scrollLoc == -1)
330 case 2: 330 {
331 scrollLoc = SCRRIGHT; 331 Config qpecfg ("qpe");
332 break; 332 qpecfg.setGroup("Appearance");
333 scrollLoc = qpecfg.readNumEntry("LeftHand", SCRRIGHT);
334 if(scrollLoc == 0) // user set LeftHand in past and switched it off later
335 {
336 scrollLoc = SCRRIGHT;
337 }
333 }; 338 };
334 339
335 blinkT = new QTimer(this); 340 blinkT = new QTimer(this);
336 connect(blinkT, SIGNAL(timeout()), this, SLOT(blinkEvent())); 341 connect(blinkT, SIGNAL(timeout()), this, SLOT(blinkEvent()));
337 // blinking = FALSE; 342 // blinking = FALSE;
338 blinking = TRUE; 343 blinking = TRUE;
339 344
340 resizing = FALSE; 345 resizing = FALSE;
341 actSel = 0; 346 actSel = 0;
342 image = 0; 347 image = 0;
343 lines = 1; 348 lines = 1;
344 columns = 1; 349 columns = 1;
345 font_w = 1; 350 font_w = 1;
346 font_h = 1; 351 font_h = 1;
347 font_a = 1; 352 font_a = 1;
348 word_selection_mode = FALSE; 353 word_selection_mode = FALSE;
349 vcolumns = 0; 354 vcolumns = 0;
350 hposition = 0; 355 hposition = 0;
351 356
352 setMouseMarks(TRUE); 357 setMouseMarks(TRUE);
353 setVTFont( QFont("fixed") ); 358 setVTFont( QFont("fixed") );
354 setColorTable(base_color_table); // init color table 359 setColorTable(base_color_table); // init color table
355 360
356 qApp->installEventFilter( this ); //FIXME: see below 361 qApp->installEventFilter( this ); //FIXME: see below
357// KCursor::setAutoHideCursor( this, true ); 362// KCursor::setAutoHideCursor( this, true );
358 363
359 // Init DnD //////////////////////////////////////////////////////////////// 364 // Init DnD ////////////////////////////////////////////////////////////////
360 currentSession = NULL; 365 currentSession = NULL;
361// setAcceptDrops(true); // attempt 366// setAcceptDrops(true); // attempt
362// m_drop = new QPopupMenu(this); 367// m_drop = new QPopupMenu(this);
363// m_drop->insertItem( QString("Paste"), 0); 368// m_drop->insertItem( QString("Paste"), 0);
364// m_drop->insertItem( QString("cd"), 1); 369// m_drop->insertItem( QString("cd"), 1);
365// connect(m_drop, SIGNAL(activated(int)), SLOT(drop_menu_activated(int))); 370// connect(m_drop, SIGNAL(activated(int)), SLOT(drop_menu_activated(int)));
366 371
367 // we need focus so that the auto-hide cursor feature works 372 // we need focus so that the auto-hide cursor feature works
368 setFocus(); 373 setFocus();
369 setFocusPolicy( WheelFocus ); 374 setFocusPolicy( WheelFocus );
370} 375}
371 376
372//FIXME: make proper destructor 377//FIXME: make proper destructor
373// Here's a start (David) 378// Here's a start (David)
374TEWidget::~TEWidget() 379TEWidget::~TEWidget()
375{ 380{
376 qApp->removeEventFilter( this ); 381 qApp->removeEventFilter( this );
377 if (image) free(image); 382 if (image) free(image);
378} 383}
379 384
380/* ------------------------------------------------------------------------- */ 385/* ------------------------------------------------------------------------- */
381/* */ 386/* */
382/* Display Operations */ 387/* Display Operations */
383/* */ 388/* */
384/* ------------------------------------------------------------------------- */ 389/* ------------------------------------------------------------------------- */
385 390
386/*! 391/*!
387 attributed string draw primitive 392 attributed string draw primitive
388*/ 393*/
389 394
390void TEWidget::drawAttrStr(QPainter &paint, QRect rect, 395void TEWidget::drawAttrStr(QPainter &paint, QRect rect,
391 QString& str, ca attr, BOOL pm, BOOL clear) 396 QString& str, ca attr, BOOL pm, BOOL clear)
392{ 397{
393 if (pm && color_table[attr.b].transparent) 398 if (pm && color_table[attr.b].transparent)
394 { 399 {
395 paint.setBackgroundMode( TransparentMode ); 400 paint.setBackgroundMode( TransparentMode );
396 if (clear) erase(rect); 401 if (clear) erase(rect);
397 } 402 }
398 else 403 else
399 { 404 {
400 if (blinking) 405 if (blinking)
401 paint.fillRect(rect, color_table[attr.b].color); 406 paint.fillRect(rect, color_table[attr.b].color);
402 else 407 else
403 { 408 {
404 paint.setBackgroundMode( OpaqueMode ); 409 paint.setBackgroundMode( OpaqueMode );
405 paint.setBackgroundColor( color_table[attr.b].color ); 410 paint.setBackgroundColor( color_table[attr.b].color );
406 } 411 }
407 } 412 }
408 413
409 if (color_table[attr.f].bold) 414 if (color_table[attr.f].bold)
410 paint.setPen(QColor( 0x8F, 0x00, 0x00 )); 415 paint.setPen(QColor( 0x8F, 0x00, 0x00 ));
411 else 416 else
412 paint.setPen(color_table[attr.f].color); 417 paint.setPen(color_table[attr.f].color);
413 418
414 paint.drawText(rect.x(),rect.y()+font_a, str); 419 paint.drawText(rect.x(),rect.y()+font_a, str);
415 420
416 if (attr.r & RE_UNDERLINE) 421 if (attr.r & RE_UNDERLINE)
417 paint.drawLine(rect.left(), rect.y()+font_a+1, rect.right(),rect.y()+font_a+1 ); 422 paint.drawLine(rect.left(), rect.y()+font_a+1, rect.right(),rect.y()+font_a+1 );
418} 423}
419 424
420/*! 425/*!
421 The image can only be set completely. 426 The image can only be set completely.
422 427
423 The size of the new image may or may not match the size of the widget. 428 The size of the new image may or may not match the size of the widget.
424*/ 429*/
425 430
426void TEWidget::setImage(const ca* const newimg, int lines, int columns) 431void TEWidget::setImage(const ca* const newimg, int lines, int columns)
427{ int y,x,len; 432{ int y,x,len;
428 const QPixmap* pm = backgroundPixmap(); 433 const QPixmap* pm = backgroundPixmap();
429 QPainter paint; 434 QPainter paint;
430 setUpdatesEnabled(FALSE); 435 setUpdatesEnabled(FALSE);
431 paint.begin( this ); 436 paint.begin( this );
432HCNT("setImage"); 437HCNT("setImage");
433 438
434 QPoint tL = contentsRect().topLeft(); 439 QPoint tL = contentsRect().topLeft();
435 int tLx = tL.x(); 440 int tLx = tL.x();
436 int tLy = tL.y(); 441 int tLy = tL.y();
437 hasBlinker = FALSE; 442 hasBlinker = FALSE;
438 443
439 int cf = -1; // undefined 444 int cf = -1; // undefined
440 int cb = -1; // undefined 445 int cb = -1; // undefined
441 int cr = -1; // undefined 446 int cr = -1; // undefined
442 447
443 int lins = QMIN(this->lines, QMAX(0,lines )); 448 int lins = QMIN(this->lines, QMAX(0,lines ));
444 int cols = QMIN(this->columns,QMAX(0,columns)); 449 int cols = QMIN(this->columns,QMAX(0,columns));
445 QChar *disstrU = new QChar[cols]; 450 QChar *disstrU = new QChar[cols];
446 451
447//{ static int cnt = 0; printf("setImage %d\n",cnt++); } 452//{ static int cnt = 0; printf("setImage %d\n",cnt++); }
448 for (y = 0; y < lins; y++) 453 for (y = 0; y < lins; y++)
449 { 454 {
450 const ca* lcl = &image[y*this->columns]; 455 const ca* lcl = &image[y*this->columns];
451 const ca* const ext = &newimg[y*columns]; 456 const ca* const ext = &newimg[y*columns];
452 if (!resizing) // not while resizing, we're expecting a paintEvent 457 if (!resizing) // not while resizing, we're expecting a paintEvent
453 for (x = 0; x < cols; x++) 458 for (x = 0; x < cols; x++)
454 { 459 {
455 hasBlinker |= (ext[x].r & RE_BLINK); 460 hasBlinker |= (ext[x].r & RE_BLINK);
456 if (ext[x] != lcl[x]) 461 if (ext[x] != lcl[x])
457 { 462 {
458 cr = ext[x].r; 463 cr = ext[x].r;
459 cb = ext[x].b; 464 cb = ext[x].b;
460 if (ext[x].f != cf) cf = ext[x].f; 465 if (ext[x].f != cf) cf = ext[x].f;
461 int lln = cols - x; 466 int lln = cols - x;
462 disstrU[0] = fontMap(ext[x+0].c); 467 disstrU[0] = fontMap(ext[x+0].c);
463 for (len = 1; len < lln; len++) 468 for (len = 1; len < lln; len++)
464 { 469 {
465 if (ext[x+len].f != cf || ext[x+len].b != cb || ext[x+len].r != cr || 470 if (ext[x+len].f != cf || ext[x+len].b != cb || ext[x+len].r != cr ||
466 ext[x+len] == lcl[x+len] ) 471 ext[x+len] == lcl[x+len] )
467 break; 472 break;
468 disstrU[len] = fontMap(ext[x+len].c); 473 disstrU[len] = fontMap(ext[x+len].c);
469 } 474 }
470 QString unistr(disstrU,len); 475 QString unistr(disstrU,len);
471 drawAttrStr(paint, 476 drawAttrStr(paint,
472 QRect(blX+tLx+font_w*x,bY+tLy+font_h*y,font_w*len,font_h), 477 QRect(blX+tLx+font_w*x,bY+tLy+font_h*y,font_w*len,font_h),
473 unistr, ext[x], pm != NULL, true); 478 unistr, ext[x], pm != NULL, true);
474 x += len - 1; 479 x += len - 1;
475 } 480 }
476 } 481 }
477 // finally, make `image' become `newimg'. 482 // finally, make `image' become `newimg'.
478 memcpy((void*)lcl,(const void*)ext,cols*sizeof(ca)); 483 memcpy((void*)lcl,(const void*)ext,cols*sizeof(ca));
479 } 484 }
480 drawFrame( &paint ); 485 drawFrame( &paint );
481 paint.end(); 486 paint.end();
482 setUpdatesEnabled(TRUE); 487 setUpdatesEnabled(TRUE);
483 if ( hasBlinker && !blinkT->isActive()) blinkT->start(1000); // 1000 ms 488 if ( hasBlinker && !blinkT->isActive()) blinkT->start(1000); // 1000 ms
484 if (!hasBlinker && blinkT->isActive()) { blinkT->stop(); blinking = FALSE; } 489 if (!hasBlinker && blinkT->isActive()) { blinkT->stop(); blinking = FALSE; }
485 delete [] disstrU; 490 delete [] disstrU;
486} 491}
487 492
488// paint Event //////////////////////////////////////////////////// 493// paint Event ////////////////////////////////////////////////////
489 494
490/*! 495/*!
491 The difference of this routine vs. the `setImage' is, 496 The difference of this routine vs. the `setImage' is,
492 that the drawing does not include a difference analysis 497 that the drawing does not include a difference analysis
493 between the old and the new image. Instead, the internal 498 between the old and the new image. Instead, the internal
494 image is used and the painting bound by the PaintEvent box. 499 image is used and the painting bound by the PaintEvent box.
495*/ 500*/
496 501
497void TEWidget::paintEvent( QPaintEvent* pe ) 502void TEWidget::paintEvent( QPaintEvent* pe )
498{ 503{
499 504
500//{ static int cnt = 0; printf("paint %d\n",cnt++); } 505//{ static int cnt = 0; printf("paint %d\n",cnt++); }
501 const QPixmap* pm = backgroundPixmap(); 506 const QPixmap* pm = backgroundPixmap();
502 QPainter paint; 507 QPainter paint;
503 setUpdatesEnabled(FALSE); 508 setUpdatesEnabled(FALSE);
504 paint.begin( this ); 509 paint.begin( this );
505 paint.setBackgroundMode( TransparentMode ); 510 paint.setBackgroundMode( TransparentMode );
506HCNT("paintEvent"); 511HCNT("paintEvent");
507 512
508 // Note that the actual widget size can be slightly larger 513 // Note that the actual widget size can be slightly larger
509 // that the image (the size is truncated towards the smaller 514 // that the image (the size is truncated towards the smaller
510 // number of characters in `resizeEvent'. The paint rectangle 515 // number of characters in `resizeEvent'. The paint rectangle
511 // can thus be larger than the image, but less then the size 516 // can thus be larger than the image, but less then the size
512 // of one character. 517 // of one character.
513 518
514 QRect rect = pe->rect().intersect(contentsRect()); 519 QRect rect = pe->rect().intersect(contentsRect());
515 520
516 QPoint tL = contentsRect().topLeft(); 521 QPoint tL = contentsRect().topLeft();
517 int tLx = tL.x(); 522 int tLx = tL.x();
518 int tLy = tL.y(); 523 int tLy = tL.y();
519 524
520 int lux = QMIN(columns-1, QMAX(0,(rect.left() - tLx - blX ) / font_w)); 525 int lux = QMIN(columns-1, QMAX(0,(rect.left() - tLx - blX ) / font_w));
521 int luy = QMIN(lines-1, QMAX(0,(rect.top() - tLy - bY ) / font_h)); 526 int luy = QMIN(lines-1, QMAX(0,(rect.top() - tLy - bY ) / font_h));
522 int rlx = QMIN(columns-1, QMAX(0,(rect.right() - tLx - blX ) / font_w)); 527 int rlx = QMIN(columns-1, QMAX(0,(rect.right() - tLx - blX ) / font_w));
523 int rly = QMIN(lines-1, QMAX(0,(rect.bottom() - tLy - bY ) / font_h)); 528 int rly = QMIN(lines-1, QMAX(0,(rect.bottom() - tLy - bY ) / font_h));
524 529
525 /* 530 /*
526 printf("paintEvent: %d..%d, %d..%d (%d..%d, %d..%d)\n",lux,rlx,luy,rly, 531 printf("paintEvent: %d..%d, %d..%d (%d..%d, %d..%d)\n",lux,rlx,luy,rly,
527 rect.left(), rect.right(), rect.top(), rect.bottom()); 532 rect.left(), rect.right(), rect.top(), rect.bottom());
528 */ 533 */
529 534
530 // if (pm != NULL && color_table[image->b].transparent) 535 // if (pm != NULL && color_table[image->b].transparent)
531 // erase(rect); 536 // erase(rect);
532 // BL: I have no idea why we need this, and it breaks the refresh. 537 // BL: I have no idea why we need this, and it breaks the refresh.
533 538
534 QChar *disstrU = new QChar[columns]; 539 QChar *disstrU = new QChar[columns];
535 for (int y = luy; y <= rly; y++) 540 for (int y = luy; y <= rly; y++)
536 for (int x = lux; x <= rlx; x++) 541 for (int x = lux; x <= rlx; x++)
537 { 542 {
538 int len = 1; 543 int len = 1;
539 disstrU[0] = fontMap(image[loc(x,y)].c); 544 disstrU[0] = fontMap(image[loc(x,y)].c);
540 int cf = image[loc(x,y)].f; 545 int cf = image[loc(x,y)].f;
541 int cb = image[loc(x,y)].b; 546 int cb = image[loc(x,y)].b;
542 int cr = image[loc(x,y)].r; 547 int cr = image[loc(x,y)].r;
543 while (x+len <= rlx && 548 while (x+len <= rlx &&
544 image[loc(x+len,y)].f == cf && 549 image[loc(x+len,y)].f == cf &&
545 image[loc(x+len,y)].b == cb && 550 image[loc(x+len,y)].b == cb &&
546 image[loc(x+len,y)].r == cr ) 551 image[loc(x+len,y)].r == cr )
547 { 552 {
548 disstrU[len] = fontMap(image[loc(x+len,y)].c); 553 disstrU[len] = fontMap(image[loc(x+len,y)].c);
549 len += 1; 554 len += 1;
550 } 555 }
551 QString unistr(disstrU,len); 556 QString unistr(disstrU,len);
552 drawAttrStr(paint, 557 drawAttrStr(paint,
553 QRect(blX+tLx+font_w*x,bY+tLy+font_h*y,font_w*len,font_h), 558 QRect(blX+tLx+font_w*x,bY+tLy+font_h*y,font_w*len,font_h),
554 unistr, image[loc(x,y)], pm != NULL, false); 559 unistr, image[loc(x,y)], pm != NULL, false);
555 x += len - 1; 560 x += len - 1;
556 } 561 }
557 delete [] disstrU; 562 delete [] disstrU;
558 drawFrame( &paint ); 563 drawFrame( &paint );
559 paint.end(); 564 paint.end();
560 setUpdatesEnabled(TRUE); 565 setUpdatesEnabled(TRUE);
561} 566}
562 567
563void TEWidget::blinkEvent() 568void TEWidget::blinkEvent()
564{ 569{
565 blinking = !blinking; 570 blinking = !blinking;
566 repaint(FALSE); 571 repaint(FALSE);
567} 572}
568 573
569/* ------------------------------------------------------------------------- */ 574/* ------------------------------------------------------------------------- */
570/* */ 575/* */
571/* Resizing */ 576/* Resizing */
572/* */ 577/* */
573/* ------------------------------------------------------------------------- */ 578/* ------------------------------------------------------------------------- */
574 579
575void TEWidget::resizeEvent(QResizeEvent* ev) 580void TEWidget::resizeEvent(QResizeEvent* ev)
576{ 581{
577// printf("resize: %d,%d\n",ev->size().width(),ev->size().height()); 582// printf("resize: %d,%d\n",ev->size().width(),ev->size().height());
578 //printf("approx: %d,%d\n",ev->size().width()/font_w,ev->size().height()/font_h); 583 //printf("approx: %d,%d\n",ev->size().width()/font_w,ev->size().height()/font_h);
579 //printf("leaves: %d,%d\n",ev->size().width()%font_w,ev->size().height()%font_h); 584 //printf("leaves: %d,%d\n",ev->size().width()%font_w,ev->size().height()%font_h);
580 //printf("curren: %d,%d\n",width(),height()); 585 //printf("curren: %d,%d\n",width(),height());
581HCNT("resizeEvent"); 586HCNT("resizeEvent");
582 587
583 // see comment in `paintEvent' concerning the rounding. 588 // see comment in `paintEvent' concerning the rounding.
584 //FIXME: could make a routine here; check width(),height() 589 //FIXME: could make a routine here; check width(),height()
585 assert(ev->size().width() == width()); 590 assert(ev->size().width() == width());
586 assert(ev->size().height() == height()); 591 assert(ev->size().height() == height());
587 592
588 propagateSize(); 593 propagateSize();
589} 594}
590 595
591void TEWidget::propagateSize() 596void TEWidget::propagateSize()
592{ 597{
593 ca* oldimg = image; 598 ca* oldimg = image;
594 int oldlin = lines; 599 int oldlin = lines;
595 int oldcol = columns; 600 int oldcol = columns;
596 makeImage(); 601 makeImage();
597 // we copy the old image to reduce flicker 602 // we copy the old image to reduce flicker
598 int lins = QMIN(oldlin,lines); 603 int lins = QMIN(oldlin,lines);
599 int cols = QMIN(oldcol,columns); 604 int cols = QMIN(oldcol,columns);
600 if (oldimg) 605 if (oldimg)
601 { 606 {
602 for (int lin = 0; lin < lins; lin++) 607 for (int lin = 0; lin < lins; lin++)
603 memcpy((void*)&image[columns*lin], 608 memcpy((void*)&image[columns*lin],
604 (void*)&oldimg[oldcol*lin],cols*sizeof(ca)); 609 (void*)&oldimg[oldcol*lin],cols*sizeof(ca));
605 free(oldimg); //FIXME: try new,delete 610 free(oldimg); //FIXME: try new,delete
606 } 611 }
607 else 612 else
608 clearImage(); 613 clearImage();
609 614
610 //NOTE: control flows from the back through the chest right into the eye. 615 //NOTE: control flows from the back through the chest right into the eye.
611 // `emu' will call back via `setImage'. 616 // `emu' will call back via `setImage'.
612 617
613 resizing = TRUE; 618 resizing = TRUE;
614 emit changedImageSizeSignal(lines, columns); // expose resizeEvent 619 emit changedImageSizeSignal(lines, columns); // expose resizeEvent
615 resizing = FALSE; 620 resizing = FALSE;
616} 621}
617 622
618/* ------------------------------------------------------------------------- */ 623/* ------------------------------------------------------------------------- */
619/* */ 624/* */
620/* Scrollbar */ 625/* Scrollbar */
621/* */ 626/* */
622/* ------------------------------------------------------------------------- */ 627/* ------------------------------------------------------------------------- */
623 628
624void TEWidget::scrollChanged(int) 629void TEWidget::scrollChanged(int)
625{ 630{
626 emit changedHistoryCursor(scrollbar->value()); //expose 631 emit changedHistoryCursor(scrollbar->value()); //expose
627} 632}
628 633
629void TEWidget::hscrollChanged(int loc) 634void TEWidget::hscrollChanged(int loc)
630{ 635{
631 hposition = loc; 636 hposition = loc;
632 propagateSize(); 637 propagateSize();
633 update(); 638 update();
634} 639}
635 640
636void TEWidget::setScroll(int cursor, int slines) 641void TEWidget::setScroll(int cursor, int slines)
637{ 642{
638 disconnect(scrollbar, SIGNAL(valueChanged(int)), this, SLOT(scrollChanged(int))); 643 disconnect(scrollbar, SIGNAL(valueChanged(int)), this, SLOT(scrollChanged(int)));
639 scrollbar->setRange(0,slines); 644 scrollbar->setRange(0,slines);
640 scrollbar->setSteps(1,lines); 645 scrollbar->setSteps(1,lines);
641 scrollbar->setValue(cursor); 646 scrollbar->setValue(cursor);
642 connect(scrollbar, SIGNAL(valueChanged(int)), this, SLOT(scrollChanged(int))); 647 connect(scrollbar, SIGNAL(valueChanged(int)), this, SLOT(scrollChanged(int)));
643} 648}
644 649
645void TEWidget::setScrollbarLocation(int loc) 650void TEWidget::setScrollbarLocation(int loc)
646{ 651{
647 if (scrollLoc == loc) return; // quickly 652 if (scrollLoc == loc) return; // quickly
648 scrollLoc = loc; 653 scrollLoc = loc;
649 propagateSize(); 654 propagateSize();
650 update(); 655 update();
651} 656}
652 657
653/* ------------------------------------------------------------------------- */ 658/* ------------------------------------------------------------------------- */
654/* */ 659/* */
655/* Mouse */ 660/* Mouse */
656/* */ 661/* */
657/* ------------------------------------------------------------------------- */ 662/* ------------------------------------------------------------------------- */
658 663
659/*! 664/*!
660 Three different operations can be performed using the mouse, and the 665 Three different operations can be performed using the mouse, and the
661 routines in this section serve all of them: 666 routines in this section serve all of them:
662 667
663 1) The press/release events are exposed to the application 668 1) The press/release events are exposed to the application
664 2) Marking (press and move left button) and Pasting (press middle button) 669 2) Marking (press and move left button) and Pasting (press middle button)
665 3) The right mouse button is used from the configuration menu 670 3) The right mouse button is used from the configuration menu
666 671
667 NOTE: During the marking process we attempt to keep the cursor within 672 NOTE: During the marking process we attempt to keep the cursor within
668 the bounds of the text as being displayed by setting the mouse position 673 the bounds of the text as being displayed by setting the mouse position
669 whenever the mouse has left the text area. 674 whenever the mouse has left the text area.
670 675
671 Two reasons to do so: 676 Two reasons to do so:
672 1) QT does not allow the `grabMouse' to confine-to the TEWidget. 677 1) QT does not allow the `grabMouse' to confine-to the TEWidget.
673 Thus a `XGrapPointer' would have to be used instead. 678 Thus a `XGrapPointer' would have to be used instead.
674 2) Even if so, this would not help too much, since the text area 679 2) Even if so, this would not help too much, since the text area
675 of the TEWidget is normally not identical with it's bounds. 680 of the TEWidget is normally not identical with it's bounds.
676 681
677 The disadvantage of the current handling is, that the mouse can visibly 682 The disadvantage of the current handling is, that the mouse can visibly
678 leave the bounds of the widget and is then moved back. Because of the 683 leave the bounds of the widget and is then moved back. Because of the
679 current construction, and the reasons mentioned above, we cannot do better 684 current construction, and the reasons mentioned above, we cannot do better
680 without changing the overall construction. 685 without changing the overall construction.
681*/ 686*/
682 687
683/*! 688/*!
684*/ 689*/
685 690
686void TEWidget::mousePressEvent(QMouseEvent* ev) 691void TEWidget::mousePressEvent(QMouseEvent* ev)
687{ 692{
688//printf("press [%d,%d] %d\n",ev->x()/font_w,ev->y()/font_h,ev->button()); 693//printf("press [%d,%d] %d\n",ev->x()/font_w,ev->y()/font_h,ev->button());
689 if ( !contentsRect().contains(ev->pos()) ) return; 694 if ( !contentsRect().contains(ev->pos()) ) return;
690 QPoint tL = contentsRect().topLeft(); 695 QPoint tL = contentsRect().topLeft();
691 int tLx = tL.x(); 696 int tLx = tL.x();
692 int tLy = tL.y(); 697 int tLy = tL.y();
693 698
694 word_selection_mode = FALSE; 699 word_selection_mode = FALSE;
695 700
696//printf("press top left [%d,%d] by=%d\n",tLx,tLy, bY); 701//printf("press top left [%d,%d] by=%d\n",tLx,tLy, bY);
697 if ( ev->button() == LeftButton) 702 if ( ev->button() == LeftButton)
698 { 703 {
699 QPoint pos = QPoint((ev->x()-tLx-blX)/font_w,(ev->y()-tLy-bY)/font_h); 704 QPoint pos = QPoint((ev->x()-tLx-blX)/font_w,(ev->y()-tLy-bY)/font_h);
700 705
701 if ( ev->state() & ControlButton ) preserve_line_breaks = FALSE ; 706 if ( ev->state() & ControlButton ) preserve_line_breaks = FALSE ;
702 707
703 if (mouse_marks || (ev->state() & ShiftButton)) 708 if (mouse_marks || (ev->state() & ShiftButton))
704 { 709 {
705 emit clearSelectionSignal(); 710 emit clearSelectionSignal();
706 iPntSel = pntSel = pos; 711 iPntSel = pntSel = pos;
707 actSel = 1; // left mouse button pressed but nothing selected yet. 712 actSel = 1; // left mouse button pressed but nothing selected yet.
708 grabMouse( /*crossCursor*/ ); // handle with care! 713 grabMouse( /*crossCursor*/ ); // handle with care!
709 } 714 }
710 else 715 else
711 { 716 {
712 emit mouseSignal( 0, pos.x() + 1, pos.y() + 1 ); // left button 717 emit mouseSignal( 0, pos.x() + 1, pos.y() + 1 ); // left button
713 } 718 }
714 } 719 }
715 if ( ev->button() == MidButton ) 720 if ( ev->button() == MidButton )
716 { 721 {
717 emitSelection(); 722 emitSelection();
718 } 723 }
719 if ( ev->button() == RightButton ) // Configure 724 if ( ev->button() == RightButton ) // Configure
720 { 725 {
721 emit configureRequest( this, ev->state()&(ShiftButton|ControlButton), ev->x(), ev->y() ); 726 emit configureRequest( this, ev->state()&(ShiftButton|ControlButton), ev->x(), ev->y() );
722 } 727 }
723} 728}
724 729
725void TEWidget::mouseMoveEvent(QMouseEvent* ev) 730void TEWidget::mouseMoveEvent(QMouseEvent* ev)
726{ 731{
727 // for auto-hiding the cursor, we need mouseTracking 732 // for auto-hiding the cursor, we need mouseTracking
728 if (ev->state() == NoButton ) return; 733 if (ev->state() == NoButton ) return;
729 734
730 if (actSel == 0) return; 735 if (actSel == 0) return;
731 736
732 // don't extend selection while pasting 737 // don't extend selection while pasting
733 if (ev->state() & MidButton) return; 738 if (ev->state() & MidButton) return;
734 739
735 //if ( !contentsRect().contains(ev->pos()) ) return; 740 //if ( !contentsRect().contains(ev->pos()) ) return;
736 QPoint tL = contentsRect().topLeft(); 741 QPoint tL = contentsRect().topLeft();
737 int tLx = tL.x(); 742 int tLx = tL.x();
738 int tLy = tL.y(); 743 int tLy = tL.y();
739 int scroll = scrollbar->value(); 744 int scroll = scrollbar->value();
740 745
741 // we're in the process of moving the mouse with the left button pressed 746 // we're in the process of moving the mouse with the left button pressed
742 // the mouse cursor will kept catched within the bounds of the text in 747 // the mouse cursor will kept catched within the bounds of the text in
743 // this widget. 748 // this widget.
744 749
745 // Adjust position within text area bounds. See FIXME above. 750 // Adjust position within text area bounds. See FIXME above.
746 QPoint pos = ev->pos(); 751 QPoint pos = ev->pos();
747 if ( pos.x() < tLx+blX ) pos.setX( tLx+blX ); 752 if ( pos.x() < tLx+blX ) pos.setX( tLx+blX );
748 if ( pos.x() > tLx+blX+columns*font_w-1 ) pos.setX( tLx+blX+columns*font_w ); 753 if ( pos.x() > tLx+blX+columns*font_w-1 ) pos.setX( tLx+blX+columns*font_w );
749 if ( pos.y() < tLy+bY ) pos.setY( tLy+bY ); 754 if ( pos.y() < tLy+bY ) pos.setY( tLy+bY );
750 if ( pos.y() > tLy+bY+lines*font_h-1 ) pos.setY( tLy+bY+lines*font_h-1 ); 755 if ( pos.y() > tLy+bY+lines*font_h-1 ) pos.setY( tLy+bY+lines*font_h-1 );
751 // check if we produce a mouse move event by this 756 // check if we produce a mouse move event by this
752 if ( pos != ev->pos() ) cursor().setPos(mapToGlobal(pos)); 757 if ( pos != ev->pos() ) cursor().setPos(mapToGlobal(pos));
753 758
754 if ( pos.y() == tLy+bY+lines*font_h-1 ) 759 if ( pos.y() == tLy+bY+lines*font_h-1 )
755 { 760 {
756 scrollbar->setValue(scrollbar->value()+yMouseScroll); // scrollforward 761 scrollbar->setValue(scrollbar->value()+yMouseScroll); // scrollforward
757 } 762 }
758 if ( pos.y() == tLy+bY ) 763 if ( pos.y() == tLy+bY )
759 { 764 {
760 scrollbar->setValue(scrollbar->value()-yMouseScroll); // scrollback 765 scrollbar->setValue(scrollbar->value()-yMouseScroll); // scrollback
761 } 766 }
762 767
763 QPoint here = QPoint((pos.x()-tLx-blX)/font_w,(pos.y()-tLy-bY)/font_h); 768 QPoint here = QPoint((pos.x()-tLx-blX)/font_w,(pos.y()-tLy-bY)/font_h);
764 QPoint ohere; 769 QPoint ohere;
765 bool swapping = FALSE; 770 bool swapping = FALSE;
766 771
767 if ( word_selection_mode ) 772 if ( word_selection_mode )
768 { 773 {
769 // Extend to word boundaries 774 // Extend to word boundaries
770 int i; 775 int i;
771 int selClass; 776 int selClass;
772 777
773 bool left_not_right = ( here.y() < iPntSel.y() || 778 bool left_not_right = ( here.y() < iPntSel.y() ||
774 here.y() == iPntSel.y() && here.x() < iPntSel.x() ); 779 here.y() == iPntSel.y() && here.x() < iPntSel.x() );
775 bool old_left_not_right = ( pntSel.y() < iPntSel.y() || 780 bool old_left_not_right = ( pntSel.y() < iPntSel.y() ||
776 pntSel.y() == iPntSel.y() && pntSel.x() < iPntSel.x() ); 781 pntSel.y() == iPntSel.y() && pntSel.x() < iPntSel.x() );
777 swapping = left_not_right != old_left_not_right; 782 swapping = left_not_right != old_left_not_right;
778 783
779 // Find left (left_not_right ? from here : from start) 784 // Find left (left_not_right ? from here : from start)
780 QPoint left = left_not_right ? here : iPntSel; 785 QPoint left = left_not_right ? here : iPntSel;
781 i = loc(left.x(),left.y()); 786 i = loc(left.x(),left.y());
782 selClass = charClass(image[i].c); 787 selClass = charClass(image[i].c);
783 while ( left.x() > 0 && charClass(image[i-1].c) == selClass ) 788 while ( left.x() > 0 && charClass(image[i-1].c) == selClass )
784 { i--; left.rx()--; } 789 { i--; left.rx()--; }
785 790
786 // Find left (left_not_right ? from start : from here) 791 // Find left (left_not_right ? from start : from here)
787 QPoint right = left_not_right ? iPntSel : here; 792 QPoint right = left_not_right ? iPntSel : here;
788 i = loc(right.x(),right.y()); 793 i = loc(right.x(),right.y());
789 selClass = charClass(image[i].c); 794 selClass = charClass(image[i].c);
790 while ( right.x() < columns-1 && charClass(image[i+1].c) == selClass ) 795 while ( right.x() < columns-1 && charClass(image[i+1].c) == selClass )
791 { i++; right.rx()++; } 796 { i++; right.rx()++; }
792 797
793 // Pick which is start (ohere) and which is extension (here) 798 // Pick which is start (ohere) and which is extension (here)
794 if ( left_not_right ) 799 if ( left_not_right )
795 { 800 {
796 here = left; ohere = right; 801 here = left; ohere = right;
797 } 802 }
798 else 803 else
799 { 804 {
800 here = right; ohere = left; 805 here = right; ohere = left;
801 } 806 }
802 } 807 }
803 808
804 if (here == pntSel && scroll == scrollbar->value()) return; // not moved 809 if (here == pntSel && scroll == scrollbar->value()) return; // not moved
805 810
806 if ( word_selection_mode ) { 811 if ( word_selection_mode ) {
807 if ( actSel < 2 || swapping ) { 812 if ( actSel < 2 || swapping ) {
808 emit beginSelectionSignal( ohere.x(), ohere.y() ); 813 emit beginSelectionSignal( ohere.x(), ohere.y() );
809 } 814 }
810 } else if ( actSel < 2 ) { 815 } else if ( actSel < 2 ) {
811 emit beginSelectionSignal( pntSel.x(), pntSel.y() ); 816 emit beginSelectionSignal( pntSel.x(), pntSel.y() );
812 } 817 }
813 818
814 actSel = 2; // within selection 819 actSel = 2; // within selection
815 pntSel = here; 820 pntSel = here;
816 emit extendSelectionSignal( here.x(), here.y() ); 821 emit extendSelectionSignal( here.x(), here.y() );
817} 822}
818 823
819void TEWidget::mouseReleaseEvent(QMouseEvent* ev) 824void TEWidget::mouseReleaseEvent(QMouseEvent* ev)
820{ 825{
821//printf("release [%d,%d] %d\n",ev->x()/font_w,ev->y()/font_h,ev->button()); 826//printf("release [%d,%d] %d\n",ev->x()/font_w,ev->y()/font_h,ev->button());
822 if ( ev->button() == LeftButton) 827 if ( ev->button() == LeftButton)
823 { 828 {
824 if ( actSel > 1 ) emit endSelectionSignal(preserve_line_breaks); 829 if ( actSel > 1 ) emit endSelectionSignal(preserve_line_breaks);
825 preserve_line_breaks = TRUE; 830 preserve_line_breaks = TRUE;
826 actSel = 0; 831 actSel = 0;
827 832
828 //FIXME: emits a release event even if the mouse is 833 //FIXME: emits a release event even if the mouse is
829 // outside the range. The procedure used in `mouseMoveEvent' 834 // outside the range. The procedure used in `mouseMoveEvent'
830 // applies here, too. 835 // applies here, too.
831 836
832 QPoint tL = contentsRect().topLeft(); 837 QPoint tL = contentsRect().topLeft();
833 int tLx = tL.x(); 838 int tLx = tL.x();
834 int tLy = tL.y(); 839 int tLy = tL.y();
835 840
836 if (!mouse_marks && !(ev->state() & ShiftButton)) 841 if (!mouse_marks && !(ev->state() & ShiftButton))
837 emit mouseSignal( 3, // release 842 emit mouseSignal( 3, // release
838 (ev->x()-tLx-blX)/font_w + 1, 843 (ev->x()-tLx-blX)/font_w + 1,
839 (ev->y()-tLy-bY)/font_h + 1 ); 844 (ev->y()-tLy-bY)/font_h + 1 );
840 releaseMouse(); 845 releaseMouse();
841 } 846 }
842} 847}
843 848
844void TEWidget::mouseDoubleClickEvent(QMouseEvent* ev) 849void TEWidget::mouseDoubleClickEvent(QMouseEvent* ev)
845{ 850{
846 if ( ev->button() != LeftButton) return; 851 if ( ev->button() != LeftButton) return;
847 852
848 QPoint tL = contentsRect().topLeft(); 853 QPoint tL = contentsRect().topLeft();
849 int tLx = tL.x(); 854 int tLx = tL.x();
850 int tLy = tL.y(); 855 int tLy = tL.y();
851 QPoint pos = QPoint((ev->x()-tLx-blX)/font_w,(ev->y()-tLy-bY)/font_h); 856 QPoint pos = QPoint((ev->x()-tLx-blX)/font_w,(ev->y()-tLy-bY)/font_h);
852 857
853 // pass on double click as two clicks. 858 // pass on double click as two clicks.
854 if (!mouse_marks && !(ev->state() & ShiftButton)) 859 if (!mouse_marks && !(ev->state() & ShiftButton))
855 { 860 {
856 emit mouseSignal( 0, pos.x()+1, pos.y()+1 ); // left button 861 emit mouseSignal( 0, pos.x()+1, pos.y()+1 ); // left button
857 emit mouseSignal( 3, pos.x()+1, pos.y()+1 ); // release 862 emit mouseSignal( 3, pos.x()+1, pos.y()+1 ); // release
858 emit mouseSignal( 0, pos.x()+1, pos.y()+1 ); // left button 863 emit mouseSignal( 0, pos.x()+1, pos.y()+1 ); // left button
859 return; 864 return;
860 } 865 }
861 866
862 867
863 emit clearSelectionSignal(); 868 emit clearSelectionSignal();
864 QPoint bgnSel = pos; 869 QPoint bgnSel = pos;
865 QPoint endSel = QPoint((ev->x()-tLx-blX)/font_w,(ev->y()-tLy-bY)/font_h); 870 QPoint endSel = QPoint((ev->x()-tLx-blX)/font_w,(ev->y()-tLy-bY)/font_h);
866 int i = loc(bgnSel.x(),bgnSel.y()); 871 int i = loc(bgnSel.x(),bgnSel.y());
867 iPntSel = bgnSel; 872 iPntSel = bgnSel;
868 873
869 word_selection_mode = TRUE; 874 word_selection_mode = TRUE;
870 875
871 // find word boundaries... 876 // find word boundaries...
872 int selClass = charClass(image[i].c); 877 int selClass = charClass(image[i].c);
873 { 878 {
874 // set the start... 879 // set the start...
875 int x = bgnSel.x(); 880 int x = bgnSel.x();
876 while ( x > 0 && charClass(image[i-1].c) == selClass ) 881 while ( x > 0 && charClass(image[i-1].c) == selClass )
877 { i--; x--; } 882 { i--; x--; }
878 bgnSel.setX(x); 883 bgnSel.setX(x);
879 emit beginSelectionSignal( bgnSel.x(), bgnSel.y() ); 884 emit beginSelectionSignal( bgnSel.x(), bgnSel.y() );
880 885
881 // set the end... 886 // set the end...
882 i = loc( endSel.x(), endSel.y() ); 887 i = loc( endSel.x(), endSel.y() );
883 x = endSel.x(); 888 x = endSel.x();
884 while( x < columns-1 && charClass(image[i+1].c) == selClass ) 889 while( x < columns-1 && charClass(image[i+1].c) == selClass )
885 { i++; x++ ; } 890 { i++; x++ ; }
886 endSel.setX(x); 891 endSel.setX(x);
887 actSel = 2; // within selection 892 actSel = 2; // within selection
888 emit extendSelectionSignal( endSel.x(), endSel.y() ); 893 emit extendSelectionSignal( endSel.x(), endSel.y() );
889 emit endSelectionSignal(preserve_line_breaks); 894 emit endSelectionSignal(preserve_line_breaks);
890 preserve_line_breaks = TRUE; 895 preserve_line_breaks = TRUE;
891 } 896 }
892} 897}
893 898
894void TEWidget::focusInEvent( QFocusEvent * ) 899void TEWidget::focusInEvent( QFocusEvent * )
895{ 900{
896 901
897 // do nothing, to prevent repainting 902 // do nothing, to prevent repainting
898} 903}
899 904
900 905
901void TEWidget::focusOutEvent( QFocusEvent * ) 906void TEWidget::focusOutEvent( QFocusEvent * )
902{ 907{
903 // do nothing, to prevent repainting 908 // do nothing, to prevent repainting
904} 909}
905 910
906bool TEWidget::focusNextPrevChild( bool next ) 911bool TEWidget::focusNextPrevChild( bool next )
907{ 912{
908 if (next) 913 if (next)
909 return false; // This disables changing the active part in konqueror 914 return false; // This disables changing the active part in konqueror
910 // when pressing Tab 915 // when pressing Tab
911 return QFrame::focusNextPrevChild( next ); 916 return QFrame::focusNextPrevChild( next );
912} 917}
913 918
914 919
915int TEWidget::charClass(char ch) const 920int TEWidget::charClass(char ch) const
916{ 921{
917 // This might seem like overkill, but imagine if ch was a Unicode 922 // This might seem like overkill, but imagine if ch was a Unicode
918 // character (Qt 2.0 QChar) - it might then be sensible to separate 923 // character (Qt 2.0 QChar) - it might then be sensible to separate
919 // the different language ranges, etc. 924 // the different language ranges, etc.
920 925
921 if ( isspace(ch) ) return ' '; 926 if ( isspace(ch) ) return ' ';
922 927
923 static const char *word_characters = ":@-./_~"; 928 static const char *word_characters = ":@-./_~";
924 if ( isalnum(ch) || strchr(word_characters, ch) ) 929 if ( isalnum(ch) || strchr(word_characters, ch) )
925 return 'a'; 930 return 'a';
926 931
927 // Everything else is weird 932 // Everything else is weird
928 return 1; 933 return 1;
929} 934}
930 935
931void TEWidget::setMouseMarks(bool on) 936void TEWidget::setMouseMarks(bool on)
932{ 937{
933 mouse_marks = on; 938 mouse_marks = on;
934 setCursor( mouse_marks ? ibeamCursor : arrowCursor ); 939 setCursor( mouse_marks ? ibeamCursor : arrowCursor );
935} 940}
936 941
937/* ------------------------------------------------------------------------- */ 942/* ------------------------------------------------------------------------- */
938/* */ 943/* */
939/* Clipboard */ 944/* Clipboard */
940/* */ 945/* */
941/* ------------------------------------------------------------------------- */ 946/* ------------------------------------------------------------------------- */
942 947
943#undef KeyPress 948#undef KeyPress
944 949
945void TEWidget::emitSelection() 950void TEWidget::emitSelection()
946// Paste Clipboard by simulating keypress events 951// Paste Clipboard by simulating keypress events
947{ 952{
948#ifndef QT_NO_CLIPBOARD 953#ifndef QT_NO_CLIPBOARD
949 QString text = QApplication::clipboard()->text(); 954 QString text = QApplication::clipboard()->text();
950 if ( ! text.isNull() ) 955 if ( ! text.isNull() )
951 { 956 {
952 text.replace(QRegExp("\n"), "\r"); 957 text.replace(QRegExp("\n"), "\r");
953 QKeyEvent e(QEvent::KeyPress, 0, -1, 0, text); 958 QKeyEvent e(QEvent::KeyPress, 0, -1, 0, text);
954 emit keyPressedSignal(&e); // expose as a big fat keypress event 959 emit keyPressedSignal(&e); // expose as a big fat keypress event
955 emit clearSelectionSignal(); 960 emit clearSelectionSignal();
956 } 961 }
957#endif 962#endif
958} 963}
959 964
960void TEWidget::emitText(QString text) 965void TEWidget::emitText(QString text)
961{ 966{
962 QKeyEvent e(QEvent::KeyPress, 0, -1, 0, text); 967 QKeyEvent e(QEvent::KeyPress, 0, -1, 0, text);
963 emit keyPressedSignal(&e); // expose as a big fat keypress event 968 emit keyPressedSignal(&e); // expose as a big fat keypress event
964} 969}
965 970
966void TEWidget::pasteClipboard( ) 971void TEWidget::pasteClipboard( )
967{ 972{
968 emitSelection(); 973 emitSelection();
969} 974}
970 975
971void TEWidget::setSelection(const QString& t) 976void TEWidget::setSelection(const QString& t)
972{ 977{
973#ifndef QT_NO_CLIPBOARD 978#ifndef QT_NO_CLIPBOARD
974 // Disconnect signal while WE set the clipboard 979 // Disconnect signal while WE set the clipboard
975 QObject *cb = QApplication::clipboard(); 980 QObject *cb = QApplication::clipboard();
976 QObject::disconnect( cb, SIGNAL(dataChanged()), 981 QObject::disconnect( cb, SIGNAL(dataChanged()),
977 this, SLOT(onClearSelection()) ); 982 this, SLOT(onClearSelection()) );
978 983
979 QApplication::clipboard()->setText(t); 984 QApplication::clipboard()->setText(t);
980 985
981 QObject::connect( cb, SIGNAL(dataChanged()), 986 QObject::connect( cb, SIGNAL(dataChanged()),
982 this, SLOT(onClearSelection()) ); 987 this, SLOT(onClearSelection()) );
983#endif 988#endif
984} 989}
985 990
986void TEWidget::onClearSelection() 991void TEWidget::onClearSelection()
987{ 992{
988 emit clearSelectionSignal(); 993 emit clearSelectionSignal();
989} 994}
990 995
991/* ------------------------------------------------------------------------- */ 996/* ------------------------------------------------------------------------- */
992/* */ 997/* */
993/* Keyboard */ 998/* Keyboard */
994/* */ 999/* */
995/* ------------------------------------------------------------------------- */ 1000/* ------------------------------------------------------------------------- */
996 1001
997//FIXME: an `eventFilter' has been installed instead of a `keyPressEvent' 1002//FIXME: an `eventFilter' has been installed instead of a `keyPressEvent'
998// due to a bug in `QT' or the ignorance of the author to prevent 1003// due to a bug in `QT' or the ignorance of the author to prevent
999// repaint events being emitted to the screen whenever one leaves 1004// repaint events being emitted to the screen whenever one leaves
1000// or reenters the screen to/from another application. 1005// or reenters the screen to/from another application.
1001// 1006//
1002// Troll says one needs to change focusInEvent() and focusOutEvent(), 1007// Troll says one needs to change focusInEvent() and focusOutEvent(),
1003// which would also let you have an in-focus cursor and an out-focus 1008// which would also let you have an in-focus cursor and an out-focus
1004// cursor like xterm does. 1009// cursor like xterm does.
1005 1010
1006// for the auto-hide cursor feature, I added empty focusInEvent() and 1011// for the auto-hide cursor feature, I added empty focusInEvent() and
1007// focusOutEvent() so that update() isn't called. 1012// focusOutEvent() so that update() isn't called.
1008// For auto-hide, we need to get keypress-events, but we only get them when 1013// For auto-hide, we need to get keypress-events, but we only get them when
1009// we have focus. 1014// we have focus.
1010 1015
1011void TEWidget::doScroll(int lines) 1016void TEWidget::doScroll(int lines)
1012{ 1017{
1013 scrollbar->setValue(scrollbar->value()+lines); 1018 scrollbar->setValue(scrollbar->value()+lines);
1014} 1019}
1015 1020
1016bool TEWidget::eventFilter( QObject *obj, QEvent *e ) 1021bool TEWidget::eventFilter( QObject *obj, QEvent *e )
1017{ 1022{
1018 if ( (e->type() == QEvent::Accel || 1023 if ( (e->type() == QEvent::Accel ||
1019 e->type() == QEvent::AccelAvailable ) && qApp->focusWidget() == this ) { 1024 e->type() == QEvent::AccelAvailable ) && qApp->focusWidget() == this ) {
1020 static_cast<QKeyEvent *>( e )->ignore(); 1025 static_cast<QKeyEvent *>( e )->ignore();
1021 return true; 1026 return true;
1022 } 1027 }
1023 if ( obj != this /* when embedded */ && obj != parent() /* when standalone */ ) 1028 if ( obj != this /* when embedded */ && obj != parent() /* when standalone */ )
1024 return FALSE; // not us 1029 return FALSE; // not us
1025 if ( e->type() == QEvent::Wheel) { 1030 if ( e->type() == QEvent::Wheel) {
1026 QApplication::sendEvent(scrollbar, e); 1031 QApplication::sendEvent(scrollbar, e);
1027 } 1032 }
1028 1033
1029#ifdef FAKE_CTRL_AND_ALT 1034#ifdef FAKE_CTRL_AND_ALT
1030 static bool control = FALSE; 1035 static bool control = FALSE;
1031 static bool alt = FALSE; 1036 static bool alt = FALSE;
1032 bool dele=FALSE; 1037 bool dele=FALSE;
1033 if ( e->type() == QEvent::KeyPress || e->type() == QEvent::KeyRelease ) { 1038 if ( e->type() == QEvent::KeyPress || e->type() == QEvent::KeyRelease ) {
1034 QKeyEvent* ke = (QKeyEvent*)e; 1039 QKeyEvent* ke = (QKeyEvent*)e;
1035 bool keydown = e->type() == QEvent::KeyPress || ke->isAutoRepeat(); 1040 bool keydown = e->type() == QEvent::KeyPress || ke->isAutoRepeat();
1036 switch (ke->key()) { 1041 switch (ke->key()) {
1037 case Key_F9: // let this be "Control" 1042 case Key_F9: // let this be "Control"
1038 control = keydown; 1043 control = keydown;
1039 e = new QKeyEvent(QEvent::KeyPress, Key_Control, 0, ke->state()); 1044 e = new QKeyEvent(QEvent::KeyPress, Key_Control, 0, ke->state());
1040 dele=TRUE; 1045 dele=TRUE;
1041 break; 1046 break;
1042 case Key_F13: // let this be "Alt" 1047 case Key_F13: // let this be "Alt"
1043 alt = keydown; 1048 alt = keydown;
1044 e = new QKeyEvent(QEvent::KeyPress, Key_Alt, 0, ke->state()); 1049 e = new QKeyEvent(QEvent::KeyPress, Key_Alt, 0, ke->state());
1045 dele=TRUE; 1050 dele=TRUE;
1046 break; 1051 break;
1047 default: 1052 default:
1048 if ( control ) { 1053 if ( control ) {
1049 int a = toupper(ke->ascii())-64; 1054 int a = toupper(ke->ascii())-64;
1050 if ( a >= 0 && a < ' ' ) { 1055 if ( a >= 0 && a < ' ' ) {
1051 e = new QKeyEvent(e->type(), ke->key(), 1056 e = new QKeyEvent(e->type(), ke->key(),
1052 a, ke->state()|ControlButton, QChar(a,0)); 1057 a, ke->state()|ControlButton, QChar(a,0));
1053 dele=TRUE; 1058 dele=TRUE;
1054 } 1059 }
1055 } 1060 }
1056 if ( alt ) { 1061 if ( alt ) {
1057 e = new QKeyEvent(e->type(), ke->key(), 1062 e = new QKeyEvent(e->type(), ke->key(),
1058 ke->ascii(), ke->state()|AltButton, ke->text()); 1063 ke->ascii(), ke->state()|AltButton, ke->text());
1059 dele=TRUE; 1064 dele=TRUE;
1060 } 1065 }
1061 } 1066 }
1062 } 1067 }
1063#endif 1068#endif
1064 1069
1065 if ( e->type() == QEvent::KeyPress ) { 1070 if ( e->type() == QEvent::KeyPress ) {
1066 QKeyEvent* ke = (QKeyEvent*)e; 1071 QKeyEvent* ke = (QKeyEvent*)e;
1067 actSel=0; // Key stroke implies a screen update, so TEWidget won't 1072 actSel=0; // Key stroke implies a screen update, so TEWidget won't
1068 // know where the current selection is. 1073 // know where the current selection is.
1069 1074
1070 1075
1071 if( ke->state() == ShiftButton && ke->key() == Key_Tab) { //lets hardcode this sucker 1076 if( ke->state() == ShiftButton && ke->key() == Key_Tab) { //lets hardcode this sucker
1072 emitText("\\"); // expose 1077 emitText("\\"); // expose
1073 } else 1078 } else
1074 emit keyPressedSignal(ke); // expose 1079 emit keyPressedSignal(ke); // expose
1075 ke->accept(); 1080 ke->accept();
1076#ifdef FAKE_CTRL_AND_ALT 1081#ifdef FAKE_CTRL_AND_ALT
1077 if ( dele ) delete e; 1082 if ( dele ) delete e;
1078#endif 1083#endif
1079 return true; // stop the event 1084 return true; // stop the event
1080 } 1085 }
1081 if ( e->type() == QEvent::Enter ) { 1086 if ( e->type() == QEvent::Enter ) {
1082 QObject::disconnect( (QObject*)cb, SIGNAL(dataChanged()), 1087 QObject::disconnect( (QObject*)cb, SIGNAL(dataChanged()),
1083 this, SLOT(onClearSelection()) ); 1088 this, SLOT(onClearSelection()) );
1084 } 1089 }
1085 if ( e->type() == QEvent::Leave ) { 1090 if ( e->type() == QEvent::Leave ) {
1086 QObject::connect( (QObject*)cb, SIGNAL(dataChanged()), 1091 QObject::connect( (QObject*)cb, SIGNAL(dataChanged()),
1087 this, SLOT(onClearSelection()) ); 1092 this, SLOT(onClearSelection()) );
1088 } 1093 }
1089 return QFrame::eventFilter( obj, e ); 1094 return QFrame::eventFilter( obj, e );
1090} 1095}
1091 1096
1092/* ------------------------------------------------------------------------- */ 1097/* ------------------------------------------------------------------------- */
1093/* */ 1098/* */
1094/* Frame */ 1099/* Frame */
1095/* */ 1100/* */
1096/* ------------------------------------------------------------------------- */ 1101/* ------------------------------------------------------------------------- */
1097 1102
1098void TEWidget::frameChanged() 1103void TEWidget::frameChanged()
1099{ 1104{
1100 propagateSize(); 1105 propagateSize();