author | hash <hash> | 2002-11-08 05:36:29 (UTC) |
---|---|---|
committer | hash <hash> | 2002-11-08 05:36:29 (UTC) |
commit | 8ddf8df51c6193c362d2767491d34ca841a9c6c7 (patch) (unidiff) | |
tree | 26d55a25a0fcda215b2ecc98aa7747e8bed03b33 /inputmethods | |
parent | 34cd9251667fe1b7f6ecae3cfe95c5450e0dbe7c (diff) | |
download | opie-8ddf8df51c6193c362d2767491d34ca841a9c6c7.zip opie-8ddf8df51c6193c362d2767491d34ca841a9c6c7.tar.gz opie-8ddf8df51c6193c362d2767491d34ca841a9c6c7.tar.bz2 |
1. changed format from EUC-KR to UTF-8 (sorry about that)
2. made ctrl unsticky
3. the spanish accent and back accent shouldnt be the normal backtick char, so
i changed them to the chars in 0x2c6 ~ 0x2cf (extended ticks and stuff)
-rw-r--r-- | inputmethods/multikey/keyboard.cpp | 57 |
1 files changed, 33 insertions, 24 deletions
diff --git a/inputmethods/multikey/keyboard.cpp b/inputmethods/multikey/keyboard.cpp index de3aa52..08318bd 100644 --- a/inputmethods/multikey/keyboard.cpp +++ b/inputmethods/multikey/keyboard.cpp | |||
@@ -303,146 +303,148 @@ void Keyboard::drawKeyboard(QPainter &p, int row, int col) | |||
303 | p.drawImage( x + (keyWidthPix - pix->width())/2 + 1, | 303 | p.drawImage( x + (keyWidthPix - pix->width())/2 + 1, |
304 | y + (keyHeight - pix->height())/2 + 1, | 304 | y + (keyHeight - pix->height())/2 + 1, |
305 | QImage(*pix) ); | 305 | QImage(*pix) ); |
306 | } | 306 | } |
307 | 307 | ||
308 | p.setPen(keycolor_lines); | 308 | p.setPen(keycolor_lines); |
309 | p.drawLine(x, y, x, y + keyHeight); | 309 | p.drawLine(x, y, x, y + keyHeight); |
310 | 310 | ||
311 | x += keyWidthPix; | 311 | x += keyWidthPix; |
312 | } | 312 | } |
313 | 313 | ||
314 | 314 | ||
315 | } | 315 | } |
316 | p.setPen(keycolor_lines); | 316 | p.setPen(keycolor_lines); |
317 | p.drawLine(0, height() - 1, width(), height() - 1); | 317 | p.drawLine(0, height() - 1, width(), height() - 1); |
318 | p.drawLine(width() - 1, 0, width() - 1, height()); | 318 | p.drawLine(width() - 1, 0, width() - 1, height()); |
319 | } | 319 | } |
320 | 320 | ||
321 | } | 321 | } |
322 | 322 | ||
323 | 323 | ||
324 | /* Keyboard::mousePressEvent {{{1 */ | 324 | /* Keyboard::mousePressEvent {{{1 */ |
325 | void Keyboard::mousePressEvent(QMouseEvent *e) | 325 | void Keyboard::mousePressEvent(QMouseEvent *e) |
326 | { | 326 | { |
327 | int row = (e->y() - (usePicks ? picks->height() : 0)) / keyHeight + 1; | 327 | int row = (e->y() - (usePicks ? picks->height() : 0)) / keyHeight + 1; |
328 | if (row > 5) row = 5; | 328 | if (row > 5) row = 5; |
329 | 329 | ||
330 | // figure out the column | 330 | // figure out the column |
331 | int col = 0; | 331 | int col = 0; |
332 | for (int w = 0; e->x() >= w; col++) | 332 | for (int w = 0; e->x() >= w; col++) |
333 | if (col < keys->numKeys(row)) // it segfaults if it trys to read past numKeys | 333 | if (col < keys->numKeys(row)) // it segfaults if it trys to read past numKeys |
334 | w += keys->width(row,col) * defaultKeyWidth; | 334 | w += keys->width(row,col) * defaultKeyWidth; |
335 | else break; | 335 | else break; |
336 | 336 | ||
337 | if (col <= 0) return; | 337 | if (col <= 0) return; |
338 | 338 | ||
339 | col --; // rewind one... | 339 | col --; // rewind one... |
340 | 340 | ||
341 | qkeycode = keys->qcode(row, col); | 341 | qkeycode = keys->qcode(row, col); |
342 | unicode = keys->uni(row, col); | 342 | unicode = keys->uni(row, col); |
343 | 343 | ||
344 | // might need to repaint if two or more of the same keys. | 344 | // 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. | 345 | // should be faster if just paint one key even though multiple keys exist. |
346 | bool need_repaint = FALSE; | 346 | bool need_repaint = FALSE; |
347 | 347 | ||
348 | // circumflex and diaeresis support | 348 | // circumflex and diaeresis support |
349 | // messy to have this here, but too hard to implement any other method | 349 | // messy to have this here, but too hard to implement any other method |
350 | if (unicode == 0x2c6) { | 350 | if (unicode == 0x2c6) { |
351 | 351 | ||
352 | unicode = 0; | 352 | unicode = 0; |
353 | if (shift || lock) { | 353 | if (shift || lock) { |
354 | 354 | ||
355 | // diaeresis | 355 | // diaeresis |
356 | qkeycode = 0x2001; | 356 | qkeycode = 0x2001; |
357 | } | 357 | } |
358 | else { | 358 | else { |
359 | 359 | ||
360 | // circumflex | 360 | // circumflex |
361 | qkeycode = 0x2000; | 361 | qkeycode = 0x2000; |
362 | } | 362 | } |
363 | } | 363 | } |
364 | 364 | ||
365 | // Back accent character support | 365 | // Back accent character support |
366 | 366 | ||
367 | if (unicode == 0x60) { | 367 | //if (unicode == 0x60) { // the keys from 2c6 ~ 2cf should be used instead of the ascii one |
368 | if (unicode == 0x2cb) { | ||
368 | 369 | ||
369 | unicode = 0; | 370 | unicode = 0; |
370 | if (shift || lock) { | 371 | if (shift || lock) { |
371 | 372 | ||
372 | // circumblex | 373 | // circumblex |
373 | qkeycode = 0x2000; | 374 | qkeycode = 0x2000; |
374 | } | 375 | } |
375 | else { | 376 | else { |
376 | 377 | ||
377 | // back accent | 378 | // back accent |
378 | qkeycode = 0x2002; | 379 | qkeycode = 0x2002; |
379 | } | 380 | } |
380 | } | 381 | } |
381 | 382 | ||
382 | // Accent character support | 383 | // Accent character support |
383 | 384 | ||
384 | if (unicode == 0xb4) { | 385 | //if (unicode == 0xb4) { |
386 | if (unicode == 0x2ca) { | ||
385 | 387 | ||
386 | unicode = 0; | 388 | unicode = 0; |
387 | if (shift || lock) { | 389 | if (shift || lock) { |
388 | 390 | ||
389 | // diaeresis | 391 | // diaeresis |
390 | qkeycode = 0x2001; | 392 | qkeycode = 0x2001; |
391 | } | 393 | } |
392 | else { | 394 | else { |
393 | 395 | ||
394 | // accent | 396 | // accent |
395 | qkeycode = 0x2003; | 397 | qkeycode = 0x2003; |
396 | } | 398 | } |
397 | } | 399 | } |
398 | 400 | ||
399 | 401 | ||
400 | if (unicode == 0) { // either Qt char, or nothing | 402 | if (unicode == 0) { // either Qt char, or nothing |
401 | 403 | ||
402 | if (qkeycode == Qt::Key_F1) { // toggle the pickboard | 404 | if (qkeycode == Qt::Key_F1) { // toggle the pickboard |
403 | 405 | ||
404 | if ( configdlg ) { | 406 | if ( configdlg ) { |
405 | 407 | ||
406 | delete (ConfigDlg *) configdlg; | 408 | delete (ConfigDlg *) configdlg; |
407 | configdlg = 0; | 409 | configdlg = 0; |
408 | } | 410 | } |
409 | else { | 411 | else { |
410 | configdlg = new ConfigDlg (); | 412 | configdlg = new ConfigDlg (); |
411 | connect(configdlg, SIGNAL(setMapToDefault()), | 413 | connect(configdlg, SIGNAL(setMapToDefault()), |
412 | this, SLOT(setMapToDefault())); | 414 | this, SLOT(setMapToDefault())); |
413 | connect(configdlg, SIGNAL(setMapToFile(QString)), | 415 | connect(configdlg, SIGNAL(setMapToFile(QString)), |
414 | this, SLOT(setMapToFile(QString))); | 416 | this, SLOT(setMapToFile(QString))); |
415 | connect(configdlg, SIGNAL(pickboardToggled(bool)), | 417 | connect(configdlg, SIGNAL(pickboardToggled(bool)), |
416 | this, SLOT(togglePickboard(bool))); | 418 | this, SLOT(togglePickboard(bool))); |
417 | connect(configdlg, SIGNAL(repeatToggled(bool)), | 419 | connect(configdlg, SIGNAL(repeatToggled(bool)), |
418 | this, SLOT(toggleRepeat(bool))); | 420 | this, SLOT(toggleRepeat(bool))); |
419 | connect(configdlg, SIGNAL(reloadKeyboard()), | 421 | connect(configdlg, SIGNAL(reloadKeyboard()), |
420 | this, SLOT(reloadKeyboard())); | 422 | this, SLOT(reloadKeyboard())); |
421 | connect(configdlg, SIGNAL(configDlgClosed()), | 423 | connect(configdlg, SIGNAL(configDlgClosed()), |
422 | this, SLOT(cleanupConfigDlg())); | 424 | this, SLOT(cleanupConfigDlg())); |
423 | configdlg->showMaximized(); | 425 | configdlg->showMaximized(); |
424 | configdlg->show(); | 426 | configdlg->show(); |
425 | configdlg->raise(); | 427 | configdlg->raise(); |
426 | } | 428 | } |
427 | 429 | ||
428 | } else if (qkeycode == Qt::Key_Control) { | 430 | } else if (qkeycode == Qt::Key_Control) { |
429 | need_repaint = TRUE; | 431 | need_repaint = TRUE; |
430 | 432 | ||
431 | if (ctrl) { | 433 | if (ctrl) { |
432 | 434 | ||
433 | *ctrl = 0; | 435 | *ctrl = 0; |
434 | ctrl = 0; | 436 | ctrl = 0; |
435 | 437 | ||
436 | } else { | 438 | } else { |
437 | 439 | ||
438 | ctrl = keys->pressedPtr(row, col); | 440 | ctrl = keys->pressedPtr(row, col); |
439 | need_repaint = TRUE; | 441 | need_repaint = TRUE; |
440 | *ctrl = !keys->pressed(row, col); | 442 | *ctrl = !keys->pressed(row, col); |
441 | 443 | ||
442 | } | 444 | } |
443 | 445 | ||
444 | } else if (qkeycode == Qt::Key_Alt) { | 446 | } else if (qkeycode == Qt::Key_Alt) { |
445 | need_repaint = TRUE; | 447 | need_repaint = TRUE; |
446 | 448 | ||
447 | if (alt) { | 449 | if (alt) { |
448 | *alt = 0; | 450 | *alt = 0; |
@@ -705,128 +707,135 @@ void Keyboard::mousePressEvent(QMouseEvent *e) | |||
705 | QWSServer::sendKeyEvent(unicode, qkeycode, modifiers, true, false); | 707 | QWSServer::sendKeyEvent(unicode, qkeycode, modifiers, true, false); |
706 | 708 | ||
707 | // pickboard stuff | 709 | // pickboard stuff |
708 | if (usePicks) { | 710 | if (usePicks) { |
709 | 711 | ||
710 | KeyboardConfig *dc = picks->dc; | 712 | KeyboardConfig *dc = picks->dc; |
711 | 713 | ||
712 | if (dc) { | 714 | if (dc) { |
713 | if (qkeycode == Qt::Key_Backspace) { | 715 | if (qkeycode == Qt::Key_Backspace) { |
714 | dc->input.remove(dc->input.last()); // remove last input | 716 | dc->input.remove(dc->input.last()); // remove last input |
715 | dc->decBackspaces(); | 717 | dc->decBackspaces(); |
716 | } 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) { |
717 | dc->input.clear(); | 719 | dc->input.clear(); |
718 | dc->resetBackspaces(); | 720 | dc->resetBackspaces(); |
719 | } else { | 721 | } else { |
720 | dc->add(QString(QChar(unicode))); | 722 | dc->add(QString(QChar(unicode))); |
721 | dc->incBackspaces(); | 723 | dc->incBackspaces(); |
722 | } | 724 | } |
723 | } | 725 | } |
724 | picks->repaint(); | 726 | picks->repaint(); |
725 | } | 727 | } |
726 | 728 | ||
727 | 729 | ||
728 | // painting | 730 | // painting |
729 | pressed = TRUE; | 731 | pressed = TRUE; |
730 | 732 | ||
731 | pressedKeyRow = row; | 733 | pressedKeyRow = row; |
732 | pressedKeyCol = col; | 734 | pressedKeyCol = col; |
733 | 735 | ||
734 | if (need_repaint) repaint(FALSE); | 736 | if (need_repaint) repaint(FALSE); |
735 | else { // just paint the one key pressed | 737 | else { // just paint the one key pressed |
736 | 738 | ||
737 | 739 | ||
738 | 740 | ||
739 | QPainter p(this); | 741 | QPainter p(this); |
740 | drawKeyboard(p, row, col); | 742 | drawKeyboard(p, row, col); |
741 | 743 | ||
742 | } | 744 | } |
743 | 745 | ||
744 | if (useRepeat) repeatTimer->start( 800 ); | 746 | if (useRepeat) repeatTimer->start( 800 ); |
745 | //pressTid = startTimer(80); | 747 | //pressTid = startTimer(80); |
746 | 748 | ||
747 | } | 749 | } |
748 | 750 | ||
749 | 751 | ||
750 | /* Keyboard::mouseReleaseEvent {{{1 */ | 752 | /* Keyboard::mouseReleaseEvent {{{1 */ |
751 | void Keyboard::mouseReleaseEvent(QMouseEvent*) | 753 | void Keyboard::mouseReleaseEvent(QMouseEvent*) |
752 | { | 754 | { |
753 | pressed = FALSE; | 755 | pressed = FALSE; |
754 | //if ( pressTid == 0 ) | 756 | //if ( pressTid == 0 ) |
755 | #if defined(Q_WS_QWS) || defined(_WS_QWS_) | 757 | #if defined(Q_WS_QWS) || defined(_WS_QWS_) |
756 | if ( unicode != -1 ) { | 758 | if ( unicode != -1 ) { |
757 | emit key( unicode, qkeycode, modifiers, false, false ); | 759 | emit key( unicode, qkeycode, modifiers, false, false ); |
758 | repeatTimer->stop(); | 760 | repeatTimer->stop(); |
759 | } | 761 | } |
760 | #endif | 762 | #endif |
761 | if (shift && unicode != 0) { | 763 | if (shift && unicode != 0) { |
762 | 764 | ||
763 | 765 | ||
764 | *shift = 0; // unpress shift key | 766 | *shift = 0; // unpress shift key |
765 | shift = 0; // reset the shift pointer | 767 | shift = 0; // reset the shift pointer |
766 | repaint(FALSE); | 768 | repaint(FALSE); |
767 | 769 | ||
768 | } | 770 | } |
771 | if (ctrl && unicode != 0) { | ||
772 | |||
773 | *ctrl = 0; | ||
774 | ctrl = 0; | ||
775 | repaint(FALSE); | ||
776 | |||
777 | } | ||
769 | 778 | ||
770 | /* | 779 | /* |
771 | * do not make the meta key release after being pressed | 780 | * do not make the meta key release after being pressed |
772 | * | 781 | * |
773 | 782 | ||
774 | else if (meta && unicode != 0) { | 783 | else if (meta && unicode != 0) { |
775 | 784 | ||
776 | *meta = 0; | 785 | *meta = 0; |
777 | meta = 0; | 786 | meta = 0; |
778 | repaint(FALSE); | 787 | repaint(FALSE); |
779 | } | 788 | } |
780 | 789 | ||
781 | */ | 790 | */ |
782 | 791 | ||
783 | else clearHighlight(); | 792 | else clearHighlight(); |
784 | } | 793 | } |
785 | 794 | ||
786 | /* Keyboard::timerEvent {{{1 */ | 795 | /* Keyboard::timerEvent {{{1 */ |
787 | 796 | ||
788 | /* dont know what this does, but i think it is here so that if your screen | 797 | /* dont know what this does, but i think it is here so that if your screen |
789 | * sticks (like on an ipaq) then it will stop repeating if you click another | 798 | * sticks (like on an ipaq) then it will stop repeating if you click another |
790 | * key... but who knows what anything does in this thing anyway? | 799 | * key... but who knows what anything does in this thing anyway? |
791 | 800 | ||
792 | void Keyboard::timerEvent(QTimerEvent* e) | 801 | void Keyboard::timerEvent(QTimerEvent* e) |
793 | { | 802 | { |
794 | if ( e->timerId() == pressTid ) { | 803 | if ( e->timerId() == pressTid ) { |
795 | killTimer(pressTid); | 804 | killTimer(pressTid); |
796 | pressTid = 0; | 805 | pressTid = 0; |
797 | if ( !pressed ) | 806 | if ( !pressed ) |
798 | cout << "calling clearHighlight from timerEvent\n"; | 807 | cout << "calling clearHighlight from timerEvent\n"; |
799 | //clearHighlight(); | 808 | //clearHighlight(); |
800 | } | 809 | } |
801 | } | 810 | } |
802 | */ | 811 | */ |
803 | 812 | ||
804 | void Keyboard::repeat() | 813 | void Keyboard::repeat() |
805 | { | 814 | { |
806 | 815 | ||
807 | repeatTimer->start( 200 ); | 816 | repeatTimer->start( 200 ); |
808 | emit key( unicode, qkeycode, modifiers, true, true ); | 817 | emit key( unicode, qkeycode, modifiers, true, true ); |
809 | } | 818 | } |
810 | 819 | ||
811 | void Keyboard::clearHighlight() | 820 | void Keyboard::clearHighlight() |
812 | { | 821 | { |
813 | if ( pressedKeyRow >= 0 && pressedKeyCol >= 0) { | 822 | if ( pressedKeyRow >= 0 && pressedKeyCol >= 0) { |
814 | int tmpRow = pressedKeyRow; | 823 | int tmpRow = pressedKeyRow; |
815 | int tmpCol = pressedKeyCol; | 824 | int tmpCol = pressedKeyCol; |
816 | 825 | ||
817 | pressedKeyRow = -1; | 826 | pressedKeyRow = -1; |
818 | pressedKeyCol = -1; | 827 | pressedKeyCol = -1; |
819 | 828 | ||
820 | QPainter p(this); | 829 | QPainter p(this); |
821 | drawKeyboard(p, tmpRow, tmpCol); | 830 | drawKeyboard(p, tmpRow, tmpCol); |
822 | } | 831 | } |
823 | } | 832 | } |
824 | 833 | ||
825 | 834 | ||
826 | /* Keyboard::sizeHint {{{1 */ | 835 | /* Keyboard::sizeHint {{{1 */ |
827 | QSize Keyboard::sizeHint() const | 836 | QSize Keyboard::sizeHint() const |
828 | { | 837 | { |
829 | QFontMetrics fm=fontMetrics(); | 838 | QFontMetrics fm=fontMetrics(); |
830 | int keyHeight = fm.lineSpacing() + 2; | 839 | int keyHeight = fm.lineSpacing() + 2; |
831 | 840 | ||
832 | return QSize( 240, keyHeight * keys->rows() + (usePicks ? picks->sizeHint().height() : 0) + 1); | 841 | return QSize( 240, keyHeight * keys->rows() + (usePicks ? picks->sizeHint().height() : 0) + 1); |
@@ -954,213 +963,213 @@ void Keyboard::setMapToFile(QString map) { | |||
954 | void Keyboard::reloadKeyboard() { | 963 | void Keyboard::reloadKeyboard() { |
955 | 964 | ||
956 | // reload colors and redraw | 965 | // reload colors and redraw |
957 | loadKeyboardColors(); | 966 | loadKeyboardColors(); |
958 | repaint(); | 967 | repaint(); |
959 | 968 | ||
960 | } | 969 | } |
961 | 970 | ||
962 | void Keyboard::loadKeyboardColors() { | 971 | void Keyboard::loadKeyboardColors() { |
963 | 972 | ||
964 | Config config ("multikey"); | 973 | Config config ("multikey"); |
965 | config.setGroup("colors"); | 974 | config.setGroup("colors"); |
966 | 975 | ||
967 | QStringList color; | 976 | QStringList color; |
968 | color = config.readListEntry("keycolor", QChar(',')); | 977 | color = config.readListEntry("keycolor", QChar(',')); |
969 | if (color.isEmpty()) { | 978 | if (color.isEmpty()) { |
970 | color = QStringList::split(",", "240,240,240"); | 979 | color = QStringList::split(",", "240,240,240"); |
971 | config.writeEntry("keycolor", color.join(",")); | 980 | config.writeEntry("keycolor", color.join(",")); |
972 | 981 | ||
973 | } | 982 | } |
974 | keycolor = QColor(color[0].toInt(), color[1].toInt(), color[2].toInt()); | 983 | keycolor = QColor(color[0].toInt(), color[1].toInt(), color[2].toInt()); |
975 | 984 | ||
976 | color = config.readListEntry("keycolor_pressed", QChar(',')); | 985 | color = config.readListEntry("keycolor_pressed", QChar(',')); |
977 | if (color.isEmpty()) { | 986 | if (color.isEmpty()) { |
978 | color = QStringList::split(",", "171,183,198"); | 987 | color = QStringList::split(",", "171,183,198"); |
979 | config.writeEntry("keycolor_pressed", color.join(",")); | 988 | config.writeEntry("keycolor_pressed", color.join(",")); |
980 | 989 | ||
981 | } | 990 | } |
982 | keycolor_pressed = QColor(color[0].toInt(), color[1].toInt(), color[2].toInt()); | 991 | keycolor_pressed = QColor(color[0].toInt(), color[1].toInt(), color[2].toInt()); |
983 | 992 | ||
984 | color = config.readListEntry("keycolor_lines", QChar(',')); | 993 | color = config.readListEntry("keycolor_lines", QChar(',')); |
985 | if (color.isEmpty()) { | 994 | if (color.isEmpty()) { |
986 | color = QStringList::split(",", "138,148,160"); | 995 | color = QStringList::split(",", "138,148,160"); |
987 | config.writeEntry("keycolor_lines", color.join(",")); | 996 | config.writeEntry("keycolor_lines", color.join(",")); |
988 | 997 | ||
989 | } | 998 | } |
990 | keycolor_lines = QColor(color[0].toInt(), color[1].toInt(), color[2].toInt()); | 999 | keycolor_lines = QColor(color[0].toInt(), color[1].toInt(), color[2].toInt()); |
991 | 1000 | ||
992 | color = config.readListEntry("textcolor", QChar(',')); | 1001 | color = config.readListEntry("textcolor", QChar(',')); |
993 | if (color.isEmpty()) { | 1002 | if (color.isEmpty()) { |
994 | color = QStringList::split(",", "43,54,68"); | 1003 | color = QStringList::split(",", "43,54,68"); |
995 | config.writeEntry("textcolor", color.join(",")); | 1004 | config.writeEntry("textcolor", color.join(",")); |
996 | 1005 | ||
997 | } | 1006 | } |
998 | textcolor = QColor(color[0].toInt(), color[1].toInt(), color[2].toInt()); | 1007 | textcolor = QColor(color[0].toInt(), color[1].toInt(), color[2].toInt()); |
999 | 1008 | ||
1000 | } | 1009 | } |
1001 | 1010 | ||
1002 | /* korean input functions {{{1 | 1011 | /* korean input functions {{{1 |
1003 | * | 1012 | * |
1004 | * TODO | 1013 | * TODO |
1005 | * one major problem with this implementation is that you can't move the | 1014 | * one major problem with this implementation is that you can't move the |
1006 | * cursor after inputing korean chars, otherwise it will eat up and replace | 1015 | * cursor after inputing korean chars, otherwise it will eat up and replace |
1007 | * the char before the cursor you move to. fix that | 1016 | * the char before the cursor you move to. fix that |
1008 | * | 1017 | * |
1009 | * make backspace delete one single char, not the whole thing if still | 1018 | * make backspace delete one single char, not the whole thing if still |
1010 | * editing. | 1019 | * editing. |
1011 | * | 1020 | * |
1012 | * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * | 1021 | * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
1013 | * | 1022 | * |
1014 | * how korean input works | 1023 | * how korean input works |
1015 | * | 1024 | * |
1016 | * all following chars means unicode char value and are in hex | 1025 | * all following chars means unicode char value and are in hex |
1017 | * | 1026 | * |
1018 | * = schar (start char) | 1027 | * 초음 = schar (start char) |
1019 | * = mchar (middle char) | 1028 | * 중음 = mchar (middle char) |
1020 | * = echar (end char) | 1029 | * 끝음 = echar (end char) |
1021 | * | 1030 | * |
1022 | * there are 19 schars. unicode position is at 1100 - 1112 | 1031 | * there are 19 schars. unicode position is at 1100 - 1112 |
1023 | * there are 21 mchars. unicode position is at 1161 - 1175 | 1032 | * there are 21 mchars. unicode position is at 1161 - 1175 |
1024 | * there are 27 echars. unicode position is at 11a8 - 11c2 | 1033 | * there are 27 echars. unicode position is at 11a8 - 11c2 |
1025 | * | 1034 | * |
1026 | * the map with everything combined is at ac00 - d7a3 | 1035 | * the map with everything combined is at ac00 - d7a3 |
1027 | * | 1036 | * |
1028 | */ | 1037 | */ |
1029 | 1038 | ||
1030 | ushort Keyboard::parseKoreanInput (ushort c) { | 1039 | ushort Keyboard::parseKoreanInput (ushort c) { |
1031 | 1040 | ||
1032 | if ((c != 0 && (c < 0x1100 || 0x11c2 < c) && (c < 0xac00 || 0xd7a3 < c)) | 1041 | if ((c != 0 && (c < 0x1100 || 0x11c2 < c) && (c < 0xac00 || 0xd7a3 < c)) |
1033 | || | 1042 | || |
1034 | (c == 0 && qkeycode != Qt::Key_Shift && Qt::Key_CapsLock != qkeycode | 1043 | (c == 0 && qkeycode != Qt::Key_Shift && Qt::Key_CapsLock != qkeycode |
1035 | && qkeycode != Qt::Key_Control && qkeycode != Qt::Key_Alt)) { | 1044 | && qkeycode != Qt::Key_Control && qkeycode != Qt::Key_Alt)) { |
1036 | 1045 | ||
1037 | schar = 0, mchar = 0, echar = 0; | 1046 | schar = 0, mchar = 0, echar = 0; |
1038 | return c; | 1047 | return c; |
1039 | } | 1048 | } |
1040 | 1049 | ||
1041 | if ( 0x1100 <= c && c <= 0x1112 ) { // schar or echar was input | 1050 | if ( 0x1100 <= c && c <= 0x1112 ) { // schar or echar was input |
1042 | 1051 | ||
1043 | if (schar == 0 || (schar != 0 && mchar == 0)) { | 1052 | if (schar == 0 || (schar != 0 && mchar == 0)) { |
1044 | schar = c; mchar = 0; echar = 0; | 1053 | schar = c; mchar = 0; echar = 0; |
1045 | return c; | 1054 | return c; |
1046 | } | 1055 | } |
1047 | else if (mchar != 0) { | 1056 | else if (mchar != 0) { |
1048 | 1057 | ||
1049 | if (echar == 0) { | 1058 | if (echar == 0) { |
1050 | 1059 | ||
1051 | if (!(echar = constoe(c))) { | 1060 | if (!(echar = constoe(c))) { |
1052 | 1061 | ||
1053 | schar = c; mchar = 0; echar = 0; | 1062 | schar = c; mchar = 0; echar = 0; |
1054 | return c; | 1063 | return c; |
1055 | } | 1064 | } |
1056 | 1065 | ||
1057 | } | 1066 | } |
1058 | else { // must figure out what the echar is | 1067 | else { // must figure out what the echar is |
1059 | 1068 | ||
1060 | if (echar == 0x11a8) { // | 1069 | if (echar == 0x11a8) { // ㄱ |
1061 | 1070 | ||
1062 | if (c == 0x1100) echar = 0x11a9; // + | 1071 | if (c == 0x1100) echar = 0x11a9; // ㄱ + ㄱ |
1063 | else if (c == 0x1109) echar = 0x11aa; // + | 1072 | else if (c == 0x1109) echar = 0x11aa; // ㄱ + ㅅ |
1064 | else { | 1073 | else { |
1065 | schar = c; mchar = 0; echar = 0; | 1074 | schar = c; mchar = 0; echar = 0; |
1066 | return c; | 1075 | return c; |
1067 | } | 1076 | } |
1068 | 1077 | ||
1069 | } else if (echar == 0x11ab) { // | 1078 | } else if (echar == 0x11ab) { // ㄴ |
1070 | 1079 | ||
1071 | if (c == 0x110c) echar = 0x11ac; // + | 1080 | if (c == 0x110c) echar = 0x11ac; // ㄴ + ㅈ |
1072 | else if (c == 0x1112) echar = 0x11ad; // + | 1081 | else if (c == 0x1112) echar = 0x11ad; // ㄴ + ㅎ |
1073 | else { | 1082 | else { |
1074 | schar = c; mchar = 0; echar = 0; | 1083 | schar = c; mchar = 0; echar = 0; |
1075 | return c; | 1084 | return c; |
1076 | } | 1085 | } |
1077 | 1086 | ||
1078 | } else if (echar == 0x11af) { // | 1087 | } else if (echar == 0x11af) { // ㄹ |
1079 | 1088 | ||
1080 | if (c == 0x1100) echar = 0x11b0; // + | 1089 | if (c == 0x1100) echar = 0x11b0; // ㄹ + ㄱ |
1081 | else if (c == 0x1106) echar = 0x11b1; // + | 1090 | else if (c == 0x1106) echar = 0x11b1; // ㄹ + ㅁ |
1082 | else if (c == 0x1107) echar = 0x11b2; // + | 1091 | else if (c == 0x1107) echar = 0x11b2; // ㄹ + ㅂ |
1083 | else if (c == 0x1109) echar = 0x11b3; // + | 1092 | else if (c == 0x1109) echar = 0x11b3; // ㄹ + ㅅ |
1084 | else if (c == 0x1110) echar = 0x11b4; // + | 1093 | else if (c == 0x1110) echar = 0x11b4; // ㄹ + ㅌ |
1085 | else if (c == 0x1111) echar = 0x11b5; // + | 1094 | else if (c == 0x1111) echar = 0x11b5; // ㄹ + ㅍ |
1086 | else if (c == 0x1112) echar = 0x11b6; // + | 1095 | else if (c == 0x1112) echar = 0x11b6; // ㄹ + ㅎ |
1087 | else { | 1096 | else { |
1088 | schar = c; mchar = 0; echar = 0; | 1097 | schar = c; mchar = 0; echar = 0; |
1089 | return c; | 1098 | return c; |
1090 | } | 1099 | } |
1091 | 1100 | ||
1092 | } else if (echar == 0x11b8) { // | 1101 | } else if (echar == 0x11b8) { // ㅂ |
1093 | 1102 | ||
1094 | if (c == 0x1109) echar = 0x11b9; // + | 1103 | if (c == 0x1109) echar = 0x11b9; // ㅂ + ㅅ |
1095 | else { | 1104 | else { |
1096 | schar = c; mchar = 0; echar = 0; | 1105 | schar = c; mchar = 0; echar = 0; |
1097 | return c; | 1106 | return c; |
1098 | } | 1107 | } |
1099 | 1108 | ||
1100 | } else if (echar == 0x11ba) { // | 1109 | } else if (echar == 0x11ba) { // ㅅ |
1101 | 1110 | ||
1102 | if (c == 0x1109) echar = 0x11bb; // + | 1111 | if (c == 0x1109) echar = 0x11bb; // ㅅ + ㅅ |
1103 | else { | 1112 | else { |
1104 | schar = c; mchar = 0; echar = 0; | 1113 | schar = c; mchar = 0; echar = 0; |
1105 | return c; | 1114 | return c; |
1106 | } | 1115 | } |
1107 | 1116 | ||
1108 | } else { // if any other char, cannot combine chars | 1117 | } else { // if any other char, cannot combine chars |
1109 | 1118 | ||
1110 | schar = c; mchar = 0; echar = 0; | 1119 | schar = c; mchar = 0; echar = 0; |
1111 | return c; | 1120 | return c; |
1112 | } | 1121 | } |
1113 | 1122 | ||
1114 | unicode = echar; | 1123 | unicode = echar; |
1115 | } | 1124 | } |
1116 | } | 1125 | } |
1117 | 1126 | ||
1118 | } | 1127 | } |
1119 | else if (0x1161 <= c && c <= 0x1175) { // mchar was input | 1128 | else if (0x1161 <= c && c <= 0x1175) { // mchar was input |
1120 | 1129 | ||
1121 | if (schar != 0 && mchar == 0) { mchar = c; } | 1130 | if (schar != 0 && mchar == 0) { mchar = c; } |
1122 | 1131 | ||
1123 | else if (schar != 0 && mchar != 0 && echar == 0) { | 1132 | else if (schar != 0 && mchar != 0 && echar == 0) { |
1124 | 1133 | ||
1125 | switch (mchar) { | 1134 | switch (mchar) { |
1126 | case 0x1169: | 1135 | case 0x1169: |
1127 | if (c == 0x1161) mchar = 0x116a; | 1136 | if (c == 0x1161) mchar = 0x116a; |
1128 | else if (c == 0x1162) mchar = 0x116b; | 1137 | else if (c == 0x1162) mchar = 0x116b; |
1129 | else if (c == 0x1175) mchar = 0x116c; | 1138 | else if (c == 0x1175) mchar = 0x116c; |
1130 | else { | 1139 | else { |
1131 | schar = 0; mchar = 0; echar = 0; | 1140 | schar = 0; mchar = 0; echar = 0; |
1132 | return c; | 1141 | return c; |
1133 | } | 1142 | } |
1134 | break; | 1143 | break; |
1135 | case 0x116e: | 1144 | case 0x116e: |
1136 | if (c == 0x1165) mchar = 0x116f; | 1145 | if (c == 0x1165) mchar = 0x116f; |
1137 | else if (c == 0x1166) mchar = 0x1170; | 1146 | else if (c == 0x1166) mchar = 0x1170; |
1138 | else if (c == 0x1175) mchar = 0x1171; | 1147 | else if (c == 0x1175) mchar = 0x1171; |
1139 | else { | 1148 | else { |
1140 | schar = 0; mchar = 0; echar = 0; | 1149 | schar = 0; mchar = 0; echar = 0; |
1141 | return c; | 1150 | return c; |
1142 | } | 1151 | } |
1143 | break; | 1152 | break; |
1144 | case 0x1173: | 1153 | case 0x1173: |
1145 | if (c == 0x1175) mchar = 0x1174; | 1154 | if (c == 0x1175) mchar = 0x1174; |
1146 | else { | 1155 | else { |
1147 | schar = 0; mchar = 0; echar = 0; | 1156 | schar = 0; mchar = 0; echar = 0; |
1148 | return c; | 1157 | return c; |
1149 | } | 1158 | } |
1150 | break; | 1159 | break; |
1151 | default: | 1160 | default: |
1152 | schar = 0; mchar = 0; echar = 0; | 1161 | schar = 0; mchar = 0; echar = 0; |
1153 | return c; | 1162 | return c; |
1154 | } | 1163 | } |
1155 | } | 1164 | } |
1156 | else if (schar != 0 && mchar != 0 && echar != 0) { | 1165 | else if (schar != 0 && mchar != 0 && echar != 0) { |
1157 | 1166 | ||
1158 | emit key( 8, Qt::Key_Backspace, 0, true, false ); | 1167 | emit key( 8, Qt::Key_Backspace, 0, true, false ); |
1159 | 1168 | ||
1160 | ushort prev = 0; | 1169 | ushort prev = 0; |
1161 | switch (echar) { | 1170 | switch (echar) { |
1162 | /* | 1171 | /* |
1163 | case 0x11a9: | 1172 | case 0x11a9: |
1164 | prev = combineKoreanChars(schar, mchar, 0x11a8); | 1173 | prev = combineKoreanChars(schar, mchar, 0x11a8); |
1165 | schar = 0x1100; | 1174 | schar = 0x1100; |
1166 | break; | 1175 | break; |
@@ -1401,129 +1410,129 @@ void Keys::setKeysFromFile(const char * filename) { | |||
1401 | 1410 | ||
1402 | } | 1411 | } |
1403 | setKey(row, qcode, unicode, width, xpm2pix); | 1412 | setKey(row, qcode, unicode, width, xpm2pix); |
1404 | } | 1413 | } |
1405 | 1414 | ||
1406 | // shift map | 1415 | // shift map |
1407 | else if (buf.contains(QRegExp("^[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) { | 1416 | else if (buf.contains(QRegExp("^[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) { |
1408 | 1417 | ||
1409 | QTextStream tmp (buf, IO_ReadOnly); | 1418 | QTextStream tmp (buf, IO_ReadOnly); |
1410 | ushort lower, shift; | 1419 | ushort lower, shift; |
1411 | tmp >> lower >> shift; | 1420 | tmp >> lower >> shift; |
1412 | 1421 | ||
1413 | shiftMap.insert(lower, shift); | 1422 | shiftMap.insert(lower, shift); |
1414 | 1423 | ||
1415 | buf = t.readLine(); | 1424 | buf = t.readLine(); |
1416 | } | 1425 | } |
1417 | 1426 | ||
1418 | // meta key map | 1427 | // meta key map |
1419 | else if (buf.contains(QRegExp("^\\s*m\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) { | 1428 | else if (buf.contains(QRegExp("^\\s*m\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) { |
1420 | 1429 | ||
1421 | QTextStream tmp (buf, IO_ReadOnly); | 1430 | QTextStream tmp (buf, IO_ReadOnly); |
1422 | ushort lower, shift; | 1431 | ushort lower, shift; |
1423 | QChar m; | 1432 | QChar m; |
1424 | tmp >> m >> lower >> shift; | 1433 | tmp >> m >> lower >> shift; |
1425 | 1434 | ||
1426 | metaMap.insert(lower, shift); | 1435 | metaMap.insert(lower, shift); |
1427 | 1436 | ||
1428 | buf = t.readLine(); | 1437 | buf = t.readLine(); |
1429 | } | 1438 | } |
1430 | 1439 | ||
1431 | // circumflex | 1440 | // circumflex |
1432 | else if (buf.contains(QRegExp("^\\s*c\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) { | 1441 | else if (buf.contains(QRegExp("^\\s*c\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) { |
1433 | 1442 | ||
1434 | QTextStream tmp (buf, IO_ReadOnly); | 1443 | QTextStream tmp (buf, IO_ReadOnly); |
1435 | ushort lower, shift; | 1444 | ushort lower, shift; |
1436 | QChar c; | 1445 | QChar c; |
1437 | tmp >> c >> lower >> shift; | 1446 | tmp >> c >> lower >> shift; |
1438 | 1447 | ||
1439 | circumflexMap.insert(lower, shift); | 1448 | circumflexMap.insert(lower, shift); |
1440 | 1449 | ||
1441 | buf = t.readLine(); | 1450 | buf = t.readLine(); |
1442 | } | 1451 | } |
1443 | // diaeresis | 1452 | // diaeresis |
1444 | else if (buf.contains(QRegExp("^\\s*d\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) { | 1453 | else if (buf.contains(QRegExp("^\\s*d\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) { |
1445 | 1454 | ||
1446 | QTextStream tmp (buf, IO_ReadOnly); | 1455 | QTextStream tmp (buf, IO_ReadOnly); |
1447 | ushort lower, shift; | 1456 | ushort lower, shift; |
1448 | QChar d; | 1457 | QChar d; |
1449 | tmp >> d >> lower >> shift; | 1458 | tmp >> d >> lower >> shift; |
1450 | 1459 | ||
1451 | diaeresisMap.insert(lower, shift); | 1460 | diaeresisMap.insert(lower, shift); |
1452 | 1461 | ||
1453 | buf = t.readLine(); | 1462 | buf = t.readLine(); |
1454 | } | 1463 | } |
1455 | // back accent | 1464 | // back accent |
1456 | else if (buf.contains(QRegExp("^\\s*b\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) { | 1465 | else if (buf.contains(QRegExp("^\\s*b\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) { |
1457 | 1466 | ||
1458 | QTextStream tmp (buf, IO_ReadOnly); | 1467 | QTextStream tmp (buf, IO_ReadOnly); |
1459 | ushort lower, shift; | 1468 | ushort lower, shift; |
1460 | QChar d; | 1469 | QChar d; |
1461 | tmp >> d >> lower >> shift; | 1470 | tmp >> d >> lower >> shift; |
1462 | 1471 | ||
1463 | baccentMap.insert(lower, shift); | 1472 | baccentMap.insert(lower, shift); |
1464 | 1473 | ||
1465 | qDebug ("Estoy aadiendo %i con %i", lower, shift); | 1474 | qDebug ("Estoy aadiendo %i con %i", lower, shift); |
1466 | buf = t.readLine(); | 1475 | buf = t.readLine(); |
1467 | } | 1476 | } |
1468 | // accent | 1477 | // accent |
1469 | else if (buf.contains(QRegExp("^\\s*a\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) { | 1478 | else if (buf.contains(QRegExp("^\\s*a\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) { |
1470 | 1479 | ||
1471 | QTextStream tmp (buf, IO_ReadOnly); | 1480 | QTextStream tmp (buf, IO_ReadOnly); |
1472 | ushort lower, shift; | 1481 | ushort lower, shift; |
1473 | QChar d; | 1482 | QChar d; |
1474 | tmp >> d >> lower >> shift; | 1483 | tmp >> d >> lower >> shift; |
1475 | 1484 | ||
1476 | accentMap.insert(lower, shift); | 1485 | accentMap.insert(lower, shift); |
1477 | 1486 | ||
1478 | buf = t.readLine(); | 1487 | buf = t.readLine(); |
1479 | } | 1488 | } |
1480 | 1489 | ||
1481 | // other variables like lang & title | 1490 | // other variables like lang & title |
1482 | else if (buf.contains(QRegExp("^\\s*[a-zA-Z]+\\s*=\\s*[a-zA-Z0-9/]+\\s*$", FALSE, FALSE))) { | 1491 | else if (buf.contains(QRegExp("^\\s*[a-zA-Z]+\\s*=\\s*[a-zA-Z0-9/]+\\s*$", FALSE, FALSE))) { |
1483 | 1492 | ||
1484 | QTextStream tmp (buf, IO_ReadOnly); | 1493 | QTextStream tmp (buf, IO_ReadOnly); |
1485 | QString name, equals, value; | 1494 | QString name, equals, value; |
1486 | 1495 | ||
1487 | tmp >> name >> equals >> value; | 1496 | tmp >> name >> equals >> value; |
1488 | 1497 | ||
1489 | if (name == "lang") { | 1498 | if (name == "lang") { |
1490 | 1499 | ||
1491 | lang = value; | 1500 | lang = value; |
1492 | 1501 | ||
1493 | } | 1502 | } |
1494 | 1503 | ||
1495 | buf = t.readLine(); | 1504 | buf = t.readLine(); |
1496 | } | 1505 | } |
1497 | // comments | 1506 | // comments |
1498 | else if (buf.contains(QRegExp("^\\s*#"))) { | 1507 | else if (buf.contains(QRegExp("^\\s*#"))) { |
1499 | 1508 | ||
1500 | buf = t.readLine(); | 1509 | buf = t.readLine(); |
1501 | 1510 | ||
1502 | } else { // blank line, or garbage | 1511 | } else { // blank line, or garbage |
1503 | 1512 | ||
1504 | buf = t.readLine(); | 1513 | buf = t.readLine(); |
1505 | 1514 | ||
1506 | } | 1515 | } |
1507 | 1516 | ||
1508 | } | 1517 | } |
1509 | f.close(); | 1518 | f.close(); |
1510 | } | 1519 | } |
1511 | 1520 | ||
1512 | } | 1521 | } |
1513 | 1522 | ||
1514 | // Keys::setKey {{{2 | 1523 | // Keys::setKey {{{2 |
1515 | void Keys::setKey(const int row, const int qcode, const ushort unicode, | 1524 | void Keys::setKey(const int row, const int qcode, const ushort unicode, |
1516 | const int width, QImage *pix) { | 1525 | const int width, QImage *pix) { |
1517 | 1526 | ||
1518 | Key * key; | 1527 | Key * key; |
1519 | key = new Key; | 1528 | key = new Key; |
1520 | key->qcode = qcode; | 1529 | key->qcode = qcode; |
1521 | key->unicode = unicode; | 1530 | key->unicode = unicode; |
1522 | key->width = width; | 1531 | key->width = width; |
1523 | 1532 | ||
1524 | // share key->pressed between same keys | 1533 | // share key->pressed between same keys |
1525 | bool found = 0; | 1534 | bool found = 0; |
1526 | for (int i = 1; i <= 5; i++) { | 1535 | for (int i = 1; i <= 5; i++) { |
1527 | for (unsigned int j = 0; j < keys[i].count(); j++) | 1536 | for (unsigned int j = 0; j < keys[i].count(); j++) |
1528 | if (keys[i].at(j)->qcode == qcode && keys[i].at(j)->unicode == unicode) { | 1537 | if (keys[i].at(j)->qcode == qcode && keys[i].at(j)->unicode == unicode) { |
1529 | 1538 | ||