summaryrefslogtreecommitdiff
path: root/inputmethods
Unidiff
Diffstat (limited to 'inputmethods') (more/less context) (ignore whitespace changes)
-rw-r--r--inputmethods/multikey/keyboard.cpp67
-rw-r--r--inputmethods/multikey/keyboard.h4
-rw-r--r--inputmethods/multikey/multikey.pro2
3 files changed, 53 insertions, 20 deletions
diff --git a/inputmethods/multikey/keyboard.cpp b/inputmethods/multikey/keyboard.cpp
index 8f4d562..a19f07a 100644
--- a/inputmethods/multikey/keyboard.cpp
+++ b/inputmethods/multikey/keyboard.cpp
@@ -1,98 +1,106 @@
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 23
23#include <qpe/global.h> 24#include <qpe/global.h>
25#include <qpe/qcopenvelope_qws.h>
24 26
25#include <qwindowsystem_qws.h> 27#include <qwindowsystem_qws.h>
26#include <qpainter.h> 28#include <qpainter.h>
27#include <qfontmetrics.h> 29#include <qfontmetrics.h>
28#include <qtimer.h> 30#include <qtimer.h>
29#include <qpe/qpeapplication.h> 31#include <qpe/qpeapplication.h>
30#include <qpe/config.h> 32#include <qpe/config.h>
31#include <ctype.h> 33#include <ctype.h>
32#include <qfile.h> 34#include <qfile.h>
33#include <qtextstream.h> 35#include <qtextstream.h>
34 36
35#include <sys/utsname.h> 37#include <sys/utsname.h>
36 38
37 39
38#define USE_SMALL_BACKSPACE 40#define USE_SMALL_BACKSPACE
39 41
40/* Keyboard::Keyboard {{{1 */ 42/* Keyboard::Keyboard {{{1 */
41Keyboard::Keyboard(QWidget* parent, const char* _name, WFlags f) : 43Keyboard::Keyboard(QWidget* parent, const char* _name, WFlags f) :
42 QFrame(parent, _name, f), shift(0), lock(0), ctrl(0), 44 QFrame(parent, _name, f), shift(0), lock(0), ctrl(0),
43 alt(0), useLargeKeys(TRUE), usePicks(0), pressedKeyRow(-1), pressedKeyCol(-1), 45 alt(0), useLargeKeys(TRUE), usePicks(0), pressedKeyRow(-1), pressedKeyCol(-1),
44 unicode(-1), qkeycode(0), modifiers(0), LANG("ko"), schar(0), mchar(0), echar(0) 46 unicode(-1), qkeycode(0), modifiers(0), LANG("ko"), schar(0), mchar(0), echar(0),
47 configdlg(0)
48
45{ 49{
46 // get the default font 50 // get the default font
47 Config qpeConfig( "qpe" ); 51 Config qpeConfig( "qpe" );
48 qpeConfig.setGroup( "Appearance" ); 52 qpeConfig.setGroup( "Appearance" );
49 QString familyStr = qpeConfig.readEntry( "FontFamily", "fixed" ); 53 QString familyStr = qpeConfig.readEntry( "FontFamily", "fixed" );
50 54
55 Config multiConfig ("multikey");
56 multiConfig.setGroup ("pickboard");
57 usePicks = multiConfig.readBoolEntry ("open", "0"); // default closed
58
51 setFont( QFont( familyStr, 8 ) ); 59 setFont( QFont( familyStr, 8 ) );
52 60
53 picks = new KeyboardPicks( this ); 61 picks = new KeyboardPicks( this );
54 picks->setFont( QFont( familyStr, 8 ) ); 62 picks->setFont( QFont( familyStr, 8 ) );
55 picks->initialise(); 63 picks->initialise();
56 if (usePicks) { 64 if (usePicks) {
57 65
58 QObject::connect( picks, SIGNAL(key(ushort,ushort,ushort,bool,bool) ), 66 QObject::connect( picks, SIGNAL(key(ushort,ushort,ushort,bool,bool) ),
59 this, SIGNAL(key(ushort,ushort,ushort,bool,bool)) ); 67 this, SIGNAL(key(ushort,ushort,ushort,bool,bool)) );
60 68
61 } else picks->hide(); 69 } else picks->hide();
62 70
63 Config config("locale"); 71 Config config("locale");
64 config.setGroup( "Language" ); 72 config.setGroup( "Language" );
65 LANG = config.readEntry( "Language", "en" ); 73 LANG = config.readEntry( "Language", "en" );
66 74
67 repeatTimer = new QTimer( this ); 75 repeatTimer = new QTimer( this );
68 connect( repeatTimer, SIGNAL(timeout()), this, SLOT(repeat()) ); 76 connect( repeatTimer, SIGNAL(timeout()), this, SLOT(repeat()) );
69 77
70} 78}
71 79
72/* Keyboard::resizeEvent {{{1 */ 80/* Keyboard::resizeEvent {{{1 */
73void Keyboard::resizeEvent(QResizeEvent*) 81void Keyboard::resizeEvent(QResizeEvent*)
74{ 82{
75 int ph = picks->sizeHint().height(); 83 int ph = picks->sizeHint().height();
76 picks->setGeometry( 0, 0, width(), ph ); 84 picks->setGeometry( 0, 0, width(), ph );
77 keyHeight = (height()-(usePicks ? ph : 0))/5; 85 keyHeight = (height()-(usePicks ? ph : 0))/5;
78 86
79 int nk; // number of keys? 87 int nk; // number of keys?
80 if ( useLargeKeys ) { 88 if ( useLargeKeys ) {
81 nk = 15; 89 nk = 15;
82 } else { 90 } else {
83 nk = 19; 91 nk = 19;
84 } 92 }
85 defaultKeyWidth = (width()/nk)/2; 93 defaultKeyWidth = (width()/nk)/2;
86 xoffs = (width()-defaultKeyWidth*nk)/2; // empty key spaces? 94 xoffs = (width()-defaultKeyWidth*nk)/2; // empty key spaces?
87 95
88} 96}
89 97
90/* KeyboardPicks::initialize {{{1 */ 98/* KeyboardPicks::initialize {{{1 */
91void KeyboardPicks::initialise() 99void KeyboardPicks::initialise()
92{ 100{
93 setSizePolicy(QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed)); 101 setSizePolicy(QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed));
94 mode = 0; 102 mode = 0;
95 dc = new KeyboardConfig(this); 103 dc = new KeyboardConfig(this);
96 configs.append(dc); 104 configs.append(dc);
97} 105}
98 106
@@ -217,117 +225,109 @@ void Keyboard::drawKeyboard(QPainter &p, int row, int col)
217 else { 225 else {
218 // center the image in the middle of the key 226 // center the image in the middle of the key
219 p.drawPixmap( x + (keyWidthPix - pix->width())/2, 227 p.drawPixmap( x + (keyWidthPix - pix->width())/2,
220 y + (keyHeight - pix->height())/2 + 1, 228 y + (keyHeight - pix->height())/2 + 1,
221 QPixmap(*pix) ); 229 QPixmap(*pix) );
222 } 230 }
223 231
224 p.setPen(keycolor_lines); 232 p.setPen(keycolor_lines);
225 p.drawLine(x, y, x, y + keyHeight); 233 p.drawLine(x, y, x, y + keyHeight);
226 234
227 x += keyWidthPix; 235 x += keyWidthPix;
228 } 236 }
229 237
230 238
231 } 239 }
232 p.drawLine(0, height() - 1, width(), height() - 1); 240 p.drawLine(0, height() - 1, width(), height() - 1);
233 p.drawLine(width() - 1, 0, width() - 1, height()); 241 p.drawLine(width() - 1, 0, width() - 1, height());
234 } 242 }
235 243
236} 244}
237 245
238 246
239/* Keyboard::mousePressEvent {{{1 */ 247/* Keyboard::mousePressEvent {{{1 */
240void Keyboard::mousePressEvent(QMouseEvent *e) 248void Keyboard::mousePressEvent(QMouseEvent *e)
241{ 249{
242 int row = (e->y() - (usePicks ? picks->height() : 0)) / keyHeight + 1; 250 int row = (e->y() - (usePicks ? picks->height() : 0)) / keyHeight + 1;
243 if (row > 5) row = 5; 251 if (row > 5) row = 5;
244 252
245 // figure out the column 253 // figure out the column
246 int col = 0; 254 int col = 0;
247 for (int w = 0; e->x() >= w; col++) 255 for (int w = 0; e->x() >= w; col++)
248 if (col < keys.numKeys(row)) // it segfaults if it trys to read past numKeys 256 if (col < keys.numKeys(row)) // it segfaults if it trys to read past numKeys
249 w += keys.width(row,col) * defaultKeyWidth; 257 w += keys.width(row,col) * defaultKeyWidth;
250 else break; 258 else break;
251 259
252 col --; // rewind one... 260 col --; // rewind one...
253 261
254 qkeycode = keys.qcode(row, col); 262 qkeycode = keys.qcode(row, col);
255 unicode = keys.uni(row, col); 263 unicode = keys.uni(row, col);
256 264
257 // might need to repaint if two or more of the same keys. 265 // might need to repaint if two or more of the same keys.
258 // should be faster if just paint one key even though multiple keys exist. 266 // should be faster if just paint one key even though multiple keys exist.
259 bool need_repaint = FALSE; 267 bool need_repaint = FALSE;
260 268
261 if (unicode == 0) { // either Qt char, or nothing 269 if (unicode == 0) { // either Qt char, or nothing
262 270
263 if (qkeycode == Qt::Key_F1) { // toggle the pickboard 271 if (qkeycode == Qt::Key_F1) { // toggle the pickboard
264 272
265 usePicks = !usePicks; 273 if ( configdlg ) {
266 if (usePicks) { 274 delete (ConfigDlg *) configdlg;
267 picks->show(); 275 configdlg = 0;
268 move(x(), y() - picks->height()); 276 }
269 adjustSize(); 277 else {
270 QObject::connect( picks, SIGNAL(key(ushort,ushort,ushort,bool,bool) ), 278 configdlg = new ConfigDlg ();
271 this, SIGNAL(key(ushort,ushort,ushort,bool,bool)) ); 279 connect(configdlg, SIGNAL(pickboardToggled(bool)),
272 } else { 280 this, SLOT(togglePickboard(bool)));
273 281 configdlg->showMaximized();
274 picks->hide(); 282 configdlg->show();
275 picks->resetState(); 283 configdlg->raise();
276 move(x(), y() + picks->height());
277 adjustSize();
278 QObject::disconnect( picks, SIGNAL(key(ushort,ushort,ushort,bool,bool) ),
279 this, SIGNAL(key(ushort,ushort,ushort,bool,bool)) );
280
281 } 284 }
282 285
283 keys.setPressed(row, col, usePicks);
284 need_repaint = TRUE;
285 qkeycode = 0; // don't need to emit Key_F1
286 } else if (qkeycode == Qt::Key_Control) { 286 } else if (qkeycode == Qt::Key_Control) {
287 ctrl = keys.pressedPtr(row, col); 287 ctrl = keys.pressedPtr(row, col);
288 need_repaint = TRUE; 288 need_repaint = TRUE;
289 *ctrl = !keys.pressed(row, col); 289 *ctrl = !keys.pressed(row, col);
290 290
291 } else if (qkeycode == Qt::Key_Alt) { 291 } else if (qkeycode == Qt::Key_Alt) {
292 alt = keys.pressedPtr(row, col); 292 alt = keys.pressedPtr(row, col);
293 need_repaint = TRUE; 293 need_repaint = TRUE;
294 *alt = !keys.pressed(row, col); 294 *alt = !keys.pressed(row, col);
295 295
296 } else if (qkeycode == Qt::Key_Shift) { 296 } else if (qkeycode == Qt::Key_Shift) {
297 need_repaint = TRUE; 297 need_repaint = TRUE;
298 298
299 if (shift) { 299 if (shift) {
300 *shift = 0; 300 *shift = 0;
301 shift = 0; 301 shift = 0;
302 } 302 }
303 else { 303 else {
304 shift = keys.pressedPtr(row, col); 304 shift = keys.pressedPtr(row, col);
305 *shift = 1; 305 *shift = 1;
306 if (lock) { 306 if (lock) {
307 *lock = 0; 307 *lock = 0;
308 lock = 0; 308 lock = 0;
309 } 309 }
310 } 310 }
311 311
312 } else if (qkeycode == Qt::Key_CapsLock) { 312 } else if (qkeycode == Qt::Key_CapsLock) {
313 need_repaint = TRUE; 313 need_repaint = TRUE;
314 314
315 if (lock) { 315 if (lock) {
316 *lock = 0; 316 *lock = 0;
317 lock = 0; 317 lock = 0;
318 } 318 }
319 else { 319 else {
320 lock = keys.pressedPtr(row, col);; 320 lock = keys.pressedPtr(row, col);;
321 *lock = 1; 321 *lock = 1;
322 if (shift) { 322 if (shift) {
323 *shift = 0; 323 *shift = 0;
324 shift = 0; 324 shift = 0;
325 } 325 }
326 } 326 }
327 327
328 } 328 }
329 329
330 } 330 }
331 else { // normal char 331 else { // normal char
332 if ((shift || lock) && keys.shift(unicode)) { 332 if ((shift || lock) && keys.shift(unicode)) {
333 unicode = keys.shift(unicode); 333 unicode = keys.shift(unicode);
@@ -417,96 +417,123 @@ void Keyboard::timerEvent(QTimerEvent* e)
417 if ( e->timerId() == pressTid ) { 417 if ( e->timerId() == pressTid ) {
418 killTimer(pressTid); 418 killTimer(pressTid);
419 pressTid = 0; 419 pressTid = 0;
420 if ( !pressed ) 420 if ( !pressed )
421 cout << "calling clearHighlight from timerEvent\n"; 421 cout << "calling clearHighlight from timerEvent\n";
422 clearHighlight(); 422 clearHighlight();
423 } 423 }
424} 424}
425*/ 425*/
426 426
427void Keyboard::repeat() 427void Keyboard::repeat()
428{ 428{
429 429
430 repeatTimer->start( 200 ); 430 repeatTimer->start( 200 );
431 emit key( unicode, 0, modifiers, true, true ); 431 emit key( unicode, 0, modifiers, true, true );
432} 432}
433 433
434void Keyboard::clearHighlight() 434void Keyboard::clearHighlight()
435{ 435{
436 if ( pressedKeyRow >= 0 && pressedKeyCol >= 0) { 436 if ( pressedKeyRow >= 0 && pressedKeyCol >= 0) {
437 int tmpRow = pressedKeyRow; 437 int tmpRow = pressedKeyRow;
438 int tmpCol = pressedKeyCol; 438 int tmpCol = pressedKeyCol;
439 439
440 pressedKeyRow = -1; 440 pressedKeyRow = -1;
441 pressedKeyCol = -1; 441 pressedKeyCol = -1;
442 442
443 QPainter p(this); 443 QPainter p(this);
444 drawKeyboard(p, tmpRow, tmpCol); 444 drawKeyboard(p, tmpRow, tmpCol);
445 } 445 }
446} 446}
447 447
448 448
449/* Keyboard::sizeHint {{{1 */ 449/* Keyboard::sizeHint {{{1 */
450QSize Keyboard::sizeHint() const 450QSize Keyboard::sizeHint() const
451{ 451{
452 QFontMetrics fm=fontMetrics(); 452 QFontMetrics fm=fontMetrics();
453 int keyHeight = fm.lineSpacing(); 453 int keyHeight = fm.lineSpacing();
454 454
455 return QSize( 240, keyHeight * 5 + (usePicks ? picks->sizeHint().height() : 0) + 1); 455 return QSize( 240, keyHeight * 5 + (usePicks ? picks->sizeHint().height() : 0) + 1);
456} 456}
457 457
458 458
459void Keyboard::resetState() 459void Keyboard::resetState()
460{ 460{
461 schar = mchar = echar = 0; 461 schar = mchar = echar = 0;
462 picks->resetState(); 462 picks->resetState();
463} 463}
464 464
465/* Keyboard::togglePickboard {{{1 */
466void Keyboard::togglePickboard(bool on_off)
467{
468 usePicks = on_off;
469 if (usePicks) {
470 picks->show();
471 //move(x(), y() - picks->height()); // not required anymore because QCopChannel::send
472 //adjustSize();
473 QObject::connect( picks, SIGNAL(key(ushort,ushort,ushort,bool,bool) ),
474 this, SIGNAL(key(ushort,ushort,ushort,bool,bool)) );
475 } else {
476
477 picks->hide();
478 picks->resetState();
479 //move(x(), y() + picks->height());
480 //adjustSize();
481 QObject::disconnect( picks, SIGNAL(key(ushort,ushort,ushort,bool,bool) ),
482 this, SIGNAL(key(ushort,ushort,ushort,bool,bool)) );
483
484 }
485 /*
486 * this closes && opens the input method
487 */
488 QCopChannel::send ("QPE/TaskBar", "hideInputMethod()");
489 QCopChannel::send ("QPE/TaskBar", "showInputMethod()");
490}
491
465/* korean input functions {{{1 492/* korean input functions {{{1
466 * 493 *
467 * TODO 494 * TODO
468 * one major problem with this implementation is that you can't move the 495 * one major problem with this implementation is that you can't move the
469 * cursor after inputing korean chars, otherwise it will eat up and replace 496 * cursor after inputing korean chars, otherwise it will eat up and replace
470 * the char before the cursor you move to. fix that 497 * the char before the cursor you move to. fix that
471 * 498 *
472 * make backspace delete one single char, not the whole thing if still 499 * make backspace delete one single char, not the whole thing if still
473 * editing. 500 * editing.
474 * 501 *
475 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 502 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
476 * 503 *
477 * how korean input works 504 * how korean input works
478 * 505 *
479 * all following chars means unicode char value and are in hex 506 * all following chars means unicode char value and are in hex
480 * 507 *
481 * ÃÊÀ½ = schar (start char) 508 * ÃÊÀ½ = schar (start char)
482 * ÁßÀ½ = mchar (middle char) 509 * ÁßÀ½ = mchar (middle char)
483 * ³¡À½ = echar (end char) 510 * ³¡À½ = echar (end char)
484 * 511 *
485 * there are 19 schars. unicode position is at 1100 - 1112 512 * there are 19 schars. unicode position is at 1100 - 1112
486 * there are 21 mchars. unicode position is at 1161 - 1175 513 * there are 21 mchars. unicode position is at 1161 - 1175
487 * there are 27 echars. unicode position is at 11a8 - 11c2 514 * there are 27 echars. unicode position is at 11a8 - 11c2
488 * 515 *
489 * the map with everything combined is at ac00 - d7a3 516 * the map with everything combined is at ac00 - d7a3
490 * 517 *
491 */ 518 */
492 519
493ushort Keyboard::parseKoreanInput (ushort c) { 520ushort Keyboard::parseKoreanInput (ushort c) {
494 521
495 if ((c != 0 && (c < 0x1100 || 0x11c2 < c) && (c < 0xac00 || 0xd7a3 < c)) 522 if ((c != 0 && (c < 0x1100 || 0x11c2 < c) && (c < 0xac00 || 0xd7a3 < c))
496 || 523 ||
497 (c == 0 && qkeycode != Qt::Key_Shift && Qt::Key_CapsLock != qkeycode 524 (c == 0 && qkeycode != Qt::Key_Shift && Qt::Key_CapsLock != qkeycode
498 && qkeycode != Qt::Key_Control && qkeycode != Qt::Key_Alt)) { 525 && qkeycode != Qt::Key_Control && qkeycode != Qt::Key_Alt)) {
499 526
500 schar = 0, mchar = 0, echar = 0; 527 schar = 0, mchar = 0, echar = 0;
501 return c; 528 return c;
502 } 529 }
503 530
504 if ( 0x1100 <= c && c <= 0x1112 ) { // schar or echar was input 531 if ( 0x1100 <= c && c <= 0x1112 ) { // schar or echar was input
505 532
506 if (schar == 0 || (schar != 0 && mchar == 0)) { 533 if (schar == 0 || (schar != 0 && mchar == 0)) {
507 schar = c; mchar = 0; echar = 0; 534 schar = c; mchar = 0; echar = 0;
508 return c; 535 return c;
509 } 536 }
510 else if (mchar != 0) { 537 else if (mchar != 0) {
511 538
512 if (echar == 0) { 539 if (echar == 0) {
diff --git a/inputmethods/multikey/keyboard.h b/inputmethods/multikey/keyboard.h
index b524195..e61b76c 100644
--- a/inputmethods/multikey/keyboard.h
+++ b/inputmethods/multikey/keyboard.h
@@ -1,148 +1,152 @@
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 25
25class QTimer; 26class QTimer;
26 27
27class KeyboardConfig : public DictFilterConfig 28class KeyboardConfig : public DictFilterConfig
28{ 29{
29public: 30public:
30 KeyboardConfig(PickboardPicks* p) : DictFilterConfig(p), backspaces(0) { nrows = 1; } 31 KeyboardConfig(PickboardPicks* p) : DictFilterConfig(p), backspaces(0) { nrows = 1; }
31 virtual void generateText(const QString &s); 32 virtual void generateText(const QString &s);
32 void decBackspaces() { if (backspaces) backspaces--; } 33 void decBackspaces() { if (backspaces) backspaces--; }
33 void incBackspaces() { backspaces++; } 34 void incBackspaces() { backspaces++; }
34 void resetBackspaces() { backspaces = 0; } 35 void resetBackspaces() { backspaces = 0; }
35private: 36private:
36 int backspaces; 37 int backspaces;
37}; 38};
38 39
39 40
40class KeyboardPicks : public PickboardPicks 41class KeyboardPicks : public PickboardPicks
41{ 42{
42 Q_OBJECT 43 Q_OBJECT
43public: 44public:
44 KeyboardPicks(QWidget* parent=0, const char* name=0, WFlags f=0) 45 KeyboardPicks(QWidget* parent=0, const char* name=0, WFlags f=0)
45 : PickboardPicks(parent, name, f) { } 46 : PickboardPicks(parent, name, f) { }
46 void initialise(); 47 void initialise();
47 virtual QSize sizeHint() const; 48 virtual QSize sizeHint() const;
48 KeyboardConfig *dc; 49 KeyboardConfig *dc;
49}; 50};
50 51
51 52
52class Keys { 53class Keys {
53public: 54public:
54 55
55 Keys(); 56 Keys();
56 Keys(const char * filename); 57 Keys(const char * filename);
57 ushort uni(const int row, const int col); 58 ushort uni(const int row, const int col);
58 int qcode(const int row, const int col); 59 int qcode(const int row, const int col);
59 int width(const int row, const int col); 60 int width(const int row, const int col);
60 bool pressed(const int row, const int col); 61 bool pressed(const int row, const int col);
61 bool *pressedPtr(const int row, const int col); 62 bool *pressedPtr(const int row, const int col);
62 ushort shift(const ushort); 63 ushort shift(const ushort);
63 QPixmap *pix(const int row, const int col); 64 QPixmap *pix(const int row, const int col);
64 int numKeys(const int row); 65 int numKeys(const int row);
65 void setKeysFromFile(const char *filename); 66 void setKeysFromFile(const char *filename);
66 void setKey(const int row, const int qcode, const ushort unicode, 67 void setKey(const int row, const int qcode, const ushort unicode,
67 const int width, QPixmap *pix); 68 const int width, QPixmap *pix);
68 void setPressed(const int row, const int col, const bool pressed); 69 void setPressed(const int row, const int col, const bool pressed);
69 70
70private: 71private:
71 72
72 typedef struct Key { 73 typedef struct Key {
73 int qcode; // are qt key codes just unicode values? 74 int qcode; // are qt key codes just unicode values?
74 ushort unicode; 75 ushort unicode;
75 int width; // not pixels but relative key width. normal key is 2 76 int width; // not pixels but relative key width. normal key is 2
76 77
77 // only needed for keys like ctrl that can have multiple keys pressed at once 78 // only needed for keys like ctrl that can have multiple keys pressed at once
78 bool *pressed; 79 bool *pressed;
79 QPixmap *pix; 80 QPixmap *pix;
80 }; 81 };
81 82
82 QList<Key> keys[6]; 83 QList<Key> keys[6];
83 QMap<ushort,ushort> shiftMap; 84 QMap<ushort,ushort> shiftMap;
84 85
85}; 86};
86 87
87class Keyboard : public QFrame 88class Keyboard : public QFrame
88{ 89{
89 Q_OBJECT 90 Q_OBJECT
90public: 91public:
91 Keyboard( QWidget* parent=0, const char* name=0, WFlags f=0 ); 92 Keyboard( QWidget* parent=0, const char* name=0, WFlags f=0 );
92 93
93 void resetState(); 94 void resetState();
94 95
95 void mousePressEvent(QMouseEvent*); 96 void mousePressEvent(QMouseEvent*);
96 void mouseReleaseEvent(QMouseEvent*); 97 void mouseReleaseEvent(QMouseEvent*);
97 void resizeEvent(QResizeEvent*); 98 void resizeEvent(QResizeEvent*);
98 void paintEvent(QPaintEvent* e); 99 void paintEvent(QPaintEvent* e);
99 //void timerEvent(QTimerEvent* e); 100 //void timerEvent(QTimerEvent* e);
100 void drawKeyboard( QPainter &p, int row = -1, int col = -1); 101 void drawKeyboard( QPainter &p, int row = -1, int col = -1);
101 102
102 QSize sizeHint() const; 103 QSize sizeHint() const;
103 104
104signals: 105signals:
105 void key( ushort scancode, ushort unicode, ushort modifiers, bool, bool ); 106 void key( ushort scancode, ushort unicode, ushort modifiers, bool, bool );
106 107
107private slots: 108private slots:
108 void repeat(); 109 void repeat();
110 void togglePickboard(bool on_off);
109 111
110private: 112private:
111 int getKey( int &w, int j = -1 ); 113 int getKey( int &w, int j = -1 );
112 void clearHighlight(); 114 void clearHighlight();
113 115
114 bool *shift; 116 bool *shift;
115 bool *lock; 117 bool *lock;
116 bool *ctrl; 118 bool *ctrl;
117 bool *alt; 119 bool *alt;
118 uint useLargeKeys:1; 120 uint useLargeKeys:1;
119 uint usePicks:1; 121 uint usePicks:1;
120 122
121 int pressedKeyRow; 123 int pressedKeyRow;
122 int pressedKeyCol; 124 int pressedKeyCol;
123 125
124 KeyboardPicks *picks; 126 KeyboardPicks *picks;
125 127
126 int keyHeight; 128 int keyHeight;
127 int defaultKeyWidth; 129 int defaultKeyWidth;
128 int xoffs; 130 int xoffs;
129 131
130 int unicode; 132 int unicode;
131 int qkeycode; 133 int qkeycode;
132 int modifiers; 134 int modifiers;
133 135
134 int pressTid; 136 int pressTid;
135 bool pressed; 137 bool pressed;
136 138
137 Keys keys; 139 Keys keys;
138 QString LANG; 140 QString LANG;
139 /* for korean input */ 141 /* for korean input */
140 ushort schar, mchar, echar; 142 ushort schar, mchar, echar;
141 ushort parseKoreanInput(ushort c); 143 ushort parseKoreanInput(ushort c);
142 ushort combineKoreanChars(const ushort s, const ushort m, const ushort e); 144 ushort combineKoreanChars(const ushort s, const ushort m, const ushort e);
143 ushort constoe(const ushort c); 145 ushort constoe(const ushort c);
144 146
145 QTimer *repeatTimer; 147 QTimer *repeatTimer;
148
149 ConfigDlg *configdlg;
146}; 150};
147 151
148 152
diff --git a/inputmethods/multikey/multikey.pro b/inputmethods/multikey/multikey.pro
index 2e92e06..9d76a3d 100644
--- a/inputmethods/multikey/multikey.pro
+++ b/inputmethods/multikey/multikey.pro
@@ -1,29 +1,31 @@
1 TEMPLATE= lib 1 TEMPLATE= lib
2 CONFIG += qt warn_on release 2 CONFIG += qt warn_on release
3 HEADERS= keyboard.h \ 3 HEADERS= keyboard.h \
4 configdlg.h \
4 ../pickboard/pickboardcfg.h \ 5 ../pickboard/pickboardcfg.h \
5 ../pickboard/pickboardpicks.h \ 6 ../pickboard/pickboardpicks.h \
6 keyboardimpl.h 7 keyboardimpl.h
7 SOURCES= keyboard.cpp \ 8 SOURCES= keyboard.cpp \
9 configdlg.cpp \
8 ../pickboard/pickboardcfg.cpp \ 10 ../pickboard/pickboardcfg.cpp \
9 ../pickboard/pickboardpicks.cpp \ 11 ../pickboard/pickboardpicks.cpp \
10 keyboardimpl.cpp 12 keyboardimpl.cpp
11 TARGET = qmultikey 13 TARGET = qmultikey
12 DESTDIR = ../../plugins/inputmethods 14 DESTDIR = ../../plugins/inputmethods
13INCLUDEPATH += $(OPIEDIR)/include 15INCLUDEPATH += $(OPIEDIR)/include
14DEPENDPATH += ../$(OPIEDIR)/include ../../launcher 16DEPENDPATH += ../$(OPIEDIR)/include ../../launcher
15LIBS += -lqpe 17LIBS += -lqpe
16 VERSION = 1.0.0 18 VERSION = 1.0.0
17 19
18TRANSLATIONS = ../../i18n/pt_BR/libqmultikey.ts 20TRANSLATIONS = ../../i18n/pt_BR/libqmultikey.ts
19TRANSLATIONS += ../../i18n/de/libqmultikey.ts 21TRANSLATIONS += ../../i18n/de/libqmultikey.ts
20TRANSLATIONS += ../../i18n/en/libqmultikey.ts 22TRANSLATIONS += ../../i18n/en/libqmultikey.ts
21TRANSLATIONS += ../../i18n/hu/libqmultikey.ts 23TRANSLATIONS += ../../i18n/hu/libqmultikey.ts
22TRANSLATIONS += ../../i18n/sl/libqmultikey.ts 24TRANSLATIONS += ../../i18n/sl/libqmultikey.ts
23TRANSLATIONS += ../../i18n/ja/libqmultikey.ts 25TRANSLATIONS += ../../i18n/ja/libqmultikey.ts
24TRANSLATIONS += ../../i18n/ko/libqmultikey.ts 26TRANSLATIONS += ../../i18n/ko/libqmultikey.ts
25TRANSLATIONS += ../../i18n/pl/libqmultikey.ts 27TRANSLATIONS += ../../i18n/pl/libqmultikey.ts
26TRANSLATIONS += ../../i18n/no/libqmultikey.ts 28TRANSLATIONS += ../../i18n/no/libqmultikey.ts
27TRANSLATIONS += ../../i18n/zh_CN/libqmultikey.ts 29TRANSLATIONS += ../../i18n/zh_CN/libqmultikey.ts
28TRANSLATIONS += ../../i18n/zh_TW/libqmultikey.ts 30TRANSLATIONS += ../../i18n/zh_TW/libqmultikey.ts
29TRANSLATIONS += ../../i18n/fr/libqmultikey.ts 31TRANSLATIONS += ../../i18n/fr/libqmultikey.ts