Diffstat (limited to 'inputmethods/multikey/keyboard.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | inputmethods/multikey/keyboard.cpp | 148 |
1 files changed, 147 insertions, 1 deletions
diff --git a/inputmethods/multikey/keyboard.cpp b/inputmethods/multikey/keyboard.cpp index 28d5cab..1dd8ca1 100644 --- a/inputmethods/multikey/keyboard.cpp +++ b/inputmethods/multikey/keyboard.cpp @@ -32,25 +32,25 @@ #include <qpe/config.h> #include <ctype.h> #include <qfile.h> #include <qtextstream.h> #include <qstringlist.h> #include <sys/utsname.h> /* Keyboard::Keyboard {{{1 */ Keyboard::Keyboard(QWidget* parent, const char* _name, WFlags f) : QFrame(parent, _name, f), shift(0), lock(0), ctrl(0), alt(0), - meta(0), circumflex(0), diaeresis(0), + meta(0), circumflex(0), diaeresis(0), baccent(0), accent(0), useLargeKeys(TRUE), usePicks(0), useRepeat(0), pressedKeyRow(-1), pressedKeyCol(-1), unicode(-1), qkeycode(0), modifiers(0), schar(0), mchar(0), echar(0), configdlg(0) { // get the default font Config *config = new Config( "qpe" ); config->setGroup( "Appearance" ); QString familyStr = config->readEntry( "FontFamily", "fixed" ); delete config; @@ -181,33 +181,41 @@ void Keyboard::drawKeyboard(QPainter &p, int row, int col) QImage *pix = keys->pix(row,col); ushort c = keys->uni(row, col); p.setPen(textcolor); if (!pix) { if ((shift || lock) && keys->shift(c)) if (circumflex && keys->circumflex(keys->shift(c))) c = keys->circumflex(keys->shift(c)); else if (diaeresis && keys->diaeresis(keys->shift(c))) c = keys->diaeresis(keys->shift(c)); + else if (baccent && keys->baccent(keys->shift(c))) + c = keys->baccent(keys->shift(c)); + else if (accent && keys->accent(keys->shift(c))) + c = keys->accent(keys->shift(c)); else if (meta && keys->meta(keys->shift(c))) c = keys->meta(keys->shift(c)); else c = keys->shift(c); else if (meta && keys->meta(c)) c = keys->meta(c); else if (circumflex && keys->circumflex(c)) c = keys->circumflex(c); + else if (baccent && keys->baccent(c)) + c = keys->baccent(c); + else if (accent && keys->accent(c)) + c = keys->accent(c); else if (diaeresis && (keys->diaeresis(c) || c == 0x2c6)) { // the diaeresis key itself has to be in the diaeresisMap, // or just do this to make it display the diaeresis char. if (c == 0x2c6) c = 0xa8; else c = keys->diaeresis(c); } p.drawText(x, y, @@ -251,33 +259,41 @@ void Keyboard::drawKeyboard(QPainter &p, int row, int col) keyHeight - 1, keycolor_pressed); ushort c = keys->uni(row, col); p.setPen(textcolor); if (!pix) { if ((shift || lock) && keys->shift(c)) if (circumflex && keys->circumflex(keys->shift(c))) c = keys->circumflex(keys->shift(c)); else if (diaeresis && keys->diaeresis(keys->shift(c))) c = keys->diaeresis(keys->shift(c)); + else if (baccent && keys->baccent(keys->shift(c))) + c = keys->baccent(keys->shift(c)); + else if (accent && keys->accent(keys->shift(c))) + c = keys->accent(keys->shift(c)); else if (meta && keys->meta(keys->shift(c))) c = keys->meta(keys->shift(c)); else c = keys->shift(c); else if (meta && keys->meta(c)) c = keys->meta(c); else if (circumflex && keys->circumflex(c)) c = keys->circumflex(c); + else if (baccent && keys->baccent(c)) + c = keys->baccent(c); + else if (accent && keys->accent(c)) + c = keys->accent(c); else if (diaeresis && (keys->diaeresis(c) || c == 0x2c6)) { if (c == 0x2c6) c = 0xa8; else c = keys->diaeresis(c); } p.drawText(x, y, keyWidthPix + 3, keyHeight, AlignCenter, (QChar)c); } @@ -337,24 +353,59 @@ void Keyboard::mousePressEvent(QMouseEvent *e) if (shift || lock) { // diaeresis qkeycode = 0x2001; } else { // circumflex qkeycode = 0x2000; } } + // Back accent character support + + if (unicode == 0x60) { + + unicode = 0; + if (shift || lock) { + + // circumblex + qkeycode = 0x2000; + } + else { + + // back accent + qkeycode = 0x2002; + } + } + + // Accent character support + + if (unicode == 0xb4) { + + unicode = 0; + if (shift || lock) { + + // diaeresis + qkeycode = 0x2001; + } + else { + + // accent + qkeycode = 0x2003; + } + } + + if (unicode == 0) { // either Qt char, or nothing if (qkeycode == Qt::Key_F1) { // toggle the pickboard if ( configdlg ) { delete (ConfigDlg *) configdlg; configdlg = 0; } else { configdlg = new ConfigDlg (); connect(configdlg, SIGNAL(setMapToDefault()), @@ -463,24 +514,26 @@ void Keyboard::mousePressEvent(QMouseEvent *e) } else { meta = keys->pressedPtr(row, col); *meta = true; } // reset all the other keys if (shift) { *shift = 0; shift = 0; } if (lock) { *lock = 0; lock = 0; } if (circumflex) { *circumflex = 0; circumflex = 0; } if (diaeresis) { *diaeresis = 0; diaeresis = 0; } + if (baccent) { *baccent = 0; baccent = 0; } + if (accent) { *accent = 0; accent = 0; } // dont need to emit this key... acts same as alt qkeycode = 0; // circumflex } else if (qkeycode == 0x2000) { need_repaint = TRUE; if (circumflex) { *circumflex = 0; circumflex = 0; @@ -542,52 +595,106 @@ void Keyboard::mousePressEvent(QMouseEvent *e) if (meta) { *meta = 0; meta = 0; } if (circumflex) { // *circumflex = 0; // // same thing the diaeresis pointer points too circumflex = 0; } qkeycode = 0; + + // Back accent + } else if (qkeycode == 0x2002) { + need_repaint = TRUE; + + if (baccent) { + + *baccent = 0; + baccent = 0; + + } else { + + baccent = keys->pressedPtr(row, col); + *baccent = true; + } + + + if (shift) { *shift = 0; shift = 0; } + if (meta) { *meta = 0; meta = 0; } + if (accent) { *accent = 0; accent = 0; } + + qkeycode = 0; + + // Accent + } else if (qkeycode == 0x2003) { + need_repaint = TRUE; + + if (accent) { + + *accent = 0; + accent = 0; + + } else { + + accent = keys->pressedPtr(row, col); + *accent = true; + } + + + if (shift) { *shift = 0; shift = 0; } + if (meta) { *meta = 0; meta = 0; } + if (baccent) { *baccent = 0; } + + qkeycode = 0; } } else { // normal char if ((shift || lock) && keys->shift(unicode)) { // make diaeresis/circumflex -> shift input shifted // diaeresis/circumflex chars if (circumflex && keys->circumflex(keys->shift(unicode))) unicode = keys->circumflex(keys->shift(unicode)); else if (diaeresis && keys->diaeresis(keys->shift(unicode))) unicode = keys->diaeresis(keys->shift(unicode)); + else if (baccent && keys->baccent(keys->shift(unicode))) + unicode = keys->baccent(keys->shift(unicode)); + else if (accent && keys->accent(keys->shift(unicode))) + unicode = keys->accent(keys->shift(unicode)); else if (meta && keys->meta(keys->shift(unicode))) unicode = keys->meta(keys->shift(unicode)); else unicode = keys->shift(unicode); } else if (meta && keys->meta(unicode)) { unicode = keys->meta(unicode); } else if (circumflex && keys->circumflex(unicode)) { unicode = keys->circumflex(unicode); } else if (diaeresis && keys->diaeresis(unicode)) { unicode = keys->diaeresis(unicode); } + else if (baccent && keys->baccent(unicode)) { + unicode = keys->baccent(unicode); + } + else if (accent && keys->accent(unicode)) { + unicode = keys->accent(unicode); + } } // korean parsing if (keys->lang == "ko") { unicode = parseKoreanInput(unicode); } modifiers = (ctrl ? Qt::ControlButton : 0) | (alt ? Qt::AltButton : 0); if ('A' <= unicode && unicode <= 'z' && modifiers) { @@ -724,24 +831,26 @@ QSize Keyboard::sizeHint() const return QSize( 240, keyHeight * keys->rows() + (usePicks ? picks->sizeHint().height() : 0) + 1); } void Keyboard::resetState() { if (shift) { *shift = 0; shift = 0; } if (lock) {*lock = 0; lock = 0; } if (meta) { *meta = 0; meta = 0; } if (circumflex) { *circumflex = 0; circumflex = 0; } if (diaeresis) { *diaeresis = 0; diaeresis = 0; } + if (baccent) { *baccent = 0; baccent = 0; } + if (accent) { *accent = 0; accent = 0; } schar = mchar = echar = 0; picks->resetState(); } /* Keyboard::togglePickboard {{{1 */ void Keyboard::togglePickboard(bool on_off) { usePicks = on_off; if (usePicks) { picks->show(); //move(x(), y() - picks->height()); // not required anymore because QCopChannel::send @@ -1331,24 +1440,49 @@ void Keys::setKeysFromFile(const char * filename) { // diaeresis else if (buf.contains(QRegExp("^\\s*d\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) { QTextStream tmp (buf, IO_ReadOnly); ushort lower, shift; QChar d; tmp >> d >> lower >> shift; diaeresisMap.insert(lower, shift); buf = t.readLine(); } + // back accent + else if (buf.contains(QRegExp("^\\s*b\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) { + + QTextStream tmp (buf, IO_ReadOnly); + ushort lower, shift; + QChar d; + tmp >> d >> lower >> shift; + + baccentMap.insert(lower, shift); + + qDebug ("Estoy añadiendo %i con %i", lower, shift); + buf = t.readLine(); + } + // accent + else if (buf.contains(QRegExp("^\\s*a\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) { + + QTextStream tmp (buf, IO_ReadOnly); + ushort lower, shift; + QChar d; + tmp >> d >> lower >> shift; + + accentMap.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; @@ -1480,16 +1614,28 @@ ushort Keys::meta(const ushort uni) { ushort Keys::circumflex(const ushort uni) { if (circumflexMap[uni]) return circumflexMap[uni]; else return 0; } ushort Keys::diaeresis(const ushort uni) { if(diaeresisMap[uni]) return diaeresisMap[uni]; else return 0; } +ushort Keys::baccent(const ushort uni) { + + if(baccentMap[uni]) return baccentMap[uni]; + else return 0; +} + +ushort Keys::accent(const ushort uni) { + + if(accentMap[uni]) return accentMap[uni]; + else return 0; +} + bool *Keys::pressedPtr(const int row, const int col) { return keys[row].at(col)->pressed; } |