-rw-r--r-- | inputmethods/multikey/keyboard.cpp | 10 | ||||
-rw-r--r-- | inputmethods/multikey/keyboard.h | 1 |
2 files changed, 11 insertions, 0 deletions
diff --git a/inputmethods/multikey/keyboard.cpp b/inputmethods/multikey/keyboard.cpp index b71f929..671868c 100644 --- a/inputmethods/multikey/keyboard.cpp +++ b/inputmethods/multikey/keyboard.cpp @@ -636,436 +636,446 @@ ushort Keyboard::parseKoreanInput (ushort c) { if (c == 0x1109) echar = 0x11b9; // ¤² + ¤µ else { schar = c; mchar = 0; echar = 0; return c; } } else if (echar == 0x11ba) { // ¤µ if (c == 0x1109) echar = 0x11bb; // ¤µ + ¤µ else { schar = c; mchar = 0; echar = 0; return c; } } else { // if any other char, cannot combine chars schar = c; mchar = 0; echar = 0; return c; } unicode = echar; } } } else if (0x1161 <= c && c <= 0x1175) { // mchar was input if (schar != 0 && mchar == 0) { mchar = c; } else if (schar != 0 && mchar != 0 && echar == 0) { switch (mchar) { case 0x1169: if (c == 0x1161) mchar = 0x116a; else if (c == 0x1162) mchar = 0x116b; else if (c == 0x1175) mchar = 0x116c; else { schar = 0; mchar = 0; echar = 0; return c; } break; case 0x116e: if (c == 0x1165) mchar = 0x116f; else if (c == 0x1166) mchar = 0x1170; else if (c == 0x1175) mchar = 0x1171; else { schar = 0; mchar = 0; echar = 0; return c; } break; case 0x1173: if (c == 0x1175) mchar = 0x1174; else { schar = 0; mchar = 0; echar = 0; return c; } break; default: schar = 0; mchar = 0; echar = 0; return c; } } else if (schar != 0 && mchar != 0 && echar != 0) { emit key( 8, Qt::Key_Backspace, 0, true, false ); ushort prev = 0; switch (echar) { /* case 0x11a9: prev = combineKoreanChars(schar, mchar, 0x11a8); schar = 0x1100; break; */ case 0x11aa: prev = combineKoreanChars(schar, mchar, 0x11a8); schar = 0x1109; break; case 0x11ac: prev = combineKoreanChars(schar, mchar, 0x11ab); schar = 0x110c; break; case 0x11ad: prev = combineKoreanChars(schar, mchar, 0x11ab); schar = 0x1112; break; case 0x11b0: prev = combineKoreanChars(schar, mchar, 0x11af); schar = 0x1100; break; case 0x11b1: prev = combineKoreanChars(schar, mchar, 0x11af); schar = 0x1106; break; case 0x11b2: prev = combineKoreanChars(schar, mchar, 0x11af); schar = 0x1107; break; case 0x11b3: prev = combineKoreanChars(schar, mchar, 0x11af); schar = 0x1109; break; case 0x11b4: prev = combineKoreanChars(schar, mchar, 0x11af); schar = 0x1110; break; case 0x11b9: prev = combineKoreanChars(schar, mchar, 0x11b8); schar = 0x1109; break; /* case 0x11bb: prev = combineKoreanChars(schar, mchar, 0x11ba); schar = 0x1109; break; */ default: if (constoe(echar)) { prev = combineKoreanChars(schar, mchar, 0); schar = constoe(echar); } break; } emit key( prev, prev, 0, true, false ); mchar = c; echar = 0; return combineKoreanChars(schar, mchar, 0); } else { schar = 0; mchar = 0; echar = 0; return c; } } else /*if (c == ' ')*/ return c; // and now... finally delete previous char, and return new char emit key( 8, Qt::Key_Backspace, 0, true, false ); return combineKoreanChars( schar, mchar, echar); } ushort Keyboard::combineKoreanChars(const ushort s, const ushort m, const ushort e) { return ((s - 0x1100) * 588) + ((m - 0x1161) * 28) + (e ? e - 0x11a7 : 0) + 0xac00; } ushort Keyboard::constoe(const ushort c) { // converts schars to echars if possible if (0x1100 <= c && c <= 0x1112) { // schar to echar switch (c) { case 0x1100: return 0x11a8; case 0x1101: return 0x11a9; case 0x1102: return 0x11ab; case 0x1103: return 0x11ae; case 0x1105: return 0x11af; case 0x1106: return 0x11b7; case 0x1107: return 0x11b8; case 0x1109: return 0x11ba; case 0x110a: return 0x11bb; case 0x110b: return 0x11bc; case 0x110c: return 0x11bd; case 0x110e: return 0x11be; case 0x110f: return 0x11bf; case 0x1110: return 0x11c0; case 0x1111: return 0x11c1; case 0x1112: return 0x11c2; default: return 0; } } else { //echar to schar switch (c) { case 0x11a8: return 0x1100; case 0x11a9: return 0x1101; case 0x11ab: return 0x1102; case 0x11ae: return 0x1103; case 0x11af: return 0x1105; case 0x11b7: return 0x1106; case 0x11b8: return 0x1107; case 0x11ba: return 0x1109; case 0x11bb: return 0x110a; case 0x11bc: return 0x110b; case 0x11bd: return 0x110c; case 0x11be: return 0x110e; case 0x11bf: return 0x110f; case 0x11c0: return 0x1110; case 0x11c1: return 0x1111; case 0x11c2: return 0x1112; default: return 0; } } } // Keys::Keys {{{1 Keys::Keys() { Config *config = new Config ("multikey"); config->setGroup( "keymaps" ); QString key_map = config->readEntry( "current" ); delete config; if (key_map.isNull()) { Config *config = new Config("locale"); config->setGroup( "Language" ); QString l = config->readEntry( "Language" , "en" ); delete config; key_map = QPEApplication::qpeDir() + "/share/multikey/" + l + ".keymap"; } setKeysFromFile(key_map); } Keys::Keys(const char * filename) { setKeysFromFile(filename); } // Keys::setKeysFromFile {{{2 void Keys::setKeysFromFile(const char * filename) { QFile f(filename); if (f.open(IO_ReadOnly)) { QTextStream t(&f); int row; int qcode; ushort unicode; int width; QString buf; QString comment; char * xpm[256]; //couldnt be larger than that... could it? QPixmap *xpm2pix = 0; buf = t.readLine(); while (buf) { // key definition if (buf.contains(QRegExp("^\\d+\\s+[0-1a-fx]+", FALSE, FALSE))) { // no $1 type referencing!!! this implementation of regexp sucks // dont know of any sscanf() type funcs in Qt lib QTextStream tmp (buf, IO_ReadOnly); tmp >> row >> qcode >> unicode >> width >> comment; buf = t.readLine(); int xpmLineCount = 0; xpm2pix = 0; // erase blank space while (buf.contains(QRegExp("^\\s*$")) && buf) buf = t.readLine(); while (buf.contains(QRegExp("^\\s*\".*\""))) { QString xpmBuf = buf.stripWhiteSpace(); xpm[xpmLineCount] = new char [xpmBuf.length()]; int j = 0; for (ushort i = 0; i < xpmBuf.length(); i++) { if (xpmBuf[i].latin1() != '"') { ((char *)xpm[xpmLineCount])[j] = xpmBuf.at(i).latin1(); j++; } } // have to close that facker up ((char *)xpm[xpmLineCount])[j] = '\0'; xpmLineCount++; buf = t.readLine(); } if (xpmLineCount) { xpm2pix = new QPixmap((const char **)xpm); for (int i = 0; i < xpmLineCount; i++) delete [] (xpm[i]); } setKey(row, qcode, unicode, width, xpm2pix); } // shift map else if (buf.contains(QRegExp("^[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) { QTextStream tmp (buf, IO_ReadOnly); ushort lower, shift; tmp >> lower >> shift; shiftMap.insert(lower, shift); buf = t.readLine(); } // other variables like lang & title else if (buf.contains(QRegExp("^\\s*[a-zA-Z]+\\s*=\\s*[a-zA-Z0-9/]+\\s*$", FALSE, FALSE))) { QTextStream tmp (buf, IO_ReadOnly); QString name, equals, value; tmp >> name >> equals >> value; if (name == "lang") { lang = value; } buf = t.readLine(); } // comments else if (buf.contains(QRegExp("^\\s*#"))) { buf = t.readLine(); } else { // blank line, or garbage buf = t.readLine(); } } f.close(); } } // Keys::setKey {{{2 void Keys::setKey(const int row, const int qcode, const ushort unicode, const int width, QPixmap *pix) { Key * key; key = new Key; key->qcode = qcode; key->unicode = unicode; key->width = width; // share key->pressed between same keys bool found = 0; for (int i = 1; i <= 5; i++) { for (unsigned int j = 0; j < keys[i].count(); j++) if (keys[i].at(j)->qcode == qcode && keys[i].at(j)->unicode == unicode) { key->pressed = keys[i].at(j)->pressed; found = 1; } } if (!found) { key->pressed = new bool; *(key->pressed) = 0; } key->pix = pix; keys[row].append(key); } + +// Keys::~Keys {{{2 +Keys::~Keys() { + + for (int i = 1; i <= 5; i++) + for (unsigned int j = 0; j < keys[i].count(); j++) + delete keys[i].at(j); + +} + // Keys:: other functions {{{2 int Keys::width(const int row, const int col) { return keys[row].at(col)->width; } ushort Keys::uni(const int row, const int col) { return keys[row].at(col)->unicode; } int Keys::qcode(const int row, const int col) { return keys[row].at(col)->qcode; } QPixmap *Keys::pix(const int row, const int col) { return keys[row].at(col)->pix; } bool Keys::pressed(const int row, const int col) { return *(keys[row].at(col)->pressed); } int Keys::numKeys(const int row) { return keys[row].count(); } void Keys::setPressed(const int row, const int col, const bool pressed) { *(keys[row].at(col)->pressed) = pressed; } ushort Keys::shift(const ushort uni) { if (shiftMap[uni]) { return shiftMap[uni]; } else return 0; } bool *Keys::pressedPtr(const int row, const int col) { return keys[row].at(col)->pressed; } diff --git a/inputmethods/multikey/keyboard.h b/inputmethods/multikey/keyboard.h index 8ca50ea..400edc0 100644 --- a/inputmethods/multikey/keyboard.h +++ b/inputmethods/multikey/keyboard.h @@ -1,157 +1,158 @@ /********************************************************************** ** Copyright (C) 2000 Trolltech AS. All rights reserved. ** ** This file is part of Qtopia Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #include <qframe.h> #include <qmap.h> #include "../pickboard/pickboardcfg.h" #include "../pickboard/pickboardpicks.h" #include "configdlg.h" class QTimer; class KeyboardConfig : public DictFilterConfig { public: KeyboardConfig(PickboardPicks* p) : DictFilterConfig(p), backspaces(0) { nrows = 1; } virtual void generateText(const QString &s); void decBackspaces() { if (backspaces) backspaces--; } void incBackspaces() { backspaces++; } void resetBackspaces() { backspaces = 0; } private: int backspaces; }; class KeyboardPicks : public PickboardPicks { Q_OBJECT public: KeyboardPicks(QWidget* parent=0, const char* name=0, WFlags f=0) : PickboardPicks(parent, name, f) { } void initialise(); virtual QSize sizeHint() const; KeyboardConfig *dc; }; class Keys { public: Keys(); Keys(const char * filename); + ~Keys(); ushort uni(const int row, const int col); int qcode(const int row, const int col); int width(const int row, const int col); bool pressed(const int row, const int col); bool *pressedPtr(const int row, const int col); ushort shift(const ushort); QPixmap *pix(const int row, const int col); int numKeys(const int row); void setKeysFromFile(const char *filename); void setKey(const int row, const int qcode, const ushort unicode, const int width, QPixmap *pix); void setPressed(const int row, const int col, const bool pressed); QString lang; QString title; private: typedef struct Key { int qcode; // are qt key codes just unicode values? ushort unicode; int width; // not pixels but relative key width. normal key is 2 // only needed for keys like ctrl that can have multiple keys pressed at once bool *pressed; QPixmap *pix; }; QList<Key> keys[6]; QMap<ushort,ushort> shiftMap; }; class Keyboard : public QFrame { Q_OBJECT public: Keyboard( QWidget* parent=0, const char* name=0, WFlags f=0 ); ~Keyboard(); void resetState(); void mousePressEvent(QMouseEvent*); void mouseReleaseEvent(QMouseEvent*); void resizeEvent(QResizeEvent*); void paintEvent(QPaintEvent* e); //void timerEvent(QTimerEvent* e); void drawKeyboard( QPainter &p, int row = -1, int col = -1); QSize sizeHint() const; signals: void key( ushort scancode, ushort unicode, ushort modifiers, bool, bool ); private slots: void repeat(); void togglePickboard(bool on_off); void setMapToDefault(); void setMapToFile(QString file); private: int getKey( int &w, int j = -1 ); void clearHighlight(); bool *shift; bool *lock; bool *ctrl; bool *alt; uint useLargeKeys:1; uint usePicks:1; int pressedKeyRow; int pressedKeyCol; KeyboardPicks *picks; int keyHeight; int defaultKeyWidth; int xoffs; int unicode; int qkeycode; int modifiers; int pressTid; bool pressed; Keys *keys; /* for korean input */ ushort schar, mchar, echar; ushort parseKoreanInput(ushort c); ushort combineKoreanChars(const ushort s, const ushort m, const ushort e); ushort constoe(const ushort c); QTimer *repeatTimer; ConfigDlg *configdlg; }; |