summaryrefslogtreecommitdiff
path: root/inputmethods/kjumpx/keyboard.cpp
Unidiff
Diffstat (limited to 'inputmethods/kjumpx/keyboard.cpp') (more/less context) (show whitespace changes)
-rw-r--r--inputmethods/kjumpx/keyboard.cpp855
1 files changed, 855 insertions, 0 deletions
diff --git a/inputmethods/kjumpx/keyboard.cpp b/inputmethods/kjumpx/keyboard.cpp
new file mode 100644
index 0000000..52a8bf4
--- a/dev/null
+++ b/inputmethods/kjumpx/keyboard.cpp
@@ -0,0 +1,855 @@
1/**************************************************************************************94x78**
2**
3** This file may be distributed and/or modified under the terms of the
4** GNU General Public License version 2 as published by the Free Software
5** Foundation and appearing in the file LICENSE.GPL included in the
6** packaging of this file.
7**
8** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
9** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
10**
11*********************************************************************************************/
12#include "keyboard.h"
13
14#include <qpe/resource.h>
15
16//#include <iostream.h>
17
18
19static const int autorepeatDelaytime = 500; // ms
20static const int autorepeatRate = 20; // chars per second
21
22static const int mod1x1 = 0;
23static const int mod1x2 = 23;
24static const int mod1w = mod1x2 - mod1x1;
25
26static const int letterx1 = 27;
27static const int letterx2 = 129;
28static const int letterw = 17;
29static const int letterh = 14;
30
31static const int num1x1 = 130;
32static const int num1x2 = 137;
33static const int num1w = num1x2 - num1x1;
34
35static const int specialx1 = 138;
36static const int specialx2 = 170;
37static const int specialw = 16;
38
39static const int num2x1 = 171;
40static const int num2x2 = 178;
41static const int num2w = num2x2 - num2x1;
42
43static const int mod2x1 = 179;
44static const int mod2x2 = 203;
45static const int mod2w = mod2x2 - mod2x1;
46
47static const int cursorx1 = 207;
48static const int cursorw = 16;
49
50static const int myParenID = -10;
51
52
53typedef struct mapElement
54{
55 int qcode;
56 ushort unicode;
57};
58
59static const mapElement mod1Map[] = {
60 { Qt::Key_Escape, 27 },
61 { Qt::Key_Tab, 9 },
62 { Qt::Key_Return, 13 },
63 { Qt::Key_Alt, 0 },
64 { Qt::Key_Control, 0 },
65};
66
67static const uchar *const letterMap[] = {
68 (const uchar *const)"zvchwk",
69 (const uchar *const)"fitaly",
70 (const uchar *const)" ne ",
71 (const uchar *const)"gdorsb",
72 (const uchar *const)"qjumpx",
73};
74
75static const ushort kletterMap[][6] = {
76 { 0x110c, 0x1112, 0x1109, 0x116d, 0x1167, 0x1163 },
77 { 0x110f, 0x1105, 0x1100, 0x1161, 0x1175, 0x1162 },
78 { ' ', ' ', 0x110b, 0x1165, ' ', ' ' },
79 { 0x1110, 0x1103, 0x1102, 0x1169, 0x1173, 0x1166 },
80 { 0x110e, 0x1107, 0x1106, 0x1111, 0x116e, 0x1172 },
81};
82
83static const uchar *const letterMapShift[] = {
84 (const uchar *const)"ZVCHWK",
85 (const uchar *const)"FITALY",
86 (const uchar *const)" NE ",
87 (const uchar *const)"GDORSB",
88 (const uchar *const)"QJUMPX",
89};
90
91static const ushort kletterMapShift[][6] = {
92 { 0x110d, 0x1112, 0x110a, 0x116d, 0x1167, 0x1163 },
93 { 0x110f, 0x1105, 0x1101, 0x1161, 0x1175, 0x1164 },
94 { ' ', ' ', 0x110b, 0x1165, ' ', ' ' },
95 { 0x1110, 0x1103, 0x1102, 0x1169, 0x1173, 0x1168 },
96 { 0x110e, 0x1108, 0x1106, 0x1111, 0x116e, 0x1172 },
97};
98
99static const uchar *const num1Map = (const uchar *const)"12345";
100
101static const uchar *const specialMap[] = {
102 (const uchar *const)"-+",
103 (const uchar *const)"*!",
104 (const uchar *const)",'",
105 (const uchar *const)".%",
106 (const uchar *const)"/$",
107};
108
109static const uchar *const specialMapShift[] = {
110 (const uchar *const)"_=",
111 (const uchar *const)"#?",
112 (const uchar *const)";\"",
113 (const uchar *const)":|",
114 (const uchar *const)"\\&",
115};
116
117static const uchar *const specialMapParen[] = {
118 (const uchar *const)"()",
119 (const uchar *const)"[]",
120 (const uchar *const)"{}",
121 (const uchar *const)"<>",
122 (const uchar *const)"@~",
123};
124
125static const uchar *const num2Map = (const uchar *const)"67890";
126
127static const mapElement mod2Map[] = {
128 { Qt::Key_Backspace, 8 },
129 { Qt::Key_Delete, 0 },
130 { Qt::Key_Return, 13 },
131 { Qt::Key_Shift, 0 },
132 { myParenID, 0 },
133};
134
135static const int cursorMap[][2] = {
136 { Qt::Key_Home, Qt::Key_PageUp },
137 { Qt::Key_End, Qt::Key_PageDown },
138 { Qt::Key_Up, Qt::Key_Up },
139 { Qt::Key_Left, Qt::Key_Right },
140 { Qt::Key_Down, Qt::Key_Down },
141};
142
143
144Keyboard::Keyboard(QWidget* parent, const char* name, WFlags f) :
145 QFrame(parent, name, f),
146 shift(0), paren(0), ctrl(0), alt(0), lang(1), lastKey(0),
147 pressedKeyUnicode(0), pressedKeyQcode(0), pressedMod(0),
148 isnoncont(false),
149 slideKeyUnicodeH(0), slideKeyQcodeH(0), slideKeyUnicodeV(0), slideKeyQcodeV(0),
150 enableMouseTracking(false), slidePix(NULL), slidePixH(NULL), slidePixV(NULL),
151 releasedPix(NULL), pressedPix(NULL)
152{
153 //setPalette(QPalette(QColor(240,240,230))); // Beige!
154
155 releasedPlain = releasedShift = releasedParen = Resource::loadPixmap("kjumpx/released");
156 pressedPlain = pressedShift = pressedParen = Resource::loadPixmap("kjumpx/pressed");
157 pressedDigit = Resource::loadPixmap("kjumpx/pressed");
158
159 QPixmap tmp;
160
161 tmp = Resource::loadPixmap("kjumpx/releasedShift");
162 bitBlt(&releasedShift, letterx1, 0, &tmp);
163
164 tmp = Resource::loadPixmap("kjumpx/releasedParen");
165 bitBlt(&releasedParen, specialx1, 0, &tmp);
166
167 tmp = Resource::loadPixmap("kjumpx/pressedShift");
168 bitBlt(&pressedShift, letterx1, 0, &tmp);
169
170 tmp = Resource::loadPixmap("kjumpx/pressedParen");
171 bitBlt(&pressedParen, specialx1, 0, &tmp);
172
173 tmp = Resource::loadPixmap("kjumpx/pressedDigit");
174 bitBlt(&pressedDigit, specialx1, 0, &tmp);
175
176 offscreen = QPixmap( releasedPlain );
177
178 releasedPix = &releasedPlain;
179 pressedPix = &pressedPlain;
180 slidePix = &pressedPlain;
181
182 delayTimer = new QTimer(this);
183 rateTimer = new QTimer(this);
184 connect( delayTimer, SIGNAL( timeout() ), this, SLOT( delayTimerDone() ) );
185 connect( rateTimer, SIGNAL( timeout() ), this, SLOT( rateTimerDone() ) );
186}
187
188void Keyboard::resizeEvent(QResizeEvent*)
189{
190 //cout << "resizeEvent()" << endl;
191}
192
193void Keyboard::paintEvent(QPaintEvent*)
194{
195 bitBlt(this, 0, 0, &offscreen);
196}
197
198void Keyboard::mousePressEvent(QMouseEvent *e)
199{
200 pressedx = -1;
201 pressedKeyUnicode = pressedKeyQcode = pressedMod = 0;
202
203 int x = e->x();
204 int y = e->y();
205
206 int row = (y - 1) / letterh;
207
208 if ( x <= mod1x2 ) // mod1
209 {
210 pressedx = mod1x1;
211 pressedy = row * letterh;
212 pressedw = mod1w + 1;
213 pressedh = letterh + 1;
214 if ( row == 2 ) // return
215 {
216 pressed2x = mod2x1;
217 pressed2y = 2 * letterh;
218 pressed2w = mod2w + 1;
219 pressed2h = letterh + 1;
220 isnoncont = true;
221 }
222 else if ( row == 3 ) // alt
223 alt = 1;
224 else if ( row == 4 ) // ctrl
225 ctrl = 1;
226 pressedKeyUnicode = mod1Map[row].unicode;
227 pressedKeyQcode = mod1Map[row].qcode;
228 }
229 else if ( x >= letterx1 && x <= letterx2 ) // letter
230 {
231 int column = (x - letterx1 - 1) / letterw;
232 QChar temp;
233 if (lang == 0) // english
234 if ( shift )
235 temp = QChar( letterMapShift[row][column] );
236 else
237 temp = QChar( letterMap[row][column] );
238 else if (lang == 1) // korean
239 if ( shift )
240 temp = parseKoreanInput( kletterMapShift[row][column] );
241 else
242 temp = parseKoreanInput( kletterMap[row][column] );
243
244 if ( temp == ' ' ) // space
245 {
246 if ( column < 3 )
247 {
248 pressedx = letterx1;
249 pressed2x = letterx1 + letterw * 4;
250 }
251 else
252 {
253 pressedx = letterx1 + letterw * 4;
254 pressed2x = letterx1;
255 }
256 pressedy = pressed2y = row * letterh;
257 pressedw = pressed2w = letterw * 2 + 1;
258 pressedh = pressed2h = letterh + 1;
259 isnoncont = true;
260 }
261 else
262 {
263 pressedx = letterx1 + column * letterw;
264 pressedy = row * letterh;
265 pressedw = letterw + 1;
266 pressedh = letterh + 1;
267 }
268 pressedKeyUnicode = temp.unicode();
269 pressedKeyQcode = slideKeyQcodeH = slideKeyQcodeV = temp.upper().unicode();
270 if ( temp == ' ' )
271 {
272 slideKeyUnicodeH = slideKeyUnicodeV = 8;
273 slideKeyQcodeH = slideKeyQcodeV = Qt::Key_Backspace;
274 }
275 else if ( temp == temp.lower() )
276 {
277 slideKeyUnicodeH = slideKeyUnicodeV = temp.upper().unicode();
278 slidePixH = slidePixV = &pressedShift;
279 }
280 else
281 {
282 slideKeyUnicodeH = slideKeyUnicodeV = temp.lower().unicode();
283 slidePixH = slidePixV = &pressedPlain;
284 }
285 enableMouseTracking = true;
286 }
287 else if ( x >= num1x1 && x <= num1x2 ) // num1
288 {
289 pressedx = num1x1;
290 pressedy = row * letterh;
291 pressedw = num1w + 1;
292 pressedh = letterh + 1;
293 QChar temp = QChar( num1Map[row] );
294 pressedKeyUnicode = pressedKeyQcode = temp.unicode();
295 }
296 else if ( x >= specialx1 && x <= specialx2 ) // special
297 {
298 int column = (x - specialx1 - 1) / specialw;
299 pressedx = specialx1 + column * specialw;
300 pressedy = row * letterh;
301 pressedw = specialw + 1;
302 pressedh = letterh + 1;
303 QChar temp;
304 if ( shift )
305 temp = QChar( specialMapShift[row][column] );
306 else if ( paren )
307 temp = QChar( specialMapParen[row][column] );
308 else
309 temp = QChar( specialMap[row][column] );
310 pressedKeyUnicode = pressedKeyQcode = temp.unicode();
311 slideKeyUnicodeH = slideKeyQcodeH = slideKeyUnicodeV = slideKeyQcodeV =
312 QChar('0').unicode() + ( 5 * column + row + 1 ) % 10;
313 slidePixH = slidePixV = &pressedDigit;
314 if ( shift )
315 {
316 slideKeyUnicodeV = slideKeyQcodeV =
317 QChar( specialMap[row][column] ).unicode();
318 slidePixV = &pressedPlain;
319 }
320 else if ( !(shift || paren) )
321 {
322 slideKeyUnicodeV = slideKeyQcodeV =
323 QChar( specialMapShift[row][column] ).unicode();
324 slidePixV = &pressedShift;
325 }
326 enableMouseTracking = true;
327 }
328 else if ( x >= num2x1 && x <= num2x2 ) // num2
329 {
330 pressedx = num2x1;
331 pressedy = row * letterh;
332 pressedw = num2w + 1;
333 pressedh = letterh + 1;
334 QChar temp = QChar( num2Map[row] );
335 pressedKeyUnicode = pressedKeyQcode = temp.unicode();
336 }
337 else if ( x >= mod2x1 && x <= mod2x2 ) // mod2
338 {
339 pressedx = mod2x1;
340 pressedy = row * letterh;
341 pressedw = mod2w + 1;
342 pressedh = letterh + 1;
343 if ( row == 2 ) // return
344 {
345 pressed2x = mod1x1;
346 pressed2y = 2 * letterh;
347 pressed2w = mod2w + 1;
348 pressed2h = letterh + 1;
349 isnoncont = true;
350 }
351 pressedKeyUnicode = mod2Map[row].unicode;
352 pressedKeyQcode = mod2Map[row].qcode;
353
354 if ( row == 3 ) // shift
355 {
356 paren = 0;
357 switch ( shift )
358 {
359 case 0:
360 {
361 shift = 1;
362 releasedPix = &releasedShift;
363 pressedPix = &pressedShift;
364 bitBlt( &offscreen, 0, 0, releasedPix );
365 break;
366 }
367 case 1:
368 {
369 shift = 2;
370 break;
371 }
372 case 2:
373 {
374 shift = 0;
375 releasedPix = &releasedPlain;
376 pressedPix = &pressedPlain;
377 bitBlt( &offscreen, 0, 0, releasedPix );
378 break;
379 }
380 }
381 }
382 else if ( row == 4 ) // parenthesis
383 {
384 shift = 0;
385 switch ( paren )
386 {
387 case 0:
388 {
389 paren = 1;
390 releasedPix = &releasedParen;
391 pressedPix = &pressedParen;
392 bitBlt( &offscreen, 0, 0, releasedPix );
393 break;
394 }
395 case 1:
396 {
397 paren = 2;
398 break;
399 }
400 case 2:
401 {
402 paren = 0;
403 releasedPix = &releasedPlain;
404 pressedPix = &pressedPlain;
405 bitBlt( &offscreen, 0, 0, releasedPix );
406 break;
407 }
408 }
409 }
410 }
411 else if ( x >= cursorx1 ) // cursor
412 {
413 int column = (x - cursorx1 - 1) / cursorw;
414 if ( row == 2 || row == 4 )
415 pressedx = cursorx1 + cursorw / 2;
416 else
417 pressedx = cursorx1 + column * cursorw;
418 pressedy = row * letterh;
419 pressedw = cursorw + 1;
420 pressedh = letterh + 1;
421 pressedKeyQcode = cursorMap[row][column];
422 }
423
424 pressedMod = ( shift ? Qt::ShiftButton : 0 ) |
425 ( ctrl ? Qt::ControlButton : 0 ) |
426 ( alt ? Qt::AltButton : 0 );
427
428 lastKey = pressedKeyUnicode;
429
430 emit key( pressedKeyUnicode, pressedKeyQcode, pressedMod, true, false );
431 delayTimer->start( autorepeatDelaytime, true );
432
433 if ( pressedx == -1 )
434 return;
435
436 bitBlt( &offscreen, pressedx, pressedy,
437 pressedPix, pressedx, pressedy, pressedw, pressedh );
438 if ( isnoncont )
439 bitBlt( &offscreen, pressed2x, pressed2y,
440 pressedPix, pressed2x, pressed2y, pressed2w, pressed2h );
441
442 repaint( false );
443}
444
445void Keyboard::mouseReleaseEvent(QMouseEvent*)
446{
447 //cout << pressedx << " " << pressedy << " " << pressedw << " " << pressedh << endl;
448
449 delayTimer->stop();
450 rateTimer->stop();
451 enableMouseTracking = false;
452
453 if ( pressedx == -1 )
454 return;
455
456 if ( shift == 2 && pressedKeyQcode == Qt::Key_Shift )
457 return;
458 if ( paren == 2 && pressedKeyQcode == myParenID )
459 return;
460
461 if ( shift == 1 && pressedKeyQcode != Qt::Key_Shift )
462 {
463 shift = 0;
464 releasedPix = &releasedPlain;
465 pressedPix = &pressedPlain;
466 bitBlt( &offscreen, 0, 0, releasedPix );
467 }
468
469 if ( paren == 1 && pressedKeyQcode != myParenID )
470 {
471 paren = 0;
472 releasedPix = &releasedPlain;
473 pressedPix = &pressedPlain;
474 bitBlt( &offscreen, 0, 0, releasedPix );
475 }
476
477 if ( alt && pressedKeyQcode != Qt::Key_Alt )
478 alt = 0;
479 if ( ctrl && pressedKeyQcode != Qt::Key_Control )
480 ctrl = 0;
481
482 bitBlt( &offscreen, pressedx, pressedy,
483 releasedPix, pressedx, pressedy, pressedw, pressedh );
484
485 if ( isnoncont )
486 {
487 isnoncont = false;
488 bitBlt( &offscreen, pressed2x, pressed2y,
489 releasedPix, pressed2x, pressed2y, pressed2w, pressed2h );
490 }
491
492 repaint( false );
493}
494
495void Keyboard::mouseMoveEvent(QMouseEvent *e)
496{
497 if ( !enableMouseTracking )
498 return;
499
500 if ( e->x() < pressedx || e->x() >= pressedx + pressedw )
501 {
502 pressedKeyUnicode = slideKeyUnicodeH;
503 pressedKeyQcode = slideKeyQcodeH;
504 slidePix = slidePixH;
505 }
506 else if ( e->y() < pressedy || e->y() >= pressedy + pressedh )
507 {
508 pressedKeyUnicode = slideKeyUnicodeV;
509 pressedKeyQcode = slideKeyQcodeV;
510 slidePix = slidePixV;
511 }
512 else
513 return;
514
515 enableMouseTracking = false;
516
517 delayTimer->stop();
518 rateTimer->stop();
519
520 bitBlt( &offscreen, pressedx, pressedy,
521 slidePix, pressedx, pressedy, pressedw, pressedh );
522
523 emit key( 8, Qt::Key_Backspace, pressedMod, true, false );
524 emit key( pressedKeyUnicode, pressedKeyQcode, pressedMod, true, false );
525 delayTimer->start( autorepeatDelaytime, true );
526
527 repaint( false );
528}
529
530void Keyboard::delayTimerDone()
531{
532 emit key( pressedKeyUnicode, pressedKeyQcode, pressedMod, true, true );
533 rateTimer->start( 1000/autorepeatRate, false );
534}
535
536void Keyboard::rateTimerDone()
537{
538 emit key( pressedKeyUnicode, pressedKeyQcode, pressedMod, true, true );
539}
540
541QSize Keyboard::sizeHint() const
542{
543 return offscreen.size();
544}
545
546void Keyboard::resetState()
547{
548 //cout << "resetState()" << endl;
549}
550
551/*
552 *
553 * TODO
554 * one major problem with this implementation is that you can't move the
555 * cursor after inputing korean chars, otherwise it will eat up and replace
556 * the char before the cursor you move to. fix that
557 *
558 * make a kor/eng swaping key
559 *
560 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
561 *
562 * how korean input works
563 *
564 * all following chars means unicode char value and are in hex
565 *
566 * ÃÊÀ½ = schar (start char)
567 * ÁßÀ½ = mchar (middle char)
568 * ³¡À½ = echar (end char)
569 *
570 * there are 19 schars. unicode position is at 1100 - 1112
571 * there are 21 mchars. unicode position is at 1161 - 1175
572 * there are 27 echars. unicode position is at 11a8 - 11c2
573 *
574 * the map with everything combined is at ac00 - d7a3
575 *
576 * to find a combination of schar + mchar in the map, lookup
577 * ((schar - 0x1100) * 587) + ((mchar - 0x1161) * 27) + (echar - 0x11a8) + 0xac00)
578 *
579 */
580
581QChar Keyboard::parseKoreanInput (ushort c) {
582
583 static ushort schar, mchar, echar;
584
585 if ((lastKey < 0x1100 || 0x11c2 < lastKey) && (lastKey < 0xac00 || 0xd7a3 < lastKey)
586 && !(lastKey == 0 && (shift || paren || ctrl || alt))) {
587
588 //printf ("reset...\n");
589 schar = 0, mchar = 0, echar = 0;
590 }
591
592 //printf ("in %x %x %x %x %x\n", schar, mchar, echar, c, lastKey);
593 if ( 0x1100 <= c && c <= 0x1112 ) { // schar or echar was input
594
595 if (schar == 0 || (schar != 0 && mchar == 0)) {
596 schar = c; mchar = 0; echar = 0;
597 return QChar(c);
598 }
599 else if (mchar != 0) {
600
601 if (echar == 0) {
602
603 if (!(echar = constoe(c))) {
604
605 schar = c; mchar = 0; echar = 0;
606 return QChar(c);
607 }
608
609 }
610 else { // must figure out what the echar is
611
612 if (echar == 0x11a8) { // ¤¡
613
614 if (c == 0x1100) echar = 0x11a9; // ¤¡ + ¤¡
615 else if (c == 0x1109) echar = 0x11aa; // ¤¡ + ¤µ
616 else {
617 schar = c; mchar = 0; echar = 0;
618 return QChar(c);
619 }
620
621 } else if (echar == 0x11ab) { // ¤¤
622
623 if (c == 0x110c) echar = 0x11ac; // ¤¤ + ¤¸
624 else if (c == 0x1112) echar = 0x11ad; // ¤¤ + ¤¾
625 else {
626 schar = c; mchar = 0; echar = 0;
627 return QChar(c);
628 }
629
630 } else if (echar == 0x11af) { // ¤©
631
632 if (c == 0x1100) echar = 0x11b0; // ¤© + ¤¡
633 else if (c == 0x1106) echar = 0x11b1; // ¤© + ¤±
634 else if (c == 0x1107) echar = 0x11b2; // ¤© + ¤²
635 else if (c == 0x1109) echar = 0x11b3; // ¤© + ¤µ
636 else if (c == 0x1110) echar = 0x11b4; // ¤© + ¤¼
637 else if (c == 0x1111) echar = 0x11b5; // ¤© + ¤½
638 else if (c == 0x1112) echar = 0x11b6; // ¤© + ¤¾
639 else {
640 schar = c; mchar = 0; echar = 0;
641 return QChar(c);
642 }
643
644 } else if (echar == 0x11b8) { // ¤²
645
646 if (c == 0x1109) echar = 0x11b9; // ¤² + ¤µ
647 else {
648 schar = c; mchar = 0; echar = 0;
649 return QChar(c);
650 }
651
652 } else if (echar == 0x11ba) { // ¤µ
653
654 if (c == 0x1109) echar = 0x11bb; // ¤µ + ¤µ
655 else {
656 schar = c; mchar = 0; echar = 0;
657 return QChar(c);
658 }
659
660 } else { // if any other char, cannot combine chars
661
662 schar = c; mchar = 0; echar = 0;
663 return QChar(c);
664 }
665
666 lastKey = echar;
667 }
668 }
669
670 }
671 else if (0x1161 <= c && c <= 0x1175) { // mchar was input
672
673 if (schar != 0 && mchar == 0) { mchar = c; }
674
675 else if (schar != 0 && mchar != 0 && echar == 0) {
676
677 switch (mchar) {
678 case 0x1169:
679 if (c == 0x1161) mchar = 0x116a;
680 else if (c == 0x1162) mchar = 0x116b;
681 else if (c == 0x1175) mchar = 0x116c;
682 else {
683 schar = 0; mchar = 0; echar = 0;
684 return QChar(c);
685 }
686 break;
687 case 0x116e:
688 if (c == 0x1165) mchar = 0x116f;
689 else if (c == 0x1166) mchar = 0x1170;
690 else if (c == 0x1175) mchar = 0x1171;
691 else {
692 schar = 0; mchar = 0; echar = 0;
693 return QChar(c);
694 }
695 break;
696 case 0x1173:
697 if (c == 0x1175) mchar = 0x1174;
698 else {
699 schar = 0; mchar = 0; echar = 0;
700 return QChar(c);
701 }
702 break;
703 default:
704 schar = 0; mchar = 0; echar = 0;
705 return QChar(c);
706 }
707 }
708 else if (schar != 0 && mchar != 0 && echar != 0) {
709
710 emit key( 8, Qt::Key_Backspace, 0, true, false );
711
712 ushort prev = 0;
713 switch (echar) {
714 /*
715 case 0x11a9:
716 prev = combineKoreanChars(schar, mchar, 0x11a8);
717 schar = 0x1100;
718 break;
719 */
720 case 0x11aa:
721 prev = combineKoreanChars(schar, mchar, 0x11a8);
722 schar = 0x1109;
723 break;
724 case 0x11ac:
725 prev = combineKoreanChars(schar, mchar, 0x11ab);
726 schar = 0x110c;
727 break;
728 case 0x11ad:
729 prev = combineKoreanChars(schar, mchar, 0x11ab);
730 schar = 0x1112;
731 break;
732 case 0x11b0:
733 prev = combineKoreanChars(schar, mchar, 0x11af);
734 schar = 0x1100;
735 break;
736 case 0x11b1:
737 prev = combineKoreanChars(schar, mchar, 0x11af);
738 schar = 0x1106;
739 break;
740 case 0x11b2:
741 prev = combineKoreanChars(schar, mchar, 0x11af);
742 schar = 0x1107;
743 break;
744 case 0x11b3:
745 prev = combineKoreanChars(schar, mchar, 0x11af);
746 schar = 0x1109;
747 break;
748 case 0x11b4:
749 prev = combineKoreanChars(schar, mchar, 0x11af);
750 schar = 0x1110;
751 break;
752 case 0x11b9:
753 prev = combineKoreanChars(schar, mchar, 0x11b8);
754 schar = 0x1109;
755 break;
756 /*
757 case 0x11bb:
758 prev = combineKoreanChars(schar, mchar, 0x11ba);
759 schar = 0x1109;
760 break;
761 */
762 default:
763
764 if (constoe(echar)) {
765
766 prev = combineKoreanChars(schar, mchar, 0);
767 schar = constoe(echar);
768 }
769 break;
770 }
771
772 emit key( prev, prev, 0, true, false );
773
774 mchar = c; echar = 0;
775
776 return QChar(combineKoreanChars(schar, mchar, 0));
777
778 }
779 else {
780 schar = 0; mchar = 0; echar = 0;
781 return QChar(c);
782 }
783
784 }
785 else if (c == ' ') return QChar(c);
786
787
788 // and now... finally delete previous char, and return new char
789 emit key( 8, Qt::Key_Backspace, 0, true, false );
790
791 //printf ("out %x %x %x %x\n", schar, mchar, echar, c);
792
793
794 return QChar (combineKoreanChars( schar, mchar, echar));
795
796}
797
798ushort Keyboard::combineKoreanChars(const ushort s, const ushort m, const ushort e) {
799
800 return ((s - 0x1100) * 588) + ((m - 0x1161) * 28) + (e ? e - 0x11a7 : 0) + 0xac00;
801
802}
803
804ushort Keyboard::constoe(const ushort c) {
805
806 // converts schars to echars if possible
807
808 if (0x1100 <= c && c <= 0x1112) { // schar to echar
809
810 switch (c) {
811 case 0x1100: return 0x11a8;
812 case 0x1101: return 0x11a9;
813 case 0x1102: return 0x11ab;
814 case 0x1103: return 0x11ae;
815 case 0x1105: return 0x11af;
816 case 0x1106: return 0x11b7;
817 case 0x1107: return 0x11b8;
818 case 0x1109: return 0x11ba;
819 case 0x110a: return 0x11bb;
820 case 0x110b: return 0x11bc;
821 case 0x110c: return 0x11bd;
822 case 0x110e: return 0x11be;
823 case 0x110f: return 0x11bf;
824 case 0x1110: return 0x11c0;
825 case 0x1111: return 0x11c1;
826 case 0x1112: return 0x11c2;
827 default: return 0;
828
829 }
830
831 } else { //echar to schar
832
833 switch (c) {
834 case 0x11a8: return 0x1100;
835 case 0x11a9: return 0x1101;
836 case 0x11ab: return 0x1102;
837 case 0x11ae: return 0x1103;
838 case 0x11af: return 0x1105;
839 case 0x11b7: return 0x1106;
840 case 0x11b8: return 0x1107;
841 case 0x11ba: return 0x1109;
842 case 0x11bb: return 0x110a;
843 case 0x11bc: return 0x110b;
844 case 0x11bd: return 0x110c;
845 case 0x11be: return 0x110e;
846 case 0x11bf: return 0x110f;
847 case 0x11c0: return 0x1110;
848 case 0x11c1: return 0x1111;
849 case 0x11c2: return 0x1112;
850 default: return 0;
851
852 }
853
854 }
855}