diff options
author | Marko Kenttala <ext-marko.r.kenttala@nokia.com> | 2012-04-20 13:14:23 (GMT) |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-05-04 13:10:46 (GMT) |
commit | 6e5d6d292ba6bcd686367077228b17d02160bee9 (patch) | |
tree | cdd47f86a8fd92614c334125457586c5a34dcf56 | |
parent | 46048bd1c8e3a6b9e50f6f37bfd7a454b17f9c65 (diff) | |
download | Qt-6e5d6d292ba6bcd686367077228b17d02160bee9.zip Qt-6e5d6d292ba6bcd686367077228b17d02160bee9.tar.gz Qt-6e5d6d292ba6bcd686367077228b17d02160bee9.tar.bz2 |
Fix for clipped Vietnamese characters when typed with VKB
Adding tone marks with VKB to Vietnamese vowels caused them to be
clipped from top.
Added character conversion to Symbian VKB handling so that correct
characters without clipping are used.
Task-Number: ou1cimx1#981433
Change-Id: Iaf9f2ce9f5cf42e74cac100658025eb6e20e6487
Reviewed-by: Juha Kukkonen <ext-juha.kukkonen@nokia.com>
Reviewed-by: Pasi Pentikäinen <ext-pasi.a.pentikainen@nokia.com>
-rw-r--r-- | src/gui/inputmethod/qcoefepinputcontext_p.h | 1 | ||||
-rw-r--r-- | src/gui/inputmethod/qcoefepinputcontext_s60.cpp | 108 |
2 files changed, 109 insertions, 0 deletions
diff --git a/src/gui/inputmethod/qcoefepinputcontext_p.h b/src/gui/inputmethod/qcoefepinputcontext_p.h index 4b36da3..1b62a25 100644 --- a/src/gui/inputmethod/qcoefepinputcontext_p.h +++ b/src/gui/inputmethod/qcoefepinputcontext_p.h @@ -132,6 +132,7 @@ private: void commitTemporaryPreeditString(); bool isWidgetVisible(QWidget *widget, int offset = 0); bool isPartialKeyboardSupported(); + bool vietCharConversion(const QEvent *event); private Q_SLOTS: void ensureInputCapabilitiesChanged(); diff --git a/src/gui/inputmethod/qcoefepinputcontext_s60.cpp b/src/gui/inputmethod/qcoefepinputcontext_s60.cpp index 44a54a3..5ced556 100644 --- a/src/gui/inputmethod/qcoefepinputcontext_s60.cpp +++ b/src/gui/inputmethod/qcoefepinputcontext_s60.cpp @@ -101,6 +101,49 @@ _LIT(KAvkonResourceFile, "z:\\resource\\avkon.rsc" ); +// Vietnamese tone tables +const int VietToneMarks = 5; + +const QChar VietToneList[VietToneMarks] = { + 0x0301, 0x0300, 0x0309, 0x0303, 0x0323 +}; + +const QChar VietVowelList[] = { + 0x0041, 0x0061, 0x0102, 0x0103, 0x00c2, + 0x00e2, 0x0045, 0x0065, 0x00ca, 0x00ea, + 0x0049, 0x0069, 0x004f, 0x006f, 0x00d4, + 0x00f4, 0x01a0, 0x01a1, 0x0055, 0x0075, + 0x01af, 0x01b0, 0x0059, 0x0079 +}; + +const QChar VietToneMatrix[][VietToneMarks] = { + // Matrix for each vowel (row) after applying certain tone mark (column) + 0x00c1, 0x00c0, 0x1ea2, 0x00c3, 0x1ea0, + 0x00e1, 0x00e0, 0x1ea3, 0x00e3, 0x1ea1, + 0x1eae, 0x1eb0, 0x1eb2, 0x1eb4, 0x1eb6, + 0x1eaf, 0x1eb1, 0x1eb3, 0x1eb5, 0x1eb7, + 0x1ea4, 0x1ea6, 0x1ea8, 0x1eaa, 0x1eac, + 0x1ea5, 0x1ea7, 0x1ea9, 0x1eab, 0x1ead, + 0x00c9, 0x00c8, 0x1eba, 0x1ebc, 0x1eb8, + 0x00e9, 0x00e8, 0x1ebb, 0x1ebd, 0x1eb9, + 0x1ebe, 0x1ec0, 0x1ec2, 0x1ec4, 0x1ec6, + 0x1ebf, 0x1ec1, 0x1ec3, 0x1ec5, 0x1ec7, + 0x00cd, 0x00cc, 0x1ec8, 0x0128, 0x1eca, + 0x00ed, 0x00ec, 0x1ec9, 0x0129, 0x1ecb, + 0x00d3, 0x00d2, 0x1ece, 0x00d5, 0x1ecc, + 0x00f3, 0x00f2, 0x1ecf, 0x00f5, 0x1ecd, + 0x1ed0, 0x1ed2, 0x1ed4, 0x1ed6, 0x1ed8, + 0x1ed1, 0x1ed3, 0x1ed5, 0x1ed7, 0x1ed9, + 0x1eda, 0x1edc, 0x1ede, 0x1ee0, 0x1ee2, + 0x1edb, 0x1edd, 0x1edf, 0x1ee1, 0x1ee3, + 0x00da, 0x00d9, 0x1ee6, 0x0168, 0x1ee4, + 0x00fa, 0x00f9, 0x1ee7, 0x0169, 0x1ee5, + 0x1ee8, 0x1eea, 0x1eec, 0x1eee, 0x1ef0, + 0x1ee9, 0x1eeb, 0x1eed, 0x1eef, 0x1ef1, + 0x00dd, 0x1ef2, 0x1ef6, 0x1ef8, 0x1ef4, + 0x00fd, 0x1ef3, 0x1ef7, 0x1ef9, 0x1ef5 +}; + QT_BEGIN_NAMESPACE static QWidget* getFocusedChild(const QList<QObject*>& objectList) @@ -572,11 +615,76 @@ bool QCoeFepInputContext::needsInputPanel() } } +bool QCoeFepInputContext::vietCharConversion(const QEvent *event) +{ + const QKeyEvent *keyEvent = static_cast<const QKeyEvent *>(event); + const uint VietVowelListCount = sizeof(VietVowelList)/sizeof(VietVowelList[0]); + for (int tone = 0; tone < VietToneMarks; tone++) { + if (keyEvent->key() == VietToneList[tone]) { + // Vietnamese vowel tone mark pressed, check previous character + const int cursor = focusWidget()->inputMethodQuery(Qt::ImCursorPosition).toInt(); + if (cursor > 0) { + QString widgetText = focusWidget()->inputMethodQuery(Qt::ImSurroundingText).toString(); + for (int vowel = 0; vowel < VietVowelListCount; vowel++) { + if (widgetText[cursor-1].unicode() == VietVowelList[vowel]) { + // Previous character is Vietnamese vowel, replace it from matrix + QList<QInputMethodEvent::Attribute> attributes; + if (event->type() == QEvent::KeyPress) { + QInputMethodEvent imEvent(QString(VietToneMatrix[vowel][tone]), attributes); + sendEvent(imEvent); + } else { + // event->type() == QEvent::KeyRelease + QInputMethodEvent imEvent(QLatin1String(""), attributes); + imEvent.setCommitString(QString(VietToneMatrix[vowel][tone]), -1, 1); + sendEvent(imEvent); + } + return true; + } + } + } + return false; + } + } + if (keyEvent->key() == Qt::Key_Backspace) { + // Backspace pressed, check previous character + const int cursor = focusWidget()->inputMethodQuery(Qt::ImCursorPosition).toInt(); + if (cursor > 0) { + QString widgetText = focusWidget()->inputMethodQuery(Qt::ImSurroundingText).toString(); + for (int vowel = 0; vowel < VietVowelListCount; vowel++) { + for (int tone = 0; tone < VietToneMarks; tone++) { + if (widgetText[cursor-1].unicode() == VietToneMatrix[vowel][tone]) { + // Previous character is Vietnamese vowel with tone, replace it with plain vowel + QList<QInputMethodEvent::Attribute> attributes; + if (event->type() == QEvent::KeyPress) { + QInputMethodEvent imEvent(QString(VietVowelList[vowel]), attributes); + sendEvent(imEvent); + } else { + // event->type() == QEvent::KeyRelease + QInputMethodEvent imEvent(QLatin1String(""), attributes); + imEvent.setCommitString(QString(VietVowelList[vowel]), -1, 1); + sendEvent(imEvent); + } + return true; + } + } + } + } + } + return false; +} + bool QCoeFepInputContext::filterEvent(const QEvent *event) { if (!focusWidget()) return false; + if ((event->type() == QEvent::KeyPress || event->type() == QEvent::KeyRelease) && + QApplication::keyboardInputLocale().language() == QLocale::Vietnamese) { + // Vietnamese character conversions + if (vietCharConversion(event)) + return true; + } + switch (event->type()) { case QEvent::KeyPress: commitTemporaryPreeditString(); |