summaryrefslogtreecommitdiff
path: root/inputmethods/multikey
Unidiff
Diffstat (limited to 'inputmethods/multikey') (more/less context) (ignore whitespace changes)
-rw-r--r--inputmethods/multikey/keyboard.cpp1
-rw-r--r--inputmethods/multikey/keyboard.h5
-rw-r--r--inputmethods/multikey/keyboardimpl.cpp4
-rw-r--r--inputmethods/multikey/keyboardimpl.h13
4 files changed, 18 insertions, 5 deletions
diff --git a/inputmethods/multikey/keyboard.cpp b/inputmethods/multikey/keyboard.cpp
index 84c0c74..c22fbb1 100644
--- a/inputmethods/multikey/keyboard.cpp
+++ b/inputmethods/multikey/keyboard.cpp
@@ -1,1659 +1,1660 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved. 2** Copyright (C) 2000 Trolltech AS. All rights reserved.
3** 3**
4** This file is part of Qtopia Environment. 4** This file is part of Qtopia Environment.
5** 5**
6** This file may be distributed and/or modified under the terms of the 6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software 7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the 8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file. 9** packaging of this file.
10** 10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information. 14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15** 15**
16** Contact info@trolltech.com if any conditions of this licensing are 16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 17** not clear to you.
18** 18**
19**********************************************************************/ 19**********************************************************************/
20 20
21#include "keyboard.h" 21#include "keyboard.h"
22#include "configdlg.h" 22#include "configdlg.h"
23 23
24#include <qpe/global.h> 24#include <qpe/global.h>
25#include <qpe/qcopenvelope_qws.h> 25#include <qpe/qcopenvelope_qws.h>
26 26
27#include <qwindowsystem_qws.h> 27#include <qwindowsystem_qws.h>
28#include <qpainter.h> 28#include <qpainter.h>
29#include <qfontmetrics.h> 29#include <qfontmetrics.h>
30#include <qtimer.h> 30#include <qtimer.h>
31#include <qpe/qpeapplication.h> 31#include <qpe/qpeapplication.h>
32#include <qpe/config.h> 32#include <qpe/config.h>
33#include <ctype.h> 33#include <ctype.h>
34#include <qfile.h> 34#include <qfile.h>
35#include <qtextstream.h> 35#include <qtextstream.h>
36#include <qstringlist.h> 36#include <qstringlist.h>
37 37
38#include <sys/utsname.h> 38#include <sys/utsname.h>
39 39
40using namespace MultiKey;
40 41
41/* Keyboard::Keyboard {{{1 */ 42/* Keyboard::Keyboard {{{1 */
42Keyboard::Keyboard(QWidget* parent, const char* _name, WFlags f) : 43Keyboard::Keyboard(QWidget* parent, const char* _name, WFlags f) :
43 QFrame(parent, _name, f), shift(0), lock(0), ctrl(0), alt(0), 44 QFrame(parent, _name, f), shift(0), lock(0), ctrl(0), alt(0),
44 meta(0), circumflex(0), diaeresis(0), baccent(0), accent(0), 45 meta(0), circumflex(0), diaeresis(0), baccent(0), accent(0),
45 useLargeKeys(TRUE), usePicks(0), useRepeat(0), 46 useLargeKeys(TRUE), usePicks(0), useRepeat(0),
46 pressedKeyRow(-1), pressedKeyCol(-1), 47 pressedKeyRow(-1), pressedKeyCol(-1),
47 unicode(-1), qkeycode(0), modifiers(0), schar(0), mchar(0), echar(0), 48 unicode(-1), qkeycode(0), modifiers(0), schar(0), mchar(0), echar(0),
48 configdlg(0) 49 configdlg(0)
49 50
50{ 51{
51 52
52 // get the default font 53 // get the default font
53 Config *config = new Config( "qpe" ); 54 Config *config = new Config( "qpe" );
54 config->setGroup( "Appearance" ); 55 config->setGroup( "Appearance" );
55 QString familyStr = config->readEntry( "FontFamily", "fixed" ); 56 QString familyStr = config->readEntry( "FontFamily", "fixed" );
56 delete config; 57 delete config;
57 58
58 config = new Config("multikey"); 59 config = new Config("multikey");
59 config->setGroup ("general"); 60 config->setGroup ("general");
60 usePicks = config->readBoolEntry ("usePickboard", 0); // default closed 61 usePicks = config->readBoolEntry ("usePickboard", 0); // default closed
61 useRepeat = config->readBoolEntry ("useRepeat", 1); 62 useRepeat = config->readBoolEntry ("useRepeat", 1);
62 delete config; 63 delete config;
63 64
64 65
65 setFont( QFont( familyStr, 10 ) ); 66 setFont( QFont( familyStr, 10 ) );
66 67
67 picks = new KeyboardPicks( this ); 68 picks = new KeyboardPicks( this );
68 picks->setFont( QFont( familyStr, 10 ) ); 69 picks->setFont( QFont( familyStr, 10 ) );
69 picks->initialise(); 70 picks->initialise();
70 if (usePicks) { 71 if (usePicks) {
71 72
72 QObject::connect( picks, SIGNAL(key(ushort,ushort,ushort,bool,bool) ), 73 QObject::connect( picks, SIGNAL(key(ushort,ushort,ushort,bool,bool) ),
73 this, SIGNAL(key(ushort,ushort,ushort,bool,bool)) ); 74 this, SIGNAL(key(ushort,ushort,ushort,bool,bool)) );
74 75
75 } else picks->hide(); 76 } else picks->hide();
76 77
77 loadKeyboardColors(); 78 loadKeyboardColors();
78 79
79 keys = new Keys(); 80 keys = new Keys();
80 81
81 repeatTimer = new QTimer( this ); 82 repeatTimer = new QTimer( this );
82 connect( repeatTimer, SIGNAL(timeout()), this, SLOT(repeat()) ); 83 connect( repeatTimer, SIGNAL(timeout()), this, SLOT(repeat()) );
83 84
84} 85}
85 86
86Keyboard::~Keyboard() { 87Keyboard::~Keyboard() {
87 88
88 if ( configdlg ) { 89 if ( configdlg ) {
89 delete (ConfigDlg *) configdlg; 90 delete (ConfigDlg *) configdlg;
90 configdlg = 0; 91 configdlg = 0;
91 } 92 }
92 93
93} 94}
94 95
95/* Keyboard::resizeEvent {{{1 */ 96/* Keyboard::resizeEvent {{{1 */
96void Keyboard::resizeEvent(QResizeEvent*) 97void Keyboard::resizeEvent(QResizeEvent*)
97{ 98{
98 int ph = picks->sizeHint().height(); 99 int ph = picks->sizeHint().height();
99 picks->setGeometry( 0, 0, width(), ph ); 100 picks->setGeometry( 0, 0, width(), ph );
100 keyHeight = (height()-(usePicks ? ph : 0))/(keys->rows()?keys->rows():1); 101 keyHeight = (height()-(usePicks ? ph : 0))/(keys->rows()?keys->rows():1);
101 102
102 int nk; // number of keys? 103 int nk; // number of keys?
103 if ( useLargeKeys ) { 104 if ( useLargeKeys ) {
104 nk = 15; 105 nk = 15;
105 } else { 106 } else {
106 nk = 19; 107 nk = 19;
107 } 108 }
108 defaultKeyWidth = (width()/nk)/2; 109 defaultKeyWidth = (width()/nk)/2;
109 xoffs = (width()-defaultKeyWidth*nk)/2; // empty key spaces? 110 xoffs = (width()-defaultKeyWidth*nk)/2; // empty key spaces?
110 111
111} 112}
112 113
113/* KeyboardPicks::initialize {{{1 */ 114/* KeyboardPicks::initialize {{{1 */
114void KeyboardPicks::initialise() 115void KeyboardPicks::initialise()
115{ 116{
116 setSizePolicy(QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed)); 117 setSizePolicy(QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed));
117 mode = 0; 118 mode = 0;
118 dc = new KeyboardConfig(this); 119 dc = new KeyboardConfig(this);
119 configs.append(dc); 120 configs.append(dc);
120} 121}
121 122
122/* KeyboardPicks::sizeHint {{{1 */ 123/* KeyboardPicks::sizeHint {{{1 */
123QSize KeyboardPicks::sizeHint() const 124QSize KeyboardPicks::sizeHint() const
124{ 125{
125 return QSize(240,fontMetrics().lineSpacing()); 126 return QSize(240,fontMetrics().lineSpacing());
126} 127}
127 128
128 129
129/* KeyboardConfig::generateText {{{1 */ 130/* KeyboardConfig::generateText {{{1 */
130void KeyboardConfig::generateText(const QString &s) 131void KeyboardConfig::generateText(const QString &s)
131{ 132{
132#if defined(Q_WS_QWS) || defined(_WS_QWS_) 133#if defined(Q_WS_QWS) || defined(_WS_QWS_)
133 for (int i=0; i<(int)backspaces; i++) { 134 for (int i=0; i<(int)backspaces; i++) {
134 parent->emitKey( 0, Qt::Key_Backspace, 0, true, false ); 135 parent->emitKey( 0, Qt::Key_Backspace, 0, true, false );
135 parent->emitKey( 0, Qt::Key_Backspace, 0, false, false ); 136 parent->emitKey( 0, Qt::Key_Backspace, 0, false, false );
136 } 137 }
137 for (int i=0; i<(int)s.length(); i++) { 138 for (int i=0; i<(int)s.length(); i++) {
138 parent->emitKey( s[i].unicode(), 0, 0, true, false ); 139 parent->emitKey( s[i].unicode(), 0, 0, true, false );
139 parent->emitKey( s[i].unicode(), 0, 0, false, false ); 140 parent->emitKey( s[i].unicode(), 0, 0, false, false );
140 } 141 }
141 parent->emitKey( 0, Qt::Key_Space, 0, true, false ); 142 parent->emitKey( 0, Qt::Key_Space, 0, true, false );
142 parent->emitKey( 0, Qt::Key_Space, 0, false, false ); 143 parent->emitKey( 0, Qt::Key_Space, 0, false, false );
143 backspaces = 0; 144 backspaces = 0;
144#endif 145#endif
145} 146}
146 147
147 148
148 149
149 150
150/* Keyboard::paintEvent {{{1 */ 151/* Keyboard::paintEvent {{{1 */
151void Keyboard::paintEvent(QPaintEvent* e) 152void Keyboard::paintEvent(QPaintEvent* e)
152{ 153{
153 QPainter painter(this); 154 QPainter painter(this);
154 painter.setClipRect(e->rect()); 155 painter.setClipRect(e->rect());
155 drawKeyboard( painter ); 156 drawKeyboard( painter );
156 picks->dc->draw( &painter ); 157 picks->dc->draw( &painter );
157} 158}
158 159
159 160
160/* Keyboard::drawKeyboard {{{1 */ 161/* Keyboard::drawKeyboard {{{1 */
161 162
162void Keyboard::drawKeyboard(QPainter &p, int row, int col) 163void Keyboard::drawKeyboard(QPainter &p, int row, int col)
163{ 164{
164 165
165 166
166 if (row != -1 && col != -1) { //just redraw one key 167 if (row != -1 && col != -1) { //just redraw one key
167 168
168 int x = 0; 169 int x = 0;
169 for (int i = 0; i < col; i++) { 170 for (int i = 0; i < col; i++) {
170 171
171 x += keys->width(row, i) * defaultKeyWidth; 172 x += keys->width(row, i) * defaultKeyWidth;
172 } 173 }
173 int y = (row - 1) * keyHeight + (usePicks ? picks->height() : 0); 174 int y = (row - 1) * keyHeight + (usePicks ? picks->height() : 0);
174 175
175 int keyWidth = keys->width(row, col); 176 int keyWidth = keys->width(row, col);
176 177
177 p.fillRect(x + 1, y + 1, 178 p.fillRect(x + 1, y + 1,
178 keyWidth * defaultKeyWidth - 1, keyHeight - 1, 179 keyWidth * defaultKeyWidth - 1, keyHeight - 1,
179 pressed || keys->pressed(row, col) ? keycolor_pressed : keycolor); 180 pressed || keys->pressed(row, col) ? keycolor_pressed : keycolor);
180 181
181 QImage *pix = keys->pix(row,col); 182 QImage *pix = keys->pix(row,col);
182 183
183 ushort c = keys->uni(row, col); 184 ushort c = keys->uni(row, col);
184 185
185 p.setPen(textcolor); 186 p.setPen(textcolor);
186 if (!pix) { 187 if (!pix) {
187 if ((shift || lock) && keys->shift(c)) 188 if ((shift || lock) && keys->shift(c))
188 189
189 if (circumflex && keys->circumflex(keys->shift(c))) 190 if (circumflex && keys->circumflex(keys->shift(c)))
190 c = keys->circumflex(keys->shift(c)); 191 c = keys->circumflex(keys->shift(c));
191 else if (diaeresis && keys->diaeresis(keys->shift(c))) 192 else if (diaeresis && keys->diaeresis(keys->shift(c)))
192 c = keys->diaeresis(keys->shift(c)); 193 c = keys->diaeresis(keys->shift(c));
193 else if (baccent && keys->baccent(keys->shift(c))) 194 else if (baccent && keys->baccent(keys->shift(c)))
194 c = keys->baccent(keys->shift(c)); 195 c = keys->baccent(keys->shift(c));
195 else if (accent && keys->accent(keys->shift(c))) 196 else if (accent && keys->accent(keys->shift(c)))
196 c = keys->accent(keys->shift(c)); 197 c = keys->accent(keys->shift(c));
197 else if (meta && keys->meta(keys->shift(c))) 198 else if (meta && keys->meta(keys->shift(c)))
198 c = keys->meta(keys->shift(c)); 199 c = keys->meta(keys->shift(c));
199 else 200 else
200 c = keys->shift(c); 201 c = keys->shift(c);
201 202
202 else if (meta && keys->meta(c)) 203 else if (meta && keys->meta(c))
203 c = keys->meta(c); 204 c = keys->meta(c);
204 else if (circumflex && keys->circumflex(c)) 205 else if (circumflex && keys->circumflex(c))
205 c = keys->circumflex(c); 206 c = keys->circumflex(c);
206 else if (baccent && keys->baccent(c)) 207 else if (baccent && keys->baccent(c))
207 c = keys->baccent(c); 208 c = keys->baccent(c);
208 else if (accent && keys->accent(c)) 209 else if (accent && keys->accent(c))
209 c = keys->accent(c); 210 c = keys->accent(c);
210 else if (diaeresis && (keys->diaeresis(c) || c == 0x2c6)) { 211 else if (diaeresis && (keys->diaeresis(c) || c == 0x2c6)) {
211 212
212 // the diaeresis key itself has to be in the diaeresisMap, 213 // the diaeresis key itself has to be in the diaeresisMap,
213 // or just do this to make it display the diaeresis char. 214 // or just do this to make it display the diaeresis char.
214 215
215 if (c == 0x2c6) 216 if (c == 0x2c6)
216 c = 0xa8; 217 c = 0xa8;
217 else 218 else
218 c = keys->diaeresis(c); 219 c = keys->diaeresis(c);
219 } 220 }
220 221
221 p.drawText(x, y, 222 p.drawText(x, y,
222 defaultKeyWidth * keyWidth + 3, keyHeight, 223 defaultKeyWidth * keyWidth + 3, keyHeight,
223 AlignCenter, (QChar)c); 224 AlignCenter, (QChar)c);
224 } 225 }
225 else 226 else
226 // center the image in the middle of the key 227 // center the image in the middle of the key
227 p.drawImage( x + (defaultKeyWidth * keyWidth - pix->width())/2 + 1, 228 p.drawImage( x + (defaultKeyWidth * keyWidth - pix->width())/2 + 1,
228 y + (keyHeight - pix->height())/2 + 1, 229 y + (keyHeight - pix->height())/2 + 1,
229 *pix ); 230 *pix );
230 231
231 // this fixes the problem that the very right end of the board's vertical line 232 // this fixes the problem that the very right end of the board's vertical line
232 // gets painted over, because it's one pixel shorter than all other keys 233 // gets painted over, because it's one pixel shorter than all other keys
233 p.setPen(keycolor_lines); 234 p.setPen(keycolor_lines);
234 p.drawLine(width() - 1, 0, width() - 1, height()); 235 p.drawLine(width() - 1, 0, width() - 1, height());
235 236
236 } else { 237 } else {
237 238
238 239
239 p.fillRect(0, 0, width(), height(), keycolor); 240 p.fillRect(0, 0, width(), height(), keycolor);
240 241
241 for (row = 1; row <= keys->rows(); row++) { 242 for (row = 1; row <= keys->rows(); row++) {
242 243
243 int x = 0; 244 int x = 0;
244 int y = (row - 1) * keyHeight + (usePicks ? picks->height() : 0); 245 int y = (row - 1) * keyHeight + (usePicks ? picks->height() : 0);
245 246
246 p.setPen(keycolor_lines); 247 p.setPen(keycolor_lines);
247 p.drawLine(x, y, x + width(), y); 248 p.drawLine(x, y, x + width(), y);
248 249
249 for (int col = 0; col < keys->numKeys(row); col++) { 250 for (int col = 0; col < keys->numKeys(row); col++) {
250 251
251 QImage *pix = keys->pix(row, col); 252 QImage *pix = keys->pix(row, col);
252 int keyWidth = keys->width(row, col); 253 int keyWidth = keys->width(row, col);
253 254
254 255
255 int keyWidthPix = defaultKeyWidth * keyWidth; 256 int keyWidthPix = defaultKeyWidth * keyWidth;
256 257
257 if (keys->pressed(row, col)) 258 if (keys->pressed(row, col))
258 p.fillRect(x+1, y+1, keyWidthPix - 1, 259 p.fillRect(x+1, y+1, keyWidthPix - 1,
259 keyHeight - 1, keycolor_pressed); 260 keyHeight - 1, keycolor_pressed);
260 261
261 ushort c = keys->uni(row, col); 262 ushort c = keys->uni(row, col);
262 263
263 p.setPen(textcolor); 264 p.setPen(textcolor);
264 if (!pix) { 265 if (!pix) {
265 if ((shift || lock) && keys->shift(c)) 266 if ((shift || lock) && keys->shift(c))
266 267
267 if (circumflex && keys->circumflex(keys->shift(c))) 268 if (circumflex && keys->circumflex(keys->shift(c)))
268 c = keys->circumflex(keys->shift(c)); 269 c = keys->circumflex(keys->shift(c));
269 else if (diaeresis && keys->diaeresis(keys->shift(c))) 270 else if (diaeresis && keys->diaeresis(keys->shift(c)))
270 c = keys->diaeresis(keys->shift(c)); 271 c = keys->diaeresis(keys->shift(c));
271 else if (baccent && keys->baccent(keys->shift(c))) 272 else if (baccent && keys->baccent(keys->shift(c)))
272 c = keys->baccent(keys->shift(c)); 273 c = keys->baccent(keys->shift(c));
273 else if (accent && keys->accent(keys->shift(c))) 274 else if (accent && keys->accent(keys->shift(c)))
274 c = keys->accent(keys->shift(c)); 275 c = keys->accent(keys->shift(c));
275 else if (meta && keys->meta(keys->shift(c))) 276 else if (meta && keys->meta(keys->shift(c)))
276 c = keys->meta(keys->shift(c)); 277 c = keys->meta(keys->shift(c));
277 else 278 else
278 c = keys->shift(c); 279 c = keys->shift(c);
279 280
280 else if (meta && keys->meta(c)) 281 else if (meta && keys->meta(c))
281 c = keys->meta(c); 282 c = keys->meta(c);
282 else if (circumflex && keys->circumflex(c)) 283 else if (circumflex && keys->circumflex(c))
283 c = keys->circumflex(c); 284 c = keys->circumflex(c);
284 else if (baccent && keys->baccent(c)) 285 else if (baccent && keys->baccent(c))
285 c = keys->baccent(c); 286 c = keys->baccent(c);
286 else if (accent && keys->accent(c)) 287 else if (accent && keys->accent(c))
287 c = keys->accent(c); 288 c = keys->accent(c);
288 else if (diaeresis && (keys->diaeresis(c) || c == 0x2c6)) { 289 else if (diaeresis && (keys->diaeresis(c) || c == 0x2c6)) {
289 290
290 if (c == 0x2c6) 291 if (c == 0x2c6)
291 c = 0xa8; 292 c = 0xa8;
292 else 293 else
293 c = keys->diaeresis(c); 294 c = keys->diaeresis(c);
294 } 295 }
295 296
296 p.drawText(x, y, 297 p.drawText(x, y,
297 keyWidthPix + 3, keyHeight, 298 keyWidthPix + 3, keyHeight,
298 AlignCenter, (QChar)c); 299 AlignCenter, (QChar)c);
299 } 300 }
300 else { 301 else {
301 // center the image in the middle of the key 302 // center the image in the middle of the key
302 pix->setColor(1, textcolor.rgb()); 303 pix->setColor(1, textcolor.rgb());
303 p.drawImage( x + (keyWidthPix - pix->width())/2 + 1, 304 p.drawImage( x + (keyWidthPix - pix->width())/2 + 1,
304 y + (keyHeight - pix->height())/2 + 1, 305 y + (keyHeight - pix->height())/2 + 1,
305 QImage(*pix) ); 306 QImage(*pix) );
306 } 307 }
307 308
308 p.setPen(keycolor_lines); 309 p.setPen(keycolor_lines);
309 p.drawLine(x, y, x, y + keyHeight); 310 p.drawLine(x, y, x, y + keyHeight);
310 311
311 x += keyWidthPix; 312 x += keyWidthPix;
312 } 313 }
313 314
314 315
315 } 316 }
316 p.setPen(keycolor_lines); 317 p.setPen(keycolor_lines);
317 p.drawLine(0, height() - 1, width(), height() - 1); 318 p.drawLine(0, height() - 1, width(), height() - 1);
318 p.drawLine(width() - 1, 0, width() - 1, height()); 319 p.drawLine(width() - 1, 0, width() - 1, height());
319 } 320 }
320 321
321} 322}
322 323
323 324
324/* Keyboard::mousePressEvent {{{1 */ 325/* Keyboard::mousePressEvent {{{1 */
325void Keyboard::mousePressEvent(QMouseEvent *e) 326void Keyboard::mousePressEvent(QMouseEvent *e)
326{ 327{
327 int row = (e->y() - (usePicks ? picks->height() : 0)) / keyHeight + 1; 328 int row = (e->y() - (usePicks ? picks->height() : 0)) / keyHeight + 1;
328 if (row > 5) row = 5; 329 if (row > 5) row = 5;
329 330
330 // figure out the column 331 // figure out the column
331 int col = 0; 332 int col = 0;
332 for (int w = 0; e->x() >= w; col++) 333 for (int w = 0; e->x() >= w; col++)
333 if (col < keys->numKeys(row)) // it segfaults if it trys to read past numKeys 334 if (col < keys->numKeys(row)) // it segfaults if it trys to read past numKeys
334 w += keys->width(row,col) * defaultKeyWidth; 335 w += keys->width(row,col) * defaultKeyWidth;
335 else break; 336 else break;
336 337
337 if (col <= 0) return; 338 if (col <= 0) return;
338 339
339 col --; // rewind one... 340 col --; // rewind one...
340 341
341 qkeycode = keys->qcode(row, col); 342 qkeycode = keys->qcode(row, col);
342 unicode = keys->uni(row, col); 343 unicode = keys->uni(row, col);
343 344
344 // might need to repaint if two or more of the same keys. 345 // might need to repaint if two or more of the same keys.
345 // should be faster if just paint one key even though multiple keys exist. 346 // should be faster if just paint one key even though multiple keys exist.
346 bool need_repaint = FALSE; 347 bool need_repaint = FALSE;
347 348
348 // circumflex and diaeresis support 349 // circumflex and diaeresis support
349 // messy to have this here, but too hard to implement any other method 350 // messy to have this here, but too hard to implement any other method
350 if (unicode == 0x2c6) { 351 if (unicode == 0x2c6) {
351 352
352 unicode = 0; 353 unicode = 0;
353 if (shift || lock) { 354 if (shift || lock) {
354 355
355 // diaeresis 356 // diaeresis
356 qkeycode = 0x2001; 357 qkeycode = 0x2001;
357 } 358 }
358 else { 359 else {
359 360
360 // circumflex 361 // circumflex
361 qkeycode = 0x2000; 362 qkeycode = 0x2000;
362 } 363 }
363 } 364 }
364 365
365 // Back accent character support 366 // Back accent character support
366 367
367 // the keys from 2c6 ~ 2cf should be used instead of the ascii one 368 // the keys from 2c6 ~ 2cf should be used instead of the ascii one
368 if (unicode == 0x2cb) { 369 if (unicode == 0x2cb) {
369 370
370 unicode = 0; 371 unicode = 0;
371 if (shift || lock) { 372 if (shift || lock) {
372 373
373 // circumblex 374 // circumblex
374 qkeycode = 0x2000; 375 qkeycode = 0x2000;
375 } 376 }
376 else { 377 else {
377 378
378 // back accent 379 // back accent
379 qkeycode = 0x2002; 380 qkeycode = 0x2002;
380 } 381 }
381 } 382 }
382 383
383 // Accent character support 384 // Accent character support
384 385
385 if (unicode == 0x2ca) { 386 if (unicode == 0x2ca) {
386 387
387 unicode = 0; 388 unicode = 0;
388 if (shift || lock) { 389 if (shift || lock) {
389 390
390 // diaeresis 391 // diaeresis
391 qkeycode = 0x2001; 392 qkeycode = 0x2001;
392 } 393 }
393 else { 394 else {
394 395
395 // accent 396 // accent
396 qkeycode = 0x2003; 397 qkeycode = 0x2003;
397 } 398 }
398 } 399 }
399 400
400 401
401 if (unicode == 0) { // either Qt char, or nothing 402 if (unicode == 0) { // either Qt char, or nothing
402 403
403 if (qkeycode == Qt::Key_F1) { // toggle the pickboard 404 if (qkeycode == Qt::Key_F1) { // toggle the pickboard
404 405
405 if ( configdlg ) { 406 if ( configdlg ) {
406 407
407 delete (ConfigDlg *) configdlg; 408 delete (ConfigDlg *) configdlg;
408 configdlg = 0; 409 configdlg = 0;
409 } 410 }
410 else { 411 else {
411 configdlg = new ConfigDlg (); 412 configdlg = new ConfigDlg ();
412 connect(configdlg, SIGNAL(setMapToDefault()), 413 connect(configdlg, SIGNAL(setMapToDefault()),
413 this, SLOT(setMapToDefault())); 414 this, SLOT(setMapToDefault()));
414 connect(configdlg, SIGNAL(setMapToFile(QString)), 415 connect(configdlg, SIGNAL(setMapToFile(QString)),
415 this, SLOT(setMapToFile(QString))); 416 this, SLOT(setMapToFile(QString)));
416 connect(configdlg, SIGNAL(pickboardToggled(bool)), 417 connect(configdlg, SIGNAL(pickboardToggled(bool)),
417 this, SLOT(togglePickboard(bool))); 418 this, SLOT(togglePickboard(bool)));
418 connect(configdlg, SIGNAL(repeatToggled(bool)), 419 connect(configdlg, SIGNAL(repeatToggled(bool)),
419 this, SLOT(toggleRepeat(bool))); 420 this, SLOT(toggleRepeat(bool)));
420 connect(configdlg, SIGNAL(reloadKeyboard()), 421 connect(configdlg, SIGNAL(reloadKeyboard()),
421 this, SLOT(reloadKeyboard())); 422 this, SLOT(reloadKeyboard()));
422 connect(configdlg, SIGNAL(configDlgClosed()), 423 connect(configdlg, SIGNAL(configDlgClosed()),
423 this, SLOT(cleanupConfigDlg())); 424 this, SLOT(cleanupConfigDlg()));
424 configdlg->showMaximized(); 425 configdlg->showMaximized();
425 configdlg->show(); 426 configdlg->show();
426 configdlg->raise(); 427 configdlg->raise();
427 } 428 }
428 429
429 } else if (qkeycode == Qt::Key_Control) { 430 } else if (qkeycode == Qt::Key_Control) {
430 need_repaint = TRUE; 431 need_repaint = TRUE;
431 432
432 if (ctrl) { 433 if (ctrl) {
433 434
434 *ctrl = 0; 435 *ctrl = 0;
435 ctrl = 0; 436 ctrl = 0;
436 437
437 } else { 438 } else {
438 439
439 ctrl = keys->pressedPtr(row, col); 440 ctrl = keys->pressedPtr(row, col);
440 need_repaint = TRUE; 441 need_repaint = TRUE;
441 *ctrl = !keys->pressed(row, col); 442 *ctrl = !keys->pressed(row, col);
442 443
443 } 444 }
444 445
445 } else if (qkeycode == Qt::Key_Alt) { 446 } else if (qkeycode == Qt::Key_Alt) {
446 need_repaint = TRUE; 447 need_repaint = TRUE;
447 448
448 if (alt) { 449 if (alt) {
449 *alt = 0; 450 *alt = 0;
450 alt = 0; 451 alt = 0;
451 452
452 } else { 453 } else {
453 454
454 alt = keys->pressedPtr(row, col); 455 alt = keys->pressedPtr(row, col);
455 need_repaint = TRUE; 456 need_repaint = TRUE;
456 *alt = !keys->pressed(row, col); 457 *alt = !keys->pressed(row, col);
457 } 458 }
458 459
459 } else if (qkeycode == Qt::Key_Shift) { 460 } else if (qkeycode == Qt::Key_Shift) {
460 need_repaint = TRUE; 461 need_repaint = TRUE;
461 462
462 if (shift) { 463 if (shift) {
463 *shift = 0; 464 *shift = 0;
464 shift = 0; 465 shift = 0;
465 } 466 }
466 else { 467 else {
467 shift = keys->pressedPtr(row, col); 468 shift = keys->pressedPtr(row, col);
468 *shift = 1; 469 *shift = 1;
469 if (lock) { 470 if (lock) {
470 *lock = 0; 471 *lock = 0;
471 lock = 0; 472 lock = 0;
472 } 473 }
473 } 474 }
474 475
475 476
476 /* 477 /*
477 * want to be able to hit circumflex/diaeresis -> shift 478 * want to be able to hit circumflex/diaeresis -> shift
478 * to type in shifted circumflex/diaeresis chars. 479 * to type in shifted circumflex/diaeresis chars.
479 * same thing with meta 480 * same thing with meta
480 481
481 if (meta) { *meta = 0; meta = 0; } 482 if (meta) { *meta = 0; meta = 0; }
482 if (circumflex) { *circumflex = 0; circumflex = 0; } 483 if (circumflex) { *circumflex = 0; circumflex = 0; }
483 if (diaeresis) { *diaeresis = 0; diaeresis = 0; } 484 if (diaeresis) { *diaeresis = 0; diaeresis = 0; }
484 485
485 */ 486 */
486 487
487 } else if (qkeycode == Qt::Key_CapsLock) { 488 } else if (qkeycode == Qt::Key_CapsLock) {
488 need_repaint = TRUE; 489 need_repaint = TRUE;
489 490
490 if (lock) { 491 if (lock) {
491 *lock = 0; 492 *lock = 0;
492 lock = 0; 493 lock = 0;
493 } 494 }
494 else { 495 else {
495 lock = keys->pressedPtr(row, col);; 496 lock = keys->pressedPtr(row, col);;
496 *lock = true;; 497 *lock = true;;
497 if (shift) { 498 if (shift) {
498 *shift = 0; 499 *shift = 0;
499 shift = 0; 500 shift = 0;
500 } 501 }
501 } 502 }
502 503
503 /* 504 /*
504 if (meta) { *meta = 0; meta = 0; } 505 if (meta) { *meta = 0; meta = 0; }
505 if (circumflex) { *circumflex = 0; circumflex = 0; } 506 if (circumflex) { *circumflex = 0; circumflex = 0; }
506 if (diaeresis) { *diaeresis = 0; diaeresis = 0; } 507 if (diaeresis) { *diaeresis = 0; diaeresis = 0; }
507 */ 508 */
508 509
509 } else if (qkeycode == Qt::Key_Meta) { 510 } else if (qkeycode == Qt::Key_Meta) {
510 need_repaint = TRUE; 511 need_repaint = TRUE;
511 512
512 if (meta) { 513 if (meta) {
513 *meta = 0; 514 *meta = 0;
514 meta = 0; 515 meta = 0;
515 516
516 } else { 517 } else {
517 518
518 meta = keys->pressedPtr(row, col); 519 meta = keys->pressedPtr(row, col);
519 *meta = true; 520 *meta = true;
520 } 521 }
521 522
522 // reset all the other keys 523 // reset all the other keys
523 if (shift) { *shift = 0; shift = 0; } 524 if (shift) { *shift = 0; shift = 0; }
524 if (lock) { *lock = 0; lock = 0; } 525 if (lock) { *lock = 0; lock = 0; }
525 if (circumflex) { *circumflex = 0; circumflex = 0; } 526 if (circumflex) { *circumflex = 0; circumflex = 0; }
526 if (diaeresis) { *diaeresis = 0; diaeresis = 0; } 527 if (diaeresis) { *diaeresis = 0; diaeresis = 0; }
527 if (baccent) { *baccent = 0; baccent = 0; } 528 if (baccent) { *baccent = 0; baccent = 0; }
528 if (accent) { *accent = 0; accent = 0; } 529 if (accent) { *accent = 0; accent = 0; }
529 530
530 // dont need to emit this key... acts same as alt 531 // dont need to emit this key... acts same as alt
531 qkeycode = 0; 532 qkeycode = 0;
532 533
533 // circumflex 534 // circumflex
534 } else if (qkeycode == 0x2000) { 535 } else if (qkeycode == 0x2000) {
535 need_repaint = TRUE; 536 need_repaint = TRUE;
536 537
537 if (circumflex) { 538 if (circumflex) {
538 539
539 *circumflex = 0; 540 *circumflex = 0;
540 circumflex = 0; 541 circumflex = 0;
541 542
542 } else { 543 } else {
543 544
544 circumflex = keys->pressedPtr(row, col); 545 circumflex = keys->pressedPtr(row, col);
545 *circumflex = true; 546 *circumflex = true;
546 } 547 }
547 548
548 /* no need to turn off shift or lock if circumflex 549 /* no need to turn off shift or lock if circumflex
549 * keys are pressed 550 * keys are pressed
550 551
551 if (shift) { *shift = 0; shift = 0; } 552 if (shift) { *shift = 0; shift = 0; }
552 if (lock) { *lock = 0; lock = 0; } 553 if (lock) { *lock = 0; lock = 0; }
553 554
554 */ 555 */
555 556
556 // have to reset all the other keys 557 // have to reset all the other keys
557 if (meta) { *meta = 0; meta = 0; } 558 if (meta) { *meta = 0; meta = 0; }
558 if (diaeresis) { 559 if (diaeresis) {
559 560
560 // *diaeresis and *circumflex point to the same thing 561 // *diaeresis and *circumflex point to the same thing
561 // when diaeresis is enabled and you hit the circumflex 562 // when diaeresis is enabled and you hit the circumflex
562 // since they are the same key, it should turn off the 563 // since they are the same key, it should turn off the
563 // key 564 // key
564 565
565 *diaeresis = 0; 566 *diaeresis = 0;
566 diaeresis = 0; 567 diaeresis = 0;
567 circumflex = 0; 568 circumflex = 0;
568 } 569 }
569 570
570 qkeycode = 0; 571 qkeycode = 0;
571 572
572 // diaeresis 573 // diaeresis
573 } else if (qkeycode == 0x2001) { 574 } else if (qkeycode == 0x2001) {
574 need_repaint = TRUE; 575 need_repaint = TRUE;
575 576
576 if (diaeresis) { 577 if (diaeresis) {
577 578
578 *diaeresis = 0; 579 *diaeresis = 0;
579 diaeresis = 0; 580 diaeresis = 0;
580 581
581 } else { 582 } else {
582 583
583 diaeresis = keys->pressedPtr(row, col); 584 diaeresis = keys->pressedPtr(row, col);
584 *diaeresis = true; 585 *diaeresis = true;
585 } 586 }
586 587
587 588
588 if (shift) { *shift = 0; shift = 0; } 589 if (shift) { *shift = 0; shift = 0; }
589 590
590 /* 591 /*
591 * 592 *
592 if (lock) { *lock = 0; lock = 0; } 593 if (lock) { *lock = 0; lock = 0; }
593 * 594 *
594 */ 595 */
595 596
596 if (meta) { *meta = 0; meta = 0; } 597 if (meta) { *meta = 0; meta = 0; }
597 if (circumflex) { 598 if (circumflex) {
598 599
599 // *circumflex = 0; 600 // *circumflex = 0;
600 // 601 //
601 // same thing the diaeresis pointer points too 602 // same thing the diaeresis pointer points too
602 603
603 circumflex = 0; 604 circumflex = 0;
604 } 605 }
605 606
606 607
607 qkeycode = 0; 608 qkeycode = 0;
608 609
609 // Back accent 610 // Back accent
610 } else if (qkeycode == 0x2002) { 611 } else if (qkeycode == 0x2002) {
611 need_repaint = TRUE; 612 need_repaint = TRUE;
612 613
613 if (baccent) { 614 if (baccent) {
614 615
615 *baccent = 0; 616 *baccent = 0;
616 baccent = 0; 617 baccent = 0;
617 618
618 } else { 619 } else {
619 620
620 baccent = keys->pressedPtr(row, col); 621 baccent = keys->pressedPtr(row, col);
621 *baccent = true; 622 *baccent = true;
622 } 623 }
623 624
624 625
625 if (shift) { *shift = 0; shift = 0; } 626 if (shift) { *shift = 0; shift = 0; }
626 if (meta) { *meta = 0; meta = 0; } 627 if (meta) { *meta = 0; meta = 0; }
627 if (accent) { *accent = 0; accent = 0; } 628 if (accent) { *accent = 0; accent = 0; }
628 629
629 qkeycode = 0; 630 qkeycode = 0;
630 631
631 // Accent 632 // Accent
632 } else if (qkeycode == 0x2003) { 633 } else if (qkeycode == 0x2003) {
633 need_repaint = TRUE; 634 need_repaint = TRUE;
634 635
635 if (accent) { 636 if (accent) {
636 637
637 *accent = 0; 638 *accent = 0;
638 accent = 0; 639 accent = 0;
639 640
640 } else { 641 } else {
641 642
642 accent = keys->pressedPtr(row, col); 643 accent = keys->pressedPtr(row, col);
643 *accent = true; 644 *accent = true;
644 } 645 }
645 646
646 647
647 if (shift) { *shift = 0; shift = 0; } 648 if (shift) { *shift = 0; shift = 0; }
648 if (meta) { *meta = 0; meta = 0; } 649 if (meta) { *meta = 0; meta = 0; }
649 if (baccent) { *baccent = 0; } 650 if (baccent) { *baccent = 0; }
650 651
651 qkeycode = 0; 652 qkeycode = 0;
652 } 653 }
653 654
654 } 655 }
655 else { // normal char 656 else { // normal char
656 if ((shift || lock) && keys->shift(unicode)) { 657 if ((shift || lock) && keys->shift(unicode)) {
657 658
658 // make diaeresis/circumflex -> shift input shifted 659 // make diaeresis/circumflex -> shift input shifted
659 // diaeresis/circumflex chars 660 // diaeresis/circumflex chars
660 661
661 if (circumflex && keys->circumflex(keys->shift(unicode))) 662 if (circumflex && keys->circumflex(keys->shift(unicode)))
662 unicode = keys->circumflex(keys->shift(unicode)); 663 unicode = keys->circumflex(keys->shift(unicode));
663 else if (diaeresis && keys->diaeresis(keys->shift(unicode))) 664 else if (diaeresis && keys->diaeresis(keys->shift(unicode)))
664 unicode = keys->diaeresis(keys->shift(unicode)); 665 unicode = keys->diaeresis(keys->shift(unicode));
665 else if (baccent && keys->baccent(keys->shift(unicode))) 666 else if (baccent && keys->baccent(keys->shift(unicode)))
666 unicode = keys->baccent(keys->shift(unicode)); 667 unicode = keys->baccent(keys->shift(unicode));
667 else if (accent && keys->accent(keys->shift(unicode))) 668 else if (accent && keys->accent(keys->shift(unicode)))
668 unicode = keys->accent(keys->shift(unicode)); 669 unicode = keys->accent(keys->shift(unicode));
669 else if (meta && keys->meta(keys->shift(unicode))) 670 else if (meta && keys->meta(keys->shift(unicode)))
670 unicode = keys->meta(keys->shift(unicode)); 671 unicode = keys->meta(keys->shift(unicode));
671 else 672 else
672 unicode = keys->shift(unicode); 673 unicode = keys->shift(unicode);
673 } 674 }
674 else if (meta && keys->meta(unicode)) { 675 else if (meta && keys->meta(unicode)) {
675 unicode = keys->meta(unicode); 676 unicode = keys->meta(unicode);
676 } 677 }
677 else if (circumflex && keys->circumflex(unicode)) { 678 else if (circumflex && keys->circumflex(unicode)) {
678 unicode = keys->circumflex(unicode); 679 unicode = keys->circumflex(unicode);
679 } 680 }
680 else if (diaeresis && keys->diaeresis(unicode)) { 681 else if (diaeresis && keys->diaeresis(unicode)) {
681 682
682 unicode = keys->diaeresis(unicode); 683 unicode = keys->diaeresis(unicode);
683 } 684 }
684 else if (baccent && keys->baccent(unicode)) { 685 else if (baccent && keys->baccent(unicode)) {
685 unicode = keys->baccent(unicode); 686 unicode = keys->baccent(unicode);
686 } 687 }
687 else if (accent && keys->accent(unicode)) { 688 else if (accent && keys->accent(unicode)) {
688 unicode = keys->accent(unicode); 689 unicode = keys->accent(unicode);
689 } 690 }
690 } 691 }
691 692
692 // korean parsing 693 // korean parsing
693 if (keys->lang == "ko") { 694 if (keys->lang == "ko") {
694 695
695 unicode = parseKoreanInput(unicode); 696 unicode = parseKoreanInput(unicode);
696 } 697 }
697 698
698 modifiers = (ctrl ? Qt::ControlButton : 0) | (alt ? Qt::AltButton : 0); 699 modifiers = (ctrl ? Qt::ControlButton : 0) | (alt ? Qt::AltButton : 0);
699 700
700 if ('A' <= unicode && unicode <= 'z' && modifiers) { 701 if ('A' <= unicode && unicode <= 'z' && modifiers) {
701 702
702 qkeycode = QChar(unicode).upper(); 703 qkeycode = QChar(unicode).upper();
703 unicode = qkeycode - '@'; 704 unicode = qkeycode - '@';
704 } 705 }
705 706
706 QWSServer::sendKeyEvent(unicode, qkeycode, modifiers, true, false); 707 QWSServer::sendKeyEvent(unicode, qkeycode, modifiers, true, false);
707 708
708 // pickboard stuff 709 // pickboard stuff
709 if (usePicks) { 710 if (usePicks) {
710 711
711 KeyboardConfig *dc = picks->dc; 712 KeyboardConfig *dc = picks->dc;
712 713
713 if (dc) { 714 if (dc) {
714 if (qkeycode == Qt::Key_Backspace) { 715 if (qkeycode == Qt::Key_Backspace) {
715 dc->input.remove(dc->input.last()); // remove last input 716 dc->input.remove(dc->input.last()); // remove last input
716 dc->decBackspaces(); 717 dc->decBackspaces();
717 } else if ( qkeycode == Qt::Key_Return || QChar(unicode).isPunct() || QChar(unicode).isSpace() || unicode == 0) { 718 } else if ( qkeycode == Qt::Key_Return || QChar(unicode).isPunct() || QChar(unicode).isSpace() || unicode == 0) {
718 dc->input.clear(); 719 dc->input.clear();
719 dc->resetBackspaces(); 720 dc->resetBackspaces();
720 } else { 721 } else {
721 dc->add(QString(QChar(unicode))); 722 dc->add(QString(QChar(unicode)));
722 dc->incBackspaces(); 723 dc->incBackspaces();
723 } 724 }
724 } 725 }
725 picks->repaint(); 726 picks->repaint();
726 } 727 }
727 728
728 729
729 // painting 730 // painting
730 pressed = TRUE; 731 pressed = TRUE;
731 732
732 pressedKeyRow = row; 733 pressedKeyRow = row;
733 pressedKeyCol = col; 734 pressedKeyCol = col;
734 735
735 if (need_repaint) repaint(FALSE); 736 if (need_repaint) repaint(FALSE);
736 else { // just paint the one key pressed 737 else { // just paint the one key pressed
737 738
738 739
739 740
740 QPainter p(this); 741 QPainter p(this);
741 drawKeyboard(p, row, col); 742 drawKeyboard(p, row, col);
742 743
743 } 744 }
744 745
745 if (useRepeat) repeatTimer->start( 800 ); 746 if (useRepeat) repeatTimer->start( 800 );
746 //pressTid = startTimer(80); 747 //pressTid = startTimer(80);
747 748
748} 749}
749 750
750 751
751/* Keyboard::mouseReleaseEvent {{{1 */ 752/* Keyboard::mouseReleaseEvent {{{1 */
752void Keyboard::mouseReleaseEvent(QMouseEvent*) 753void Keyboard::mouseReleaseEvent(QMouseEvent*)
753{ 754{
754 pressed = FALSE; 755 pressed = FALSE;
755 //if ( pressTid == 0 ) 756 //if ( pressTid == 0 )
756#if defined(Q_WS_QWS) || defined(_WS_QWS_) 757#if defined(Q_WS_QWS) || defined(_WS_QWS_)
757 if ( unicode != -1 ) { 758 if ( unicode != -1 ) {
758 emit key( unicode, qkeycode, modifiers, false, false ); 759 emit key( unicode, qkeycode, modifiers, false, false );
759 repeatTimer->stop(); 760 repeatTimer->stop();
760 } 761 }
761#endif 762#endif
762 if (shift && unicode != 0) { 763 if (shift && unicode != 0) {
763 764
764 765
765 *shift = 0; // unpress shift key 766 *shift = 0; // unpress shift key
766 shift = 0; // reset the shift pointer 767 shift = 0; // reset the shift pointer
767 repaint(FALSE); 768 repaint(FALSE);
768 769
769 } 770 }
770 if (ctrl && unicode != 0) { 771 if (ctrl && unicode != 0) {
771 772
772 *ctrl = 0; 773 *ctrl = 0;
773 ctrl = 0; 774 ctrl = 0;
774 repaint(FALSE); 775 repaint(FALSE);
775 776
776 } 777 }
777 if (alt && alt != 0) { 778 if (alt && alt != 0) {
778 779
779 *alt = 0; 780 *alt = 0;
780 alt = 0; 781 alt = 0;
781 repaint(FALSE); 782 repaint(FALSE);
782 783
783 } 784 }
784 785
785 /* 786 /*
786 * do not make the meta key release after being pressed 787 * do not make the meta key release after being pressed
787 * 788 *
788 789
789 else if (meta && unicode != 0) { 790 else if (meta && unicode != 0) {
790 791
791 *meta = 0; 792 *meta = 0;
792 meta = 0; 793 meta = 0;
793 repaint(FALSE); 794 repaint(FALSE);
794 } 795 }
795 796
796 */ 797 */
797 798
798 else clearHighlight(); 799 else clearHighlight();
799} 800}
800 801
801/* Keyboard::timerEvent {{{1 */ 802/* Keyboard::timerEvent {{{1 */
802 803
803/* dont know what this does, but i think it is here so that if your screen 804/* dont know what this does, but i think it is here so that if your screen
804 * sticks (like on an ipaq) then it will stop repeating if you click another 805 * sticks (like on an ipaq) then it will stop repeating if you click another
805 * key... but who knows what anything does in this thing anyway? 806 * key... but who knows what anything does in this thing anyway?
806 807
807 void Keyboard::timerEvent(QTimerEvent* e) 808 void Keyboard::timerEvent(QTimerEvent* e)
808{ 809{
809 if ( e->timerId() == pressTid ) { 810 if ( e->timerId() == pressTid ) {
810 killTimer(pressTid); 811 killTimer(pressTid);
811 pressTid = 0; 812 pressTid = 0;
812 if ( !pressed ) 813 if ( !pressed )
813 cout << "calling clearHighlight from timerEvent\n"; 814 cout << "calling clearHighlight from timerEvent\n";
814 //clearHighlight(); 815 //clearHighlight();
815 } 816 }
816} 817}
817*/ 818*/
818 819
819void Keyboard::repeat() 820void Keyboard::repeat()
820{ 821{
821 822
822 repeatTimer->start( 200 ); 823 repeatTimer->start( 200 );
823 emit key( unicode, qkeycode, modifiers, true, true ); 824 emit key( unicode, qkeycode, modifiers, true, true );
824} 825}
825 826
826void Keyboard::clearHighlight() 827void Keyboard::clearHighlight()
827{ 828{
828 if ( pressedKeyRow >= 0 && pressedKeyCol >= 0) { 829 if ( pressedKeyRow >= 0 && pressedKeyCol >= 0) {
829 int tmpRow = pressedKeyRow; 830 int tmpRow = pressedKeyRow;
830 int tmpCol = pressedKeyCol; 831 int tmpCol = pressedKeyCol;
831 832
832 pressedKeyRow = -1; 833 pressedKeyRow = -1;
833 pressedKeyCol = -1; 834 pressedKeyCol = -1;
834 835
835 QPainter p(this); 836 QPainter p(this);
836 drawKeyboard(p, tmpRow, tmpCol); 837 drawKeyboard(p, tmpRow, tmpCol);
837 } 838 }
838} 839}
839 840
840 841
841/* Keyboard::sizeHint {{{1 */ 842/* Keyboard::sizeHint {{{1 */
842QSize Keyboard::sizeHint() const 843QSize Keyboard::sizeHint() const
843{ 844{
844 QFontMetrics fm=fontMetrics(); 845 QFontMetrics fm=fontMetrics();
845 int keyHeight = fm.lineSpacing() + 2; 846 int keyHeight = fm.lineSpacing() + 2;
846 847
847 return QSize( 240, keyHeight * keys->rows() + (usePicks ? picks->sizeHint().height() : 0) + 1); 848 return QSize( 240, keyHeight * keys->rows() + (usePicks ? picks->sizeHint().height() : 0) + 1);
848} 849}
849 850
850 851
851void Keyboard::resetState() 852void Keyboard::resetState()
852{ 853{
853 if (shift) { *shift = 0; shift = 0; } 854 if (shift) { *shift = 0; shift = 0; }
854 if (lock) {*lock = 0; lock = 0; } 855 if (lock) {*lock = 0; lock = 0; }
855 if (meta) { *meta = 0; meta = 0; } 856 if (meta) { *meta = 0; meta = 0; }
856 if (circumflex) { *circumflex = 0; circumflex = 0; } 857 if (circumflex) { *circumflex = 0; circumflex = 0; }
857 if (diaeresis) { *diaeresis = 0; diaeresis = 0; } 858 if (diaeresis) { *diaeresis = 0; diaeresis = 0; }
858 if (baccent) { *baccent = 0; baccent = 0; } 859 if (baccent) { *baccent = 0; baccent = 0; }
859 if (accent) { *accent = 0; accent = 0; } 860 if (accent) { *accent = 0; accent = 0; }
860 861
861 schar = mchar = echar = 0; 862 schar = mchar = echar = 0;
862 picks->resetState(); 863 picks->resetState();
863} 864}
864 865
865/* Keyboard::togglePickboard {{{1 */ 866/* Keyboard::togglePickboard {{{1 */
866void Keyboard::togglePickboard(bool on_off) 867void Keyboard::togglePickboard(bool on_off)
867{ 868{
868 usePicks = on_off; 869 usePicks = on_off;
869 if (usePicks) { 870 if (usePicks) {
870 picks->show(); 871 picks->show();
871 //move(x(), y() - picks->height()); // not required anymore because QCopChannel::send 872 //move(x(), y() - picks->height()); // not required anymore because QCopChannel::send
872 //adjustSize(); 873 //adjustSize();
873 QObject::connect( picks, SIGNAL(key(ushort,ushort,ushort,bool,bool) ), 874 QObject::connect( picks, SIGNAL(key(ushort,ushort,ushort,bool,bool) ),
874 this, SIGNAL(key(ushort,ushort,ushort,bool,bool)) ); 875 this, SIGNAL(key(ushort,ushort,ushort,bool,bool)) );
875 } else { 876 } else {
876 877
877 picks->hide(); 878 picks->hide();
878 picks->resetState(); 879 picks->resetState();
879 //move(x(), y() + picks->height()); 880 //move(x(), y() + picks->height());
880 //adjustSize(); 881 //adjustSize();
881 QObject::disconnect( picks, SIGNAL(key(ushort,ushort,ushort,bool,bool) ), 882 QObject::disconnect( picks, SIGNAL(key(ushort,ushort,ushort,bool,bool) ),
882 this, SIGNAL(key(ushort,ushort,ushort,bool,bool)) ); 883 this, SIGNAL(key(ushort,ushort,ushort,bool,bool)) );
883 884
884 } 885 }
885 /* 886 /*
886 * this closes && opens the input method 887 * this closes && opens the input method
887 */ 888 */
888 QCopChannel::send ("QPE/TaskBar", "hideInputMethod()"); 889 QCopChannel::send ("QPE/TaskBar", "hideInputMethod()");
889 QCopChannel::send ("QPE/TaskBar", "showInputMethod()"); 890 QCopChannel::send ("QPE/TaskBar", "showInputMethod()");
890} 891}
891 892
892void Keyboard::toggleRepeat(bool on) { 893void Keyboard::toggleRepeat(bool on) {
893 894
894 useRepeat = on; 895 useRepeat = on;
895 //cout << "setting useRepeat to: " << useRepeat << "\n"; 896 //cout << "setting useRepeat to: " << useRepeat << "\n";
896} 897}
897 898
898void Keyboard::cleanupConfigDlg() { 899void Keyboard::cleanupConfigDlg() {
899 900
900 if ( configdlg ) { 901 if ( configdlg ) {
901 delete (ConfigDlg *) configdlg; 902 delete (ConfigDlg *) configdlg;
902 configdlg = 0; 903 configdlg = 0;
903 } 904 }
904} 905}
905 906
906/* Keyboard::setMapTo ... {{{1 */ 907/* Keyboard::setMapTo ... {{{1 */
907void Keyboard::setMapToDefault() { 908void Keyboard::setMapToDefault() {
908 909
909 910
910 /* load current locale language map */ 911 /* load current locale language map */
911 Config *config = new Config("locale"); 912 Config *config = new Config("locale");
912 config->setGroup( "Language" ); 913 config->setGroup( "Language" );
913 QString l = config->readEntry( "Language" , "en" ); 914 QString l = config->readEntry( "Language" , "en" );
914 delete config; 915 delete config;
915 916
916 QString key_map = QPEApplication::qpeDir() + "share/multikey/" 917 QString key_map = QPEApplication::qpeDir() + "share/multikey/"
917 + l + ".keymap"; 918 + l + ".keymap";
918 919
919 /* save change to multikey config file */ 920 /* save change to multikey config file */
920 config = new Config("multikey"); 921 config = new Config("multikey");
921 config->setGroup ("keymaps"); 922 config->setGroup ("keymaps");
922 config->writeEntry ("current", key_map); // default closed 923 config->writeEntry ("current", key_map); // default closed
923 delete config; 924 delete config;
924 925
925 int prevRows = keys->rows(); 926 int prevRows = keys->rows();
926 927
927 delete keys; 928 delete keys;
928 keys = new Keys(key_map); 929 keys = new Keys(key_map);
929 930
930 // have to repaint the keyboard 931 // have to repaint the keyboard
931 if (prevRows != keys->rows()) { 932 if (prevRows != keys->rows()) {
932 933
933 QCopChannel::send ("QPE/TaskBar", "hideInputMethod()"); 934 QCopChannel::send ("QPE/TaskBar", "hideInputMethod()");
934 QCopChannel::send ("QPE/TaskBar", "showInputMethod()"); 935 QCopChannel::send ("QPE/TaskBar", "showInputMethod()");
935 936
936 } else repaint(FALSE); 937 } else repaint(FALSE);
937 938
938 resetState(); 939 resetState();
939} 940}
940 941
941void Keyboard::setMapToFile(QString map) { 942void Keyboard::setMapToFile(QString map) {
942 943
943 /* save change to multikey config file */ 944 /* save change to multikey config file */
944 Config *config = new Config("multikey"); 945 Config *config = new Config("multikey");
945 config->setGroup ("keymaps"); 946 config->setGroup ("keymaps");
946 config->writeEntry ("current", map); // default closed 947 config->writeEntry ("current", map); // default closed
947 948
948 delete config; 949 delete config;
949 950
950 int prevRows = keys->rows(); 951 int prevRows = keys->rows();
951 952
952 delete keys; 953 delete keys;
953 if (QFile(map).exists()) 954 if (QFile(map).exists())
954 keys = new Keys(map); 955 keys = new Keys(map);
955 else 956 else
956 keys = new Keys(); 957 keys = new Keys();
957 958
958 if (keys->rows() != prevRows) { 959 if (keys->rows() != prevRows) {
959 960
960 QCopChannel::send ("QPE/TaskBar", "hideInputMethod()"); 961 QCopChannel::send ("QPE/TaskBar", "hideInputMethod()");
961 QCopChannel::send ("QPE/TaskBar", "showInputMethod()"); 962 QCopChannel::send ("QPE/TaskBar", "showInputMethod()");
962 } 963 }
963 else repaint(FALSE); 964 else repaint(FALSE);
964 965
965 resetState(); 966 resetState();
966} 967}
967 968
968/* Keybaord::reloadKeyboard {{{1 */ 969/* Keybaord::reloadKeyboard {{{1 */
969void Keyboard::reloadKeyboard() { 970void Keyboard::reloadKeyboard() {
970 971
971 // reload colors and redraw 972 // reload colors and redraw
972 loadKeyboardColors(); 973 loadKeyboardColors();
973 repaint(); 974 repaint();
974 975
975} 976}
976 977
977void Keyboard::loadKeyboardColors() { 978void Keyboard::loadKeyboardColors() {
978 979
979 Config config ("multikey"); 980 Config config ("multikey");
980 config.setGroup("colors"); 981 config.setGroup("colors");
981 982
982 QStringList color; 983 QStringList color;
983 color = config.readListEntry("keycolor", QChar(',')); 984 color = config.readListEntry("keycolor", QChar(','));
984 if (color.isEmpty()) { 985 if (color.isEmpty()) {
985 color = QStringList::split(",", "240,240,240"); 986 color = QStringList::split(",", "240,240,240");
986 config.writeEntry("keycolor", color.join(",")); 987 config.writeEntry("keycolor", color.join(","));
987 988
988 } 989 }
989 keycolor = QColor(color[0].toInt(), color[1].toInt(), color[2].toInt()); 990 keycolor = QColor(color[0].toInt(), color[1].toInt(), color[2].toInt());
990 991
991 color = config.readListEntry("keycolor_pressed", QChar(',')); 992 color = config.readListEntry("keycolor_pressed", QChar(','));
992 if (color.isEmpty()) { 993 if (color.isEmpty()) {
993 color = QStringList::split(",", "171,183,198"); 994 color = QStringList::split(",", "171,183,198");
994 config.writeEntry("keycolor_pressed", color.join(",")); 995 config.writeEntry("keycolor_pressed", color.join(","));
995 996
996 } 997 }
997 keycolor_pressed = QColor(color[0].toInt(), color[1].toInt(), color[2].toInt()); 998 keycolor_pressed = QColor(color[0].toInt(), color[1].toInt(), color[2].toInt());
998 999
999 color = config.readListEntry("keycolor_lines", QChar(',')); 1000 color = config.readListEntry("keycolor_lines", QChar(','));
1000 if (color.isEmpty()) { 1001 if (color.isEmpty()) {
1001 color = QStringList::split(",", "138,148,160"); 1002 color = QStringList::split(",", "138,148,160");
1002 config.writeEntry("keycolor_lines", color.join(",")); 1003 config.writeEntry("keycolor_lines", color.join(","));
1003 1004
1004 } 1005 }
1005 keycolor_lines = QColor(color[0].toInt(), color[1].toInt(), color[2].toInt()); 1006 keycolor_lines = QColor(color[0].toInt(), color[1].toInt(), color[2].toInt());
1006 1007
1007 color = config.readListEntry("textcolor", QChar(',')); 1008 color = config.readListEntry("textcolor", QChar(','));
1008 if (color.isEmpty()) { 1009 if (color.isEmpty()) {
1009 color = QStringList::split(",", "43,54,68"); 1010 color = QStringList::split(",", "43,54,68");
1010 config.writeEntry("textcolor", color.join(",")); 1011 config.writeEntry("textcolor", color.join(","));
1011 1012
1012 } 1013 }
1013 textcolor = QColor(color[0].toInt(), color[1].toInt(), color[2].toInt()); 1014 textcolor = QColor(color[0].toInt(), color[1].toInt(), color[2].toInt());
1014 1015
1015} 1016}
1016 1017
1017/* korean input functions {{{1 1018/* korean input functions {{{1
1018 * 1019 *
1019 * TODO 1020 * TODO
1020 * one major problem with this implementation is that you can't move the 1021 * one major problem with this implementation is that you can't move the
1021 * cursor after inputing korean chars, otherwise it will eat up and replace 1022 * cursor after inputing korean chars, otherwise it will eat up and replace
1022 * the char before the cursor you move to. fix that 1023 * the char before the cursor you move to. fix that
1023 * 1024 *
1024 * make backspace delete one single char, not the whole thing if still 1025 * make backspace delete one single char, not the whole thing if still
1025 * editing. 1026 * editing.
1026 * 1027 *
1027 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 1028 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
1028 * 1029 *
1029 * how korean input works 1030 * how korean input works
1030 * 1031 *
1031 * all following chars means unicode char value and are in hex 1032 * all following chars means unicode char value and are in hex
1032 * 1033 *
1033 * 초음 = schar (start char) 1034 * 초음 = schar (start char)
1034 * 중음 = mchar (middle char) 1035 * 중음 = mchar (middle char)
1035 * 끝음 = echar (end char) 1036 * 끝음 = echar (end char)
1036 * 1037 *
1037 * there are 19 schars. unicode position is at 1100 - 1112 1038 * there are 19 schars. unicode position is at 1100 - 1112
1038 * there are 21 mchars. unicode position is at 1161 - 1175 1039 * there are 21 mchars. unicode position is at 1161 - 1175
1039 * there are 27 echars. unicode position is at 11a8 - 11c2 1040 * there are 27 echars. unicode position is at 11a8 - 11c2
1040 * 1041 *
1041 * the map with everything combined is at ac00 - d7a3 1042 * the map with everything combined is at ac00 - d7a3
1042 * 1043 *
1043 */ 1044 */
1044 1045
1045ushort Keyboard::parseKoreanInput (ushort c) { 1046ushort Keyboard::parseKoreanInput (ushort c) {
1046 1047
1047 if ((c != 0 && (c < 0x1100 || 0x11c2 < c) && (c < 0xac00 || 0xd7a3 < c)) 1048 if ((c != 0 && (c < 0x1100 || 0x11c2 < c) && (c < 0xac00 || 0xd7a3 < c))
1048 || 1049 ||
1049 (c == 0 && qkeycode != Qt::Key_Shift && Qt::Key_CapsLock != qkeycode 1050 (c == 0 && qkeycode != Qt::Key_Shift && Qt::Key_CapsLock != qkeycode
1050 && qkeycode != Qt::Key_Control && qkeycode != Qt::Key_Alt)) { 1051 && qkeycode != Qt::Key_Control && qkeycode != Qt::Key_Alt)) {
1051 1052
1052 schar = 0, mchar = 0, echar = 0; 1053 schar = 0, mchar = 0, echar = 0;
1053 return c; 1054 return c;
1054 } 1055 }
1055 1056
1056 if ( 0x1100 <= c && c <= 0x1112 ) { // schar or echar was input 1057 if ( 0x1100 <= c && c <= 0x1112 ) { // schar or echar was input
1057 1058
1058 if (schar == 0 || (schar != 0 && mchar == 0)) { 1059 if (schar == 0 || (schar != 0 && mchar == 0)) {
1059 schar = c; mchar = 0; echar = 0; 1060 schar = c; mchar = 0; echar = 0;
1060 return c; 1061 return c;
1061 } 1062 }
1062 else if (mchar != 0) { 1063 else if (mchar != 0) {
1063 1064
1064 if (echar == 0) { 1065 if (echar == 0) {
1065 1066
1066 if (!(echar = constoe(c))) { 1067 if (!(echar = constoe(c))) {
1067 1068
1068 schar = c; mchar = 0; echar = 0; 1069 schar = c; mchar = 0; echar = 0;
1069 return c; 1070 return c;
1070 } 1071 }
1071 1072
1072 } 1073 }
1073 else { // must figure out what the echar is 1074 else { // must figure out what the echar is
1074 1075
1075 if (echar == 0x11a8) { // ㄱ 1076 if (echar == 0x11a8) { // ㄱ
1076 1077
1077 if (c == 0x1100) echar = 0x11a9; // ㄱ + ㄱ 1078 if (c == 0x1100) echar = 0x11a9; // ㄱ + ㄱ
1078 else if (c == 0x1109) echar = 0x11aa; // ㄱ + ㅅ 1079 else if (c == 0x1109) echar = 0x11aa; // ㄱ + ㅅ
1079 else { 1080 else {
1080 schar = c; mchar = 0; echar = 0; 1081 schar = c; mchar = 0; echar = 0;
1081 return c; 1082 return c;
1082 } 1083 }
1083 1084
1084 } else if (echar == 0x11ab) { // ㄴ 1085 } else if (echar == 0x11ab) { // ㄴ
1085 1086
1086 if (c == 0x110c) echar = 0x11ac; // ㄴ + ㅈ 1087 if (c == 0x110c) echar = 0x11ac; // ㄴ + ㅈ
1087 else if (c == 0x1112) echar = 0x11ad; // ㄴ + ㅎ 1088 else if (c == 0x1112) echar = 0x11ad; // ㄴ + ㅎ
1088 else { 1089 else {
1089 schar = c; mchar = 0; echar = 0; 1090 schar = c; mchar = 0; echar = 0;
1090 return c; 1091 return c;
1091 } 1092 }
1092 1093
1093 } else if (echar == 0x11af) { // ㄹ 1094 } else if (echar == 0x11af) { // ㄹ
1094 1095
1095 if (c == 0x1100) echar = 0x11b0; // ㄹ + ㄱ 1096 if (c == 0x1100) echar = 0x11b0; // ㄹ + ㄱ
1096 else if (c == 0x1106) echar = 0x11b1; // ㄹ + ㅁ 1097 else if (c == 0x1106) echar = 0x11b1; // ㄹ + ㅁ
1097 else if (c == 0x1107) echar = 0x11b2; // ㄹ + ㅂ 1098 else if (c == 0x1107) echar = 0x11b2; // ㄹ + ㅂ
1098 else if (c == 0x1109) echar = 0x11b3; // ㄹ + ㅅ 1099 else if (c == 0x1109) echar = 0x11b3; // ㄹ + ㅅ
1099 else if (c == 0x1110) echar = 0x11b4; // ㄹ + ㅌ 1100 else if (c == 0x1110) echar = 0x11b4; // ㄹ + ㅌ
1100 else if (c == 0x1111) echar = 0x11b5; // ㄹ + ㅍ 1101 else if (c == 0x1111) echar = 0x11b5; // ㄹ + ㅍ
1101 else if (c == 0x1112) echar = 0x11b6; // ㄹ + ㅎ 1102 else if (c == 0x1112) echar = 0x11b6; // ㄹ + ㅎ
1102 else { 1103 else {
1103 schar = c; mchar = 0; echar = 0; 1104 schar = c; mchar = 0; echar = 0;
1104 return c; 1105 return c;
1105 } 1106 }
1106 1107
1107 } else if (echar == 0x11b8) { // ㅂ 1108 } else if (echar == 0x11b8) { // ㅂ
1108 1109
1109 if (c == 0x1109) echar = 0x11b9; // ㅂ + ㅅ 1110 if (c == 0x1109) echar = 0x11b9; // ㅂ + ㅅ
1110 else { 1111 else {
1111 schar = c; mchar = 0; echar = 0; 1112 schar = c; mchar = 0; echar = 0;
1112 return c; 1113 return c;
1113 } 1114 }
1114 1115
1115 } else if (echar == 0x11ba) { // ㅅ 1116 } else if (echar == 0x11ba) { // ㅅ
1116 1117
1117 if (c == 0x1109) echar = 0x11bb; // ㅅ + ㅅ 1118 if (c == 0x1109) echar = 0x11bb; // ㅅ + ㅅ
1118 else { 1119 else {
1119 schar = c; mchar = 0; echar = 0; 1120 schar = c; mchar = 0; echar = 0;
1120 return c; 1121 return c;
1121 } 1122 }
1122 1123
1123 } else { // if any other char, cannot combine chars 1124 } else { // if any other char, cannot combine chars
1124 1125
1125 schar = c; mchar = 0; echar = 0; 1126 schar = c; mchar = 0; echar = 0;
1126 return c; 1127 return c;
1127 } 1128 }
1128 1129
1129 unicode = echar; 1130 unicode = echar;
1130 } 1131 }
1131 } 1132 }
1132 1133
1133 } 1134 }
1134 else if (0x1161 <= c && c <= 0x1175) { // mchar was input 1135 else if (0x1161 <= c && c <= 0x1175) { // mchar was input
1135 1136
1136 if (schar != 0 && mchar == 0) { mchar = c; } 1137 if (schar != 0 && mchar == 0) { mchar = c; }
1137 1138
1138 else if (schar != 0 && mchar != 0 && echar == 0) { 1139 else if (schar != 0 && mchar != 0 && echar == 0) {
1139 1140
1140 switch (mchar) { 1141 switch (mchar) {
1141 case 0x1169: 1142 case 0x1169:
1142 if (c == 0x1161) mchar = 0x116a; 1143 if (c == 0x1161) mchar = 0x116a;
1143 else if (c == 0x1162) mchar = 0x116b; 1144 else if (c == 0x1162) mchar = 0x116b;
1144 else if (c == 0x1175) mchar = 0x116c; 1145 else if (c == 0x1175) mchar = 0x116c;
1145 else { 1146 else {
1146 schar = 0; mchar = 0; echar = 0; 1147 schar = 0; mchar = 0; echar = 0;
1147 return c; 1148 return c;
1148 } 1149 }
1149 break; 1150 break;
1150 case 0x116e: 1151 case 0x116e:
1151 if (c == 0x1165) mchar = 0x116f; 1152 if (c == 0x1165) mchar = 0x116f;
1152 else if (c == 0x1166) mchar = 0x1170; 1153 else if (c == 0x1166) mchar = 0x1170;
1153 else if (c == 0x1175) mchar = 0x1171; 1154 else if (c == 0x1175) mchar = 0x1171;
1154 else { 1155 else {
1155 schar = 0; mchar = 0; echar = 0; 1156 schar = 0; mchar = 0; echar = 0;
1156 return c; 1157 return c;
1157 } 1158 }
1158 break; 1159 break;
1159 case 0x1173: 1160 case 0x1173:
1160 if (c == 0x1175) mchar = 0x1174; 1161 if (c == 0x1175) mchar = 0x1174;
1161 else { 1162 else {
1162 schar = 0; mchar = 0; echar = 0; 1163 schar = 0; mchar = 0; echar = 0;
1163 return c; 1164 return c;
1164 } 1165 }
1165 break; 1166 break;
1166 default: 1167 default:
1167 schar = 0; mchar = 0; echar = 0; 1168 schar = 0; mchar = 0; echar = 0;
1168 return c; 1169 return c;
1169 } 1170 }
1170 } 1171 }
1171 else if (schar != 0 && mchar != 0 && echar != 0) { 1172 else if (schar != 0 && mchar != 0 && echar != 0) {
1172 1173
1173 emit key( 8, Qt::Key_Backspace, 0, true, false ); 1174 emit key( 8, Qt::Key_Backspace, 0, true, false );
1174 1175
1175 ushort prev = 0; 1176 ushort prev = 0;
1176 switch (echar) { 1177 switch (echar) {
1177 /* 1178 /*
1178 case 0x11a9: 1179 case 0x11a9:
1179 prev = combineKoreanChars(schar, mchar, 0x11a8); 1180 prev = combineKoreanChars(schar, mchar, 0x11a8);
1180 schar = 0x1100; 1181 schar = 0x1100;
1181 break; 1182 break;
1182 */ 1183 */
1183 case 0x11aa: 1184 case 0x11aa:
1184 prev = combineKoreanChars(schar, mchar, 0x11a8); 1185 prev = combineKoreanChars(schar, mchar, 0x11a8);
1185 schar = 0x1109; 1186 schar = 0x1109;
1186 break; 1187 break;
1187 case 0x11ac: 1188 case 0x11ac:
1188 prev = combineKoreanChars(schar, mchar, 0x11ab); 1189 prev = combineKoreanChars(schar, mchar, 0x11ab);
1189 schar = 0x110c; 1190 schar = 0x110c;
1190 break; 1191 break;
1191 case 0x11ad: 1192 case 0x11ad:
1192 prev = combineKoreanChars(schar, mchar, 0x11ab); 1193 prev = combineKoreanChars(schar, mchar, 0x11ab);
1193 schar = 0x1112; 1194 schar = 0x1112;
1194 break; 1195 break;
1195 case 0x11b0: 1196 case 0x11b0:
1196 prev = combineKoreanChars(schar, mchar, 0x11af); 1197 prev = combineKoreanChars(schar, mchar, 0x11af);
1197 schar = 0x1100; 1198 schar = 0x1100;
1198 break; 1199 break;
1199 case 0x11b1: 1200 case 0x11b1:
1200 prev = combineKoreanChars(schar, mchar, 0x11af); 1201 prev = combineKoreanChars(schar, mchar, 0x11af);
1201 schar = 0x1106; 1202 schar = 0x1106;
1202 break; 1203 break;
1203 case 0x11b2: 1204 case 0x11b2:
1204 prev = combineKoreanChars(schar, mchar, 0x11af); 1205 prev = combineKoreanChars(schar, mchar, 0x11af);
1205 schar = 0x1107; 1206 schar = 0x1107;
1206 break; 1207 break;
1207 case 0x11b3: 1208 case 0x11b3:
1208 prev = combineKoreanChars(schar, mchar, 0x11af); 1209 prev = combineKoreanChars(schar, mchar, 0x11af);
1209 schar = 0x1109; 1210 schar = 0x1109;
1210 break; 1211 break;
1211 case 0x11b4: 1212 case 0x11b4:
1212 prev = combineKoreanChars(schar, mchar, 0x11af); 1213 prev = combineKoreanChars(schar, mchar, 0x11af);
1213 schar = 0x1110; 1214 schar = 0x1110;
1214 break; 1215 break;
1215 case 0x11b9: 1216 case 0x11b9:
1216 prev = combineKoreanChars(schar, mchar, 0x11b8); 1217 prev = combineKoreanChars(schar, mchar, 0x11b8);
1217 schar = 0x1109; 1218 schar = 0x1109;
1218 break; 1219 break;
1219 /* 1220 /*
1220 case 0x11bb: 1221 case 0x11bb:
1221 prev = combineKoreanChars(schar, mchar, 0x11ba); 1222 prev = combineKoreanChars(schar, mchar, 0x11ba);
1222 schar = 0x1109; 1223 schar = 0x1109;
1223 break; 1224 break;
1224 */ 1225 */
1225 default: 1226 default:
1226 1227
1227 if (constoe(echar)) { 1228 if (constoe(echar)) {
1228 1229
1229 prev = combineKoreanChars(schar, mchar, 0); 1230 prev = combineKoreanChars(schar, mchar, 0);
1230 schar = constoe(echar); 1231 schar = constoe(echar);
1231 } 1232 }
1232 break; 1233 break;
1233 } 1234 }
1234 1235
1235 emit key( prev, prev, 0, true, false ); 1236 emit key( prev, prev, 0, true, false );
1236 1237
1237 mchar = c; echar = 0; 1238 mchar = c; echar = 0;
1238 1239
1239 return combineKoreanChars(schar, mchar, 0); 1240 return combineKoreanChars(schar, mchar, 0);
1240 1241
1241 } 1242 }
1242 else { 1243 else {
1243 schar = 0; mchar = 0; echar = 0; 1244 schar = 0; mchar = 0; echar = 0;
1244 return c; 1245 return c;
1245 } 1246 }
1246 1247
1247 } 1248 }
1248 else /*if (c == ' ')*/ return c; 1249 else /*if (c == ' ')*/ return c;
1249 1250
1250 1251
1251 // and now... finally delete previous char, and return new char 1252 // and now... finally delete previous char, and return new char
1252 emit key( 8, Qt::Key_Backspace, 0, true, false ); 1253 emit key( 8, Qt::Key_Backspace, 0, true, false );
1253 1254
1254 1255
1255 return combineKoreanChars( schar, mchar, echar); 1256 return combineKoreanChars( schar, mchar, echar);
1256 1257
1257} 1258}
1258 1259
1259ushort Keyboard::combineKoreanChars(const ushort s, const ushort m, const ushort e) { 1260ushort Keyboard::combineKoreanChars(const ushort s, const ushort m, const ushort e) {
1260 1261
1261 return ((s - 0x1100) * 588) + ((m - 0x1161) * 28) + (e ? e - 0x11a7 : 0) + 0xac00; 1262 return ((s - 0x1100) * 588) + ((m - 0x1161) * 28) + (e ? e - 0x11a7 : 0) + 0xac00;
1262 1263
1263} 1264}
1264 1265
1265ushort Keyboard::constoe(const ushort c) { 1266ushort Keyboard::constoe(const ushort c) {
1266 1267
1267 // converts schars to echars if possible 1268 // converts schars to echars if possible
1268 1269
1269 if (0x1100 <= c && c <= 0x1112) { // schar to echar 1270 if (0x1100 <= c && c <= 0x1112) { // schar to echar
1270 1271
1271 switch (c) { 1272 switch (c) {
1272 case 0x1100: return 0x11a8; 1273 case 0x1100: return 0x11a8;
1273 case 0x1101: return 0x11a9; 1274 case 0x1101: return 0x11a9;
1274 case 0x1102: return 0x11ab; 1275 case 0x1102: return 0x11ab;
1275 case 0x1103: return 0x11ae; 1276 case 0x1103: return 0x11ae;
1276 case 0x1105: return 0x11af; 1277 case 0x1105: return 0x11af;
1277 case 0x1106: return 0x11b7; 1278 case 0x1106: return 0x11b7;
1278 case 0x1107: return 0x11b8; 1279 case 0x1107: return 0x11b8;
1279 case 0x1109: return 0x11ba; 1280 case 0x1109: return 0x11ba;
1280 case 0x110a: return 0x11bb; 1281 case 0x110a: return 0x11bb;
1281 case 0x110b: return 0x11bc; 1282 case 0x110b: return 0x11bc;
1282 case 0x110c: return 0x11bd; 1283 case 0x110c: return 0x11bd;
1283 case 0x110e: return 0x11be; 1284 case 0x110e: return 0x11be;
1284 case 0x110f: return 0x11bf; 1285 case 0x110f: return 0x11bf;
1285 case 0x1110: return 0x11c0; 1286 case 0x1110: return 0x11c0;
1286 case 0x1111: return 0x11c1; 1287 case 0x1111: return 0x11c1;
1287 case 0x1112: return 0x11c2; 1288 case 0x1112: return 0x11c2;
1288 default: return 0; 1289 default: return 0;
1289 1290
1290 } 1291 }
1291 1292
1292 } else { //echar to schar 1293 } else { //echar to schar
1293 1294
1294 switch (c) { 1295 switch (c) {
1295 case 0x11a8: return 0x1100; 1296 case 0x11a8: return 0x1100;
1296 case 0x11a9: return 0x1101; 1297 case 0x11a9: return 0x1101;
1297 case 0x11ab: return 0x1102; 1298 case 0x11ab: return 0x1102;
1298 case 0x11ae: return 0x1103; 1299 case 0x11ae: return 0x1103;
1299 case 0x11af: return 0x1105; 1300 case 0x11af: return 0x1105;
1300 case 0x11b7: return 0x1106; 1301 case 0x11b7: return 0x1106;
1301 case 0x11b8: return 0x1107; 1302 case 0x11b8: return 0x1107;
1302 case 0x11ba: return 0x1109; 1303 case 0x11ba: return 0x1109;
1303 case 0x11bb: return 0x110a; 1304 case 0x11bb: return 0x110a;
1304 case 0x11bc: return 0x110b; 1305 case 0x11bc: return 0x110b;
1305 case 0x11bd: return 0x110c; 1306 case 0x11bd: return 0x110c;
1306 case 0x11be: return 0x110e; 1307 case 0x11be: return 0x110e;
1307 case 0x11bf: return 0x110f; 1308 case 0x11bf: return 0x110f;
1308 case 0x11c0: return 0x1110; 1309 case 0x11c0: return 0x1110;
1309 case 0x11c1: return 0x1111; 1310 case 0x11c1: return 0x1111;
1310 case 0x11c2: return 0x1112; 1311 case 0x11c2: return 0x1112;
1311 default: return 0; 1312 default: return 0;
1312 1313
1313 } 1314 }
1314 1315
1315 } 1316 }
1316} 1317}
1317 1318
1318 1319
1319// Keys::Keys {{{1 1320// Keys::Keys {{{1
1320 1321
1321Keys::Keys() { 1322Keys::Keys() {
1322 1323
1323 Config *config = new Config ("multikey"); 1324 Config *config = new Config ("multikey");
1324 config->setGroup( "keymaps" ); 1325 config->setGroup( "keymaps" );
1325 QString map = config->readEntry( "current" ); 1326 QString map = config->readEntry( "current" );
1326 delete config; 1327 delete config;
1327 1328
1328 if (map.isNull() || !(QFile(map).exists())) { 1329 if (map.isNull() || !(QFile(map).exists())) {
1329 1330
1330 Config *config = new Config("locale"); 1331 Config *config = new Config("locale");
1331 config->setGroup( "Language" ); 1332 config->setGroup( "Language" );
1332 QString l = config->readEntry( "Language" , "en" ); 1333 QString l = config->readEntry( "Language" , "en" );
1333 delete config; 1334 delete config;
1334 1335
1335 map = QPEApplication::qpeDir() + "/share/multikey/" 1336 map = QPEApplication::qpeDir() + "/share/multikey/"
1336 + l + ".keymap"; 1337 + l + ".keymap";
1337 1338
1338 } 1339 }
1339 if (map.isNull() || !(QFile(map).exists())) { 1340 if (map.isNull() || !(QFile(map).exists())) {
1340 map = QPEApplication::qpeDir() + "/share/multikey/en.keymap"; 1341 map = QPEApplication::qpeDir() + "/share/multikey/en.keymap";
1341 } 1342 }
1342 1343
1343 setKeysFromFile(map); 1344 setKeysFromFile(map);
1344} 1345}
1345 1346
1346Keys::Keys(const char * filename) { 1347Keys::Keys(const char * filename) {
1347 1348
1348 setKeysFromFile(filename); 1349 setKeysFromFile(filename);
1349} 1350}
1350 1351
1351// Keys::setKeysFromFile {{{2 1352// Keys::setKeysFromFile {{{2
1352void Keys::setKeysFromFile(const char * filename) { 1353void Keys::setKeysFromFile(const char * filename) {
1353 1354
1354 QFile f(filename); 1355 QFile f(filename);
1355 1356
1356 if (f.open(IO_ReadOnly)) { 1357 if (f.open(IO_ReadOnly)) {
1357 1358
1358 QTextStream t(&f); 1359 QTextStream t(&f);
1359 int row; 1360 int row;
1360 int qcode; 1361 int qcode;
1361 ushort unicode; 1362 ushort unicode;
1362 int width; 1363 int width;
1363 QString buf; 1364 QString buf;
1364 QString comment; 1365 QString comment;
1365 char * xpm[256]; //couldnt be larger than that... could it? 1366 char * xpm[256]; //couldnt be larger than that... could it?
1366 QImage *xpm2pix = 0; 1367 QImage *xpm2pix = 0;
1367 1368
1368 buf = t.readLine(); 1369 buf = t.readLine();
1369 while (buf) { 1370 while (buf) {
1370 1371
1371 // get rid of comments 1372 // get rid of comments
1372 buf.replace(QRegExp("#.*$", FALSE, FALSE), ""); 1373 buf.replace(QRegExp("#.*$", FALSE, FALSE), "");
1373 1374
1374 // key definition 1375 // key definition
1375 if (buf.contains(QRegExp("^\\d+\\s+[0-1a-fx]+", FALSE, FALSE))) { 1376 if (buf.contains(QRegExp("^\\d+\\s+[0-1a-fx]+", FALSE, FALSE))) {
1376 // no $1 type referencing!!! this implementation of regexp sucks 1377 // no $1 type referencing!!! this implementation of regexp sucks
1377 1378
1378 // dont know of any sscanf() type funcs in Qt lib 1379 // dont know of any sscanf() type funcs in Qt lib
1379 QTextStream tmp (buf, IO_ReadOnly); 1380 QTextStream tmp (buf, IO_ReadOnly);
1380 tmp >> row >> qcode >> unicode >> width >> comment; 1381 tmp >> row >> qcode >> unicode >> width >> comment;
1381 1382
1382 buf = t.readLine(); 1383 buf = t.readLine();
1383 int xpmLineCount = 0; 1384 int xpmLineCount = 0;
1384 xpm2pix = 0; 1385 xpm2pix = 0;
1385 1386
1386 // erase blank space 1387 // erase blank space
1387 while (buf.contains(QRegExp("^\\s*$")) && buf) buf = t.readLine(); 1388 while (buf.contains(QRegExp("^\\s*$")) && buf) buf = t.readLine();
1388 1389
1389 while (buf.contains(QRegExp("^\\s*\".*\""))) { 1390 while (buf.contains(QRegExp("^\\s*\".*\""))) {
1390 1391
1391 QString xpmBuf = buf.stripWhiteSpace(); 1392 QString xpmBuf = buf.stripWhiteSpace();
1392 1393
1393 xpm[xpmLineCount] = new char [xpmBuf.length()]; 1394 xpm[xpmLineCount] = new char [xpmBuf.length()];
1394 1395
1395 int j = 0; 1396 int j = 0;
1396 for (ushort i = 0; i < xpmBuf.length(); i++) { 1397 for (ushort i = 0; i < xpmBuf.length(); i++) {
1397 if (xpmBuf[i].latin1() != '"') { 1398 if (xpmBuf[i].latin1() != '"') {
1398 1399
1399 ((char *)xpm[xpmLineCount])[j] = xpmBuf.at(i).latin1(); 1400 ((char *)xpm[xpmLineCount])[j] = xpmBuf.at(i).latin1();
1400 j++; 1401 j++;
1401 } 1402 }
1402 1403
1403 } 1404 }
1404 // have to close that facker up 1405 // have to close that facker up
1405 ((char *)xpm[xpmLineCount])[j] = '\0'; 1406 ((char *)xpm[xpmLineCount])[j] = '\0';
1406 1407
1407 xpmLineCount++; 1408 xpmLineCount++;
1408 buf = t.readLine(); 1409 buf = t.readLine();
1409 } 1410 }
1410 if (xpmLineCount) { 1411 if (xpmLineCount) {
1411 1412
1412 xpm2pix = new QImage((const char **)xpm); 1413 xpm2pix = new QImage((const char **)xpm);
1413 for (int i = 0; i < xpmLineCount; i++) 1414 for (int i = 0; i < xpmLineCount; i++)
1414 1415
1415 delete [] (xpm[i]); 1416 delete [] (xpm[i]);
1416 1417
1417 } 1418 }
1418 setKey(row, qcode, unicode, width, xpm2pix); 1419 setKey(row, qcode, unicode, width, xpm2pix);
1419 } 1420 }
1420 1421
1421 // shift map 1422 // shift map
1422 else if (buf.contains(QRegExp("^[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) { 1423 else if (buf.contains(QRegExp("^[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) {
1423 1424
1424 QTextStream tmp (buf, IO_ReadOnly); 1425 QTextStream tmp (buf, IO_ReadOnly);
1425 ushort lower, shift; 1426 ushort lower, shift;
1426 tmp >> lower >> shift; 1427 tmp >> lower >> shift;
1427 1428
1428 shiftMap.insert(lower, shift); 1429 shiftMap.insert(lower, shift);
1429 1430
1430 buf = t.readLine(); 1431 buf = t.readLine();
1431 } 1432 }
1432 1433
1433 // meta key map 1434 // meta key map
1434 else if (buf.contains(QRegExp("^\\s*m\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) { 1435 else if (buf.contains(QRegExp("^\\s*m\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) {
1435 1436
1436 QTextStream tmp (buf, IO_ReadOnly); 1437 QTextStream tmp (buf, IO_ReadOnly);
1437 ushort lower, shift; 1438 ushort lower, shift;
1438 QChar m; 1439 QChar m;
1439 tmp >> m >> lower >> shift; 1440 tmp >> m >> lower >> shift;
1440 1441
1441 metaMap.insert(lower, shift); 1442 metaMap.insert(lower, shift);
1442 1443
1443 buf = t.readLine(); 1444 buf = t.readLine();
1444 } 1445 }
1445 1446
1446 // circumflex 1447 // circumflex
1447 else if (buf.contains(QRegExp("^\\s*c\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) { 1448 else if (buf.contains(QRegExp("^\\s*c\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) {
1448 1449
1449 QTextStream tmp (buf, IO_ReadOnly); 1450 QTextStream tmp (buf, IO_ReadOnly);
1450 ushort lower, shift; 1451 ushort lower, shift;
1451 QChar c; 1452 QChar c;
1452 tmp >> c >> lower >> shift; 1453 tmp >> c >> lower >> shift;
1453 1454
1454 circumflexMap.insert(lower, shift); 1455 circumflexMap.insert(lower, shift);
1455 1456
1456 buf = t.readLine(); 1457 buf = t.readLine();
1457 } 1458 }
1458 // diaeresis 1459 // diaeresis
1459 else if (buf.contains(QRegExp("^\\s*d\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) { 1460 else if (buf.contains(QRegExp("^\\s*d\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) {
1460 1461
1461 QTextStream tmp (buf, IO_ReadOnly); 1462 QTextStream tmp (buf, IO_ReadOnly);
1462 ushort lower, shift; 1463 ushort lower, shift;
1463 QChar d; 1464 QChar d;
1464 tmp >> d >> lower >> shift; 1465 tmp >> d >> lower >> shift;
1465 1466
1466 diaeresisMap.insert(lower, shift); 1467 diaeresisMap.insert(lower, shift);
1467 1468
1468 buf = t.readLine(); 1469 buf = t.readLine();
1469 } 1470 }
1470 // back accent 1471 // back accent
1471 else if (buf.contains(QRegExp("^\\s*b\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) { 1472 else if (buf.contains(QRegExp("^\\s*b\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) {
1472 1473
1473 QTextStream tmp (buf, IO_ReadOnly); 1474 QTextStream tmp (buf, IO_ReadOnly);
1474 ushort lower, shift; 1475 ushort lower, shift;
1475 QChar d; 1476 QChar d;
1476 tmp >> d >> lower >> shift; 1477 tmp >> d >> lower >> shift;
1477 1478
1478 baccentMap.insert(lower, shift); 1479 baccentMap.insert(lower, shift);
1479 1480
1480 qDebug ("Estoy aadiendo %i con %i", lower, shift); 1481 qDebug ("Estoy aadiendo %i con %i", lower, shift);
1481 buf = t.readLine(); 1482 buf = t.readLine();
1482 } 1483 }
1483 // accent 1484 // accent
1484 else if (buf.contains(QRegExp("^\\s*a\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) { 1485 else if (buf.contains(QRegExp("^\\s*a\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) {
1485 1486
1486 QTextStream tmp (buf, IO_ReadOnly); 1487 QTextStream tmp (buf, IO_ReadOnly);
1487 ushort lower, shift; 1488 ushort lower, shift;
1488 QChar d; 1489 QChar d;
1489 tmp >> d >> lower >> shift; 1490 tmp >> d >> lower >> shift;
1490 1491
1491 accentMap.insert(lower, shift); 1492 accentMap.insert(lower, shift);
1492 1493
1493 buf = t.readLine(); 1494 buf = t.readLine();
1494 } 1495 }
1495 1496
1496 // other variables like lang & title 1497 // other variables like lang & title
1497 else if (buf.contains(QRegExp("^\\s*[a-zA-Z]+\\s*=\\s*[a-zA-Z0-9/]+\\s*$", FALSE, FALSE))) { 1498 else if (buf.contains(QRegExp("^\\s*[a-zA-Z]+\\s*=\\s*[a-zA-Z0-9/]+\\s*$", FALSE, FALSE))) {
1498 1499
1499 QTextStream tmp (buf, IO_ReadOnly); 1500 QTextStream tmp (buf, IO_ReadOnly);
1500 QString name, equals, value; 1501 QString name, equals, value;
1501 1502
1502 tmp >> name >> equals >> value; 1503 tmp >> name >> equals >> value;
1503 1504
1504 if (name == "lang") { 1505 if (name == "lang") {
1505 1506
1506 lang = value; 1507 lang = value;
1507 1508
1508 } 1509 }
1509 1510
1510 buf = t.readLine(); 1511 buf = t.readLine();
1511 } 1512 }
1512 // comments 1513 // comments
1513 else if (buf.contains(QRegExp("^\\s*#"))) { 1514 else if (buf.contains(QRegExp("^\\s*#"))) {
1514 1515
1515 buf = t.readLine(); 1516 buf = t.readLine();
1516 1517
1517 } else { // blank line, or garbage 1518 } else { // blank line, or garbage
1518 1519
1519 buf = t.readLine(); 1520 buf = t.readLine();
1520 1521
1521 } 1522 }
1522 1523
1523 } 1524 }
1524 f.close(); 1525 f.close();
1525 } 1526 }
1526 1527
1527} 1528}
1528 1529
1529// Keys::setKey {{{2 1530// Keys::setKey {{{2
1530void Keys::setKey(const int row, const int qcode, const ushort unicode, 1531void Keys::setKey(const int row, const int qcode, const ushort unicode,
1531 const int width, QImage *pix) { 1532 const int width, QImage *pix) {
1532 1533
1533 Key * key; 1534 Key * key;
1534 key = new Key; 1535 key = new Key;
1535 key->qcode = qcode; 1536 key->qcode = qcode;
1536 key->unicode = unicode; 1537 key->unicode = unicode;
1537 key->width = width; 1538 key->width = width;
1538 1539
1539 // share key->pressed between same keys 1540 // share key->pressed between same keys
1540 bool found = 0; 1541 bool found = 0;
1541 for (int i = 1; i <= 5; i++) { 1542 for (int i = 1; i <= 5; i++) {
1542 for (unsigned int j = 0; j < keys[i].count(); j++) 1543 for (unsigned int j = 0; j < keys[i].count(); j++)
1543 if (keys[i].at(j)->qcode == qcode && keys[i].at(j)->unicode == unicode) { 1544 if (keys[i].at(j)->qcode == qcode && keys[i].at(j)->unicode == unicode) {
1544 1545
1545 key->pressed = keys[i].at(j)->pressed; 1546 key->pressed = keys[i].at(j)->pressed;
1546 found = 1; 1547 found = 1;
1547 } 1548 }
1548 1549
1549 } 1550 }
1550 if (!found) { 1551 if (!found) {
1551 1552
1552 key->pressed = new bool; 1553 key->pressed = new bool;
1553 *(key->pressed) = 0; 1554 *(key->pressed) = 0;
1554 } 1555 }
1555 1556
1556 key->pix = pix; 1557 key->pix = pix;
1557 1558
1558 1559
1559 keys[row].append(key); 1560 keys[row].append(key);
1560} 1561}
1561 1562
1562// Keys::~Keys {{{2 1563// Keys::~Keys {{{2
1563Keys::~Keys() { 1564Keys::~Keys() {
1564 1565
1565 for (int i = 1; i <= 5; i++) 1566 for (int i = 1; i <= 5; i++)
1566 for (unsigned int j = 0; j < keys[i].count(); j++) 1567 for (unsigned int j = 0; j < keys[i].count(); j++)
1567 delete keys[i].at(j); 1568 delete keys[i].at(j);
1568 1569
1569} 1570}
1570 1571
1571// Keys:: other functions {{{2 1572// Keys:: other functions {{{2
1572int Keys::width(const int row, const int col) { 1573int Keys::width(const int row, const int col) {
1573 1574
1574 return keys[row].at(col)->width; 1575 return keys[row].at(col)->width;
1575 1576
1576} 1577}
1577 1578
1578int Keys::rows() { 1579int Keys::rows() {
1579 1580
1580 for (int i = 1; i <= 5; i++) { 1581 for (int i = 1; i <= 5; i++) {
1581 1582
1582 if (keys[i].count() == 0) 1583 if (keys[i].count() == 0)
1583 return i - 1; 1584 return i - 1;
1584 1585
1585 } 1586 }
1586 return 5; 1587 return 5;
1587} 1588}
1588 1589
1589ushort Keys::uni(const int row, const int col) { 1590ushort Keys::uni(const int row, const int col) {
1590 1591
1591 return keys[row].at(col)->unicode; 1592 return keys[row].at(col)->unicode;
1592 1593
1593} 1594}
1594 1595
1595int Keys::qcode(const int row, const int col) { 1596int Keys::qcode(const int row, const int col) {
1596 1597
1597 return keys[row].at(col)->qcode; 1598 return keys[row].at(col)->qcode;
1598} 1599}
1599 1600
1600QImage *Keys::pix(const int row, const int col) { 1601QImage *Keys::pix(const int row, const int col) {
1601 1602
1602 return keys[row].at(col)->pix; 1603 return keys[row].at(col)->pix;
1603 1604
1604} 1605}
1605bool Keys::pressed(const int row, const int col) { 1606bool Keys::pressed(const int row, const int col) {
1606 1607
1607 return *(keys[row].at(col)->pressed); 1608 return *(keys[row].at(col)->pressed);
1608} 1609}
1609 1610
1610int Keys::numKeys(const int row) { 1611int Keys::numKeys(const int row) {
1611 1612
1612 return keys[row].count(); 1613 return keys[row].count();
1613} 1614}
1614 1615
1615void Keys::setPressed(const int row, const int col, const bool pressed) { 1616void Keys::setPressed(const int row, const int col, const bool pressed) {
1616 1617
1617 *(keys[row].at(col)->pressed) = pressed; 1618 *(keys[row].at(col)->pressed) = pressed;
1618} 1619}
1619 1620
1620ushort Keys::shift(const ushort uni) { 1621ushort Keys::shift(const ushort uni) {
1621 1622
1622 if (shiftMap[uni]) return shiftMap[uni]; 1623 if (shiftMap[uni]) return shiftMap[uni];
1623 else return 0; 1624 else return 0;
1624} 1625}
1625 1626
1626ushort Keys::meta(const ushort uni) { 1627ushort Keys::meta(const ushort uni) {
1627 1628
1628 if (metaMap[uni]) return metaMap[uni]; 1629 if (metaMap[uni]) return metaMap[uni];
1629 else return 0; 1630 else return 0;
1630} 1631}
1631 1632
1632ushort Keys::circumflex(const ushort uni) { 1633ushort Keys::circumflex(const ushort uni) {
1633 1634
1634 if (circumflexMap[uni]) return circumflexMap[uni]; 1635 if (circumflexMap[uni]) return circumflexMap[uni];
1635 else return 0; 1636 else return 0;
1636} 1637}
1637 1638
1638ushort Keys::diaeresis(const ushort uni) { 1639ushort Keys::diaeresis(const ushort uni) {
1639 1640
1640 if(diaeresisMap[uni]) return diaeresisMap[uni]; 1641 if(diaeresisMap[uni]) return diaeresisMap[uni];
1641 else return 0; 1642 else return 0;
1642} 1643}
1643 1644
1644ushort Keys::baccent(const ushort uni) { 1645ushort Keys::baccent(const ushort uni) {
1645 1646
1646 if(baccentMap[uni]) return baccentMap[uni]; 1647 if(baccentMap[uni]) return baccentMap[uni];
1647 else return 0; 1648 else return 0;
1648} 1649}
1649 1650
1650ushort Keys::accent(const ushort uni) { 1651ushort Keys::accent(const ushort uni) {
1651 1652
1652 if(accentMap[uni]) return accentMap[uni]; 1653 if(accentMap[uni]) return accentMap[uni];
1653 else return 0; 1654 else return 0;
1654} 1655}
1655 1656
1656bool *Keys::pressedPtr(const int row, const int col) { 1657bool *Keys::pressedPtr(const int row, const int col) {
1657 1658
1658 return keys[row].at(col)->pressed; 1659 return keys[row].at(col)->pressed;
1659} 1660}
diff --git a/inputmethods/multikey/keyboard.h b/inputmethods/multikey/keyboard.h
index bc74e71..20c5cee 100644
--- a/inputmethods/multikey/keyboard.h
+++ b/inputmethods/multikey/keyboard.h
@@ -1,188 +1,191 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved. 2** Copyright (C) 2000 Trolltech AS. All rights reserved.
3** 3**
4** This file is part of Qtopia Environment. 4** This file is part of Qtopia Environment.
5** 5**
6** This file may be distributed and/or modified under the terms of the 6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software 7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the 8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file. 9** packaging of this file.
10** 10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information. 14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15** 15**
16** Contact info@trolltech.com if any conditions of this licensing are 16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 17** not clear to you.
18** 18**
19**********************************************************************/ 19**********************************************************************/
20#include <qframe.h> 20#include <qframe.h>
21#include <qmap.h> 21#include <qmap.h>
22#include "../pickboard/pickboardcfg.h" 22#include "../pickboard/pickboardcfg.h"
23#include "../pickboard/pickboardpicks.h" 23#include "../pickboard/pickboardpicks.h"
24#include "configdlg.h" 24#include "configdlg.h"
25 25
26class QTimer; 26class QTimer;
27 27
28namespace MultiKey
29{
30
28class KeyboardConfig : public DictFilterConfig 31class KeyboardConfig : public DictFilterConfig
29{ 32{
30public: 33public:
31 KeyboardConfig(PickboardPicks* p) : DictFilterConfig(p), backspaces(0) { nrows = 1; } 34 KeyboardConfig(PickboardPicks* p) : DictFilterConfig(p), backspaces(0) { nrows = 1; }
32 virtual void generateText(const QString &s); 35 virtual void generateText(const QString &s);
33 void decBackspaces() { if (backspaces) backspaces--; } 36 void decBackspaces() { if (backspaces) backspaces--; }
34 void incBackspaces() { backspaces++; } 37 void incBackspaces() { backspaces++; }
35 void resetBackspaces() { backspaces = 0; } 38 void resetBackspaces() { backspaces = 0; }
36private: 39private:
37 int backspaces; 40 int backspaces;
38}; 41};
39 42
40 43
41class KeyboardPicks : public PickboardPicks 44class KeyboardPicks : public PickboardPicks
42{ 45{
43 Q_OBJECT 46 Q_OBJECT
44public: 47public:
45 KeyboardPicks(QWidget* parent=0, const char* name=0, WFlags f=0) 48 KeyboardPicks(QWidget* parent=0, const char* name=0, WFlags f=0)
46 : PickboardPicks(parent, name, f) { } 49 : PickboardPicks(parent, name, f) { }
47 void initialise(); 50 void initialise();
48 virtual QSize sizeHint() const; 51 virtual QSize sizeHint() const;
49 KeyboardConfig *dc; 52 KeyboardConfig *dc;
50}; 53};
51 54
52 55
53class Keys { 56class Keys {
54public: 57public:
55 58
56 Keys(); 59 Keys();
57 Keys(const char * filename); 60 Keys(const char * filename);
58 ~Keys(); 61 ~Keys();
59 int width(const int row, const int col); 62 int width(const int row, const int col);
60 int rows(); 63 int rows();
61 ushort uni(const int row, const int col); 64 ushort uni(const int row, const int col);
62 int qcode(const int row, const int col); 65 int qcode(const int row, const int col);
63 bool pressed(const int row, const int col); 66 bool pressed(const int row, const int col);
64 bool *pressedPtr(const int row, const int col); 67 bool *pressedPtr(const int row, const int col);
65 ushort shift(const ushort); 68 ushort shift(const ushort);
66 ushort meta(const ushort); 69 ushort meta(const ushort);
67 ushort circumflex(const ushort); 70 ushort circumflex(const ushort);
68 ushort diaeresis(const ushort); 71 ushort diaeresis(const ushort);
69 ushort baccent(const ushort); 72 ushort baccent(const ushort);
70 ushort accent(const ushort); 73 ushort accent(const ushort);
71 QImage *pix(const int row, const int col); 74 QImage *pix(const int row, const int col);
72 int numKeys(const int row); 75 int numKeys(const int row);
73 void setKeysFromFile(const char *filename); 76 void setKeysFromFile(const char *filename);
74 void setKey(const int row, const int qcode, const ushort unicode, 77 void setKey(const int row, const int qcode, const ushort unicode,
75 const int width, QImage *pix); 78 const int width, QImage *pix);
76 void setPressed(const int row, const int col, const bool pressed); 79 void setPressed(const int row, const int col, const bool pressed);
77 QString lang; 80 QString lang;
78 QString label; 81 QString label;
79 82
80private: 83private:
81 84
82 typedef struct Key { 85 typedef struct Key {
83 int qcode; // are qt key codes just unicode values? 86 int qcode; // are qt key codes just unicode values?
84 ushort unicode; 87 ushort unicode;
85 int width; // not pixels but relative key width. normal key is 2 88 int width; // not pixels but relative key width. normal key is 2
86 89
87 // only needed for keys like ctrl that can have multiple keys pressed at once 90 // only needed for keys like ctrl that can have multiple keys pressed at once
88 bool *pressed; 91 bool *pressed;
89 QImage *pix; 92 QImage *pix;
90 }; 93 };
91 94
92 QList<Key> keys[6]; 95 QList<Key> keys[6];
93 QMap<ushort,ushort> shiftMap; 96 QMap<ushort,ushort> shiftMap;
94 QMap<ushort,ushort> metaMap; 97 QMap<ushort,ushort> metaMap;
95 QMap<ushort,ushort> circumflexMap; 98 QMap<ushort,ushort> circumflexMap;
96 QMap<ushort,ushort> diaeresisMap; 99 QMap<ushort,ushort> diaeresisMap;
97 QMap<ushort,ushort> baccentMap; 100 QMap<ushort,ushort> baccentMap;
98 QMap<ushort,ushort> accentMap; 101 QMap<ushort,ushort> accentMap;
99 102
100}; 103};
101 104
102class Keyboard : public QFrame 105class Keyboard : public QFrame
103{ 106{
104 Q_OBJECT 107 Q_OBJECT
105public: 108public:
106 Keyboard( QWidget* parent=0, const char* name=0, WFlags f=0 ); 109 Keyboard( QWidget* parent=0, const char* name=0, WFlags f=0 );
107 ~Keyboard(); 110 ~Keyboard();
108 111
109 void resetState(); 112 void resetState();
110 113
111 void mousePressEvent(QMouseEvent*); 114 void mousePressEvent(QMouseEvent*);
112 void mouseReleaseEvent(QMouseEvent*); 115 void mouseReleaseEvent(QMouseEvent*);
113 void resizeEvent(QResizeEvent*); 116 void resizeEvent(QResizeEvent*);
114 void paintEvent(QPaintEvent* e); 117 void paintEvent(QPaintEvent* e);
115 //void timerEvent(QTimerEvent* e); 118 //void timerEvent(QTimerEvent* e);
116 void drawKeyboard( QPainter &p, int row = -1, int col = -1); 119 void drawKeyboard( QPainter &p, int row = -1, int col = -1);
117 120
118 QSize sizeHint() const; 121 QSize sizeHint() const;
119 122
120signals: 123signals:
121 void key( ushort scancode, ushort unicode, ushort modifiers, bool, bool ); 124 void key( ushort scancode, ushort unicode, ushort modifiers, bool, bool );
122 125
123private slots: 126private slots:
124 void repeat(); 127 void repeat();
125 void togglePickboard(bool on_off); 128 void togglePickboard(bool on_off);
126 void toggleRepeat(bool on_off); 129 void toggleRepeat(bool on_off);
127 void setMapToDefault(); 130 void setMapToDefault();
128 void setMapToFile(QString map); 131 void setMapToFile(QString map);
129 void cleanupConfigDlg(); 132 void cleanupConfigDlg();
130 133
131 // used to redraw keyboard after edited colors 134 // used to redraw keyboard after edited colors
132 void reloadKeyboard(); 135 void reloadKeyboard();
133 136
134private: 137private:
135 int getKey( int &w, int j = -1 ); 138 int getKey( int &w, int j = -1 );
136 void clearHighlight(); 139 void clearHighlight();
137 140
138 bool *shift; 141 bool *shift;
139 bool *lock; 142 bool *lock;
140 bool *ctrl; 143 bool *ctrl;
141 bool *alt; 144 bool *alt;
142 bool *meta; 145 bool *meta;
143 bool *circumflex; 146 bool *circumflex;
144 bool *diaeresis; 147 bool *diaeresis;
145 bool *baccent; 148 bool *baccent;
146 bool *accent; 149 bool *accent;
147 150
148 uint useLargeKeys:1; 151 uint useLargeKeys:1;
149 uint usePicks:1; 152 uint usePicks:1;
150 uint useRepeat:1; 153 uint useRepeat:1;
151 154
152 int pressedKeyRow; 155 int pressedKeyRow;
153 int pressedKeyCol; 156 int pressedKeyCol;
154 157
155 KeyboardPicks *picks; 158 KeyboardPicks *picks;
156 159
157 int keyHeight; 160 int keyHeight;
158 int defaultKeyWidth; 161 int defaultKeyWidth;
159 int xoffs; 162 int xoffs;
160 163
161 int unicode; 164 int unicode;
162 int qkeycode; 165 int qkeycode;
163 int modifiers; 166 int modifiers;
164 167
165 int pressTid; 168 int pressTid;
166 bool pressed; 169 bool pressed;
167 170
168 Keys *keys; 171 Keys *keys;
169 172
170 /* for korean input */ 173 /* for korean input */
171 ushort schar, mchar, echar; 174 ushort schar, mchar, echar;
172 ushort parseKoreanInput(ushort c); 175 ushort parseKoreanInput(ushort c);
173 ushort combineKoreanChars(const ushort s, const ushort m, const ushort e); 176 ushort combineKoreanChars(const ushort s, const ushort m, const ushort e);
174 ushort constoe(const ushort c); 177 ushort constoe(const ushort c);
175 178
176 QTimer *repeatTimer; 179 QTimer *repeatTimer;
177 180
178 /* colors */ 181 /* colors */
179 void loadKeyboardColors(); 182 void loadKeyboardColors();
180 QColor keycolor; 183 QColor keycolor;
181 QColor keycolor_pressed; 184 QColor keycolor_pressed;
182 QColor keycolor_lines; 185 QColor keycolor_lines;
183 QColor textcolor; 186 QColor textcolor;
184 187
185 ConfigDlg *configdlg; 188 ConfigDlg *configdlg;
186}; 189};
187 190
188 191} // namespace MultiKey
diff --git a/inputmethods/multikey/keyboardimpl.cpp b/inputmethods/multikey/keyboardimpl.cpp
index cebd43d..4cfbcd5 100644
--- a/inputmethods/multikey/keyboardimpl.cpp
+++ b/inputmethods/multikey/keyboardimpl.cpp
@@ -1,107 +1,107 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved. 2** Copyright (C) 2000 Trolltech AS. All rights reserved.
3** 3**
4** This file is part of Qtopia Environment. 4** This file is part of Qtopia Environment.
5** 5**
6** This file may be distributed and/or modified under the terms of the 6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software 7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the 8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file. 9** packaging of this file.
10** 10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information. 14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15** 15**
16** Contact info@trolltech.com if any conditions of this licensing are 16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 17** not clear to you.
18** 18**
19**********************************************************************/ 19**********************************************************************/
20#include <qapplication.h> 20#include <qapplication.h>
21#include <qpixmap.h> 21#include <qpixmap.h>
22#include "keyboard.h" 22#include "keyboard.h"
23#include "keyboardimpl.h" 23#include "keyboardimpl.h"
24 24
25/* XPM */ 25/* XPM */
26static const char * kb_xpm[] = { 26static const char * const kb_xpm[] = {
27"28 13 4 1", 27"28 13 4 1",
28" c None", 28" c None",
29". c #4C4C4C", 29". c #4C4C4C",
30"+ c #FFF7DD", 30"+ c #FFF7DD",
31"@ c #D6CFBA", 31"@ c #D6CFBA",
32" .......................... ", 32" .......................... ",
33" .+++.+++.+++.+++.+++.++++. ", 33" .+++.+++.+++.+++.+++.++++. ",
34" .+@@.+@@.+@@.+@@.+@@.+@@@. ", 34" .+@@.+@@.+@@.+@@.+@@.+@@@. ",
35" .......................... ", 35" .......................... ",
36" .+++++.+++.+++.+++.++++++. ", 36" .+++++.+++.+++.+++.++++++. ",
37" .+@@@@.+@@.+@@.+@@.+@@@@@. ", 37" .+@@@@.+@@.+@@.+@@.+@@@@@. ",
38" .......................... ", 38" .......................... ",
39" .++++++.+++.+++.+++.+++++. ", 39" .++++++.+++.+++.+++.+++++. ",
40" .+@@@@@.+@@.+@@.+@@.+@@@@. ", 40" .+@@@@@.+@@.+@@.+@@.+@@@@. ",
41" .......................... ", 41" .......................... ",
42" .++++.++++++++++++++.++++. ", 42" .++++.++++++++++++++.++++. ",
43" .+@@@.+@@@@@@@@@@@@@.+@@@. ", 43" .+@@@.+@@@@@@@@@@@@@.+@@@. ",
44" .......................... "}; 44" .......................... "};
45 45
46 46
47KeyboardImpl::KeyboardImpl() 47KeyboardImpl::KeyboardImpl()
48 : input(0), icn(0), ref(0) 48 : input(0), icn(0), ref(0)
49{ 49{
50} 50}
51 51
52KeyboardImpl::~KeyboardImpl() 52KeyboardImpl::~KeyboardImpl()
53{ 53{
54 delete input; 54 delete input;
55 delete icn; 55 delete icn;
56} 56}
57 57
58QWidget *KeyboardImpl::inputMethod( QWidget *parent, Qt::WFlags f ) 58QWidget *KeyboardImpl::inputMethod( QWidget *parent, Qt::WFlags f )
59{ 59{
60 if ( !input ) 60 if ( !input )
61 input = new Keyboard( parent, "Keyboard", f ); 61 input = new MultiKey::Keyboard( parent, "Keyboard", f );
62 return input; 62 return input;
63} 63}
64 64
65void KeyboardImpl::resetState() 65void KeyboardImpl::resetState()
66{ 66{
67 if ( input ) 67 if ( input )
68 input->resetState(); 68 input->resetState();
69} 69}
70 70
71QPixmap *KeyboardImpl::icon() 71QPixmap *KeyboardImpl::icon()
72{ 72{
73 if ( !icn ) 73 if ( !icn )
74 icn = new QPixmap( (const char **)kb_xpm ); 74 icn = new QPixmap( (const char **)kb_xpm );
75 return icn; 75 return icn;
76} 76}
77 77
78QString KeyboardImpl::name() 78QString KeyboardImpl::name()
79{ 79{
80 return qApp->translate( "InputMethods", "Multikey" ); 80 return qApp->translate( "InputMethods", "Multikey" );
81} 81}
82 82
83void KeyboardImpl::onKeyPress( QObject *receiver, const char *slot ) 83void KeyboardImpl::onKeyPress( QObject *receiver, const char *slot )
84{ 84{
85 if ( input ) 85 if ( input )
86 QObject::connect( input, SIGNAL(key(ushort,ushort,ushort,bool,bool)), receiver, slot ); 86 QObject::connect( input, SIGNAL(key(ushort,ushort,ushort,bool,bool)), receiver, slot );
87} 87}
88 88
89#ifndef QT_NO_COMPONENT 89#ifndef QT_NO_COMPONENT
90QRESULT KeyboardImpl::queryInterface( const QUuid &uuid, QUnknownInterface **iface ) 90QRESULT KeyboardImpl::queryInterface( const QUuid &uuid, QUnknownInterface **iface )
91{ 91{
92 *iface = 0; 92 *iface = 0;
93 if ( uuid == IID_QUnknown ) 93 if ( uuid == IID_QUnknown )
94 *iface = this; 94 *iface = this;
95 else if ( uuid == IID_InputMethod ) 95 else if ( uuid == IID_InputMethod )
96 *iface = this; 96 *iface = this;
97 97
98 if ( *iface ) 98 if ( *iface )
99 (*iface)->addRef(); 99 (*iface)->addRef();
100 return QS_OK; 100 return QS_OK;
101} 101}
102 102
103Q_EXPORT_INTERFACE() 103Q_EXPORT_INTERFACE()
104{ 104{
105 Q_CREATE_INSTANCE( KeyboardImpl ) 105 Q_CREATE_INSTANCE( KeyboardImpl )
106} 106}
107#endif 107#endif
diff --git a/inputmethods/multikey/keyboardimpl.h b/inputmethods/multikey/keyboardimpl.h
index e756364..76a2955 100644
--- a/inputmethods/multikey/keyboardimpl.h
+++ b/inputmethods/multikey/keyboardimpl.h
@@ -1,51 +1,60 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved. 2** Copyright (C) 2000 Trolltech AS. All rights reserved.
3** 3**
4** This file is part of Qtopia Environment. 4** This file is part of Qtopia Environment.
5** 5**
6** This file may be distributed and/or modified under the terms of the 6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software 7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the 8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file. 9** packaging of this file.
10** 10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information. 14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15** 15**
16** Contact info@trolltech.com if any conditions of this licensing are 16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 17** not clear to you.
18** 18**
19**********************************************************************/ 19**********************************************************************/
20#ifndef KEYBOARDIMPL_H 20#ifndef KEYBOARDIMPL_H
21#define KEYBOARDIMPL_H 21#define KEYBOARDIMPL_H
22 22
23#include <qpe/inputmethodinterface.h> 23#include <qpe/inputmethodinterface.h>
24 24
25class Keyboard; 25namespace MultiKey
26{
27 class Keyboard;
28}
29
26class QPixmap; 30class QPixmap;
27 31
32namespace
33{
34
28class KeyboardImpl : public InputMethodInterface 35class KeyboardImpl : public InputMethodInterface
29{ 36{
30public: 37public:
31 KeyboardImpl(); 38 KeyboardImpl();
32 virtual ~KeyboardImpl(); 39 virtual ~KeyboardImpl();
33 40
34#ifndef QT_NO_COMPONENT 41#ifndef QT_NO_COMPONENT
35 QRESULT queryInterface( const QUuid&, QUnknownInterface** ); 42 QRESULT queryInterface( const QUuid&, QUnknownInterface** );
36 Q_REFCOUNT 43 Q_REFCOUNT
37#endif 44#endif
38 45
39 virtual QWidget *inputMethod( QWidget *parent, Qt::WFlags f ); 46 virtual QWidget *inputMethod( QWidget *parent, Qt::WFlags f );
40 virtual void resetState(); 47 virtual void resetState();
41 virtual QPixmap *icon(); 48 virtual QPixmap *icon();
42 virtual QString name(); 49 virtual QString name();
43 virtual void onKeyPress( QObject *receiver, const char *slot ); 50 virtual void onKeyPress( QObject *receiver, const char *slot );
44 51
45private: 52private:
46 Keyboard *input; 53 MultiKey::Keyboard *input;
47 QPixmap *icn; 54 QPixmap *icn;
48 ulong ref; 55 ulong ref;
49}; 56};
50 57
58} // anonymous namespace
59
51#endif 60#endif