author | hrw <hrw> | 2005-10-18 13:56:12 (UTC) |
---|---|---|
committer | hrw <hrw> | 2005-10-18 13:56:12 (UTC) |
commit | 0f25331618ea6cac8a59f2c2298a9e1684748b97 (patch) (unidiff) | |
tree | eb734f970761359b4fd61166936b87550e2e1b2d | |
parent | 9f41cd10ef92daa889f86cb43793dc75de18e786 (diff) | |
download | opie-0f25331618ea6cac8a59f2c2298a9e1684748b97.zip opie-0f25331618ea6cac8a59f2c2298a9e1684748b97.tar.gz opie-0f25331618ea6cac8a59f2c2298a9e1684748b97.tar.bz2 |
fixed bug #1647 - Opie-console doesn't respect scroll-bar on left side
-rw-r--r-- | ChangeLog | 1 | ||||
-rw-r--r-- | noncore/apps/opie-console/TEWidget.cpp | 25 |
2 files changed, 16 insertions, 10 deletions
@@ -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 */ |
89 | namespace { | 89 | namespace { |
90 | static char * menu_xpm[] = { | 90 | static 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. |
121 | static const ColorEntry base_color_table[TABLE_COLORS] = | 121 | static 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 | ||
149 | QColor TEWidget::getDefaultBackColor() | 149 | QColor TEWidget::getDefaultBackColor() |
150 | { | 150 | { |
151 | return color_table[DEFAULT_BACK_COLOR].color; | 151 | return color_table[DEFAULT_BACK_COLOR].color; |
152 | } | 152 | } |
153 | 153 | ||
154 | const ColorEntry* TEWidget::getColorTable() const | 154 | const ColorEntry* TEWidget::getColorTable() const |
155 | { | 155 | { |
156 | return color_table; | 156 | return color_table; |
157 | } | 157 | } |
158 | 158 | ||
159 | const ColorEntry* TEWidget::getdefaultColorTable() const | 159 | const ColorEntry* TEWidget::getdefaultColorTable() const |
160 | { | 160 | { |
161 | return base_color_table; | 161 | return base_color_table; |
162 | } | 162 | } |
163 | 163 | ||
164 | 164 | ||
165 | const QPixmap *TEWidget::backgroundPixmap() | 165 | const 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 | ||
172 | void TEWidget::setColorTable(const ColorEntry table[]) | 172 | void 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 | ||
203 | unsigned short vt100_graphics[32] = | 203 | unsigned 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 | ||
211 | static QChar vt100extended(QChar c) | 211 | static 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 | ||
250 | static QChar identicalMap(QChar c) | 250 | static QChar identicalMap(QChar c) |
251 | { | 251 | { |
252 | return c; | 252 | return c; |
253 | } | 253 | } |
254 | 254 | ||
255 | void TEWidget::fontChange(const QFont &) | 255 | void 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 | ||
277 | void TEWidget::setVTFont(const QFont& f) | 277 | void TEWidget::setVTFont(const QFont& f) |
278 | { | 278 | { |
279 | QFrame::setFont(f); | 279 | QFrame::setFont(f); |
280 | } | 280 | } |
281 | 281 | ||
282 | QFont TEWidget::getVTFont() { | 282 | QFont TEWidget::getVTFont() { |
283 | return font(); | 283 | return font(); |
284 | } | 284 | } |
285 | 285 | ||
286 | void TEWidget::setFont(const QFont &) | 286 | void 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 | ||
299 | TEWidget::TEWidget(QWidget *parent, const char *name) : QFrame(parent,name) | 299 | TEWidget::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) |
374 | TEWidget::~TEWidget() | 379 | TEWidget::~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 | ||
390 | void TEWidget::drawAttrStr(QPainter &paint, QRect rect, | 395 | void 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 | ||
426 | void TEWidget::setImage(const ca* const newimg, int lines, int columns) | 431 | void 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 ); |
432 | HCNT("setImage"); | 437 | HCNT("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 | ||
497 | void TEWidget::paintEvent( QPaintEvent* pe ) | 502 | void 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 ); |
506 | HCNT("paintEvent"); | 511 | HCNT("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 | ||
563 | void TEWidget::blinkEvent() | 568 | void 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 | ||
575 | void TEWidget::resizeEvent(QResizeEvent* ev) | 580 | void 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()); |
581 | HCNT("resizeEvent"); | 586 | HCNT("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 | ||
591 | void TEWidget::propagateSize() | 596 | void 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 | ||
624 | void TEWidget::scrollChanged(int) | 629 | void TEWidget::scrollChanged(int) |
625 | { | 630 | { |
626 | emit changedHistoryCursor(scrollbar->value()); //expose | 631 | emit changedHistoryCursor(scrollbar->value()); //expose |
627 | } | 632 | } |
628 | 633 | ||
629 | void TEWidget::hscrollChanged(int loc) | 634 | void TEWidget::hscrollChanged(int loc) |
630 | { | 635 | { |
631 | hposition = loc; | 636 | hposition = loc; |
632 | propagateSize(); | 637 | propagateSize(); |
633 | update(); | 638 | update(); |
634 | } | 639 | } |
635 | 640 | ||
636 | void TEWidget::setScroll(int cursor, int slines) | 641 | void 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 | ||
645 | void TEWidget::setScrollbarLocation(int loc) | 650 | void 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 | ||
686 | void TEWidget::mousePressEvent(QMouseEvent* ev) | 691 | void 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 | ||
725 | void TEWidget::mouseMoveEvent(QMouseEvent* ev) | 730 | void 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 | ||
819 | void TEWidget::mouseReleaseEvent(QMouseEvent* ev) | 824 | void 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 | ||
844 | void TEWidget::mouseDoubleClickEvent(QMouseEvent* ev) | 849 | void 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 | ||
894 | void TEWidget::focusInEvent( QFocusEvent * ) | 899 | void 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 | ||
901 | void TEWidget::focusOutEvent( QFocusEvent * ) | 906 | void TEWidget::focusOutEvent( QFocusEvent * ) |
902 | { | 907 | { |
903 | // do nothing, to prevent repainting | 908 | // do nothing, to prevent repainting |
904 | } | 909 | } |
905 | 910 | ||
906 | bool TEWidget::focusNextPrevChild( bool next ) | 911 | bool 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 | ||
915 | int TEWidget::charClass(char ch) const | 920 | int 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 | ||
931 | void TEWidget::setMouseMarks(bool on) | 936 | void 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 | ||
945 | void TEWidget::emitSelection() | 950 | void 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 | ||
960 | void TEWidget::emitText(QString text) | 965 | void 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 | ||
966 | void TEWidget::pasteClipboard( ) | 971 | void TEWidget::pasteClipboard( ) |
967 | { | 972 | { |
968 | emitSelection(); | 973 | emitSelection(); |
969 | } | 974 | } |
970 | 975 | ||
971 | void TEWidget::setSelection(const QString& t) | 976 | void 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 | ||
986 | void TEWidget::onClearSelection() | 991 | void 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 | ||
1011 | void TEWidget::doScroll(int lines) | 1016 | void TEWidget::doScroll(int lines) |
1012 | { | 1017 | { |
1013 | scrollbar->setValue(scrollbar->value()+lines); | 1018 | scrollbar->setValue(scrollbar->value()+lines); |
1014 | } | 1019 | } |
1015 | 1020 | ||
1016 | bool TEWidget::eventFilter( QObject *obj, QEvent *e ) | 1021 | bool 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 | ||
1098 | void TEWidget::frameChanged() | 1103 | void TEWidget::frameChanged() |
1099 | { | 1104 | { |
1100 | propagateSize(); | 1105 | propagateSize(); |