aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.qmake.conf2
-rw-r--r--dist/changes-5.10.056
-rw-r--r--src/config.pri14
-rw-r--r--src/virtualkeyboard/3rdparty/openwnn/wnnEngine/composingtext.cpp4
-rw-r--r--src/virtualkeyboard/3rdparty/t9write/t9write-build.pri86
-rw-r--r--src/virtualkeyboard/3rdparty/t9write/t9write.pro13
-rw-r--r--src/virtualkeyboard/3rdparty/t9write/unpack.py274
-rw-r--r--src/virtualkeyboard/content/components/BaseKey.qml2
-rw-r--r--src/virtualkeyboard/content/components/CharacterPreviewBubble.qml2
-rw-r--r--src/virtualkeyboard/content/components/HandwritingModeKey.qml2
-rw-r--r--src/virtualkeyboard/content/components/InputModeKey.qml122
-rw-r--r--src/virtualkeyboard/content/components/Key.qml2
-rw-r--r--src/virtualkeyboard/content/components/Keyboard.qml76
-rw-r--r--src/virtualkeyboard/content/components/SelectionControl.qml4
-rw-r--r--src/virtualkeyboard/content/content.qrc1
-rw-r--r--src/virtualkeyboard/content/layouts/ar_AR/handwriting.qml116
-rw-r--r--src/virtualkeyboard/content/layouts/ar_AR/main.qml12
-rw-r--r--src/virtualkeyboard/content/layouts/bg_BG/handwriting.qml99
-rw-r--r--src/virtualkeyboard/content/layouts/bg_BG/main.qml370
-rw-r--r--src/virtualkeyboard/content/layouts/bg_BG/symbols.qml376
-rw-r--r--src/virtualkeyboard/content/layouts/cs_CZ/handwriting.qml97
-rw-r--r--src/virtualkeyboard/content/layouts/cs_CZ/main.qml207
-rw-r--r--src/virtualkeyboard/content/layouts/cs_CZ/symbols.qml376
-rw-r--r--src/virtualkeyboard/content/layouts/da_DK/handwriting.qml13
-rw-r--r--src/virtualkeyboard/content/layouts/de_DE/handwriting.qml13
-rw-r--r--src/virtualkeyboard/content/layouts/el_GR/handwriting.qml99
-rw-r--r--src/virtualkeyboard/content/layouts/el_GR/main.qml364
-rw-r--r--src/virtualkeyboard/content/layouts/el_GR/symbols.qml376
-rw-r--r--src/virtualkeyboard/content/layouts/en_GB/handwriting.qml13
-rw-r--r--src/virtualkeyboard/content/layouts/es_ES/handwriting.qml13
-rw-r--r--src/virtualkeyboard/content/layouts/et_EE/handwriting.qml97
-rw-r--r--src/virtualkeyboard/content/layouts/et_EE/main.qml215
-rw-r--r--src/virtualkeyboard/content/layouts/et_EE/symbols.qml376
-rw-r--r--src/virtualkeyboard/content/layouts/fa_FA/handwriting.qml116
-rw-r--r--src/virtualkeyboard/content/layouts/fa_FA/main.qml10
-rw-r--r--src/virtualkeyboard/content/layouts/fi_FI/handwriting.qml13
-rw-r--r--src/virtualkeyboard/content/layouts/fr_FR/handwriting.qml13
-rw-r--r--src/virtualkeyboard/content/layouts/he_IL/handwriting.qml99
-rw-r--r--src/virtualkeyboard/content/layouts/he_IL/main.qml381
-rw-r--r--src/virtualkeyboard/content/layouts/he_IL/symbols.qml376
-rw-r--r--src/virtualkeyboard/content/layouts/hr_HR/handwriting.qml102
-rw-r--r--src/virtualkeyboard/content/layouts/hr_HR/main.qml218
-rw-r--r--src/virtualkeyboard/content/layouts/hr_HR/symbols.qml376
-rw-r--r--src/virtualkeyboard/content/layouts/hu_HU/handwriting.qml97
-rw-r--r--src/virtualkeyboard/content/layouts/hu_HU/main.qml201
-rw-r--r--src/virtualkeyboard/content/layouts/hu_HU/symbols.qml376
-rw-r--r--src/virtualkeyboard/content/layouts/it_IT/handwriting.qml13
-rw-r--r--src/virtualkeyboard/content/layouts/ja_JP/handwriting.qml99
-rw-r--r--src/virtualkeyboard/content/layouts/ja_JP/main.qml67
-rw-r--r--src/virtualkeyboard/content/layouts/ko_KR/handwriting.qml118
-rw-r--r--src/virtualkeyboard/content/layouts/ko_KR/main.qml6
-rw-r--r--src/virtualkeyboard/content/layouts/nb_NO/handwriting.qml13
-rw-r--r--src/virtualkeyboard/content/layouts/nl_NL/handwriting.qml97
-rw-r--r--src/virtualkeyboard/content/layouts/nl_NL/main.qml199
-rw-r--r--src/virtualkeyboard/content/layouts/nl_NL/symbols.qml376
-rw-r--r--src/virtualkeyboard/content/layouts/pl_PL/handwriting.qml13
-rw-r--r--src/virtualkeyboard/content/layouts/pt_PT/handwriting.qml13
-rw-r--r--src/virtualkeyboard/content/layouts/ro_RO/handwriting.qml13
-rw-r--r--src/virtualkeyboard/content/layouts/ru_RU/handwriting.qml13
-rw-r--r--src/virtualkeyboard/content/layouts/sr_SP/handwriting.qml99
-rw-r--r--src/virtualkeyboard/content/layouts/sr_SP/main.qml363
-rw-r--r--src/virtualkeyboard/content/layouts/sr_SP/symbols.qml376
-rw-r--r--src/virtualkeyboard/content/layouts/sv_SE/handwriting.qml13
-rw-r--r--src/virtualkeyboard/content/layouts/zh_CN/handwriting.qml116
-rw-r--r--src/virtualkeyboard/content/layouts/zh_CN/main.qml3
-rw-r--r--src/virtualkeyboard/content/layouts/zh_TW/handwriting.qml116
-rw-r--r--src/virtualkeyboard/content/layouts/zh_TW/main.qml26
-rw-r--r--src/virtualkeyboard/content/styles/default/style.qml60
-rw-r--r--src/virtualkeyboard/content/styles/retro/style.qml56
-rw-r--r--src/virtualkeyboard/doc/qtvirtualkeyboard.qdocconf3
-rw-r--r--src/virtualkeyboard/doc/src/build.qdoc134
-rw-r--r--src/virtualkeyboard/doc/src/qtvirtualkeyboard-examples.qdoc43
-rw-r--r--src/virtualkeyboard/doc/src/qtvirtualkeyboard-index.qdoc15
-rw-r--r--src/virtualkeyboard/gesturerecognizer.cpp39
-rw-r--r--src/virtualkeyboard/gesturerecognizer.h50
-rw-r--r--src/virtualkeyboard/handwritinggesturerecognizer.cpp204
-rw-r--r--src/virtualkeyboard/handwritinggesturerecognizer.h54
-rw-r--r--src/virtualkeyboard/hunspellinputmethod.cpp24
-rw-r--r--src/virtualkeyboard/hunspellinputmethod_p.cpp3
-rw-r--r--src/virtualkeyboard/hunspellworker.cpp3
-rw-r--r--src/virtualkeyboard/import/import.pro2
-rw-r--r--src/virtualkeyboard/inputcontext.cpp3
-rw-r--r--src/virtualkeyboard/inputengine.cpp74
-rw-r--r--src/virtualkeyboard/inputengine.h10
-rw-r--r--src/virtualkeyboard/lipiinputmethod.cpp278
-rw-r--r--src/virtualkeyboard/plaininputmethod.cpp27
-rw-r--r--src/virtualkeyboard/plugin.cpp2
-rw-r--r--src/virtualkeyboard/shifthandler.cpp16
-rw-r--r--src/virtualkeyboard/shifthandler.h1
-rw-r--r--src/virtualkeyboard/t9write.h49
-rw-r--r--src/virtualkeyboard/t9writedictionary.cpp117
-rw-r--r--src/virtualkeyboard/t9writedictionary.h67
-rw-r--r--src/virtualkeyboard/t9writeinputmethod.cpp1156
-rw-r--r--src/virtualkeyboard/t9writeinputmethod.h5
-rw-r--r--src/virtualkeyboard/t9writeworker.cpp66
-rw-r--r--src/virtualkeyboard/t9writeworker.h24
-rw-r--r--src/virtualkeyboard/unipentrace.cpp129
-rw-r--r--src/virtualkeyboard/unipentrace.h57
-rw-r--r--src/virtualkeyboard/virtualkeyboard.pro158
-rw-r--r--tests/auto/auto.pro2
-rw-r--r--tests/auto/inputpanel/BLACKLIST6
-rw-r--r--tests/auto/inputpanel/data/inputpanel/handwriting.js63
-rw-r--r--tests/auto/inputpanel/data/inputpanel/inputpanel.qml39
-rw-r--r--tests/auto/inputpanel/data/inputpanel/unipen_data.js366
-rw-r--r--tests/auto/inputpanel/data/inputpanel/unipen_data_arabic.js1665
-rw-r--r--tests/auto/inputpanel/data/inputpanel/unipen_data_cyrillic.js3440
-rw-r--r--tests/auto/inputpanel/data/inputpanel/unipen_data_greek.js2139
-rw-r--r--tests/auto/inputpanel/data/inputpanel/unipen_data_hebrew.js6985
-rw-r--r--tests/auto/inputpanel/data/inputpanel/unipen_data_japanese.js2503
-rw-r--r--tests/auto/inputpanel/data/inputpanel/unipen_data_korean.js1708
-rw-r--r--tests/auto/inputpanel/data/inputpanel/unipen_data_simp_chinese.js1851
-rw-r--r--tests/auto/inputpanel/data/inputpanel/unipen_data_trad_chinese.js1310
-rw-r--r--tests/auto/inputpanel/data/tst_inputpanel.qml58
-rw-r--r--tests/auto/inputpanel/hwr_test_data/alphanumeric/113_100_0.txt118
-rw-r--r--tests/auto/inputpanel/hwr_test_data/arabic/1575_100_0.txt28
-rw-r--r--tests/auto/inputpanel/hwr_test_data/arabic/1576_100_0.txt59
-rw-r--r--tests/auto/inputpanel/hwr_test_data/arabic/1578_100_0.txt77
-rw-r--r--tests/auto/inputpanel/hwr_test_data/arabic/1603_100_0.txt99
-rw-r--r--tests/auto/inputpanel/hwr_test_data/arabic/1670_100_0.txt60
-rw-r--r--tests/auto/inputpanel/hwr_test_data/arabic/1740_100_0.txt55
-rwxr-xr-xtests/auto/inputpanel/hwr_test_data/build_unipen_data.py66
-rw-r--r--tests/auto/inputpanel/hwr_test_data/cyrillic/1072_100_0.txt91
-rw-r--r--tests/auto/inputpanel/hwr_test_data/cyrillic/1073_100_0.txt102
-rw-r--r--tests/auto/inputpanel/hwr_test_data/cyrillic/1073_100_1.txt98
-rw-r--r--tests/auto/inputpanel/hwr_test_data/cyrillic/1075_100_0.txt60
-rw-r--r--tests/auto/inputpanel/hwr_test_data/cyrillic/1080_100_0.txt80
-rw-r--r--tests/auto/inputpanel/hwr_test_data/cyrillic/1082_100_0.txt99
-rw-r--r--tests/auto/inputpanel/hwr_test_data/cyrillic/1083_100_0.txt69
-rw-r--r--tests/auto/inputpanel/hwr_test_data/cyrillic/1088_100_0.txt97
-rw-r--r--tests/auto/inputpanel/hwr_test_data/cyrillic/1089_100_0.txt47
-rw-r--r--tests/auto/inputpanel/hwr_test_data/cyrillic/1098_100_0.txt112
-rw-r--r--tests/auto/inputpanel/hwr_test_data/greek/917_100_0.txt100
-rw-r--r--tests/auto/inputpanel/hwr_test_data/greek/940_100_0.txt77
-rw-r--r--tests/auto/inputpanel/hwr_test_data/greek/951_100_0.txt77
-rw-r--r--tests/auto/inputpanel/hwr_test_data/greek/953_100_0.txt36
-rw-r--r--tests/auto/inputpanel/hwr_test_data/greek/954_100_0.txt80
-rw-r--r--tests/auto/inputpanel/hwr_test_data/greek/955_100_0.txt64
-rw-r--r--tests/auto/inputpanel/hwr_test_data/greek/957_100_0.txt46
-rw-r--r--tests/auto/inputpanel/hwr_test_data/hebrew/1488_100_0.txt54
-rw-r--r--tests/auto/inputpanel/hwr_test_data/hebrew/1489_100_0.txt70
-rw-r--r--tests/auto/inputpanel/hwr_test_data/hebrew/1490_100_0.txt62
-rw-r--r--tests/auto/inputpanel/hwr_test_data/hebrew/1491_100_0.txt63
-rw-r--r--tests/auto/inputpanel/hwr_test_data/hebrew/1492_100_0.txt70
-rw-r--r--tests/auto/inputpanel/hwr_test_data/hebrew/1493_100_0.txt41
-rw-r--r--tests/auto/inputpanel/hwr_test_data/hebrew/1494_100_0.txt55
-rw-r--r--tests/auto/inputpanel/hwr_test_data/hebrew/1495_100_0.txt63
-rw-r--r--tests/auto/inputpanel/hwr_test_data/hebrew/1496_100_0.txt42
-rw-r--r--tests/auto/inputpanel/hwr_test_data/hebrew/1497_100_0.txt21
-rw-r--r--tests/auto/inputpanel/hwr_test_data/hebrew/1498_100_0.txt60
-rw-r--r--tests/auto/inputpanel/hwr_test_data/hebrew/1499_100_0.txt50
-rw-r--r--tests/auto/inputpanel/hwr_test_data/hebrew/1500_100_0.txt64
-rw-r--r--tests/auto/inputpanel/hwr_test_data/hebrew/1501_100_0.txt52
-rw-r--r--tests/auto/inputpanel/hwr_test_data/hebrew/1502_100_0.txt62
-rw-r--r--tests/auto/inputpanel/hwr_test_data/hebrew/1503_100_0.txt40
-rw-r--r--tests/auto/inputpanel/hwr_test_data/hebrew/1504_100_0.txt43
-rw-r--r--tests/auto/inputpanel/hwr_test_data/hebrew/1505_100_0.txt52
-rw-r--r--tests/auto/inputpanel/hwr_test_data/hebrew/1506_100_0.txt48
-rw-r--r--tests/auto/inputpanel/hwr_test_data/hebrew/1507_100_0.txt65
-rw-r--r--tests/auto/inputpanel/hwr_test_data/hebrew/1508_100_0.txt53
-rw-r--r--tests/auto/inputpanel/hwr_test_data/hebrew/1509_100_0.txt73
-rw-r--r--tests/auto/inputpanel/hwr_test_data/hebrew/1510_100_0.txt69
-rw-r--r--tests/auto/inputpanel/hwr_test_data/hebrew/1511_100_0.txt52
-rw-r--r--tests/auto/inputpanel/hwr_test_data/hebrew/1512_100_0.txt56
-rw-r--r--tests/auto/inputpanel/hwr_test_data/hebrew/1513_100_0.txt68
-rw-r--r--tests/auto/inputpanel/hwr_test_data/hebrew/1514_100_0.txt81
-rw-r--r--tests/auto/inputpanel/hwr_test_data/hebrew/8362_100_0.txt73
-rw-r--r--tests/auto/inputpanel/hwr_test_data/japanese/26085_100_0.txt94
-rw-r--r--tests/auto/inputpanel/hwr_test_data/japanese/26412_100_0.txt121
-rw-r--r--tests/auto/inputpanel/hwr_test_data/japanese/35486_100_0.txt333
-rw-r--r--tests/auto/inputpanel/hwr_test_data/korean/44397_100_0.txt121
-rw-r--r--tests/auto/inputpanel/hwr_test_data/korean/50612_100_0.txt93
-rw-r--r--tests/auto/inputpanel/hwr_test_data/korean/54620_100_0.txt159
-rw-r--r--tests/auto/inputpanel/hwr_test_data/simp_chinese/20013_100_0.txt216
-rw-r--r--tests/auto/inputpanel/hwr_test_data/simp_chinese/25991_100_0.txt172
-rw-r--r--tests/auto/inputpanel/hwr_test_data/trad_chinese/22283_100_0.txt279
175 files changed, 37482 insertions, 1091 deletions
diff --git a/.qmake.conf b/.qmake.conf
index 2108ac6f..138038d5 100644
--- a/.qmake.conf
+++ b/.qmake.conf
@@ -1,3 +1,3 @@
load(qt_build_config)
-MODULE_VERSION = 5.9.3
+MODULE_VERSION = 5.10.0
diff --git a/dist/changes-5.10.0 b/dist/changes-5.10.0
new file mode 100644
index 00000000..129c8255
--- /dev/null
+++ b/dist/changes-5.10.0
@@ -0,0 +1,56 @@
+Qt 5.10 introduces many new features and improvements as well as bugfixes
+over the 5.9.x series. For more details, refer to the online documentation
+included in this distribution. The documentation is also available online:
+
+http://doc.qt.io/qt-5/index.html
+
+The Qt version 5.10 series is binary compatible with the 5.9.x series.
+Applications compiled for 5.9 will continue to run with 5.10.
+
+Some of the changes listed in this file include issue tracking numbers
+corresponding to tasks in the Qt Bug Tracker:
+
+https://bugreports.qt.io/
+
+Each of these identifiers can be entered in the bug tracker to obtain more
+information about a particular change.
+
+****************************************************************************
+* Qt 5.10.0 Changes *
+****************************************************************************
+
+New Features
+------------
+
+ - Added new component (InputModeKey) for input mode switch.
+
+New Keyboard Layouts
+--------------------
+
+ - Added Bulgarian keyboard layout.
+ - Added Croatian keyboard layout.
+ - Added Czech keyboard layout.
+ - Added Dutch keyboard layout.
+ - Added Estonian keyboard layout.
+ - Added Greek keyboard layout.
+ - Added Hebrew keyboard layout.
+ - Added Hungarian keyboard layout.
+ - Added Serbian keyboard layout.
+
+ Handwriting Recognition
+ -----------------------
+
+ - Added Arabic handwriting recognition.
+ - Added Farsi handwriting recognition.
+ - Added support for CJK (Chinese/Japanese/Korean) handwriting
+ via T9 Write.
+
+ Important Behavior Changes
+--------------------------
+
+ - Ensure the default value of Key.key property is uppercase.
+
+OpenWNN
+-------
+
+ - Fixed and optimized OpenWNN engine (Japanese keyboard input)
diff --git a/src/config.pri b/src/config.pri
index 11ae1c0b..21ba6842 100644
--- a/src/config.pri
+++ b/src/config.pri
@@ -4,6 +4,11 @@ handwriting:!lipi-toolkit:!t9write {
equals(T9WRITE_FOUND, 1): CONFIG += t9write
else: CONFIG += lipi-toolkit
}
+t9write {
+ !handwriting: include(virtualkeyboard/3rdparty/t9write/t9write-build.pri)
+ equals(T9WRITE_CJK_FOUND, 1): CONFIG += t9write-cjk
+ equals(T9WRITE_ALPHABETIC_FOUND, 1): CONFIG += t9write-alphabetic
+}
# Disable built-in layouts
disable-layouts {
@@ -27,22 +32,31 @@ disable-layouts {
# Flag for activating all languages
lang-all: CONFIG += \
lang-ar_AR \
+ lang-bg_BG \
+ lang-cs_CZ \
lang-da_DK \
lang-de_DE \
+ lang-el_GR \
lang-en_GB \
lang-es_ES \
+ lang-et_EE \
lang-fa_FA \
lang-fi_FI \
lang-fr_FR \
+ lang-he_IL \
lang-hi_IN \
+ lang-hr_HR \
+ lang-hu_HU \
lang-it_IT \
lang-ja_JP \
lang-ko_KR \
lang-nb_NO \
+ lang-nl_NL \
lang-pl_PL \
lang-pt_PT \
lang-ro_RO \
lang-ru_RU \
+ lang-sr_SP \
lang-sv_SE \
lang-zh_CN \
lang-zh_TW
diff --git a/src/virtualkeyboard/3rdparty/openwnn/wnnEngine/composingtext.cpp b/src/virtualkeyboard/3rdparty/openwnn/wnnEngine/composingtext.cpp
index e299c6db..82022c8e 100644
--- a/src/virtualkeyboard/3rdparty/openwnn/wnnEngine/composingtext.cpp
+++ b/src/virtualkeyboard/3rdparty/openwnn/wnnEngine/composingtext.cpp
@@ -22,7 +22,6 @@
#include "composingtext.h"
#include <QtCore/private/qobject_p.h>
-#include <QDebug>
class ComposingTextPrivate : public QObjectPrivate
{
@@ -208,14 +207,11 @@ void ComposingText::debugout() const
{
Q_D(const ComposingText);
for (int i = LAYER0; i < MAX_LAYER; i++) {
- qDebug() << QString("ComposingText[%1]").arg(i);
- qDebug() << " cur =" << d->mCursor[i];
QString tmp;
for (QList<StrSegment>::ConstIterator it = d->mStringLayer[i].constBegin();
it != d->mStringLayer[i].constEnd(); it++) {
tmp += QString("(%1,%2,%3)").arg(it->string).arg(it->from).arg(it->to);
}
- qDebug() << " str =" << tmp;
}
}
diff --git a/src/virtualkeyboard/3rdparty/t9write/t9write-build.pri b/src/virtualkeyboard/3rdparty/t9write/t9write-build.pri
index ab519b90..f810badf 100644
--- a/src/virtualkeyboard/3rdparty/t9write/t9write-build.pri
+++ b/src/virtualkeyboard/3rdparty/t9write/t9write-build.pri
@@ -1,25 +1,83 @@
#
# Automatically detects the T9Write build directory and sets the following variables:
#
-# T9WRITE_BUILD_DIR: A base directory for the architecture specific build directory
-# T9WRITE_ALPHABETIC_OBJ: Absolute path to the target object file
+# T9WRITE_FOUND: 0/1 T9Write SDK found
+# T9WRITE_BUILD_STATIC: 0/1 Static libraries found (0 == shared libraries)
+# T9WRITE_ALPHABETIC_FOUND: 0/1 T9 Write Alphabetic API header found
+# T9WRITE_CJK_FOUND: 0/1 T9 Write CJK API header found
+# T9WRITE_INCLUDE_DIRS: T9 Write include directories
+# T9WRITE_ALPHABETIC_LIBS: Absolute path to the target library file
+# T9WRITE_ALPHABETIC_BINS: Absolute path to the target binary file (shared library)
+# T9WRITE_CJK_LIBS: Absolute path to the target library file
+# T9WRITE_CJK_BINS: Absolute path to the target binary file (shared library)
#
+T9WRITE_FOUND = 0
+T9WRITE_ALPHABETIC_FOUND = 0
+T9WRITE_CJK_FOUND = 0
+T9WRITE_INCLUDE_DIRS = $$PWD/api
contains(QT_ARCH, arm) {
- T9WRITE_BUILD_DIR = $$files(build_Android_ARM*)
+ T9WRITE_BUILD_SHARED_DIR = lib/arm/shared
+ T9WRITE_BUILD_STATIC_DIR = lib/arm/static
} else:linux {
- T9WRITE_BUILD_DIR = $$files(build_Android_x86*)
+ T9WRITE_BUILD_SHARED_DIR = lib/linux-x86/shared
+ T9WRITE_BUILD_STATIC_DIR = lib/linux-x86/static
} else:win32 {
- T9WRITE_BUILD_DIR = $$files(build_VC*)
+ T9WRITE_BUILD_SHARED_DIR = lib/win32/shared
+ T9WRITE_BUILD_STATIC_DIR = lib/win32/static
}
-count(T9WRITE_BUILD_DIR, 1) {
- T9WRITE_FOUND = 1
- T9WRITE_INCLUDE_DIRS = \
- $$PWD/$$T9WRITE_BUILD_DIR/api \
- $$PWD/$$T9WRITE_BUILD_DIR/public
- T9WRITE_ALPHABETIC_LIBS = \
- $$PWD/$$files($$T9WRITE_BUILD_DIR/objects/t9write_alphabetic*.o*)
-} else {
- T9WRITE_FOUND = 0
+defineReplace(findStaticLibrary) {
+ win32 {
+ result = $$files($$1/*.obj)
+ isEmpty(result): result = $$files($$1/*.lib)
+ } else {
+ result = $$files($$1/*.o)
+ isEmpty(result): result = $$files($$1/*.a)
+ }
+ return($$result)
+}
+
+defineReplace(findSharedLibrary) {
+ win32 {
+ result = $$files($$1/*.lib)
+ } else {
+ result = $$files($$1/*.so)
+ }
+ return($$result)
+}
+
+defineReplace(findSharedBinary) {
+ win32 {
+ result = $$files($$1/*.dll)
+ } else {
+ result = $$files($$1/*.so)
+ }
+ return($$result)
+}
+
+for(include_dir, T9WRITE_INCLUDE_DIRS) {
+ exists($${include_dir}/decuma_hwr.h): T9WRITE_ALPHABETIC_FOUND = 1
+ exists($${include_dir}/decuma_hwr_cjk.h): T9WRITE_CJK_FOUND = 1
+}
+
+equals(T9WRITE_ALPHABETIC_FOUND, 1)|equals(T9WRITE_CJK_FOUND, 1) {
+ equals(T9WRITE_ALPHABETIC_FOUND, 1) {
+ T9WRITE_ALPHABETIC_LIBS = $$findSharedLibrary($$PWD/$$T9WRITE_BUILD_SHARED_DIR/alphabetic)
+ !isEmpty(T9WRITE_ALPHABETIC_LIBS) {
+ T9WRITE_ALPHABETIC_BINS = $$findSharedBinary($$PWD/$$T9WRITE_BUILD_SHARED_DIR/alphabetic)
+ } else {
+ T9WRITE_ALPHABETIC_LIBS = $$findStaticLibrary($$PWD/$$T9WRITE_BUILD_STATIC_DIR/alphabetic)
+ }
+ }
+ equals(T9WRITE_CJK_FOUND, 1) {
+ T9WRITE_CJK_LIBS = $$findSharedLibrary($$PWD/$$T9WRITE_BUILD_SHARED_DIR/cjk)
+ !isEmpty(T9WRITE_CJK_LIBS) {
+ T9WRITE_CJK_BINS = $$findSharedBinary($$PWD/$$T9WRITE_BUILD_SHARED_DIR/cjk)
+ } else {
+ T9WRITE_CJK_LIBS = $$findStaticLibrary($$PWD/$$T9WRITE_BUILD_STATIC_DIR/cjk)
+ }
+ }
+ equals(T9WRITE_ALPHABETIC_FOUND, 1):!isEmpty(T9WRITE_ALPHABETIC_LIBS): T9WRITE_FOUND = 1
+ equals(T9WRITE_CJK_FOUND, 1):!isEmpty(T9WRITE_CJK_LIBS): T9WRITE_FOUND = 1
}
diff --git a/src/virtualkeyboard/3rdparty/t9write/t9write.pro b/src/virtualkeyboard/3rdparty/t9write/t9write.pro
index 05f723a7..d64f831d 100644
--- a/src/virtualkeyboard/3rdparty/t9write/t9write.pro
+++ b/src/virtualkeyboard/3rdparty/t9write/t9write.pro
@@ -2,18 +2,21 @@ TARGET = qtt9write_db
CONFIG += static
-T9WRITE_LDBS = $$files(databases/XT9_LDBs/*.ldb)
-
T9WRITE_RESOURCE_FILES = \
- databases/HWR_LatinCG/_databas_le.bin \
- $$T9WRITE_LDBS
+ $$files(data/arabic/*.bin) \
+ $$files(data/hebrew/*.bin) \
+ $$files(data/*.bin) \
+ $$files(data/*.ldb) \
+ $$files(data/*.hdb) \
+ $$files(data/*.phd)
# Note: Compression is disabled, because the resource is accessed directly from the memory
QMAKE_RESOURCE_FLAGS += -no-compress
+CONFIG += resources_big
include(../../generateresource.pri)
-RESOURCES += $$generate_resource(t9write_db.qrc, $$T9WRITE_RESOURCE_FILES)
+RESOURCES += $$generate_resource(t9write_db.qrc, $$T9WRITE_RESOURCE_FILES, /QtQuick/VirtualKeyboard/T9Write)
load(qt_helper_lib)
diff --git a/src/virtualkeyboard/3rdparty/t9write/unpack.py b/src/virtualkeyboard/3rdparty/t9write/unpack.py
new file mode 100644
index 00000000..e6a3e7a1
--- /dev/null
+++ b/src/virtualkeyboard/3rdparty/t9write/unpack.py
@@ -0,0 +1,274 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+#############################################################################
+##
+## Copyright (C) 2017 The Qt Company Ltd.
+## Contact: https://www.qt.io/licensing/
+##
+## This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:GPL$
+## Commercial License Usage
+## Licensees holding valid commercial Qt licenses may use this file in
+## accordance with the commercial license agreement provided with the
+## Software or, alternatively, in accordance with the terms contained in
+## a written agreement between you and The Qt Company. For licensing terms
+## and conditions see https://www.qt.io/terms-conditions. For further
+## information use the contact form at https://www.qt.io/contact-us.
+##
+## GNU General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU
+## General Public License version 3 or (at your option) any later version
+## approved by the KDE Free Qt Foundation. The licenses are as published by
+## the Free Software Foundation and appearing in the file LICENSE.GPL3
+## included in the packaging of this file. Please review the following
+## information to ensure the GNU General Public License requirements will
+## be met: https://www.gnu.org/licenses/gpl-3.0.html.
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+import os
+import sys
+import zipfile
+import tempfile
+import shutil
+import fnmatch
+
+#
+# This utility script unpacks the T9 Write SDK to appropriate directory
+# structure for Qt Virtual Keyboard.
+#
+# Usage: unpack.py <filename.zip> <target dir>
+# unpack.py <input dir> <target dir>
+#
+# The script will happily overwrite existing files, so be careful.
+#
+
+#
+# Unpack rule list
+#
+# Each list entry is a dictionary consisting of target directory as
+# key and matching pattern as value. The dictionary can be defined in
+# the following ways:
+#
+# Note: The rules within the dictionary are executed in arbitrary order.
+# Add a new list entry if the order is significant.
+#
+# Format:
+# 1. { 'target dir 1': [ 'pattern1', 'pattern2', ... ], 'target dir 2': ... }
+# - Each pattern is matched against the zip file contents. The file is
+# copied to target dir if the pattern matches. Each pattern is handled
+# independent of each other.
+#
+# 2. { 'target dir 1': [ [ 'file group pattern', 'sub pattern1', ... ] ], 'target dir 2': ... }
+# - First the file group pattern is matched against the zip file contents.
+# Then all the sub patterns are matched in the sub directory specified by
+# the first match. If all the sub patterns match, then first match from
+# file group pattern and all the matching files from sub pattterns are copied.
+# The purpose of this option is to copy coupled files, e.g. DLL and LIB
+# files found in the same directory.
+#
+
+UNPACK_RULES = [
+{ # Header files
+'api': [
+ '*/decuma_hwr.h',
+ '*/decuma_hwr_cjk.h',
+ '*/decuma_hwr_types.h',
+ '*/decuma_point.h',
+ '*/decumaBasicTypes.h',
+ '*/decumaBasicTypesMinMax.h',
+ '*/decumaCharacterSetType.h',
+ '*/decumaCurve.h',
+ '*/decumaFunctionalSupport.h',
+ '*/decumaFunctionalSupportCheck.h',
+ '*/decumaLanguages.h',
+ '*/decumaLiteFunctionalSupport.h',
+ '*/decumaRuntimeMallocData.h',
+ '*/decumaStatus.h',
+ '*/decumaStorageSpecifiers.h',
+ '*/decumaSymbolCategories.h',
+ '*/decumaUnicodeTypes.h',
+ '*/t9write_alpha_version.h',
+ '*/t9write_api_version.h',
+ '*/t9write_cjk_version.h',
+ '*/xxt9wApiOem.h',
+ '*/xxt9wOem.h',
+],
+}, { # Data: Arabic and Hebrew database must be copied first (the file name collides with Alphabetic database)
+'data/arabic': [
+ '*/Arabic/*_le.bin',
+],
+'data/hebrew': [
+ '*/Hebrew/*_le.bin',
+],
+}, { # Data: Alphabetic and CJK databases
+'data': [
+ '*/*_le.bin',
+ '*/*.hdb',
+ '*/*.phd',
+ '*/*.ldb',
+],
+}, { # Libraries
+'lib/arm/static/alphabetic': [
+ '*T9Write_Alpha*/*Android_ARM*/*.a',
+ '*T9Write_Alpha*/*Android_ARM*/*.o',
+],
+'lib/arm/shared/alphabetic': [
+ '*T9Write_Alpha*/*Android_ARM*/*.so',
+],
+'lib/arm/static/cjk': [
+ '*T9Write_CJK*/*Android_ARM*/*.a',
+ '*T9Write_CJK*/*Android_ARM*/*.o',
+],
+'lib/arm/shared/cjk': [
+ '*T9Write_CJK*/*Android_ARM*/*.so',
+],
+'lib/linux/static/alphabetic': [
+ '*T9Write_Alpha*/*Android_x86*/*.a',
+ '*T9Write_Alpha*/*Android_x86*/*.o',
+],
+'lib/linux/shared/alphabetic': [
+ '*T9Write_Alpha*/*Android_x86*/*.so',
+],
+'lib/linux/static/cjk': [
+ '*T9Write_CJK*/*Android_x86*/*.a',
+ '*T9Write_CJK*/*Android_x86*/*.o',
+],
+'lib/linux/shared/cjk': [
+ '*T9Write_CJK*/*Android_x86*/*.so',
+],
+'lib/win32/static/alphabetic': [
+ '*T9Write_Alpha*/*.obj',
+],
+'lib/win32/shared/alphabetic': [
+ [ '*T9Write_Alpha*/*.dll', '*.lib' ],
+],
+'lib/win32/static/cjk': [
+ '*T9Write_CJK*/*.obj',
+],
+'lib/win32/shared/cjk': [
+ [ '*T9Write_CJK*/*.dll', '*.lib' ],
+],
+'lib/win32/shared/alphabetic': [
+ [ '*T9Write_Alpha*/*.dll', '*.lib' ],
+],
+}
+]
+
+#
+# Blacklist
+#
+# File matching rules for blacklisted items. Matched before UNPACK_RULES.
+#
+
+BLACKLIST_RULES = [
+'*__MACOSX*',
+'*/.DS_Store',
+]
+
+def blacklist(file_list):
+ result = []
+ for file_name in file_list:
+ match = False
+ for blacklist_rule in BLACKLIST_RULES:
+ match = fnmatch.fnmatch(file_name, blacklist_rule)
+ if match:
+ break
+ if not match:
+ result.append(file_name)
+ return result
+
+def unzip(zip_file, target_dir):
+ zip_list = []
+ if os.path.isdir(zip_file):
+ base_dir, sdk_dir = os.path.split(zip_file.replace('\\', '/').rstrip('/'))
+ base_dir_length = len(base_dir) + 1 if base_dir else 0
+ if not 'T9Write' in sdk_dir:
+ print("Error: The input directory name '" + sdk_dir + "' does not contain 'T9Write'.")
+ print("Please unzip the file to a directory named after the zip file and try again.")
+ return zip_list
+ for root, dirs, files in os.walk(zip_file):
+ for file_name in files:
+ sub_dir = root[base_dir_length:]
+ dst_dir = os.path.join(target_dir, sub_dir)
+ if not os.path.exists(dst_dir):
+ os.makedirs(dst_dir)
+ shutil.copy2(os.path.join(root, file_name), dst_dir)
+ os.chmod(os.path.join(dst_dir, file_name), 0o644)
+ zip_list.append(os.path.join(sub_dir, file_name).replace('\\', '/'))
+ return zip_list
+ with zipfile.ZipFile(zip_file, 'r') as z:
+ zip_list = sorted(blacklist(z.namelist()))
+ zip_basename = os.path.splitext(os.path.basename(zip_file))[0]
+ if zip_list and zip_basename in zip_list[0]:
+ zip_basename = ''
+ zip_list = [os.path.join(zip_basename, zip_name).replace('\\', '/') for zip_name in zip_list]
+ z.extractall(os.path.join(target_dir, zip_basename))
+ return zip_list
+
+def match_file_list(file_list, base_dir, fnpattern):
+ return [file_name for file_name in file_list \
+ if fnmatch.fnmatch(file_name, fnpattern) and \
+ os.path.isfile(os.path.join(base_dir, file_name))]
+
+def unpack(zip_list, zip_dir, out_dir):
+ if not zip_list:
+ return
+
+ for unpack_rules in UNPACK_RULES:
+ process_unpack_rules(zip_list, zip_dir, out_dir, unpack_rules)
+
+def process_unpack_rules(zip_list, zip_dir, out_dir, unpack_rules):
+ for (target_dir, match_rules) in unpack_rules.items():
+ for match_rule in match_rules:
+ # Match
+ match_rule_group = match_rule if isinstance(match_rule, list) else [match_rule]
+ match_group_candidates = [match_file_list(zip_list, zip_dir, match_rule_group[0])]
+ if len(match_rule_group) > 1:
+ while len(match_group_candidates[0]) > 0:
+ match_group0_candidate = match_group_candidates[0][0]
+ all_sub_groups_match = True
+ for sub_group_rule in match_rule_group[1:]:
+ fnpattern = os.path.join(os.path.dirname(match_group0_candidate), sub_group_rule).replace('\\', '/')
+ sub_group_candidates = match_file_list(zip_list, zip_dir, fnpattern)
+ if not sub_group_candidates:
+ all_sub_groups_match = False
+ break
+ match_group_candidates.append(sub_group_candidates)
+ if all_sub_groups_match:
+ match_group_candidates[0] = [match_group0_candidate]
+ break
+ else:
+ match_group_candidates = [match_group_candidates[0][1:]]
+
+ # Copy
+ if match_group_candidates:
+ for match_group_candidate in match_group_candidates:
+ for zip_name in match_group_candidate:
+ dst_dir = os.path.join(out_dir, target_dir)
+ if not os.path.exists(dst_dir):
+ os.makedirs(dst_dir)
+ src = os.path.join(zip_dir, zip_name).replace('\\', '/')
+ dst = os.path.join(dst_dir, os.path.basename(zip_name)).replace('\\', '/')
+ print(zip_name + ' -> ' + dst)
+ shutil.copy2(src, dst)
+ zip_list.remove(zip_name)
+
+if __name__ == '__main__':
+ if len(sys.argv) != 3:
+ print("Usage: %s <filename.zip> <target dir>" % os.path.basename(__file__))
+ exit()
+
+ out_dir = sys.argv[2]
+ zip_dir = tempfile.mkdtemp()
+
+ try:
+ unpack(unzip(sys.argv[1], zip_dir), zip_dir, out_dir)
+ except Exception as e:
+ print(e)
+ finally:
+ shutil.rmtree(zip_dir)
diff --git a/src/virtualkeyboard/content/components/BaseKey.qml b/src/virtualkeyboard/content/components/BaseKey.qml
index 5c686adf..ae3b530f 100644
--- a/src/virtualkeyboard/content/components/BaseKey.qml
+++ b/src/virtualkeyboard/content/components/BaseKey.qml
@@ -79,7 +79,7 @@ Item {
The default value based on the default item in the effective alternative keys.
*/
- property string smallText: effectiveAlternativeKeysHighlightIndex !== -1 ? effectiveAlternativeKeys[effectiveAlternativeKeysHighlightIndex] : ""
+ property string smallText: effectiveAlternativeKeys && effectiveAlternativeKeysHighlightIndex !== -1 ? effectiveAlternativeKeys[effectiveAlternativeKeysHighlightIndex] : ""
/*! \since QtQuick.VirtualKeyboard 2.0
diff --git a/src/virtualkeyboard/content/components/CharacterPreviewBubble.qml b/src/virtualkeyboard/content/components/CharacterPreviewBubble.qml
index 1f9a05a2..ee70e110 100644
--- a/src/virtualkeyboard/content/components/CharacterPreviewBubble.qml
+++ b/src/virtualkeyboard/content/components/CharacterPreviewBubble.qml
@@ -45,7 +45,7 @@ Item {
onActiveKeyChanged: {
if (activeKey && characterPreview.item !== null) {
- characterPreview.item.text = InputContext.uppercase ? activeKey.text.toUpperCase() : activeKey.text
+ characterPreview.item.text = InputContext.uppercase ? activeKey.displayText.toUpperCase() : activeKey.displayText
width = activeKey.width
height = activeKey.height
var position = keyboard.mapFromItem(activeKey, 0, 0)
diff --git a/src/virtualkeyboard/content/components/HandwritingModeKey.qml b/src/virtualkeyboard/content/components/HandwritingModeKey.qml
index b07cdcd6..815d89db 100644
--- a/src/virtualkeyboard/content/components/HandwritingModeKey.qml
+++ b/src/virtualkeyboard/content/components/HandwritingModeKey.qml
@@ -49,6 +49,6 @@ Key {
displayText: "HWR"
functionKey: true
visible: keyboard.isHandwritingAvailable()
- onClicked: keyboard.handwritingMode = !keyboard.handwritingMode
+ onClicked: keyboard.setHandwritingMode(!keyboard.handwritingMode)
keyPanelDelegate: keyboard.style ? keyboard.style.handwritingKeyPanel : undefined
}
diff --git a/src/virtualkeyboard/content/components/InputModeKey.qml b/src/virtualkeyboard/content/components/InputModeKey.qml
new file mode 100644
index 00000000..c4463a8e
--- /dev/null
+++ b/src/virtualkeyboard/content/components/InputModeKey.qml
@@ -0,0 +1,122 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.VirtualKeyboard 2.3
+
+/*!
+ \qmltype InputModeKey
+ \inqmlmodule QtQuick.VirtualKeyboard
+ \ingroup qtvirtualkeyboard-qml
+ \inherits Key
+ \since QtQuick.VirtualKeyboard 2.3
+
+ \brief Input mode key for keyboard layouts.
+
+ This key toggles between available \l {InputEngine::inputModes} {InputEngine.inputModes}.
+*/
+
+Key {
+ key: Qt.Key_Mode_switch
+ noKeyEvent: true
+ functionKey: true
+ text: InputContext.inputEngine.inputMode < inputModeNameList.length ?
+ inputModeNameList[InputContext.inputEngine.inputMode] : "ABC"
+ onClicked: InputContext.inputEngine.inputMode = __nextInputMode(InputContext.inputEngine.inputMode)
+ keyPanelDelegate: keyboard.style ? keyboard.style.symbolKeyPanel : undefined
+ enabled: inputModeCount > 1
+
+ /*!
+ List of input mode names.
+
+ The default list contains all known input modes for \l {InputEngine::inputMode} {InputEngine.inputMode}.
+ */
+ property var inputModeNameList: [
+ "ABC", // InputEngine.Latin
+ "123", // InputEngine.Numeric
+ "123", // InputEngine.Dialable
+ "拼音", // InputEngine.Pinyin
+ "倉頡", // InputEngine.Cangjie
+ "注音", // InputEngine.Zhuyin
+ "한글", // InputEngine.Hangul
+ "あ", // InputEngine.Hiragana
+ "カ", // InputEngine.Katakana
+ "全角", // InputEngine.FullwidthLatin
+ "ΑΒΓ", // InputEngine.Greek
+ "АБВ", // InputEngine.Cyrillic
+ "\u0623\u200C\u0628\u200C\u062C", // InputEngine.Arabic
+ "\u05D0\u05D1\u05D2", // InputEngine.Hebrew
+ "中文", // InputEngine.ChineseHandwriting
+ "日本語", // InputEngine.JapaneseHandwriting
+ "한국어", // InputEngine.KoreanHandwriting
+ ]
+
+ /*!
+ List of input modes to toggle.
+
+ This property allows to define a custom list of input modes to
+ toggle.
+
+ The default list contains all the available input modes.
+ */
+ property var inputModes: InputContext.inputEngine.inputModes
+
+ /*!
+ This read-only property reflects the actual number of input modes
+ the user can cycle through this key.
+ */
+ readonly property int inputModeCount: __inputModes !== undefined ? __inputModes.length : 0
+
+ property var __inputModes: __filterInputModes([].concat(InputContext.inputEngine.inputModes), inputModes)
+
+ onInputModesChanged: {
+ // Check that the current input mode is included in our list
+ if (keyboard.active && InputContext.inputEngine.inputMode !== -1 &&
+ __inputModes !== undefined && __inputModes.length > 0 &&
+ __inputModes.indexOf(InputContext.inputEngine.inputMode) === -1)
+ InputContext.inputEngine.inputMode = __inputModes[0]
+ }
+
+ function __nextInputMode(inputMode) {
+ if (!enabled)
+ return inputMode
+ var inputModeIndex = __inputModes.indexOf(inputMode) + 1
+ if (inputModeIndex >= __inputModes.length)
+ inputModeIndex = 0
+ return __inputModes[inputModeIndex]
+ }
+
+ function __filterInputModes(inputModes, filter) {
+ for (var i = 0; i < inputModes.length; i++) {
+ if (filter.indexOf(inputModes[i]) === -1)
+ inputModes.splice(i, 1)
+ }
+ return inputModes
+ }
+}
diff --git a/src/virtualkeyboard/content/components/Key.qml b/src/virtualkeyboard/content/components/Key.qml
index 620a3a7b..5a376310 100644
--- a/src/virtualkeyboard/content/components/Key.qml
+++ b/src/virtualkeyboard/content/components/Key.qml
@@ -42,6 +42,6 @@ import QtQuick 2.0
BaseKey {
id: keyItem
- key: !functionKey && text.length > 0 ? text.charCodeAt(0) : Qt.Key_unknown
+ key: !functionKey && text.length > 0 ? text.toUpperCase().charCodeAt(0) : Qt.Key_unknown
keyPanelDelegate: keyboard.style ? keyboard.style.keyPanel : undefined
}
diff --git a/src/virtualkeyboard/content/components/Keyboard.qml b/src/virtualkeyboard/content/components/Keyboard.qml
index 2bd2ff2e..22378b44 100644
--- a/src/virtualkeyboard/content/components/Keyboard.qml
+++ b/src/virtualkeyboard/content/components/Keyboard.qml
@@ -48,14 +48,17 @@ Item {
property string locale: localeIndex >= 0 && localeIndex < layoutsModel.count ? layoutsModel.get(localeIndex, "fileName") : ""
property string inputLocale
property int defaultLocaleIndex: -1
- property bool latinOnly: InputContext.inputMethodHints & Qt.ImhLatinOnly
- property bool preferNumbers: InputContext.inputMethodHints & Qt.ImhPreferNumbers
+ readonly property bool latinOnly: InputContext.inputMethodHints & (Qt.ImhLatinOnly | Qt.ImhEmailCharactersOnly | Qt.ImhUrlCharactersOnly)
+ readonly property bool preferNumbers: InputContext.inputMethodHints & Qt.ImhPreferNumbers
+ readonly property bool dialableCharactersOnly: InputContext.inputMethodHints & Qt.ImhDialableCharactersOnly
+ readonly property bool formattedNumbersOnly: InputContext.inputMethodHints & Qt.ImhFormattedNumbersOnly
+ readonly property bool digitsOnly: InputContext.inputMethodHints & Qt.ImhDigitsOnly
property string layout
property string layoutType: {
if (keyboard.handwritingMode) return "handwriting"
- if (InputContext.inputMethodHints & Qt.ImhDialableCharactersOnly) return "dialpad"
- if (InputContext.inputMethodHints & Qt.ImhFormattedNumbersOnly) return "numbers"
- if (InputContext.inputMethodHints & Qt.ImhDigitsOnly) return "digits"
+ if (keyboard.dialableCharactersOnly) return "dialpad"
+ if (keyboard.formattedNumbersOnly) return "numbers"
+ if (keyboard.digitsOnly) return "digits"
if (keyboard.symbolMode) return "symbols"
return "main"
}
@@ -128,17 +131,14 @@ Item {
updateAvailableLocaleIndices()
updateLayout()
}
- onLatinOnlyChanged: {
- if (!latinOnly)
- inputModeNeedsReset = true
- updateInputMethod()
- }
+ onLatinOnlyChanged: inputModeNeedsReset = true
onPreferNumbersChanged: {
keyboard.symbolMode = !keyboard.handwritingMode && preferNumbers
- if (!preferNumbers)
- inputModeNeedsReset = true
- updateInputMethod()
+ inputModeNeedsReset = true
}
+ onDialableCharactersOnlyChanged: inputModeNeedsReset = true
+ onFormattedNumbersOnlyChanged: inputModeNeedsReset = true
+ onDigitsOnlyChanged: inputModeNeedsReset = true
onHandwritingModeChanged: if (!keyboard.handwritingMode) keyboard.fullScreenHandwritingMode = false
onFullScreenHandwritingModeChanged: if (keyboard.fullScreenHandwritingMode) keyboard.handwritingMode = true
onLanguagePopupListActiveChanged: {
@@ -751,6 +751,12 @@ Item {
when: keyboard.layout.length > 0
}
+ onItemChanged: {
+ // Reset input mode if the new layout wants to override it
+ if (item && item.inputMode !== -1)
+ inputModeNeedsReset = true
+ }
+
MultiPointTouchArea {
id: keyboardInputArea
objectName: "keyboardInputArea"
@@ -1139,29 +1145,30 @@ Item {
var inputModes = InputContext.inputEngine.inputModes
if (inputModes.length > 0) {
// Reset to default input mode if the input locale has changed
- if (inputModeNeedsReset)
+ if (inputModeNeedsReset) {
inputMode = inputModes[0]
- // Check the current layout for input mode override
- if (keyboardLayoutLoader.item.inputMode !== -1)
- inputMode = keyboardLayoutLoader.item.inputMode
+ // Check the current layout for input mode override
+ if (keyboardLayoutLoader.item.inputMode !== -1)
+ inputMode = keyboardLayoutLoader.item.inputMode
+
+ // Update input mode automatically in handwriting mode
+ if (keyboard.handwritingMode) {
+ if (keyboard.dialableCharactersOnly && inputModes.indexOf(InputEngine.Dialable) !== -1)
+ inputMode = InputEngine.Dialable
+ else if ((keyboard.formattedNumbersOnly || keyboard.digitsOnly) && inputModes.indexOf(InputEngine.Numeric) !== -1)
+ inputMode = InputEngine.Numeric
+ else if (keyboardLayoutLoader.item.inputMode === -1)
+ inputMode = inputModes[0]
+ }
- // Update input mode automatically in handwriting mode
- if (keyboard.handwritingMode) {
- if ((InputContext.inputMethodHints & Qt.ImhDialableCharactersOnly) && inputModes.indexOf(InputEngine.Dialable) !== -1)
- inputMode = InputEngine.Dialable
- else if ((InputContext.inputMethodHints & (Qt.ImhFormattedNumbersOnly | Qt.ImhDigitsOnly)) && inputModes.indexOf(InputEngine.Numeric) !== -1)
+ // Check the input method hints for input mode overrides
+ if (latinOnly)
+ inputMode = InputEngine.Latin
+ if (preferNumbers)
inputMode = InputEngine.Numeric
- else
- inputMode = inputModes[0]
}
- // Check the input method hints for input mode overrides
- if (latinOnly)
- inputMode = InputEngine.Latin
- if (preferNumbers)
- inputMode = InputEngine.Numeric
-
// Make sure the input mode is supported by the current input method
if (inputModes.indexOf(inputMode) === -1)
inputMode = inputModes[0]
@@ -1172,6 +1179,9 @@ Item {
inputModeNeedsReset = false
}
}
+
+ // Clear the toggle shift timer
+ InputContext.shiftHandler.clearToggleShiftTimer()
}
function updateLayout() {
@@ -1349,4 +1359,10 @@ Item {
function isHandwritingAvailable() {
return VirtualKeyboardInputMethods.indexOf("HandwritingInputMethod") !== -1 && layoutExists(locale, "handwriting")
}
+
+ function setHandwritingMode(enabled, resetInputMode) {
+ if (enabled && resetInputMode)
+ inputModeNeedsReset = true
+ handwritingMode = enabled
+ }
}
diff --git a/src/virtualkeyboard/content/components/SelectionControl.qml b/src/virtualkeyboard/content/components/SelectionControl.qml
index 125a8eb7..16961c23 100644
--- a/src/virtualkeyboard/content/components/SelectionControl.qml
+++ b/src/virtualkeyboard/content/components/SelectionControl.qml
@@ -45,7 +45,7 @@ Item {
Behavior on opacity {
NumberAnimation { duration: 200 }
}
- opacity: inputContext.anchorRectIntersectsClipRect ? 1.0 : 0.0
+ opacity: inputContext !== null && inputContext.anchorRectIntersectsClipRect ? 1.0 : 0.0
MouseArea {
width: parent.width * 2
@@ -77,7 +77,7 @@ Item {
Behavior on opacity {
NumberAnimation { duration: 200 }
}
- opacity: inputContext.cursorRectIntersectsClipRect ? 1.0 : 0.0
+ opacity: inputContext !== null && inputContext.cursorRectIntersectsClipRect ? 1.0 : 0.0
MouseArea {
width: parent.width * 2
diff --git a/src/virtualkeyboard/content/content.qrc b/src/virtualkeyboard/content/content.qrc
index 431e4205..d29dbe33 100644
--- a/src/virtualkeyboard/content/content.qrc
+++ b/src/virtualkeyboard/content/content.qrc
@@ -30,5 +30,6 @@
<file>components/LanguagePopupList.qml</file>
<file>components/SelectionControl.qml</file>
<file>components/ShadowInputControl.qml</file>
+ <file>components/InputModeKey.qml</file>
</qresource>
</RCC>
diff --git a/src/virtualkeyboard/content/layouts/ar_AR/handwriting.qml b/src/virtualkeyboard/content/layouts/ar_AR/handwriting.qml
new file mode 100644
index 00000000..f84d47dc
--- /dev/null
+++ b/src/virtualkeyboard/content/layouts/ar_AR/handwriting.qml
@@ -0,0 +1,116 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.Layouts 1.0
+import QtQuick.VirtualKeyboard 2.3
+
+KeyboardLayout {
+ function createInputMethod() {
+ return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.3; HandwritingInputMethod {}', parent)
+ }
+ sharedLayouts: ['symbols']
+ inputMode: InputEngine.Arabic
+ readonly property bool alphabeticInputMode: [InputEngine.Latin, InputEngine.Dialable].indexOf(InputContext.inputEngine.inputMode) !== -1
+
+ KeyboardRow {
+ Layout.preferredHeight: 3
+ KeyboardColumn {
+ Layout.preferredWidth: bottomRow.width - hideKeyboardKey.width
+ KeyboardRow {
+ TraceInputKey {
+ objectName: "hwrInputArea"
+ patternRecognitionMode: InputEngine.HandwritingRecoginition
+ horizontalRulers:
+ alphabeticInputMode ? [] :
+ [Math.round(boundingBox.height / 4), Math.round(boundingBox.height / 4) * 2, Math.round(boundingBox.height / 4) * 3]
+ }
+ }
+ }
+ KeyboardColumn {
+ Layout.preferredWidth: hideKeyboardKey.width
+ KeyboardRow {
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ EnterKey {}
+ }
+ KeyboardRow {
+ ShiftKey { }
+ }
+ }
+ }
+ KeyboardRow {
+ id: bottomRow
+ Layout.preferredHeight: 1
+ keyWeight: 154
+ InputModeKey {
+ weight: 217
+ inputModeNameList: [
+ "ABC", // InputEngine.Latin
+ "\u0660\u0661\u0662", // InputEngine.Numeric
+ "123", // InputEngine.Dialable
+ "", // InputEngine.Pinyin
+ "", // InputEngine.Cangjie
+ "", // InputEngine.Zhuyin
+ "", // InputEngine.Hangul
+ "", // InputEngine.Hiragana
+ "", // InputEngine.Katakana
+ "", // InputEngine.FullwidthLatin
+ "", // InputEngine.Greek
+ "", // InputEngine.Cyrillic
+ "\u0623\u200C\u0628\u200C\u062C", // InputEngine.Arabic
+ ]
+ }
+ ChangeLanguageKey {
+ weight: 154
+ customLayoutsOnly: true
+ }
+ HandwritingModeKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: alphabeticInputMode ? Qt.Key_Apostrophe : 0x060C
+ text: alphabeticInputMode ? "'" : "\u060C"
+ alternativeKeys: alphabeticInputMode ? "<>()#%&*/\\\"'=+-_" : "\"\u060C\u066B\u066C\u066D"
+ }
+ Key {
+ key: Qt.Key_Period
+ text: "."
+ alternativeKeys: alphabeticInputMode ? ":;,.?!" : ":\u061B.\u061F!"
+ }
+ HideKeyboardKey {
+ id: hideKeyboardKey
+ weight: 204
+ }
+ }
+}
diff --git a/src/virtualkeyboard/content/layouts/ar_AR/main.qml b/src/virtualkeyboard/content/layouts/ar_AR/main.qml
index 9e53caca..e79847ec 100644
--- a/src/virtualkeyboard/content/layouts/ar_AR/main.qml
+++ b/src/virtualkeyboard/content/layouts/ar_AR/main.qml
@@ -28,10 +28,10 @@
****************************************************************************/
import QtQuick 2.0
-import QtQuick.VirtualKeyboard 2.1
+import QtQuick.VirtualKeyboard 2.3
KeyboardLayoutLoader {
- inputMode: InputEngine.Latin
+ inputMode: InputEngine.Arabic
sourceComponent: InputContext.shift ? page2 : page1
Component {
id: page1
@@ -163,13 +163,16 @@ KeyboardLayoutLoader {
ChangeLanguageKey {
weight: 154
}
+ HandwritingModeKey {
+ weight: 154
+ }
SpaceKey {
weight: 864
}
Key {
key: 0x060C
text: "\u060C"
- alternativeKeys: ".,\u060C\u061F"
+ alternativeKeys: "\"\u061F\u060C.!:\u061B\u066B\u066C\u066D"
}
Key {
key: 0xE000
@@ -312,6 +315,9 @@ KeyboardLayoutLoader {
ChangeLanguageKey {
weight: 154
}
+ HandwritingModeKey {
+ weight: 154
+ }
SpaceKey {
weight: 864
}
diff --git a/src/virtualkeyboard/content/layouts/bg_BG/handwriting.qml b/src/virtualkeyboard/content/layouts/bg_BG/handwriting.qml
new file mode 100644
index 00000000..782f3217
--- /dev/null
+++ b/src/virtualkeyboard/content/layouts/bg_BG/handwriting.qml
@@ -0,0 +1,99 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.Layouts 1.0
+import QtQuick.VirtualKeyboard 2.3
+
+KeyboardLayout {
+ function createInputMethod() {
+ return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.3; HandwritingInputMethod {}', parent)
+ }
+ sharedLayouts: ['symbols']
+
+ KeyboardRow {
+ Layout.preferredHeight: 3
+ KeyboardColumn {
+ Layout.preferredWidth: bottomRow.width - hideKeyboardKey.width
+ KeyboardRow {
+ TraceInputKey {
+ objectName: "hwrInputArea"
+ patternRecognitionMode: InputEngine.HandwritingRecoginition
+ horizontalRulers:
+ InputContext.inputEngine.inputMode !== InputEngine.Cyrillic ? [] :
+ [Math.round(boundingBox.height / 4), Math.round(boundingBox.height / 4) * 2, Math.round(boundingBox.height / 4) * 3]
+ }
+ }
+ }
+ KeyboardColumn {
+ Layout.preferredWidth: hideKeyboardKey.width
+ KeyboardRow {
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ EnterKey {}
+ }
+ KeyboardRow {
+ ShiftKey { }
+ }
+ }
+ }
+ KeyboardRow {
+ id: bottomRow
+ Layout.preferredHeight: 1
+ keyWeight: 154
+ InputModeKey {
+ weight: 217
+ }
+ ChangeLanguageKey {
+ weight: 154
+ customLayoutsOnly: true
+ }
+ HandwritingModeKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: Qt.Key_Apostrophe
+ text: "'"
+ alternativeKeys: "<>()#%&*/\\\"'=+-_"
+ }
+ Key {
+ key: Qt.Key_Period
+ text: "."
+ alternativeKeys: "!,.;:?"
+ }
+ HideKeyboardKey {
+ id: hideKeyboardKey
+ weight: 204
+ }
+ }
+}
diff --git a/src/virtualkeyboard/content/layouts/bg_BG/main.qml b/src/virtualkeyboard/content/layouts/bg_BG/main.qml
new file mode 100644
index 00000000..f9dad187
--- /dev/null
+++ b/src/virtualkeyboard/content/layouts/bg_BG/main.qml
@@ -0,0 +1,370 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.VirtualKeyboard 2.3
+
+KeyboardLayoutLoader {
+ sharedLayouts: ['symbols']
+ sourceComponent: InputContext.inputEngine.inputMode === InputEngine.Cyrillic ? cyrillicLayout : latinLayout
+ Component {
+ id: cyrillicLayout
+ KeyboardLayout {
+ keyWeight: 160
+ KeyboardRow {
+ Key {
+ text: "я"
+ }
+ Key {
+ text: "в"
+ }
+ Key {
+ text: "е"
+ }
+ Key {
+ text: "р"
+ }
+ Key {
+ text: "т"
+ }
+ Key {
+ text: "ъ"
+ }
+ Key {
+ text: "у"
+ }
+ Key {
+ text: "и"
+ }
+ Key {
+ text: "о"
+ }
+ Key {
+ text: "п"
+ }
+ Key {
+ text: "ч"
+ }
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ FillerKey {
+ weight: 56
+ }
+ Key {
+ text: "а"
+ }
+ Key {
+ text: "с"
+ }
+ Key {
+ text: "д"
+ }
+ Key {
+ text: "ф"
+ }
+ Key {
+ text: "г"
+ }
+ Key {
+ text: "х"
+ }
+ Key {
+ text: "й"
+ }
+ Key {
+ text: "к"
+ }
+ Key {
+ text: "л"
+ }
+ Key {
+ text: "ш"
+ }
+ Key {
+ text: "щ"
+ }
+ EnterKey {
+ weight: 283
+ }
+ }
+ KeyboardRow {
+ keyWeight: 156
+ InputModeKey {
+ inputModes: [InputEngine.Cyrillic, InputEngine.Latin]
+ }
+ Key {
+ text: "з"
+ }
+ Key {
+ text: "ь"
+ }
+ Key {
+ text: "ц"
+ }
+ Key {
+ text: "ж"
+ }
+ Key {
+ text: "б"
+ }
+ Key {
+ text: "н"
+ }
+ Key {
+ text: "м"
+ }
+ Key {
+ text: "ю"
+ }
+ Key {
+ key: Qt.Key_Comma
+ text: ","
+ }
+ Key {
+ key: Qt.Key_Period
+ text: "."
+ alternativeKeys: "!.;?"
+ }
+ ShiftKey {
+ weight: 204
+ }
+ }
+ KeyboardRow {
+ keyWeight: 154
+ SymbolModeKey {
+ weight: 217
+ }
+ ChangeLanguageKey {
+ weight: 154
+ }
+ HandwritingModeKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: Qt.Key_Apostrophe
+ text: "'"
+ }
+ Key {
+ key: 0xE000
+ text: ":-)"
+ alternativeKeys: [ ";-)", ":-)", ":-D", ":-(", "<3" ]
+ }
+ HideKeyboardKey {
+ weight: 204
+ }
+ }
+ }
+ }
+ Component {
+ id: latinLayout
+ KeyboardLayout {
+ keyWeight: 160
+ KeyboardRow {
+ Key {
+ key: Qt.Key_Q
+ text: "q"
+ }
+ Key {
+ key: Qt.Key_W
+ text: "w"
+ }
+ Key {
+ key: Qt.Key_E
+ text: "e"
+ alternativeKeys: "êeëèé"
+ }
+ Key {
+ key: Qt.Key_R
+ text: "r"
+ alternativeKeys: "ŕrř"
+ }
+ Key {
+ key: Qt.Key_T
+ text: "t"
+ alternativeKeys: "ţtŧť"
+ }
+ Key {
+ key: Qt.Key_Y
+ text: "y"
+ alternativeKeys: "ÿyýŷ"
+ }
+ Key {
+ key: Qt.Key_U
+ text: "u"
+ alternativeKeys: "űūũûüuùú"
+ }
+ Key {
+ key: Qt.Key_I
+ text: "i"
+ alternativeKeys: "îïīĩiìí"
+ }
+ Key {
+ key: Qt.Key_O
+ text: "o"
+ alternativeKeys: "œøõôöòóo"
+ }
+ Key {
+ key: Qt.Key_P
+ text: "p"
+ }
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ FillerKey {
+ weight: 56
+ }
+ Key {
+ key: Qt.Key_A
+ text: "a"
+ alternativeKeys: (InputContext.inputMethodHints & (Qt.ImhEmailCharactersOnly | Qt.ImhUrlCharactersOnly)) ? "a@äåãâàá" : "aäåãâàá"
+ smallTextVisible: (InputContext.inputMethodHints & (Qt.ImhEmailCharactersOnly | Qt.ImhUrlCharactersOnly))
+ }
+ Key {
+ key: Qt.Key_S
+ text: "s"
+ alternativeKeys: "šsşś"
+ }
+ Key {
+ key: Qt.Key_D
+ text: "d"
+ alternativeKeys: "dđď"
+ }
+ Key {
+ key: Qt.Key_F
+ text: "f"
+ }
+ Key {
+ key: Qt.Key_G
+ text: "g"
+ alternativeKeys: "ġgģĝğ"
+ }
+ Key {
+ key: Qt.Key_H
+ text: "h"
+ }
+ Key {
+ key: Qt.Key_J
+ text: "j"
+ }
+ Key {
+ key: Qt.Key_K
+ text: "k"
+ }
+ Key {
+ key: Qt.Key_L
+ text: "l"
+ alternativeKeys: "ĺŀłļľl"
+ }
+ EnterKey {
+ weight: 283
+ }
+ }
+ KeyboardRow {
+ keyWeight: 156
+ InputModeKey {
+ enabled: !(InputContext.inputMethodHints & Qt.ImhLatinOnly) && inputModeCount > 1
+ inputModes: [InputEngine.Cyrillic, InputEngine.Latin]
+ }
+ Key {
+ key: Qt.Key_Z
+ text: "z"
+ alternativeKeys: "zžż"
+ }
+ Key {
+ key: Qt.Key_X
+ text: "x"
+ }
+ Key {
+ key: Qt.Key_C
+ text: "c"
+ alternativeKeys: "çcċčć"
+ }
+ Key {
+ key: Qt.Key_V
+ text: "v"
+ }
+ Key {
+ key: Qt.Key_B
+ text: "b"
+ }
+ Key {
+ key: Qt.Key_N
+ text: "n"
+ alternativeKeys: "ņńnň"
+ }
+ Key {
+ key: Qt.Key_M
+ text: "m"
+ }
+ Key {
+ key: Qt.Key_Comma
+ text: ","
+ }
+ Key {
+ key: Qt.Key_Period
+ text: "."
+ }
+ ShiftKey {
+ weight: 204
+ }
+ }
+ KeyboardRow {
+ keyWeight: 154
+ SymbolModeKey {
+ weight: 217
+ }
+ ChangeLanguageKey {
+ weight: 154
+ }
+ HandwritingModeKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: Qt.Key_Apostrophe
+ text: "'"
+ }
+ Key {
+ key: 0xE000
+ text: ":-)"
+ alternativeKeys: [ ";-)", ":-)", ":-D", ":-(", "<3" ]
+ }
+ HideKeyboardKey {
+ weight: 204
+ }
+ }
+ }
+ }
+}
diff --git a/src/virtualkeyboard/content/layouts/bg_BG/symbols.qml b/src/virtualkeyboard/content/layouts/bg_BG/symbols.qml
new file mode 100644
index 00000000..a649017b
--- /dev/null
+++ b/src/virtualkeyboard/content/layouts/bg_BG/symbols.qml
@@ -0,0 +1,376 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.Layouts 1.0
+import QtQuick.VirtualKeyboard 2.3
+
+KeyboardLayoutLoader {
+ property bool secondPage
+ onVisibleChanged: if (!visible) secondPage = false
+ sourceComponent: secondPage ? page2 : page1
+ Component {
+ id: page1
+ KeyboardLayout {
+ keyWeight: 160
+ KeyboardRow {
+ Key {
+ key: Qt.Key_1
+ text: "1"
+ }
+ Key {
+ key: Qt.Key_2
+ text: "2"
+ }
+ Key {
+ key: Qt.Key_3
+ text: "3"
+ }
+ Key {
+ key: Qt.Key_4
+ text: "4"
+ }
+ Key {
+ key: Qt.Key_5
+ text: "5"
+ }
+ Key {
+ key: Qt.Key_6
+ text: "6"
+ }
+ Key {
+ key: Qt.Key_7
+ text: "7"
+ }
+ Key {
+ key: Qt.Key_8
+ text: "8"
+ }
+ Key {
+ key: Qt.Key_9
+ text: "9"
+ }
+ Key {
+ key: Qt.Key_0
+ text: "0"
+ }
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ FillerKey {
+ weight: 56
+ }
+ Key {
+ key: Qt.Key_At
+ text: "@"
+ }
+ Key {
+ key: Qt.Key_NumberSign
+ text: "#"
+ }
+ Key {
+ key: Qt.Key_Percent
+ text: "%"
+ }
+ Key {
+ key: Qt.Key_Ampersand
+ text: "&"
+ }
+ Key {
+ key: Qt.Key_Asterisk
+ text: "*"
+ }
+ Key {
+ key: Qt.Key_Minus
+ text: "-"
+ }
+ Key {
+ key: Qt.Key_Plus
+ text: "+"
+ }
+ Key {
+ key: Qt.Key_ParenLeft
+ text: "("
+ }
+ Key {
+ key: Qt.Key_ParenRight
+ text: ")"
+ }
+ EnterKey {
+ weight: 283
+ }
+ }
+ KeyboardRow {
+ keyWeight: 156
+ Key {
+ displayText: "1/2"
+ functionKey: true
+ onClicked: secondPage = !secondPage
+ }
+ Key {
+ key: Qt.Key_Exclam
+ text: "!"
+ }
+ Key {
+ key: Qt.Key_QuoteDbl
+ text: '"'
+ }
+ Key {
+ key: Qt.Key_Less
+ text: "<"
+ }
+ Key {
+ key: Qt.Key_Greater
+ text: ">"
+ }
+ Key {
+ key: Qt.Key_Apostrophe
+ text: "'"
+ }
+ Key {
+ key: Qt.Key_Colon
+ text: ":"
+ }
+ Key {
+ key: Qt.Key_Semicolon
+ text: ";"
+ }
+ Key {
+ key: Qt.Key_Slash
+ text: "/"
+ }
+ Key {
+ key: Qt.Key_Question
+ text: "?"
+ }
+ Key {
+ weight: 204
+ displayText: "1/2"
+ functionKey: true
+ onClicked: secondPage = !secondPage
+ }
+ }
+ KeyboardRow {
+ keyWeight: 154
+ SymbolModeKey {
+ weight: 217
+ displayText: InputContext.inputEngine.inputMode === InputEngine.Cyrillic ? "АБВ" : "ABC"
+ }
+ ChangeLanguageKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: Qt.Key_Period
+ text: "."
+ alternativeKeys: ".,"
+ }
+ Key {
+ key: 0xE000
+ text: ":-)"
+ alternativeKeys: [ ";-)", ":-)", ":-D", ":-(", "<3" ]
+ }
+ HideKeyboardKey {
+ weight: 204
+ }
+ }
+ }
+ }
+ Component {
+ id: page2
+ KeyboardLayout {
+ keyWeight: 160
+ KeyboardRow {
+ Key {
+ key: Qt.Key_AsciiTilde
+ text: "~"
+ }
+ Key {
+ key: Qt.Key_Agrave
+ text: "`"
+ }
+ Key {
+ key: Qt.Key_Bar
+ text: "|"
+ }
+ Key {
+ key: 0x7B
+ text: "·"
+ }
+ Key {
+ key: 0x221A
+ text: "√"
+ }
+ Key {
+ key: Qt.Key_division
+ text: "÷"
+ }
+ Key {
+ key: Qt.Key_multiply
+ text: "×"
+ }
+ Key {
+ key: Qt.Key_onehalf
+ text: "½"
+ alternativeKeys: "¼⅓½¾⅞"
+ }
+ Key {
+ key: Qt.Key_BraceLeft
+ text: "{"
+ }
+ Key {
+ key: Qt.Key_BraceRight
+ text: "}"
+ }
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ FillerKey {
+ weight: 56
+ }
+ Key {
+ key: Qt.Key_Dollar
+ text: "$"
+ }
+ Key {
+ key: 0x20AC
+ text: "€"
+ }
+ Key {
+ key: 0xC2
+ text: "£"
+ }
+ Key {
+ key: 0xA2
+ text: "¢"
+ }
+ Key {
+ key: 0xA5
+ text: "¥"
+ }
+ Key {
+ key: Qt.Key_Equal
+ text: "="
+ }
+ Key {
+ key: Qt.Key_section
+ text: "§"
+ }
+ Key {
+ key: Qt.Key_BracketLeft
+ text: "["
+ }
+ Key {
+ key: Qt.Key_BracketRight
+ text: "]"
+ }
+ EnterKey {
+ weight: 283
+ }
+ }
+ KeyboardRow {
+ keyWeight: 156
+ Key {
+ displayText: "2/2"
+ functionKey: true
+ onClicked: secondPage = !secondPage
+ }
+ Key {
+ key: Qt.Key_Underscore
+ text: "_"
+ }
+ Key {
+ key: 0x2122
+ text: '™'
+ }
+ Key {
+ key: 0x00AE
+ text: '®'
+ }
+ Key {
+ key: Qt.Key_guillemotleft
+ text: '«'
+ }
+ Key {
+ key: Qt.Key_guillemotright
+ text: '»'
+ }
+ Key {
+ key: 0x201C
+ text: '“'
+ }
+ Key {
+ key: 0x201D
+ text: '”'
+ }
+ Key {
+ key: Qt.Key_Backslash
+ text: "\\"
+ }
+ Key {
+ key: Qt.Key_AsciiCircum
+ text: "^"
+ }
+ Key {
+ weight: 204
+ displayText: "2/2"
+ functionKey: true
+ onClicked: secondPage = !secondPage
+ }
+ }
+ KeyboardRow {
+ keyWeight: 154
+ SymbolModeKey {
+ weight: 217
+ displayText: InputContext.inputEngine.inputMode === InputEngine.Cyrillic ? "АБВ" : "ABC"
+ }
+ ChangeLanguageKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: 0x2026
+ text: "\u2026"
+ }
+ Key {
+ key: 0xE000
+ text: ":-)"
+ alternativeKeys: [ ";-)", ":-)", ":-D", ":-(", "<3" ]
+ }
+ HideKeyboardKey {
+ weight: 204
+ }
+ }
+ }
+ }
+}
diff --git a/src/virtualkeyboard/content/layouts/cs_CZ/handwriting.qml b/src/virtualkeyboard/content/layouts/cs_CZ/handwriting.qml
new file mode 100644
index 00000000..a8d3b59b
--- /dev/null
+++ b/src/virtualkeyboard/content/layouts/cs_CZ/handwriting.qml
@@ -0,0 +1,97 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.Layouts 1.0
+import QtQuick.VirtualKeyboard 2.3
+
+KeyboardLayout {
+ function createInputMethod() {
+ return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.3; HandwritingInputMethod {}', parent)
+ }
+ sharedLayouts: ['symbols']
+ inputMode: InputEngine.Latin
+
+ KeyboardRow {
+ Layout.preferredHeight: 3
+ KeyboardColumn {
+ Layout.preferredWidth: bottomRow.width - hideKeyboardKey.width
+ KeyboardRow {
+ TraceInputKey {
+ objectName: "hwrInputArea"
+ patternRecognitionMode: InputEngine.HandwritingRecoginition
+ }
+ }
+ }
+ KeyboardColumn {
+ Layout.preferredWidth: hideKeyboardKey.width
+ KeyboardRow {
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ EnterKey {}
+ }
+ KeyboardRow {
+ ShiftKey { }
+ }
+ }
+ }
+ KeyboardRow {
+ id: bottomRow
+ Layout.preferredHeight: 1
+ keyWeight: 154
+ InputModeKey {
+ weight: 217
+ }
+ ChangeLanguageKey {
+ weight: 154
+ customLayoutsOnly: true
+ }
+ HandwritingModeKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: Qt.Key_Minus
+ text: "-"
+ alternativeKeys: "<>()#%&*/\\\"'=+-_"
+ }
+ Key {
+ key: Qt.Key_Period
+ text: "."
+ alternativeKeys: ":;,.?!"
+ }
+ HideKeyboardKey {
+ id: hideKeyboardKey
+ weight: 204
+ }
+ }
+}
diff --git a/src/virtualkeyboard/content/layouts/cs_CZ/main.qml b/src/virtualkeyboard/content/layouts/cs_CZ/main.qml
new file mode 100644
index 00000000..1a4057e8
--- /dev/null
+++ b/src/virtualkeyboard/content/layouts/cs_CZ/main.qml
@@ -0,0 +1,207 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.VirtualKeyboard 2.3
+
+KeyboardLayout {
+ inputMode: InputEngine.Latin
+ keyWeight: 160
+ KeyboardRow {
+ Key {
+ key: Qt.Key_Q
+ text: "q"
+ }
+ Key {
+ key: Qt.Key_W
+ text: "w"
+ }
+ Key {
+ key: Qt.Key_E
+ text: "e"
+ alternativeKeys: "eéě"
+ }
+ Key {
+ key: Qt.Key_R
+ text: "r"
+ alternativeKeys: "rř"
+ }
+ Key {
+ key: Qt.Key_T
+ text: "t"
+ alternativeKeys: "tť"
+ }
+ Key {
+ key: Qt.Key_Z
+ text: "z"
+ alternativeKeys: "zž"
+ }
+ Key {
+ key: Qt.Key_U
+ text: "u"
+ alternativeKeys: "uúů"
+ }
+ Key {
+ key: Qt.Key_I
+ text: "i"
+ alternativeKeys: "ií"
+ }
+ Key {
+ key: Qt.Key_O
+ text: "o"
+ alternativeKeys: "oóö"
+ }
+ Key {
+ key: Qt.Key_P
+ text: "p"
+ }
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ FillerKey {
+ weight: 56
+ }
+ Key {
+ key: Qt.Key_A
+ text: "a"
+ alternativeKeys: "aåäá"
+ }
+ Key {
+ key: Qt.Key_S
+ text: "s"
+ alternativeKeys: "sš"
+ }
+ Key {
+ key: Qt.Key_D
+ text: "d"
+ alternativeKeys: "dď"
+ }
+ Key {
+ key: Qt.Key_F
+ text: "f"
+ }
+ Key {
+ key: Qt.Key_G
+ text: "g"
+ }
+ Key {
+ key: Qt.Key_H
+ text: "h"
+ }
+ Key {
+ key: Qt.Key_J
+ text: "j"
+ }
+ Key {
+ key: Qt.Key_K
+ text: "k"
+ }
+ Key {
+ key: Qt.Key_L
+ text: "l"
+ }
+ EnterKey {
+ weight: 283
+ }
+ }
+ KeyboardRow {
+ keyWeight: 156
+ ShiftKey {}
+ Key {
+ key: Qt.Key_Y
+ text: "y"
+ alternativeKeys: "yý"
+ }
+ Key {
+ key: Qt.Key_X
+ text: "x"
+ }
+ Key {
+ key: Qt.Key_C
+ text: "c"
+ alternativeKeys: "cćč"
+ }
+ Key {
+ key: Qt.Key_V
+ text: "v"
+ }
+ Key {
+ key: Qt.Key_B
+ text: "b"
+ }
+ Key {
+ key: Qt.Key_N
+ text: "n"
+ alternativeKeys: "nń"
+ }
+ Key {
+ key: Qt.Key_M
+ text: "m"
+ }
+ Key {
+ key: Qt.Key_Comma
+ text: ","
+ }
+ Key {
+ key: Qt.Key_Period
+ text: "."
+ }
+ ShiftKey {
+ weight: 204
+ }
+ }
+ KeyboardRow {
+ keyWeight: 154
+ SymbolModeKey {
+ weight: 217
+ }
+ ChangeLanguageKey {
+ weight: 154
+ }
+ HandwritingModeKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: Qt.Key_Minus
+ text: "-"
+ alternativeKeys: "-\"'"
+ }
+ Key {
+ key: 0xE000
+ text: ":-)"
+ alternativeKeys: [ ";-)", ":-)", ":-D", ":-(", "<3" ]
+ }
+ HideKeyboardKey {
+ weight: 204
+ }
+ }
+}
diff --git a/src/virtualkeyboard/content/layouts/cs_CZ/symbols.qml b/src/virtualkeyboard/content/layouts/cs_CZ/symbols.qml
new file mode 100644
index 00000000..76c06493
--- /dev/null
+++ b/src/virtualkeyboard/content/layouts/cs_CZ/symbols.qml
@@ -0,0 +1,376 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.Layouts 1.0
+import QtQuick.VirtualKeyboard 2.3
+
+KeyboardLayoutLoader {
+ property bool secondPage
+ onVisibleChanged: if (!visible) secondPage = false
+ sourceComponent: secondPage ? page2 : page1
+ Component {
+ id: page1
+ KeyboardLayout {
+ keyWeight: 160
+ KeyboardRow {
+ Key {
+ key: Qt.Key_1
+ text: "1"
+ }
+ Key {
+ key: Qt.Key_2
+ text: "2"
+ }
+ Key {
+ key: Qt.Key_3
+ text: "3"
+ }
+ Key {
+ key: Qt.Key_4
+ text: "4"
+ }
+ Key {
+ key: Qt.Key_5
+ text: "5"
+ }
+ Key {
+ key: Qt.Key_6
+ text: "6"
+ }
+ Key {
+ key: Qt.Key_7
+ text: "7"
+ }
+ Key {
+ key: Qt.Key_8
+ text: "8"
+ }
+ Key {
+ key: Qt.Key_9
+ text: "9"
+ }
+ Key {
+ key: Qt.Key_0
+ text: "0"
+ }
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ FillerKey {
+ weight: 56
+ }
+ Key {
+ key: Qt.Key_At
+ text: "@"
+ }
+ Key {
+ key: Qt.Key_NumberSign
+ text: "#"
+ }
+ Key {
+ key: Qt.Key_Percent
+ text: "%"
+ }
+ Key {
+ key: Qt.Key_Ampersand
+ text: "&"
+ }
+ Key {
+ key: Qt.Key_Asterisk
+ text: "*"
+ }
+ Key {
+ key: Qt.Key_Minus
+ text: "-"
+ }
+ Key {
+ key: Qt.Key_Plus
+ text: "+"
+ }
+ Key {
+ key: Qt.Key_ParenLeft
+ text: "("
+ }
+ Key {
+ key: Qt.Key_ParenRight
+ text: ")"
+ }
+ EnterKey {
+ weight: 283
+ }
+ }
+ KeyboardRow {
+ keyWeight: 156
+ Key {
+ displayText: "1/2"
+ functionKey: true
+ onClicked: secondPage = !secondPage
+ }
+ Key {
+ key: Qt.Key_Exclam
+ text: "!"
+ }
+ Key {
+ key: Qt.Key_QuoteDbl
+ text: '"'
+ }
+ Key {
+ key: Qt.Key_Apostrophe
+ text: "'"
+ }
+ Key {
+ key: Qt.Key_Less
+ text: "<"
+ }
+ Key {
+ key: Qt.Key_Greater
+ text: ">"
+ }
+ Key {
+ key: Qt.Key_Colon
+ text: ":"
+ }
+ Key {
+ key: Qt.Key_Semicolon
+ text: ";"
+ }
+ Key {
+ key: Qt.Key_Slash
+ text: "/"
+ }
+ Key {
+ key: Qt.Key_Question
+ text: "?"
+ }
+ Key {
+ weight: 204
+ displayText: "1/2"
+ functionKey: true
+ onClicked: secondPage = !secondPage
+ }
+ }
+ KeyboardRow {
+ keyWeight: 154
+ SymbolModeKey {
+ weight: 217
+ displayText: "ABC"
+ }
+ ChangeLanguageKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: Qt.Key_Period
+ text: "."
+ alternativeKeys: ".,"
+ }
+ Key {
+ key: 0xE000
+ text: ":-)"
+ alternativeKeys: [ ";-)", ":-)", ":-D", ":-(", "<3" ]
+ }
+ HideKeyboardKey {
+ weight: 204
+ }
+ }
+ }
+ }
+ Component {
+ id: page2
+ KeyboardLayout {
+ keyWeight: 160
+ KeyboardRow {
+ Key {
+ key: Qt.Key_AsciiTilde
+ text: "~"
+ }
+ Key {
+ key: Qt.Key_Agrave
+ text: "`"
+ }
+ Key {
+ key: Qt.Key_Bar
+ text: "|"
+ }
+ Key {
+ key: 0x7B
+ text: "·"
+ }
+ Key {
+ key: 0x221A
+ text: "√"
+ }
+ Key {
+ key: Qt.Key_division
+ text: "÷"
+ }
+ Key {
+ key: Qt.Key_multiply
+ text: "×"
+ }
+ Key {
+ key: Qt.Key_onehalf
+ text: "½"
+ alternativeKeys: "¼⅓½¾⅞"
+ }
+ Key {
+ key: Qt.Key_BraceLeft
+ text: "{"
+ }
+ Key {
+ key: Qt.Key_BraceRight
+ text: "}"
+ }
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ FillerKey {
+ weight: 56
+ }
+ Key {
+ key: Qt.Key_Dollar
+ text: "$"
+ }
+ Key {
+ key: 0x20AC
+ text: "€"
+ }
+ Key {
+ key: 0xC2
+ text: "£"
+ }
+ Key {
+ key: 0xA2
+ text: "¢"
+ }
+ Key {
+ key: 0xA5
+ text: "¥"
+ }
+ Key {
+ key: Qt.Key_Equal
+ text: "="
+ }
+ Key {
+ key: Qt.Key_section
+ text: "§"
+ }
+ Key {
+ key: Qt.Key_BracketLeft
+ text: "["
+ }
+ Key {
+ key: Qt.Key_BracketRight
+ text: "]"
+ }
+ EnterKey {
+ weight: 283
+ }
+ }
+ KeyboardRow {
+ keyWeight: 156
+ Key {
+ displayText: "2/2"
+ functionKey: true
+ onClicked: secondPage = !secondPage
+ }
+ Key {
+ key: Qt.Key_Underscore
+ text: "_"
+ }
+ Key {
+ key: 0x2122
+ text: '™'
+ }
+ Key {
+ key: 0x00AE
+ text: '®'
+ }
+ Key {
+ key: Qt.Key_guillemotleft
+ text: '«'
+ }
+ Key {
+ key: Qt.Key_guillemotright
+ text: '»'
+ }
+ Key {
+ key: 0x201C
+ text: '“'
+ }
+ Key {
+ key: 0x201D
+ text: '”'
+ }
+ Key {
+ key: Qt.Key_Backslash
+ text: "\\"
+ }
+ Key {
+ key: Qt.Key_AsciiCircum
+ text: "^"
+ }
+ Key {
+ weight: 204
+ displayText: "2/2"
+ functionKey: true
+ onClicked: secondPage = !secondPage
+ }
+ }
+ KeyboardRow {
+ keyWeight: 154
+ SymbolModeKey {
+ weight: 217
+ displayText: "ABC"
+ }
+ ChangeLanguageKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: 0x2026
+ text: "\u2026"
+ }
+ Key {
+ key: 0xE000
+ text: ":-)"
+ alternativeKeys: [ ";-)", ":-)", ":-D", ":-(", "<3" ]
+ }
+ HideKeyboardKey {
+ weight: 204
+ }
+ }
+ }
+ }
+}
diff --git a/src/virtualkeyboard/content/layouts/da_DK/handwriting.qml b/src/virtualkeyboard/content/layouts/da_DK/handwriting.qml
index 8f3672c9..d42de535 100644
--- a/src/virtualkeyboard/content/layouts/da_DK/handwriting.qml
+++ b/src/virtualkeyboard/content/layouts/da_DK/handwriting.qml
@@ -29,11 +29,11 @@
import QtQuick 2.0
import QtQuick.Layouts 1.0
-import QtQuick.VirtualKeyboard 2.1
+import QtQuick.VirtualKeyboard 2.3
KeyboardLayout {
function createInputMethod() {
- return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.1; HandwritingInputMethod {}', parent)
+ return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.3; HandwritingInputMethod {}', parent)
}
sharedLayouts: ['symbols']
inputMode: InputEngine.Latin
@@ -66,15 +66,8 @@ KeyboardLayout {
id: bottomRow
Layout.preferredHeight: 1
keyWeight: 154
- Key {
+ InputModeKey {
weight: 217
- key: Qt.Key_Mode_switch
- noKeyEvent: true
- functionKey: true
- text: InputContext.inputEngine.inputMode === InputEngine.Latin ? "123" : "ABC"
- onClicked: InputContext.inputEngine.inputMode = InputContext.inputEngine.inputMode === InputEngine.Latin ? InputEngine.Numeric : InputEngine.Latin
- enabled: !(InputContext.inputMethodHints & (Qt.ImhDialableCharactersOnly | Qt.ImhFormattedNumbersOnly | Qt.ImhDigitsOnly))
- keyPanelDelegate: keyboard.style ? keyboard.style.symbolKeyPanel : undefined
}
ChangeLanguageKey {
weight: 154
diff --git a/src/virtualkeyboard/content/layouts/de_DE/handwriting.qml b/src/virtualkeyboard/content/layouts/de_DE/handwriting.qml
index 8f3672c9..d42de535 100644
--- a/src/virtualkeyboard/content/layouts/de_DE/handwriting.qml
+++ b/src/virtualkeyboard/content/layouts/de_DE/handwriting.qml
@@ -29,11 +29,11 @@
import QtQuick 2.0
import QtQuick.Layouts 1.0
-import QtQuick.VirtualKeyboard 2.1
+import QtQuick.VirtualKeyboard 2.3
KeyboardLayout {
function createInputMethod() {
- return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.1; HandwritingInputMethod {}', parent)
+ return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.3; HandwritingInputMethod {}', parent)
}
sharedLayouts: ['symbols']
inputMode: InputEngine.Latin
@@ -66,15 +66,8 @@ KeyboardLayout {
id: bottomRow
Layout.preferredHeight: 1
keyWeight: 154
- Key {
+ InputModeKey {
weight: 217
- key: Qt.Key_Mode_switch
- noKeyEvent: true
- functionKey: true
- text: InputContext.inputEngine.inputMode === InputEngine.Latin ? "123" : "ABC"
- onClicked: InputContext.inputEngine.inputMode = InputContext.inputEngine.inputMode === InputEngine.Latin ? InputEngine.Numeric : InputEngine.Latin
- enabled: !(InputContext.inputMethodHints & (Qt.ImhDialableCharactersOnly | Qt.ImhFormattedNumbersOnly | Qt.ImhDigitsOnly))
- keyPanelDelegate: keyboard.style ? keyboard.style.symbolKeyPanel : undefined
}
ChangeLanguageKey {
weight: 154
diff --git a/src/virtualkeyboard/content/layouts/el_GR/handwriting.qml b/src/virtualkeyboard/content/layouts/el_GR/handwriting.qml
new file mode 100644
index 00000000..03747a85
--- /dev/null
+++ b/src/virtualkeyboard/content/layouts/el_GR/handwriting.qml
@@ -0,0 +1,99 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.Layouts 1.0
+import QtQuick.VirtualKeyboard 2.3
+
+KeyboardLayout {
+ function createInputMethod() {
+ return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.3; HandwritingInputMethod {}', parent)
+ }
+ sharedLayouts: ['symbols']
+
+ KeyboardRow {
+ Layout.preferredHeight: 3
+ KeyboardColumn {
+ Layout.preferredWidth: bottomRow.width - hideKeyboardKey.width
+ KeyboardRow {
+ TraceInputKey {
+ objectName: "hwrInputArea"
+ patternRecognitionMode: InputEngine.HandwritingRecoginition
+ horizontalRulers:
+ InputContext.inputEngine.inputMode !== InputEngine.Greek ? [] :
+ [Math.round(boundingBox.height / 4), Math.round(boundingBox.height / 4) * 2, Math.round(boundingBox.height / 4) * 3]
+ }
+ }
+ }
+ KeyboardColumn {
+ Layout.preferredWidth: hideKeyboardKey.width
+ KeyboardRow {
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ EnterKey {}
+ }
+ KeyboardRow {
+ ShiftKey { }
+ }
+ }
+ }
+ KeyboardRow {
+ id: bottomRow
+ Layout.preferredHeight: 1
+ keyWeight: 154
+ InputModeKey {
+ weight: 217
+ }
+ ChangeLanguageKey {
+ weight: 154
+ customLayoutsOnly: true
+ }
+ HandwritingModeKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: Qt.Key_Apostrophe
+ text: "'"
+ alternativeKeys: "<>()#%&*/\\\"'=+-_"
+ }
+ Key {
+ key: Qt.Key_Period
+ text: "."
+ alternativeKeys: "!,.;:?"
+ }
+ HideKeyboardKey {
+ id: hideKeyboardKey
+ weight: 204
+ }
+ }
+}
diff --git a/src/virtualkeyboard/content/layouts/el_GR/main.qml b/src/virtualkeyboard/content/layouts/el_GR/main.qml
new file mode 100644
index 00000000..50b5fec1
--- /dev/null
+++ b/src/virtualkeyboard/content/layouts/el_GR/main.qml
@@ -0,0 +1,364 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.VirtualKeyboard 2.3
+
+KeyboardLayoutLoader {
+ sharedLayouts: ['symbols']
+ sourceComponent: InputContext.inputEngine.inputMode === InputEngine.Greek ? greekLayout : latinLayout
+ Component {
+ id: greekLayout
+ KeyboardLayout {
+ keyWeight: 160
+ KeyboardRow {
+ Key {
+ text: "ς"
+ }
+ Key {
+ text: "ε"
+ alternativeKeys: "εέ"
+ }
+ Key {
+ text: "ρ"
+ }
+ Key {
+ text: "τ"
+ }
+ Key {
+ text: "ψ"
+ }
+ Key {
+ text: "υ"
+ alternativeKeys: "υύϋΰ"
+ }
+ Key {
+ text: "θ"
+ }
+ Key {
+ text: "ι"
+ alternativeKeys: "ιίϊΐ"
+ }
+ Key {
+ text: "ο"
+ alternativeKeys: "οό"
+ }
+ Key {
+ text: "π"
+ }
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ FillerKey {
+ weight: 56
+ }
+ Key {
+ text: "α"
+ alternativeKeys: "αά"
+ }
+ Key {
+ text: "σ"
+ }
+ Key {
+ text: "δ"
+ }
+ Key {
+ text: "φ"
+ }
+ Key {
+ text: "γ"
+ }
+ Key {
+ text: "η"
+ alternativeKeys: "ηή"
+ }
+ Key {
+ text: "ξ"
+ }
+ Key {
+ text: "κ"
+ }
+ Key {
+ text: "λ"
+ }
+ EnterKey {
+ weight: 283
+ }
+ }
+ KeyboardRow {
+ keyWeight: 156
+ InputModeKey {
+ inputModes: [InputEngine.Greek, InputEngine.Latin]
+ }
+ Key {
+ text: "ζ"
+ }
+ Key {
+ text: "χ"
+ }
+ Key {
+ text: "ψ"
+ }
+ Key {
+ text: "ω"
+ alternativeKeys: "ωώ"
+ }
+ Key {
+ text: "β"
+ }
+ Key {
+ text: "ν"
+ }
+ Key {
+ text: "μ"
+ }
+ Key {
+ key: Qt.Key_Comma
+ text: ","
+ }
+ Key {
+ key: Qt.Key_Period
+ text: "."
+ alternativeKeys: "!.;?"
+ }
+ ShiftKey {
+ weight: 204
+ }
+ }
+ KeyboardRow {
+ keyWeight: 154
+ SymbolModeKey {
+ weight: 217
+ }
+ ChangeLanguageKey {
+ weight: 154
+ }
+ HandwritingModeKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: Qt.Key_Apostrophe
+ text: "'"
+ }
+ Key {
+ key: 0xE000
+ text: ":-)"
+ alternativeKeys: [ ";-)", ":-)", ":-D", ":-(", "<3" ]
+ }
+ HideKeyboardKey {
+ weight: 204
+ }
+ }
+ }
+ }
+ Component {
+ id: latinLayout
+ KeyboardLayout {
+ keyWeight: 160
+ KeyboardRow {
+ Key {
+ key: Qt.Key_Q
+ text: "q"
+ }
+ Key {
+ key: Qt.Key_W
+ text: "w"
+ }
+ Key {
+ key: Qt.Key_E
+ text: "e"
+ alternativeKeys: "êeëèé"
+ }
+ Key {
+ key: Qt.Key_R
+ text: "r"
+ alternativeKeys: "ŕrř"
+ }
+ Key {
+ key: Qt.Key_T
+ text: "t"
+ alternativeKeys: "ţtŧť"
+ }
+ Key {
+ key: Qt.Key_Y
+ text: "y"
+ alternativeKeys: "ÿyýŷ"
+ }
+ Key {
+ key: Qt.Key_U
+ text: "u"
+ alternativeKeys: "űūũûüuùú"
+ }
+ Key {
+ key: Qt.Key_I
+ text: "i"
+ alternativeKeys: "îïīĩiìí"
+ }
+ Key {
+ key: Qt.Key_O
+ text: "o"
+ alternativeKeys: "œøõôöòóo"
+ }
+ Key {
+ key: Qt.Key_P
+ text: "p"
+ }
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ FillerKey {
+ weight: 56
+ }
+ Key {
+ key: Qt.Key_A
+ text: "a"
+ alternativeKeys: (InputContext.inputMethodHints & (Qt.ImhEmailCharactersOnly | Qt.ImhUrlCharactersOnly)) ? "a@äåãâàá" : "aäåãâàá"
+ smallTextVisible: (InputContext.inputMethodHints & (Qt.ImhEmailCharactersOnly | Qt.ImhUrlCharactersOnly))
+ }
+ Key {
+ key: Qt.Key_S
+ text: "s"
+ alternativeKeys: "šsşś"
+ }
+ Key {
+ key: Qt.Key_D
+ text: "d"
+ alternativeKeys: "dđď"
+ }
+ Key {
+ key: Qt.Key_F
+ text: "f"
+ }
+ Key {
+ key: Qt.Key_G
+ text: "g"
+ alternativeKeys: "ġgģĝğ"
+ }
+ Key {
+ key: Qt.Key_H
+ text: "h"
+ }
+ Key {
+ key: Qt.Key_J
+ text: "j"
+ }
+ Key {
+ key: Qt.Key_K
+ text: "k"
+ }
+ Key {
+ key: Qt.Key_L
+ text: "l"
+ alternativeKeys: "ĺŀłļľl"
+ }
+ EnterKey {
+ weight: 283
+ }
+ }
+ KeyboardRow {
+ keyWeight: 156
+ InputModeKey {
+ inputModes: [InputEngine.Greek, InputEngine.Latin]
+ }
+ Key {
+ key: Qt.Key_Z
+ text: "z"
+ alternativeKeys: "zžż"
+ }
+ Key {
+ key: Qt.Key_X
+ text: "x"
+ }
+ Key {
+ key: Qt.Key_C
+ text: "c"
+ alternativeKeys: "çcċčć"
+ }
+ Key {
+ key: Qt.Key_V
+ text: "v"
+ }
+ Key {
+ key: Qt.Key_B
+ text: "b"
+ }
+ Key {
+ key: Qt.Key_N
+ text: "n"
+ alternativeKeys: "ņńnň"
+ }
+ Key {
+ key: Qt.Key_M
+ text: "m"
+ }
+ Key {
+ key: Qt.Key_Comma
+ text: ","
+ }
+ Key {
+ key: Qt.Key_Period
+ text: "."
+ }
+ ShiftKey {
+ weight: 204
+ }
+ }
+ KeyboardRow {
+ keyWeight: 154
+ SymbolModeKey {
+ weight: 217
+ }
+ ChangeLanguageKey {
+ weight: 154
+ }
+ HandwritingModeKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: Qt.Key_Apostrophe
+ text: "'"
+ }
+ Key {
+ key: 0xE000
+ text: ":-)"
+ alternativeKeys: [ ";-)", ":-)", ":-D", ":-(", "<3" ]
+ }
+ HideKeyboardKey {
+ weight: 204
+ }
+ }
+ }
+ }
+}
diff --git a/src/virtualkeyboard/content/layouts/el_GR/symbols.qml b/src/virtualkeyboard/content/layouts/el_GR/symbols.qml
new file mode 100644
index 00000000..b5eda063
--- /dev/null
+++ b/src/virtualkeyboard/content/layouts/el_GR/symbols.qml
@@ -0,0 +1,376 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.Layouts 1.0
+import QtQuick.VirtualKeyboard 2.3
+
+KeyboardLayoutLoader {
+ property bool secondPage
+ onVisibleChanged: if (!visible) secondPage = false
+ sourceComponent: secondPage ? page2 : page1
+ Component {
+ id: page1
+ KeyboardLayout {
+ keyWeight: 160
+ KeyboardRow {
+ Key {
+ key: Qt.Key_1
+ text: "1"
+ }
+ Key {
+ key: Qt.Key_2
+ text: "2"
+ }
+ Key {
+ key: Qt.Key_3
+ text: "3"
+ }
+ Key {
+ key: Qt.Key_4
+ text: "4"
+ }
+ Key {
+ key: Qt.Key_5
+ text: "5"
+ }
+ Key {
+ key: Qt.Key_6
+ text: "6"
+ }
+ Key {
+ key: Qt.Key_7
+ text: "7"
+ }
+ Key {
+ key: Qt.Key_8
+ text: "8"
+ }
+ Key {
+ key: Qt.Key_9
+ text: "9"
+ }
+ Key {
+ key: Qt.Key_0
+ text: "0"
+ }
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ FillerKey {
+ weight: 56
+ }
+ Key {
+ key: Qt.Key_At
+ text: "@"
+ }
+ Key {
+ key: Qt.Key_NumberSign
+ text: "#"
+ }
+ Key {
+ key: Qt.Key_Percent
+ text: "%"
+ }
+ Key {
+ key: Qt.Key_Ampersand
+ text: "&"
+ }
+ Key {
+ key: Qt.Key_Asterisk
+ text: "*"
+ }
+ Key {
+ key: Qt.Key_Minus
+ text: "-"
+ }
+ Key {
+ key: Qt.Key_Plus
+ text: "+"
+ }
+ Key {
+ key: Qt.Key_ParenLeft
+ text: "("
+ }
+ Key {
+ key: Qt.Key_ParenRight
+ text: ")"
+ }
+ EnterKey {
+ weight: 283
+ }
+ }
+ KeyboardRow {
+ keyWeight: 156
+ Key {
+ displayText: "1/2"
+ functionKey: true
+ onClicked: secondPage = !secondPage
+ }
+ Key {
+ key: Qt.Key_Exclam
+ text: "!"
+ }
+ Key {
+ key: Qt.Key_QuoteDbl
+ text: '"'
+ }
+ Key {
+ key: Qt.Key_Less
+ text: "<"
+ }
+ Key {
+ key: Qt.Key_Greater
+ text: ">"
+ }
+ Key {
+ key: Qt.Key_Apostrophe
+ text: "'"
+ }
+ Key {
+ key: Qt.Key_Colon
+ text: ":"
+ }
+ Key {
+ key: Qt.Key_Semicolon
+ text: ";"
+ }
+ Key {
+ key: Qt.Key_Slash
+ text: "/"
+ }
+ Key {
+ key: Qt.Key_Question
+ text: "?"
+ }
+ Key {
+ weight: 204
+ displayText: "1/2"
+ functionKey: true
+ onClicked: secondPage = !secondPage
+ }
+ }
+ KeyboardRow {
+ keyWeight: 154
+ SymbolModeKey {
+ weight: 217
+ displayText: InputContext.inputEngine.inputMode === InputEngine.Greek ? "ΑΒΓ" : "ABC"
+ }
+ ChangeLanguageKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: Qt.Key_Period
+ text: "."
+ alternativeKeys: ".,"
+ }
+ Key {
+ key: 0xE000
+ text: ":-)"
+ alternativeKeys: [ ";-)", ":-)", ":-D", ":-(", "<3" ]
+ }
+ HideKeyboardKey {
+ weight: 204
+ }
+ }
+ }
+ }
+ Component {
+ id: page2
+ KeyboardLayout {
+ keyWeight: 160
+ KeyboardRow {
+ Key {
+ key: Qt.Key_AsciiTilde
+ text: "~"
+ }
+ Key {
+ key: Qt.Key_Agrave
+ text: "`"
+ }
+ Key {
+ key: Qt.Key_Bar
+ text: "|"
+ }
+ Key {
+ key: 0x7B
+ text: "·"
+ }
+ Key {
+ key: 0x221A
+ text: "√"
+ }
+ Key {
+ key: Qt.Key_division
+ text: "÷"
+ }
+ Key {
+ key: Qt.Key_multiply
+ text: "×"
+ }
+ Key {
+ key: Qt.Key_onehalf
+ text: "½"
+ alternativeKeys: "¼⅓½¾⅞"
+ }
+ Key {
+ key: Qt.Key_BraceLeft
+ text: "{"
+ }
+ Key {
+ key: Qt.Key_BraceRight
+ text: "}"
+ }
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ FillerKey {
+ weight: 56
+ }
+ Key {
+ key: Qt.Key_Dollar
+ text: "$"
+ }
+ Key {
+ key: 0x20AC
+ text: "€"
+ }
+ Key {
+ key: 0xC2
+ text: "£"
+ }
+ Key {
+ key: 0xA2
+ text: "¢"
+ }
+ Key {
+ key: 0xA5
+ text: "¥"
+ }
+ Key {
+ key: Qt.Key_Equal
+ text: "="
+ }
+ Key {
+ key: Qt.Key_section
+ text: "§"
+ }
+ Key {
+ key: Qt.Key_BracketLeft
+ text: "["
+ }
+ Key {
+ key: Qt.Key_BracketRight
+ text: "]"
+ }
+ EnterKey {
+ weight: 283
+ }
+ }
+ KeyboardRow {
+ keyWeight: 156
+ Key {
+ displayText: "2/2"
+ functionKey: true
+ onClicked: secondPage = !secondPage
+ }
+ Key {
+ key: Qt.Key_Underscore
+ text: "_"
+ }
+ Key {
+ key: 0x2122
+ text: '™'
+ }
+ Key {
+ key: 0x00AE
+ text: '®'
+ }
+ Key {
+ key: Qt.Key_guillemotleft
+ text: '«'
+ }
+ Key {
+ key: Qt.Key_guillemotright
+ text: '»'
+ }
+ Key {
+ key: 0x201C
+ text: '“'
+ }
+ Key {
+ key: 0x201D
+ text: '”'
+ }
+ Key {
+ key: Qt.Key_Backslash
+ text: "\\"
+ }
+ Key {
+ key: Qt.Key_AsciiCircum
+ text: "^"
+ }
+ Key {
+ weight: 204
+ displayText: "2/2"
+ functionKey: true
+ onClicked: secondPage = !secondPage
+ }
+ }
+ KeyboardRow {
+ keyWeight: 154
+ SymbolModeKey {
+ weight: 217
+ displayText: InputContext.inputEngine.inputMode === InputEngine.Greek ? "ΑΒΓ" : "ABC"
+ }
+ ChangeLanguageKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: 0x2026
+ text: "\u2026"
+ }
+ Key {
+ key: 0xE000
+ text: ":-)"
+ alternativeKeys: [ ";-)", ":-)", ":-D", ":-(", "<3" ]
+ }
+ HideKeyboardKey {
+ weight: 204
+ }
+ }
+ }
+ }
+}
diff --git a/src/virtualkeyboard/content/layouts/en_GB/handwriting.qml b/src/virtualkeyboard/content/layouts/en_GB/handwriting.qml
index 8f3672c9..d42de535 100644
--- a/src/virtualkeyboard/content/layouts/en_GB/handwriting.qml
+++ b/src/virtualkeyboard/content/layouts/en_GB/handwriting.qml
@@ -29,11 +29,11 @@
import QtQuick 2.0
import QtQuick.Layouts 1.0
-import QtQuick.VirtualKeyboard 2.1
+import QtQuick.VirtualKeyboard 2.3
KeyboardLayout {
function createInputMethod() {
- return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.1; HandwritingInputMethod {}', parent)
+ return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.3; HandwritingInputMethod {}', parent)
}
sharedLayouts: ['symbols']
inputMode: InputEngine.Latin
@@ -66,15 +66,8 @@ KeyboardLayout {
id: bottomRow
Layout.preferredHeight: 1
keyWeight: 154
- Key {
+ InputModeKey {
weight: 217
- key: Qt.Key_Mode_switch
- noKeyEvent: true
- functionKey: true
- text: InputContext.inputEngine.inputMode === InputEngine.Latin ? "123" : "ABC"
- onClicked: InputContext.inputEngine.inputMode = InputContext.inputEngine.inputMode === InputEngine.Latin ? InputEngine.Numeric : InputEngine.Latin
- enabled: !(InputContext.inputMethodHints & (Qt.ImhDialableCharactersOnly | Qt.ImhFormattedNumbersOnly | Qt.ImhDigitsOnly))
- keyPanelDelegate: keyboard.style ? keyboard.style.symbolKeyPanel : undefined
}
ChangeLanguageKey {
weight: 154
diff --git a/src/virtualkeyboard/content/layouts/es_ES/handwriting.qml b/src/virtualkeyboard/content/layouts/es_ES/handwriting.qml
index bbf77c10..0b929162 100644
--- a/src/virtualkeyboard/content/layouts/es_ES/handwriting.qml
+++ b/src/virtualkeyboard/content/layouts/es_ES/handwriting.qml
@@ -29,11 +29,11 @@
import QtQuick 2.0
import QtQuick.Layouts 1.0
-import QtQuick.VirtualKeyboard 2.1
+import QtQuick.VirtualKeyboard 2.3
KeyboardLayout {
function createInputMethod() {
- return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.1; HandwritingInputMethod {}', parent)
+ return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.3; HandwritingInputMethod {}', parent)
}
sharedLayouts: ['symbols']
inputMode: InputEngine.Latin
@@ -66,15 +66,8 @@ KeyboardLayout {
id: bottomRow
Layout.preferredHeight: 1
keyWeight: 154
- Key {
+ InputModeKey {
weight: 217
- key: Qt.Key_Mode_switch
- noKeyEvent: true
- functionKey: true
- text: InputContext.inputEngine.inputMode === InputEngine.Latin ? "123" : "ABC"
- onClicked: InputContext.inputEngine.inputMode = InputContext.inputEngine.inputMode === InputEngine.Latin ? InputEngine.Numeric : InputEngine.Latin
- enabled: !(InputContext.inputMethodHints & (Qt.ImhDialableCharactersOnly | Qt.ImhFormattedNumbersOnly | Qt.ImhDigitsOnly))
- keyPanelDelegate: keyboard.style ? keyboard.style.symbolKeyPanel : undefined
}
ChangeLanguageKey {
weight: 154
diff --git a/src/virtualkeyboard/content/layouts/et_EE/handwriting.qml b/src/virtualkeyboard/content/layouts/et_EE/handwriting.qml
new file mode 100644
index 00000000..d42de535
--- /dev/null
+++ b/src/virtualkeyboard/content/layouts/et_EE/handwriting.qml
@@ -0,0 +1,97 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.Layouts 1.0
+import QtQuick.VirtualKeyboard 2.3
+
+KeyboardLayout {
+ function createInputMethod() {
+ return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.3; HandwritingInputMethod {}', parent)
+ }
+ sharedLayouts: ['symbols']
+ inputMode: InputEngine.Latin
+
+ KeyboardRow {
+ Layout.preferredHeight: 3
+ KeyboardColumn {
+ Layout.preferredWidth: bottomRow.width - hideKeyboardKey.width
+ KeyboardRow {
+ TraceInputKey {
+ objectName: "hwrInputArea"
+ patternRecognitionMode: InputEngine.HandwritingRecoginition
+ }
+ }
+ }
+ KeyboardColumn {
+ Layout.preferredWidth: hideKeyboardKey.width
+ KeyboardRow {
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ EnterKey {}
+ }
+ KeyboardRow {
+ ShiftKey { }
+ }
+ }
+ }
+ KeyboardRow {
+ id: bottomRow
+ Layout.preferredHeight: 1
+ keyWeight: 154
+ InputModeKey {
+ weight: 217
+ }
+ ChangeLanguageKey {
+ weight: 154
+ customLayoutsOnly: true
+ }
+ HandwritingModeKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: Qt.Key_Apostrophe
+ text: "'"
+ alternativeKeys: "<>()#%&*/\\\"'=+-_"
+ }
+ Key {
+ key: Qt.Key_Period
+ text: "."
+ alternativeKeys: ":;,.?!"
+ }
+ HideKeyboardKey {
+ id: hideKeyboardKey
+ weight: 204
+ }
+ }
+}
diff --git a/src/virtualkeyboard/content/layouts/et_EE/main.qml b/src/virtualkeyboard/content/layouts/et_EE/main.qml
new file mode 100644
index 00000000..0deff352
--- /dev/null
+++ b/src/virtualkeyboard/content/layouts/et_EE/main.qml
@@ -0,0 +1,215 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.VirtualKeyboard 2.1
+
+KeyboardLayout {
+ inputMode: InputEngine.Latin
+ keyWeight: 160
+ KeyboardRow {
+ Key {
+ key: Qt.Key_Q
+ text: "q"
+ }
+ Key {
+ key: Qt.Key_W
+ text: "w"
+ }
+ Key {
+ key: Qt.Key_E
+ text: "e"
+ }
+ Key {
+ key: Qt.Key_R
+ text: "r"
+ }
+ Key {
+ key: Qt.Key_T
+ text: "t"
+ }
+ Key {
+ key: Qt.Key_Y
+ text: "y"
+ }
+ Key {
+ key: Qt.Key_U
+ text: "u"
+ }
+ Key {
+ key: Qt.Key_I
+ text: "i"
+ }
+ Key {
+ key: Qt.Key_O
+ text: "o"
+ }
+ Key {
+ key: Qt.Key_P
+ text: "p"
+ }
+ Key {
+ key: Qt.Key_Udiaeresis
+ text: "ü"
+ }
+ Key {
+ key: Qt.Key_Otilde
+ text: "õ"
+ }
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ FillerKey {
+ weight: 66
+ }
+ Key {
+ key: Qt.Key_A
+ text: "a"
+ }
+ Key {
+ key: Qt.Key_S
+ text: "s"
+ alternativeKeys: "sš"
+ }
+ Key {
+ key: Qt.Key_D
+ text: "d"
+ }
+ Key {
+ key: Qt.Key_F
+ text: "f"
+ }
+ Key {
+ key: Qt.Key_G
+ text: "g"
+ }
+ Key {
+ key: Qt.Key_H
+ text: "h"
+ }
+ Key {
+ key: Qt.Key_J
+ text: "j"
+ }
+ Key {
+ key: Qt.Key_K
+ text: "k"
+ }
+ Key {
+ key: Qt.Key_L
+ text: "l"
+ }
+ Key {
+ key: Qt.Key_Odiaeresis
+ text: "ö"
+ }
+ Key {
+ key: Qt.Key_Adiaeresis
+ text: "ä"
+ }
+ EnterKey {
+ weight: 283
+ }
+ }
+ KeyboardRow {
+ keyWeight: 156
+ ShiftKey { }
+ Key {
+ key: Qt.Key_Z
+ text: "z"
+ alternativeKeys: "zž"
+ }
+ Key {
+ key: Qt.Key_X
+ text: "x"
+ }
+ Key {
+ key: Qt.Key_C
+ text: "c"
+ }
+ Key {
+ key: Qt.Key_V
+ text: "v"
+ }
+ Key {
+ key: Qt.Key_B
+ text: "b"
+ }
+ Key {
+ key: Qt.Key_N
+ text: "n"
+ }
+ Key {
+ key: Qt.Key_M
+ text: "m"
+ }
+ Key {
+ key: Qt.Key_Comma
+ text: ","
+ }
+ Key {
+ key: Qt.Key_Period
+ text: "."
+ }
+ Key {
+ key: Qt.Key_Minus
+ text: "-"
+ }
+ ShiftKey {
+ weight: 264
+ }
+ }
+ KeyboardRow {
+ keyWeight: 154
+ SymbolModeKey {
+ weight: 217
+ }
+ ChangeLanguageKey {
+ weight: 154
+ }
+ HandwritingModeKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: Qt.Key_Apostrophe
+ text: "'"
+ }
+ Key {
+ key: 0xE000
+ text: ":-)"
+ alternativeKeys: [ ";-)", ":-)", ":-D", ":-(", "<3" ]
+ }
+ HideKeyboardKey {
+ weight: 204
+ }
+ }
+}
diff --git a/src/virtualkeyboard/content/layouts/et_EE/symbols.qml b/src/virtualkeyboard/content/layouts/et_EE/symbols.qml
new file mode 100644
index 00000000..49f6e709
--- /dev/null
+++ b/src/virtualkeyboard/content/layouts/et_EE/symbols.qml
@@ -0,0 +1,376 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.Layouts 1.0
+import QtQuick.VirtualKeyboard 2.1
+
+KeyboardLayoutLoader {
+ property bool secondPage
+ onVisibleChanged: if (!visible) secondPage = false
+ sourceComponent: secondPage ? page2 : page1
+ Component {
+ id: page1
+ KeyboardLayout {
+ keyWeight: 160
+ KeyboardRow {
+ Key {
+ key: Qt.Key_1
+ text: "1"
+ }
+ Key {
+ key: Qt.Key_2
+ text: "2"
+ }
+ Key {
+ key: Qt.Key_3
+ text: "3"
+ }
+ Key {
+ key: Qt.Key_4
+ text: "4"
+ }
+ Key {
+ key: Qt.Key_5
+ text: "5"
+ }
+ Key {
+ key: Qt.Key_6
+ text: "6"
+ }
+ Key {
+ key: Qt.Key_7
+ text: "7"
+ }
+ Key {
+ key: Qt.Key_8
+ text: "8"
+ }
+ Key {
+ key: Qt.Key_9
+ text: "9"
+ }
+ Key {
+ key: Qt.Key_0
+ text: "0"
+ }
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ FillerKey {
+ weight: 56
+ }
+ Key {
+ key: Qt.Key_At
+ text: "@"
+ }
+ Key {
+ key: Qt.Key_NumberSign
+ text: "#"
+ }
+ Key {
+ key: Qt.Key_Percent
+ text: "%"
+ }
+ Key {
+ key: Qt.Key_Ampersand
+ text: "&"
+ }
+ Key {
+ key: Qt.Key_Asterisk
+ text: "*"
+ }
+ Key {
+ key: Qt.Key_Minus
+ text: "-"
+ }
+ Key {
+ key: Qt.Key_Plus
+ text: "+"
+ }
+ Key {
+ key: Qt.Key_ParenLeft
+ text: "("
+ }
+ Key {
+ key: Qt.Key_ParenRight
+ text: ")"
+ }
+ EnterKey {
+ weight: 283
+ }
+ }
+ KeyboardRow {
+ keyWeight: 156
+ Key {
+ displayText: "1/2"
+ functionKey: true
+ onClicked: secondPage = !secondPage
+ }
+ Key {
+ key: Qt.Key_Exclam
+ text: "!"
+ }
+ Key {
+ key: Qt.Key_QuoteDbl
+ text: '"'
+ }
+ Key {
+ key: Qt.Key_Less
+ text: "<"
+ }
+ Key {
+ key: Qt.Key_Greater
+ text: ">"
+ }
+ Key {
+ key: Qt.Key_Apostrophe
+ text: "'"
+ }
+ Key {
+ key: Qt.Key_Colon
+ text: ":"
+ }
+ Key {
+ key: Qt.Key_Semicolon
+ text: ";"
+ }
+ Key {
+ key: Qt.Key_Slash
+ text: "/"
+ }
+ Key {
+ key: Qt.Key_Question
+ text: "?"
+ }
+ Key {
+ weight: 204
+ displayText: "1/2"
+ functionKey: true
+ onClicked: secondPage = !secondPage
+ }
+ }
+ KeyboardRow {
+ keyWeight: 154
+ SymbolModeKey {
+ weight: 217
+ displayText: "ABC"
+ }
+ ChangeLanguageKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: Qt.Key_Period
+ text: "."
+ alternativeKeys: ".,"
+ }
+ Key {
+ key: 0xE000
+ text: ":-)"
+ alternativeKeys: [ ";-)", ":-)", ":-D", ":-(", "<3" ]
+ }
+ HideKeyboardKey {
+ weight: 204
+ }
+ }
+ }
+ }
+ Component {
+ id: page2
+ KeyboardLayout {
+ keyWeight: 160
+ KeyboardRow {
+ Key {
+ key: Qt.Key_AsciiTilde
+ text: "~"
+ }
+ Key {
+ key: Qt.Key_Agrave
+ text: "`"
+ }
+ Key {
+ key: Qt.Key_Bar
+ text: "|"
+ }
+ Key {
+ key: 0x7B
+ text: "·"
+ }
+ Key {
+ key: 0x221A
+ text: "√"
+ }
+ Key {
+ key: Qt.Key_division
+ text: "÷"
+ }
+ Key {
+ key: Qt.Key_multiply
+ text: "×"
+ }
+ Key {
+ key: Qt.Key_onehalf
+ text: "½"
+ alternativeKeys: "¼⅓½¾⅞"
+ }
+ Key {
+ key: Qt.Key_BraceLeft
+ text: "{"
+ }
+ Key {
+ key: Qt.Key_BraceRight
+ text: "}"
+ }
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ FillerKey {
+ weight: 56
+ }
+ Key {
+ key: Qt.Key_Dollar
+ text: "$"
+ }
+ Key {
+ key: 0x20AC
+ text: "€"
+ }
+ Key {
+ key: 0xC2
+ text: "£"
+ }
+ Key {
+ key: 0xA2
+ text: "¢"
+ }
+ Key {
+ key: 0xA5
+ text: "¥"
+ }
+ Key {
+ key: Qt.Key_Equal
+ text: "="
+ }
+ Key {
+ key: Qt.Key_section
+ text: "§"
+ }
+ Key {
+ key: Qt.Key_BracketLeft
+ text: "["
+ }
+ Key {
+ key: Qt.Key_BracketRight
+ text: "]"
+ }
+ EnterKey {
+ weight: 283
+ }
+ }
+ KeyboardRow {
+ keyWeight: 156
+ Key {
+ displayText: "2/2"
+ functionKey: true
+ onClicked: secondPage = !secondPage
+ }
+ Key {
+ key: Qt.Key_Underscore
+ text: "_"
+ }
+ Key {
+ key: 0x2122
+ text: '™'
+ }
+ Key {
+ key: 0x00AE
+ text: '®'
+ }
+ Key {
+ key: Qt.Key_guillemotleft
+ text: '«'
+ }
+ Key {
+ key: Qt.Key_guillemotright
+ text: '»'
+ }
+ Key {
+ key: 0x201C
+ text: '“'
+ }
+ Key {
+ key: 0x201D
+ text: '”'
+ }
+ Key {
+ key: Qt.Key_Backslash
+ text: "\\"
+ }
+ Key {
+ key: Qt.Key_AsciiCircum
+ text: "^"
+ }
+ Key {
+ weight: 204
+ displayText: "2/2"
+ functionKey: true
+ onClicked: secondPage = !secondPage
+ }
+ }
+ KeyboardRow {
+ keyWeight: 154
+ SymbolModeKey {
+ weight: 217
+ displayText: "ABC"
+ }
+ ChangeLanguageKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: 0x2026
+ text: "\u2026"
+ }
+ Key {
+ key: 0xE000
+ text: ":-)"
+ alternativeKeys: [ ";-)", ":-)", ":-D", ":-(", "<3" ]
+ }
+ HideKeyboardKey {
+ weight: 204
+ }
+ }
+ }
+ }
+}
diff --git a/src/virtualkeyboard/content/layouts/fa_FA/handwriting.qml b/src/virtualkeyboard/content/layouts/fa_FA/handwriting.qml
new file mode 100644
index 00000000..006df195
--- /dev/null
+++ b/src/virtualkeyboard/content/layouts/fa_FA/handwriting.qml
@@ -0,0 +1,116 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.Layouts 1.0
+import QtQuick.VirtualKeyboard 2.3
+
+KeyboardLayout {
+ function createInputMethod() {
+ return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.3; HandwritingInputMethod {}', parent)
+ }
+ sharedLayouts: ['symbols']
+ inputMode: InputEngine.Arabic
+ readonly property bool alphabeticInputMode: [InputEngine.Latin, InputEngine.Dialable].indexOf(InputContext.inputEngine.inputMode) !== -1
+
+ KeyboardRow {
+ Layout.preferredHeight: 3
+ KeyboardColumn {
+ Layout.preferredWidth: bottomRow.width - hideKeyboardKey.width
+ KeyboardRow {
+ TraceInputKey {
+ objectName: "hwrInputArea"
+ patternRecognitionMode: InputEngine.HandwritingRecoginition
+ horizontalRulers:
+ alphabeticInputMode ? [] :
+ [Math.round(boundingBox.height / 4), Math.round(boundingBox.height / 4) * 2, Math.round(boundingBox.height / 4) * 3]
+ }
+ }
+ }
+ KeyboardColumn {
+ Layout.preferredWidth: hideKeyboardKey.width
+ KeyboardRow {
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ EnterKey {}
+ }
+ KeyboardRow {
+ ShiftKey { }
+ }
+ }
+ }
+ KeyboardRow {
+ id: bottomRow
+ Layout.preferredHeight: 1
+ keyWeight: 154
+ InputModeKey {
+ weight: 217
+ inputModeNameList: [
+ "ABC", // InputEngine.Latin
+ "\u0660\u0661\u0662", // InputEngine.Numeric
+ "123", // InputEngine.Dialable
+ "", // InputEngine.Pinyin
+ "", // InputEngine.Cangjie
+ "", // InputEngine.Zhuyin
+ "", // InputEngine.Hangul
+ "", // InputEngine.Hiragana
+ "", // InputEngine.Katakana
+ "", // InputEngine.FullwidthLatin
+ "", // InputEngine.Greek
+ "", // InputEngine.Cyrillic
+ "\u0627\u200C\u0628\u200C\u067E", // InputEngine.Arabic
+ ]
+ }
+ ChangeLanguageKey {
+ weight: 154
+ customLayoutsOnly: true
+ }
+ HandwritingModeKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: alphabeticInputMode ? Qt.Key_Apostrophe : 0x060C
+ text: alphabeticInputMode ? "'" : "\u060C"
+ alternativeKeys: alphabeticInputMode ? "<>()#%&*/\\\"'=+-_" : "\"\u060C\u066B\u066C\u066D"
+ }
+ Key {
+ key: Qt.Key_Period
+ text: "."
+ alternativeKeys: alphabeticInputMode ? ":;,.?!" : ":\u061B.\u061F!"
+ }
+ HideKeyboardKey {
+ id: hideKeyboardKey
+ weight: 204
+ }
+ }
+}
diff --git a/src/virtualkeyboard/content/layouts/fa_FA/main.qml b/src/virtualkeyboard/content/layouts/fa_FA/main.qml
index 3681dd2b..e73665a8 100644
--- a/src/virtualkeyboard/content/layouts/fa_FA/main.qml
+++ b/src/virtualkeyboard/content/layouts/fa_FA/main.qml
@@ -28,10 +28,10 @@
****************************************************************************/
import QtQuick 2.0
-import QtQuick.VirtualKeyboard 2.1
+import QtQuick.VirtualKeyboard 2.3
KeyboardLayoutLoader {
- inputMode: InputEngine.Latin
+ inputMode: InputEngine.Arabic
sourceComponent: InputContext.shift ? page2 : page1
Component {
id: page1
@@ -166,6 +166,9 @@ KeyboardLayoutLoader {
ChangeLanguageKey {
weight: 154
}
+ HandwritingModeKey {
+ weight: 154
+ }
SpaceKey {
weight: 864
}
@@ -317,6 +320,9 @@ KeyboardLayoutLoader {
ChangeLanguageKey {
weight: 154
}
+ HandwritingModeKey {
+ weight: 154
+ }
SpaceKey {
weight: 864
}
diff --git a/src/virtualkeyboard/content/layouts/fi_FI/handwriting.qml b/src/virtualkeyboard/content/layouts/fi_FI/handwriting.qml
index 8f3672c9..d42de535 100644
--- a/src/virtualkeyboard/content/layouts/fi_FI/handwriting.qml
+++ b/src/virtualkeyboard/content/layouts/fi_FI/handwriting.qml
@@ -29,11 +29,11 @@
import QtQuick 2.0
import QtQuick.Layouts 1.0
-import QtQuick.VirtualKeyboard 2.1
+import QtQuick.VirtualKeyboard 2.3
KeyboardLayout {
function createInputMethod() {
- return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.1; HandwritingInputMethod {}', parent)
+ return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.3; HandwritingInputMethod {}', parent)
}
sharedLayouts: ['symbols']
inputMode: InputEngine.Latin
@@ -66,15 +66,8 @@ KeyboardLayout {
id: bottomRow
Layout.preferredHeight: 1
keyWeight: 154
- Key {
+ InputModeKey {
weight: 217
- key: Qt.Key_Mode_switch
- noKeyEvent: true
- functionKey: true
- text: InputContext.inputEngine.inputMode === InputEngine.Latin ? "123" : "ABC"
- onClicked: InputContext.inputEngine.inputMode = InputContext.inputEngine.inputMode === InputEngine.Latin ? InputEngine.Numeric : InputEngine.Latin
- enabled: !(InputContext.inputMethodHints & (Qt.ImhDialableCharactersOnly | Qt.ImhFormattedNumbersOnly | Qt.ImhDigitsOnly))
- keyPanelDelegate: keyboard.style ? keyboard.style.symbolKeyPanel : undefined
}
ChangeLanguageKey {
weight: 154
diff --git a/src/virtualkeyboard/content/layouts/fr_FR/handwriting.qml b/src/virtualkeyboard/content/layouts/fr_FR/handwriting.qml
index 8f3672c9..d42de535 100644
--- a/src/virtualkeyboard/content/layouts/fr_FR/handwriting.qml
+++ b/src/virtualkeyboard/content/layouts/fr_FR/handwriting.qml
@@ -29,11 +29,11 @@
import QtQuick 2.0
import QtQuick.Layouts 1.0
-import QtQuick.VirtualKeyboard 2.1
+import QtQuick.VirtualKeyboard 2.3
KeyboardLayout {
function createInputMethod() {
- return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.1; HandwritingInputMethod {}', parent)
+ return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.3; HandwritingInputMethod {}', parent)
}
sharedLayouts: ['symbols']
inputMode: InputEngine.Latin
@@ -66,15 +66,8 @@ KeyboardLayout {
id: bottomRow
Layout.preferredHeight: 1
keyWeight: 154
- Key {
+ InputModeKey {
weight: 217
- key: Qt.Key_Mode_switch
- noKeyEvent: true
- functionKey: true
- text: InputContext.inputEngine.inputMode === InputEngine.Latin ? "123" : "ABC"
- onClicked: InputContext.inputEngine.inputMode = InputContext.inputEngine.inputMode === InputEngine.Latin ? InputEngine.Numeric : InputEngine.Latin
- enabled: !(InputContext.inputMethodHints & (Qt.ImhDialableCharactersOnly | Qt.ImhFormattedNumbersOnly | Qt.ImhDigitsOnly))
- keyPanelDelegate: keyboard.style ? keyboard.style.symbolKeyPanel : undefined
}
ChangeLanguageKey {
weight: 154
diff --git a/src/virtualkeyboard/content/layouts/he_IL/handwriting.qml b/src/virtualkeyboard/content/layouts/he_IL/handwriting.qml
new file mode 100644
index 00000000..321fbd42
--- /dev/null
+++ b/src/virtualkeyboard/content/layouts/he_IL/handwriting.qml
@@ -0,0 +1,99 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.Layouts 1.0
+import QtQuick.VirtualKeyboard 2.3
+
+KeyboardLayout {
+ function createInputMethod() {
+ return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.3; HandwritingInputMethod {}', parent)
+ }
+ sharedLayouts: ['symbols']
+
+ KeyboardRow {
+ Layout.preferredHeight: 3
+ KeyboardColumn {
+ Layout.preferredWidth: bottomRow.width - hideKeyboardKey.width
+ KeyboardRow {
+ TraceInputKey {
+ objectName: "hwrInputArea"
+ patternRecognitionMode: InputEngine.HandwritingRecoginition
+ horizontalRulers:
+ InputContext.inputEngine.inputMode !== InputEngine.Hebrew ? [] :
+ [Math.round(boundingBox.height / 4), Math.round(boundingBox.height / 4) * 2, Math.round(boundingBox.height / 4) * 3]
+ }
+ }
+ }
+ KeyboardColumn {
+ Layout.preferredWidth: hideKeyboardKey.width
+ KeyboardRow {
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ EnterKey {}
+ }
+ KeyboardRow {
+ ShiftKey { }
+ }
+ }
+ }
+ KeyboardRow {
+ id: bottomRow
+ Layout.preferredHeight: 1
+ keyWeight: 154
+ InputModeKey {
+ weight: 217
+ }
+ ChangeLanguageKey {
+ weight: 154
+ customLayoutsOnly: true
+ }
+ HandwritingModeKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: Qt.Key_Apostrophe
+ text: "'"
+ alternativeKeys: "<>()#%&*/\\'\"=+-_"
+ }
+ Key {
+ key: Qt.Key_Period
+ text: "."
+ alternativeKeys: ":;,.?!"
+ }
+ HideKeyboardKey {
+ id: hideKeyboardKey
+ weight: 204
+ }
+ }
+}
diff --git a/src/virtualkeyboard/content/layouts/he_IL/main.qml b/src/virtualkeyboard/content/layouts/he_IL/main.qml
new file mode 100644
index 00000000..fde3cb4b
--- /dev/null
+++ b/src/virtualkeyboard/content/layouts/he_IL/main.qml
@@ -0,0 +1,381 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.VirtualKeyboard 2.3
+
+KeyboardLayoutLoader {
+ sharedLayouts: ['symbols']
+ sourceComponent: InputContext.inputEngine.inputMode === InputEngine.Hebrew ? hebrewLayout : latinLayout
+ Component {
+ id: hebrewLayout
+ KeyboardLayout {
+ keyWeight: 160
+ KeyboardRow {
+ Key {
+ key: Qt.Key_Apostrophe
+ text: "'"
+ alternativeKeys: "'\""
+ }
+ Key {
+ key: Qt.Key_Minus
+ text: "-"
+ }
+ Key {
+ text: "\u05E7"
+ alternativeKeys: "\u05B3\u05E7\u05B8\u05BB"
+ }
+ Key {
+ text: "\u05E8"
+ }
+ Key {
+ text: "\u05D0"
+ }
+ Key {
+ text: "\u05D8"
+ }
+ Key {
+ text: "\u05D5"
+ alternativeKeys: [ "\u05D5", "\u05D5\u05B9", "\u05D5\u05BC" ]
+ }
+ Key {
+ text: "\u05DF"
+ }
+ Key {
+ text: "\u05DD"
+ }
+ Key {
+ text: "\u05E4"
+ alternativeKeys: "\u05B2\u05B7\u05E4"
+ }
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ FillerKey {
+ weight: 56
+ }
+ Key {
+ text: "\u05E9"
+ alternativeKeys: [ "\u05E9", "\u05B0", "\u05E9\u05C2", "\u05E9\u05C1" ]
+ }
+ Key {
+ text: "\u05D3"
+ alternativeKeys: "\u05D3\u05BC"
+ }
+ Key {
+ text: "\u05D2"
+ alternativeKeys: [ "\u05D2", "\u05D2\u05F3" ]
+ }
+ Key {
+ text: "\u05DB"
+ }
+ Key {
+ text: "\u05E2"
+ }
+ Key {
+ text: "\u05D9"
+ alternativeKeys: [ "\u05D9", "\u05F2\u05B7" ]
+ }
+ Key {
+ text: "\u05D7"
+ alternativeKeys: [ "\u05B9", "\u05D7", "\u05D7\u05F3", "\u05B4" ]
+ }
+ Key {
+ text: "\u05DC"
+ }
+ Key {
+ text: "\u05DA"
+ }
+ Key {
+ text: "\u05E3"
+ }
+ EnterKey {
+ weight: 283
+ }
+ }
+ KeyboardRow {
+ keyWeight: 156
+ InputModeKey {
+ inputModes: [InputEngine.Hebrew, InputEngine.Latin]
+ }
+ Key {
+ text: "\u05D6"
+ alternativeKeys: [ "\u05D6", "\u05D6\u05F3" ]
+ }
+ Key {
+ text: "\u05E1"
+ alternativeKeys: "\u05E1\u05B6\u05B1"
+ }
+ Key {
+ text: "\u05D1"
+ }
+ Key {
+ text: "\u05D4"
+ }
+ Key {
+ text: "\u05E0"
+ }
+ Key {
+ text: "\u05DE"
+ }
+ Key {
+ text: "\u05E6"
+ alternativeKeys: [ "\u05E6", "\u05E6\u05F3", "\u05B5" ]
+ }
+ Key {
+ text: "\u05EA"
+ alternativeKeys: [ "\u05EA", "\u05EA\u05F3" ]
+ }
+ Key {
+ text: "\u05E5"
+ alternativeKeys: [ "\u05E5", "\u05E5\u05F3" ]
+ }
+ Key {
+ key: Qt.Key_Comma
+ text: ","
+ alternativeKeys: ":,;"
+ }
+ ShiftKey {
+ weight: 204
+ enabled: false
+ }
+ }
+ KeyboardRow {
+ keyWeight: 154
+ SymbolModeKey {
+ weight: 217
+ }
+ ChangeLanguageKey {
+ weight: 154
+ }
+ HandwritingModeKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: Qt.Key_Period
+ text: "."
+ alternativeKeys: "!.?"
+ }
+ Key {
+ key: 0xE000
+ text: ":-)"
+ alternativeKeys: [ ";-)", ":-)", ":-D", ":-(", "<3" ]
+ }
+ HideKeyboardKey {
+ weight: 204
+ }
+ }
+ }
+ }
+ Component {
+ id: latinLayout
+ KeyboardLayout {
+ keyWeight: 160
+ KeyboardRow {
+ Key {
+ key: Qt.Key_Q
+ text: "q"
+ }
+ Key {
+ key: Qt.Key_W
+ text: "w"
+ }
+ Key {
+ key: Qt.Key_E
+ text: "e"
+ alternativeKeys: "êeëèé"
+ }
+ Key {
+ key: Qt.Key_R
+ text: "r"
+ alternativeKeys: "ŕrř"
+ }
+ Key {
+ key: Qt.Key_T
+ text: "t"
+ alternativeKeys: "ţtŧť"
+ }
+ Key {
+ key: Qt.Key_Y
+ text: "y"
+ alternativeKeys: "ÿyýŷ"
+ }
+ Key {
+ key: Qt.Key_U
+ text: "u"
+ alternativeKeys: "űūũûüuùú"
+ }
+ Key {
+ key: Qt.Key_I
+ text: "i"
+ alternativeKeys: "îïīĩiìí"
+ }
+ Key {
+ key: Qt.Key_O
+ text: "o"
+ alternativeKeys: "œøõôöòóo"
+ }
+ Key {
+ key: Qt.Key_P
+ text: "p"
+ }
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ FillerKey {
+ weight: 56
+ }
+ Key {
+ key: Qt.Key_A
+ text: "a"
+ alternativeKeys: "aäåãâàá"
+ }
+ Key {
+ key: Qt.Key_S
+ text: "s"
+ alternativeKeys: "šsşś"
+ }
+ Key {
+ key: Qt.Key_D
+ text: "d"
+ alternativeKeys: "dđď"
+ }
+ Key {
+ key: Qt.Key_F
+ text: "f"
+ }
+ Key {
+ key: Qt.Key_G
+ text: "g"
+ alternativeKeys: "ġgģĝğ"
+ }
+ Key {
+ key: Qt.Key_H
+ text: "h"
+ }
+ Key {
+ key: Qt.Key_J
+ text: "j"
+ }
+ Key {
+ key: Qt.Key_K
+ text: "k"
+ }
+ Key {
+ key: Qt.Key_L
+ text: "l"
+ alternativeKeys: "ĺŀłļľl"
+ }
+ EnterKey {
+ weight: 283
+ }
+ }
+ KeyboardRow {
+ keyWeight: 156
+ InputModeKey {
+ inputModes: [InputEngine.Hebrew, InputEngine.Latin]
+ }
+ Key {
+ key: Qt.Key_Z
+ text: "z"
+ alternativeKeys: "zžż"
+ }
+ Key {
+ key: Qt.Key_X
+ text: "x"
+ }
+ Key {
+ key: Qt.Key_C
+ text: "c"
+ alternativeKeys: "çcċčć"
+ }
+ Key {
+ key: Qt.Key_V
+ text: "v"
+ }
+ Key {
+ key: Qt.Key_B
+ text: "b"
+ }
+ Key {
+ key: Qt.Key_N
+ text: "n"
+ alternativeKeys: "ņńnň"
+ }
+ Key {
+ key: Qt.Key_M
+ text: "m"
+ }
+ Key {
+ key: Qt.Key_Comma
+ text: ","
+ alternativeKeys: ":,;"
+ }
+ Key {
+ key: Qt.Key_Period
+ text: "."
+ alternativeKeys: "!.?"
+ }
+ ShiftKey {
+ weight: 204
+ }
+ }
+ KeyboardRow {
+ keyWeight: 154
+ SymbolModeKey {
+ weight: 217
+ }
+ ChangeLanguageKey {
+ weight: 154
+ }
+ HandwritingModeKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: Qt.Key_Apostrophe
+ text: "'"
+ }
+ Key {
+ key: 0xE000
+ text: ":-)"
+ alternativeKeys: [ ";-)", ":-)", ":-D", ":-(", "<3" ]
+ }
+ HideKeyboardKey {
+ weight: 204
+ }
+ }
+ }
+ }
+}
diff --git a/src/virtualkeyboard/content/layouts/he_IL/symbols.qml b/src/virtualkeyboard/content/layouts/he_IL/symbols.qml
new file mode 100644
index 00000000..866a91a7
--- /dev/null
+++ b/src/virtualkeyboard/content/layouts/he_IL/symbols.qml
@@ -0,0 +1,376 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.Layouts 1.0
+import QtQuick.VirtualKeyboard 2.3
+
+KeyboardLayoutLoader {
+ property bool secondPage
+ onVisibleChanged: if (!visible) secondPage = false
+ sourceComponent: secondPage ? page2 : page1
+ Component {
+ id: page1
+ KeyboardLayout {
+ keyWeight: 160
+ KeyboardRow {
+ Key {
+ key: Qt.Key_1
+ text: "1"
+ }
+ Key {
+ key: Qt.Key_2
+ text: "2"
+ }
+ Key {
+ key: Qt.Key_3
+ text: "3"
+ }
+ Key {
+ key: Qt.Key_4
+ text: "4"
+ }
+ Key {
+ key: Qt.Key_5
+ text: "5"
+ }
+ Key {
+ key: Qt.Key_6
+ text: "6"
+ }
+ Key {
+ key: Qt.Key_7
+ text: "7"
+ }
+ Key {
+ key: Qt.Key_8
+ text: "8"
+ }
+ Key {
+ key: Qt.Key_9
+ text: "9"
+ }
+ Key {
+ key: Qt.Key_0
+ text: "0"
+ }
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ FillerKey {
+ weight: 56
+ }
+ Key {
+ key: Qt.Key_At
+ text: "@"
+ }
+ Key {
+ key: Qt.Key_NumberSign
+ text: "#"
+ }
+ Key {
+ key: Qt.Key_Percent
+ text: "%"
+ }
+ Key {
+ key: Qt.Key_Ampersand
+ text: "&"
+ }
+ Key {
+ key: Qt.Key_Asterisk
+ text: "*"
+ }
+ Key {
+ key: Qt.Key_Minus
+ text: "-"
+ }
+ Key {
+ key: Qt.Key_Plus
+ text: "+"
+ }
+ Key {
+ key: Qt.Key_ParenLeft
+ text: "("
+ }
+ Key {
+ key: Qt.Key_ParenRight
+ text: ")"
+ }
+ EnterKey {
+ weight: 283
+ }
+ }
+ KeyboardRow {
+ keyWeight: 156
+ Key {
+ displayText: "1/2"
+ functionKey: true
+ onClicked: secondPage = !secondPage
+ }
+ Key {
+ key: Qt.Key_Exclam
+ text: "!"
+ }
+ Key {
+ key: Qt.Key_QuoteDbl
+ text: '"'
+ }
+ Key {
+ key: Qt.Key_Less
+ text: "<"
+ }
+ Key {
+ key: Qt.Key_Greater
+ text: ">"
+ }
+ Key {
+ key: Qt.Key_Apostrophe
+ text: "'"
+ }
+ Key {
+ key: Qt.Key_Colon
+ text: ":"
+ }
+ Key {
+ key: Qt.Key_Semicolon
+ text: ";"
+ }
+ Key {
+ key: Qt.Key_Slash
+ text: "/"
+ }
+ Key {
+ key: Qt.Key_Question
+ text: "?"
+ }
+ Key {
+ weight: 204
+ displayText: "1/2"
+ functionKey: true
+ onClicked: secondPage = !secondPage
+ }
+ }
+ KeyboardRow {
+ keyWeight: 154
+ SymbolModeKey {
+ weight: 217
+ displayText: InputContext.inputEngine.inputMode === InputEngine.Hebrew ? "\u05D0\u05D1\u05D2" : "ABC"
+ }
+ ChangeLanguageKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: Qt.Key_Period
+ text: "."
+ alternativeKeys: ".,"
+ }
+ Key {
+ key: 0xE000
+ text: ":-)"
+ alternativeKeys: [ ";-)", ":-)", ":-D", ":-(", "<3" ]
+ }
+ HideKeyboardKey {
+ weight: 204
+ }
+ }
+ }
+ }
+ Component {
+ id: page2
+ KeyboardLayout {
+ keyWeight: 160
+ KeyboardRow {
+ Key {
+ key: Qt.Key_AsciiTilde
+ text: "~"
+ }
+ Key {
+ key: Qt.Key_Agrave
+ text: "`"
+ }
+ Key {
+ key: Qt.Key_Bar
+ text: "|"
+ }
+ Key {
+ key: 0x7B
+ text: "·"
+ }
+ Key {
+ key: 0x221A
+ text: "√"
+ }
+ Key {
+ key: Qt.Key_division
+ text: "÷"
+ }
+ Key {
+ key: Qt.Key_multiply
+ text: "×"
+ }
+ Key {
+ key: Qt.Key_onehalf
+ text: "½"
+ alternativeKeys: "¼⅓½¾⅞"
+ }
+ Key {
+ key: Qt.Key_BraceLeft
+ text: "{"
+ }
+ Key {
+ key: Qt.Key_BraceRight
+ text: "}"
+ }
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ FillerKey {
+ weight: 56
+ }
+ Key {
+ key: Qt.Key_Dollar
+ text: "$"
+ alternativeKeys: "$¢"
+ }
+ Key {
+ key: 0x20AC
+ text: "€"
+ }
+ Key {
+ key: 0xC2
+ text: "£"
+ }
+ Key {
+ text: "₪"
+ }
+ Key {
+ key: 0xA5
+ text: "¥"
+ }
+ Key {
+ key: Qt.Key_Equal
+ text: "="
+ }
+ Key {
+ key: Qt.Key_section
+ text: "§"
+ }
+ Key {
+ key: Qt.Key_BracketLeft
+ text: "["
+ }
+ Key {
+ key: Qt.Key_BracketRight
+ text: "]"
+ }
+ EnterKey {
+ weight: 283
+ }
+ }
+ KeyboardRow {
+ keyWeight: 156
+ Key {
+ displayText: "2/2"
+ functionKey: true
+ onClicked: secondPage = !secondPage
+ }
+ Key {
+ key: Qt.Key_Underscore
+ text: "_"
+ }
+ Key {
+ key: 0x2122
+ text: '™'
+ }
+ Key {
+ key: 0x00AE
+ text: '®'
+ }
+ Key {
+ key: Qt.Key_guillemotleft
+ text: '«'
+ }
+ Key {
+ key: Qt.Key_guillemotright
+ text: '»'
+ }
+ Key {
+ key: 0x201C
+ text: '“'
+ }
+ Key {
+ key: 0x201D
+ text: '”'
+ }
+ Key {
+ key: Qt.Key_Backslash
+ text: "\\"
+ }
+ Key {
+ key: Qt.Key_AsciiCircum
+ text: "^"
+ }
+ Key {
+ weight: 204
+ displayText: "2/2"
+ functionKey: true
+ onClicked: secondPage = !secondPage
+ }
+ }
+ KeyboardRow {
+ keyWeight: 154
+ SymbolModeKey {
+ weight: 217
+ displayText: InputContext.inputEngine.inputMode === InputEngine.Hebrew ? "\u05D0\u05D1\u05D2" : "ABC"
+ }
+ ChangeLanguageKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: 0x2026
+ text: "\u2026"
+ }
+ Key {
+ key: 0xE000
+ text: ":-)"
+ alternativeKeys: [ ";-)", ":-)", ":-D", ":-(", "<3" ]
+ }
+ HideKeyboardKey {
+ weight: 204
+ }
+ }
+ }
+ }
+}
diff --git a/src/virtualkeyboard/content/layouts/hr_HR/handwriting.qml b/src/virtualkeyboard/content/layouts/hr_HR/handwriting.qml
new file mode 100644
index 00000000..6f43e6de
--- /dev/null
+++ b/src/virtualkeyboard/content/layouts/hr_HR/handwriting.qml
@@ -0,0 +1,102 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.Layouts 1.0
+import QtQuick.VirtualKeyboard 2.3
+
+KeyboardLayout {
+ function createInputMethod() {
+ return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.3; HandwritingInputMethod {}', parent)
+ }
+ sharedLayouts: ['symbols']
+ inputMode: InputEngine.Latin
+
+ KeyboardRow {
+ Layout.preferredHeight: 3
+ KeyboardColumn {
+ Layout.preferredWidth: bottomRow.width - hideKeyboardKey.width
+ KeyboardRow {
+ TraceInputKey {
+ objectName: "hwrInputArea"
+ patternRecognitionMode: InputEngine.HandwritingRecoginition
+ }
+ }
+ }
+ KeyboardColumn {
+ Layout.preferredWidth: hideKeyboardKey.width
+ KeyboardRow {
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ EnterKey {}
+ }
+ KeyboardRow {
+ ShiftKey { }
+ }
+ }
+ }
+ KeyboardRow {
+ id: bottomRow
+ Layout.preferredHeight: 1
+ keyWeight: 154
+ InputModeKey {
+ weight: 217
+ }
+ ChangeLanguageKey {
+ weight: 154
+ customLayoutsOnly: true
+ }
+ HandwritingModeKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: Qt.Key_Minus
+ text: "-"
+ alternativeKeys: "<>()#%&*/\\\"'=+-_"
+ }
+ Key {
+ key: Qt.Key_Period
+ text: "."
+ alternativeKeys: ":;,.?!"
+ }
+ Key {
+ key: 0x102
+ text: "ă"
+ alternativeKeys: "ăîâșț"
+ }
+ HideKeyboardKey {
+ id: hideKeyboardKey
+ weight: 204
+ }
+ }
+}
diff --git a/src/virtualkeyboard/content/layouts/hr_HR/main.qml b/src/virtualkeyboard/content/layouts/hr_HR/main.qml
new file mode 100644
index 00000000..6c4c306c
--- /dev/null
+++ b/src/virtualkeyboard/content/layouts/hr_HR/main.qml
@@ -0,0 +1,218 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.VirtualKeyboard 2.3
+
+KeyboardLayout {
+ inputMode: InputEngine.Latin
+ keyWeight: 160
+ KeyboardRow {
+ Key {
+ key: Qt.Key_Q
+ text: "q"
+ }
+ Key {
+ key: Qt.Key_W
+ text: "w"
+ }
+ Key {
+ key: Qt.Key_E
+ text: "e"
+ }
+ Key {
+ key: Qt.Key_R
+ text: "r"
+ }
+ Key {
+ key: Qt.Key_T
+ text: "t"
+ }
+ Key {
+ key: Qt.Key_Z
+ text: "z"
+ }
+ Key {
+ key: Qt.Key_U
+ text: "u"
+ }
+ Key {
+ key: Qt.Key_I
+ text: "i"
+ }
+ Key {
+ key: Qt.Key_O
+ text: "o"
+ alternativeKeys: "oö"
+ }
+ Key {
+ key: Qt.Key_P
+ text: "p"
+ }
+ Key {
+ key: 0x160
+ text: "š"
+ }
+ Key {
+ key: 0x110
+ text: "đ"
+ }
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ FillerKey {
+ weight: 56
+ }
+ Key {
+ key: Qt.Key_A
+ text: "a"
+ alternativeKeys: "aåä"
+ }
+ Key {
+ key: Qt.Key_S
+ text: "s"
+ }
+ Key {
+ key: Qt.Key_D
+ text: "d"
+ }
+ Key {
+ key: Qt.Key_F
+ text: "f"
+ }
+ Key {
+ key: Qt.Key_G
+ text: "g"
+ }
+ Key {
+ key: Qt.Key_H
+ text: "h"
+ }
+ Key {
+ key: Qt.Key_J
+ text: "j"
+ }
+ Key {
+ key: Qt.Key_K
+ text: "k"
+ }
+ Key {
+ key: Qt.Key_L
+ text: "l"
+ }
+ Key {
+ key: 0x10C
+ text: "č"
+ }
+ Key {
+ key: 0x106
+ text: "ć"
+ }
+ EnterKey {
+ weight: 283
+ }
+ }
+ KeyboardRow {
+ keyWeight: 156
+ ShiftKey {
+ weight: 166
+ }
+ Key {
+ key: Qt.Key_Y
+ text: "y"
+ }
+ Key {
+ key: Qt.Key_X
+ text: "x"
+ }
+ Key {
+ key: Qt.Key_C
+ text: "c"
+ }
+ Key {
+ key: Qt.Key_V
+ text: "v"
+ }
+ Key {
+ key: Qt.Key_B
+ text: "b"
+ }
+ Key {
+ key: Qt.Key_N
+ text: "n"
+ }
+ Key {
+ key: Qt.Key_M
+ text: "m"
+ }
+ Key {
+ key: 0x17D
+ text: "ž"
+ }
+ Key {
+ key: Qt.Key_Comma
+ text: ","
+ }
+ Key {
+ key: Qt.Key_Period
+ text: "."
+ }
+ ShiftKey {
+ weight: 234
+ }
+ }
+ KeyboardRow {
+ keyWeight: 154
+ SymbolModeKey {
+ weight: 217
+ }
+ ChangeLanguageKey {
+ weight: 154
+ }
+ HandwritingModeKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: Qt.Key_Minus
+ text: "-"
+ alternativeKeys: [ "-", "\"", "'" ]
+ }
+ Key {
+ key: 0xE000
+ text: ":-)"
+ alternativeKeys: [ ";-)", ":-)", ":-D", ":-(", "<3" ]
+ }
+ HideKeyboardKey {
+ weight: 204
+ }
+ }
+}
diff --git a/src/virtualkeyboard/content/layouts/hr_HR/symbols.qml b/src/virtualkeyboard/content/layouts/hr_HR/symbols.qml
new file mode 100644
index 00000000..76c06493
--- /dev/null
+++ b/src/virtualkeyboard/content/layouts/hr_HR/symbols.qml
@@ -0,0 +1,376 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.Layouts 1.0
+import QtQuick.VirtualKeyboard 2.3
+
+KeyboardLayoutLoader {
+ property bool secondPage
+ onVisibleChanged: if (!visible) secondPage = false
+ sourceComponent: secondPage ? page2 : page1
+ Component {
+ id: page1
+ KeyboardLayout {
+ keyWeight: 160
+ KeyboardRow {
+ Key {
+ key: Qt.Key_1
+ text: "1"
+ }
+ Key {
+ key: Qt.Key_2
+ text: "2"
+ }
+ Key {
+ key: Qt.Key_3
+ text: "3"
+ }
+ Key {
+ key: Qt.Key_4
+ text: "4"
+ }
+ Key {
+ key: Qt.Key_5
+ text: "5"
+ }
+ Key {
+ key: Qt.Key_6
+ text: "6"
+ }
+ Key {
+ key: Qt.Key_7
+ text: "7"
+ }
+ Key {
+ key: Qt.Key_8
+ text: "8"
+ }
+ Key {
+ key: Qt.Key_9
+ text: "9"
+ }
+ Key {
+ key: Qt.Key_0
+ text: "0"
+ }
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ FillerKey {
+ weight: 56
+ }
+ Key {
+ key: Qt.Key_At
+ text: "@"
+ }
+ Key {
+ key: Qt.Key_NumberSign
+ text: "#"
+ }
+ Key {
+ key: Qt.Key_Percent
+ text: "%"
+ }
+ Key {
+ key: Qt.Key_Ampersand
+ text: "&"
+ }
+ Key {
+ key: Qt.Key_Asterisk
+ text: "*"
+ }
+ Key {
+ key: Qt.Key_Minus
+ text: "-"
+ }
+ Key {
+ key: Qt.Key_Plus
+ text: "+"
+ }
+ Key {
+ key: Qt.Key_ParenLeft
+ text: "("
+ }
+ Key {
+ key: Qt.Key_ParenRight
+ text: ")"
+ }
+ EnterKey {
+ weight: 283
+ }
+ }
+ KeyboardRow {
+ keyWeight: 156
+ Key {
+ displayText: "1/2"
+ functionKey: true
+ onClicked: secondPage = !secondPage
+ }
+ Key {
+ key: Qt.Key_Exclam
+ text: "!"
+ }
+ Key {
+ key: Qt.Key_QuoteDbl
+ text: '"'
+ }
+ Key {
+ key: Qt.Key_Apostrophe
+ text: "'"
+ }
+ Key {
+ key: Qt.Key_Less
+ text: "<"
+ }
+ Key {
+ key: Qt.Key_Greater
+ text: ">"
+ }
+ Key {
+ key: Qt.Key_Colon
+ text: ":"
+ }
+ Key {
+ key: Qt.Key_Semicolon
+ text: ";"
+ }
+ Key {
+ key: Qt.Key_Slash
+ text: "/"
+ }
+ Key {
+ key: Qt.Key_Question
+ text: "?"
+ }
+ Key {
+ weight: 204
+ displayText: "1/2"
+ functionKey: true
+ onClicked: secondPage = !secondPage
+ }
+ }
+ KeyboardRow {
+ keyWeight: 154
+ SymbolModeKey {
+ weight: 217
+ displayText: "ABC"
+ }
+ ChangeLanguageKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: Qt.Key_Period
+ text: "."
+ alternativeKeys: ".,"
+ }
+ Key {
+ key: 0xE000
+ text: ":-)"
+ alternativeKeys: [ ";-)", ":-)", ":-D", ":-(", "<3" ]
+ }
+ HideKeyboardKey {
+ weight: 204
+ }
+ }
+ }
+ }
+ Component {
+ id: page2
+ KeyboardLayout {
+ keyWeight: 160
+ KeyboardRow {
+ Key {
+ key: Qt.Key_AsciiTilde
+ text: "~"
+ }
+ Key {
+ key: Qt.Key_Agrave
+ text: "`"
+ }
+ Key {
+ key: Qt.Key_Bar
+ text: "|"
+ }
+ Key {
+ key: 0x7B
+ text: "·"
+ }
+ Key {
+ key: 0x221A
+ text: "√"
+ }
+ Key {
+ key: Qt.Key_division
+ text: "÷"
+ }
+ Key {
+ key: Qt.Key_multiply
+ text: "×"
+ }
+ Key {
+ key: Qt.Key_onehalf
+ text: "½"
+ alternativeKeys: "¼⅓½¾⅞"
+ }
+ Key {
+ key: Qt.Key_BraceLeft
+ text: "{"
+ }
+ Key {
+ key: Qt.Key_BraceRight
+ text: "}"
+ }
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ FillerKey {
+ weight: 56
+ }
+ Key {
+ key: Qt.Key_Dollar
+ text: "$"
+ }
+ Key {
+ key: 0x20AC
+ text: "€"
+ }
+ Key {
+ key: 0xC2
+ text: "£"
+ }
+ Key {
+ key: 0xA2
+ text: "¢"
+ }
+ Key {
+ key: 0xA5
+ text: "¥"
+ }
+ Key {
+ key: Qt.Key_Equal
+ text: "="
+ }
+ Key {
+ key: Qt.Key_section
+ text: "§"
+ }
+ Key {
+ key: Qt.Key_BracketLeft
+ text: "["
+ }
+ Key {
+ key: Qt.Key_BracketRight
+ text: "]"
+ }
+ EnterKey {
+ weight: 283
+ }
+ }
+ KeyboardRow {
+ keyWeight: 156
+ Key {
+ displayText: "2/2"
+ functionKey: true
+ onClicked: secondPage = !secondPage
+ }
+ Key {
+ key: Qt.Key_Underscore
+ text: "_"
+ }
+ Key {
+ key: 0x2122
+ text: '™'
+ }
+ Key {
+ key: 0x00AE
+ text: '®'
+ }
+ Key {
+ key: Qt.Key_guillemotleft
+ text: '«'
+ }
+ Key {
+ key: Qt.Key_guillemotright
+ text: '»'
+ }
+ Key {
+ key: 0x201C
+ text: '“'
+ }
+ Key {
+ key: 0x201D
+ text: '”'
+ }
+ Key {
+ key: Qt.Key_Backslash
+ text: "\\"
+ }
+ Key {
+ key: Qt.Key_AsciiCircum
+ text: "^"
+ }
+ Key {
+ weight: 204
+ displayText: "2/2"
+ functionKey: true
+ onClicked: secondPage = !secondPage
+ }
+ }
+ KeyboardRow {
+ keyWeight: 154
+ SymbolModeKey {
+ weight: 217
+ displayText: "ABC"
+ }
+ ChangeLanguageKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: 0x2026
+ text: "\u2026"
+ }
+ Key {
+ key: 0xE000
+ text: ":-)"
+ alternativeKeys: [ ";-)", ":-)", ":-D", ":-(", "<3" ]
+ }
+ HideKeyboardKey {
+ weight: 204
+ }
+ }
+ }
+ }
+}
diff --git a/src/virtualkeyboard/content/layouts/hu_HU/handwriting.qml b/src/virtualkeyboard/content/layouts/hu_HU/handwriting.qml
new file mode 100644
index 00000000..a8d3b59b
--- /dev/null
+++ b/src/virtualkeyboard/content/layouts/hu_HU/handwriting.qml
@@ -0,0 +1,97 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.Layouts 1.0
+import QtQuick.VirtualKeyboard 2.3
+
+KeyboardLayout {
+ function createInputMethod() {
+ return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.3; HandwritingInputMethod {}', parent)
+ }
+ sharedLayouts: ['symbols']
+ inputMode: InputEngine.Latin
+
+ KeyboardRow {
+ Layout.preferredHeight: 3
+ KeyboardColumn {
+ Layout.preferredWidth: bottomRow.width - hideKeyboardKey.width
+ KeyboardRow {
+ TraceInputKey {
+ objectName: "hwrInputArea"
+ patternRecognitionMode: InputEngine.HandwritingRecoginition
+ }
+ }
+ }
+ KeyboardColumn {
+ Layout.preferredWidth: hideKeyboardKey.width
+ KeyboardRow {
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ EnterKey {}
+ }
+ KeyboardRow {
+ ShiftKey { }
+ }
+ }
+ }
+ KeyboardRow {
+ id: bottomRow
+ Layout.preferredHeight: 1
+ keyWeight: 154
+ InputModeKey {
+ weight: 217
+ }
+ ChangeLanguageKey {
+ weight: 154
+ customLayoutsOnly: true
+ }
+ HandwritingModeKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: Qt.Key_Minus
+ text: "-"
+ alternativeKeys: "<>()#%&*/\\\"'=+-_"
+ }
+ Key {
+ key: Qt.Key_Period
+ text: "."
+ alternativeKeys: ":;,.?!"
+ }
+ HideKeyboardKey {
+ id: hideKeyboardKey
+ weight: 204
+ }
+ }
+}
diff --git a/src/virtualkeyboard/content/layouts/hu_HU/main.qml b/src/virtualkeyboard/content/layouts/hu_HU/main.qml
new file mode 100644
index 00000000..21a513a3
--- /dev/null
+++ b/src/virtualkeyboard/content/layouts/hu_HU/main.qml
@@ -0,0 +1,201 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.VirtualKeyboard 2.3
+
+KeyboardLayout {
+ inputMode: InputEngine.Latin
+ keyWeight: 160
+ KeyboardRow {
+ Key {
+ key: Qt.Key_Q
+ text: "q"
+ }
+ Key {
+ key: Qt.Key_W
+ text: "w"
+ }
+ Key {
+ key: Qt.Key_E
+ text: "e"
+ alternativeKeys: "eé"
+ }
+ Key {
+ key: Qt.Key_R
+ text: "r"
+ }
+ Key {
+ key: Qt.Key_T
+ text: "t"
+ }
+ Key {
+ key: Qt.Key_Z
+ text: "z"
+ alternativeKeys: "zž"
+ }
+ Key {
+ key: Qt.Key_U
+ text: "u"
+ alternativeKeys: "úűuü"
+ }
+ Key {
+ key: Qt.Key_I
+ text: "i"
+ alternativeKeys: "ií"
+ }
+ Key {
+ key: Qt.Key_O
+ text: "o"
+ alternativeKeys: "óőoö"
+ }
+ Key {
+ key: Qt.Key_P
+ text: "p"
+ }
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ FillerKey {
+ weight: 56
+ }
+ Key {
+ key: Qt.Key_A
+ text: "a"
+ alternativeKeys: "aåäá"
+ }
+ Key {
+ key: Qt.Key_S
+ text: "s"
+ alternativeKeys: "sš"
+ }
+ Key {
+ key: Qt.Key_D
+ text: "d"
+ }
+ Key {
+ key: Qt.Key_F
+ text: "f"
+ }
+ Key {
+ key: Qt.Key_G
+ text: "g"
+ }
+ Key {
+ key: Qt.Key_H
+ text: "h"
+ }
+ Key {
+ key: Qt.Key_J
+ text: "j"
+ }
+ Key {
+ key: Qt.Key_K
+ text: "k"
+ }
+ Key {
+ key: Qt.Key_L
+ text: "l"
+ }
+ EnterKey {
+ weight: 283
+ }
+ }
+ KeyboardRow {
+ keyWeight: 156
+ ShiftKey {}
+ Key {
+ key: Qt.Key_Y
+ text: "y"
+ }
+ Key {
+ key: Qt.Key_X
+ text: "x"
+ }
+ Key {
+ key: Qt.Key_C
+ text: "c"
+ }
+ Key {
+ key: Qt.Key_V
+ text: "v"
+ }
+ Key {
+ key: Qt.Key_B
+ text: "b"
+ }
+ Key {
+ key: Qt.Key_N
+ text: "n"
+ }
+ Key {
+ key: Qt.Key_M
+ text: "m"
+ }
+ Key {
+ key: Qt.Key_Comma
+ text: ","
+ }
+ Key {
+ key: Qt.Key_Period
+ text: "."
+ }
+ ShiftKey {
+ weight: 204
+ }
+ }
+ KeyboardRow {
+ keyWeight: 154
+ SymbolModeKey {
+ weight: 217
+ }
+ ChangeLanguageKey {
+ weight: 154
+ }
+ HandwritingModeKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: Qt.Key_Minus
+ text: "-"
+ alternativeKeys: "-\"'"
+ }
+ Key {
+ key: 0xE000
+ text: ":-)"
+ alternativeKeys: [ ";-)", ":-)", ":-D", ":-(", "<3" ]
+ }
+ HideKeyboardKey {
+ weight: 204
+ }
+ }
+}
diff --git a/src/virtualkeyboard/content/layouts/hu_HU/symbols.qml b/src/virtualkeyboard/content/layouts/hu_HU/symbols.qml
new file mode 100644
index 00000000..76c06493
--- /dev/null
+++ b/src/virtualkeyboard/content/layouts/hu_HU/symbols.qml
@@ -0,0 +1,376 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.Layouts 1.0
+import QtQuick.VirtualKeyboard 2.3
+
+KeyboardLayoutLoader {
+ property bool secondPage
+ onVisibleChanged: if (!visible) secondPage = false
+ sourceComponent: secondPage ? page2 : page1
+ Component {
+ id: page1
+ KeyboardLayout {
+ keyWeight: 160
+ KeyboardRow {
+ Key {
+ key: Qt.Key_1
+ text: "1"
+ }
+ Key {
+ key: Qt.Key_2
+ text: "2"
+ }
+ Key {
+ key: Qt.Key_3
+ text: "3"
+ }
+ Key {
+ key: Qt.Key_4
+ text: "4"
+ }
+ Key {
+ key: Qt.Key_5
+ text: "5"
+ }
+ Key {
+ key: Qt.Key_6
+ text: "6"
+ }
+ Key {
+ key: Qt.Key_7
+ text: "7"
+ }
+ Key {
+ key: Qt.Key_8
+ text: "8"
+ }
+ Key {
+ key: Qt.Key_9
+ text: "9"
+ }
+ Key {
+ key: Qt.Key_0
+ text: "0"
+ }
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ FillerKey {
+ weight: 56
+ }
+ Key {
+ key: Qt.Key_At
+ text: "@"
+ }
+ Key {
+ key: Qt.Key_NumberSign
+ text: "#"
+ }
+ Key {
+ key: Qt.Key_Percent
+ text: "%"
+ }
+ Key {
+ key: Qt.Key_Ampersand
+ text: "&"
+ }
+ Key {
+ key: Qt.Key_Asterisk
+ text: "*"
+ }
+ Key {
+ key: Qt.Key_Minus
+ text: "-"
+ }
+ Key {
+ key: Qt.Key_Plus
+ text: "+"
+ }
+ Key {
+ key: Qt.Key_ParenLeft
+ text: "("
+ }
+ Key {
+ key: Qt.Key_ParenRight
+ text: ")"
+ }
+ EnterKey {
+ weight: 283
+ }
+ }
+ KeyboardRow {
+ keyWeight: 156
+ Key {
+ displayText: "1/2"
+ functionKey: true
+ onClicked: secondPage = !secondPage
+ }
+ Key {
+ key: Qt.Key_Exclam
+ text: "!"
+ }
+ Key {
+ key: Qt.Key_QuoteDbl
+ text: '"'
+ }
+ Key {
+ key: Qt.Key_Apostrophe
+ text: "'"
+ }
+ Key {
+ key: Qt.Key_Less
+ text: "<"
+ }
+ Key {
+ key: Qt.Key_Greater
+ text: ">"
+ }
+ Key {
+ key: Qt.Key_Colon
+ text: ":"
+ }
+ Key {
+ key: Qt.Key_Semicolon
+ text: ";"
+ }
+ Key {
+ key: Qt.Key_Slash
+ text: "/"
+ }
+ Key {
+ key: Qt.Key_Question
+ text: "?"
+ }
+ Key {
+ weight: 204
+ displayText: "1/2"
+ functionKey: true
+ onClicked: secondPage = !secondPage
+ }
+ }
+ KeyboardRow {
+ keyWeight: 154
+ SymbolModeKey {
+ weight: 217
+ displayText: "ABC"
+ }
+ ChangeLanguageKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: Qt.Key_Period
+ text: "."
+ alternativeKeys: ".,"
+ }
+ Key {
+ key: 0xE000
+ text: ":-)"
+ alternativeKeys: [ ";-)", ":-)", ":-D", ":-(", "<3" ]
+ }
+ HideKeyboardKey {
+ weight: 204
+ }
+ }
+ }
+ }
+ Component {
+ id: page2
+ KeyboardLayout {
+ keyWeight: 160
+ KeyboardRow {
+ Key {
+ key: Qt.Key_AsciiTilde
+ text: "~"
+ }
+ Key {
+ key: Qt.Key_Agrave
+ text: "`"
+ }
+ Key {
+ key: Qt.Key_Bar
+ text: "|"
+ }
+ Key {
+ key: 0x7B
+ text: "·"
+ }
+ Key {
+ key: 0x221A
+ text: "√"
+ }
+ Key {
+ key: Qt.Key_division
+ text: "÷"
+ }
+ Key {
+ key: Qt.Key_multiply
+ text: "×"
+ }
+ Key {
+ key: Qt.Key_onehalf
+ text: "½"
+ alternativeKeys: "¼⅓½¾⅞"
+ }
+ Key {
+ key: Qt.Key_BraceLeft
+ text: "{"
+ }
+ Key {
+ key: Qt.Key_BraceRight
+ text: "}"
+ }
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ FillerKey {
+ weight: 56
+ }
+ Key {
+ key: Qt.Key_Dollar
+ text: "$"
+ }
+ Key {
+ key: 0x20AC
+ text: "€"
+ }
+ Key {
+ key: 0xC2
+ text: "£"
+ }
+ Key {
+ key: 0xA2
+ text: "¢"
+ }
+ Key {
+ key: 0xA5
+ text: "¥"
+ }
+ Key {
+ key: Qt.Key_Equal
+ text: "="
+ }
+ Key {
+ key: Qt.Key_section
+ text: "§"
+ }
+ Key {
+ key: Qt.Key_BracketLeft
+ text: "["
+ }
+ Key {
+ key: Qt.Key_BracketRight
+ text: "]"
+ }
+ EnterKey {
+ weight: 283
+ }
+ }
+ KeyboardRow {
+ keyWeight: 156
+ Key {
+ displayText: "2/2"
+ functionKey: true
+ onClicked: secondPage = !secondPage
+ }
+ Key {
+ key: Qt.Key_Underscore
+ text: "_"
+ }
+ Key {
+ key: 0x2122
+ text: '™'
+ }
+ Key {
+ key: 0x00AE
+ text: '®'
+ }
+ Key {
+ key: Qt.Key_guillemotleft
+ text: '«'
+ }
+ Key {
+ key: Qt.Key_guillemotright
+ text: '»'
+ }
+ Key {
+ key: 0x201C
+ text: '“'
+ }
+ Key {
+ key: 0x201D
+ text: '”'
+ }
+ Key {
+ key: Qt.Key_Backslash
+ text: "\\"
+ }
+ Key {
+ key: Qt.Key_AsciiCircum
+ text: "^"
+ }
+ Key {
+ weight: 204
+ displayText: "2/2"
+ functionKey: true
+ onClicked: secondPage = !secondPage
+ }
+ }
+ KeyboardRow {
+ keyWeight: 154
+ SymbolModeKey {
+ weight: 217
+ displayText: "ABC"
+ }
+ ChangeLanguageKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: 0x2026
+ text: "\u2026"
+ }
+ Key {
+ key: 0xE000
+ text: ":-)"
+ alternativeKeys: [ ";-)", ":-)", ":-D", ":-(", "<3" ]
+ }
+ HideKeyboardKey {
+ weight: 204
+ }
+ }
+ }
+ }
+}
diff --git a/src/virtualkeyboard/content/layouts/it_IT/handwriting.qml b/src/virtualkeyboard/content/layouts/it_IT/handwriting.qml
index 8f3672c9..d42de535 100644
--- a/src/virtualkeyboard/content/layouts/it_IT/handwriting.qml
+++ b/src/virtualkeyboard/content/layouts/it_IT/handwriting.qml
@@ -29,11 +29,11 @@
import QtQuick 2.0
import QtQuick.Layouts 1.0
-import QtQuick.VirtualKeyboard 2.1
+import QtQuick.VirtualKeyboard 2.3
KeyboardLayout {
function createInputMethod() {
- return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.1; HandwritingInputMethod {}', parent)
+ return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.3; HandwritingInputMethod {}', parent)
}
sharedLayouts: ['symbols']
inputMode: InputEngine.Latin
@@ -66,15 +66,8 @@ KeyboardLayout {
id: bottomRow
Layout.preferredHeight: 1
keyWeight: 154
- Key {
+ InputModeKey {
weight: 217
- key: Qt.Key_Mode_switch
- noKeyEvent: true
- functionKey: true
- text: InputContext.inputEngine.inputMode === InputEngine.Latin ? "123" : "ABC"
- onClicked: InputContext.inputEngine.inputMode = InputContext.inputEngine.inputMode === InputEngine.Latin ? InputEngine.Numeric : InputEngine.Latin
- enabled: !(InputContext.inputMethodHints & (Qt.ImhDialableCharactersOnly | Qt.ImhFormattedNumbersOnly | Qt.ImhDigitsOnly))
- keyPanelDelegate: keyboard.style ? keyboard.style.symbolKeyPanel : undefined
}
ChangeLanguageKey {
weight: 154
diff --git a/src/virtualkeyboard/content/layouts/ja_JP/handwriting.qml b/src/virtualkeyboard/content/layouts/ja_JP/handwriting.qml
new file mode 100644
index 00000000..9fe3b191
--- /dev/null
+++ b/src/virtualkeyboard/content/layouts/ja_JP/handwriting.qml
@@ -0,0 +1,99 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.Layouts 1.0
+import QtQuick.VirtualKeyboard 2.3
+
+KeyboardLayout {
+ function createInputMethod() {
+ return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.3; HandwritingInputMethod {}', parent)
+ }
+ sharedLayouts: ['symbols']
+ KeyboardRow {
+ Layout.preferredHeight: 3
+ KeyboardColumn {
+ Layout.preferredWidth: bottomRow.width - hideKeyboardKey.width
+ KeyboardRow {
+ TraceInputKey {
+ objectName: "hwrInputArea"
+ patternRecognitionMode: InputEngine.HandwritingRecoginition
+ horizontalRulers:
+ InputContext.inputEngine.inputMode !== InputEngine.JapaneseHandwriting ? [] :
+ [Math.round(boundingBox.height / 4), Math.round(boundingBox.height / 4) * 2, Math.round(boundingBox.height / 4) * 3]
+
+ }
+ }
+ }
+ KeyboardColumn {
+ Layout.preferredWidth: hideKeyboardKey.width
+ KeyboardRow {
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ EnterKey {}
+ }
+ KeyboardRow {
+ ShiftKey { }
+ }
+ }
+ }
+ KeyboardRow {
+ id: bottomRow
+ Layout.preferredHeight: 1
+ keyWeight: 154
+ InputModeKey {
+ weight: 217
+ }
+ ChangeLanguageKey {
+ weight: 154
+ customLayoutsOnly: true
+ }
+ HandwritingModeKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: Qt.Key_Apostrophe
+ text: "‘"
+ alternativeKeys: "《》〈〉•…々〆‘’“”「」¥"
+ }
+ Key {
+ key: Qt.Key_Period
+ text: "."
+ alternativeKeys: ":;,.、。?!"
+ }
+ HideKeyboardKey {
+ id: hideKeyboardKey
+ weight: 204
+ }
+ }
+}
diff --git a/src/virtualkeyboard/content/layouts/ja_JP/main.qml b/src/virtualkeyboard/content/layouts/ja_JP/main.qml
index 84baba97..2d765d36 100644
--- a/src/virtualkeyboard/content/layouts/ja_JP/main.qml
+++ b/src/virtualkeyboard/content/layouts/ja_JP/main.qml
@@ -28,11 +28,11 @@
****************************************************************************/
import QtQuick 2.0
-import QtQuick.VirtualKeyboard 2.1
+import QtQuick.VirtualKeyboard 2.3
KeyboardLayoutLoader {
function createInputMethod() {
- return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.1; JapaneseInputMethod {}', parent, "japaneseInputMethod")
+ return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.3; JapaneseInputMethod {}', parent, "japaneseInputMethod")
}
sharedLayouts: ['symbols']
sourceComponent: InputContext.inputEngine.inputMode === InputEngine.FullwidthLatin ? page2 : page1
@@ -129,38 +129,20 @@ KeyboardLayoutLoader {
}
KeyboardRow {
keyWeight: 156
- Key {
- key: Qt.Key_Mode_switch
- noKeyEvent: true
- functionKey: true
- enabled: !(InputContext.inputMethodHints & Qt.ImhLatinOnly)
- displayText: {
- switch (InputContext.inputEngine.inputMode) {
- case InputEngine.Latin:
- return "\u534A\u89D2"
- case InputEngine.Hiragana:
- return "\u3042"
- case InputEngine.Katakana:
- return "\u30AB"
- default:
- return ""
- }
- }
- onClicked: {
- switch (InputContext.inputEngine.inputMode) {
- case InputEngine.Latin:
- InputContext.inputEngine.inputMode = InputEngine.FullwidthLatin
- break
- case InputEngine.Hiragana:
- InputContext.inputEngine.inputMode = InputEngine.Katakana
- break
- case InputEngine.Katakana:
- InputContext.inputEngine.inputMode = InputEngine.Latin
- break
- default:
- break
- }
- }
+ InputModeKey {
+ enabled: !(InputContext.inputMethodHints & Qt.ImhLatinOnly) && inputModeCount > 1
+ inputModeNameList: [
+ "半角", // InputEngine.Latin
+ "", // InputEngine.Numeric
+ "", // InputEngine.Dialable
+ "", // InputEngine.Pinyin
+ "", // InputEngine.Cangjie
+ "", // InputEngine.Zhuyin
+ "", // InputEngine.Hangul
+ "あ", // InputEngine.Hiragana
+ "カ", // InputEngine.Katakana
+ "全角", // InputEngine.FullwidthLatin
+ ]
}
Key {
key: Qt.Key_Z
@@ -207,10 +189,11 @@ KeyboardLayoutLoader {
KeyboardRow {
keyWeight: 154
SymbolModeKey {
- weight: 217
+ weight: 194
}
ChangeLanguageKey {
- weight: 174
+ }
+ HandwritingModeKey {
}
Key {
key: Qt.Key_Left
@@ -349,12 +332,7 @@ KeyboardLayoutLoader {
}
KeyboardRow {
keyWeight: 156
- Key {
- key: Qt.Key_Mode_switch
- noKeyEvent: true
- functionKey: true
- displayText: "\u5168\u89D2"
- onClicked: InputContext.inputEngine.inputMode = InputEngine.Hiragana
+ InputModeKey {
}
Key {
key: Qt.Key_Z
@@ -401,10 +379,11 @@ KeyboardLayoutLoader {
KeyboardRow {
keyWeight: 154
SymbolModeKey {
- weight: 217
+ weight: 194
}
ChangeLanguageKey {
- weight: 174
+ }
+ HandwritingModeKey {
}
Key {
key: Qt.Key_Left
diff --git a/src/virtualkeyboard/content/layouts/ko_KR/handwriting.qml b/src/virtualkeyboard/content/layouts/ko_KR/handwriting.qml
new file mode 100644
index 00000000..58fb566b
--- /dev/null
+++ b/src/virtualkeyboard/content/layouts/ko_KR/handwriting.qml
@@ -0,0 +1,118 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.Layouts 1.0
+import QtQuick.VirtualKeyboard 2.3
+
+KeyboardLayout {
+ function createInputMethod() {
+ return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.3; HandwritingInputMethod {}', parent)
+ }
+ sharedLayouts: ['symbols']
+ inputMode: preferredInputMode()
+
+ Connections {
+ target: InputContext
+ onInputMethodHintsChanged: {
+ var newInputMode = preferredInputMode()
+ if (InputContext.inputEngine.inputModes.indexOf(newInputMode) !== -1)
+ InputContext.inputEngine.inputMode = newInputMode
+ }
+ }
+
+ function preferredInputMode() {
+ return InputContext.inputMethodHints &
+ (Qt.ImhPreferLatin | Qt.ImhEmailCharactersOnly | Qt.ImhUrlCharactersOnly |
+ Qt.ImhLatinOnly) ? InputEngine.Latin : InputEngine.KoreanHandwriting
+ }
+
+ KeyboardRow {
+ Layout.preferredHeight: 3
+ KeyboardColumn {
+ Layout.preferredWidth: bottomRow.width - hideKeyboardKey.width
+ KeyboardRow {
+ TraceInputKey {
+ objectName: "hwrInputArea"
+ patternRecognitionMode: InputEngine.HandwritingRecoginition
+ horizontalRulers:
+ InputContext.inputEngine.inputMode !== InputEngine.KoreanHandwriting ? [] :
+ [Math.round(boundingBox.height / 4), Math.round(boundingBox.height / 4) * 2, Math.round(boundingBox.height / 4) * 3]
+
+ }
+ }
+ }
+ KeyboardColumn {
+ Layout.preferredWidth: hideKeyboardKey.width
+ KeyboardRow {
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ EnterKey {}
+ }
+ KeyboardRow {
+ ShiftKey {
+ enabled: InputContext.inputEngine.inputMode !== InputEngine.KoreanHandwriting
+ }
+ }
+ }
+ }
+ KeyboardRow {
+ id: bottomRow
+ Layout.preferredHeight: 1
+ keyWeight: 154
+ InputModeKey {
+ weight: 217
+ }
+ ChangeLanguageKey {
+ weight: 154
+ customLayoutsOnly: true
+ }
+ HandwritingModeKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: Qt.Key_Apostrophe
+ text: "'"
+ alternativeKeys: "<>()#%&*/\\\"'=+-_"
+ }
+ Key {
+ key: Qt.Key_Period
+ text: "."
+ alternativeKeys: ":;,.?!"
+ }
+ HideKeyboardKey {
+ id: hideKeyboardKey
+ weight: 204
+ }
+ }
+}
diff --git a/src/virtualkeyboard/content/layouts/ko_KR/main.qml b/src/virtualkeyboard/content/layouts/ko_KR/main.qml
index 8c9e6fcb..525a0392 100644
--- a/src/virtualkeyboard/content/layouts/ko_KR/main.qml
+++ b/src/virtualkeyboard/content/layouts/ko_KR/main.qml
@@ -152,6 +152,9 @@ KeyboardLayoutLoader {
ChangeLanguageKey {
weight: 154
}
+ HandwritingModeKey {
+ weight: 154
+ }
SpaceKey {
weight: 864
}
@@ -286,6 +289,9 @@ KeyboardLayoutLoader {
ChangeLanguageKey {
weight: 154
}
+ HandwritingModeKey {
+ weight: 154
+ }
SpaceKey {
weight: 864
}
diff --git a/src/virtualkeyboard/content/layouts/nb_NO/handwriting.qml b/src/virtualkeyboard/content/layouts/nb_NO/handwriting.qml
index 8f3672c9..d42de535 100644
--- a/src/virtualkeyboard/content/layouts/nb_NO/handwriting.qml
+++ b/src/virtualkeyboard/content/layouts/nb_NO/handwriting.qml
@@ -29,11 +29,11 @@
import QtQuick 2.0
import QtQuick.Layouts 1.0
-import QtQuick.VirtualKeyboard 2.1
+import QtQuick.VirtualKeyboard 2.3
KeyboardLayout {
function createInputMethod() {
- return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.1; HandwritingInputMethod {}', parent)
+ return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.3; HandwritingInputMethod {}', parent)
}
sharedLayouts: ['symbols']
inputMode: InputEngine.Latin
@@ -66,15 +66,8 @@ KeyboardLayout {
id: bottomRow
Layout.preferredHeight: 1
keyWeight: 154
- Key {
+ InputModeKey {
weight: 217
- key: Qt.Key_Mode_switch
- noKeyEvent: true
- functionKey: true
- text: InputContext.inputEngine.inputMode === InputEngine.Latin ? "123" : "ABC"
- onClicked: InputContext.inputEngine.inputMode = InputContext.inputEngine.inputMode === InputEngine.Latin ? InputEngine.Numeric : InputEngine.Latin
- enabled: !(InputContext.inputMethodHints & (Qt.ImhDialableCharactersOnly | Qt.ImhFormattedNumbersOnly | Qt.ImhDigitsOnly))
- keyPanelDelegate: keyboard.style ? keyboard.style.symbolKeyPanel : undefined
}
ChangeLanguageKey {
weight: 154
diff --git a/src/virtualkeyboard/content/layouts/nl_NL/handwriting.qml b/src/virtualkeyboard/content/layouts/nl_NL/handwriting.qml
new file mode 100644
index 00000000..d42de535
--- /dev/null
+++ b/src/virtualkeyboard/content/layouts/nl_NL/handwriting.qml
@@ -0,0 +1,97 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.Layouts 1.0
+import QtQuick.VirtualKeyboard 2.3
+
+KeyboardLayout {
+ function createInputMethod() {
+ return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.3; HandwritingInputMethod {}', parent)
+ }
+ sharedLayouts: ['symbols']
+ inputMode: InputEngine.Latin
+
+ KeyboardRow {
+ Layout.preferredHeight: 3
+ KeyboardColumn {
+ Layout.preferredWidth: bottomRow.width - hideKeyboardKey.width
+ KeyboardRow {
+ TraceInputKey {
+ objectName: "hwrInputArea"
+ patternRecognitionMode: InputEngine.HandwritingRecoginition
+ }
+ }
+ }
+ KeyboardColumn {
+ Layout.preferredWidth: hideKeyboardKey.width
+ KeyboardRow {
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ EnterKey {}
+ }
+ KeyboardRow {
+ ShiftKey { }
+ }
+ }
+ }
+ KeyboardRow {
+ id: bottomRow
+ Layout.preferredHeight: 1
+ keyWeight: 154
+ InputModeKey {
+ weight: 217
+ }
+ ChangeLanguageKey {
+ weight: 154
+ customLayoutsOnly: true
+ }
+ HandwritingModeKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: Qt.Key_Apostrophe
+ text: "'"
+ alternativeKeys: "<>()#%&*/\\\"'=+-_"
+ }
+ Key {
+ key: Qt.Key_Period
+ text: "."
+ alternativeKeys: ":;,.?!"
+ }
+ HideKeyboardKey {
+ id: hideKeyboardKey
+ weight: 204
+ }
+ }
+}
diff --git a/src/virtualkeyboard/content/layouts/nl_NL/main.qml b/src/virtualkeyboard/content/layouts/nl_NL/main.qml
new file mode 100644
index 00000000..1deb766a
--- /dev/null
+++ b/src/virtualkeyboard/content/layouts/nl_NL/main.qml
@@ -0,0 +1,199 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.VirtualKeyboard 2.1
+
+KeyboardLayout {
+ inputMode: InputEngine.Latin
+ keyWeight: 160
+ KeyboardRow {
+ Key {
+ key: Qt.Key_Q
+ text: "q"
+ }
+ Key {
+ key: Qt.Key_W
+ text: "w"
+ }
+ Key {
+ key: Qt.Key_E
+ text: "e"
+ alternativeKeys: "êeëèé"
+ }
+ Key {
+ key: Qt.Key_R
+ text: "r"
+ }
+ Key {
+ key: Qt.Key_T
+ text: "t"
+ }
+ Key {
+ key: Qt.Key_Y
+ text: "y"
+ alternativeKeys: "yijÿýŷ"
+ }
+ Key {
+ key: Qt.Key_U
+ text: "u"
+ alternativeKeys: "űūũûüuùú"
+ }
+ Key {
+ key: Qt.Key_I
+ text: "i"
+ alternativeKeys: "îïīĩiìí"
+ }
+ Key {
+ key: Qt.Key_O
+ text: "o"
+ alternativeKeys: "œøõôöòóo"
+ }
+ Key {
+ key: Qt.Key_P
+ text: "p"
+ }
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ FillerKey {
+ weight: 56
+ }
+ Key {
+ key: Qt.Key_A
+ text: "a"
+ alternativeKeys: "aäåãâàá"
+ }
+ Key {
+ key: Qt.Key_S
+ text: "s"
+ }
+ Key {
+ key: Qt.Key_D
+ text: "d"
+ }
+ Key {
+ key: Qt.Key_F
+ text: "f"
+ }
+ Key {
+ key: Qt.Key_G
+ text: "g"
+ }
+ Key {
+ key: Qt.Key_H
+ text: "h"
+ }
+ Key {
+ key: Qt.Key_J
+ text: "j"
+ }
+ Key {
+ key: Qt.Key_K
+ text: "k"
+ }
+ Key {
+ key: Qt.Key_L
+ text: "l"
+ }
+ EnterKey {
+ weight: 283
+ }
+ }
+ KeyboardRow {
+ keyWeight: 156
+ ShiftKey {}
+ Key {
+ key: Qt.Key_Z
+ text: "z"
+ }
+ Key {
+ key: Qt.Key_X
+ text: "x"
+ }
+ Key {
+ key: Qt.Key_C
+ text: "c"
+ }
+ Key {
+ key: Qt.Key_V
+ text: "v"
+ }
+ Key {
+ key: Qt.Key_B
+ text: "b"
+ }
+ Key {
+ key: Qt.Key_N
+ text: "n"
+ }
+ Key {
+ key: Qt.Key_M
+ text: "m"
+ }
+ Key {
+ key: Qt.Key_Comma
+ text: ","
+ }
+ Key {
+ key: Qt.Key_Period
+ text: "."
+ }
+ ShiftKey {
+ weight: 204
+ }
+ }
+ KeyboardRow {
+ keyWeight: 154
+ SymbolModeKey {
+ weight: 217
+ }
+ ChangeLanguageKey {
+ weight: 154
+ }
+ HandwritingModeKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: Qt.Key_Apostrophe
+ text: "'"
+ }
+ Key {
+ key: 0xE000
+ text: ":-)"
+ alternativeKeys: [ ";-)", ":-)", ":-D", ":-(", "<3" ]
+ }
+ HideKeyboardKey {
+ weight: 204
+ }
+ }
+}
diff --git a/src/virtualkeyboard/content/layouts/nl_NL/symbols.qml b/src/virtualkeyboard/content/layouts/nl_NL/symbols.qml
new file mode 100644
index 00000000..49f6e709
--- /dev/null
+++ b/src/virtualkeyboard/content/layouts/nl_NL/symbols.qml
@@ -0,0 +1,376 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.Layouts 1.0
+import QtQuick.VirtualKeyboard 2.1
+
+KeyboardLayoutLoader {
+ property bool secondPage
+ onVisibleChanged: if (!visible) secondPage = false
+ sourceComponent: secondPage ? page2 : page1
+ Component {
+ id: page1
+ KeyboardLayout {
+ keyWeight: 160
+ KeyboardRow {
+ Key {
+ key: Qt.Key_1
+ text: "1"
+ }
+ Key {
+ key: Qt.Key_2
+ text: "2"
+ }
+ Key {
+ key: Qt.Key_3
+ text: "3"
+ }
+ Key {
+ key: Qt.Key_4
+ text: "4"
+ }
+ Key {
+ key: Qt.Key_5
+ text: "5"
+ }
+ Key {
+ key: Qt.Key_6
+ text: "6"
+ }
+ Key {
+ key: Qt.Key_7
+ text: "7"
+ }
+ Key {
+ key: Qt.Key_8
+ text: "8"
+ }
+ Key {
+ key: Qt.Key_9
+ text: "9"
+ }
+ Key {
+ key: Qt.Key_0
+ text: "0"
+ }
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ FillerKey {
+ weight: 56
+ }
+ Key {
+ key: Qt.Key_At
+ text: "@"
+ }
+ Key {
+ key: Qt.Key_NumberSign
+ text: "#"
+ }
+ Key {
+ key: Qt.Key_Percent
+ text: "%"
+ }
+ Key {
+ key: Qt.Key_Ampersand
+ text: "&"
+ }
+ Key {
+ key: Qt.Key_Asterisk
+ text: "*"
+ }
+ Key {
+ key: Qt.Key_Minus
+ text: "-"
+ }
+ Key {
+ key: Qt.Key_Plus
+ text: "+"
+ }
+ Key {
+ key: Qt.Key_ParenLeft
+ text: "("
+ }
+ Key {
+ key: Qt.Key_ParenRight
+ text: ")"
+ }
+ EnterKey {
+ weight: 283
+ }
+ }
+ KeyboardRow {
+ keyWeight: 156
+ Key {
+ displayText: "1/2"
+ functionKey: true
+ onClicked: secondPage = !secondPage
+ }
+ Key {
+ key: Qt.Key_Exclam
+ text: "!"
+ }
+ Key {
+ key: Qt.Key_QuoteDbl
+ text: '"'
+ }
+ Key {
+ key: Qt.Key_Less
+ text: "<"
+ }
+ Key {
+ key: Qt.Key_Greater
+ text: ">"
+ }
+ Key {
+ key: Qt.Key_Apostrophe
+ text: "'"
+ }
+ Key {
+ key: Qt.Key_Colon
+ text: ":"
+ }
+ Key {
+ key: Qt.Key_Semicolon
+ text: ";"
+ }
+ Key {
+ key: Qt.Key_Slash
+ text: "/"
+ }
+ Key {
+ key: Qt.Key_Question
+ text: "?"
+ }
+ Key {
+ weight: 204
+ displayText: "1/2"
+ functionKey: true
+ onClicked: secondPage = !secondPage
+ }
+ }
+ KeyboardRow {
+ keyWeight: 154
+ SymbolModeKey {
+ weight: 217
+ displayText: "ABC"
+ }
+ ChangeLanguageKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: Qt.Key_Period
+ text: "."
+ alternativeKeys: ".,"
+ }
+ Key {
+ key: 0xE000
+ text: ":-)"
+ alternativeKeys: [ ";-)", ":-)", ":-D", ":-(", "<3" ]
+ }
+ HideKeyboardKey {
+ weight: 204
+ }
+ }
+ }
+ }
+ Component {
+ id: page2
+ KeyboardLayout {
+ keyWeight: 160
+ KeyboardRow {
+ Key {
+ key: Qt.Key_AsciiTilde
+ text: "~"
+ }
+ Key {
+ key: Qt.Key_Agrave
+ text: "`"
+ }
+ Key {
+ key: Qt.Key_Bar
+ text: "|"
+ }
+ Key {
+ key: 0x7B
+ text: "·"
+ }
+ Key {
+ key: 0x221A
+ text: "√"
+ }
+ Key {
+ key: Qt.Key_division
+ text: "÷"
+ }
+ Key {
+ key: Qt.Key_multiply
+ text: "×"
+ }
+ Key {
+ key: Qt.Key_onehalf
+ text: "½"
+ alternativeKeys: "¼⅓½¾⅞"
+ }
+ Key {
+ key: Qt.Key_BraceLeft
+ text: "{"
+ }
+ Key {
+ key: Qt.Key_BraceRight
+ text: "}"
+ }
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ FillerKey {
+ weight: 56
+ }
+ Key {
+ key: Qt.Key_Dollar
+ text: "$"
+ }
+ Key {
+ key: 0x20AC
+ text: "€"
+ }
+ Key {
+ key: 0xC2
+ text: "£"
+ }
+ Key {
+ key: 0xA2
+ text: "¢"
+ }
+ Key {
+ key: 0xA5
+ text: "¥"
+ }
+ Key {
+ key: Qt.Key_Equal
+ text: "="
+ }
+ Key {
+ key: Qt.Key_section
+ text: "§"
+ }
+ Key {
+ key: Qt.Key_BracketLeft
+ text: "["
+ }
+ Key {
+ key: Qt.Key_BracketRight
+ text: "]"
+ }
+ EnterKey {
+ weight: 283
+ }
+ }
+ KeyboardRow {
+ keyWeight: 156
+ Key {
+ displayText: "2/2"
+ functionKey: true
+ onClicked: secondPage = !secondPage
+ }
+ Key {
+ key: Qt.Key_Underscore
+ text: "_"
+ }
+ Key {
+ key: 0x2122
+ text: '™'
+ }
+ Key {
+ key: 0x00AE
+ text: '®'
+ }
+ Key {
+ key: Qt.Key_guillemotleft
+ text: '«'
+ }
+ Key {
+ key: Qt.Key_guillemotright
+ text: '»'
+ }
+ Key {
+ key: 0x201C
+ text: '“'
+ }
+ Key {
+ key: 0x201D
+ text: '”'
+ }
+ Key {
+ key: Qt.Key_Backslash
+ text: "\\"
+ }
+ Key {
+ key: Qt.Key_AsciiCircum
+ text: "^"
+ }
+ Key {
+ weight: 204
+ displayText: "2/2"
+ functionKey: true
+ onClicked: secondPage = !secondPage
+ }
+ }
+ KeyboardRow {
+ keyWeight: 154
+ SymbolModeKey {
+ weight: 217
+ displayText: "ABC"
+ }
+ ChangeLanguageKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: 0x2026
+ text: "\u2026"
+ }
+ Key {
+ key: 0xE000
+ text: ":-)"
+ alternativeKeys: [ ";-)", ":-)", ":-D", ":-(", "<3" ]
+ }
+ HideKeyboardKey {
+ weight: 204
+ }
+ }
+ }
+ }
+}
diff --git a/src/virtualkeyboard/content/layouts/pl_PL/handwriting.qml b/src/virtualkeyboard/content/layouts/pl_PL/handwriting.qml
index 8f3672c9..d42de535 100644
--- a/src/virtualkeyboard/content/layouts/pl_PL/handwriting.qml
+++ b/src/virtualkeyboard/content/layouts/pl_PL/handwriting.qml
@@ -29,11 +29,11 @@
import QtQuick 2.0
import QtQuick.Layouts 1.0
-import QtQuick.VirtualKeyboard 2.1
+import QtQuick.VirtualKeyboard 2.3
KeyboardLayout {
function createInputMethod() {
- return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.1; HandwritingInputMethod {}', parent)
+ return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.3; HandwritingInputMethod {}', parent)
}
sharedLayouts: ['symbols']
inputMode: InputEngine.Latin
@@ -66,15 +66,8 @@ KeyboardLayout {
id: bottomRow
Layout.preferredHeight: 1
keyWeight: 154
- Key {
+ InputModeKey {
weight: 217
- key: Qt.Key_Mode_switch
- noKeyEvent: true
- functionKey: true
- text: InputContext.inputEngine.inputMode === InputEngine.Latin ? "123" : "ABC"
- onClicked: InputContext.inputEngine.inputMode = InputContext.inputEngine.inputMode === InputEngine.Latin ? InputEngine.Numeric : InputEngine.Latin
- enabled: !(InputContext.inputMethodHints & (Qt.ImhDialableCharactersOnly | Qt.ImhFormattedNumbersOnly | Qt.ImhDigitsOnly))
- keyPanelDelegate: keyboard.style ? keyboard.style.symbolKeyPanel : undefined
}
ChangeLanguageKey {
weight: 154
diff --git a/src/virtualkeyboard/content/layouts/pt_PT/handwriting.qml b/src/virtualkeyboard/content/layouts/pt_PT/handwriting.qml
index 8f3672c9..d42de535 100644
--- a/src/virtualkeyboard/content/layouts/pt_PT/handwriting.qml
+++ b/src/virtualkeyboard/content/layouts/pt_PT/handwriting.qml
@@ -29,11 +29,11 @@
import QtQuick 2.0
import QtQuick.Layouts 1.0
-import QtQuick.VirtualKeyboard 2.1
+import QtQuick.VirtualKeyboard 2.3
KeyboardLayout {
function createInputMethod() {
- return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.1; HandwritingInputMethod {}', parent)
+ return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.3; HandwritingInputMethod {}', parent)
}
sharedLayouts: ['symbols']
inputMode: InputEngine.Latin
@@ -66,15 +66,8 @@ KeyboardLayout {
id: bottomRow
Layout.preferredHeight: 1
keyWeight: 154
- Key {
+ InputModeKey {
weight: 217
- key: Qt.Key_Mode_switch
- noKeyEvent: true
- functionKey: true
- text: InputContext.inputEngine.inputMode === InputEngine.Latin ? "123" : "ABC"
- onClicked: InputContext.inputEngine.inputMode = InputContext.inputEngine.inputMode === InputEngine.Latin ? InputEngine.Numeric : InputEngine.Latin
- enabled: !(InputContext.inputMethodHints & (Qt.ImhDialableCharactersOnly | Qt.ImhFormattedNumbersOnly | Qt.ImhDigitsOnly))
- keyPanelDelegate: keyboard.style ? keyboard.style.symbolKeyPanel : undefined
}
ChangeLanguageKey {
weight: 154
diff --git a/src/virtualkeyboard/content/layouts/ro_RO/handwriting.qml b/src/virtualkeyboard/content/layouts/ro_RO/handwriting.qml
index ab2600f5..7826b542 100644
--- a/src/virtualkeyboard/content/layouts/ro_RO/handwriting.qml
+++ b/src/virtualkeyboard/content/layouts/ro_RO/handwriting.qml
@@ -29,11 +29,11 @@
import QtQuick 2.0
import QtQuick.Layouts 1.0
-import QtQuick.VirtualKeyboard 2.1
+import QtQuick.VirtualKeyboard 2.3
KeyboardLayout {
function createInputMethod() {
- return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.1; HandwritingInputMethod {}', parent)
+ return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.3; HandwritingInputMethod {}', parent)
}
sharedLayouts: ['symbols']
inputMode: InputEngine.Latin
@@ -66,15 +66,8 @@ KeyboardLayout {
id: bottomRow
Layout.preferredHeight: 1
keyWeight: 154
- Key {
+ InputModeKey {
weight: 217
- key: Qt.Key_Mode_switch
- noKeyEvent: true
- functionKey: true
- text: InputContext.inputEngine.inputMode === InputEngine.Latin ? "123" : "ABC"
- onClicked: InputContext.inputEngine.inputMode = InputContext.inputEngine.inputMode === InputEngine.Latin ? InputEngine.Numeric : InputEngine.Latin
- enabled: !(InputContext.inputMethodHints & (Qt.ImhDialableCharactersOnly | Qt.ImhFormattedNumbersOnly | Qt.ImhDigitsOnly))
- keyPanelDelegate: keyboard.style ? keyboard.style.symbolKeyPanel : undefined
}
ChangeLanguageKey {
weight: 154
diff --git a/src/virtualkeyboard/content/layouts/ru_RU/handwriting.qml b/src/virtualkeyboard/content/layouts/ru_RU/handwriting.qml
index 8f3672c9..d42de535 100644
--- a/src/virtualkeyboard/content/layouts/ru_RU/handwriting.qml
+++ b/src/virtualkeyboard/content/layouts/ru_RU/handwriting.qml
@@ -29,11 +29,11 @@
import QtQuick 2.0
import QtQuick.Layouts 1.0
-import QtQuick.VirtualKeyboard 2.1
+import QtQuick.VirtualKeyboard 2.3
KeyboardLayout {
function createInputMethod() {
- return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.1; HandwritingInputMethod {}', parent)
+ return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.3; HandwritingInputMethod {}', parent)
}
sharedLayouts: ['symbols']
inputMode: InputEngine.Latin
@@ -66,15 +66,8 @@ KeyboardLayout {
id: bottomRow
Layout.preferredHeight: 1
keyWeight: 154
- Key {
+ InputModeKey {
weight: 217
- key: Qt.Key_Mode_switch
- noKeyEvent: true
- functionKey: true
- text: InputContext.inputEngine.inputMode === InputEngine.Latin ? "123" : "ABC"
- onClicked: InputContext.inputEngine.inputMode = InputContext.inputEngine.inputMode === InputEngine.Latin ? InputEngine.Numeric : InputEngine.Latin
- enabled: !(InputContext.inputMethodHints & (Qt.ImhDialableCharactersOnly | Qt.ImhFormattedNumbersOnly | Qt.ImhDigitsOnly))
- keyPanelDelegate: keyboard.style ? keyboard.style.symbolKeyPanel : undefined
}
ChangeLanguageKey {
weight: 154
diff --git a/src/virtualkeyboard/content/layouts/sr_SP/handwriting.qml b/src/virtualkeyboard/content/layouts/sr_SP/handwriting.qml
new file mode 100644
index 00000000..7781e455
--- /dev/null
+++ b/src/virtualkeyboard/content/layouts/sr_SP/handwriting.qml
@@ -0,0 +1,99 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.Layouts 1.0
+import QtQuick.VirtualKeyboard 2.3
+
+KeyboardLayout {
+ function createInputMethod() {
+ return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.3; HandwritingInputMethod {}', parent)
+ }
+ sharedLayouts: ['symbols']
+
+ KeyboardRow {
+ Layout.preferredHeight: 3
+ KeyboardColumn {
+ Layout.preferredWidth: bottomRow.width - hideKeyboardKey.width
+ KeyboardRow {
+ TraceInputKey {
+ objectName: "hwrInputArea"
+ patternRecognitionMode: InputEngine.HandwritingRecoginition
+ horizontalRulers:
+ InputContext.inputEngine.inputMode !== InputEngine.Cyrillic ? [] :
+ [Math.round(boundingBox.height / 4), Math.round(boundingBox.height / 4) * 2, Math.round(boundingBox.height / 4) * 3]
+ }
+ }
+ }
+ KeyboardColumn {
+ Layout.preferredWidth: hideKeyboardKey.width
+ KeyboardRow {
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ EnterKey {}
+ }
+ KeyboardRow {
+ ShiftKey { }
+ }
+ }
+ }
+ KeyboardRow {
+ id: bottomRow
+ Layout.preferredHeight: 1
+ keyWeight: 154
+ InputModeKey {
+ weight: 217
+ }
+ ChangeLanguageKey {
+ weight: 154
+ customLayoutsOnly: true
+ }
+ HandwritingModeKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: Qt.Key_Minus
+ text: "-"
+ alternativeKeys: "<>()#%&*/\\\"'=+-_"
+ }
+ Key {
+ key: Qt.Key_Period
+ text: "."
+ alternativeKeys: ":;,.?!"
+ }
+ HideKeyboardKey {
+ id: hideKeyboardKey
+ weight: 204
+ }
+ }
+}
diff --git a/src/virtualkeyboard/content/layouts/sr_SP/main.qml b/src/virtualkeyboard/content/layouts/sr_SP/main.qml
new file mode 100644
index 00000000..d739e79c
--- /dev/null
+++ b/src/virtualkeyboard/content/layouts/sr_SP/main.qml
@@ -0,0 +1,363 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.VirtualKeyboard 2.3
+
+KeyboardLayoutLoader {
+ sharedLayouts: ['symbols']
+ sourceComponent: InputContext.inputEngine.inputMode === InputEngine.Cyrillic ? cyrillicLayout : latinLayout
+ Component {
+ id: cyrillicLayout
+ KeyboardLayout {
+ keyWeight: 160
+ KeyboardRow {
+ Key {
+ text: "љ"
+ }
+ Key {
+ text: "њ"
+ }
+ Key {
+ text: "е"
+ }
+ Key {
+ text: "р"
+ }
+ Key {
+ text: "т"
+ }
+ Key {
+ text: "з"
+ }
+ Key {
+ text: "у"
+ }
+ Key {
+ text: "и"
+ }
+ Key {
+ text: "о"
+ }
+ Key {
+ text: "п"
+ }
+ Key {
+ text: "ш"
+ }
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ FillerKey {
+ weight: 56
+ }
+ Key {
+ text: "а"
+ }
+ Key {
+ text: "с"
+ }
+ Key {
+ text: "д"
+ }
+ Key {
+ text: "ф"
+ }
+ Key {
+ text: "г"
+ }
+ Key {
+ text: "х"
+ }
+ Key {
+ text: "ј"
+ }
+ Key {
+ text: "к"
+ }
+ Key {
+ text: "л"
+ }
+ Key {
+ text: "ч"
+ }
+ Key {
+ text: "ћ"
+ }
+ EnterKey {
+ weight: 283
+ }
+ }
+ KeyboardRow {
+ keyWeight: 156
+ InputModeKey {
+ inputModes: [InputEngine.Cyrillic, InputEngine.Latin]
+ }
+ Key {
+ text: "ѕ"
+ }
+ Key {
+ text: "џ"
+ }
+ Key {
+ text: "ц"
+ }
+ Key {
+ text: "в"
+ }
+ Key {
+ text: "б"
+ }
+ Key {
+ text: "н"
+ }
+ Key {
+ text: "м"
+ }
+ Key {
+ text: "ђ"
+ }
+ Key {
+ text: "ж"
+ }
+ Key {
+ key: Qt.Key_Comma
+ text: ","
+ }
+ Key {
+ key: Qt.Key_Period
+ text: "."
+ alternativeKeys: "!.;?"
+ }
+ ShiftKey {
+ weight: 204
+ }
+ }
+ KeyboardRow {
+ keyWeight: 154
+ SymbolModeKey {
+ weight: 217
+ }
+ ChangeLanguageKey {
+ weight: 154
+ }
+ HandwritingModeKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: Qt.Key_Apostrophe
+ text: "'"
+ }
+ Key {
+ key: 0xE000
+ text: ":-)"
+ alternativeKeys: [ ";-)", ":-)", ":-D", ":-(", "<3" ]
+ }
+ HideKeyboardKey {
+ weight: 204
+ }
+ }
+ }
+ }
+ Component {
+ id: latinLayout
+ KeyboardLayout {
+ keyWeight: 160
+ KeyboardRow {
+ Key {
+ key: Qt.Key_Q
+ text: "q"
+ }
+ Key {
+ key: Qt.Key_W
+ text: "w"
+ }
+ Key {
+ key: Qt.Key_E
+ text: "e"
+ }
+ Key {
+ key: Qt.Key_R
+ text: "r"
+ }
+ Key {
+ key: Qt.Key_T
+ text: "t"
+ }
+ Key {
+ key: Qt.Key_Z
+ text: "z"
+ alternativeKeys: "zž"
+ }
+ Key {
+ key: Qt.Key_U
+ text: "u"
+ }
+ Key {
+ key: Qt.Key_I
+ text: "i"
+ }
+ Key {
+ key: Qt.Key_O
+ text: "o"
+ alternativeKeys: "oö"
+ }
+ Key {
+ key: Qt.Key_P
+ text: "p"
+ }
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ FillerKey {
+ weight: 56
+ }
+ Key {
+ key: Qt.Key_A
+ text: "a"
+ alternativeKeys: "aåä"
+ }
+ Key {
+ key: Qt.Key_S
+ text: "s"
+ alternativeKeys: "sš"
+ }
+ Key {
+ key: Qt.Key_D
+ text: "d"
+ alternativeKeys: "dđ"
+ }
+ Key {
+ key: Qt.Key_F
+ text: "f"
+ }
+ Key {
+ key: Qt.Key_G
+ text: "g"
+ }
+ Key {
+ key: Qt.Key_H
+ text: "h"
+ }
+ Key {
+ key: Qt.Key_J
+ text: "j"
+ }
+ Key {
+ key: Qt.Key_K
+ text: "k"
+ }
+ Key {
+ key: Qt.Key_L
+ text: "l"
+ }
+ EnterKey {
+ weight: 283
+ }
+ }
+ KeyboardRow {
+ keyWeight: 156
+ InputModeKey {
+ inputModes: [InputEngine.Cyrillic, InputEngine.Latin]
+ }
+ Key {
+ key: Qt.Key_Y
+ text: "y"
+ }
+ Key {
+ key: Qt.Key_X
+ text: "x"
+ }
+ Key {
+ key: Qt.Key_C
+ text: "c"
+ alternativeKeys: "ćcč"
+ }
+ Key {
+ key: Qt.Key_V
+ text: "v"
+ }
+ Key {
+ key: Qt.Key_B
+ text: "b"
+ }
+ Key {
+ key: Qt.Key_N
+ text: "n"
+ }
+ Key {
+ key: Qt.Key_M
+ text: "m"
+ }
+ Key {
+ key: Qt.Key_Comma
+ text: ","
+ }
+ Key {
+ key: Qt.Key_Period
+ text: "."
+ }
+ ShiftKey {
+ weight: 204
+ }
+ }
+ KeyboardRow {
+ keyWeight: 154
+ SymbolModeKey {
+ weight: 217
+ }
+ ChangeLanguageKey {
+ weight: 154
+ }
+ HandwritingModeKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: Qt.Key_Minus
+ text: "-"
+ alternativeKeys: "-\"'"
+ }
+ Key {
+ key: 0xE000
+ text: ":-)"
+ alternativeKeys: [ ";-)", ":-)", ":-D", ":-(", "<3" ]
+ }
+ HideKeyboardKey {
+ weight: 204
+ }
+ }
+ }
+ }
+}
diff --git a/src/virtualkeyboard/content/layouts/sr_SP/symbols.qml b/src/virtualkeyboard/content/layouts/sr_SP/symbols.qml
new file mode 100644
index 00000000..42f8f3b6
--- /dev/null
+++ b/src/virtualkeyboard/content/layouts/sr_SP/symbols.qml
@@ -0,0 +1,376 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.Layouts 1.0
+import QtQuick.VirtualKeyboard 2.3
+
+KeyboardLayoutLoader {
+ property bool secondPage
+ onVisibleChanged: if (!visible) secondPage = false
+ sourceComponent: secondPage ? page2 : page1
+ Component {
+ id: page1
+ KeyboardLayout {
+ keyWeight: 160
+ KeyboardRow {
+ Key {
+ key: Qt.Key_1
+ text: "1"
+ }
+ Key {
+ key: Qt.Key_2
+ text: "2"
+ }
+ Key {
+ key: Qt.Key_3
+ text: "3"
+ }
+ Key {
+ key: Qt.Key_4
+ text: "4"
+ }
+ Key {
+ key: Qt.Key_5
+ text: "5"
+ }
+ Key {
+ key: Qt.Key_6
+ text: "6"
+ }
+ Key {
+ key: Qt.Key_7
+ text: "7"
+ }
+ Key {
+ key: Qt.Key_8
+ text: "8"
+ }
+ Key {
+ key: Qt.Key_9
+ text: "9"
+ }
+ Key {
+ key: Qt.Key_0
+ text: "0"
+ }
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ FillerKey {
+ weight: 56
+ }
+ Key {
+ key: Qt.Key_At
+ text: "@"
+ }
+ Key {
+ key: Qt.Key_NumberSign
+ text: "#"
+ }
+ Key {
+ key: Qt.Key_Percent
+ text: "%"
+ }
+ Key {
+ key: Qt.Key_Ampersand
+ text: "&"
+ }
+ Key {
+ key: Qt.Key_Asterisk
+ text: "*"
+ }
+ Key {
+ key: Qt.Key_Minus
+ text: "-"
+ }
+ Key {
+ key: Qt.Key_Plus
+ text: "+"
+ }
+ Key {
+ key: Qt.Key_ParenLeft
+ text: "("
+ }
+ Key {
+ key: Qt.Key_ParenRight
+ text: ")"
+ }
+ EnterKey {
+ weight: 283
+ }
+ }
+ KeyboardRow {
+ keyWeight: 156
+ Key {
+ displayText: "1/2"
+ functionKey: true
+ onClicked: secondPage = !secondPage
+ }
+ Key {
+ key: Qt.Key_Exclam
+ text: "!"
+ }
+ Key {
+ key: Qt.Key_QuoteDbl
+ text: '"'
+ }
+ Key {
+ key: Qt.Key_Apostrophe
+ text: "'"
+ }
+ Key {
+ key: Qt.Key_Less
+ text: "<"
+ }
+ Key {
+ key: Qt.Key_Greater
+ text: ">"
+ }
+ Key {
+ key: Qt.Key_Colon
+ text: ":"
+ }
+ Key {
+ key: Qt.Key_Semicolon
+ text: ";"
+ }
+ Key {
+ key: Qt.Key_Slash
+ text: "/"
+ }
+ Key {
+ key: Qt.Key_Question
+ text: "?"
+ }
+ Key {
+ weight: 204
+ displayText: "1/2"
+ functionKey: true
+ onClicked: secondPage = !secondPage
+ }
+ }
+ KeyboardRow {
+ keyWeight: 154
+ SymbolModeKey {
+ weight: 217
+ displayText: InputContext.inputEngine.inputMode === InputEngine.Cyrillic ? "АБВ" : "ABC"
+ }
+ ChangeLanguageKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: Qt.Key_Period
+ text: "."
+ alternativeKeys: ".,"
+ }
+ Key {
+ key: 0xE000
+ text: ":-)"
+ alternativeKeys: [ ";-)", ":-)", ":-D", ":-(", "<3" ]
+ }
+ HideKeyboardKey {
+ weight: 204
+ }
+ }
+ }
+ }
+ Component {
+ id: page2
+ KeyboardLayout {
+ keyWeight: 160
+ KeyboardRow {
+ Key {
+ key: Qt.Key_AsciiTilde
+ text: "~"
+ }
+ Key {
+ key: Qt.Key_Agrave
+ text: "`"
+ }
+ Key {
+ key: Qt.Key_Bar
+ text: "|"
+ }
+ Key {
+ key: 0x7B
+ text: "·"
+ }
+ Key {
+ key: 0x221A
+ text: "√"
+ }
+ Key {
+ key: Qt.Key_division
+ text: "÷"
+ }
+ Key {
+ key: Qt.Key_multiply
+ text: "×"
+ }
+ Key {
+ key: Qt.Key_onehalf
+ text: "½"
+ alternativeKeys: "¼⅓½¾⅞"
+ }
+ Key {
+ key: Qt.Key_BraceLeft
+ text: "{"
+ }
+ Key {
+ key: Qt.Key_BraceRight
+ text: "}"
+ }
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ FillerKey {
+ weight: 56
+ }
+ Key {
+ key: Qt.Key_Dollar
+ text: "$"
+ }
+ Key {
+ key: 0x20AC
+ text: "€"
+ }
+ Key {
+ key: 0xC2
+ text: "£"
+ }
+ Key {
+ key: 0xA2
+ text: "¢"
+ }
+ Key {
+ key: 0xA5
+ text: "¥"
+ }
+ Key {
+ key: Qt.Key_Equal
+ text: "="
+ }
+ Key {
+ key: Qt.Key_section
+ text: "§"
+ }
+ Key {
+ key: Qt.Key_BracketLeft
+ text: "["
+ }
+ Key {
+ key: Qt.Key_BracketRight
+ text: "]"
+ }
+ EnterKey {
+ weight: 283
+ }
+ }
+ KeyboardRow {
+ keyWeight: 156
+ Key {
+ displayText: "2/2"
+ functionKey: true
+ onClicked: secondPage = !secondPage
+ }
+ Key {
+ key: Qt.Key_Underscore
+ text: "_"
+ }
+ Key {
+ key: 0x2122
+ text: '™'
+ }
+ Key {
+ key: 0x00AE
+ text: '®'
+ }
+ Key {
+ key: Qt.Key_guillemotleft
+ text: '«'
+ }
+ Key {
+ key: Qt.Key_guillemotright
+ text: '»'
+ }
+ Key {
+ key: 0x201C
+ text: '“'
+ }
+ Key {
+ key: 0x201D
+ text: '”'
+ }
+ Key {
+ key: Qt.Key_Backslash
+ text: "\\"
+ }
+ Key {
+ key: Qt.Key_AsciiCircum
+ text: "^"
+ }
+ Key {
+ weight: 204
+ displayText: "2/2"
+ functionKey: true
+ onClicked: secondPage = !secondPage
+ }
+ }
+ KeyboardRow {
+ keyWeight: 154
+ SymbolModeKey {
+ weight: 217
+ displayText: InputContext.inputEngine.inputMode === InputEngine.Cyrillic ? "АБВ" : "ABC"
+ }
+ ChangeLanguageKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: 0x2026
+ text: "\u2026"
+ }
+ Key {
+ key: 0xE000
+ text: ":-)"
+ alternativeKeys: [ ";-)", ":-)", ":-D", ":-(", "<3" ]
+ }
+ HideKeyboardKey {
+ weight: 204
+ }
+ }
+ }
+ }
+}
diff --git a/src/virtualkeyboard/content/layouts/sv_SE/handwriting.qml b/src/virtualkeyboard/content/layouts/sv_SE/handwriting.qml
index 8f3672c9..d42de535 100644
--- a/src/virtualkeyboard/content/layouts/sv_SE/handwriting.qml
+++ b/src/virtualkeyboard/content/layouts/sv_SE/handwriting.qml
@@ -29,11 +29,11 @@
import QtQuick 2.0
import QtQuick.Layouts 1.0
-import QtQuick.VirtualKeyboard 2.1
+import QtQuick.VirtualKeyboard 2.3
KeyboardLayout {
function createInputMethod() {
- return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.1; HandwritingInputMethod {}', parent)
+ return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.3; HandwritingInputMethod {}', parent)
}
sharedLayouts: ['symbols']
inputMode: InputEngine.Latin
@@ -66,15 +66,8 @@ KeyboardLayout {
id: bottomRow
Layout.preferredHeight: 1
keyWeight: 154
- Key {
+ InputModeKey {
weight: 217
- key: Qt.Key_Mode_switch
- noKeyEvent: true
- functionKey: true
- text: InputContext.inputEngine.inputMode === InputEngine.Latin ? "123" : "ABC"
- onClicked: InputContext.inputEngine.inputMode = InputContext.inputEngine.inputMode === InputEngine.Latin ? InputEngine.Numeric : InputEngine.Latin
- enabled: !(InputContext.inputMethodHints & (Qt.ImhDialableCharactersOnly | Qt.ImhFormattedNumbersOnly | Qt.ImhDigitsOnly))
- keyPanelDelegate: keyboard.style ? keyboard.style.symbolKeyPanel : undefined
}
ChangeLanguageKey {
weight: 154
diff --git a/src/virtualkeyboard/content/layouts/zh_CN/handwriting.qml b/src/virtualkeyboard/content/layouts/zh_CN/handwriting.qml
new file mode 100644
index 00000000..598980d1
--- /dev/null
+++ b/src/virtualkeyboard/content/layouts/zh_CN/handwriting.qml
@@ -0,0 +1,116 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.Layouts 1.0
+import QtQuick.VirtualKeyboard 2.3
+
+KeyboardLayout {
+ function createInputMethod() {
+ return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.3; HandwritingInputMethod {}', parent)
+ }
+ sharedLayouts: ['symbols']
+ inputMode: preferredInputMode()
+
+ Connections {
+ target: InputContext
+ onInputMethodHintsChanged: {
+ var newInputMode = preferredInputMode()
+ if (InputContext.inputEngine.inputModes.indexOf(newInputMode) !== -1)
+ InputContext.inputEngine.inputMode = newInputMode
+ }
+ }
+
+ function preferredInputMode() {
+ return InputContext.inputMethodHints &
+ (Qt.ImhPreferLatin | Qt.ImhEmailCharactersOnly | Qt.ImhUrlCharactersOnly |
+ Qt.ImhLatinOnly) ? InputEngine.Latin : InputEngine.ChineseHandwriting
+ }
+
+ KeyboardRow {
+ Layout.preferredHeight: 3
+ KeyboardColumn {
+ Layout.preferredWidth: bottomRow.width - hideKeyboardKey.width
+ KeyboardRow {
+ TraceInputKey {
+ objectName: "hwrInputArea"
+ patternRecognitionMode: InputEngine.HandwritingRecoginition
+ horizontalRulers:
+ InputContext.inputEngine.inputMode !== InputEngine.ChineseHandwriting ? [] :
+ [Math.round(boundingBox.height / 4), Math.round(boundingBox.height / 4) * 2, Math.round(boundingBox.height / 4) * 3]
+
+ }
+ }
+ }
+ KeyboardColumn {
+ Layout.preferredWidth: hideKeyboardKey.width
+ KeyboardRow {
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ EnterKey {}
+ }
+ KeyboardRow {
+ ShiftKey { }
+ }
+ }
+ }
+ KeyboardRow {
+ id: bottomRow
+ Layout.preferredHeight: 1
+ keyWeight: 154
+ InputModeKey {
+ weight: 217
+ }
+ ChangeLanguageKey {
+ weight: 154
+ customLayoutsOnly: true
+ }
+ HandwritingModeKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: Qt.Key_Apostrophe
+ text: "‘"
+ alternativeKeys: "《》〈〉•…々〆‘’“”「」¥"
+ }
+ Key {
+ key: Qt.Key_Period
+ text: "."
+ alternativeKeys: ":;,.、。?!"
+ }
+ HideKeyboardKey {
+ id: hideKeyboardKey
+ weight: 204
+ }
+ }
+}
diff --git a/src/virtualkeyboard/content/layouts/zh_CN/main.qml b/src/virtualkeyboard/content/layouts/zh_CN/main.qml
index c8e21c84..44b0ceb7 100644
--- a/src/virtualkeyboard/content/layouts/zh_CN/main.qml
+++ b/src/virtualkeyboard/content/layouts/zh_CN/main.qml
@@ -181,6 +181,9 @@ KeyboardLayout {
ChangeLanguageKey {
weight: 154
}
+ HandwritingModeKey {
+ weight: 154
+ }
SpaceKey {
weight: 864
}
diff --git a/src/virtualkeyboard/content/layouts/zh_TW/handwriting.qml b/src/virtualkeyboard/content/layouts/zh_TW/handwriting.qml
new file mode 100644
index 00000000..598980d1
--- /dev/null
+++ b/src/virtualkeyboard/content/layouts/zh_TW/handwriting.qml
@@ -0,0 +1,116 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.Layouts 1.0
+import QtQuick.VirtualKeyboard 2.3
+
+KeyboardLayout {
+ function createInputMethod() {
+ return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.3; HandwritingInputMethod {}', parent)
+ }
+ sharedLayouts: ['symbols']
+ inputMode: preferredInputMode()
+
+ Connections {
+ target: InputContext
+ onInputMethodHintsChanged: {
+ var newInputMode = preferredInputMode()
+ if (InputContext.inputEngine.inputModes.indexOf(newInputMode) !== -1)
+ InputContext.inputEngine.inputMode = newInputMode
+ }
+ }
+
+ function preferredInputMode() {
+ return InputContext.inputMethodHints &
+ (Qt.ImhPreferLatin | Qt.ImhEmailCharactersOnly | Qt.ImhUrlCharactersOnly |
+ Qt.ImhLatinOnly) ? InputEngine.Latin : InputEngine.ChineseHandwriting
+ }
+
+ KeyboardRow {
+ Layout.preferredHeight: 3
+ KeyboardColumn {
+ Layout.preferredWidth: bottomRow.width - hideKeyboardKey.width
+ KeyboardRow {
+ TraceInputKey {
+ objectName: "hwrInputArea"
+ patternRecognitionMode: InputEngine.HandwritingRecoginition
+ horizontalRulers:
+ InputContext.inputEngine.inputMode !== InputEngine.ChineseHandwriting ? [] :
+ [Math.round(boundingBox.height / 4), Math.round(boundingBox.height / 4) * 2, Math.round(boundingBox.height / 4) * 3]
+
+ }
+ }
+ }
+ KeyboardColumn {
+ Layout.preferredWidth: hideKeyboardKey.width
+ KeyboardRow {
+ BackspaceKey {}
+ }
+ KeyboardRow {
+ EnterKey {}
+ }
+ KeyboardRow {
+ ShiftKey { }
+ }
+ }
+ }
+ KeyboardRow {
+ id: bottomRow
+ Layout.preferredHeight: 1
+ keyWeight: 154
+ InputModeKey {
+ weight: 217
+ }
+ ChangeLanguageKey {
+ weight: 154
+ customLayoutsOnly: true
+ }
+ HandwritingModeKey {
+ weight: 154
+ }
+ SpaceKey {
+ weight: 864
+ }
+ Key {
+ key: Qt.Key_Apostrophe
+ text: "‘"
+ alternativeKeys: "《》〈〉•…々〆‘’“”「」¥"
+ }
+ Key {
+ key: Qt.Key_Period
+ text: "."
+ alternativeKeys: ":;,.、。?!"
+ }
+ HideKeyboardKey {
+ id: hideKeyboardKey
+ weight: 204
+ }
+ }
+}
diff --git a/src/virtualkeyboard/content/layouts/zh_TW/main.qml b/src/virtualkeyboard/content/layouts/zh_TW/main.qml
index a71a27c5..7c5728c7 100644
--- a/src/virtualkeyboard/content/layouts/zh_TW/main.qml
+++ b/src/virtualkeyboard/content/layouts/zh_TW/main.qml
@@ -29,11 +29,11 @@
import QtQuick 2.0
import QtQuick.Layouts 1.0
-import QtQuick.VirtualKeyboard 2.1
+import QtQuick.VirtualKeyboard 2.3
KeyboardLayoutLoader {
function createInputMethod() {
- return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.1; TCInputMethod {}', parent, "tcInputMethod")
+ return Qt.createQmlObject('import QtQuick 2.0; import QtQuick.VirtualKeyboard 2.3; TCInputMethod {}', parent, "tcInputMethod")
}
sharedLayouts: ['symbols']
sourceComponent: InputContext.inputEngine.inputMode === InputEngine.Cangjie ? pageCangjie : pageZhuyin
@@ -197,11 +197,11 @@ KeyboardLayoutLoader {
ChangeLanguageKey {
weight: 154
}
- ModeKey {
+ HandwritingModeKey {
+ weight: 154
+ }
+ InputModeKey {
visible: InputContext.inputEngine.inputModes.indexOf(InputEngine.Zhuyin) !== -1
- // Cangjie
- displayText: "\u5009\u9821"
- onClicked: InputContext.inputEngine.inputMode = InputEngine.Zhuyin
}
SpaceKey {
weight: 864
@@ -246,7 +246,8 @@ KeyboardLayoutLoader {
}
Key {
text: "\u02CB"
- alternativeKeys: "\u02CB4"
+ alternativeKeys: "4"
+ displayText: "`"
}
Key {
text: "\u3113"
@@ -254,7 +255,8 @@ KeyboardLayoutLoader {
}
Key {
text: "\u02CA"
- alternativeKeys: "\u02CA6"
+ alternativeKeys: "6"
+ displayText: "´"
}
Key {
text: "\u02D9"
@@ -423,11 +425,11 @@ KeyboardLayoutLoader {
ChangeLanguageKey {
weight: 154
}
- ModeKey {
+ HandwritingModeKey {
+ weight: 154
+ }
+ InputModeKey {
visible: InputContext.inputEngine.inputModes.indexOf(InputEngine.Cangjie) !== -1
- // Zhuyin
- displayText: "\u6CE8\u97F3"
- onClicked: InputContext.inputEngine.inputMode = InputEngine.Cangjie
}
SpaceKey {
weight: 864
diff --git a/src/virtualkeyboard/content/styles/default/style.qml b/src/virtualkeyboard/content/styles/default/style.qml
index 1440f008..6c49ee67 100644
--- a/src/virtualkeyboard/content/styles/default/style.qml
+++ b/src/virtualkeyboard/content/styles/default/style.qml
@@ -92,9 +92,9 @@ KeyboardStyle {
verticalAlignment: Text.AlignVCenter
anchors.fill: parent
anchors.leftMargin: keyContentMargin
- anchors.topMargin: control.smallTextVisible ? keyContentMargin * 1.2 : keyContentMargin
+ anchors.topMargin: keyContentMargin
anchors.rightMargin: keyContentMargin
- anchors.bottomMargin: control.smallTextVisible ? keyContentMargin * 0.8 : keyContentMargin
+ anchors.bottomMargin: keyContentMargin
font {
family: fontFamily
weight: Font.Normal
@@ -757,7 +757,34 @@ KeyboardStyle {
Text {
id: hwrInputModeIndicator
visible: control.patternRecognitionMode === InputEngine.HandwritingRecoginition
- text: InputContext.inputEngine.inputMode === InputEngine.Latin ? "Abc" : "123"
+ text: {
+ switch (InputContext.inputEngine.inputMode) {
+ case InputEngine.Numeric:
+ if (["ar", "fa"].indexOf(InputContext.locale.substring(0, 2)) !== -1)
+ return "\u0660\u0661\u0662"
+ // Fallthrough
+ case InputEngine.Dialable:
+ return "123"
+ case InputEngine.Greek:
+ return "ΑΒΓ"
+ case InputEngine.Cyrillic:
+ return "АБВ"
+ case InputEngine.Arabic:
+ if (InputContext.locale.substring(0, 2) === "fa")
+ return "\u0627\u200C\u0628\u200C\u067E"
+ return "\u0623\u200C\u0628\u200C\u062C"
+ case InputEngine.Hebrew:
+ return "\u05D0\u05D1\u05D2"
+ case InputEngine.ChineseHandwriting:
+ return "中文"
+ case InputEngine.JapaneseHandwriting:
+ return "日本語"
+ case InputEngine.KoreanHandwriting:
+ return "한국어"
+ default:
+ return "Abc"
+ }
+ }
color: "white"
anchors.left: parent.left
anchors.top: parent.top
@@ -786,23 +813,42 @@ KeyboardStyle {
ctx.strokeStyle = Qt.rgba(0xFF, 0xFF, 0xFF)
ctx.clearRect(0, 0, width, height)
var i
+ var margin = Math.round(30 * scaleHint)
if (control.horizontalRulers) {
for (i = 0; i < control.horizontalRulers.length; i++) {
ctx.beginPath()
- ctx.moveTo(0, control.horizontalRulers[i])
- ctx.lineTo(width, control.horizontalRulers[i])
+ var y = Math.round(control.horizontalRulers[i])
+ var rightMargin = Math.round(width - margin)
+ if (i + 1 === control.horizontalRulers.length) {
+ ctx.moveTo(margin, y)
+ ctx.lineTo(rightMargin, y)
+ } else {
+ var dashLen = Math.round(20 * scaleHint)
+ for (var dash = margin, dashCount = 0;
+ dash < rightMargin; dash += dashLen, dashCount++) {
+ if ((dashCount & 1) === 0) {
+ ctx.moveTo(dash, y)
+ ctx.lineTo(Math.min(dash + dashLen, rightMargin), y)
+ }
+ }
+ }
ctx.stroke()
}
}
if (control.verticalRulers) {
for (i = 0; i < control.verticalRulers.length; i++) {
ctx.beginPath()
- ctx.moveTo(control.verticalRulers[i], 0)
- ctx.lineTo(control.verticalRulers[i], height)
+ ctx.moveTo(control.verticalRulers[i], margin)
+ ctx.lineTo(control.verticalRulers[i], Math.round(height - margin))
ctx.stroke()
}
}
}
+ Connections {
+ target: control
+ onHorizontalRulersChanged: traceInputKeyGuideLines.requestPaint()
+ onVerticalRulersChanged: traceInputKeyGuideLines.requestPaint()
+ }
}
}
diff --git a/src/virtualkeyboard/content/styles/retro/style.qml b/src/virtualkeyboard/content/styles/retro/style.qml
index 0ed184b7..c22338ba 100644
--- a/src/virtualkeyboard/content/styles/retro/style.qml
+++ b/src/virtualkeyboard/content/styles/retro/style.qml
@@ -871,7 +871,34 @@ KeyboardStyle {
Text {
id: hwrInputModeIndicator
visible: control.patternRecognitionMode === InputEngine.HandwritingRecoginition
- text: InputContext.inputEngine.inputMode === InputEngine.Latin ? "Abc" : "123"
+ text: {
+ switch (InputContext.inputEngine.inputMode) {
+ case InputEngine.Numeric:
+ if (["ar", "fa"].indexOf(InputContext.locale.substring(0, 2)) !== -1)
+ return "\u0660\u0661\u0662"
+ // Fallthrough
+ case InputEngine.Dialable:
+ return "123"
+ case InputEngine.Greek:
+ return "ΑΒΓ"
+ case InputEngine.Cyrillic:
+ return "АБВ"
+ case InputEngine.Arabic:
+ if (InputContext.locale.substring(0, 2) === "fa")
+ return "\u0627\u200C\u0628\u200C\u067E"
+ return "\u0623\u200C\u0628\u200C\u062C"
+ case InputEngine.Hebrew:
+ return "\u05D0\u05D1\u05D2"
+ case InputEngine.ChineseHandwriting:
+ return "中文"
+ case InputEngine.JapaneseHandwriting:
+ return "日本語"
+ case InputEngine.KoreanHandwriting:
+ return "한국어"
+ default:
+ return "Abc"
+ }
+ }
color: "black"
anchors.left: parent.left
anchors.top: parent.top
@@ -892,18 +919,32 @@ KeyboardStyle {
Canvas {
id: traceInputKeyGuideLines
anchors.fill: traceInputKeyPanelBackground
- opacity: 0.1
+ opacity: 0.4
onPaint: {
var ctx = getContext("2d")
ctx.lineWidth = 1
- ctx.strokeStyle = Qt.rgba(0xFF, 0xFF, 0xFF)
+ ctx.strokeStyle = Qt.rgba(0, 0, 0)
ctx.clearRect(0, 0, width, height)
var i
+ var margin = Math.round(30 * scaleHint)
if (control.horizontalRulers) {
for (i = 0; i < control.horizontalRulers.length; i++) {
ctx.beginPath()
- ctx.moveTo(0, control.horizontalRulers[i])
- ctx.lineTo(width, control.horizontalRulers[i])
+ var y = Math.round(control.horizontalRulers[i])
+ var rightMargin = Math.round(width - margin)
+ if (i + 1 === control.horizontalRulers.length) {
+ ctx.moveTo(margin, y)
+ ctx.lineTo(rightMargin, y)
+ } else {
+ var dashLen = Math.round(20 * scaleHint)
+ for (var dash = margin, dashCount = 0;
+ dash < rightMargin; dash += dashLen, dashCount++) {
+ if ((dashCount & 1) === 0) {
+ ctx.moveTo(dash, y)
+ ctx.lineTo(Math.min(dash + dashLen, rightMargin), y)
+ }
+ }
+ }
ctx.stroke()
}
}
@@ -916,6 +957,11 @@ KeyboardStyle {
}
}
}
+ Connections {
+ target: control
+ onHorizontalRulersChanged: traceInputKeyGuideLines.requestPaint()
+ onVerticalRulersChanged: traceInputKeyGuideLines.requestPaint()
+ }
}
}
diff --git a/src/virtualkeyboard/doc/qtvirtualkeyboard.qdocconf b/src/virtualkeyboard/doc/qtvirtualkeyboard.qdocconf
index 2698378e..fbb0d465 100644
--- a/src/virtualkeyboard/doc/qtvirtualkeyboard.qdocconf
+++ b/src/virtualkeyboard/doc/qtvirtualkeyboard.qdocconf
@@ -13,6 +13,9 @@ excludedirs += ../content/layouts \
exampledirs += ../../../examples/virtualkeyboard \
snippets
examplesinstallpath = virtualkeyboard
+
+manifestmeta.highlighted.names = "QtVirtualKeyboard/Qt Quick Virtual Keyboard - Basic Example"
+
imagedirs += images
depends += qtdoc qtcore qtgui qtqml qtquick
diff --git a/src/virtualkeyboard/doc/src/build.qdoc b/src/virtualkeyboard/doc/src/build.qdoc
index 3d9d9eac..a858cdea 100644
--- a/src/virtualkeyboard/doc/src/build.qdoc
+++ b/src/virtualkeyboard/doc/src/build.qdoc
@@ -281,6 +281,140 @@ Hunspell sources and dictionary files is listed below:
(etc.)
\endcode
+\section2 T9 Write Integration
+
+T9 Write integration supports the T9 Write Alphabetic and T9 Write CJK engines. Both
+engines are integrated via T9WriteInputMethod. The input method can be initialized
+with either of the engines at runtime. The engine selection happens automatically
+based on input locale and input mode from the keyboard.
+
+\section3 T9 Write Compatibility
+
+Qt Virtual Keyboard is compatible with T9 Write v7.5.0 onward.
+
+The latest tested version is v7.8.1.
+
+\section3 T9 Write Build Preparations
+
+The contents of the SDK must be either manually copied to the directory structure
+described below, or by using the \e unpack.py script found in the t9write directory.
+
+To unpack the SDK using the script:
+
+\badcode
+$ cd src/virtualkeyboard/3rdparty/t9write/
+$ python unpack.py T9Write_Alpha_v7-8-0_SDK.zip .
+\endcode
+
+\badcode
+3rdparty
+└── t9write
+ ├─── api
+ │ ├─── decuma*.h
+ │ ├─── t9write*.h
+ │ └─── xxt9w*.h
+ ├─── data
+ │ ├─── arabic
+ │ │ └─── *.bin [T9 Write Arabic]
+ │ ├─── hebrew
+ │ │ └─── *.bin [T9 Write Hebrew]
+ │ ├─── *.bin [T9 Write Alphabetic]
+ │ ├─── *.hdb
+ │ ├─── *.phd
+ │ └─── *.ldb [T9 Write v7.5]
+ └─── lib
+ ├─── arm
+ │ ├─── shared
+ │ │ ├─── alphabetic
+ │ │ │ └─── *.so
+ │ │ └─── cjk
+ │ │ └─── *.so
+ │ └─── static
+ │ ├─── alphabetic
+ │ │ └─── *.a / *.o
+ │ └─── cjk
+ │ └─── *.a / *.o
+ ├─── linux-x86
+ │ ├─── shared
+ │ │ ├─── alphabetic
+ │ │ │ └─── *.so
+ │ │ └─── cjk
+ │ │ └─── *.so
+ │ └─── static
+ │ ├─── alphabetic
+ │ │ └─── *.a / *.o
+ │ └─── cjk
+ │ └─── *.a / *.o
+ └─── win32
+ ├─── shared
+ │ ├─── alphabetic
+ │ │ ├─── *.dll
+ │ │ └─── *.lib
+ │ └─── cjk
+ │ ├─── *.dll
+ │ └─── *.lib
+ └─── static
+ ├─── alphabetic
+ │ └─── *.lib / *.obj
+ └─── cjk
+ └─── *.lib / *.obj
+\endcode
+
+\note The above files are from the T9 Write demo SDK for Windows; the contents may vary for other
+ platforms.
+
+Where the contents of each directory are:
+
+\table
+\header
+ \li Directory
+ \li Description
+ \li Remarks
+\row
+ \li \e api
+ \li This directory should contain all of the API files
+ \li The API files usually located in the "api" and "public" directories
+ of the SDK, but sometimes in the "demo" directory.
+
+ When using both Alphabetic and CJK engines at the same time, any
+ overlapping files can be copied from either SDK.
+\row
+ \li \e data
+ \li This directory should contain all HWR databases and optionally
+ XT9 databases.
+ \li HWR database for the T9 Write Alphabetic:
+ \list
+ \li \e _databas_le.bin
+ \endlist
+
+ HWR database for the T9 Write CJK:
+ \list
+ \li \e cjk_HK_std_le.hdb HongKong Chinese
+ \li \e cjk_J_std_le.hdb Japanese
+ \li \e cjk_K_mkt_le.hdb Korean
+ \li \e cjk_S_gb18030_le.hdb Simplified Chinese
+ \li \e cjk_T_std_le.hdb Traditional Chinese
+ \endlist
+
+ Language database:
+ \list
+ \li File extension is either \e .ldb or \e .phd
+ \endlist
+\row
+ \li \e lib/<target>/<linkage>/<engine-variant>
+ \li Directory structure holding supported target builds.
+ \li These directories should hold the desired target libraries.
+ If both shared and static libraries are found, shared libraries
+ are preferred.
+
+ For example, to enable a static win32 build, copy
+ \e t9write_alphabetic_rel.obj to \e lib/win32/static/alphabetic
+ directory.
+\endtable
+
+Finally, the SDK is included in the build by adding CONFIG+=t9write to the
+qmake command line.
+
\section2 Static builds
The virtual keyboard can be built and linked statically against the application.
diff --git a/src/virtualkeyboard/doc/src/qtvirtualkeyboard-examples.qdoc b/src/virtualkeyboard/doc/src/qtvirtualkeyboard-examples.qdoc
index 61b11d26..ef2bf69f 100644
--- a/src/virtualkeyboard/doc/src/qtvirtualkeyboard-examples.qdoc
+++ b/src/virtualkeyboard/doc/src/qtvirtualkeyboard-examples.qdoc
@@ -40,7 +40,44 @@
\ingroup qtvirtualkeyboard-examples
\image basic-example.png
- The example shows how to build a virtual keyboard UI with support for
- multiple keyboard layouts using QML, and a QPlatformInputContext bridge
- for communicating between the keyboard and focused text editor in C++.
+ The example has two implementations: one for the desktop
+ platforms and another for the embedded platforms. The former version
+ enables text input into several text fields using the virtual keyboard,
+ whereas the latter version uses the same UI but with a custom virtual
+ keyboard InputPanel. The following snippet from
+ \c basic.pro shows how the qmake project is set up to choose the
+ appropriate implementation based on the CONFIG options:
+
+ \quotefromfile basic/basic.pro
+ \skipto android-embedded
+ \printuntil /^\}$/
+
+ The example enables the virtual keyboard by setting the \c QT_IM_MODULE
+ environment variable before loading the \c .qml file:
+
+ \quotefromfile basic/main.cpp
+ \skipto #include
+ \printuntil }
+
+ Besides this, it uses custom TextField and TextArea items to configure the
+ \e[ENTER] key behavior using the EnterKeyAction attached property.
+
+ \quotefromfile basic/Basic.qml
+ \skipto import
+ \printuntil Rectangle
+ \dots
+ \skipto TextField
+ \printuntil }
+ \dots
+ \skipto TextArea
+ \printuntil }
+ \skipto /^\}$/
+ \printuntil }
+
+ The TextField and TextArea are inherited from the TextBase custom type,
+ which has \c enterKeyEnabled, \c enterKeyText, and \c enterKeyAction
+ properties. The TextField and TextArea instances in the snippet can
+ set these properties to change the default behavior.
+
+ \include examples-run.qdocinc
*/
diff --git a/src/virtualkeyboard/doc/src/qtvirtualkeyboard-index.qdoc b/src/virtualkeyboard/doc/src/qtvirtualkeyboard-index.qdoc
index 91373b23..21be028c 100644
--- a/src/virtualkeyboard/doc/src/qtvirtualkeyboard-index.qdoc
+++ b/src/virtualkeyboard/doc/src/qtvirtualkeyboard-index.qdoc
@@ -50,7 +50,7 @@
\li Automatic capitalization and space insertion.
\li Scalability to different resolutions.
\li Support for different character sets (Latin, Simplified/Traditional Chinese,
- Hindi, Japanese, Arabic, Korean, and others).
+ Hindi, Japanese, Arabic, Hebrew, Korean, and others).
\li Support for most common input \l {Supported Languages}{languages},
with possibility to easily extend the language support.
\li Left-to-right and right-to-left input.
@@ -66,12 +66,20 @@
\list
\li Arabic
+ \li Bulgarian
+ \li Croatian
+ \li Czech
\li Danish
+ \li Dutch
\li English
+ \li Estonian
\li Finnish
\li French
\li German
+ \li Greek
+ \li Hebrew
\li Hindi
+ \li Hungarian
\li Italian
\li Japanese
\li Korean
@@ -81,6 +89,7 @@
\li Portugese
\li Romanian
\li Russian
+ \li Serbian
\li Simplified Chinese
\li Traditional Chinese
\li Spanish
@@ -124,7 +133,7 @@
*/
/*!
-\qmlmodule QtQuick.VirtualKeyboard 2.2
+\qmlmodule QtQuick.VirtualKeyboard 2.3
\title Qt Virtual Keyboard QML Types
\ingroup qmlmodules
\brief Provides QML types for an input framework and a reference keyboard front
@@ -134,7 +143,7 @@ end.
import statements in your .qml file:
\code
- import QtQuick.VirtualKeyboard 2.2
+ import QtQuick.VirtualKeyboard 2.3
import QtQuick.VirtualKeyboard.Styles 2.2
import QtQuick.VirtualKeyboard.Settings 2.2
\endcode
diff --git a/src/virtualkeyboard/gesturerecognizer.cpp b/src/virtualkeyboard/gesturerecognizer.cpp
new file mode 100644
index 00000000..09db68a5
--- /dev/null
+++ b/src/virtualkeyboard/gesturerecognizer.cpp
@@ -0,0 +1,39 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "gesturerecognizer.h"
+
+namespace QtVirtualKeyboard {
+
+GestureRecognizer::GestureRecognizer(QObject *parent) :
+ QObject(parent)
+{
+}
+
+}
diff --git a/src/virtualkeyboard/gesturerecognizer.h b/src/virtualkeyboard/gesturerecognizer.h
new file mode 100644
index 00000000..f1636609
--- /dev/null
+++ b/src/virtualkeyboard/gesturerecognizer.h
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef GESTURERECOGNIZER_H
+#define GESTURERECOGNIZER_H
+
+#include <QObject>
+#include <QVariantMap>
+#include "trace.h"
+
+namespace QtVirtualKeyboard {
+
+class GestureRecognizer : public QObject
+{
+ Q_OBJECT
+public:
+ explicit GestureRecognizer(QObject *parent = 0);
+
+ virtual QVariantMap recognize(const QList<Trace *> traceList) = 0;
+};
+
+} // namespace QtVirtualKeyboard
+
+#endif // GESTURERECOGNIZER_H
diff --git a/src/virtualkeyboard/handwritinggesturerecognizer.cpp b/src/virtualkeyboard/handwritinggesturerecognizer.cpp
new file mode 100644
index 00000000..23ac63e9
--- /dev/null
+++ b/src/virtualkeyboard/handwritinggesturerecognizer.cpp
@@ -0,0 +1,204 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "handwritinggesturerecognizer.h"
+
+#include <QtCore/qmath.h>
+#include <QVector2D>
+
+namespace QtVirtualKeyboard {
+
+HandwritingGestureRecognizer::HandwritingGestureRecognizer(QObject *parent) :
+ GestureRecognizer(parent),
+ m_dpi(96)
+{
+}
+
+void HandwritingGestureRecognizer::setDpi(int value)
+{
+ m_dpi = value >= 0 ? value : 96;
+}
+
+int HandwritingGestureRecognizer::dpi() const
+{
+ return m_dpi;
+}
+
+QVariantMap HandwritingGestureRecognizer::recognize(const QList<Trace *> traceList)
+{
+ if (traceList.count() > 0 && traceList.count() < 3) {
+
+ // Swipe gesture detection
+ // =======================
+ //
+ // The following algorithm is based on the assumption that a
+ // vector composed of two arbitrary selected, but consecutive
+ // measuring points, and a vector composed of the first and last
+ // of the measuring points, are approximately in the same angle.
+ //
+ // If the measuring points are located very close to each other,
+ // the angle can fluctuate a lot. This has been taken into account
+ // by setting a minimum Euclidean distance between the measuring
+ // points.
+ //
+
+ // Minimum euclidean distance of a segment (in millimeters)
+ static const int MINIMUM_EUCLIDEAN_DISTANCE = 8;
+
+ // Maximum theta variance (in degrees)
+ static const qreal THETA_THRESHOLD = 25.0;
+
+ // Maximum width variance in multitouch swipe (+- in percent)
+ static const int MAXIMUM_WIDTH_VARIANCE = 20;
+
+ const qreal minimumEuclideanDistance = MINIMUM_EUCLIDEAN_DISTANCE / 25.4 * m_dpi;
+ static const qreal thetaThreshold = qDegreesToRadians(THETA_THRESHOLD);
+
+ QList<QVector2D> swipeVectors;
+
+ int traceIndex;
+ const int traceCount = traceList.size();
+ for (traceIndex = 0; traceIndex < traceCount; ++traceIndex) {
+
+ const Trace *trace = traceList.at(traceIndex);
+ const QVariantList &points = trace->points();
+ QVector2D swipeVector;
+ const int pointCount = points.count();
+ int pointIndex = 0;
+ if (pointCount >= 2) {
+
+ QPointF startPosition = points.first().toPointF();
+ swipeVector = QVector2D(points.last().toPointF() - startPosition);
+ const qreal swipeLength = swipeVector.length();
+
+ if (swipeLength >= minimumEuclideanDistance) {
+
+ QPointF previousPosition = startPosition;
+ qreal euclideanDistance = 0;
+ for (pointIndex = 1; pointIndex < pointCount; ++pointIndex) {
+
+ QPointF currentPosition(points.at(pointIndex).toPointF());
+
+ euclideanDistance += QVector2D(currentPosition - previousPosition).length();
+ if (euclideanDistance >= minimumEuclideanDistance) {
+
+ // Set the angle (theta) between the sample vector and the swipe vector
+ const QVector2D sampleVector(currentPosition - startPosition);
+ const qreal theta = qAcos(QVector2D::dotProduct(swipeVector, sampleVector) / (swipeLength * sampleVector.length()));
+
+ // Rejected when theta above threshold
+ if (theta >= thetaThreshold) {
+ swipeVector = QVector2D();
+ break;
+ }
+
+ startPosition = currentPosition;
+ euclideanDistance = 0;
+ }
+
+ previousPosition = currentPosition;
+ }
+
+ if (pointIndex < pointCount) {
+ swipeVector = QVector2D();
+ break;
+ }
+
+ // Check to see if angle and length matches to existing touch points
+ if (!swipeVectors.isEmpty()) {
+ bool matchesToExisting = true;
+ const qreal minimumSwipeLength = (swipeLength * (100.0 - MAXIMUM_WIDTH_VARIANCE) / 100.0);
+ const qreal maximumSwipeLength = (swipeLength * (100.0 + MAXIMUM_WIDTH_VARIANCE) / 100.0);
+ for (const QVector2D &otherSwipeVector : qAsConst(swipeVectors)) {
+ const qreal otherSwipeLength = otherSwipeVector.length();
+ const qreal theta = qAcos(QVector2D::dotProduct(swipeVector, otherSwipeVector) / (swipeLength * otherSwipeLength));
+
+ if (theta >= thetaThreshold) {
+ matchesToExisting = false;
+ break;
+ }
+
+ if (otherSwipeLength < minimumSwipeLength || otherSwipeLength > maximumSwipeLength) {
+ matchesToExisting = false;
+ break;
+ }
+ }
+
+ if (!matchesToExisting) {
+ swipeVector = QVector2D();
+ break;
+ }
+ }
+ } else {
+ swipeVector = QVector2D();
+ }
+ }
+
+ if (swipeVector.isNull())
+ break;
+
+ swipeVectors.append(swipeVector);
+ }
+
+ if (swipeVectors.size() == traceCount) {
+
+ QVariantMap swipeGesture;
+
+ // Get swipe angle from the first vector:
+ // 0 degrees == right
+ // 90 degrees == down
+ // 180 degrees == left
+ // 270 degrees == up
+ QList<QVector2D>::ConstIterator swipeVector = swipeVectors.constBegin();
+ qreal swipeLength = swipeVector->length();
+ qreal swipeAngle = qAcos(swipeVector->x() / swipeLength);
+ if (swipeVector->y() < 0)
+ swipeAngle = 2 * M_PI - swipeAngle;
+
+ // Calculate an average length of the vector
+ ++swipeVector;
+ for (const auto cend = swipeVectors.cend(); swipeVector != cend; ++swipeVector)
+ swipeLength += swipeVector->length();
+ swipeLength /= traceCount;
+
+ swipeGesture[QLatin1String("type")] = QLatin1String("swipe");
+ swipeGesture[QLatin1String("angle")] = swipeAngle;
+ swipeGesture[QLatin1String("angle_degrees")] = qRadiansToDegrees(swipeAngle);
+ swipeGesture[QLatin1String("length")] = swipeLength;
+ swipeGesture[QLatin1String("length_mm")] = swipeLength / m_dpi * 25.4;
+ swipeGesture[QLatin1String("touch_count")] = traceCount;
+
+ return swipeGesture;
+ }
+ }
+
+ return QVariantMap();
+}
+
+}
diff --git a/src/virtualkeyboard/handwritinggesturerecognizer.h b/src/virtualkeyboard/handwritinggesturerecognizer.h
new file mode 100644
index 00000000..5ef2ba14
--- /dev/null
+++ b/src/virtualkeyboard/handwritinggesturerecognizer.h
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef HANDWRITINGGESTURERECOGNIZER_H
+#define HANDWRITINGGESTURERECOGNIZER_H
+
+#include "gesturerecognizer.h"
+
+namespace QtVirtualKeyboard {
+
+class HandwritingGestureRecognizer : public GestureRecognizer
+{
+ Q_OBJECT
+public:
+ explicit HandwritingGestureRecognizer(QObject *parent = 0);
+
+ void setDpi(int dpi);
+ int dpi() const;
+
+ QVariantMap recognize(const QList<Trace *> traceList);
+
+private:
+ int m_dpi;
+};
+
+} // namespace QtVirtualKeyboard
+
+#endif // HANDWRITINGGESTURERECOGNIZER_H
diff --git a/src/virtualkeyboard/hunspellinputmethod.cpp b/src/virtualkeyboard/hunspellinputmethod.cpp
index 5cd88c2e..76b5f654 100644
--- a/src/virtualkeyboard/hunspellinputmethod.cpp
+++ b/src/virtualkeyboard/hunspellinputmethod.cpp
@@ -53,8 +53,26 @@ HunspellInputMethod::~HunspellInputMethod()
QList<InputEngine::InputMode> HunspellInputMethod::inputModes(const QString &locale)
{
- Q_UNUSED(locale)
- return QList<InputEngine::InputMode>() << InputEngine::Latin << InputEngine::Numeric;
+ QList<InputEngine::InputMode> result;
+ switch (QLocale(locale).script()) {
+ case QLocale::GreekScript:
+ result.append(InputEngine::Greek);
+ break;
+ case QLocale::CyrillicScript:
+ result.append(InputEngine::Cyrillic);
+ break;
+ case QLocale::ArabicScript:
+ result.append(InputEngine::Arabic);
+ break;
+ case QLocale::HebrewScript:
+ result.append(InputEngine::Hebrew);
+ break;
+ default:
+ break;
+ }
+ result.append(InputEngine::Latin);
+ result.append(InputEngine::Numeric);
+ return result;
}
bool HunspellInputMethod::setInputMode(const QString &locale, InputEngine::InputMode inputMode)
@@ -163,7 +181,7 @@ QList<SelectionListModel::Type> HunspellInputMethod::selectionLists()
{
Q_D(const HunspellInputMethod);
Qt::InputMethodHints inputMethodHints = inputContext()->inputMethodHints();
- if (d->dictionaryState != HunspellInputMethodPrivate::DictionaryReady || inputMethodHints.testFlag(Qt::ImhNoPredictiveText) || inputMethodHints.testFlag(Qt::ImhHiddenText))
+ if (d->dictionaryState == HunspellInputMethodPrivate::DictionaryNotLoaded || inputMethodHints.testFlag(Qt::ImhNoPredictiveText) || inputMethodHints.testFlag(Qt::ImhHiddenText))
return QList<SelectionListModel::Type>();
return QList<SelectionListModel::Type>() << SelectionListModel::WordCandidateList;
}
diff --git a/src/virtualkeyboard/hunspellinputmethod_p.cpp b/src/virtualkeyboard/hunspellinputmethod_p.cpp
index 2512337d..0f4bc25a 100644
--- a/src/virtualkeyboard/hunspellinputmethod_p.cpp
+++ b/src/virtualkeyboard/hunspellinputmethod_p.cpp
@@ -94,6 +94,7 @@ bool HunspellInputMethodPrivate::createHunspell(const QString &locale)
QSharedPointer<HunspellLoadDictionaryTask> loadDictionaryTask(new HunspellLoadDictionaryTask(locale, searchPaths));
QObject::connect(loadDictionaryTask.data(), &HunspellLoadDictionaryTask::completed, q, &HunspellInputMethod::dictionaryLoadCompleted);
dictionaryState = HunspellInputMethodPrivate::DictionaryLoading;
+ emit q->selectionListsChanged();
hunspellWorker->addTask(loadDictionaryTask);
this->locale = locale;
}
@@ -173,7 +174,7 @@ bool HunspellInputMethodPrivate::isAutoSpaceAllowed() const
Q_Q(const HunspellInputMethod);
if (!autoSpaceAllowed)
return false;
- if (q->inputEngine()->inputMode() != InputEngine::Latin)
+ if (q->inputEngine()->inputMode() == InputEngine::Numeric)
return false;
InputContext *ic = q->inputContext();
if (!ic)
diff --git a/src/virtualkeyboard/hunspellworker.cpp b/src/virtualkeyboard/hunspellworker.cpp
index 9517ca4b..f2e502ad 100644
--- a/src/virtualkeyboard/hunspellworker.cpp
+++ b/src/virtualkeyboard/hunspellworker.cpp
@@ -90,7 +90,6 @@ void HunspellLoadDictionaryTask::run()
}
if (!affPath.isEmpty() && !dicPath.isEmpty()) {
- VIRTUALKEYBOARD_DEBUG() << "Hunspell dictionary is missing for the" << locale << "language. Search paths" << searchPaths;
*hunspellPtr = Hunspell_create(affPath.toUtf8().constData(), dicPath.toUtf8().constData());
if (*hunspellPtr) {
/* Make sure the encoding used by the dictionary is supported
@@ -106,6 +105,8 @@ void HunspellLoadDictionaryTask::run()
#ifdef QT_VIRTUALKEYBOARD_DEBUG
VIRTUALKEYBOARD_DEBUG() << "HunspellLoadDictionaryTask::run(): time:" << perf.elapsed() << "ms";
#endif
+ } else {
+ VIRTUALKEYBOARD_DEBUG() << "Hunspell dictionary is missing for" << locale << ". Search paths" << searchPaths;
}
emit completed(*hunspellPtr != 0);
diff --git a/src/virtualkeyboard/import/import.pro b/src/virtualkeyboard/import/import.pro
index 301f4f2b..d76bb91e 100644
--- a/src/virtualkeyboard/import/import.pro
+++ b/src/virtualkeyboard/import/import.pro
@@ -7,6 +7,6 @@ load(qml_module)
!cross_compile:if(build_pass|!debug_and_release) {
qtPrepareTool(QMLPLUGINDUMP, qmlplugindump)
- qmltypes.commands = QT_IM_MODULE=qtvirtualkeyboard $$QMLPLUGINDUMP -defaultplatform -nonrelocatable QtQuick.VirtualKeyboard 2.1 > $$PWD/plugins.qmltypes
+ qmltypes.commands = QT_IM_MODULE=qtvirtualkeyboard $$QMLPLUGINDUMP -defaultplatform -nonrelocatable QtQuick.VirtualKeyboard 2.3 > $$PWD/plugins.qmltypes
QMAKE_EXTRA_TARGETS += qmltypes
}
diff --git a/src/virtualkeyboard/inputcontext.cpp b/src/virtualkeyboard/inputcontext.cpp
index 6d36ae5e..b0a81f32 100644
--- a/src/virtualkeyboard/inputcontext.cpp
+++ b/src/virtualkeyboard/inputcontext.cpp
@@ -173,7 +173,6 @@ InputContext::InputContext(PlatformInputContext *parent) :
if (d->inputContext) {
d->inputContext->setInputContext(this);
connect(d->inputContext, SIGNAL(focusObjectChanged()), SLOT(onInputItemChanged()));
- connect(d->inputContext, SIGNAL(focusObjectChanged()), SIGNAL(inputItemChanged()));
}
d->inputEngine = new InputEngine(this);
d->shiftHandler = new ShiftHandler(this);
@@ -650,6 +649,8 @@ void InputContext::onInputItemChanged()
d->stateFlags &= ~InputContextPrivate::KeyEventState;
}
d->stateFlags &= ~InputContextPrivate::InputMethodClickState;
+
+ emit inputItemChanged();
}
void InputContext::setFocus(bool enable)
diff --git a/src/virtualkeyboard/inputengine.cpp b/src/virtualkeyboard/inputengine.cpp
index f15eee26..e825f05b 100644
--- a/src/virtualkeyboard/inputengine.cpp
+++ b/src/virtualkeyboard/inputengine.cpp
@@ -85,6 +85,7 @@ public:
AbstractInputMethod *defaultInputMethod;
InputEngine::TextCase textCase;
InputEngine::InputMode inputMode;
+ QList<int> inputModes;
QMap<SelectionListModel::Type, SelectionListModel *> selectionListModels;
Qt::Key activeKey;
QString activeKeyText;
@@ -158,6 +159,8 @@ InputEngine::InputEngine(InputContext *parent) :
connect(d->inputContext, SIGNAL(shiftChanged()), SLOT(shiftChanged()));
connect(d->inputContext, SIGNAL(localeChanged()), SLOT(update()));
QObject::connect(d->inputContext, &InputContext::inputMethodHintsChanged, this, &InputEngine::updateSelectionListModels);
+ QObject::connect(d->inputContext, &InputContext::localeChanged, this, &InputEngine::updateInputModes);
+ QObject::connect(this, &InputEngine::inputMethodChanged, this, &InputEngine::updateInputModes);
}
d->defaultInputMethod = new DefaultInputMethod(this);
if (d->defaultInputMethod)
@@ -378,7 +381,6 @@ void InputEngine::setInputMethod(AbstractInputMethod *inputMethod)
}
updateSelectionListModels();
emit inputMethodChanged();
- emit inputModesChanged();
emit patternRecognitionModesChanged();
}
}
@@ -389,18 +391,7 @@ void InputEngine::setInputMethod(AbstractInputMethod *inputMethod)
QList<int> InputEngine::inputModes() const
{
Q_D(const InputEngine);
- QList<InputMode> inputModeList;
- if (d->inputMethod) {
- inputModeList = d->inputMethod->inputModes(d->inputContext->locale());
- }
- QList<int> resultList;
- if (inputModeList.isEmpty()) {
- return resultList;
- }
- resultList.reserve(inputModeList.size());
- for (const InputMode &inputMode : qAsConst(inputModeList))
- resultList.append(inputMode);
- return resultList;
+ return d->inputModes;
}
InputEngine::InputMode InputEngine::inputMode() const
@@ -414,16 +405,22 @@ void InputEngine::setInputMode(InputEngine::InputMode inputMode)
Q_D(InputEngine);
VIRTUALKEYBOARD_DEBUG() << "InputEngine::setInputMode():" << inputMode;
if (d->inputMethod) {
- const QString locale(d->inputContext->locale());
- QList<InputEngine::InputMode> inputModeList(d->inputMethod->inputModes(locale));
- if (inputModeList.contains(inputMode)) {
- d->inputMethod->setInputMode(locale, inputMode);
+#ifdef QT_DEBUG
+ // Cached input modes should be in sync with the input method
+ // If the assert below fails, we have missed an update somewhere
+ QList<int> cachedInputModes(d->inputModes);
+ updateInputModes();
+ Q_ASSERT(cachedInputModes == d->inputModes);
+#endif
+ if (d->inputModes.contains(inputMode)) {
+ d->inputMethod->setInputMode(d->inputContext->locale(), inputMode);
if (d->inputMode != inputMode) {
d->inputMode = inputMode;
emit inputModeChanged();
}
} else {
- qWarning() << "the input mode" << inputMode << "is not valid";
+ qWarning() << "Input mode" << inputMode <<
+ "is not in the list of available input modes" << d->inputModes;
}
}
}
@@ -580,7 +577,10 @@ void InputEngine::reset()
RecursiveMethodGuard guard(d->recursiveMethodLock);
if (!guard.locked()) {
emit inputMethodReset();
+ updateInputModes();
}
+ } else {
+ updateInputModes();
}
}
@@ -654,6 +654,29 @@ void InputEngine::updateSelectionListModels()
/*!
\internal
*/
+void InputEngine::updateInputModes()
+{
+ Q_D(InputEngine);
+ QList<int> newInputModes;
+ if (d->inputMethod) {
+ QList<InputMode> tmpList(d->inputMethod->inputModes(d->inputContext->locale()));
+ if (!tmpList.isEmpty()) {
+ std::transform(tmpList.constBegin(), tmpList.constEnd(),
+ std::back_inserter(newInputModes),
+ [tmpList] (InputMode inputMode) {
+ return static_cast<int>(inputMode);
+ });
+ }
+ }
+ if (d->inputModes != newInputModes) {
+ d->inputModes = newInputModes;
+ emit inputModesChanged();
+ }
+}
+
+/*!
+ \internal
+*/
void InputEngine::timerEvent(QTimerEvent *timerEvent)
{
Q_D(InputEngine);
@@ -740,6 +763,13 @@ void InputEngine::timerEvent(QTimerEvent *timerEvent)
\li \c InputEngine.Hiragana Hiragana input mode for Japanese.
\li \c InputEngine.Katakana Katakana input mode for Japanese.
\li \c InputEngine.FullwidthLatin Fullwidth latin input mode for East Asian languages.
+ \li \c InputEngine.Greek Greek input mode.
+ \li \c InputEngine.Cyrillic Cyrillic input mode.
+ \li \c InputEngine.Arabic Arabic input mode.
+ \li \c InputEngine.Hebrew Hebrew input mode.
+ \li \c InputEngine.ChineseHandwriting Chinese handwriting.
+ \li \c InputEngine.JapaneseHandwriting Japanese handwriting.
+ \li \c InputEngine.KoreanHandwriting Korean handwriting.
\endlist
*/
@@ -807,6 +837,14 @@ void InputEngine::timerEvent(QTimerEvent *timerEvent)
Katakana input mode for Japanese.
\value FullwidthLatin
Fullwidth latin input mode for East Asian languages.
+ \value Greek
+ Greek input mode.
+ \value Cyrillic
+ Cyrillic input mode.
+ \value Arabic
+ Arabic input mode.
+ \value Hebrew
+ Hebrew input mode.
*/
/*!
diff --git a/src/virtualkeyboard/inputengine.h b/src/virtualkeyboard/inputengine.h
index 784ed91c..66eb2c3d 100644
--- a/src/virtualkeyboard/inputengine.h
+++ b/src/virtualkeyboard/inputengine.h
@@ -73,7 +73,14 @@ public:
Hangul,
Hiragana,
Katakana,
- FullwidthLatin
+ FullwidthLatin,
+ Greek,
+ Cyrillic,
+ Arabic,
+ Hebrew,
+ ChineseHandwriting,
+ JapaneseHandwriting,
+ KoreanHandwriting
};
enum PatternRecognitionMode {
PatternRecognitionDisabled,
@@ -138,6 +145,7 @@ private slots:
void update();
void shiftChanged();
void updateSelectionListModels();
+ void updateInputModes();
protected:
void timerEvent(QTimerEvent *timerEvent);
diff --git a/src/virtualkeyboard/lipiinputmethod.cpp b/src/virtualkeyboard/lipiinputmethod.cpp
index 30ee9ed4..10dcb4ae 100644
--- a/src/virtualkeyboard/lipiinputmethod.cpp
+++ b/src/virtualkeyboard/lipiinputmethod.cpp
@@ -34,6 +34,7 @@
#include "shifthandler.h"
#include "virtualkeyboarddebug.h"
#include "trace.h"
+#include "handwritinggesturerecognizer.h"
#ifdef HAVE_HUNSPELL
#include "hunspellinputmethod_p.h"
@@ -49,14 +50,11 @@
#include <QCryptographicHash>
-#ifdef QT_VIRTUALKEYBOARD_LIPI_RECORD_TRACE_INPUT
+#ifdef QT_VIRTUALKEYBOARD_RECORD_TRACE_INPUT
+#include "unipentrace.h"
#include <QStandardPaths>
-#include <QFileInfo>
-#include <QDir>
#endif
-#include <QtCore/qmath.h>
-
#ifdef HAVE_HUNSPELL
#define LipiInputMethodPrivateBase HunspellInputMethodPrivate
#else
@@ -78,6 +76,9 @@ public:
q_ptr(q_ptr),
recognizeTimer(0),
textCase(InputEngine::Lower)
+#ifdef QT_VIRTUALKEYBOARD_RECORD_TRACE_INPUT
+ , unipenTrace(0)
+#endif
{
}
@@ -147,6 +148,8 @@ public:
}
}
+ gestureRecognizer.setDpi(deviceInfo->getXDPI());
+
currentContext = context;
}
@@ -165,6 +168,13 @@ public:
delayedResult.clear();
}
+#ifdef QT_VIRTUALKEYBOARD_RECORD_TRACE_INPUT
+ if (!unipenTrace) {
+ Q_Q(LipiInputMethod);
+ unipenTrace = new UnipenTrace(traceCaptureDeviceInfo, traceScreenInfo, q);
+ }
+#endif
+
Trace *trace = new Trace();
trace->setChannels(QStringList("t"));
traceList.append(trace);
@@ -201,7 +211,7 @@ public:
if (countActiveTraces() > 0)
return;
- QVariantMap gesture = detectGesture();
+ QVariantMap gesture = gestureRecognizer.recognize(traceList);
if (gesture.isEmpty())
return;
@@ -227,7 +237,7 @@ public:
if (swipeAngle <= 180 + SWIPE_ANGLE_THRESHOLD && swipeAngle >= 180 - SWIPE_ANGLE_THRESHOLD) {
if (swipeTouchCount == 1) {
// Single swipe: backspace
-#ifdef QT_VIRTUALKEYBOARD_LIPI_RECORD_TRACE_INPUT
+#ifdef QT_VIRTUALKEYBOARD_RECORD_TRACE_INPUT
dumpTraces();
saveTraces(Qt::Key_Backspace, 100);
#endif
@@ -250,7 +260,7 @@ public:
if (swipeAngle <= SWIPE_ANGLE_THRESHOLD || swipeAngle >= 360 - SWIPE_ANGLE_THRESHOLD) {
if (swipeTouchCount == 1) {
// Single swipe: space
-#ifdef QT_VIRTUALKEYBOARD_LIPI_RECORD_TRACE_INPUT
+#ifdef QT_VIRTUALKEYBOARD_RECORD_TRACE_INPUT
dumpTraces();
saveTraces(Qt::Key_Space, 100);
#endif
@@ -274,7 +284,7 @@ public:
if (swipeAngle <= 270 + SWIPE_ANGLE_THRESHOLD && swipeAngle >= 270 - SWIPE_ANGLE_THRESHOLD) {
if (swipeTouchCount == 1) {
// Single swipe: toggle input mode
-#ifdef QT_VIRTUALKEYBOARD_LIPI_RECORD_TRACE_INPUT
+#ifdef QT_VIRTUALKEYBOARD_RECORD_TRACE_INPUT
dumpTraces();
saveTraces(Qt::Key_Mode_switch, 100);
#endif
@@ -296,157 +306,6 @@ public:
}
}
- QVariantMap detectGesture()
- {
- if (traceList.count() > 0 && traceList.count() < 3) {
-
- // Swipe gesture detection
- // =======================
- //
- // The following algorithm is based on the assumption that a
- // vector composed of two arbitrary selected, but consecutive
- // measuring points, and a vector composed of the first and last
- // of the measuring points, are approximately in the same angle.
- //
- // If the measuring points are located very close to each other,
- // the angle can fluctuate a lot. This has been taken into account
- // by setting a minimum Euclidean distance between the measuring
- // points.
- //
-
- // Minimum euclidean distance of a segment (in millimeters)
- static const int MINIMUM_EUCLIDEAN_DISTANCE = 8;
-
- // Maximum theta variance (in degrees)
- static const qreal THETA_THRESHOLD = 25.0;
-
- // Maximum width variance in multitouch swipe (+- in percent)
- static const int MAXIMUM_WIDTH_VARIANCE = 20;
-
- const int dpi = deviceInfo->getXDPI() >= 0 ? deviceInfo->getXDPI() : 96;
- const qreal minimumEuclideanDistance = MINIMUM_EUCLIDEAN_DISTANCE / 25.4 * dpi;
- static const qreal thetaThreshold = qDegreesToRadians(THETA_THRESHOLD);
-
- QList<QVector2D> swipeVectors;
-
- int traceIndex;
- const int traceCount = traceList.size();
- for (traceIndex = 0; traceIndex < traceCount; ++traceIndex) {
-
- const Trace *trace = traceList.at(traceIndex);
- const QVariantList &points = trace->points();
- QVector2D swipeVector;
- const int pointCount = points.count();
- int pointIndex = 0;
- if (pointCount >= 2) {
-
- QPointF startPosition = points.first().toPointF();
- swipeVector = QVector2D(points.last().toPointF() - startPosition);
- const qreal swipeLength = swipeVector.length();
-
- if (swipeLength >= minimumEuclideanDistance) {
-
- QPointF previousPosition = startPosition;
- qreal euclideanDistance = 0;
- for (pointIndex = 1; pointIndex < pointCount; ++pointIndex) {
-
- QPointF currentPosition(points.at(pointIndex).toPointF());
-
- euclideanDistance += QVector2D(currentPosition - previousPosition).length();
- if (euclideanDistance >= minimumEuclideanDistance) {
-
- // Set the angle (theta) between the sample vector and the swipe vector
- const QVector2D sampleVector(currentPosition - startPosition);
- const qreal theta = qAcos(QVector2D::dotProduct(swipeVector, sampleVector) / (swipeLength * sampleVector.length()));
-
- // Rejected when theta above threshold
- if (theta >= thetaThreshold) {
- swipeVector = QVector2D();
- break;
- }
-
- startPosition = currentPosition;
- euclideanDistance = 0;
- }
-
- previousPosition = currentPosition;
- }
-
- if (pointIndex < pointCount) {
- swipeVector = QVector2D();
- break;
- }
-
- // Check to see if angle and length matches to existing touch points
- if (!swipeVectors.isEmpty()) {
- bool matchesToExisting = true;
- const qreal minimumSwipeLength = (swipeLength * (100.0 - MAXIMUM_WIDTH_VARIANCE) / 100.0);
- const qreal maximumSwipeLength = (swipeLength * (100.0 + MAXIMUM_WIDTH_VARIANCE) / 100.0);
- for (const QVector2D &otherSwipeVector : qAsConst(swipeVectors)) {
- const qreal otherSwipeLength = otherSwipeVector.length();
- const qreal theta = qAcos(QVector2D::dotProduct(swipeVector, otherSwipeVector) / (swipeLength * otherSwipeLength));
-
- if (theta >= thetaThreshold) {
- matchesToExisting = false;
- break;
- }
-
- if (otherSwipeLength < minimumSwipeLength || otherSwipeLength > maximumSwipeLength) {
- matchesToExisting = false;
- break;
- }
- }
-
- if (!matchesToExisting) {
- swipeVector = QVector2D();
- break;
- }
- }
- } else {
- swipeVector = QVector2D();
- }
- }
-
- if (swipeVector.isNull())
- break;
-
- swipeVectors.append(swipeVector);
- }
-
- if (swipeVectors.size() == traceCount) {
-
- QVariantMap swipeGesture;
-
- // Get swipe angle from the first vector:
- // 0 degrees == right
- // 90 degrees == down
- // 180 degrees == left
- // 270 degrees == up
- QList<QVector2D>::ConstIterator swipeVector = swipeVectors.constBegin();
- qreal swipeLength = swipeVector->length();
- qreal swipeAngle = qAcos(swipeVector->x() / swipeLength);
- if (swipeVector->y() < 0)
- swipeAngle = 2 * M_PI - swipeAngle;
-
- // Calculate an average length of the vector
- for (++swipeVector; swipeVector != swipeVectors.end(); ++swipeVector)
- swipeLength += swipeVector->length();
- swipeLength /= traceCount;
-
- swipeGesture[QLatin1String("type")] = QLatin1String("swipe");
- swipeGesture[QLatin1String("angle")] = swipeAngle;
- swipeGesture[QLatin1String("angle_degrees")] = qRadiansToDegrees(swipeAngle);
- swipeGesture[QLatin1String("length")] = swipeLength;
- swipeGesture[QLatin1String("length_mm")] = swipeLength / dpi * 25.4;
- swipeGesture[QLatin1String("touch_count")] = traceCount;
-
- return swipeGesture;
- }
- }
-
- return QVariantMap();
- }
-
void clearTraces()
{
qDeleteAll(traceList);
@@ -484,7 +343,7 @@ public:
void finishRecognition()
{
-#ifdef QT_VIRTUALKEYBOARD_LIPI_RECORD_TRACE_INPUT
+#ifdef QT_VIRTUALKEYBOARD_RECORD_TRACE_INPUT
dumpTraces();
#endif
stopRecognizeTimer();
@@ -553,11 +412,14 @@ public:
{
const QChar ch = result["unicode"].toChar();
const QChar chUpper = ch.toUpper();
-#ifdef QT_VIRTUALKEYBOARD_LIPI_RECORD_TRACE_INPUT
+#ifdef QT_VIRTUALKEYBOARD_RECORD_TRACE_INPUT
// In recording mode, the text case must match with the current text case
- if (ch.isLetter() && (ch.isUpper() != (textCase == InputEngine::Upper)))
- return;
- saveTraces(ch.unicode(), qRound(result["confidence"].toDouble() * 100));
+ if (unipenTrace) {
+ if (!ch.isLetter() || (ch.isUpper() == (textCase == InputEngine::Upper)))
+ saveTraces(ch.unicode(), qRound(result["confidence"].toDouble() * 100));
+ delete unipenTrace;
+ unipenTrace = 0;
+ }
#endif
Q_Q(LipiInputMethod);
q->inputContext()->inputEngine()->virtualKeyClick((Qt::Key)chUpper.unicode(),
@@ -565,72 +427,23 @@ public:
Qt::NoModifier);
}
-#ifdef QT_VIRTUALKEYBOARD_LIPI_RECORD_TRACE_INPUT
- QStringList recordedData;
-
+#ifdef QT_VIRTUALKEYBOARD_RECORD_TRACE_INPUT
void dumpTraces()
{
- recordedData.clear();
- recordedData.append(QStringLiteral(".VERSION 1.0"));
- recordedData.append(QStringLiteral(".HIERARCHY CHARACTER"));
- recordedData.append(QStringLiteral(".COORD X Y T"));
- recordedData.append(QStringLiteral(".SEGMENT CHARACTER"));
- recordedData.append(QStringLiteral(".X_DIM %1").arg(qRound(screenContext->getBboxRight())));
- recordedData.append(QStringLiteral(".Y_DIM %1").arg(qRound(screenContext->getBboxBottom())));
- recordedData.append(QStringLiteral(".X_POINTS_PER_INCH %1").arg(deviceInfo->getXDPI()));
- recordedData.append(QStringLiteral(".Y_POINTS_PER_INCH %1").arg(deviceInfo->getYDPI()));
- recordedData.append(QStringLiteral(".POINTS_PER_SECOND %1").arg(deviceInfo->getSamplingRate()));
-
- qlonglong t0 = 0;
- for (const Trace *trace : qAsConst(traceList)) {
- const QVariantList &points = trace->points();
- const bool hasTime = trace->channels().contains("t");
- const QVariantList timeData = hasTime ? trace->channelData("t") : QVariantList();
- QVariantList::ConstIterator t = timeData.constBegin();
- if (t0 == 0 && hasTime)
- t0 = t->toLongLong();
-
- recordedData.append(QStringLiteral(".PEN_DOWN"));
-
- for (const QVariant &point : points) {
- const QPointF pt(point.toPointF());
- QString pointStr(QStringLiteral("%1 %2 ").arg(qRound(pt.x())).arg(qRound(pt.y())));
- if (hasTime) {
- pointStr.append(QString::number(t->toLongLong() - t0));
- t++;
- } else {
- pointStr.append(QStringLiteral("0"));
- }
- recordedData.append(pointStr);
- }
-
- recordedData.append(QStringLiteral(".PEN_UP"));
- }
+ if (unipenTrace)
+ unipenTrace->record(traceList);
}
void saveTraces(uint unicode, uint confidence)
{
- QString fileName;
+ if (!unipenTrace)
+ return;
+
QStringList homeLocations = QStandardPaths::standardLocations(QStandardPaths::HomeLocation);
if (!homeLocations.isEmpty()) {
QString filePath = QStringLiteral("%1/%2").arg(homeLocations.at(0)).arg("VIRTUAL_KEYBOARD_TRACES");
- QDir fileDir(filePath);
- if (!fileDir.exists())
- fileDir.mkpath(filePath);
- if (fileDir.exists()) {
- int fileIndex = 0;
- do {
- fileName = fileDir.absoluteFilePath(QStringLiteral("%1_%2_%3.txt").arg(unicode).arg(confidence, 3, 10, QLatin1Char('0')).arg(fileIndex++));
- } while (QFileInfo::exists(fileName));
- }
- }
- QString dataStr(recordedData.join('\n'));
- dataStr.append('\n');
- QFile file(fileName);
- if (file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate)) {
- file.write(dataStr.toUtf8().constData());
- } else {
- qWarning() << "Cannot open file for writing" << fileName;
+ unipenTrace->setDirectory(filePath);
+ unipenTrace->save(unicode, confidence);
}
}
#endif
@@ -647,6 +460,10 @@ public:
InputEngine::TextCase textCase;
vector<int> subsetOfClasses;
QVariantMap delayedResult;
+ HandwritingGestureRecognizer gestureRecognizer;
+#ifdef QT_VIRTUALKEYBOARD_RECORD_TRACE_INPUT
+ UnipenTrace *unipenTrace;
+#endif
};
/*!
@@ -666,10 +483,19 @@ LipiInputMethod::~LipiInputMethod()
QList<InputEngine::InputMode> LipiInputMethod::inputModes(const QString &locale)
{
Q_UNUSED(locale)
- return QList<InputEngine::InputMode>()
- << InputEngine::Latin
- << InputEngine::Numeric
- << InputEngine::Dialable;
+ QList<InputEngine::InputMode> availableInputModes;
+ const Qt::InputMethodHints inputMethodHints(inputContext()->inputMethodHints());
+
+ if (inputMethodHints.testFlag(Qt::ImhDialableCharactersOnly) || inputMethodHints.testFlag(Qt::ImhDigitsOnly)) {
+ availableInputModes.append(InputEngine::Dialable);
+ } else if (inputMethodHints.testFlag(Qt::ImhFormattedNumbersOnly)) {
+ availableInputModes.append(InputEngine::Numeric);
+ } else {
+ availableInputModes.append(InputEngine::Latin);
+ availableInputModes.append(InputEngine::Numeric);
+ }
+
+ return availableInputModes;
}
bool LipiInputMethod::setInputMode(const QString &locale, InputEngine::InputMode inputMode)
diff --git a/src/virtualkeyboard/plaininputmethod.cpp b/src/virtualkeyboard/plaininputmethod.cpp
index 29c560da..2ca10cb4 100644
--- a/src/virtualkeyboard/plaininputmethod.cpp
+++ b/src/virtualkeyboard/plaininputmethod.cpp
@@ -49,13 +49,26 @@ PlainInputMethod::~PlainInputMethod()
QList<InputEngine::InputMode> PlainInputMethod::inputModes(const QString &locale)
{
- Q_UNUSED(locale)
- // Supports all input modes
- return QList<InputEngine::InputMode>()
- << InputEngine::Latin
- << InputEngine::Numeric
- << InputEngine::Dialable
- << InputEngine::Pinyin;
+ QList<InputEngine::InputMode> result;
+ switch (QLocale(locale).script()) {
+ case QLocale::GreekScript:
+ result.append(InputEngine::Greek);
+ break;
+ case QLocale::CyrillicScript:
+ result.append(InputEngine::Cyrillic);
+ break;
+ case QLocale::ArabicScript:
+ result.append(InputEngine::Arabic);
+ break;
+ case QLocale::HebrewScript:
+ result.append(InputEngine::Hebrew);
+ break;
+ default:
+ break;
+ }
+ result.append(InputEngine::Latin);
+ result.append(InputEngine::Numeric);
+ return result;
}
bool PlainInputMethod::setInputMode(const QString &locale, InputEngine::InputMode inputMode)
diff --git a/src/virtualkeyboard/plugin.cpp b/src/virtualkeyboard/plugin.cpp
index 73ddeabc..136bba80 100644
--- a/src/virtualkeyboard/plugin.cpp
+++ b/src/virtualkeyboard/plugin.cpp
@@ -199,6 +199,7 @@ QPlatformInputContext *QVirtualKeyboardPlugin::create(const QString &system, con
qmlRegisterType(QUrl(path + QLatin1String("InputPanel.qml")), pluginUri, 2, 0, "InputPanel");
qmlRegisterType(QUrl(path + QLatin1String("InputPanel.qml")), pluginUri, 2, 1, "InputPanel");
qmlRegisterType(QUrl(path + QLatin1String("InputPanel.qml")), pluginUri, 2, 2, "InputPanel");
+ qmlRegisterType(QUrl(path + QLatin1String("InputPanel.qml")), pluginUri, 2, 3, "InputPanel");
qmlRegisterType(QUrl(path + QLatin1String("HandwritingInputPanel.qml")), pluginUri, 2, 0, "HandwritingInputPanel");
const QString componentsPath = path + QStringLiteral("components/");
qmlRegisterType(QUrl(componentsPath + QLatin1String("AlternativeKeys.qml")), pluginUri, 1, 0, "AlternativeKeys");
@@ -248,6 +249,7 @@ QPlatformInputContext *QVirtualKeyboardPlugin::create(const QString &system, con
qmlRegisterType(QUrl(componentsPath + QLatin1String("WordCandidatePopupList.qml")), pluginUri, 2, 0, "WordCandidatePopupList");
qmlRegisterType(QUrl(componentsPath + QLatin1String("LanguagePopupList.qml")), pluginUri, 2, 1, "LanguagePopupList");
qmlRegisterType(QUrl(componentsPath + QLatin1String("SelectionControl.qml")), pluginUri, 2, 1, "SelectionControl");
+ qmlRegisterType(QUrl(componentsPath + QLatin1String("InputModeKey.qml")), pluginUri, 2, 3, "InputModeKey");
if (system.compare(system, QLatin1String(pluginName), Qt::CaseInsensitive) == 0) {
platformInputContext = new PlatformInputContext();
diff --git a/src/virtualkeyboard/shifthandler.cpp b/src/virtualkeyboard/shifthandler.cpp
index 376410e3..8f42a762 100644
--- a/src/virtualkeyboard/shifthandler.cpp
+++ b/src/virtualkeyboard/shifthandler.cpp
@@ -50,11 +50,10 @@ public:
shiftChanged(false),
resetWhenVisible(false),
manualShiftLanguageFilter(QSet<QLocale::Language>() << QLocale::Arabic << QLocale::Persian << QLocale::Hindi << QLocale::Korean),
- manualCapsInputModeFilter(QSet<InputEngine::InputMode>() << InputEngine::Cangjie << InputEngine::Zhuyin),
- noAutoUppercaseInputModeFilter(QSet<InputEngine::InputMode>() << InputEngine::FullwidthLatin << InputEngine::Pinyin << InputEngine::Cangjie << InputEngine::Zhuyin),
+ manualCapsInputModeFilter(QSet<InputEngine::InputMode>() << InputEngine::Cangjie << InputEngine::Zhuyin << InputEngine::Hebrew),
+ noAutoUppercaseInputModeFilter(QSet<InputEngine::InputMode>() << InputEngine::FullwidthLatin << InputEngine::Pinyin << InputEngine::Cangjie << InputEngine::Zhuyin << InputEngine::ChineseHandwriting << InputEngine::JapaneseHandwriting << InputEngine::KoreanHandwriting),
allCapsInputModeFilter(QSet<InputEngine::InputMode>() << InputEngine::Hiragana << InputEngine::Katakana)
{
- timer.start();
}
InputContext *inputContext;
@@ -185,7 +184,7 @@ void ShiftHandler::toggleShift()
QStyleHints *style = QGuiApplication::styleHints();
- if (d->timer.elapsed() > style->mouseDoubleClickInterval()) {
+ if (d->timer.isNull() || d->timer.elapsed() > style->mouseDoubleClickInterval()) {
d->timer.restart();
} else if (d->timer.elapsed() < style->mouseDoubleClickInterval() && !d->inputContext->capsLock()) {
d->inputContext->setCapsLock(!d->inputContext->capsLock() && d->inputContext->shift() && !d->shiftChanged);
@@ -196,6 +195,15 @@ void ShiftHandler::toggleShift()
}
}
+/*! Clears the toggle shift timer.
+
+*/
+void ShiftHandler::clearToggleShiftTimer()
+{
+ Q_D(ShiftHandler);
+ d->timer = QTime();
+}
+
void ShiftHandler::reset()
{
Q_D(ShiftHandler);
diff --git a/src/virtualkeyboard/shifthandler.h b/src/virtualkeyboard/shifthandler.h
index c28a9581..93ba3e34 100644
--- a/src/virtualkeyboard/shifthandler.h
+++ b/src/virtualkeyboard/shifthandler.h
@@ -57,6 +57,7 @@ public:
bool toggleShiftEnabled() const;
Q_INVOKABLE void toggleShift();
+ Q_INVOKABLE void clearToggleShiftTimer();
signals:
void sentenceEndingCharactersChanged();
diff --git a/src/virtualkeyboard/t9write.h b/src/virtualkeyboard/t9write.h
new file mode 100644
index 00000000..621d2312
--- /dev/null
+++ b/src/virtualkeyboard/t9write.h
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef T9WRITE_H
+#define T9WRITE_H
+
+#include "t9write_api_version.h"
+#ifdef HAVE_T9WRITE_ALPHABETIC
+#include "decuma_hwr.h"
+#endif
+#ifdef HAVE_T9WRITE_CJK
+#include "decuma_hwr_cjk.h"
+#endif
+
+#if defined(HAVE_T9WRITE_CJK) && defined(HAVE_T9WRITE_ALPHABETIC)
+#define DECUMA_API(FUNC_NAME) (cjk ? decumaCJK ## FUNC_NAME : decuma ## FUNC_NAME)
+#elif defined(HAVE_T9WRITE_CJK)
+#define DECUMA_API(FUNC_NAME) (decumaCJK ## FUNC_NAME)
+#else // defined(HAVE_T9WRITE_ALPHABETIC)
+#define DECUMA_API(FUNC_NAME) (decuma ## FUNC_NAME)
+#endif
+
+#endif // T9WRITE_H
diff --git a/src/virtualkeyboard/t9writedictionary.cpp b/src/virtualkeyboard/t9writedictionary.cpp
new file mode 100644
index 00000000..d15b16e3
--- /dev/null
+++ b/src/virtualkeyboard/t9writedictionary.cpp
@@ -0,0 +1,117 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "t9writedictionary.h"
+#include "virtualkeyboarddebug.h"
+
+namespace QtVirtualKeyboard {
+
+T9WriteDictionary::T9WriteDictionary(DECUMA_SESSION *decumaSession,
+ const DECUMA_MEM_FUNCTIONS &memFuncs,
+ bool cjk) :
+ decumaSession(decumaSession),
+ memFuncs(memFuncs),
+ cjk(cjk),
+ sourceData(0),
+ sourceSize(0),
+ convertedData(0),
+ convertedSize(0)
+{
+}
+
+T9WriteDictionary::~T9WriteDictionary()
+{
+ if (convertedData) {
+ DECUMA_STATUS status = DECUMA_API(DestroyConvertedDictionary)(&convertedData, &memFuncs);
+ Q_ASSERT(status == decumaNoError);
+ Q_ASSERT(convertedData == 0);
+ }
+}
+
+bool T9WriteDictionary::load(const QString &fileName)
+{
+ if (sourceData || convertedData)
+ return false;
+
+ file.setFileName(fileName);
+ if (file.open(QIODevice::ReadOnly)) {
+ sourceSize = file.size();
+ sourceData = file.map(0, sourceSize, QFile::NoOptions);
+ if (!sourceData) {
+ sourceSize = 0;
+ qWarning() << "Could not read dictionary file" << fileName;
+ }
+ file.close();
+ } else {
+ qWarning() << "Could not open dictionary file" << fileName;
+ }
+
+ return sourceData != 0;
+}
+
+bool T9WriteDictionary::convert(const DECUMA_SRC_DICTIONARY_INFO &dictionaryInfo)
+{
+ if (!sourceData || convertedData)
+ return false;
+
+ DECUMA_STATUS status;
+ status = DECUMA_API(ConvertDictionary)(&convertedData, sourceData, (DECUMA_UINT32)sourceSize,
+ &dictionaryInfo, &convertedSize, &memFuncs);
+
+ if (status != decumaNoError) {
+ qWarning() << "Could not convert dictionary" << file.fileName();
+ file.unmap((uchar *)sourceData);
+ sourceSize = 0;
+ sourceData = 0;
+ }
+
+ return status == decumaNoError;
+}
+
+QString T9WriteDictionary::fileName() const
+{
+ return file.fileName();
+}
+
+const void *T9WriteDictionary::data() const
+{
+ return convertedData ? convertedData : sourceData;
+}
+
+qint64 T9WriteDictionary::size() const
+{
+ return convertedData ? convertedSize : sourceSize;
+}
+
+bool T9WriteDictionary::isConverted() const
+{
+ return convertedData != 0;
+}
+
+} // namespace QtVirtualKeyboard
diff --git a/src/virtualkeyboard/t9writedictionary.h b/src/virtualkeyboard/t9writedictionary.h
new file mode 100644
index 00000000..dc2d9475
--- /dev/null
+++ b/src/virtualkeyboard/t9writedictionary.h
@@ -0,0 +1,67 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef T9WRITEDICTIONARY_H
+#define T9WRITEDICTIONARY_H
+
+#include <QtGlobal>
+#include <QFile>
+#include "t9write.h"
+
+namespace QtVirtualKeyboard {
+
+class T9WriteDictionary
+{
+ Q_DISABLE_COPY(T9WriteDictionary)
+public:
+ explicit T9WriteDictionary(DECUMA_SESSION *decumaSession, const DECUMA_MEM_FUNCTIONS &memFuncs, bool cjk);
+ ~T9WriteDictionary();
+
+ bool load(const QString &fileName);
+ bool convert(const DECUMA_SRC_DICTIONARY_INFO &dictionaryInfo);
+
+ QString fileName() const;
+ const void *data() const;
+ qint64 size() const;
+ bool isConverted() const;
+
+private:
+ QFile file;
+ DECUMA_SESSION *decumaSession;
+ const DECUMA_MEM_FUNCTIONS &memFuncs;
+ bool cjk;
+ void *sourceData;
+ qint64 sourceSize;
+ void *convertedData;
+ DECUMA_UINT32 convertedSize;
+};
+
+}
+
+#endif // T9WRITEDICTIONARY_H
diff --git a/src/virtualkeyboard/t9writeinputmethod.cpp b/src/virtualkeyboard/t9writeinputmethod.cpp
index eb4cf9fb..14b6508b 100644
--- a/src/virtualkeyboard/t9writeinputmethod.cpp
+++ b/src/virtualkeyboard/t9writeinputmethod.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
@@ -34,16 +34,29 @@
#include "t9writeworker.h"
#include "virtualkeyboarddebug.h"
#include <QDirIterator>
+#include <QCryptographicHash>
#ifdef QT_VIRTUALKEYBOARD_DEBUG
#include <QTime>
#endif
+#include "handwritinggesturerecognizer.h"
+#ifdef QT_VIRTUALKEYBOARD_RECORD_TRACE_INPUT
+#include "unipentrace.h"
+#include <QStandardPaths>
+#endif
-#include "decuma_hwr.h"
#include "decumaStatus.h"
#include "decumaSymbolCategories.h"
#include "decumaLanguages.h"
#include "xxt9wOem.h"
+/* Set to 1 to enable T9 Write log.
+
+ The log is routed to qDebug() and it can be enabled for troubleshooting
+ and when reporting issues. The log must not to be enabled in production
+ build.
+*/
+#define QT_VIRTUALKEYBOARD_T9WRITE_LOG 0
+
namespace QtVirtualKeyboard {
class T9WriteCaseFormatter
@@ -94,12 +107,28 @@ class T9WriteInputMethodPrivate : public AbstractInputMethodPrivate
Q_DECLARE_PUBLIC(T9WriteInputMethod)
public:
+ enum EngineMode {
+ EngineUninitialized,
+ Alphabetic,
+ Arabic,
+ Hebrew,
+ SimplifiedChinese,
+ TraditionalChinese,
+ HongKongChinese,
+ Japanese,
+ Korean
+ };
+
T9WriteInputMethodPrivate(T9WriteInputMethod *q_ptr) :
AbstractInputMethodPrivate(),
q_ptr(q_ptr),
+ cjk(false),
+ engineMode(EngineUninitialized),
+ defaultHwrDbPath(QLatin1String(":/QtQuick/VirtualKeyboard/T9Write/data/")),
+ defaultDictionaryDbPath(defaultHwrDbPath),
dictionaryLock(QMutex::Recursive),
- convertedDictionary(0),
attachedDictionary(0),
+ traceListHardLimit(32),
resultId(0),
resultTimer(0),
decumaSession(0),
@@ -107,6 +136,9 @@ public:
arcAdditionStarted(false),
ignoreUpdate(false),
textCase(InputEngine::Lower)
+#ifdef QT_VIRTUALKEYBOARD_RECORD_TRACE_INPUT
+ , unipenTrace()
+#endif
{
}
@@ -128,34 +160,76 @@ public:
free(ptr);
}
- void initEngine()
+#if QT_VIRTUALKEYBOARD_T9WRITE_LOG
+ static void decumaLogString(void *pUserData, const char *pLogString, DECUMA_UINT32 nLogStringLength)
+ {
+ static QMutex s_logMutex;
+ static QByteArray s_logString;
+ Q_UNUSED(pUserData)
+ Q_UNUSED(nLogStringLength)
+ QMutexLocker guard(&s_logMutex);
+ s_logString.append(pLogString, nLogStringLength);
+ if (s_logString.endsWith('\n')) {
+ while (s_logString.endsWith('\n'))
+ s_logString.chop(1);
+ qDebug() << (const char *)s_logString.constData();
+ s_logString.clear();
+ }
+ }
+#endif
+
+ bool initEngine(EngineMode newEngineMode)
{
- VIRTUALKEYBOARD_DEBUG() << "T9WriteInputMethodPrivate::initEngine()";
+ if (engineMode == newEngineMode)
+ return engineMode != EngineUninitialized;
+
+ VIRTUALKEYBOARD_DEBUG() << "T9WriteInputMethodPrivate::initEngine()" << newEngineMode;
if (decumaSession)
- return;
+ exitEngine();
- symbolCategories.clear();
- symbolCategories.append(DECUMA_CATEGORY_ANSI);
- languageCategories.clear();
- languageCategories.append(DECUMA_LANG_EN);
+ if (newEngineMode == EngineUninitialized)
+ return false;
+
+ switch (newEngineMode) {
+ case Alphabetic:
+ case Arabic:
+ case Hebrew:
+ cjk = false;
+ break;
+ case SimplifiedChinese:
+ case TraditionalChinese:
+ case HongKongChinese:
+ case Japanese:
+ case Korean:
+ cjk = true;
+ break;
+ default:
+ Q_ASSERT(0 && "Invalid EngineMode!");
+ return false;
+ }
+ engineMode = newEngineMode;
memset(&sessionSettings, 0, sizeof(sessionSettings));
- QString latinDb = findLatinDb(":/databases/HWR_LatinCG/");
- hwrDbFile.setFileName(latinDb);
+ QString hwrDb = findHwrDb(engineMode, defaultHwrDbPath);
+ hwrDbFile.setFileName(hwrDb);
if (!hwrDbFile.open(QIODevice::ReadOnly)) {
- qWarning() << "Could not open hwr database file" << latinDb;
- return;
+ qCritical() << "Could not open HWR database" << hwrDb;
+ exitEngine();
+ return false;
}
sessionSettings.pStaticDB = (DECUMA_STATIC_DB_PTR)hwrDbFile.map(0, hwrDbFile.size(), QFile::NoOptions);
if (!sessionSettings.pStaticDB) {
- hwrDbFile.close();
- qWarning() << "Could not map hwr database" << latinDb;
- return;
+ qCritical() << "Could not read HWR database" << hwrDb;
+ exitEngine();
+ return false;
}
+ symbolCategories.append(DECUMA_CATEGORY_ANSI);
+ languageCategories.append(DECUMA_LANG_EN);
+
sessionSettings.recognitionMode = mcrMode;
sessionSettings.bMinimizeAddArcPreProcessing = 1;
sessionSettings.writingDirection = unknownWriting;
@@ -164,17 +238,25 @@ public:
sessionSettings.charSet.pLanguages = languageCategories.data();
sessionSettings.charSet.nLanguages = languageCategories.size();
- session = QByteArray(decumaGetSessionSize(), 0);
+ session = QByteArray(DECUMA_API(GetSessionSize)(), 0);
decumaSession = (DECUMA_SESSION *)(!session.isEmpty() ? session.data() : 0);
- DECUMA_STATUS status = decumaBeginSession(decumaSession, &sessionSettings, &memFuncs);
+ DECUMA_STATUS status = DECUMA_API(BeginSession)(decumaSession, &sessionSettings, &memFuncs);
Q_ASSERT(status == decumaNoError);
if (status != decumaNoError) {
- qWarning() << "Could not initialize T9Write engine" << status;
+ qCritical() << "Could not initialize T9Write engine" << status;
+ exitEngine();
+ return false;
}
- worker.reset(new T9WriteWorker(decumaSession));
+#if QT_VIRTUALKEYBOARD_T9WRITE_LOG
+ DECUMA_API(StartLogging)(decumaSession, 0, decumaLogString);
+#endif
+
+ worker.reset(new T9WriteWorker(decumaSession, cjk));
worker->start();
+
+ return true;
}
void exitEngine()
@@ -188,36 +270,80 @@ public:
hwrDbFile.close();
}
- detachDictionary(&attachedDictionary);
- destroyConvertedDictionary(&convertedDictionary);
+ if (attachedDictionary) {
+ detachDictionary(attachedDictionary);
+ attachedDictionary.reset();
+ }
+ loadedDictionary.reset();
if (decumaSession) {
- decumaEndSession(decumaSession);
+#if QT_VIRTUALKEYBOARD_T9WRITE_LOG
+ DECUMA_API(StopLogging)(decumaSession);
+#endif
+ DECUMA_API(EndSession)(decumaSession);
decumaSession = 0;
session.clear();
}
memset(&sessionSettings, 0, sizeof(sessionSettings));
- }
- QString findLatinDb(const QString &dir)
- {
- QString latinDb;
- QDirIterator it(dir, QDirIterator::NoIteratorFlags);
- while (it.hasNext()) {
- QString fileEntry = it.next();
+ symbolCategories.clear();
+ languageCategories.clear();
- if (!fileEntry.endsWith(QLatin1String(".bin")))
- continue;
+ engineMode = EngineUninitialized;
+ cjk = false;
+ }
- latinDb = fileEntry;
+ QString findHwrDb(EngineMode mode, const QString &dir) const
+ {
+ QString hwrDbPath(dir);
+ switch (mode) {
+ case Alphabetic:
+#if T9WRITEAPIMAJORVERNUM >= 21
+ hwrDbPath.append(QLatin1String("hwrDB_le.bin"));
+#else
+ hwrDbPath.append(QLatin1String("_databas_le.bin"));
+#endif
+ break;
+ case Arabic:
+#if T9WRITEAPIMAJORVERNUM >= 21
+ hwrDbPath.append(QLatin1String("arabic/hwrDB_le.bin"));
+#else
+ hwrDbPath.append(QLatin1String("arabic/_databas_le.bin"));
+#endif
+ break;
+ case Hebrew:
+#if T9WRITEAPIMAJORVERNUM >= 21
+ hwrDbPath.append(QLatin1String("hebrew/hwrDB_le.bin"));
+#else
+ hwrDbPath.append(QLatin1String("hebrew/_databas_le.bin"));
+#endif
break;
+ case SimplifiedChinese:
+ hwrDbPath.append(QLatin1String("cjk_S_gb18030_le.hdb"));
+ break;
+ case TraditionalChinese:
+ hwrDbPath.append(QLatin1String("cjk_T_std_le.hdb"));
+ break;
+ case HongKongChinese:
+ hwrDbPath.append(QLatin1String("cjk_HK_std_le.hdb"));
+ break;
+ case Japanese:
+ hwrDbPath.append(QLatin1String("cjk_J_std_le.hdb"));
+ break;
+ case Korean:
+ hwrDbPath.append(QLatin1String("cjk_K_mkt_le.hdb"));
+ break;
+ default:
+ return QString();
}
- return latinDb;
+ return QFileInfo::exists(hwrDbPath) ? hwrDbPath : QString();
}
- QString findDictionary(const QString &dir, const QLocale &locale)
+ QString findDictionary(const QString &dir, const QLocale &locale, DECUMA_SRC_DICTIONARY_TYPE &srcType)
{
+ srcType = numberOfSrcDictionaryTypes;
+
QStringList languageCountry = locale.name().split("_");
if (languageCountry.length() != 2)
return QString();
@@ -227,11 +353,27 @@ public:
while (it.hasNext()) {
QString fileEntry = it.next();
- if (!fileEntry.endsWith(QLatin1String(".ldb")))
+ if (!fileEntry.contains("_" + languageCountry[0].toUpper()))
continue;
- if (!fileEntry.contains("_" + languageCountry[0].toUpper()))
+ if (fileEntry.endsWith(QLatin1String(".ldb"))) {
+#if T9WRITEAPIMAJORVERNUM >= 20
+ qCritical() << "Incompatible T9 Write dictionary" << fileEntry;
continue;
+#else
+ srcType = decumaXT9LDB;
+#endif
+ } else if (fileEntry.endsWith(QLatin1String(".phd"))) {
+#if T9WRITEAPIMAJORVERNUM >= 20
+ srcType = decumaPortableHWRDictionary;
+#else
+ qCritical() << "Incompatible T9 Write dictionary" << fileEntry;
+ continue;
+#endif
+ } else {
+ qWarning() << "Incompatible T9 Write dictionary" << fileEntry;
+ continue;
+ }
dictionary = fileEntry;
break;
@@ -240,201 +382,136 @@ public:
return dictionary;
}
- bool attachDictionary(void *dictionary)
+ bool attachDictionary(const QSharedPointer<T9WriteDictionary> &dictionary)
{
- VIRTUALKEYBOARD_DEBUG() << "T9WriteInputMethodPrivate::attachDictionary():" << dictionary;
-
QMutexLocker dictionaryGuard(&dictionaryLock);
Q_ASSERT(decumaSession != 0);
Q_ASSERT(dictionary != 0);
-
- DECUMA_STATUS status = decumaAttachConvertedDictionary(decumaSession, dictionary);
- Q_ASSERT(status == decumaNoError);
+ VIRTUALKEYBOARD_DEBUG() << "T9WriteInputMethodPrivate::attachDictionary():" << dictionary->fileName();
+#if T9WRITEAPIMAJORVERNUM >= 20
+ DECUMA_STATUS status = DECUMA_API(AttachDictionary)(decumaSession, dictionary->data(), dictionary->size());
+#else
+ DECUMA_STATUS status = DECUMA_API(AttachConvertedDictionary)(decumaSession, dictionary->data());
+#endif
return status == decumaNoError;
}
- void detachDictionary(void **dictionary)
+ void detachDictionary(const QSharedPointer<T9WriteDictionary> &dictionary)
{
QMutexLocker dictionaryGuard(&dictionaryLock);
- Q_ASSERT(decumaSession != 0);
- if (!dictionary || !*dictionary)
+ if (!dictionary)
return;
- VIRTUALKEYBOARD_DEBUG() << "T9WriteInputMethodPrivate::detachDictionary():" << *dictionary;
+ VIRTUALKEYBOARD_DEBUG() << "T9WriteInputMethodPrivate::detachDictionary():" << dictionary->fileName();
- DECUMA_STATUS status = decumaDetachDictionary(decumaSession, *dictionary);
- Q_UNUSED(status)
- Q_ASSERT(status == decumaNoError);
- *dictionary = 0;
- }
-
- void destroyConvertedDictionary(void **dictionary)
- {
- QMutexLocker dictionaryGuard(&dictionaryLock);
Q_ASSERT(decumaSession != 0);
- if (!dictionary || !*dictionary)
- return;
-
- VIRTUALKEYBOARD_DEBUG() << "T9WriteInputMethodPrivate::destroyConvertedDictionary():" << *dictionary;
-
- DECUMA_STATUS status = decumaDestroyConvertedDictionary(dictionary, &memFuncs);
+ DECUMA_STATUS status = DECUMA_API(DetachDictionary)(decumaSession, dictionary->data());
Q_UNUSED(status)
Q_ASSERT(status == decumaNoError);
- Q_ASSERT(*dictionary == 0);
}
bool setInputMode(const QLocale &locale, InputEngine::InputMode inputMode)
{
+ Q_Q(T9WriteInputMethod);
VIRTUALKEYBOARD_DEBUG() << "T9WriteInputMethodPrivate::setInputMode():" << locale << inputMode;
- Q_Q(T9WriteInputMethod);
- DECUMA_UINT32 language = mapToDecumaLanguage(locale);
+ finishRecognition();
+
+ if (!initEngine(mapLocaleToEngineMode(locale)))
+ return false;
+
+ DECUMA_UINT32 language = mapToDecumaLanguage(locale, inputMode);
if (language == DECUMA_LANG_GSMDEFAULT) {
- qWarning() << "Handwriting input does not support the language" << locale.name();
+ qWarning() << "Handwriting is not supported in" << locale.name();
return false;
}
int isLanguageSupported = 0;
- decumaDatabaseIsLanguageSupported(sessionSettings.pStaticDB, language, &isLanguageSupported);
+ DECUMA_API(DatabaseIsLanguageSupported)(sessionSettings.pStaticDB, language, &isLanguageSupported);
if (!isLanguageSupported) {
- qWarning() << "Handwriting input does not support the language" << locale.name();
+ qWarning() << "Handwriting is not supported in" << locale.name();
return false;
}
- finishRecognition();
-
- bool languageChanged = languageCategories.isEmpty() || !languageCategories.contains(language);
- if (languageChanged) {
- languageCategories.clear();
- languageCategories.append(language);
- }
-
- // Choose the symbol categories by input mode, script and input method hints
- bool leftToRightGestures = true;
- Qt::InputMethodHints inputMethodHints = q->inputContext()->inputMethodHints();
- symbolCategories.clear();
- switch (inputMode) {
- case InputEngine::Latin:
- if (inputMethodHints.testFlag(Qt::ImhEmailCharactersOnly)) {
- symbolCategories.append(DECUMA_CATEGORY_EMAIL);
- } else if (inputMethodHints.testFlag(Qt::ImhUrlCharactersOnly)) {
- symbolCategories.append(DECUMA_CATEGORY_URL);
- } else {
- bool includeDigits = true;
- bool includeBasicPunctuation = true;
- switch (locale.script()) {
- case QLocale::LatinScript:
- if (language == DECUMA_LANG_EN)
- symbolCategories.append(DECUMA_CATEGORY_ANSI);
- else
- symbolCategories.append(DECUMA_CATEGORY_ISO8859_1);
- break;
-
- case QLocale::CyrillicScript:
- symbolCategories.append(DECUMA_CATEGORY_CYRILLIC);
- break;
-
- case QLocale::GreekScript:
- symbolCategories.append(DECUMA_CATEGORY_GREEK);
- break;
-
- default:
- qWarning() << "Handwriting input does not support the language" << locale.name();
- return false;
- }
-
- if (includeDigits)
- symbolCategories.append(DECUMA_CATEGORY_DIGIT);
-
- if (includeBasicPunctuation) {
- symbolCategories.append(DECUMA_CATEGORY_BASIC_PUNCTUATIONS);
- symbolCategories.append(DECUMA_CATEGORY_CONTRACTION_MARK);
- }
-
- if (language == DECUMA_LANG_ES)
- symbolCategories.append(DECUMA_CATEGORY_SPANISH_PUNCTUATIONS);
- }
- break;
-
- case InputEngine::Numeric:
- symbolCategories.append(DECUMA_CATEGORY_DIGIT);
- if (!inputMethodHints.testFlag(Qt::ImhDigitsOnly))
- symbolCategories.append(DECUMA_CATEGORY_NUM_SUP);
- break;
+ bool languageChanged = languageCategories.isEmpty() || languageCategories.first() != language;
+ languageCategories.clear();
+ languageCategories.append(language);
- case InputEngine::Dialable:
- symbolCategories.append(DECUMA_CATEGORY_PHONE_NUMBER);
- break;
+ // Add English as secondary language for non-latin languages.
+ // T9 Write requires it for punctuation and latin symbols if
+ // included in the symbol categories.
+ if (locale.script() != QLocale::LatinScript)
+ languageCategories.append(DECUMA_LANG_EN);
- default:
+ if (!updateSymbolCategories(language, locale, inputMode))
return false;
- }
-
- if (leftToRightGestures) {
- symbolCategories.append(DECUMA_CATEGORY_BACKSPACE_STROKE);
- symbolCategories.append(DECUMA_CATEGORY_RETURN_STROKE);
- symbolCategories.append(DECUMA_CATEGORY_WHITESPACE_STROKE);
- }
-
- /* The dictionary is loaded in the background thread. Once the loading is
- complete the dictionary will be attached to the current session. The
- attachment happens in the worker thread context, thus the direct
- connection for the signal handler and the mutex protecting the
- converted dictionary for concurrent access.
-
- The loading operation is blocking for the main thread only if the
- user starts handwriting input before the operation is complete.
- */
- {
- QMutexLocker dictionaryGuard(&dictionaryLock);
-
- // Select recognition mode
- // Note: MCR mode is preferred in all cases, since it eliminates the need
- // for recognition timer, thus provides better user experience.
- sessionSettings.recognitionMode = inputMethodHints.testFlag(Qt::ImhHiddenText) ? scrMode : mcrMode;
-
- // Detach previous dictionary if the language is being changed
- // or the recognizer mode is single-character mode
- if ((languageChanged || inputMethodHints.testFlag(Qt::ImhNoPredictiveText) || sessionSettings.recognitionMode == scrMode) && attachedDictionary) {
- detachDictionary(&attachedDictionary);
- }
-
- // Check if a dictionary needs to be loaded
- if (languageChanged || !convertedDictionary) {
- destroyConvertedDictionary(&convertedDictionary);
- dictionaryFileName = findDictionary(":/databases/XT9_LDBs/", locale);
- if (!dictionaryFileName.isEmpty()) {
- if (dictionaryTask.isNull() || dictionaryTask->fileUri != dictionaryFileName) {
- dictionaryTask.reset(new T9WriteDictionaryTask(dictionaryFileName, memFuncs));
- q->connect(dictionaryTask.data(), SIGNAL(completed(QString,void*)),
- SLOT(dictionaryLoadCompleted(QString,void*)), Qt::DirectConnection);
- worker->addTask(dictionaryTask);
- }
- }
- }
+ updateRecognitionMode(language, locale, inputMode);
+ updateDictionary(language, locale, languageChanged);
+ static const QList<DECUMA_UINT32> rtlLanguages = QList<DECUMA_UINT32>()
+ << DECUMA_LANG_AR << DECUMA_LANG_IW << DECUMA_LANG_FA << DECUMA_LANG_UR;
+ sessionSettings.writingDirection = rtlLanguages.contains(language) ? rightToLeft : unknownWriting;
+
+ // Enable multi-threaded recognition if available.
+#ifdef DECUMA_USE_MULTI_THREAD
+ // Note: This feature requires T9 Write v8.0.0 or later,
+ // and feature enabled in the SDK.
+ sessionSettings.nMaxThreads = qMax(QThread::idealThreadCount(), 0);
+#endif
- // Attach existing dictionary, if necessary
- if (sessionSettings.recognitionMode == mcrMode && !inputMethodHints.testFlag(Qt::ImhNoPredictiveText) &&
- convertedDictionary && !attachedDictionary) {
- attachDictionary(convertedDictionary);
- attachedDictionary = convertedDictionary;
- }
- }
+ VIRTUALKEYBOARD_DEBUG() << " -> language categories:" << languageCategories;
+ VIRTUALKEYBOARD_DEBUG() << " -> symbol categories:" << symbolCategories;
+ VIRTUALKEYBOARD_DEBUG() << " -> recognition mode:" << sessionSettings.recognitionMode;
// Change session settings
sessionSettings.charSet.pSymbolCategories = symbolCategories.data();
sessionSettings.charSet.nSymbolCategories = symbolCategories.size();
sessionSettings.charSet.pLanguages = languageCategories.data();
sessionSettings.charSet.nLanguages = languageCategories.size();
- DECUMA_STATUS status = decumaChangeSessionSettings(decumaSession, &sessionSettings);
+ DECUMA_STATUS status = DECUMA_API(ChangeSessionSettings)(decumaSession, &sessionSettings);
Q_ASSERT(status == decumaNoError);
- caseFormatter.preferLowercase = inputMethodHints.testFlag(Qt::ImhPreferLowercase);
+ caseFormatter.preferLowercase = q->inputContext()->inputMethodHints().testFlag(Qt::ImhPreferLowercase);
return status == decumaNoError;
}
- DECUMA_UINT32 mapToDecumaLanguage(const QLocale &locale)
+ EngineMode mapLocaleToEngineMode(const QLocale &locale)
+ {
+#ifdef HAVE_T9WRITE_CJK
+ switch (locale.language()) {
+ case QLocale::Chinese: {
+ if (locale.script() == QLocale::TraditionalChineseScript)
+ return locale.country() == QLocale::HongKong ? HongKongChinese : TraditionalChinese;
+ return SimplifiedChinese;
+ break;
+ }
+ case QLocale::Japanese:
+ return Japanese;
+ break;
+ case QLocale::Korean:
+ return Korean;
+ default:
+ break;
+ }
+#else
+ Q_UNUSED(locale)
+#endif
+
+#ifdef HAVE_T9WRITE_ALPHABETIC
+ switch (locale.script()) {
+ case QLocale::ArabicScript:
+ return T9WriteInputMethodPrivate::Arabic;
+ case QLocale::HebrewScript:
+ return T9WriteInputMethodPrivate::Hebrew;
+ default:
+ return T9WriteInputMethodPrivate::Alphabetic;
+ }
+#else
+ return T9WriteInputMethodPrivate::EngineUninitialized;
+#endif
+ }
+
+ DECUMA_UINT32 mapToDecumaLanguage(const QLocale &locale, InputEngine::InputMode inputMode)
{
static const QLocale::Language maxLanguage = QLocale::Vietnamese;
static const DECUMA_UINT32 languageMap[maxLanguage + 1] = {
@@ -538,7 +615,7 @@ public:
DECUMA_LANG_GSMDEFAULT, // Samoan = 97
DECUMA_LANG_GSMDEFAULT, // Sango = 98
DECUMA_LANG_GSMDEFAULT, // Sanskrit = 99
- DECUMA_LANG_SR, // Serbian = 100
+ DECUMA_LANG_SRCY, // Serbian = 100
DECUMA_LANG_GSMDEFAULT, // Ossetic = 101
DECUMA_LANG_ST, // SouthernSotho = 102
DECUMA_LANG_GSMDEFAULT, // Tswana = 103
@@ -573,22 +650,388 @@ public:
DECUMA_LANG_VI // Vietnamese = 132
};
+ int localeLanguage = locale.language();
if (locale.language() > maxLanguage)
return DECUMA_LANG_GSMDEFAULT;
- DECUMA_UINT32 language = languageMap[locale.language()];
+ DECUMA_UINT32 language = languageMap[localeLanguage];
+ if (language == DECUMA_LANG_PRC) {
+ if (inputMode != InputEngine::ChineseHandwriting)
+ language = DECUMA_LANG_EN;
+ else if (locale.script() == QLocale::TraditionalChineseScript)
+ language = (locale.country() == QLocale::HongKong) ? DECUMA_LANG_HK : DECUMA_LANG_TW;
+ } else if (language == DECUMA_LANG_JP) {
+ if (inputMode != InputEngine::JapaneseHandwriting)
+ language = DECUMA_LANG_EN;
+ } else if (language == DECUMA_LANG_KO) {
+ if (inputMode != InputEngine::KoreanHandwriting)
+ language = DECUMA_LANG_EN;
+ } else if (language == DECUMA_LANG_SRCY) {
+ if (inputMode != InputEngine::Cyrillic)
+ language = DECUMA_LANG_SRLA;
+ } else if (language == DECUMA_LANG_AR || language == DECUMA_LANG_FA) {
+ if (inputMode != InputEngine::Arabic && inputMode != InputEngine::Numeric)
+ language = DECUMA_LANG_EN;
+ } else if (language == DECUMA_LANG_IW) {
+ if (inputMode != InputEngine::Hebrew)
+ language = DECUMA_LANG_EN;
+ }
return language;
}
+ void updateRecognitionMode(DECUMA_UINT32 language, const QLocale &locale,
+ InputEngine::InputMode inputMode)
+ {
+ Q_Q(T9WriteInputMethod);
+ Q_UNUSED(language)
+ Q_UNUSED(locale)
+ Q_UNUSED(inputMode)
+
+ // Select recognition mode
+ // Note: MCR mode is preferred, as it does not require recognition
+ // timer and provides better user experience.
+ sessionSettings.recognitionMode = mcrMode;
+
+ // Use scrMode with hidden text or with no predictive mode
+ if (inputMode != InputEngine::ChineseHandwriting &&
+ inputMode != InputEngine::JapaneseHandwriting &&
+ inputMode != InputEngine::KoreanHandwriting) {
+ const Qt::InputMethodHints inputMethodHints = q->inputContext()->inputMethodHints();
+ if (inputMethodHints.testFlag(Qt::ImhHiddenText) || inputMethodHints.testFlag(Qt::ImhNoPredictiveText))
+ sessionSettings.recognitionMode = scrMode;
+ }
+ }
+
+ bool updateSymbolCategories(DECUMA_UINT32 language, const QLocale &locale,
+ InputEngine::InputMode inputMode)
+ {
+ // Handle CJK in separate method
+ if (cjk)
+ return updateSymbolCategoriesCjk(language, locale, inputMode);
+
+ symbolCategories.clear();
+
+ // Choose the symbol categories by input mode, script and input method hints
+ bool leftToRightGestures = true;
+ Q_Q(T9WriteInputMethod);
+ const Qt::InputMethodHints inputMethodHints = q->inputContext()->inputMethodHints();
+ switch (inputMode) {
+ case InputEngine::Latin:
+ if (inputMethodHints.testFlag(Qt::ImhEmailCharactersOnly)) {
+ symbolCategories.append(DECUMA_CATEGORY_EMAIL);
+ } else if (inputMethodHints.testFlag(Qt::ImhUrlCharactersOnly)) {
+ symbolCategories.append(DECUMA_CATEGORY_URL);
+ } else {
+ if (language == DECUMA_LANG_EN || language == DECUMA_LANG_NL)
+ symbolCategories.append(DECUMA_CATEGORY_ANSI);
+ else
+ symbolCategories.append(DECUMA_CATEGORY_ISO8859_1);
+ symbolCategories.append(DECUMA_CATEGORY_DIGIT);
+ symbolCategories.append(DECUMA_CATEGORY_BASIC_PUNCTUATIONS);
+ symbolCategories.append(DECUMA_CATEGORY_CONTRACTION_MARK);
+ if (language == DECUMA_LANG_ES)
+ symbolCategories.append(DECUMA_CATEGORY_SPANISH_PUNCTUATIONS);
+ }
+ break;
+
+ case InputEngine::Numeric:
+ if (language == DECUMA_LANG_AR || language == DECUMA_LANG_FA) {
+ symbolCategories.append(DECUMA_CATEGORY_ARABIC_NUM_MODE);
+ symbolCategories.append(DECUMA_CATEGORY_ARABIC_GESTURES);
+ leftToRightGestures = false;
+ break;
+ }
+ symbolCategories.append(DECUMA_CATEGORY_DIGIT);
+ if (!inputMethodHints.testFlag(Qt::ImhDigitsOnly))
+ symbolCategories.append(DECUMA_CATEGORY_NUM_SUP);
+ break;
+
+ case InputEngine::Dialable:
+ symbolCategories.append(DECUMA_CATEGORY_PHONE_NUMBER);
+ break;
+
+ case InputEngine::Greek:
+ symbolCategories.append(DECUMA_CATEGORY_GREEK);
+ symbolCategories.append(DECUMA_CATEGORY_QUEST_EXCL_MARK_PUNCTUATIONS);
+ symbolCategories.append(DECUMA_CATEGORY_PERIOD_COMMA_PUNCTUATIONS);
+ symbolCategories.append(DECUMA_CATEGORY_COLON_PUNCTUATIONS);
+ symbolCategories.append(DECUMA_CATEGORY_CONTRACTION_MARK);
+ symbolCategories.append(DECUMA_CATEGORY_CONTRACTION_MARK);
+ break;
+
+ case InputEngine::Cyrillic:
+ symbolCategories.append(DECUMA_CATEGORY_CYRILLIC);
+ symbolCategories.append(DECUMA_CATEGORY_QUEST_EXCL_MARK_PUNCTUATIONS);
+ symbolCategories.append(DECUMA_CATEGORY_PERIOD_COMMA_PUNCTUATIONS);
+ // Ukrainian needs contraction mark, but not Russian or Bulgarian
+ if (language == DECUMA_LANG_UK)
+ symbolCategories.append(DECUMA_CATEGORY_CONTRACTION_MARK);
+ break;
+
+ case InputEngine::Arabic:
+ symbolCategories.append(DECUMA_CATEGORY_ARABIC_ISOLATED_LETTER_MODE);
+ symbolCategories.append(DECUMA_CATEGORY_ARABIC_GESTURES);
+ leftToRightGestures = false;
+ break;
+
+ case InputEngine::Hebrew:
+ symbolCategories.append(DECUMA_CATEGORY_HEBREW_GL_HEBREW_CURSIVE_MODE);
+ symbolCategories.append(DECUMA_CATEGORY_HEBREW_GL_HEBREW_LETTERSYMBOLS);
+ symbolCategories.append(DECUMA_CATEGORY_HEBREW_SHEQEL);
+ symbolCategories.append(DECUMA_CATEGORY_ARABIC_GESTURES);
+ leftToRightGestures = false;
+ break;
+
+ default:
+ qWarning() << "Handwriting is not supported in" << locale.name();
+ return false;
+ }
+
+ if (leftToRightGestures) {
+ symbolCategories.append(DECUMA_CATEGORY_BACKSPACE_STROKE);
+ symbolCategories.append(DECUMA_CATEGORY_RETURN_STROKE);
+ symbolCategories.append(DECUMA_CATEGORY_WHITESPACE_STROKE);
+ }
+
+ return true;
+ }
+
+ bool updateSymbolCategoriesCjk(DECUMA_UINT32 language, const QLocale &locale,
+ InputEngine::InputMode inputMode)
+ {
+ Q_UNUSED(language)
+ Q_ASSERT(cjk);
+
+ symbolCategories.clear();
+
+ switch (inputMode) {
+ case InputEngine::Latin:
+ symbolCategories.append(DECUMA_CATEGORY_ANSI);
+ symbolCategories.append(DECUMA_CATEGORY_CJK_SYMBOL);
+ symbolCategories.append(DECUMA_CATEGORY_PUNCTUATIONS);
+ break;
+
+ case InputEngine::Numeric:
+ symbolCategories.append(DECUMA_CATEGORY_DIGIT);
+ symbolCategories.append(DECUMA_CATEGORY_CJK_SYMBOL);
+ symbolCategories.append(DECUMA_CATEGORY_PUNCTUATIONS);
+ break;
+
+ case InputEngine::Dialable:
+ symbolCategories.append(DECUMA_CATEGORY_DIGIT);
+ symbolCategories.append(DECUMA_CATEGORY_CJK_SYMBOL);
+ break;
+
+ case InputEngine::ChineseHandwriting:
+ switch (locale.script()) {
+ case QLocale::SimplifiedChineseScript:
+ symbolCategories.append(DECUMA_CATEGORY_GB2312_A);
+ symbolCategories.append(DECUMA_CATEGORY_GB2312_B_CHARS_ONLY);
+ symbolCategories.append(DECUMA_CATEGORY_GBK_3);
+ symbolCategories.append(DECUMA_CATEGORY_GBK_4);
+ symbolCategories.append(DECUMA_CATEGORY_CJK_SYMBOL);
+ symbolCategories.append(DECUMA_CATEGORY_CJK_GENERAL_PUNCTUATIONS);
+ symbolCategories.append(DECUMA_CATEGORY_PUNCTUATIONS);
+ break;
+
+ case QLocale::TraditionalChineseScript:
+ symbolCategories.append(DECUMA_CATEGORY_BIGFIVE);
+ if (language == DECUMA_LANG_HK)
+ symbolCategories.append(DECUMA_CATEGORY_HKSCS_CHARS_ONLY);
+ symbolCategories.append(DECUMA_CATEGORY_CJK_SYMBOL);
+ symbolCategories.append(DECUMA_CATEGORY_CJK_GENERAL_PUNCTUATIONS);
+ symbolCategories.append(DECUMA_CATEGORY_PUNCTUATIONS);
+ break;
+
+ default:
+ qWarning() << "Chinese handwriting is not supported in" << locale.name();
+ return false;
+ }
+ break;
+
+ case InputEngine::JapaneseHandwriting:
+ symbolCategories.append(DECUMA_CATEGORY_JIS_LEVEL_1);
+ symbolCategories.append(DECUMA_CATEGORY_JIS_LEVEL_2);
+ symbolCategories.append(DECUMA_CATEGORY_HIRAGANA);
+ symbolCategories.append(DECUMA_CATEGORY_KATAKANA);
+ symbolCategories.append(DECUMA_CATEGORY_HIRAGANASMALL);
+ symbolCategories.append(DECUMA_CATEGORY_KATAKANASMALL);
+ symbolCategories.append(DECUMA_CATEGORY_CJK_SYMBOL);
+ symbolCategories.append(DECUMA_CATEGORY_CJK_GENERAL_PUNCTUATIONS);
+ symbolCategories.append(DECUMA_CATEGORY_PUNCTUATIONS);
+ break;
+
+ case InputEngine::KoreanHandwriting:
+ symbolCategories.append(DECUMA_CATEGORY_HANGUL_1001_A);
+ symbolCategories.append(DECUMA_CATEGORY_HANGUL_1001_B);
+ symbolCategories.append(DECUMA_CATEGORY_CJK_SYMBOL);
+ symbolCategories.append(DECUMA_CATEGORY_CJK_GENERAL_PUNCTUATIONS);
+ symbolCategories.append(DECUMA_CATEGORY_PUNCTUATIONS);
+ break;
+
+ default:
+ return false;
+ }
+
+ return true;
+ }
+
+ void updateDictionary(DECUMA_UINT32 language, const QLocale &locale, bool languageChanged)
+ {
+ Q_Q(T9WriteInputMethod);
+
+ /* The dictionary is loaded in the background thread. Once the loading is
+ complete the dictionary will be attached to the current session. The
+ attachment happens in the worker thread context, thus the direct
+ connection for the signal handler and the mutex protecting the
+ converted dictionary for concurrent access.
+ The loading operation is blocking for the main thread only if the
+ user starts handwriting input before the operation is complete.
+ */
+ QMutexLocker dictionaryGuard(&dictionaryLock);
+
+ // Detach previous dictionary if the language is being changed
+ // or the recognizer mode is single-character mode
+ const Qt::InputMethodHints inputMethodHints = q->inputContext()->inputMethodHints();
+ if ((languageChanged || inputMethodHints.testFlag(Qt::ImhNoPredictiveText) || sessionSettings.recognitionMode == scrMode) && attachedDictionary) {
+ detachDictionary(attachedDictionary);
+ attachedDictionary.reset();
+ }
+
+ // Check if a dictionary needs to be loaded
+ if (languageChanged || !loadedDictionary) {
+ loadedDictionary.reset();
+
+ DECUMA_SRC_DICTIONARY_INFO dictionaryInfo;
+ memset(&dictionaryInfo, 0, sizeof(dictionaryInfo));
+
+ QList<QLocale> decumaLocales;
+ decumaLocales.append(locale);
+
+ // CJK: No dictionary for latin input
+ if (cjk && language == DECUMA_LANG_EN)
+ decumaLocales.clear();
+
+ dictionaryFileName.clear();
+ QLocale decumaLocale;
+ for (QLocale tryLocale : decumaLocales) {
+ dictionaryFileName = findDictionary(defaultDictionaryDbPath, tryLocale, dictionaryInfo.srcType);
+ if (!dictionaryFileName.isEmpty()) {
+ decumaLocale = tryLocale;
+ break;
+ }
+ }
+ if (!dictionaryFileName.isEmpty()) {
+ if (dictionaryTask.isNull() || dictionaryTask->dictionaryFileName != dictionaryFileName) {
+ VIRTUALKEYBOARD_DEBUG() << " -> load dictionary:" << dictionaryFileName;
+
+ bool convertDictionary = true;
+#if defined(HAVE_T9WRITE_CJK) && T9WRITEAPIMAJORVERNUM >= 20
+ // Chinese dictionary cannot be converted (PHD)
+ if (dictionaryInfo.srcType == decumaPortableHWRDictionary && decumaLocale.language() == QLocale::Chinese)
+ convertDictionary = false;
+#endif
+
+ QSharedPointer<T9WriteDictionary> newDictionary(new T9WriteDictionary(decumaSession, memFuncs, cjk));
+ dictionaryTask.reset(new T9WriteDictionaryTask(newDictionary, dictionaryFileName, convertDictionary, dictionaryInfo));
+
+ QObject::connect(dictionaryTask.data(), &T9WriteDictionaryTask::completed,
+ q, &T9WriteInputMethod::dictionaryLoadCompleted, Qt::DirectConnection);
+ worker->addTask(dictionaryTask);
+ }
+ }
+ }
+
+ // Attach existing dictionary, if available
+ if (sessionSettings.recognitionMode == mcrMode && !inputMethodHints.testFlag(Qt::ImhNoPredictiveText) &&
+ loadedDictionary && !attachedDictionary) {
+ if (attachDictionary(loadedDictionary))
+ attachedDictionary = loadedDictionary;
+ }
+ }
+
+ QByteArray getContext(InputEngine::PatternRecognitionMode patternRecognitionMode,
+ const QVariantMap &traceCaptureDeviceInfo,
+ const QVariantMap &traceScreenInfo) const
+ {
+ QCryptographicHash hash(QCryptographicHash::Md5);
+
+ hash.addData((const char *)&patternRecognitionMode, sizeof(patternRecognitionMode));
+
+ QByteArray mapData;
+ QDataStream ds(&mapData, QIODevice::WriteOnly);
+ ds << traceCaptureDeviceInfo;
+ ds << traceScreenInfo;
+ hash.addData(mapData);
+
+ return hash.result();
+ }
+
+ void setContext(InputEngine::PatternRecognitionMode patternRecognitionMode,
+ const QVariantMap &traceCaptureDeviceInfo,
+ const QVariantMap &traceScreenInfo)
+ {
+ QByteArray context = getContext(patternRecognitionMode, traceCaptureDeviceInfo, traceScreenInfo);
+ if (context == currentContext)
+ return;
+ currentContext = context;
+
+ VIRTUALKEYBOARD_DEBUG() << "T9WriteInputMethodPrivate::setContext():" << QString(context.toHex());
+
+ // Finish recognition, but preserve current input
+ Q_Q(T9WriteInputMethod);
+ QString preeditText = q->inputContext()->preeditText();
+ // WA: T9Write CJK may crash in some cases with long stringStart.
+ // Therefore we don't restore the current input in this mode.
+ bool preserveCurrentInput = !preeditText.isEmpty() && !cjk;
+ T9WriteCaseFormatter oldCaseFormatter(caseFormatter);
+ finishRecognition(!preserveCurrentInput);
+
+ if (preserveCurrentInput) {
+ caseFormatter = oldCaseFormatter;
+ stringStart = preeditText;
+ wordCandidates.append(preeditText);
+ activeWordIndex = 0;
+ emit q->selectionListChanged(SelectionListModel::WordCandidateList);
+ emit q->selectionListActiveItemChanged(SelectionListModel::WordCandidateList, activeWordIndex);
+ }
+
+ const int dpi = traceCaptureDeviceInfo.value("dpi", 96).toInt();
+ static const int INSTANT_GESTURE_WIDTH_THRESHOLD_MM = 25;
+ static const int INSTANT_GESTURE_HEIGHT_THRESHOLD_MM = 25;
+ instantGestureSettings.widthThreshold = INSTANT_GESTURE_WIDTH_THRESHOLD_MM / 25.4 * dpi;
+ instantGestureSettings.heightThreshold = INSTANT_GESTURE_HEIGHT_THRESHOLD_MM / 25.4 * dpi;
+
+ gestureRecognizer.setDpi(dpi);
+
+ QVariantList horizontalRulers(traceScreenInfo.value("horizontalRulers", QVariantList()).toList());
+ if (horizontalRulers.count() >= 2) {
+ sessionSettings.baseline = horizontalRulers.last().toInt();
+ sessionSettings.helpline = 0;
+ sessionSettings.topline = horizontalRulers.first().toInt();
+ sessionSettings.supportLineSet = baselineAndTopline;
+ } else {
+ sessionSettings.baseline = 0;
+ sessionSettings.helpline = 0;
+ sessionSettings.topline = 0;
+ sessionSettings.supportLineSet = baselineAndTopline;
+ }
+
+ DECUMA_STATUS status = DECUMA_API(ChangeSessionSettings)(decumaSession, &sessionSettings);
+ Q_ASSERT(status == decumaNoError);
+ }
+
Trace *traceBegin(int traceId, InputEngine::PatternRecognitionMode patternRecognitionMode,
const QVariantMap &traceCaptureDeviceInfo, const QVariantMap &traceScreenInfo)
{
Q_UNUSED(traceId)
Q_UNUSED(patternRecognitionMode)
- Q_UNUSED(traceCaptureDeviceInfo)
Q_UNUSED(traceScreenInfo)
+ if (!worker)
+ return 0;
+
stopResultTimer();
// Dictionary must be completed before the arc addition can begin
@@ -606,30 +1049,34 @@ public:
recognitionTask.reset();
}
- const int dpi = traceCaptureDeviceInfo.value("dpi", 96).toInt();
- static const int INSTANT_GESTURE_WIDTH_THRESHOLD_MM = 25;
- static const int INSTANT_GESTURE_HEIGHT_THRESHOLD_MM = 25;
- instantGestureSettings.widthThreshold = INSTANT_GESTURE_WIDTH_THRESHOLD_MM / 25.4 * dpi;
- instantGestureSettings.heightThreshold = INSTANT_GESTURE_HEIGHT_THRESHOLD_MM / 25.4 * dpi;
+#ifdef QT_VIRTUALKEYBOARD_RECORD_TRACE_INPUT
+ if (!unipenTrace)
+ unipenTrace.reset(new UnipenTrace(traceCaptureDeviceInfo, traceScreenInfo));
+#endif
+
+ setContext(patternRecognitionMode, traceCaptureDeviceInfo, traceScreenInfo);
DECUMA_STATUS status;
if (!arcAdditionStarted) {
- status = decumaBeginArcAddition(decumaSession);
+ status = DECUMA_API(BeginArcAddition)(decumaSession);
Q_ASSERT(status == decumaNoError);
arcAdditionStarted = true;
}
DECUMA_UINT32 arcID = (DECUMA_UINT32)traceId;
- status = decumaStartNewArc(decumaSession, arcID);
+ status = DECUMA_API(StartNewArc)(decumaSession, arcID);
Q_ASSERT(status == decumaNoError);
if (status != decumaNoError) {
- decumaEndArcAddition(decumaSession);
+ DECUMA_API(EndArcAddition)(decumaSession);
arcAdditionStarted = false;
return NULL;
}
Trace *trace = new Trace();
+#ifdef QT_VIRTUALKEYBOARD_RECORD_TRACE_INPUT
+ trace->setChannels(QStringList("t"));
+#endif
traceList.append(trace);
return trace;
@@ -638,7 +1085,7 @@ public:
void traceEnd(Trace *trace)
{
if (trace->isCanceled()) {
- decumaCancelArc(decumaSession, trace->traceId());
+ DECUMA_API(CancelArc)(decumaSession, trace->traceId());
traceList.removeOne(trace);
delete trace;
} else {
@@ -646,10 +1093,16 @@ public:
}
if (!traceList.isEmpty()) {
Q_ASSERT(arcAdditionStarted);
- if (countActiveTraces() == 0)
+ if (countActiveTraces() == 0) {
restartRecognition();
+ if (cjk) {
+ // For some reason gestures don't seem to work in CJK mode
+ // Using our own gesture recognizer as fallback
+ handleGesture();
+ }
+ }
} else if (arcAdditionStarted) {
- decumaEndArcAddition(decumaSession);
+ DECUMA_API(EndArcAddition)(decumaSession);
arcAdditionStarted = false;
}
}
@@ -675,17 +1128,26 @@ public:
Q_ASSERT(decumaSession != 0);
const QVariantList points = trace->points();
+ Q_ASSERT(!points.isEmpty());
DECUMA_UINT32 arcID = (DECUMA_UINT32)trace->traceId();
DECUMA_STATUS status;
for (const QVariant &p : points) {
const QPoint pt(p.toPointF().toPoint());
- status = decumaAddPoint(decumaSession, (DECUMA_COORD)pt.x(),(DECUMA_COORD)pt.y(), arcID);
- Q_ASSERT(status == decumaNoError);
+ status = DECUMA_API(AddPoint)(decumaSession, (DECUMA_COORD)pt.x(),(DECUMA_COORD)pt.y(), arcID);
+ if (status != decumaNoError) {
+ VIRTUALKEYBOARD_DEBUG() << "decumaAddPoint failed" << status;
+ finishRecognition();
+ return;
+ }
}
- status = decumaCommitArc(decumaSession, arcID);
- Q_ASSERT(status == decumaNoError);
+ status = DECUMA_API(CommitArc)(decumaSession, arcID);
+ if (status != decumaNoError) {
+ VIRTUALKEYBOARD_DEBUG() << "decumaCommitArc failed" << status;
+ finishRecognition();
+ return;
+ }
}
void noteSelected(int index)
@@ -696,7 +1158,7 @@ public:
VIRTUALKEYBOARD_DEBUG() << "T9WriteInputMethodPrivate::noteSelected():" << index;
Q_ASSERT(index >= 0 && index < wordCandidatesHwrResultIndex.length());
int resultIndex = wordCandidatesHwrResultIndex[index];
- DECUMA_STATUS status = decumaNoteSelectedCandidate(decumaSession, resultIndex);
+ DECUMA_STATUS status = DECUMA_API(NoteSelectedCandidate)(decumaSession, resultIndex);
Q_UNUSED(status)
Q_ASSERT(status == decumaNoError);
}
@@ -723,6 +1185,8 @@ public:
bool finishRecognition(bool emitSelectionListChanged = true)
{
VIRTUALKEYBOARD_DEBUG() << "T9WriteInputMethodPrivate::finishRecognition()";
+ if (!worker)
+ return false;
bool result = !traceList.isEmpty();
@@ -742,7 +1206,7 @@ public:
}
if (arcAdditionStarted) {
- decumaEndArcAddition(decumaSession);
+ DECUMA_API(EndArcAddition)(decumaSession);
arcAdditionStarted = false;
}
@@ -762,11 +1226,18 @@ public:
scrResult.clear();
caseFormatter.clear();
+#ifdef QT_VIRTUALKEYBOARD_RECORD_TRACE_INPUT
+ unipenTrace.reset();
+#endif
+
return result;
}
bool select(int index = -1)
{
+ if (!worker)
+ return false;
+
if (sessionSettings.recognitionMode == mcrMode && wordCandidates.isEmpty()) {
finishRecognition();
return false;
@@ -783,6 +1254,25 @@ public:
index = index >= 0 ? index : activeWordIndex;
noteSelected(index);
QString finalWord = wordCandidates.at(index);
+
+#ifdef QT_VIRTUALKEYBOARD_RECORD_TRACE_INPUT
+ // Record trace
+ if (unipenTrace) {
+ if (finalWord.length() == 1) {
+ // In recording mode, the text case must match with the current text case
+ QChar ch(finalWord.at(0));
+ if (!ch.isLetter() || (ch.isUpper() == (textCase == InputEngine::Upper))) {
+ QStringList homeLocations = QStandardPaths::standardLocations(QStandardPaths::HomeLocation);
+ if (!homeLocations.isEmpty()) {
+ unipenTrace->setDirectory(QStringLiteral("%1/%2").arg(homeLocations.at(0)).arg("VIRTUAL_KEYBOARD_TRACES"));
+ unipenTrace->record(traceList);
+ unipenTrace->save(ch.unicode(), 100);
+ }
+ }
+ }
+ }
+#endif
+
finishRecognition();
q->inputContext()->commit(finalWord);
} else if (sessionSettings.recognitionMode == scrMode) {
@@ -865,8 +1355,13 @@ public:
bool wordCandidatesChanged = wordCandidates != newWordCandidates;
+#ifndef QT_VIRTUALKEYBOARD_RECORD_TRACE_INPUT
// Delete trace history
- if (sessionSettings.recognitionMode == mcrMode && !symbolStrokes.isEmpty()) {
+ const InputEngine::InputMode inputMode = q->inputEngine()->inputMode();
+ if (sessionSettings.recognitionMode == mcrMode && !symbolStrokes.isEmpty() &&
+ inputMode != InputEngine::ChineseHandwriting &&
+ inputMode != InputEngine::JapaneseHandwriting &&
+ inputMode != InputEngine::KoreanHandwriting) {
int activeTraces = symbolStrokes.at(symbolStrokes.count() - 1).toInt();
if (symbolStrokes.count() > 1)
activeTraces += symbolStrokes.at(symbolStrokes.count() - 2).toInt();
@@ -874,7 +1369,14 @@ public:
delete traceList.takeFirst();
}
- // Look for a gesture at the end of first result
+ // Enforce hard limit for number of traces
+ if (traceList.count() >= traceListHardLimit) {
+ VIRTUALKEYBOARD_DEBUG() << "T9WriteInputMethodPrivate::processResult(): Clearing traces (hard limit):" << traceList.count();
+ clearTraces();
+ }
+#endif
+
+ // Find a gesture at the end of the first result
if (!gesture.isEmpty()) {
DECUMA_UNICODE gestureSymbol = gesture.at(0).unicode();
@@ -892,8 +1394,8 @@ public:
break;
default:
- finishRecognition();
ic->commit(ic->preeditText());
+ finishRecognition();
break;
}
@@ -920,6 +1422,87 @@ public:
}
}
+ bool handleGesture()
+ {
+ if (countActiveTraces() > 0)
+ return false;
+
+ QVariantMap gesture(gestureRecognizer.recognize(traceList.mid(traceList.length() - 1, 1)));
+ if (gesture.isEmpty())
+ return false;
+
+ VIRTUALKEYBOARD_DEBUG() << "T9WriteInputMethodPrivate::handleGesture():" << gesture;
+
+ if (gesture[QLatin1String("type")].toString() == QLatin1String("swipe")) {
+
+ static const int SWIPE_ANGLE_THRESHOLD = 15; // degrees +-
+
+ qreal swipeLength = gesture[QLatin1String("length")].toReal();
+ if (swipeLength >= instantGestureSettings.widthThreshold) {
+
+ Q_Q(T9WriteInputMethod);
+ InputContext *ic = q->inputContext();
+ if (!ic)
+ return false;
+
+ qreal swipeAngle = gesture[QLatin1String("angle_degrees")].toReal();
+ int swipeTouchCount = gesture[QLatin1String("touch_count")].toInt();
+
+ // Swipe left
+ if (swipeAngle <= 180 + SWIPE_ANGLE_THRESHOLD && swipeAngle >= 180 - SWIPE_ANGLE_THRESHOLD) {
+ if (swipeTouchCount == 1) {
+ // Single swipe: backspace
+ ic->inputEngine()->virtualKeyClick(Qt::Key_Backspace, QString(), Qt::NoModifier);
+ return true;
+ }
+ return false;
+ }
+
+ // Swipe right
+ const InputEngine::InputMode inputMode = q->inputEngine()->inputMode();
+ if (inputMode != InputEngine::ChineseHandwriting &&
+ inputMode != InputEngine::JapaneseHandwriting &&
+ inputMode != InputEngine::KoreanHandwriting) {
+ if (swipeAngle <= SWIPE_ANGLE_THRESHOLD || swipeAngle >= 360 - SWIPE_ANGLE_THRESHOLD) {
+ if (swipeTouchCount == 1) {
+ // Single swipe: space
+ ic->inputEngine()->virtualKeyClick(Qt::Key_Space, QString(" "), Qt::NoModifier);
+ return true;
+ }
+ return false;
+ }
+ }
+
+ // Swipe up
+ if (swipeAngle <= 270 + SWIPE_ANGLE_THRESHOLD && swipeAngle >= 270 - SWIPE_ANGLE_THRESHOLD) {
+ if (swipeTouchCount == 1) {
+ // Single swipe: toggle input mode
+ select();
+ if (!(ic->inputMethodHints() & (Qt::ImhDialableCharactersOnly | Qt::ImhFormattedNumbersOnly | Qt::ImhDigitsOnly))) {
+ QList<int> inputModes = ic->inputEngine()->inputModes();
+ // Filter out duplicate numeric mode (in favor of Numeric)
+ int indexOfNumericInputMode = inputModes.indexOf(InputEngine::Numeric);
+ int indexOfDialableInputMode = inputModes.indexOf(InputEngine::Dialable);
+ if (indexOfNumericInputMode != -1 && indexOfDialableInputMode != -1)
+ inputModes.removeAt(inputMode != InputEngine::Dialable ?
+ indexOfDialableInputMode :
+ indexOfNumericInputMode);
+ if (inputModes.count() > 1) {
+ int inputModeIndex = inputModes.indexOf((int)inputMode) + 1;
+ if (inputModeIndex >= inputModes.count())
+ inputModeIndex = 0;
+ ic->inputEngine()->setInputMode((InputEngine::InputMode)inputModes.at(inputModeIndex));
+ }
+ }
+ return true;
+ }
+ }
+ }
+ }
+
+ return false;
+ }
+
bool isValidInputChar(const QChar &c) const
{
if (c.isLetterOrNumber())
@@ -948,17 +1531,23 @@ public:
T9WriteInputMethod *q_ptr;
static const DECUMA_MEM_FUNCTIONS memFuncs;
+ bool cjk;
+ EngineMode engineMode;
+ QByteArray currentContext;
DECUMA_SESSION_SETTINGS sessionSettings;
DECUMA_INSTANT_GESTURE_SETTINGS instantGestureSettings;
+ QString defaultHwrDbPath;
+ QString defaultDictionaryDbPath;
QFile hwrDbFile;
QVector<DECUMA_UINT32> languageCategories;
QVector<DECUMA_UINT32> symbolCategories;
QScopedPointer<T9WriteWorker> worker;
QList<Trace *> traceList;
+ int traceListHardLimit;
QMutex dictionaryLock;
QString dictionaryFileName;
- void *convertedDictionary;
- void *attachedDictionary;
+ QSharedPointer<T9WriteDictionary> loadedDictionary;
+ QSharedPointer<T9WriteDictionary> attachedDictionary;
QSharedPointer<T9WriteDictionaryTask> dictionaryTask;
QSharedPointer<T9WriteRecognitionTask> recognitionTask;
int resultId;
@@ -974,6 +1563,10 @@ public:
bool ignoreUpdate;
InputEngine::TextCase textCase;
T9WriteCaseFormatter caseFormatter;
+ HandwritingGestureRecognizer gestureRecognizer;
+#ifdef QT_VIRTUALKEYBOARD_RECORD_TRACE_INPUT
+ QScopedPointer<UnipenTrace> unipenTrace;
+#endif
};
const DECUMA_MEM_FUNCTIONS T9WriteInputMethodPrivate::memFuncs = {
@@ -991,8 +1584,6 @@ const DECUMA_MEM_FUNCTIONS T9WriteInputMethodPrivate::memFuncs = {
T9WriteInputMethod::T9WriteInputMethod(QObject *parent) :
AbstractInputMethod(*new T9WriteInputMethodPrivate(this), parent)
{
- Q_D(T9WriteInputMethod);
- d->initEngine();
}
T9WriteInputMethod::~T9WriteInputMethod()
@@ -1003,18 +1594,94 @@ T9WriteInputMethod::~T9WriteInputMethod()
QList<InputEngine::InputMode> T9WriteInputMethod::inputModes(const QString &locale)
{
- Q_UNUSED(locale)
- return QList<InputEngine::InputMode>()
- << InputEngine::Latin
- << InputEngine::Numeric
- << InputEngine::Dialable;
+ Q_D(T9WriteInputMethod);
+ QList<InputEngine::InputMode> availableInputModes;
+ const Qt::InputMethodHints inputMethodHints(inputContext()->inputMethodHints());
+ const QLocale loc(locale);
+ T9WriteInputMethodPrivate::EngineMode mode = d->mapLocaleToEngineMode(loc);
+
+ // Add primary input mode
+ switch (mode) {
+#ifdef HAVE_T9WRITE_ALPHABETIC
+ case T9WriteInputMethodPrivate::Alphabetic:
+ if (d->findHwrDb(T9WriteInputMethodPrivate::Alphabetic, d->defaultHwrDbPath).isEmpty())
+ return availableInputModes;
+ if (!(inputMethodHints & (Qt::ImhDialableCharactersOnly | Qt::ImhFormattedNumbersOnly | Qt::ImhDigitsOnly | Qt::ImhLatinOnly))) {
+ switch (loc.script()) {
+ case QLocale::GreekScript:
+ availableInputModes.append(InputEngine::Greek);
+ break;
+ case QLocale::CyrillicScript:
+ availableInputModes.append(InputEngine::Cyrillic);
+ break;
+ default:
+ break;
+ }
+ availableInputModes.append(InputEngine::Latin);
+ }
+ break;
+ case T9WriteInputMethodPrivate::Arabic:
+ if (d->findHwrDb(T9WriteInputMethodPrivate::Arabic, d->defaultHwrDbPath).isEmpty())
+ return availableInputModes;
+ if (!(inputMethodHints & (Qt::ImhDialableCharactersOnly | Qt::ImhFormattedNumbersOnly | Qt::ImhDigitsOnly | Qt::ImhLatinOnly)))
+ availableInputModes.append(InputEngine::Arabic);
+ break;
+ case T9WriteInputMethodPrivate::Hebrew:
+ if (d->findHwrDb(T9WriteInputMethodPrivate::Hebrew, d->defaultHwrDbPath).isEmpty())
+ return availableInputModes;
+ if (!(inputMethodHints & (Qt::ImhDialableCharactersOnly | Qt::ImhFormattedNumbersOnly | Qt::ImhDigitsOnly | Qt::ImhLatinOnly)))
+ availableInputModes.append(InputEngine::Hebrew);
+ break;
+#endif
+#ifdef HAVE_T9WRITE_CJK
+ case T9WriteInputMethodPrivate::SimplifiedChinese:
+ case T9WriteInputMethodPrivate::TraditionalChinese:
+ case T9WriteInputMethodPrivate::HongKongChinese:
+ if (d->findHwrDb(mode, d->defaultHwrDbPath).isEmpty())
+ return availableInputModes;
+ if (!(inputMethodHints & (Qt::ImhDialableCharactersOnly | Qt::ImhFormattedNumbersOnly | Qt::ImhDigitsOnly | Qt::ImhLatinOnly)))
+ availableInputModes.append(InputEngine::ChineseHandwriting);
+ break;
+ case T9WriteInputMethodPrivate::Japanese:
+ if (d->findHwrDb(T9WriteInputMethodPrivate::Japanese, d->defaultHwrDbPath).isEmpty())
+ return availableInputModes;
+ if (!(inputMethodHints & (Qt::ImhDialableCharactersOnly | Qt::ImhFormattedNumbersOnly | Qt::ImhDigitsOnly | Qt::ImhLatinOnly)))
+ availableInputModes.append(InputEngine::JapaneseHandwriting);
+ break;
+ case T9WriteInputMethodPrivate::Korean:
+ if (d->findHwrDb(T9WriteInputMethodPrivate::Korean, d->defaultHwrDbPath).isEmpty())
+ return availableInputModes;
+ if (!(inputMethodHints & (Qt::ImhDialableCharactersOnly | Qt::ImhFormattedNumbersOnly | Qt::ImhDigitsOnly | Qt::ImhLatinOnly)))
+ availableInputModes.append(InputEngine::KoreanHandwriting);
+ break;
+#endif
+ default:
+ return availableInputModes;
+ }
+
+ // Add exclusive input modes
+ if (inputMethodHints.testFlag(Qt::ImhDialableCharactersOnly) || inputMethodHints.testFlag(Qt::ImhDigitsOnly)) {
+ availableInputModes.append(InputEngine::Dialable);
+ } else if (inputMethodHints.testFlag(Qt::ImhFormattedNumbersOnly)) {
+ availableInputModes.append(InputEngine::Numeric);
+ } else if (inputMethodHints.testFlag(Qt::ImhLatinOnly)) {
+ availableInputModes.append(InputEngine::Latin);
+ } else {
+ // Add other input modes
+ Q_ASSERT(!availableInputModes.isEmpty());
+ if (!availableInputModes.contains(InputEngine::Latin))
+ availableInputModes.append(InputEngine::Latin);
+ availableInputModes.append(InputEngine::Numeric);
+ }
+
+ return availableInputModes;
}
bool T9WriteInputMethod::setInputMode(const QString &locale, InputEngine::InputMode inputMode)
{
Q_D(T9WriteInputMethod);
d->select();
- return d->setInputMode(locale, inputMode);
+ return d->setInputMode(QLocale(locale), inputMode);
}
bool T9WriteInputMethod::setTextCase(InputEngine::TextCase textCase)
@@ -1045,6 +1712,13 @@ bool T9WriteInputMethod::keyEvent(Qt::Key key, const QString &text, Qt::Keyboard
if (preeditText.length() > 1) {
preeditText.chop(1);
ic->setPreeditText(preeditText);
+ // WA: T9Write CJK may crash in some cases with long stringStart.
+ // Therefore we commit the current input and finish the recognition.
+ if (d->cjk) {
+ ic->commit();
+ d->finishRecognition();
+ return true;
+ }
d->caseFormatter.ensureLength(preeditText.length(), d->textCase);
T9WriteCaseFormatter caseFormatter(d->caseFormatter);
d->finishRecognition(false);
@@ -1182,11 +1856,15 @@ bool T9WriteInputMethod::reselect(int cursorPosition, const InputEngine::Reselec
if (!ic)
return false;
+ const InputEngine::InputMode inputMode = inputEngine()->inputMode();
+ const int maxLength = (inputMode == InputEngine::ChineseHandwriting ||
+ inputMode == InputEngine::JapaneseHandwriting ||
+ inputMode == InputEngine::KoreanHandwriting) ? 0 : 32;
const QString surroundingText = ic->surroundingText();
int replaceFrom = 0;
if (reselectFlags.testFlag(InputEngine::WordBeforeCursor)) {
- for (int i = cursorPosition - 1; i >= 0; --i) {
+ for (int i = cursorPosition - 1; i >= 0 && d->stringStart.length() < maxLength; --i) {
QChar c = surroundingText.at(i);
if (!d->isValidInputChar(c))
break;
@@ -1206,7 +1884,7 @@ bool T9WriteInputMethod::reselect(int cursorPosition, const InputEngine::Reselec
}
if (reselectFlags.testFlag(InputEngine::WordAfterCursor)) {
- for (int i = cursorPosition; i < surroundingText.length(); ++i) {
+ for (int i = cursorPosition; i < surroundingText.length() && d->stringStart.length() < maxLength; ++i) {
QChar c = surroundingText.at(i);
if (!d->isValidInputChar(c))
break;
@@ -1224,7 +1902,7 @@ bool T9WriteInputMethod::reselect(int cursorPosition, const InputEngine::Reselec
if (d->stringStart.isEmpty())
return false;
- if (reselectFlags.testFlag(InputEngine::WordAtCursor) && replaceFrom == -d->stringStart.length()) {
+ if (reselectFlags.testFlag(InputEngine::WordAtCursor) && replaceFrom == -d->stringStart.length() && d->stringStart.length() < maxLength) {
d->stringStart.clear();
return false;
}
@@ -1258,35 +1936,41 @@ void T9WriteInputMethod::timerEvent(QTimerEvent *timerEvent)
if (timerId == d->resultTimer) {
if (d->sessionSettings.recognitionMode == mcrMode) {
d->stopResultTimer();
- d->clearTraces();
+#ifndef QT_VIRTUALKEYBOARD_RECORD_TRACE_INPUT
+ const InputEngine::InputMode inputMode = inputEngine()->inputMode();
+ if (inputMode != InputEngine::ChineseHandwriting &&
+ inputMode != InputEngine::JapaneseHandwriting &&
+ inputMode != InputEngine::KoreanHandwriting) {
+ d->clearTraces();
+ }
+#endif
} else if (d->sessionSettings.recognitionMode == scrMode) {
d->select();
}
}
}
-void T9WriteInputMethod::dictionaryLoadCompleted(const QString &fileUri, void *dictionary)
+void T9WriteInputMethod::dictionaryLoadCompleted(QSharedPointer<T9WriteDictionary> dictionary)
{
Q_D(T9WriteInputMethod);
// Note: This method is called in worker thread context
QMutexLocker dictionaryGuard(&d->dictionaryLock);
- VIRTUALKEYBOARD_DEBUG() << "T9WriteInputMethod::dictionaryLoadCompleted():" << fileUri << dictionary;
-
if (!dictionary)
return;
+ VIRTUALKEYBOARD_DEBUG() << "T9WriteInputMethod::dictionaryLoadCompleted():"
+ << dictionary->fileName() << dictionary->data() << dictionary->size();
+
InputContext *ic = inputContext();
- if (ic && fileUri == d->dictionaryFileName) {
- d->convertedDictionary = dictionary;
+ if (ic && dictionary->fileName() == d->dictionaryFileName) {
+ d->loadedDictionary = dictionary;
if (d->sessionSettings.recognitionMode == mcrMode &&
!ic->inputMethodHints().testFlag(Qt::ImhNoPredictiveText) &&
!d->attachedDictionary) {
- d->attachDictionary(d->convertedDictionary);
- d->attachedDictionary = d->convertedDictionary;
+ if (d->attachDictionary(d->loadedDictionary))
+ d->attachedDictionary = d->loadedDictionary;
}
- } else {
- d->destroyConvertedDictionary(&dictionary);
}
}
@@ -1315,4 +1999,10 @@ void T9WriteInputMethod::resultsAvailable(const QVariantList &resultList)
d->resultsAvailable(resultList);
}
+void T9WriteInputMethod::recognitionError(int status)
+{
+ VIRTUALKEYBOARD_DEBUG() << "T9WriteInputMethod::recognitionError():" << status;
+ reset();
+}
+
} // namespace QtVirtualKeyboard
diff --git a/src/virtualkeyboard/t9writeinputmethod.h b/src/virtualkeyboard/t9writeinputmethod.h
index 9b87ebdf..173abd99 100644
--- a/src/virtualkeyboard/t9writeinputmethod.h
+++ b/src/virtualkeyboard/t9writeinputmethod.h
@@ -31,10 +31,12 @@
#define T9WRITEINPUTMETHOD_H
#include "abstractinputmethod.h"
+#include <QSharedPointer>
namespace QtVirtualKeyboard {
class T9WriteInputMethodPrivate;
+class T9WriteDictionary;
class T9WriteInputMethod : public AbstractInputMethod
{
@@ -70,8 +72,9 @@ protected:
void timerEvent(QTimerEvent *timerEvent);
protected slots:
- void dictionaryLoadCompleted(const QString &fileUri, void *dictionary);
+ void dictionaryLoadCompleted(QSharedPointer<T9WriteDictionary> dictionary);
void resultsAvailable(const QVariantList &resultList);
+ void recognitionError(int status);
};
}
diff --git a/src/virtualkeyboard/t9writeworker.cpp b/src/virtualkeyboard/t9writeworker.cpp
index 2de62a0b..adbdcedb 100644
--- a/src/virtualkeyboard/t9writeworker.cpp
+++ b/src/virtualkeyboard/t9writeworker.cpp
@@ -58,10 +58,14 @@ void T9WriteTask::wait()
\internal
*/
-T9WriteDictionaryTask::T9WriteDictionaryTask(const QString &fileUri,
- const DECUMA_MEM_FUNCTIONS &memFuncs) :
- fileUri(fileUri),
- memFuncs(memFuncs)
+T9WriteDictionaryTask::T9WriteDictionaryTask(QSharedPointer<T9WriteDictionary> dictionary,
+ const QString &dictionaryFileName,
+ bool convertDictionary,
+ const DECUMA_SRC_DICTIONARY_INFO &dictionaryInfo) :
+ dictionary(dictionary),
+ dictionaryFileName(dictionaryFileName),
+ convertDictionary(convertDictionary),
+ dictionaryInfo(dictionaryInfo)
{
}
@@ -74,33 +78,19 @@ void T9WriteDictionaryTask::run()
perf.start();
#endif
- void *dictionary = 0;
-
- QFile dictionaryFile(fileUri);
- if (dictionaryFile.open(QIODevice::ReadOnly)) {
- uchar *dictionaryData = dictionaryFile.map(0, dictionaryFile.size(), QFile::NoOptions);
- if (dictionaryData) {
-
- DECUMA_SRC_DICTIONARY_INFO dictionaryInfo;
- memset(&dictionaryInfo, 0, sizeof(dictionaryInfo));
- dictionaryInfo.srcType = decumaXT9LDB;
- DECUMA_UINT32 dictionarySize = 0;
- DECUMA_STATUS status = decumaConvertDictionary(&dictionary, dictionaryData, dictionaryFile.size(), &dictionaryInfo, &dictionarySize, &memFuncs);
- Q_UNUSED(status)
- Q_ASSERT(status == decumaNoError);
- dictionaryFile.unmap(dictionaryData);
- } else {
- qWarning() << "Could not map dictionary file" << fileUri;
- }
- } else {
- qWarning() << "Could not open dictionary file" << fileUri;
+ bool result = false;
+ if (dictionary) {
+ result = dictionary->load(dictionaryFileName);
+ if (result && convertDictionary)
+ result = dictionary->convert(dictionaryInfo);
}
#ifdef QT_VIRTUALKEYBOARD_DEBUG
VIRTUALKEYBOARD_DEBUG() << "T9WriteDictionaryTask::run(): time:" << perf.elapsed() << "ms";
#endif
- emit completed(fileUri, dictionary);
+ if (result)
+ emit completed(dictionary);
}
/*!
@@ -109,6 +99,7 @@ void T9WriteDictionaryTask::run()
*/
T9WriteRecognitionResult::T9WriteRecognitionResult(int id, int maxResults, int maxCharsPerWord) :
+ status(decumaNoError),
numResults(0),
instantGesture(0),
id(id),
@@ -176,16 +167,18 @@ void T9WriteRecognitionTask::run()
perf.start();
#endif
- DECUMA_STATUS status = decumaIndicateInstantGesture(decumaSession, &result->instantGesture, &instantGestureSettings);
- Q_ASSERT(status == decumaNoError);
+ DECUMA_STATUS status;
+ if (!cjk) {
+ status = DECUMA_API(IndicateInstantGesture)(decumaSession, &result->instantGesture, &instantGestureSettings);
+ Q_ASSERT(status == decumaNoError);
+ }
DECUMA_INTERRUPT_FUNCTIONS interruptFunctions;
interruptFunctions.pShouldAbortRecognize = shouldAbortRecognize;
interruptFunctions.pUserData = (void *)this;
- status = decumaRecognize(decumaSession, result->results.data(), result->results.size(), &result->numResults, result->maxCharsPerWord, &recSettings, &interruptFunctions);
- if (status == decumaAbortRecognitionUnsupported)
- status = decumaRecognize(decumaSession, result->results.data(), result->results.size(), &result->numResults, result->maxCharsPerWord, &recSettings, NULL);
- Q_ASSERT(status == decumaNoError);
+ result->status = DECUMA_API(Recognize)(decumaSession, result->results.data(), result->results.size(), &result->numResults, result->maxCharsPerWord, &recSettings, &interruptFunctions);
+ if (result->status == decumaAbortRecognitionUnsupported)
+ result->status = DECUMA_API(Recognize)(decumaSession, result->results.data(), result->results.size(), &result->numResults, result->maxCharsPerWord, &recSettings, NULL);
QStringList resultList;
QString gesture;
@@ -261,6 +254,11 @@ void T9WriteRecognitionResultsTask::run()
if (!result)
return;
+ if (result->status != decumaNoError) {
+ emit recognitionError(result->status);
+ return;
+ }
+
QVariantList resultList;
for (int i = 0; i < result->numResults; i++)
{
@@ -306,11 +304,12 @@ void T9WriteRecognitionResultsTask::run()
\internal
*/
-T9WriteWorker::T9WriteWorker(DECUMA_SESSION *decumaSession, QObject *parent) :
+T9WriteWorker::T9WriteWorker(DECUMA_SESSION *decumaSession, const bool cjk, QObject *parent) :
QThread(parent),
taskSema(),
taskLock(),
- decumaSession(decumaSession)
+ decumaSession(decumaSession),
+ cjk(cjk)
{
abort = false;
}
@@ -369,6 +368,7 @@ void T9WriteWorker::run()
}
if (currentTask) {
currentTask->decumaSession = decumaSession;
+ currentTask->cjk = cjk;
currentTask->run();
currentTask->runSema.release();
}
diff --git a/src/virtualkeyboard/t9writeworker.h b/src/virtualkeyboard/t9writeworker.h
index 0f130acb..437a84f5 100644
--- a/src/virtualkeyboard/t9writeworker.h
+++ b/src/virtualkeyboard/t9writeworker.h
@@ -41,7 +41,8 @@
#include <QMap>
#include <QVector>
-#include "decuma_hwr.h"
+#include "t9write.h"
+#include "t9writedictionary.h"
namespace QtVirtualKeyboard {
@@ -59,6 +60,7 @@ public:
protected:
DECUMA_SESSION *decumaSession;
+ bool cjk;
private:
QSemaphore runSema;
@@ -68,16 +70,20 @@ class T9WriteDictionaryTask : public T9WriteTask
{
Q_OBJECT
public:
- explicit T9WriteDictionaryTask(const QString &fileUri,
- const DECUMA_MEM_FUNCTIONS &memFuncs);
+ explicit T9WriteDictionaryTask(QSharedPointer<T9WriteDictionary> dictionary,
+ const QString &dictionaryFileName,
+ bool convertDictionary,
+ const DECUMA_SRC_DICTIONARY_INFO &dictionaryInfo);
void run();
- const QString fileUri;
- const DECUMA_MEM_FUNCTIONS &memFuncs;
+ QSharedPointer<T9WriteDictionary> dictionary;
+ const QString dictionaryFileName;
+ bool convertDictionary;
+ const DECUMA_SRC_DICTIONARY_INFO dictionaryInfo;
signals:
- void completed(const QString &fileUri, void *dictionary);
+ void completed(QSharedPointer<T9WriteDictionary> dictionary);
};
class T9WriteRecognitionResult
@@ -87,12 +93,14 @@ class T9WriteRecognitionResult
public:
explicit T9WriteRecognitionResult(int id, int maxResults, int maxCharsPerWord);
+ DECUMA_STATUS status;
QVector<DECUMA_HWR_RESULT> results;
DECUMA_UINT16 numResults;
int instantGesture;
const int id;
const int maxResults;
const int maxCharsPerWord;
+
private:
QVector<DECUMA_UNICODE> _chars;
QVector<DECUMA_INT16> _symbolChars;
@@ -135,6 +143,7 @@ public:
signals:
void resultsAvailable(const QVariantList &resultList);
+ void recognitionError(int status);
private:
QSharedPointer<T9WriteRecognitionResult> result;
@@ -144,7 +153,7 @@ class T9WriteWorker : public QThread
{
Q_OBJECT
public:
- explicit T9WriteWorker(DECUMA_SESSION *decumaSession, QObject *parent = 0);
+ explicit T9WriteWorker(DECUMA_SESSION *decumaSession, const bool cjk, QObject *parent = 0);
~T9WriteWorker();
void addTask(QSharedPointer<T9WriteTask> task);
@@ -176,6 +185,7 @@ private:
QMutex taskLock;
DECUMA_SESSION *decumaSession;
QBasicAtomicInt abort;
+ const bool cjk;
};
} // namespace QtVirtualKeyboard
diff --git a/src/virtualkeyboard/unipentrace.cpp b/src/virtualkeyboard/unipentrace.cpp
new file mode 100644
index 00000000..74c1b23e
--- /dev/null
+++ b/src/virtualkeyboard/unipentrace.cpp
@@ -0,0 +1,129 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "unipentrace.h"
+#include <QRectF>
+#include <QDir>
+#include <QFile>
+#include <QDebug>
+
+namespace QtVirtualKeyboard {
+
+UnipenTrace::UnipenTrace(const QVariantMap &traceCaptureDeviceInfo,
+ const QVariantMap &traceScreenInfo,
+ QObject *parent) :
+ QObject(parent)
+{
+ m_lines.append(QLatin1String(".VERSION 1.0"));
+ m_lines.append(QLatin1String(".HIERARCHY CHARACTER"));
+ m_lines.append(QLatin1String(".COORD X Y T"));
+ m_lines.append(QLatin1String(".SEGMENT CHARACTER"));
+ const QRectF boundingBox = traceScreenInfo["boundingBox"].toRectF();
+ if (!boundingBox.isEmpty()) {
+ m_lines.append(QStringLiteral(".X_DIM %1").arg(qRound(boundingBox.right())));
+ m_lines.append(QStringLiteral(".Y_DIM %1").arg(qRound(boundingBox.bottom())));
+ }
+ bool ok = false;
+ int dpi = traceCaptureDeviceInfo["dpi"].toInt(&ok);
+ if (ok) {
+ m_lines.append(QStringLiteral(".X_POINTS_PER_INCH %1").arg(dpi));
+ m_lines.append(QStringLiteral(".Y_POINTS_PER_INCH %1").arg(dpi));
+ }
+ ok = false;
+ int sampleRate = traceCaptureDeviceInfo["sampleRate"].toInt(&ok);
+ if (ok)
+ m_lines.append(QStringLiteral(".POINTS_PER_SECOND %1").arg(sampleRate));
+}
+
+void UnipenTrace::record(const QList<Trace *> &traceList)
+{
+ qlonglong t0 = 0;
+ for (const Trace *trace : qAsConst(traceList)) {
+ const QVariantList &points = trace->points();
+ const bool hasTime = trace->channels().contains("t");
+ const QVariantList timeData = hasTime ? trace->channelData("t") : QVariantList();
+ QVariantList::ConstIterator t = timeData.constBegin();
+ if (t0 == 0 && hasTime)
+ t0 = t->toLongLong();
+
+ m_lines.append(QLatin1String(".PEN_DOWN"));
+
+ for (const QVariant &point : points) {
+ const QPointF pt(point.toPointF());
+ QString pointStr(QStringLiteral("%1 %2 ").arg(qRound(pt.x())).arg(qRound(pt.y())));
+ if (hasTime) {
+ pointStr.append(QString::number(t->toLongLong() - t0));
+ t++;
+ } else {
+ pointStr.append(QLatin1String("0"));
+ }
+ m_lines.append(pointStr);
+ }
+
+ m_lines.append(QLatin1String(".PEN_UP"));
+ }
+}
+
+void UnipenTrace::save(uint unicode, uint confidence)
+{
+ if (m_directory.isEmpty())
+ return;
+
+ QString fileName;
+ QDir fileDir(m_directory);
+ if (!fileDir.exists())
+ fileDir.mkpath(m_directory);
+ if (fileDir.exists()) {
+ int fileIndex = 0;
+ do {
+ fileName = fileDir.absoluteFilePath(QStringLiteral("%1_%2_%3.txt").arg(unicode).arg(confidence, 3, 10, QLatin1Char('0')).arg(fileIndex++));
+ } while (QFileInfo::exists(fileName));
+ }
+
+ QString dataStr(m_lines.join('\n'));
+ dataStr.append('\n');
+ QFile file(fileName);
+ if (file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate)) {
+ file.write(dataStr.toUtf8().constData());
+ } else {
+ qWarning() << "Cannot open file for writing" << fileName;
+ }
+}
+
+QString UnipenTrace::directory() const
+{
+ return m_directory;
+}
+
+void UnipenTrace::setDirectory(const QString &directory)
+{
+ m_directory = directory;
+}
+
+}
diff --git a/src/virtualkeyboard/unipentrace.h b/src/virtualkeyboard/unipentrace.h
new file mode 100644
index 00000000..f7e182dd
--- /dev/null
+++ b/src/virtualkeyboard/unipentrace.h
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef UNIPENTRACE_H
+#define UNIPENTRACE_H
+
+#include <QObject>
+#include "trace.h"
+
+namespace QtVirtualKeyboard {
+
+class UnipenTrace : public QObject
+{
+ Q_OBJECT
+public:
+ explicit UnipenTrace(const QVariantMap &traceCaptureDeviceInfo, const QVariantMap &traceScreenInfo, QObject *parent = 0);
+
+ void record(const QList<Trace *> &traceList);
+ void save(uint unicode, uint confidence);
+
+ QString directory() const;
+ void setDirectory(const QString &directory);
+
+private:
+ QStringList m_lines;
+ QString m_directory;
+};
+
+} // namespace QtVirtualKeyboard
+
+#endif // UNIPENTRACE_H
diff --git a/src/virtualkeyboard/virtualkeyboard.pro b/src/virtualkeyboard/virtualkeyboard.pro
index ca84cd27..2b2f2aac 100644
--- a/src/virtualkeyboard/virtualkeyboard.pro
+++ b/src/virtualkeyboard/virtualkeyboard.pro
@@ -34,7 +34,9 @@ SOURCES += platforminputcontext.cpp \
virtualkeyboardsettings.cpp \
trace.cpp \
desktopinputselectioncontrol.cpp \
- shadowinputcontext.cpp
+ shadowinputcontext.cpp \
+ gesturerecognizer.cpp \
+ handwritinggesturerecognizer.cpp
HEADERS += platforminputcontext.h \
inputcontext.h \
@@ -55,21 +57,26 @@ HEADERS += platforminputcontext.h \
plugin.h \
trace.h \
desktopinputselectioncontrol.h \
- shadowinputcontext.h
+ shadowinputcontext.h \
+ gesturerecognizer.h \
+ handwritinggesturerecognizer.h
RESOURCES += \
content/styles/default/default_style.qrc \
content/styles/retro/retro_style.qrc \
content/content.qrc
+# Fallback for languages which don't have these special layouts
+LAYOUT_FILES += \
+ content/layouts/en_GB/dialpad.qml \
+ content/layouts/en_GB/digits.qml \
+ content/layouts/en_GB/numbers.qml
contains(CONFIG, lang-en.*) {
LAYOUT_FILES += \
content/layouts/en_GB/main.qml \
- content/layouts/en_GB/dialpad.qml \
- content/layouts/en_GB/digits.qml \
- content/layouts/en_GB/handwriting.qml \
- content/layouts/en_GB/numbers.qml \
content/layouts/en_GB/symbols.qml
+t9write-alphabetic|lipi-toolkit: LAYOUT_FILES += \
+ content/layouts/en_GB/handwriting.qml
}
contains(CONFIG, lang-ar.*) {
LAYOUT_FILES += \
@@ -77,122 +84,197 @@ contains(CONFIG, lang-ar.*) {
content/layouts/ar_AR/main.qml \
content/layouts/ar_AR/numbers.qml \
content/layouts/ar_AR/symbols.qml
+t9write-alphabetic: LAYOUT_FILES += \
+ content/layouts/ar_AR/handwriting.qml
+}
+contains(CONFIG, lang-bg.*) {
+ LAYOUT_FILES += \
+ content/layouts/bg_BG/main.qml \
+ content/layouts/bg_BG/symbols.qml
+t9write-alphabetic: LAYOUT_FILES += \
+ content/layouts/bg_BG/handwriting.qml
+}
+contains(CONFIG, lang-cs.*) {
+ LAYOUT_FILES += \
+ content/layouts/cs_CZ/main.qml \
+ content/layouts/cs_CZ/symbols.qml
+t9write-alphabetic: LAYOUT_FILES += \
+ content/layouts/cs_CZ/handwriting.qml
}
contains(CONFIG, lang-da.*) {
LAYOUT_FILES += \
content/layouts/da_DK/main.qml \
content/layouts/da_DK/symbols.qml
-t9write: LAYOUT_FILES += \
+t9write-alphabetic: LAYOUT_FILES += \
content/layouts/da_DK/handwriting.qml
}
contains(CONFIG, lang-de.*) {
LAYOUT_FILES += \
content/layouts/de_DE/main.qml \
content/layouts/de_DE/symbols.qml
-t9write: LAYOUT_FILES += \
+t9write-alphabetic: LAYOUT_FILES += \
content/layouts/de_DE/handwriting.qml
}
+contains(CONFIG, lang-el.*) {
+ LAYOUT_FILES += \
+ content/layouts/el_GR/main.qml \
+ content/layouts/el_GR/symbols.qml
+t9write-alphabetic: LAYOUT_FILES += \
+ content/layouts/el_GR/handwriting.qml
+}
contains(CONFIG, lang-es.*) {
LAYOUT_FILES += \
content/layouts/es_ES/main.qml \
content/layouts/es_ES/symbols.qml
-t9write: LAYOUT_FILES += \
+t9write-alphabetic: LAYOUT_FILES += \
content/layouts/es_ES/handwriting.qml
}
+contains(CONFIG, lang-et.*) {
+ LAYOUT_FILES += \
+ content/layouts/et_EE/main.qml \
+ content/layouts/et_EE/symbols.qml
+t9write-alphabetic: LAYOUT_FILES += \
+ content/layouts/et_EE/handwriting.qml
+}
contains(CONFIG, lang-fa.*) {
LAYOUT_FILES += \
content/layouts/fa_FA/digits.qml \
content/layouts/fa_FA/main.qml \
content/layouts/fa_FA/numbers.qml \
content/layouts/fa_FA/symbols.qml
+t9write-alphabetic: LAYOUT_FILES += \
+ content/layouts/fa_FA/handwriting.qml
}
contains(CONFIG, lang-fi.*) {
LAYOUT_FILES += \
content/layouts/fi_FI/main.qml \
content/layouts/fi_FI/symbols.qml
-t9write: LAYOUT_FILES += \
+t9write-alphabetic: LAYOUT_FILES += \
content/layouts/fi_FI/handwriting.qml
}
contains(CONFIG, lang-fr.*) {
LAYOUT_FILES += \
content/layouts/fr_FR/main.qml \
content/layouts/fr_FR/symbols.qml
-t9write: LAYOUT_FILES += \
+t9write-alphabetic: LAYOUT_FILES += \
content/layouts/fr_FR/handwriting.qml
}
+contains(CONFIG, lang-he.*) {
+ LAYOUT_FILES += \
+ content/layouts/he_IL/main.qml \
+ content/layouts/he_IL/symbols.qml
+t9write-alphabetic: LAYOUT_FILES += \
+ content/layouts/he_IL/handwriting.qml
+}
contains(CONFIG, lang-hi.*) {
LAYOUT_FILES += \
content/layouts/hi_IN/main.qml \
content/layouts/hi_IN/symbols.qml
}
+contains(CONFIG, lang-hr.*) {
+ LAYOUT_FILES += \
+ content/layouts/hr_HR/main.qml \
+ content/layouts/hr_HR/symbols.qml
+t9write-alphabetic: LAYOUT_FILES += \
+ content/layouts/hr_HR/handwriting.qml
+}
+contains(CONFIG, lang-hu.*) {
+ LAYOUT_FILES += \
+ content/layouts/hu_HU/main.qml \
+ content/layouts/hu_HU/symbols.qml
+t9write-alphabetic: LAYOUT_FILES += \
+ content/layouts/hu_HU/handwriting.qml
+}
contains(CONFIG, lang-it.*) {
LAYOUT_FILES += \
content/layouts/it_IT/main.qml \
content/layouts/it_IT/symbols.qml
-t9write: LAYOUT_FILES += \
+t9write-alphabetic: LAYOUT_FILES += \
content/layouts/it_IT/handwriting.qml
}
contains(CONFIG, lang-ja.*) {
LAYOUT_FILES += \
content/layouts/ja_JP/main.qml \
content/layouts/ja_JP/symbols.qml
+t9write-cjk: LAYOUT_FILES += \
+ content/layouts/ja_JP/handwriting.qml
}
contains(CONFIG, lang-ko.*) {
LAYOUT_FILES += \
content/layouts/ko_KR/main.qml \
content/layouts/ko_KR/symbols.qml
+t9write-cjk: LAYOUT_FILES += \
+ content/layouts/ko_KR/handwriting.qml
}
contains(CONFIG, lang-nb.*) {
LAYOUT_FILES += \
content/layouts/nb_NO/main.qml \
content/layouts/nb_NO/symbols.qml
-t9write: LAYOUT_FILES += \
+t9write-alphabetic: LAYOUT_FILES += \
content/layouts/nb_NO/handwriting.qml
}
+contains(CONFIG, lang-nl.*) {
+ LAYOUT_FILES += \
+ content/layouts/nl_NL/main.qml \
+ content/layouts/nl_NL/symbols.qml
+t9write-alphabetic|lipi-toolkit: LAYOUT_FILES += \
+ content/layouts/nl_NL/handwriting.qml
+}
contains(CONFIG, lang-pl.*) {
LAYOUT_FILES += \
content/layouts/pl_PL/main.qml \
content/layouts/pl_PL/symbols.qml
-t9write: LAYOUT_FILES += \
+t9write-alphabetic: LAYOUT_FILES += \
content/layouts/pl_PL/handwriting.qml
}
contains(CONFIG, lang-pt.*) {
LAYOUT_FILES += \
content/layouts/pt_PT/main.qml \
content/layouts/pt_PT/symbols.qml
-t9write: LAYOUT_FILES += \
+t9write-alphabetic: LAYOUT_FILES += \
content/layouts/pt_PT/handwriting.qml
}
contains(CONFIG, lang-ro.*) {
LAYOUT_FILES += \
content/layouts/ro_RO/main.qml \
content/layouts/ro_RO/symbols.qml
-t9write: LAYOUT_FILES += \
+t9write-alphabetic: LAYOUT_FILES += \
content/layouts/ro_RO/handwriting.qml
}
contains(CONFIG, lang-ru.*) {
LAYOUT_FILES += \
content/layouts/ru_RU/main.qml \
content/layouts/ru_RU/symbols.qml
-t9write: LAYOUT_FILES += \
+t9write-alphabetic: LAYOUT_FILES += \
content/layouts/ru_RU/handwriting.qml
}
+contains(CONFIG, lang-sr.*) {
+ LAYOUT_FILES += \
+ content/layouts/sr_SP/main.qml \
+ content/layouts/sr_SP/symbols.qml
+t9write-alphabetic: LAYOUT_FILES += \
+ content/layouts/sr_SP/handwriting.qml
+}
contains(CONFIG, lang-sv.*) {
LAYOUT_FILES += \
content/layouts/sv_SE/main.qml \
content/layouts/sv_SE/symbols.qml
-t9write: LAYOUT_FILES += \
+t9write-alphabetic: LAYOUT_FILES += \
content/layouts/sv_SE/handwriting.qml
}
contains(CONFIG, lang-zh(_CN)?) {
LAYOUT_FILES += \
content/layouts/zh_CN/main.qml \
content/layouts/zh_CN/symbols.qml
+t9write-cjk: LAYOUT_FILES += \
+ content/layouts/zh_CN/handwriting.qml
}
contains(CONFIG, lang-zh(_TW)?) {
LAYOUT_FILES += \
content/layouts/zh_TW/main.qml \
content/layouts/zh_TW/symbols.qml
+t9write-cjk: LAYOUT_FILES += \
+ content/layouts/zh_TW/handwriting.qml
}
retro-style {
@@ -325,7 +407,6 @@ lipi-toolkit {
-lltkutil$$qtPlatformTargetSuffix()
win32: LIBS += Advapi32.lib
else: QMAKE_USE += libdl
- record-trace-input: DEFINES += QT_VIRTUALKEYBOARD_LIPI_RECORD_TRACE_INPUT
ltk_projects.files = $$PWD/3rdparty/lipi-toolkit/projects
ltk_projects.path = $$[QT_INSTALL_DATA]/qtvirtualkeyboard/lipi_toolkit
INSTALLS += ltk_projects
@@ -335,18 +416,47 @@ lipi-toolkit {
t9write {
include(3rdparty/t9write/t9write-build.pri)
equals(T9WRITE_FOUND, 0): \
- error("T9Write SDK could not be found. Please make sure you have extracted" \
- "the contents of the T9Write SDK to $$PWD/3rdparty/t9write")
+ error("T9Write SDK could not be found. For more information, see" \
+ "the documentation in Building Qt Virtual Keyboard")
SOURCES += \
t9writeinputmethod.cpp \
- t9writeworker.cpp
+ t9writeworker.cpp \
+ t9writedictionary.cpp
HEADERS += \
t9writeinputmethod.h \
- t9writeworker.h
+ t9writeworker.h \
+ t9writedictionary.h \
+ t9write.h
DEFINES += HAVE_T9WRITE
QMAKE_USE += t9write_db
INCLUDEPATH += $$T9WRITE_INCLUDE_DIRS
- LIBS += $$T9WRITE_ALPHABETIC_LIBS
+ t9write-alphabetic {
+ LIBS += $$T9WRITE_ALPHABETIC_LIBS
+ DEFINES += HAVE_T9WRITE_ALPHABETIC
+ !isEmpty(T9WRITE_ALPHABETIC_BINS) {
+ t9write_alphabetic_bins.files = $$T9WRITE_ALPHABETIC_BINS
+ t9write_alphabetic_bins.path = $$[QT_INSTALL_BINS]
+ INSTALLS += t9write_alphabetic_bins
+ !prefix_build: COPIES += t9write_alphabetic_bins
+ }
+ }
+ t9write-cjk {
+ LIBS += $$T9WRITE_CJK_LIBS
+ DEFINES += HAVE_T9WRITE_CJK
+ !isEmpty(T9WRITE_CJK_BINS) {
+ t9write_cjk_bins.files = $$T9WRITE_CJK_BINS
+ t9write_cjk_bins.path = $$[QT_INSTALL_BINS]
+ INSTALLS += t9write_cjk_bins
+ !prefix_build: COPIES += t9write_cjk_bins
+ }
+ }
+ DEFINES += QT_VIRTUALKEYBOARD_DEBUG
+}
+
+record-trace-input {
+ SOURCES += unipentrace.cpp
+ HEADERS += unipentrace.h
+ DEFINES += QT_VIRTUALKEYBOARD_RECORD_TRACE_INPUT
}
arrow-key-navigation: DEFINES += QT_VIRTUALKEYBOARD_ARROW_KEY_NAVIGATION
diff --git a/tests/auto/auto.pro b/tests/auto/auto.pro
index 3a406734..6b71c159 100644
--- a/tests/auto/auto.pro
+++ b/tests/auto/auto.pro
@@ -6,5 +6,3 @@ SUBDIRS += \
layoutfilesystem \
layoutresources \
-# QTBUG-60268
-boot2qt: SUBDIRS = ""
diff --git a/tests/auto/inputpanel/BLACKLIST b/tests/auto/inputpanel/BLACKLIST
index e69de29b..b814578b 100644
--- a/tests/auto/inputpanel/BLACKLIST
+++ b/tests/auto/inputpanel/BLACKLIST
@@ -0,0 +1,6 @@
+# QTBUG-61279
+# Test fails if hunspell support is enabled in qtvirtualkeyboard
+# and hunspell-en-gb is installed to the system
+[tst_plugin::test_wclAutoCommitWordSetting:row 0]
+b2qt
+
diff --git a/tests/auto/inputpanel/data/inputpanel/handwriting.js b/tests/auto/inputpanel/data/inputpanel/handwriting.js
index 36b67240..a4c4ec1a 100644
--- a/tests/auto/inputpanel/data/inputpanel/handwriting.js
+++ b/tests/auto/inputpanel/data/inputpanel/handwriting.js
@@ -30,25 +30,50 @@
.pragma library
.import "unipen_data.js" as UnipenData
+.import "unipen_data_simp_chinese.js" as UnipenDataSimpChinese
+.import "unipen_data_trad_chinese.js" as UnipenDataTradChinese
+.import "unipen_data_japanese.js" as UnipenDataJapanese
+.import "unipen_data_korean.js" as UnipenDataKorean
+.import "unipen_data_greek.js" as UnipenDataGreek
+.import "unipen_data_cyrillic.js" as UnipenDataCyrillic
+.import "unipen_data_arabic.js" as UnipenDataArabic
+.import "unipen_data_hebrew.js" as UnipenDataHebrew
function emulate(testcase, hwrInputArea, ch, instant) {
var chKey = (((typeof ch == "number") ? ch : ch.charCodeAt(0)) + 0x100000000).toString(16).substr(1)
while (chKey.length > 4 && chKey[0] === '0')
chKey = chKey.substring(1)
chKey = "0x" + chKey
- if (!UnipenData.unipenData.hasOwnProperty(chKey))
+ var unipenData
+ if (UnipenData.unipenData.hasOwnProperty(chKey))
+ unipenData = UnipenData
+ else if (UnipenDataSimpChinese.unipenData.hasOwnProperty(chKey))
+ unipenData = UnipenDataSimpChinese
+ else if (UnipenDataTradChinese.unipenData.hasOwnProperty(chKey))
+ unipenData = UnipenDataTradChinese
+ else if (UnipenDataJapanese.unipenData.hasOwnProperty(chKey))
+ unipenData = UnipenDataJapanese
+ else if (UnipenDataKorean.unipenData.hasOwnProperty(chKey))
+ unipenData = UnipenDataKorean
+ else if (UnipenDataGreek.unipenData.hasOwnProperty(chKey))
+ unipenData = UnipenDataGreek
+ else if (UnipenDataCyrillic.unipenData.hasOwnProperty(chKey))
+ unipenData = UnipenDataCyrillic
+ else if (UnipenDataArabic.unipenData.hasOwnProperty(chKey))
+ unipenData = UnipenDataArabic
+ else if (UnipenDataHebrew.unipenData.hasOwnProperty(chKey))
+ unipenData = UnipenDataHebrew
+ else
return false
- var chData = UnipenData.unipenData[chKey]
+ var chData = unipenData.unipenData[chKey]
var scale = Math.min(hwrInputArea.width / chData[".X_DIM"], hwrInputArea.height / chData[".Y_DIM"])
- var strokes = UnipenData.unipenData[chKey][".PEN"]
- var boundingBox = calculateBoundingBox(strokes)
- var boxOffset = Qt.point(-boundingBox.x * scale + (hwrInputArea.width - boundingBox.width * scale) / 2, -boundingBox.y * scale + (hwrInputArea.height - boundingBox.height * scale) / 2)
+ var strokes = unipenData.unipenData[chKey][".PEN"]
var t = 0
for (var strokeIndex = 0; strokeIndex < strokes.length; strokeIndex++) {
var stroke = strokes[strokeIndex]
for (var i = 0; i < stroke.length; i++) {
var strokeData = stroke[i]
- var pt = Qt.point(strokeData[0] * scale + boxOffset.x, strokeData[1] * scale + boxOffset.y)
+ var pt = Qt.point(strokeData[0] * scale, strokeData[1] * scale)
if (instant)
t = strokeData[2]
if (i == 0) {
@@ -64,29 +89,3 @@ function emulate(testcase, hwrInputArea, ch, instant) {
}
return true
}
-
-function calculateBoundingBox(unipenStrokes) {
- var bboxLeft = 2147483647
- var bboxRight = -2147483647
- var bboxTop = 2147483647
- var bboxBottom = -2147483647
- for (var strokeIndex = 0; strokeIndex < unipenStrokes.length; strokeIndex++) {
- var stroke = unipenStrokes[strokeIndex]
- for (var i = 0; i < stroke.length; i++) {
- var strokeData = stroke[i]
- var x = strokeData[0]
- if (bboxLeft > x)
- bboxLeft = x
- if (bboxRight < x)
- bboxRight = x
- var y = strokeData[1]
- if (bboxTop > y)
- bboxTop = y
- if (bboxBottom < y)
- bboxBottom = y
- }
- }
- if (bboxLeft > bboxRight || bboxTop > bboxBottom)
- return Qt.rect(0, 0, 0, 0)
- return Qt.rect(bboxLeft, bboxTop, bboxRight - bboxLeft, bboxBottom -bboxTop)
-}
diff --git a/tests/auto/inputpanel/data/inputpanel/inputpanel.qml b/tests/auto/inputpanel/data/inputpanel/inputpanel.qml
index d1b3cae6..dfdb941b 100644
--- a/tests/auto/inputpanel/data/inputpanel/inputpanel.qml
+++ b/tests/auto/inputpanel/data/inputpanel/inputpanel.qml
@@ -29,7 +29,7 @@
import QtTest 1.0
import QtQuick 2.0
-import QtQuick.VirtualKeyboard 2.2
+import QtQuick.VirtualKeyboard 2.3
import QtQuick.VirtualKeyboard.Settings 2.2
import "handwriting.js" as Handwriting
import "utils.js" as Utils
@@ -263,6 +263,20 @@ InputPanel {
return InputEngine.Katakana
else if (inputModeName === "FullwidthLatin")
return InputEngine.FullwidthLatin
+ else if (inputModeName === "Greek")
+ return InputEngine.Greek
+ else if (inputModeName === "Cyrillic")
+ return InputEngine.Cyrillic
+ else if (inputModeName === "Arabic")
+ return InputEngine.Arabic
+ else if (inputModeName === "Hebrew")
+ return InputEngine.Hebrew
+ else if (inputModeName === "ChineseHandwriting")
+ return InputEngine.ChineseHandwriting
+ else if (inputModeName === "JapaneseHandwriting")
+ return InputEngine.JapaneseHandwriting
+ else if (inputModeName === "KoreanHandwriting")
+ return InputEngine.KoreanHandwriting
else
return -1
}
@@ -283,14 +297,21 @@ InputPanel {
return Utils.findChild(keyboardLayoutLoader, key, function(obj, param) {
if (!obj.hasOwnProperty("key") || !obj.hasOwnProperty("text"))
return false
- return (typeof param == "number") ? obj.key === param : obj.text === param
+ return (typeof param == "number") ? obj.key === param : obj.text.toUpperCase() === param.toUpperCase()
})
}
function findVirtualKeyAlternative(key) {
if (typeof key != "string")
return null
- return Utils.findChildByProperty(keyboardLayoutLoader, "effectiveAlternativeKeys", key, function(propertyValue, key) { return propertyValue.indexOf(key) !== -1 })
+ return Utils.findChildByProperty(keyboardLayoutLoader, "effectiveAlternativeKeys", key.toUpperCase(),
+ function(propertyValue, key) {
+ if (typeof propertyValue == "string")
+ return propertyValue.toUpperCase().indexOf(key) !== -1
+ return propertyValue.filter(function(value) {
+ return key === value.toUpperCase()
+ }).length > 0
+ })
}
function findObjectByName(objectName) {
@@ -342,12 +363,14 @@ InputPanel {
testcase.waitForRendering(inputPanel)
success = keyActionOnCurrentLayoutCb(key)
}
- } else {
+ } else if (typeof key != "number" || key !== Qt.Key_Shift) {
// Some layouts (such as Arabic, Hindi) may have a second layout
- InputContext.shiftHandler.toggleShift()
+ virtualKeyPress(Qt.Key_Shift)
+ InputContext.shiftHandler.clearToggleShiftTimer()
testcase.waitForRendering(inputPanel)
success = keyActionOnCurrentLayoutCb(key)
- InputContext.shiftHandler.toggleShift()
+ virtualKeyPress(Qt.Key_Shift)
+ InputContext.shiftHandler.clearToggleShiftTimer()
}
if (success)
break
@@ -368,6 +391,8 @@ InputPanel {
}
function virtualKeyPress(key) {
+ if (!key)
+ return false
return multiLayoutKeyActionHelper(key, virtualKeyPressOnCurrentLayout)
}
@@ -547,7 +572,7 @@ InputPanel {
function setHandwritingMode(enabled) {
if (inputPanel.keyboard.handwritingMode !== enabled) {
if (!enabled || inputPanel.keyboard.isHandwritingAvailable())
- inputPanel.keyboard.handwritingMode = enabled
+ inputPanel.keyboard.setHandwritingMode(enabled, true)
}
return inputPanel.keyboard.handwritingMode === enabled
}
diff --git a/tests/auto/inputpanel/data/inputpanel/unipen_data.js b/tests/auto/inputpanel/data/inputpanel/unipen_data.js
index 4c69b43d..83ad1a2c 100644
--- a/tests/auto/inputpanel/data/inputpanel/unipen_data.js
+++ b/tests/auto/inputpanel/data/inputpanel/unipen_data.js
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
@@ -10170,239 +10170,339 @@ var unipenData = {
".PEN": [
[
[
- 435,
- 78,
+ 407,
+ 75,
0
],
[
- 435,
- 77,
- 13
- ],
- [
- 435,
- 76,
- 33
- ],
- [
- 435,
- 75,
- 70
+ 406,
+ 74,
+ 76
],
[
- 434,
+ 403,
74,
- 84
+ 96
],
[
- 434,
+ 401,
73,
- 109
+ 100
],
[
- 431,
- 70,
- 130
+ 395,
+ 73,
+ 128
],
[
- 417,
- 65,
- 156
+ 392,
+ 73,
+ 129
],
[
- 407,
- 65,
- 174
+ 388,
+ 73,
+ 131
],
[
385,
- 70,
- 194
+ 73,
+ 162
],
[
- 377,
+ 375,
73,
- 214
+ 162
],
[
- 361,
- 83,
- 238
+ 370,
+ 75,
+ 163
],
[
- 355,
- 88,
- 247
+ 360,
+ 78,
+ 195
],
[
349,
- 100,
- 275
+ 85,
+ 196
],
[
- 354,
- 113,
- 310
+ 342,
+ 91,
+ 228
],
[
- 360,
- 117,
- 338
+ 338,
+ 98,
+ 229
],
[
- 368,
- 120,
- 357
+ 337,
+ 107,
+ 261
],
[
- 379,
- 120,
- 377
+ 337,
+ 115,
+ 261
],
[
- 408,
- 110,
- 412
+ 342,
+ 125,
+ 294
],
[
- 414,
- 105,
- 437
+ 347,
+ 133,
+ 295
],
[
- 423,
- 95,
- 462
+ 351,
+ 135,
+ 299
],
[
- 424,
- 91,
- 484
+ 353,
+ 139,
+ 328
],
[
- 426,
- 87,
- 511
+ 359,
+ 143,
+ 329
],
[
- 426,
- 83,
- 541
+ 363,
+ 144,
+ 331
],
[
- 427,
- 81,
+ 365,
+ 145,
+ 361
+ ],
+ [
+ 369,
+ 148,
+ 362
+ ],
+ [
+ 371,
+ 148,
+ 363
+ ],
+ [
+ 372,
+ 148,
+ 395
+ ],
+ [
+ 376,
+ 146,
+ 396
+ ],
+ [
+ 382,
+ 143,
+ 427
+ ],
+ [
+ 387,
+ 137,
+ 428
+ ],
+ [
+ 391,
+ 129,
+ 461
+ ],
+ [
+ 395,
+ 123,
+ 461
+ ],
+ [
+ 400,
+ 118,
+ 494
+ ],
+ [
+ 401,
+ 113,
+ 494
+ ],
+ [
+ 402,
+ 108,
+ 527
+ ],
+ [
+ 404,
+ 103,
+ 528
+ ],
+ [
+ 406,
+ 99,
+ 531
+ ],
+ [
+ 406,
+ 96,
+ 561
+ ],
+ [
+ 408,
+ 90,
+ 561
+ ],
+ [
+ 408,
+ 88,
564
],
[
- 426,
- 80,
- 591
+ 408,
+ 86,
+ 593
],
[
- 427,
- 79,
- 648
+ 409,
+ 84,
+ 594
],
[
- 427,
+ 409,
+ 83,
+ 627
+ ],
+ [
+ 409,
+ 82,
+ 661
+ ],
+ [
+ 409,
81,
- 698
+ 694
],
[
- 427,
+ 409,
83,
- 722
+ 844
],
[
- 428,
- 90,
- 741
+ 409,
+ 89,
+ 878
],
[
- 430,
+ 409,
+ 93,
+ 879
+ ],
+ [
+ 409,
98,
- 760
+ 884
],
[
- 432,
- 118,
- 788
+ 408,
+ 103,
+ 910
],
[
- 434,
- 129,
- 797
+ 407,
+ 118,
+ 911
],
[
- 436,
- 151,
- 829
+ 407,
+ 135,
+ 943
],
[
- 436,
- 160,
- 844
+ 407,
+ 157,
+ 944
],
[
- 437,
+ 407,
166,
- 863
+ 948
],
[
- 437,
- 171,
- 899
+ 409,
+ 175,
+ 976
],
[
- 437,
- 173,
- 921
+ 410,
+ 186,
+ 977
],
[
- 437,
- 176,
- 938
+ 410,
+ 191,
+ 979
],
[
- 437,
- 177,
- 964
+ 411,
+ 196,
+ 1009
],
[
- 437,
- 178,
- 985
+ 411,
+ 203,
+ 1010
],
[
- 437,
- 179,
- 1013
+ 413,
+ 207,
+ 1011
],
[
- 437,
- 180,
- 1032
+ 413,
+ 211,
+ 1042
],
[
- 437,
- 181,
- 1101
+ 413,
+ 223,
+ 1043
],
[
- 438,
- 181,
- 1136
+ 413,
+ 230,
+ 1076
+ ],
+ [
+ 413,
+ 234,
+ 1077
+ ],
+ [
+ 413,
+ 235,
+ 1109
+ ],
+ [
+ 413,
+ 236,
+ 1110
]
]
],
".POINTS_PER_SECOND": 60,
".SEGMENT": "CHARACTER",
".VERSION": "1.0",
- ".X_DIM": 821,
- ".X_POINTS_PER_INCH": 100,
- ".Y_DIM": 211,
- ".Y_POINTS_PER_INCH": 100
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 95,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 95
},
"0x0072": {
".COORD": [
diff --git a/tests/auto/inputpanel/data/inputpanel/unipen_data_arabic.js b/tests/auto/inputpanel/data/inputpanel/unipen_data_arabic.js
new file mode 100644
index 00000000..da810919
--- /dev/null
+++ b/tests/auto/inputpanel/data/inputpanel/unipen_data_arabic.js
@@ -0,0 +1,1665 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+var unipenData = {
+ "0x0627": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 354,
+ 61,
+ 0
+ ],
+ [
+ 354,
+ 64,
+ 76
+ ],
+ [
+ 354,
+ 69,
+ 92
+ ],
+ [
+ 354,
+ 83,
+ 133
+ ],
+ [
+ 348,
+ 104,
+ 196
+ ],
+ [
+ 345,
+ 127,
+ 198
+ ],
+ [
+ 345,
+ 137,
+ 255
+ ],
+ [
+ 347,
+ 157,
+ 256
+ ],
+ [
+ 347,
+ 159,
+ 260
+ ],
+ [
+ 347,
+ 164,
+ 315
+ ],
+ [
+ 346,
+ 170,
+ 316
+ ],
+ [
+ 345,
+ 174,
+ 376
+ ],
+ [
+ 345,
+ 177,
+ 377
+ ],
+ [
+ 344,
+ 179,
+ 379
+ ],
+ [
+ 344,
+ 181,
+ 437
+ ],
+ [
+ 344,
+ 182,
+ 438
+ ],
+ [
+ 344,
+ 183,
+ 499
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ },
+ "0x0628": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 264,
+ 132,
+ 0
+ ],
+ [
+ 264,
+ 133,
+ 68
+ ],
+ [
+ 263,
+ 139,
+ 69
+ ],
+ [
+ 262,
+ 146,
+ 127
+ ],
+ [
+ 262,
+ 149,
+ 128
+ ],
+ [
+ 259,
+ 160,
+ 132
+ ],
+ [
+ 259,
+ 163,
+ 188
+ ],
+ [
+ 255,
+ 180,
+ 190
+ ],
+ [
+ 252,
+ 184,
+ 251
+ ],
+ [
+ 251,
+ 185,
+ 254
+ ],
+ [
+ 246,
+ 186,
+ 310
+ ],
+ [
+ 241,
+ 186,
+ 374
+ ],
+ [
+ 236,
+ 186,
+ 376
+ ],
+ [
+ 234,
+ 186,
+ 380
+ ],
+ [
+ 232,
+ 186,
+ 433
+ ],
+ [
+ 218,
+ 184,
+ 434
+ ],
+ [
+ 214,
+ 184,
+ 436
+ ],
+ [
+ 204,
+ 183,
+ 493
+ ],
+ [
+ 195,
+ 181,
+ 494
+ ],
+ [
+ 187,
+ 180,
+ 556
+ ],
+ [
+ 181,
+ 179,
+ 558
+ ],
+ [
+ 175,
+ 178,
+ 617
+ ],
+ [
+ 169,
+ 178,
+ 618
+ ],
+ [
+ 162,
+ 177,
+ 676
+ ],
+ [
+ 159,
+ 177,
+ 677
+ ],
+ [
+ 154,
+ 177,
+ 737
+ ],
+ [
+ 146,
+ 176,
+ 738
+ ],
+ [
+ 145,
+ 176,
+ 797
+ ],
+ [
+ 143,
+ 174,
+ 859
+ ],
+ [
+ 140,
+ 170,
+ 861
+ ],
+ [
+ 140,
+ 168,
+ 918
+ ],
+ [
+ 140,
+ 165,
+ 919
+ ],
+ [
+ 140,
+ 160,
+ 978
+ ],
+ [
+ 140,
+ 151,
+ 979
+ ],
+ [
+ 140,
+ 139,
+ 1041
+ ],
+ [
+ 142,
+ 132,
+ 1043
+ ],
+ [
+ 143,
+ 131,
+ 1102
+ ],
+ [
+ 143,
+ 127,
+ 1103
+ ],
+ [
+ 143,
+ 126,
+ 1228
+ ]
+ ],
+ [
+ [
+ 193,
+ 204,
+ 1784
+ ],
+ [
+ 193,
+ 206,
+ 1836
+ ],
+ [
+ 193,
+ 208,
+ 1863
+ ],
+ [
+ 193,
+ 210,
+ 1867
+ ],
+ [
+ 193,
+ 211,
+ 1923
+ ],
+ [
+ 193,
+ 212,
+ 1924
+ ],
+ [
+ 193,
+ 213,
+ 1984
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ },
+ "0x062a": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 497,
+ 124,
+ 0
+ ],
+ [
+ 497,
+ 125,
+ 76
+ ],
+ [
+ 497,
+ 129,
+ 99
+ ],
+ [
+ 496,
+ 132,
+ 135
+ ],
+ [
+ 496,
+ 135,
+ 136
+ ],
+ [
+ 495,
+ 140,
+ 198
+ ],
+ [
+ 493,
+ 148,
+ 199
+ ],
+ [
+ 491,
+ 158,
+ 259
+ ],
+ [
+ 491,
+ 160,
+ 259
+ ],
+ [
+ 491,
+ 165,
+ 260
+ ],
+ [
+ 490,
+ 167,
+ 319
+ ],
+ [
+ 487,
+ 176,
+ 320
+ ],
+ [
+ 487,
+ 178,
+ 382
+ ],
+ [
+ 485,
+ 183,
+ 383
+ ],
+ [
+ 483,
+ 185,
+ 443
+ ],
+ [
+ 479,
+ 188,
+ 445
+ ],
+ [
+ 476,
+ 190,
+ 501
+ ],
+ [
+ 471,
+ 192,
+ 503
+ ],
+ [
+ 468,
+ 192,
+ 532
+ ],
+ [
+ 465,
+ 193,
+ 562
+ ],
+ [
+ 456,
+ 194,
+ 563
+ ],
+ [
+ 452,
+ 195,
+ 564
+ ],
+ [
+ 448,
+ 195,
+ 624
+ ],
+ [
+ 436,
+ 195,
+ 624
+ ],
+ [
+ 432,
+ 195,
+ 627
+ ],
+ [
+ 420,
+ 194,
+ 687
+ ],
+ [
+ 410,
+ 192,
+ 688
+ ],
+ [
+ 403,
+ 190,
+ 691
+ ],
+ [
+ 396,
+ 189,
+ 746
+ ],
+ [
+ 381,
+ 188,
+ 747
+ ],
+ [
+ 370,
+ 186,
+ 806
+ ],
+ [
+ 354,
+ 183,
+ 807
+ ],
+ [
+ 340,
+ 182,
+ 867
+ ],
+ [
+ 334,
+ 182,
+ 868
+ ],
+ [
+ 332,
+ 181,
+ 928
+ ],
+ [
+ 330,
+ 181,
+ 929
+ ],
+ [
+ 330,
+ 179,
+ 989
+ ],
+ [
+ 330,
+ 176,
+ 1050
+ ],
+ [
+ 332,
+ 174,
+ 1051
+ ],
+ [
+ 333,
+ 171,
+ 1051
+ ],
+ [
+ 335,
+ 168,
+ 1113
+ ],
+ [
+ 337,
+ 164,
+ 1114
+ ],
+ [
+ 339,
+ 162,
+ 1117
+ ],
+ [
+ 340,
+ 160,
+ 1174
+ ],
+ [
+ 341,
+ 156,
+ 1174
+ ],
+ [
+ 343,
+ 152,
+ 1232
+ ],
+ [
+ 345,
+ 143,
+ 1233
+ ],
+ [
+ 345,
+ 142,
+ 1292
+ ],
+ [
+ 345,
+ 141,
+ 1353
+ ]
+ ],
+ [
+ [
+ 398,
+ 104,
+ 1752
+ ],
+ [
+ 399,
+ 105,
+ 1809
+ ],
+ [
+ 403,
+ 116,
+ 1810
+ ],
+ [
+ 404,
+ 124,
+ 1871
+ ],
+ [
+ 404,
+ 128,
+ 1871
+ ],
+ [
+ 406,
+ 130,
+ 1933
+ ]
+ ],
+ [
+ [
+ 436,
+ 109,
+ 2182
+ ],
+ [
+ 436,
+ 113,
+ 2209
+ ],
+ [
+ 436,
+ 114,
+ 2211
+ ],
+ [
+ 435,
+ 122,
+ 2212
+ ],
+ [
+ 434,
+ 124,
+ 2270
+ ],
+ [
+ 433,
+ 130,
+ 2272
+ ],
+ [
+ 433,
+ 134,
+ 2328
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ },
+ "0x0643": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 634,
+ 60,
+ 0
+ ],
+ [
+ 634,
+ 61,
+ 47
+ ],
+ [
+ 634,
+ 63,
+ 50
+ ],
+ [
+ 635,
+ 69,
+ 110
+ ],
+ [
+ 636,
+ 79,
+ 111
+ ],
+ [
+ 636,
+ 85,
+ 140
+ ],
+ [
+ 636,
+ 90,
+ 169
+ ],
+ [
+ 636,
+ 103,
+ 170
+ ],
+ [
+ 637,
+ 118,
+ 230
+ ],
+ [
+ 637,
+ 135,
+ 231
+ ],
+ [
+ 637,
+ 138,
+ 260
+ ],
+ [
+ 637,
+ 148,
+ 290
+ ],
+ [
+ 637,
+ 153,
+ 291
+ ],
+ [
+ 637,
+ 157,
+ 353
+ ],
+ [
+ 637,
+ 161,
+ 354
+ ],
+ [
+ 637,
+ 162,
+ 356
+ ],
+ [
+ 637,
+ 163,
+ 412
+ ],
+ [
+ 637,
+ 168,
+ 413
+ ],
+ [
+ 636,
+ 169,
+ 473
+ ],
+ [
+ 634,
+ 174,
+ 474
+ ],
+ [
+ 633,
+ 175,
+ 477
+ ],
+ [
+ 633,
+ 176,
+ 533
+ ],
+ [
+ 632,
+ 177,
+ 535
+ ],
+ [
+ 627,
+ 178,
+ 594
+ ],
+ [
+ 625,
+ 180,
+ 595
+ ],
+ [
+ 620,
+ 181,
+ 656
+ ],
+ [
+ 613,
+ 182,
+ 657
+ ],
+ [
+ 601,
+ 183,
+ 717
+ ],
+ [
+ 590,
+ 184,
+ 718
+ ],
+ [
+ 582,
+ 185,
+ 778
+ ],
+ [
+ 580,
+ 186,
+ 779
+ ],
+ [
+ 578,
+ 186,
+ 780
+ ],
+ [
+ 573,
+ 186,
+ 839
+ ],
+ [
+ 565,
+ 186,
+ 840
+ ],
+ [
+ 563,
+ 186,
+ 843
+ ],
+ [
+ 559,
+ 186,
+ 902
+ ],
+ [
+ 556,
+ 186,
+ 909
+ ],
+ [
+ 550,
+ 185,
+ 961
+ ],
+ [
+ 546,
+ 184,
+ 1022
+ ],
+ [
+ 544,
+ 184,
+ 1083
+ ],
+ [
+ 542,
+ 183,
+ 1084
+ ],
+ [
+ 539,
+ 183,
+ 1144
+ ],
+ [
+ 538,
+ 182,
+ 1145
+ ],
+ [
+ 535,
+ 180,
+ 1207
+ ],
+ [
+ 534,
+ 179,
+ 1209
+ ],
+ [
+ 534,
+ 178,
+ 1212
+ ],
+ [
+ 533,
+ 176,
+ 1267
+ ],
+ [
+ 532,
+ 176,
+ 1268
+ ],
+ [
+ 531,
+ 174,
+ 1269
+ ],
+ [
+ 531,
+ 172,
+ 1328
+ ],
+ [
+ 530,
+ 168,
+ 1329
+ ],
+ [
+ 528,
+ 162,
+ 1390
+ ],
+ [
+ 527,
+ 158,
+ 1392
+ ],
+ [
+ 527,
+ 157,
+ 1451
+ ],
+ [
+ 526,
+ 154,
+ 1453
+ ],
+ [
+ 526,
+ 153,
+ 1510
+ ],
+ [
+ 526,
+ 152,
+ 1571
+ ]
+ ],
+ [
+ [
+ 597,
+ 77,
+ 2271
+ ],
+ [
+ 595,
+ 77,
+ 2329
+ ],
+ [
+ 591,
+ 79,
+ 2361
+ ],
+ [
+ 587,
+ 81,
+ 2363
+ ],
+ [
+ 583,
+ 83,
+ 2419
+ ],
+ [
+ 581,
+ 84,
+ 2420
+ ],
+ [
+ 578,
+ 87,
+ 2420
+ ],
+ [
+ 576,
+ 88,
+ 2480
+ ],
+ [
+ 572,
+ 96,
+ 2480
+ ],
+ [
+ 571,
+ 102,
+ 2542
+ ],
+ [
+ 571,
+ 107,
+ 2542
+ ],
+ [
+ 573,
+ 111,
+ 2602
+ ],
+ [
+ 578,
+ 117,
+ 2603
+ ],
+ [
+ 581,
+ 118,
+ 2663
+ ],
+ [
+ 583,
+ 118,
+ 2668
+ ],
+ [
+ 586,
+ 118,
+ 2724
+ ],
+ [
+ 593,
+ 118,
+ 2725
+ ],
+ [
+ 601,
+ 115,
+ 2784
+ ],
+ [
+ 603,
+ 113,
+ 2785
+ ],
+ [
+ 603,
+ 112,
+ 2788
+ ],
+ [
+ 603,
+ 111,
+ 2956
+ ],
+ [
+ 600,
+ 115,
+ 2997
+ ],
+ [
+ 597,
+ 119,
+ 3057
+ ],
+ [
+ 594,
+ 122,
+ 3058
+ ],
+ [
+ 588,
+ 128,
+ 3117
+ ],
+ [
+ 585,
+ 131,
+ 3118
+ ],
+ [
+ 582,
+ 134,
+ 3181
+ ],
+ [
+ 581,
+ 134,
+ 3183
+ ],
+ [
+ 580,
+ 135,
+ 3244
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ },
+ "0x0686": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 458,
+ 113,
+ 0
+ ],
+ [
+ 457,
+ 112,
+ 48
+ ],
+ [
+ 457,
+ 111,
+ 49
+ ],
+ [
+ 454,
+ 107,
+ 103
+ ],
+ [
+ 446,
+ 99,
+ 104
+ ],
+ [
+ 440,
+ 94,
+ 165
+ ],
+ [
+ 426,
+ 75,
+ 166
+ ],
+ [
+ 419,
+ 61,
+ 227
+ ],
+ [
+ 419,
+ 58,
+ 228
+ ],
+ [
+ 420,
+ 53,
+ 230
+ ],
+ [
+ 441,
+ 49,
+ 288
+ ],
+ [
+ 473,
+ 49,
+ 289
+ ],
+ [
+ 508,
+ 55,
+ 349
+ ],
+ [
+ 517,
+ 65,
+ 350
+ ],
+ [
+ 517,
+ 71,
+ 409
+ ],
+ [
+ 501,
+ 85,
+ 411
+ ],
+ [
+ 454,
+ 104,
+ 471
+ ],
+ [
+ 435,
+ 108,
+ 472
+ ],
+ [
+ 417,
+ 112,
+ 475
+ ],
+ [
+ 397,
+ 119,
+ 536
+ ],
+ [
+ 383,
+ 126,
+ 537
+ ],
+ [
+ 377,
+ 130,
+ 539
+ ],
+ [
+ 376,
+ 138,
+ 594
+ ],
+ [
+ 376,
+ 144,
+ 595
+ ],
+ [
+ 378,
+ 148,
+ 596
+ ],
+ [
+ 383,
+ 156,
+ 654
+ ],
+ [
+ 390,
+ 162,
+ 655
+ ],
+ [
+ 410,
+ 169,
+ 716
+ ],
+ [
+ 446,
+ 172,
+ 717
+ ],
+ [
+ 467,
+ 172,
+ 749
+ ],
+ [
+ 487,
+ 172,
+ 777
+ ],
+ [
+ 503,
+ 173,
+ 778
+ ],
+ [
+ 517,
+ 173,
+ 779
+ ],
+ [
+ 533,
+ 170,
+ 838
+ ],
+ [
+ 553,
+ 169,
+ 838
+ ],
+ [
+ 555,
+ 169,
+ 868
+ ],
+ [
+ 555,
+ 168,
+ 899
+ ]
+ ],
+ [
+ [
+ 505,
+ 127,
+ 1279
+ ],
+ [
+ 503,
+ 127,
+ 1283
+ ],
+ [
+ 491,
+ 127,
+ 1351
+ ],
+ [
+ 475,
+ 128,
+ 1352
+ ],
+ [
+ 471,
+ 131,
+ 1412
+ ],
+ [
+ 475,
+ 142,
+ 1413
+ ],
+ [
+ 504,
+ 149,
+ 1474
+ ],
+ [
+ 512,
+ 145,
+ 1475
+ ],
+ [
+ 512,
+ 143,
+ 1539
+ ],
+ [
+ 510,
+ 134,
+ 1541
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ },
+ "0x06cc": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 399,
+ 119,
+ 0
+ ],
+ [
+ 399,
+ 118,
+ 49
+ ],
+ [
+ 399,
+ 116,
+ 50
+ ],
+ [
+ 399,
+ 111,
+ 110
+ ],
+ [
+ 399,
+ 107,
+ 110
+ ],
+ [
+ 399,
+ 104,
+ 141
+ ],
+ [
+ 398,
+ 99,
+ 171
+ ],
+ [
+ 397,
+ 97,
+ 172
+ ],
+ [
+ 395,
+ 88,
+ 173
+ ],
+ [
+ 391,
+ 79,
+ 234
+ ],
+ [
+ 384,
+ 70,
+ 236
+ ],
+ [
+ 381,
+ 68,
+ 298
+ ],
+ [
+ 380,
+ 67,
+ 298
+ ],
+ [
+ 379,
+ 67,
+ 300
+ ],
+ [
+ 376,
+ 67,
+ 353
+ ],
+ [
+ 371,
+ 69,
+ 353
+ ],
+ [
+ 366,
+ 71,
+ 356
+ ],
+ [
+ 363,
+ 73,
+ 414
+ ],
+ [
+ 357,
+ 78,
+ 415
+ ],
+ [
+ 352,
+ 91,
+ 476
+ ],
+ [
+ 349,
+ 105,
+ 477
+ ],
+ [
+ 349,
+ 116,
+ 536
+ ],
+ [
+ 355,
+ 129,
+ 537
+ ],
+ [
+ 356,
+ 132,
+ 539
+ ],
+ [
+ 357,
+ 137,
+ 596
+ ],
+ [
+ 362,
+ 150,
+ 597
+ ],
+ [
+ 363,
+ 156,
+ 661
+ ],
+ [
+ 362,
+ 161,
+ 662
+ ],
+ [
+ 359,
+ 165,
+ 717
+ ],
+ [
+ 349,
+ 171,
+ 718
+ ],
+ [
+ 331,
+ 178,
+ 777
+ ],
+ [
+ 328,
+ 179,
+ 778
+ ],
+ [
+ 320,
+ 181,
+ 780
+ ],
+ [
+ 311,
+ 182,
+ 840
+ ],
+ [
+ 297,
+ 182,
+ 841
+ ],
+ [
+ 289,
+ 181,
+ 900
+ ],
+ [
+ 284,
+ 179,
+ 901
+ ],
+ [
+ 282,
+ 177,
+ 961
+ ],
+ [
+ 276,
+ 170,
+ 962
+ ],
+ [
+ 275,
+ 164,
+ 1023
+ ],
+ [
+ 275,
+ 160,
+ 1023
+ ],
+ [
+ 275,
+ 156,
+ 1083
+ ],
+ [
+ 275,
+ 151,
+ 1084
+ ],
+ [
+ 275,
+ 147,
+ 1143
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ }
+}
diff --git a/tests/auto/inputpanel/data/inputpanel/unipen_data_cyrillic.js b/tests/auto/inputpanel/data/inputpanel/unipen_data_cyrillic.js
new file mode 100644
index 00000000..3f336427
--- /dev/null
+++ b/tests/auto/inputpanel/data/inputpanel/unipen_data_cyrillic.js
@@ -0,0 +1,3440 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+var unipenData = {
+ "0x0430": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 531,
+ 128,
+ 0
+ ],
+ [
+ 532,
+ 128,
+ 56
+ ],
+ [
+ 534,
+ 127,
+ 72
+ ],
+ [
+ 536,
+ 127,
+ 100
+ ],
+ [
+ 538,
+ 124,
+ 100
+ ],
+ [
+ 539,
+ 124,
+ 103
+ ],
+ [
+ 541,
+ 123,
+ 133
+ ],
+ [
+ 544,
+ 122,
+ 133
+ ],
+ [
+ 546,
+ 122,
+ 136
+ ],
+ [
+ 548,
+ 122,
+ 165
+ ],
+ [
+ 554,
+ 122,
+ 166
+ ],
+ [
+ 557,
+ 121,
+ 168
+ ],
+ [
+ 561,
+ 121,
+ 199
+ ],
+ [
+ 570,
+ 125,
+ 200
+ ],
+ [
+ 575,
+ 130,
+ 232
+ ],
+ [
+ 579,
+ 135,
+ 233
+ ],
+ [
+ 583,
+ 141,
+ 266
+ ],
+ [
+ 586,
+ 148,
+ 266
+ ],
+ [
+ 586,
+ 154,
+ 298
+ ],
+ [
+ 586,
+ 160,
+ 299
+ ],
+ [
+ 586,
+ 163,
+ 303
+ ],
+ [
+ 586,
+ 166,
+ 332
+ ],
+ [
+ 587,
+ 171,
+ 333
+ ],
+ [
+ 587,
+ 174,
+ 336
+ ],
+ [
+ 587,
+ 176,
+ 366
+ ],
+ [
+ 587,
+ 180,
+ 367
+ ],
+ [
+ 587,
+ 181,
+ 368
+ ],
+ [
+ 587,
+ 182,
+ 399
+ ],
+ [
+ 587,
+ 183,
+ 399
+ ],
+ [
+ 588,
+ 185,
+ 400
+ ],
+ [
+ 589,
+ 188,
+ 432
+ ],
+ [
+ 589,
+ 190,
+ 465
+ ],
+ [
+ 589,
+ 189,
+ 511
+ ],
+ [
+ 589,
+ 187,
+ 548
+ ]
+ ],
+ [
+ [
+ 572,
+ 155,
+ 892
+ ],
+ [
+ 567,
+ 153,
+ 935
+ ],
+ [
+ 565,
+ 152,
+ 935
+ ],
+ [
+ 562,
+ 150,
+ 964
+ ],
+ [
+ 559,
+ 150,
+ 965
+ ],
+ [
+ 556,
+ 150,
+ 967
+ ],
+ [
+ 553,
+ 150,
+ 997
+ ],
+ [
+ 548,
+ 150,
+ 998
+ ],
+ [
+ 546,
+ 150,
+ 1000
+ ],
+ [
+ 544,
+ 150,
+ 1030
+ ],
+ [
+ 541,
+ 150,
+ 1031
+ ],
+ [
+ 540,
+ 152,
+ 1031
+ ],
+ [
+ 537,
+ 153,
+ 1064
+ ],
+ [
+ 535,
+ 155,
+ 1064
+ ],
+ [
+ 531,
+ 158,
+ 1065
+ ],
+ [
+ 527,
+ 163,
+ 1097
+ ],
+ [
+ 526,
+ 166,
+ 1098
+ ],
+ [
+ 524,
+ 168,
+ 1130
+ ],
+ [
+ 524,
+ 172,
+ 1131
+ ],
+ [
+ 524,
+ 173,
+ 1136
+ ],
+ [
+ 524,
+ 175,
+ 1163
+ ],
+ [
+ 526,
+ 178,
+ 1164
+ ],
+ [
+ 526,
+ 180,
+ 1167
+ ],
+ [
+ 527,
+ 180,
+ 1196
+ ],
+ [
+ 530,
+ 183,
+ 1197
+ ],
+ [
+ 532,
+ 184,
+ 1199
+ ],
+ [
+ 534,
+ 185,
+ 1229
+ ],
+ [
+ 539,
+ 187,
+ 1230
+ ],
+ [
+ 541,
+ 187,
+ 1231
+ ],
+ [
+ 544,
+ 187,
+ 1263
+ ],
+ [
+ 546,
+ 187,
+ 1264
+ ],
+ [
+ 551,
+ 187,
+ 1264
+ ],
+ [
+ 555,
+ 187,
+ 1297
+ ],
+ [
+ 562,
+ 186,
+ 1297
+ ],
+ [
+ 567,
+ 184,
+ 1330
+ ],
+ [
+ 575,
+ 180,
+ 1330
+ ],
+ [
+ 578,
+ 178,
+ 1347
+ ],
+ [
+ 579,
+ 176,
+ 1363
+ ],
+ [
+ 580,
+ 175,
+ 1363
+ ],
+ [
+ 580,
+ 174,
+ 1380
+ ],
+ [
+ 581,
+ 173,
+ 1396
+ ],
+ [
+ 582,
+ 173,
+ 1440
+ ],
+ [
+ 583,
+ 173,
+ 1465
+ ],
+ [
+ 582,
+ 173,
+ 1640
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 95,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 95
+ },
+ "0x0431": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 214,
+ 62,
+ 0
+ ],
+ [
+ 210,
+ 62,
+ 38
+ ],
+ [
+ 207,
+ 62,
+ 39
+ ],
+ [
+ 203,
+ 62,
+ 72
+ ],
+ [
+ 197,
+ 62,
+ 73
+ ],
+ [
+ 194,
+ 62,
+ 76
+ ],
+ [
+ 192,
+ 62,
+ 106
+ ],
+ [
+ 186,
+ 63,
+ 109
+ ],
+ [
+ 184,
+ 65,
+ 110
+ ],
+ [
+ 175,
+ 67,
+ 155
+ ],
+ [
+ 169,
+ 69,
+ 156
+ ],
+ [
+ 166,
+ 70,
+ 156
+ ],
+ [
+ 163,
+ 70,
+ 188
+ ],
+ [
+ 154,
+ 74,
+ 189
+ ],
+ [
+ 148,
+ 77,
+ 221
+ ],
+ [
+ 144,
+ 82,
+ 222
+ ],
+ [
+ 140,
+ 87,
+ 255
+ ],
+ [
+ 138,
+ 93,
+ 256
+ ],
+ [
+ 136,
+ 98,
+ 288
+ ],
+ [
+ 134,
+ 103,
+ 289
+ ],
+ [
+ 134,
+ 107,
+ 293
+ ],
+ [
+ 134,
+ 109,
+ 326
+ ],
+ [
+ 134,
+ 120,
+ 327
+ ],
+ [
+ 134,
+ 125,
+ 355
+ ],
+ [
+ 134,
+ 128,
+ 355
+ ],
+ [
+ 133,
+ 132,
+ 356
+ ],
+ [
+ 133,
+ 134,
+ 387
+ ],
+ [
+ 133,
+ 143,
+ 389
+ ],
+ [
+ 133,
+ 148,
+ 421
+ ],
+ [
+ 133,
+ 153,
+ 422
+ ],
+ [
+ 134,
+ 158,
+ 454
+ ],
+ [
+ 135,
+ 164,
+ 454
+ ],
+ [
+ 136,
+ 167,
+ 488
+ ],
+ [
+ 138,
+ 173,
+ 489
+ ],
+ [
+ 139,
+ 175,
+ 493
+ ],
+ [
+ 141,
+ 177,
+ 521
+ ],
+ [
+ 142,
+ 183,
+ 522
+ ],
+ [
+ 144,
+ 185,
+ 524
+ ],
+ [
+ 146,
+ 189,
+ 554
+ ],
+ [
+ 150,
+ 193,
+ 555
+ ],
+ [
+ 153,
+ 193,
+ 557
+ ],
+ [
+ 157,
+ 194,
+ 590
+ ],
+ [
+ 168,
+ 194,
+ 592
+ ],
+ [
+ 177,
+ 194,
+ 620
+ ],
+ [
+ 186,
+ 194,
+ 622
+ ],
+ [
+ 195,
+ 193,
+ 654
+ ],
+ [
+ 205,
+ 191,
+ 655
+ ],
+ [
+ 211,
+ 190,
+ 687
+ ],
+ [
+ 221,
+ 184,
+ 688
+ ],
+ [
+ 223,
+ 183,
+ 693
+ ],
+ [
+ 234,
+ 169,
+ 737
+ ],
+ [
+ 243,
+ 163,
+ 738
+ ],
+ [
+ 243,
+ 161,
+ 741
+ ],
+ [
+ 244,
+ 159,
+ 770
+ ],
+ [
+ 244,
+ 154,
+ 771
+ ],
+ [
+ 244,
+ 152,
+ 773
+ ],
+ [
+ 243,
+ 144,
+ 812
+ ],
+ [
+ 237,
+ 137,
+ 813
+ ],
+ [
+ 233,
+ 131,
+ 836
+ ],
+ [
+ 232,
+ 128,
+ 837
+ ],
+ [
+ 225,
+ 127,
+ 870
+ ],
+ [
+ 221,
+ 127,
+ 871
+ ],
+ [
+ 215,
+ 127,
+ 903
+ ],
+ [
+ 208,
+ 127,
+ 904
+ ],
+ [
+ 203,
+ 127,
+ 908
+ ],
+ [
+ 198,
+ 127,
+ 936
+ ],
+ [
+ 188,
+ 126,
+ 936
+ ],
+ [
+ 184,
+ 126,
+ 941
+ ],
+ [
+ 179,
+ 126,
+ 969
+ ],
+ [
+ 171,
+ 126,
+ 970
+ ],
+ [
+ 167,
+ 126,
+ 973
+ ],
+ [
+ 162,
+ 126,
+ 1003
+ ],
+ [
+ 156,
+ 126,
+ 1004
+ ],
+ [
+ 154,
+ 126,
+ 1004
+ ],
+ [
+ 151,
+ 126,
+ 1036
+ ],
+ [
+ 146,
+ 126,
+ 1036
+ ],
+ [
+ 142,
+ 128,
+ 1069
+ ],
+ [
+ 140,
+ 129,
+ 1070
+ ],
+ [
+ 137,
+ 131,
+ 1107
+ ],
+ [
+ 133,
+ 131,
+ 1108
+ ],
+ [
+ 132,
+ 132,
+ 1110
+ ],
+ [
+ 131,
+ 132,
+ 1136
+ ],
+ [
+ 128,
+ 132,
+ 1137
+ ],
+ [
+ 127,
+ 132,
+ 1141
+ ],
+ [
+ 127,
+ 133,
+ 1169
+ ],
+ [
+ 125,
+ 134,
+ 1170
+ ],
+ [
+ 125,
+ 135,
+ 1202
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 95,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 95
+ },
+ "0x0433": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 466,
+ 177,
+ 0
+ ],
+ [
+ 466,
+ 176,
+ 60
+ ],
+ [
+ 466,
+ 175,
+ 75
+ ],
+ [
+ 466,
+ 173,
+ 105
+ ],
+ [
+ 465,
+ 173,
+ 108
+ ],
+ [
+ 465,
+ 172,
+ 134
+ ],
+ [
+ 465,
+ 169,
+ 134
+ ],
+ [
+ 464,
+ 167,
+ 167
+ ],
+ [
+ 464,
+ 165,
+ 168
+ ],
+ [
+ 463,
+ 161,
+ 200
+ ],
+ [
+ 462,
+ 156,
+ 201
+ ],
+ [
+ 462,
+ 154,
+ 203
+ ],
+ [
+ 460,
+ 151,
+ 250
+ ],
+ [
+ 460,
+ 148,
+ 251
+ ],
+ [
+ 459,
+ 148,
+ 252
+ ],
+ [
+ 459,
+ 147,
+ 283
+ ],
+ [
+ 458,
+ 143,
+ 284
+ ],
+ [
+ 458,
+ 140,
+ 316
+ ],
+ [
+ 458,
+ 138,
+ 317
+ ],
+ [
+ 458,
+ 136,
+ 350
+ ],
+ [
+ 458,
+ 134,
+ 350
+ ],
+ [
+ 458,
+ 133,
+ 383
+ ],
+ [
+ 458,
+ 131,
+ 384
+ ],
+ [
+ 458,
+ 129,
+ 417
+ ],
+ [
+ 457,
+ 128,
+ 466
+ ],
+ [
+ 457,
+ 127,
+ 466
+ ],
+ [
+ 457,
+ 126,
+ 499
+ ],
+ [
+ 457,
+ 125,
+ 533
+ ],
+ [
+ 457,
+ 124,
+ 644
+ ],
+ [
+ 459,
+ 124,
+ 749
+ ],
+ [
+ 466,
+ 124,
+ 786
+ ],
+ [
+ 469,
+ 124,
+ 787
+ ],
+ [
+ 472,
+ 124,
+ 788
+ ],
+ [
+ 481,
+ 124,
+ 815
+ ],
+ [
+ 485,
+ 124,
+ 816
+ ],
+ [
+ 488,
+ 125,
+ 820
+ ],
+ [
+ 492,
+ 125,
+ 848
+ ],
+ [
+ 499,
+ 125,
+ 849
+ ],
+ [
+ 504,
+ 125,
+ 851
+ ],
+ [
+ 508,
+ 125,
+ 881
+ ],
+ [
+ 518,
+ 125,
+ 882
+ ],
+ [
+ 523,
+ 125,
+ 883
+ ],
+ [
+ 525,
+ 125,
+ 915
+ ],
+ [
+ 532,
+ 125,
+ 916
+ ],
+ [
+ 535,
+ 125,
+ 916
+ ],
+ [
+ 540,
+ 125,
+ 948
+ ],
+ [
+ 544,
+ 125,
+ 948
+ ],
+ [
+ 547,
+ 125,
+ 997
+ ],
+ [
+ 548,
+ 125,
+ 998
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 95,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 95
+ },
+ "0x0438": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 751,
+ 123,
+ 0
+ ],
+ [
+ 751,
+ 124,
+ 48
+ ],
+ [
+ 751,
+ 126,
+ 65
+ ],
+ [
+ 751,
+ 127,
+ 68
+ ],
+ [
+ 751,
+ 128,
+ 98
+ ],
+ [
+ 751,
+ 131,
+ 99
+ ],
+ [
+ 751,
+ 133,
+ 100
+ ],
+ [
+ 751,
+ 136,
+ 131
+ ],
+ [
+ 751,
+ 140,
+ 132
+ ],
+ [
+ 751,
+ 146,
+ 133
+ ],
+ [
+ 751,
+ 152,
+ 164
+ ],
+ [
+ 753,
+ 158,
+ 165
+ ],
+ [
+ 756,
+ 165,
+ 197
+ ],
+ [
+ 759,
+ 169,
+ 198
+ ],
+ [
+ 759,
+ 171,
+ 232
+ ],
+ [
+ 761,
+ 172,
+ 232
+ ],
+ [
+ 761,
+ 173,
+ 236
+ ],
+ [
+ 763,
+ 174,
+ 264
+ ],
+ [
+ 764,
+ 176,
+ 265
+ ],
+ [
+ 764,
+ 177,
+ 268
+ ],
+ [
+ 767,
+ 178,
+ 298
+ ],
+ [
+ 768,
+ 178,
+ 331
+ ],
+ [
+ 772,
+ 178,
+ 332
+ ],
+ [
+ 773,
+ 178,
+ 332
+ ],
+ [
+ 776,
+ 178,
+ 364
+ ],
+ [
+ 779,
+ 178,
+ 366
+ ],
+ [
+ 781,
+ 176,
+ 397
+ ],
+ [
+ 785,
+ 172,
+ 398
+ ],
+ [
+ 788,
+ 166,
+ 430
+ ],
+ [
+ 790,
+ 162,
+ 431
+ ],
+ [
+ 792,
+ 159,
+ 437
+ ],
+ [
+ 794,
+ 154,
+ 464
+ ],
+ [
+ 797,
+ 148,
+ 465
+ ],
+ [
+ 799,
+ 146,
+ 468
+ ],
+ [
+ 801,
+ 144,
+ 501
+ ],
+ [
+ 802,
+ 138,
+ 503
+ ],
+ [
+ 802,
+ 134,
+ 530
+ ],
+ [
+ 802,
+ 132,
+ 531
+ ],
+ [
+ 802,
+ 129,
+ 532
+ ],
+ [
+ 804,
+ 128,
+ 564
+ ],
+ [
+ 807,
+ 123,
+ 564
+ ],
+ [
+ 807,
+ 120,
+ 597
+ ],
+ [
+ 807,
+ 118,
+ 598
+ ],
+ [
+ 807,
+ 117,
+ 630
+ ],
+ [
+ 807,
+ 116,
+ 663
+ ],
+ [
+ 807,
+ 117,
+ 741
+ ],
+ [
+ 808,
+ 120,
+ 783
+ ],
+ [
+ 808,
+ 123,
+ 783
+ ],
+ [
+ 810,
+ 129,
+ 813
+ ],
+ [
+ 810,
+ 131,
+ 814
+ ],
+ [
+ 810,
+ 136,
+ 847
+ ],
+ [
+ 810,
+ 139,
+ 847
+ ],
+ [
+ 810,
+ 141,
+ 852
+ ],
+ [
+ 810,
+ 144,
+ 879
+ ],
+ [
+ 810,
+ 149,
+ 880
+ ],
+ [
+ 810,
+ 153,
+ 884
+ ],
+ [
+ 810,
+ 155,
+ 912
+ ],
+ [
+ 810,
+ 162,
+ 914
+ ],
+ [
+ 810,
+ 164,
+ 916
+ ],
+ [
+ 810,
+ 167,
+ 946
+ ],
+ [
+ 811,
+ 171,
+ 947
+ ],
+ [
+ 811,
+ 173,
+ 948
+ ],
+ [
+ 811,
+ 174,
+ 979
+ ],
+ [
+ 813,
+ 179,
+ 980
+ ],
+ [
+ 814,
+ 181,
+ 1012
+ ],
+ [
+ 814,
+ 183,
+ 1013
+ ],
+ [
+ 814,
+ 184,
+ 1046
+ ],
+ [
+ 814,
+ 186,
+ 1047
+ ],
+ [
+ 815,
+ 187,
+ 1079
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 95,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 95
+ },
+ "0x043a": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 649,
+ 124,
+ 0
+ ],
+ [
+ 649,
+ 125,
+ 189
+ ],
+ [
+ 649,
+ 126,
+ 214
+ ],
+ [
+ 649,
+ 127,
+ 255
+ ],
+ [
+ 649,
+ 128,
+ 256
+ ],
+ [
+ 649,
+ 130,
+ 256
+ ],
+ [
+ 649,
+ 131,
+ 260
+ ],
+ [
+ 649,
+ 133,
+ 289
+ ],
+ [
+ 649,
+ 136,
+ 293
+ ],
+ [
+ 649,
+ 138,
+ 322
+ ],
+ [
+ 649,
+ 142,
+ 323
+ ],
+ [
+ 649,
+ 143,
+ 324
+ ],
+ [
+ 649,
+ 145,
+ 355
+ ],
+ [
+ 649,
+ 149,
+ 356
+ ],
+ [
+ 649,
+ 151,
+ 356
+ ],
+ [
+ 649,
+ 156,
+ 388
+ ],
+ [
+ 649,
+ 162,
+ 389
+ ],
+ [
+ 650,
+ 164,
+ 421
+ ],
+ [
+ 651,
+ 167,
+ 423
+ ],
+ [
+ 651,
+ 170,
+ 454
+ ],
+ [
+ 651,
+ 172,
+ 455
+ ],
+ [
+ 651,
+ 174,
+ 461
+ ],
+ [
+ 651,
+ 175,
+ 488
+ ],
+ [
+ 651,
+ 177,
+ 489
+ ],
+ [
+ 651,
+ 179,
+ 492
+ ],
+ [
+ 651,
+ 180,
+ 521
+ ],
+ [
+ 651,
+ 182,
+ 522
+ ],
+ [
+ 651,
+ 183,
+ 554
+ ],
+ [
+ 651,
+ 184,
+ 588
+ ],
+ [
+ 651,
+ 183,
+ 853
+ ],
+ [
+ 651,
+ 182,
+ 887
+ ]
+ ],
+ [
+ [
+ 690,
+ 123,
+ 1328
+ ],
+ [
+ 689,
+ 123,
+ 1369
+ ],
+ [
+ 689,
+ 124,
+ 1373
+ ],
+ [
+ 687,
+ 126,
+ 1402
+ ],
+ [
+ 686,
+ 126,
+ 1435
+ ],
+ [
+ 682,
+ 129,
+ 1436
+ ],
+ [
+ 681,
+ 132,
+ 1469
+ ],
+ [
+ 678,
+ 132,
+ 1470
+ ],
+ [
+ 673,
+ 136,
+ 1518
+ ],
+ [
+ 669,
+ 140,
+ 1519
+ ],
+ [
+ 667,
+ 140,
+ 1524
+ ],
+ [
+ 666,
+ 141,
+ 1552
+ ],
+ [
+ 664,
+ 142,
+ 1553
+ ],
+ [
+ 663,
+ 143,
+ 1556
+ ],
+ [
+ 661,
+ 143,
+ 1585
+ ],
+ [
+ 659,
+ 145,
+ 1586
+ ],
+ [
+ 657,
+ 147,
+ 1589
+ ],
+ [
+ 655,
+ 147,
+ 1618
+ ],
+ [
+ 654,
+ 148,
+ 1651
+ ],
+ [
+ 653,
+ 149,
+ 1685
+ ],
+ [
+ 653,
+ 150,
+ 1718
+ ],
+ [
+ 652,
+ 150,
+ 1724
+ ]
+ ],
+ [
+ [
+ 653,
+ 151,
+ 2376
+ ],
+ [
+ 654,
+ 151,
+ 2419
+ ],
+ [
+ 655,
+ 151,
+ 2419
+ ],
+ [
+ 656,
+ 151,
+ 2450
+ ],
+ [
+ 657,
+ 151,
+ 2452
+ ],
+ [
+ 658,
+ 151,
+ 2483
+ ],
+ [
+ 660,
+ 151,
+ 2516
+ ],
+ [
+ 663,
+ 151,
+ 2517
+ ],
+ [
+ 664,
+ 152,
+ 2549
+ ],
+ [
+ 666,
+ 153,
+ 2550
+ ],
+ [
+ 669,
+ 153,
+ 2583
+ ],
+ [
+ 671,
+ 155,
+ 2584
+ ],
+ [
+ 673,
+ 156,
+ 2588
+ ],
+ [
+ 674,
+ 156,
+ 2616
+ ],
+ [
+ 677,
+ 157,
+ 2617
+ ],
+ [
+ 678,
+ 158,
+ 2650
+ ],
+ [
+ 680,
+ 159,
+ 2650
+ ],
+ [
+ 680,
+ 161,
+ 2653
+ ],
+ [
+ 681,
+ 161,
+ 2683
+ ],
+ [
+ 683,
+ 163,
+ 2683
+ ],
+ [
+ 684,
+ 164,
+ 2684
+ ],
+ [
+ 685,
+ 165,
+ 2716
+ ],
+ [
+ 687,
+ 167,
+ 2717
+ ],
+ [
+ 688,
+ 167,
+ 2749
+ ],
+ [
+ 689,
+ 168,
+ 2783
+ ],
+ [
+ 689,
+ 169,
+ 2784
+ ],
+ [
+ 691,
+ 170,
+ 2788
+ ],
+ [
+ 692,
+ 171,
+ 2815
+ ],
+ [
+ 692,
+ 172,
+ 2820
+ ],
+ [
+ 692,
+ 173,
+ 2849
+ ],
+ [
+ 692,
+ 174,
+ 2882
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 95,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 95
+ },
+ "0x043b": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 313,
+ 163,
+ 0
+ ],
+ [
+ 313,
+ 164,
+ 52
+ ],
+ [
+ 313,
+ 165,
+ 68
+ ],
+ [
+ 313,
+ 168,
+ 102
+ ],
+ [
+ 314,
+ 172,
+ 103
+ ],
+ [
+ 315,
+ 174,
+ 134
+ ],
+ [
+ 316,
+ 175,
+ 135
+ ],
+ [
+ 320,
+ 177,
+ 168
+ ],
+ [
+ 323,
+ 178,
+ 169
+ ],
+ [
+ 324,
+ 178,
+ 173
+ ],
+ [
+ 327,
+ 178,
+ 201
+ ],
+ [
+ 332,
+ 178,
+ 202
+ ],
+ [
+ 335,
+ 178,
+ 205
+ ],
+ [
+ 340,
+ 178,
+ 243
+ ],
+ [
+ 344,
+ 178,
+ 244
+ ],
+ [
+ 346,
+ 176,
+ 245
+ ],
+ [
+ 349,
+ 174,
+ 284
+ ],
+ [
+ 352,
+ 169,
+ 285
+ ],
+ [
+ 354,
+ 166,
+ 318
+ ],
+ [
+ 357,
+ 163,
+ 318
+ ],
+ [
+ 360,
+ 158,
+ 350
+ ],
+ [
+ 362,
+ 154,
+ 351
+ ],
+ [
+ 364,
+ 151,
+ 357
+ ],
+ [
+ 365,
+ 150,
+ 384
+ ],
+ [
+ 369,
+ 144,
+ 385
+ ],
+ [
+ 371,
+ 140,
+ 388
+ ],
+ [
+ 372,
+ 139,
+ 417
+ ],
+ [
+ 375,
+ 133,
+ 417
+ ],
+ [
+ 376,
+ 132,
+ 421
+ ],
+ [
+ 380,
+ 131,
+ 451
+ ],
+ [
+ 381,
+ 130,
+ 452
+ ],
+ [
+ 382,
+ 129,
+ 484
+ ],
+ [
+ 385,
+ 129,
+ 484
+ ],
+ [
+ 387,
+ 129,
+ 517
+ ],
+ [
+ 389,
+ 129,
+ 518
+ ],
+ [
+ 391,
+ 129,
+ 550
+ ],
+ [
+ 394,
+ 129,
+ 552
+ ],
+ [
+ 395,
+ 129,
+ 557
+ ],
+ [
+ 398,
+ 131,
+ 584
+ ],
+ [
+ 400,
+ 131,
+ 588
+ ],
+ [
+ 402,
+ 132,
+ 617
+ ],
+ [
+ 403,
+ 133,
+ 618
+ ],
+ [
+ 404,
+ 134,
+ 620
+ ],
+ [
+ 405,
+ 134,
+ 650
+ ],
+ [
+ 407,
+ 135,
+ 651
+ ],
+ [
+ 408,
+ 135,
+ 652
+ ],
+ [
+ 410,
+ 137,
+ 683
+ ],
+ [
+ 410,
+ 138,
+ 684
+ ],
+ [
+ 410,
+ 139,
+ 684
+ ],
+ [
+ 412,
+ 141,
+ 717
+ ],
+ [
+ 413,
+ 143,
+ 717
+ ],
+ [
+ 414,
+ 145,
+ 751
+ ],
+ [
+ 415,
+ 147,
+ 751
+ ],
+ [
+ 415,
+ 148,
+ 784
+ ],
+ [
+ 416,
+ 149,
+ 816
+ ],
+ [
+ 416,
+ 150,
+ 820
+ ],
+ [
+ 416,
+ 151,
+ 849
+ ],
+ [
+ 416,
+ 152,
+ 852
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 95,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 95
+ },
+ "0x0440": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 639,
+ 127,
+ 0
+ ],
+ [
+ 639,
+ 128,
+ 48
+ ],
+ [
+ 640,
+ 130,
+ 65
+ ],
+ [
+ 640,
+ 132,
+ 68
+ ],
+ [
+ 640,
+ 133,
+ 98
+ ],
+ [
+ 640,
+ 138,
+ 99
+ ],
+ [
+ 640,
+ 140,
+ 101
+ ],
+ [
+ 640,
+ 150,
+ 148
+ ],
+ [
+ 641,
+ 159,
+ 149
+ ],
+ [
+ 644,
+ 167,
+ 181
+ ],
+ [
+ 646,
+ 176,
+ 182
+ ],
+ [
+ 646,
+ 185,
+ 215
+ ],
+ [
+ 646,
+ 193,
+ 216
+ ],
+ [
+ 646,
+ 200,
+ 247
+ ],
+ [
+ 646,
+ 209,
+ 248
+ ],
+ [
+ 646,
+ 211,
+ 253
+ ],
+ [
+ 647,
+ 215,
+ 281
+ ],
+ [
+ 647,
+ 218,
+ 282
+ ],
+ [
+ 647,
+ 220,
+ 285
+ ],
+ [
+ 647,
+ 221,
+ 314
+ ],
+ [
+ 648,
+ 225,
+ 315
+ ],
+ [
+ 648,
+ 227,
+ 317
+ ],
+ [
+ 648,
+ 228,
+ 349
+ ],
+ [
+ 648,
+ 233,
+ 350
+ ],
+ [
+ 648,
+ 237,
+ 399
+ ],
+ [
+ 648,
+ 240,
+ 400
+ ],
+ [
+ 648,
+ 241,
+ 430
+ ],
+ [
+ 648,
+ 243,
+ 431
+ ],
+ [
+ 648,
+ 245,
+ 464
+ ],
+ [
+ 648,
+ 246,
+ 497
+ ],
+ [
+ 648,
+ 247,
+ 498
+ ],
+ [
+ 648,
+ 246,
+ 605
+ ]
+ ],
+ [
+ [
+ 644,
+ 143,
+ 1072
+ ],
+ [
+ 644,
+ 142,
+ 1105
+ ],
+ [
+ 644,
+ 138,
+ 1126
+ ],
+ [
+ 644,
+ 135,
+ 1127
+ ],
+ [
+ 644,
+ 129,
+ 1168
+ ],
+ [
+ 644,
+ 126,
+ 1169
+ ],
+ [
+ 644,
+ 123,
+ 1173
+ ],
+ [
+ 645,
+ 122,
+ 1196
+ ],
+ [
+ 646,
+ 122,
+ 1196
+ ],
+ [
+ 648,
+ 120,
+ 1197
+ ],
+ [
+ 649,
+ 119,
+ 1229
+ ],
+ [
+ 654,
+ 117,
+ 1229
+ ],
+ [
+ 657,
+ 114,
+ 1262
+ ],
+ [
+ 660,
+ 113,
+ 1263
+ ],
+ [
+ 664,
+ 113,
+ 1295
+ ],
+ [
+ 668,
+ 113,
+ 1295
+ ],
+ [
+ 674,
+ 113,
+ 1328
+ ],
+ [
+ 677,
+ 113,
+ 1329
+ ],
+ [
+ 679,
+ 114,
+ 1333
+ ],
+ [
+ 680,
+ 114,
+ 1361
+ ],
+ [
+ 683,
+ 116,
+ 1362
+ ],
+ [
+ 685,
+ 117,
+ 1365
+ ],
+ [
+ 687,
+ 118,
+ 1395
+ ],
+ [
+ 689,
+ 122,
+ 1395
+ ],
+ [
+ 690,
+ 124,
+ 1396
+ ],
+ [
+ 690,
+ 126,
+ 1428
+ ],
+ [
+ 691,
+ 131,
+ 1429
+ ],
+ [
+ 691,
+ 136,
+ 1465
+ ],
+ [
+ 691,
+ 143,
+ 1467
+ ],
+ [
+ 690,
+ 145,
+ 1469
+ ],
+ [
+ 688,
+ 151,
+ 1511
+ ],
+ [
+ 687,
+ 158,
+ 1512
+ ],
+ [
+ 685,
+ 159,
+ 1516
+ ],
+ [
+ 684,
+ 160,
+ 1544
+ ],
+ [
+ 681,
+ 163,
+ 1545
+ ],
+ [
+ 680,
+ 164,
+ 1549
+ ],
+ [
+ 678,
+ 164,
+ 1577
+ ],
+ [
+ 674,
+ 166,
+ 1578
+ ],
+ [
+ 673,
+ 166,
+ 1581
+ ],
+ [
+ 671,
+ 166,
+ 1611
+ ],
+ [
+ 667,
+ 167,
+ 1612
+ ],
+ [
+ 666,
+ 167,
+ 1612
+ ],
+ [
+ 664,
+ 167,
+ 1644
+ ],
+ [
+ 663,
+ 168,
+ 1645
+ ],
+ [
+ 661,
+ 168,
+ 1645
+ ],
+ [
+ 658,
+ 168,
+ 1677
+ ],
+ [
+ 656,
+ 168,
+ 1678
+ ],
+ [
+ 654,
+ 168,
+ 1711
+ ],
+ [
+ 653,
+ 168,
+ 1712
+ ],
+ [
+ 651,
+ 168,
+ 1745
+ ],
+ [
+ 650,
+ 168,
+ 1745
+ ],
+ [
+ 650,
+ 167,
+ 1778
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 95,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 95
+ },
+ "0x0441": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 633,
+ 126,
+ 0
+ ],
+ [
+ 631,
+ 126,
+ 39
+ ],
+ [
+ 629,
+ 126,
+ 40
+ ],
+ [
+ 627,
+ 125,
+ 43
+ ],
+ [
+ 625,
+ 125,
+ 70
+ ],
+ [
+ 620,
+ 125,
+ 70
+ ],
+ [
+ 617,
+ 125,
+ 75
+ ],
+ [
+ 616,
+ 125,
+ 103
+ ],
+ [
+ 611,
+ 125,
+ 104
+ ],
+ [
+ 607,
+ 125,
+ 108
+ ],
+ [
+ 603,
+ 125,
+ 136
+ ],
+ [
+ 597,
+ 126,
+ 139
+ ],
+ [
+ 593,
+ 128,
+ 143
+ ],
+ [
+ 585,
+ 133,
+ 172
+ ],
+ [
+ 578,
+ 139,
+ 173
+ ],
+ [
+ 574,
+ 144,
+ 203
+ ],
+ [
+ 572,
+ 152,
+ 205
+ ],
+ [
+ 572,
+ 157,
+ 236
+ ],
+ [
+ 572,
+ 164,
+ 238
+ ],
+ [
+ 573,
+ 171,
+ 269
+ ],
+ [
+ 576,
+ 176,
+ 270
+ ],
+ [
+ 583,
+ 182,
+ 304
+ ],
+ [
+ 587,
+ 184,
+ 306
+ ],
+ [
+ 591,
+ 184,
+ 309
+ ],
+ [
+ 606,
+ 185,
+ 353
+ ],
+ [
+ 617,
+ 184,
+ 353
+ ],
+ [
+ 623,
+ 182,
+ 355
+ ],
+ [
+ 627,
+ 180,
+ 386
+ ],
+ [
+ 634,
+ 178,
+ 387
+ ],
+ [
+ 635,
+ 177,
+ 387
+ ],
+ [
+ 635,
+ 176,
+ 419
+ ],
+ [
+ 635,
+ 174,
+ 420
+ ],
+ [
+ 633,
+ 173,
+ 453
+ ],
+ [
+ 632,
+ 173,
+ 453
+ ],
+ [
+ 632,
+ 172,
+ 488
+ ],
+ [
+ 631,
+ 172,
+ 492
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 95,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 95
+ },
+ "0x044a": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 259,
+ 124,
+ 0
+ ],
+ [
+ 260,
+ 124,
+ 69
+ ],
+ [
+ 262,
+ 124,
+ 90
+ ],
+ [
+ 264,
+ 124,
+ 93
+ ],
+ [
+ 266,
+ 124,
+ 114
+ ],
+ [
+ 267,
+ 124,
+ 117
+ ],
+ [
+ 269,
+ 124,
+ 145
+ ],
+ [
+ 271,
+ 124,
+ 146
+ ],
+ [
+ 272,
+ 124,
+ 149
+ ],
+ [
+ 273,
+ 125,
+ 178
+ ],
+ [
+ 274,
+ 125,
+ 179
+ ],
+ [
+ 275,
+ 125,
+ 180
+ ],
+ [
+ 277,
+ 125,
+ 211
+ ],
+ [
+ 278,
+ 127,
+ 212
+ ],
+ [
+ 278,
+ 129,
+ 245
+ ],
+ [
+ 279,
+ 132,
+ 246
+ ],
+ [
+ 279,
+ 134,
+ 278
+ ],
+ [
+ 279,
+ 136,
+ 279
+ ],
+ [
+ 279,
+ 139,
+ 312
+ ],
+ [
+ 279,
+ 142,
+ 313
+ ],
+ [
+ 279,
+ 145,
+ 317
+ ],
+ [
+ 279,
+ 146,
+ 345
+ ],
+ [
+ 279,
+ 151,
+ 345
+ ],
+ [
+ 279,
+ 154,
+ 348
+ ],
+ [
+ 279,
+ 156,
+ 378
+ ],
+ [
+ 279,
+ 162,
+ 379
+ ],
+ [
+ 279,
+ 164,
+ 381
+ ],
+ [
+ 279,
+ 166,
+ 412
+ ],
+ [
+ 279,
+ 171,
+ 412
+ ],
+ [
+ 279,
+ 172,
+ 413
+ ],
+ [
+ 279,
+ 175,
+ 444
+ ],
+ [
+ 279,
+ 178,
+ 445
+ ],
+ [
+ 279,
+ 179,
+ 478
+ ],
+ [
+ 279,
+ 180,
+ 480
+ ],
+ [
+ 279,
+ 181,
+ 484
+ ],
+ [
+ 279,
+ 182,
+ 511
+ ],
+ [
+ 279,
+ 181,
+ 1037
+ ],
+ [
+ 279,
+ 178,
+ 1085
+ ],
+ [
+ 279,
+ 176,
+ 1086
+ ],
+ [
+ 279,
+ 173,
+ 1109
+ ],
+ [
+ 279,
+ 172,
+ 1110
+ ],
+ [
+ 279,
+ 171,
+ 1143
+ ],
+ [
+ 279,
+ 169,
+ 1144
+ ],
+ [
+ 279,
+ 167,
+ 1177
+ ],
+ [
+ 279,
+ 165,
+ 1177
+ ],
+ [
+ 280,
+ 163,
+ 1180
+ ],
+ [
+ 281,
+ 162,
+ 1210
+ ],
+ [
+ 282,
+ 156,
+ 1210
+ ],
+ [
+ 282,
+ 155,
+ 1212
+ ],
+ [
+ 282,
+ 152,
+ 1244
+ ],
+ [
+ 283,
+ 150,
+ 1246
+ ],
+ [
+ 285,
+ 149,
+ 1293
+ ],
+ [
+ 290,
+ 149,
+ 1293
+ ],
+ [
+ 293,
+ 149,
+ 1327
+ ],
+ [
+ 295,
+ 149,
+ 1327
+ ],
+ [
+ 298,
+ 149,
+ 1359
+ ],
+ [
+ 300,
+ 149,
+ 1360
+ ],
+ [
+ 302,
+ 149,
+ 1392
+ ],
+ [
+ 303,
+ 150,
+ 1393
+ ],
+ [
+ 304,
+ 150,
+ 1426
+ ],
+ [
+ 305,
+ 152,
+ 1426
+ ],
+ [
+ 305,
+ 153,
+ 1429
+ ],
+ [
+ 306,
+ 155,
+ 1459
+ ],
+ [
+ 306,
+ 157,
+ 1460
+ ],
+ [
+ 307,
+ 159,
+ 1461
+ ],
+ [
+ 308,
+ 160,
+ 1492
+ ],
+ [
+ 308,
+ 166,
+ 1493
+ ],
+ [
+ 309,
+ 169,
+ 1526
+ ],
+ [
+ 309,
+ 171,
+ 1526
+ ],
+ [
+ 309,
+ 173,
+ 1558
+ ],
+ [
+ 309,
+ 175,
+ 1592
+ ],
+ [
+ 309,
+ 176,
+ 1593
+ ],
+ [
+ 309,
+ 177,
+ 1597
+ ],
+ [
+ 308,
+ 178,
+ 1625
+ ],
+ [
+ 308,
+ 180,
+ 1626
+ ],
+ [
+ 307,
+ 180,
+ 1629
+ ],
+ [
+ 307,
+ 181,
+ 1659
+ ],
+ [
+ 306,
+ 182,
+ 1659
+ ],
+ [
+ 305,
+ 182,
+ 1661
+ ],
+ [
+ 303,
+ 182,
+ 1691
+ ],
+ [
+ 302,
+ 182,
+ 1692
+ ],
+ [
+ 301,
+ 182,
+ 1725
+ ],
+ [
+ 300,
+ 182,
+ 1726
+ ],
+ [
+ 298,
+ 182,
+ 1759
+ ],
+ [
+ 296,
+ 182,
+ 1759
+ ],
+ [
+ 294,
+ 182,
+ 1792
+ ],
+ [
+ 293,
+ 182,
+ 1797
+ ],
+ [
+ 291,
+ 182,
+ 1825
+ ],
+ [
+ 291,
+ 181,
+ 1858
+ ],
+ [
+ 289,
+ 181,
+ 1858
+ ],
+ [
+ 289,
+ 180,
+ 1891
+ ],
+ [
+ 288,
+ 180,
+ 1925
+ ],
+ [
+ 287,
+ 180,
+ 1965
+ ],
+ [
+ 286,
+ 180,
+ 2061
+ ],
+ [
+ 285,
+ 179,
+ 2108
+ ],
+ [
+ 284,
+ 179,
+ 2108
+ ],
+ [
+ 283,
+ 179,
+ 2140
+ ],
+ [
+ 283,
+ 178,
+ 2141
+ ],
+ [
+ 281,
+ 178,
+ 2174
+ ],
+ [
+ 280,
+ 177,
+ 2174
+ ],
+ [
+ 279,
+ 177,
+ 2223
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 95,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 95
+ }
+}
diff --git a/tests/auto/inputpanel/data/inputpanel/unipen_data_greek.js b/tests/auto/inputpanel/data/inputpanel/unipen_data_greek.js
new file mode 100644
index 00000000..54db858b
--- /dev/null
+++ b/tests/auto/inputpanel/data/inputpanel/unipen_data_greek.js
@@ -0,0 +1,2139 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+var unipenData = {
+ "0x0395": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 199,
+ 59,
+ 0
+ ],
+ [
+ 199,
+ 60,
+ 52
+ ],
+ [
+ 199,
+ 62,
+ 68
+ ],
+ [
+ 199,
+ 68,
+ 105
+ ],
+ [
+ 199,
+ 77,
+ 108
+ ],
+ [
+ 199,
+ 80,
+ 113
+ ],
+ [
+ 199,
+ 103,
+ 153
+ ],
+ [
+ 199,
+ 108,
+ 159
+ ],
+ [
+ 200,
+ 115,
+ 165
+ ],
+ [
+ 200,
+ 120,
+ 183
+ ],
+ [
+ 201,
+ 129,
+ 205
+ ],
+ [
+ 202,
+ 138,
+ 223
+ ],
+ [
+ 202,
+ 145,
+ 244
+ ],
+ [
+ 202,
+ 151,
+ 257
+ ],
+ [
+ 202,
+ 154,
+ 271
+ ],
+ [
+ 202,
+ 158,
+ 287
+ ],
+ [
+ 202,
+ 161,
+ 304
+ ],
+ [
+ 203,
+ 162,
+ 320
+ ],
+ [
+ 203,
+ 164,
+ 337
+ ],
+ [
+ 203,
+ 165,
+ 353
+ ],
+ [
+ 204,
+ 167,
+ 370
+ ],
+ [
+ 205,
+ 169,
+ 387
+ ],
+ [
+ 206,
+ 173,
+ 404
+ ],
+ [
+ 208,
+ 175,
+ 420
+ ],
+ [
+ 208,
+ 176,
+ 437
+ ],
+ [
+ 209,
+ 177,
+ 453
+ ],
+ [
+ 210,
+ 178,
+ 470
+ ],
+ [
+ 210,
+ 179,
+ 486
+ ],
+ [
+ 211,
+ 180,
+ 520
+ ],
+ [
+ 214,
+ 180,
+ 520
+ ],
+ [
+ 217,
+ 180,
+ 523
+ ],
+ [
+ 218,
+ 180,
+ 553
+ ],
+ [
+ 226,
+ 180,
+ 555
+ ],
+ [
+ 231,
+ 180,
+ 557
+ ],
+ [
+ 245,
+ 180,
+ 603
+ ],
+ [
+ 261,
+ 180,
+ 604
+ ],
+ [
+ 274,
+ 180,
+ 636
+ ],
+ [
+ 285,
+ 180,
+ 637
+ ],
+ [
+ 294,
+ 180,
+ 669
+ ],
+ [
+ 301,
+ 180,
+ 670
+ ],
+ [
+ 306,
+ 180,
+ 702
+ ],
+ [
+ 310,
+ 180,
+ 703
+ ],
+ [
+ 311,
+ 180,
+ 707
+ ],
+ [
+ 312,
+ 180,
+ 736
+ ],
+ [
+ 311,
+ 179,
+ 836
+ ],
+ [
+ 309,
+ 177,
+ 869
+ ]
+ ],
+ [
+ [
+ 198,
+ 122,
+ 1336
+ ],
+ [
+ 200,
+ 122,
+ 1396
+ ],
+ [
+ 207,
+ 122,
+ 1414
+ ],
+ [
+ 210,
+ 122,
+ 1448
+ ],
+ [
+ 220,
+ 122,
+ 1469
+ ],
+ [
+ 231,
+ 122,
+ 1473
+ ],
+ [
+ 236,
+ 122,
+ 1501
+ ],
+ [
+ 240,
+ 122,
+ 1512
+ ],
+ [
+ 243,
+ 121,
+ 1514
+ ],
+ [
+ 245,
+ 121,
+ 1515
+ ],
+ [
+ 247,
+ 121,
+ 1551
+ ],
+ [
+ 249,
+ 121,
+ 1551
+ ],
+ [
+ 250,
+ 120,
+ 1556
+ ],
+ [
+ 251,
+ 119,
+ 1585
+ ]
+ ],
+ [
+ [
+ 199,
+ 48,
+ 2190
+ ],
+ [
+ 199,
+ 50,
+ 2235
+ ],
+ [
+ 200,
+ 50,
+ 2236
+ ],
+ [
+ 203,
+ 50,
+ 2266
+ ],
+ [
+ 206,
+ 50,
+ 2266
+ ],
+ [
+ 209,
+ 50,
+ 2268
+ ],
+ [
+ 212,
+ 50,
+ 2298
+ ],
+ [
+ 225,
+ 50,
+ 2301
+ ],
+ [
+ 235,
+ 50,
+ 2305
+ ],
+ [
+ 243,
+ 50,
+ 2321
+ ],
+ [
+ 252,
+ 50,
+ 2341
+ ],
+ [
+ 278,
+ 50,
+ 2342
+ ],
+ [
+ 291,
+ 50,
+ 2366
+ ],
+ [
+ 296,
+ 50,
+ 2367
+ ],
+ [
+ 298,
+ 50,
+ 2399
+ ],
+ [
+ 299,
+ 50,
+ 2435
+ ],
+ [
+ 302,
+ 50,
+ 2482
+ ],
+ [
+ 303,
+ 50,
+ 2483
+ ],
+ [
+ 304,
+ 50,
+ 2515
+ ],
+ [
+ 307,
+ 50,
+ 2515
+ ],
+ [
+ 310,
+ 50,
+ 2557
+ ],
+ [
+ 315,
+ 50,
+ 2559
+ ],
+ [
+ 317,
+ 50,
+ 2563
+ ],
+ [
+ 318,
+ 50,
+ 2587
+ ],
+ [
+ 319,
+ 50,
+ 2652
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 95,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 95
+ },
+ "0x03ac": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 546,
+ 127,
+ 0
+ ],
+ [
+ 545,
+ 127,
+ 66
+ ],
+ [
+ 544,
+ 126,
+ 91
+ ],
+ [
+ 543,
+ 126,
+ 127
+ ],
+ [
+ 540,
+ 125,
+ 137
+ ],
+ [
+ 538,
+ 125,
+ 159
+ ],
+ [
+ 531,
+ 125,
+ 180
+ ],
+ [
+ 524,
+ 127,
+ 198
+ ],
+ [
+ 518,
+ 130,
+ 220
+ ],
+ [
+ 513,
+ 135,
+ 236
+ ],
+ [
+ 508,
+ 143,
+ 253
+ ],
+ [
+ 507,
+ 148,
+ 270
+ ],
+ [
+ 506,
+ 154,
+ 286
+ ],
+ [
+ 506,
+ 161,
+ 303
+ ],
+ [
+ 506,
+ 170,
+ 319
+ ],
+ [
+ 506,
+ 177,
+ 336
+ ],
+ [
+ 506,
+ 184,
+ 353
+ ],
+ [
+ 507,
+ 190,
+ 369
+ ],
+ [
+ 510,
+ 193,
+ 386
+ ],
+ [
+ 515,
+ 196,
+ 403
+ ],
+ [
+ 518,
+ 196,
+ 419
+ ],
+ [
+ 520,
+ 196,
+ 436
+ ],
+ [
+ 522,
+ 196,
+ 452
+ ],
+ [
+ 524,
+ 194,
+ 469
+ ],
+ [
+ 527,
+ 190,
+ 486
+ ],
+ [
+ 531,
+ 186,
+ 503
+ ],
+ [
+ 535,
+ 181,
+ 518
+ ],
+ [
+ 542,
+ 177,
+ 535
+ ],
+ [
+ 548,
+ 173,
+ 552
+ ],
+ [
+ 552,
+ 167,
+ 569
+ ],
+ [
+ 554,
+ 164,
+ 586
+ ],
+ [
+ 555,
+ 159,
+ 602
+ ],
+ [
+ 556,
+ 152,
+ 619
+ ],
+ [
+ 556,
+ 146,
+ 635
+ ],
+ [
+ 556,
+ 142,
+ 652
+ ],
+ [
+ 557,
+ 138,
+ 668
+ ],
+ [
+ 557,
+ 135,
+ 685
+ ],
+ [
+ 557,
+ 133,
+ 702
+ ],
+ [
+ 556,
+ 132,
+ 718
+ ],
+ [
+ 556,
+ 130,
+ 735
+ ],
+ [
+ 555,
+ 130,
+ 752
+ ],
+ [
+ 556,
+ 135,
+ 965
+ ],
+ [
+ 557,
+ 137,
+ 971
+ ],
+ [
+ 559,
+ 144,
+ 1001
+ ],
+ [
+ 560,
+ 149,
+ 1002
+ ],
+ [
+ 560,
+ 152,
+ 1003
+ ],
+ [
+ 561,
+ 163,
+ 1034
+ ],
+ [
+ 562,
+ 170,
+ 1035
+ ],
+ [
+ 562,
+ 176,
+ 1067
+ ],
+ [
+ 563,
+ 182,
+ 1067
+ ],
+ [
+ 564,
+ 184,
+ 1100
+ ],
+ [
+ 564,
+ 187,
+ 1101
+ ],
+ [
+ 564,
+ 188,
+ 1134
+ ],
+ [
+ 563,
+ 188,
+ 1186
+ ],
+ [
+ 562,
+ 186,
+ 1233
+ ],
+ [
+ 561,
+ 185,
+ 1234
+ ]
+ ],
+ [
+ [
+ 534,
+ 87,
+ 1751
+ ],
+ [
+ 534,
+ 89,
+ 1798
+ ],
+ [
+ 534,
+ 92,
+ 1799
+ ],
+ [
+ 534,
+ 93,
+ 1803
+ ],
+ [
+ 534,
+ 94,
+ 1832
+ ],
+ [
+ 534,
+ 96,
+ 1833
+ ],
+ [
+ 534,
+ 97,
+ 1835
+ ],
+ [
+ 534,
+ 98,
+ 1865
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 95,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 95
+ },
+ "0x03b7": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 453,
+ 123,
+ 0
+ ],
+ [
+ 453,
+ 125,
+ 49
+ ],
+ [
+ 453,
+ 127,
+ 50
+ ],
+ [
+ 453,
+ 128,
+ 52
+ ],
+ [
+ 453,
+ 130,
+ 82
+ ],
+ [
+ 453,
+ 133,
+ 83
+ ],
+ [
+ 453,
+ 135,
+ 85
+ ],
+ [
+ 453,
+ 139,
+ 115
+ ],
+ [
+ 453,
+ 148,
+ 118
+ ],
+ [
+ 453,
+ 155,
+ 149
+ ],
+ [
+ 453,
+ 163,
+ 160
+ ],
+ [
+ 453,
+ 167,
+ 161
+ ],
+ [
+ 453,
+ 171,
+ 164
+ ],
+ [
+ 453,
+ 174,
+ 198
+ ],
+ [
+ 453,
+ 183,
+ 200
+ ],
+ [
+ 453,
+ 184,
+ 204
+ ],
+ [
+ 453,
+ 186,
+ 231
+ ],
+ [
+ 453,
+ 188,
+ 232
+ ],
+ [
+ 453,
+ 189,
+ 236
+ ],
+ [
+ 453,
+ 190,
+ 264
+ ],
+ [
+ 453,
+ 188,
+ 436
+ ],
+ [
+ 453,
+ 179,
+ 486
+ ],
+ [
+ 455,
+ 175,
+ 486
+ ],
+ [
+ 456,
+ 171,
+ 514
+ ],
+ [
+ 457,
+ 169,
+ 515
+ ],
+ [
+ 458,
+ 166,
+ 516
+ ],
+ [
+ 458,
+ 161,
+ 547
+ ],
+ [
+ 461,
+ 155,
+ 547
+ ],
+ [
+ 466,
+ 148,
+ 580
+ ],
+ [
+ 471,
+ 141,
+ 581
+ ],
+ [
+ 475,
+ 137,
+ 614
+ ],
+ [
+ 477,
+ 135,
+ 614
+ ],
+ [
+ 481,
+ 132,
+ 647
+ ],
+ [
+ 483,
+ 130,
+ 648
+ ],
+ [
+ 484,
+ 130,
+ 652
+ ],
+ [
+ 485,
+ 129,
+ 680
+ ],
+ [
+ 486,
+ 129,
+ 681
+ ],
+ [
+ 487,
+ 129,
+ 714
+ ],
+ [
+ 489,
+ 129,
+ 715
+ ],
+ [
+ 490,
+ 129,
+ 747
+ ],
+ [
+ 491,
+ 130,
+ 748
+ ],
+ [
+ 493,
+ 132,
+ 780
+ ],
+ [
+ 500,
+ 137,
+ 780
+ ],
+ [
+ 504,
+ 142,
+ 813
+ ],
+ [
+ 508,
+ 150,
+ 813
+ ],
+ [
+ 512,
+ 157,
+ 846
+ ],
+ [
+ 514,
+ 164,
+ 847
+ ],
+ [
+ 515,
+ 169,
+ 852
+ ],
+ [
+ 515,
+ 173,
+ 880
+ ],
+ [
+ 516,
+ 183,
+ 880
+ ],
+ [
+ 516,
+ 186,
+ 883
+ ],
+ [
+ 516,
+ 191,
+ 913
+ ],
+ [
+ 516,
+ 200,
+ 913
+ ],
+ [
+ 516,
+ 203,
+ 917
+ ],
+ [
+ 516,
+ 208,
+ 946
+ ],
+ [
+ 516,
+ 215,
+ 947
+ ],
+ [
+ 516,
+ 220,
+ 948
+ ],
+ [
+ 515,
+ 226,
+ 980
+ ],
+ [
+ 514,
+ 233,
+ 980
+ ],
+ [
+ 514,
+ 238,
+ 1013
+ ],
+ [
+ 513,
+ 242,
+ 1014
+ ],
+ [
+ 513,
+ 245,
+ 1046
+ ],
+ [
+ 513,
+ 247,
+ 1047
+ ],
+ [
+ 513,
+ 248,
+ 1052
+ ],
+ [
+ 513,
+ 249,
+ 1096
+ ],
+ [
+ 513,
+ 250,
+ 1129
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 95,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 95
+ },
+ "0x03b9": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 322,
+ 123,
+ 0
+ ],
+ [
+ 322,
+ 124,
+ 48
+ ],
+ [
+ 322,
+ 125,
+ 61
+ ],
+ [
+ 322,
+ 127,
+ 65
+ ],
+ [
+ 322,
+ 129,
+ 85
+ ],
+ [
+ 322,
+ 131,
+ 85
+ ],
+ [
+ 322,
+ 133,
+ 89
+ ],
+ [
+ 322,
+ 136,
+ 119
+ ],
+ [
+ 322,
+ 140,
+ 120
+ ],
+ [
+ 322,
+ 143,
+ 123
+ ],
+ [
+ 322,
+ 147,
+ 160
+ ],
+ [
+ 322,
+ 155,
+ 161
+ ],
+ [
+ 322,
+ 162,
+ 185
+ ],
+ [
+ 322,
+ 164,
+ 186
+ ],
+ [
+ 322,
+ 168,
+ 218
+ ],
+ [
+ 322,
+ 171,
+ 218
+ ],
+ [
+ 322,
+ 174,
+ 250
+ ],
+ [
+ 322,
+ 177,
+ 251
+ ],
+ [
+ 321,
+ 178,
+ 284
+ ],
+ [
+ 321,
+ 179,
+ 289
+ ],
+ [
+ 321,
+ 180,
+ 318
+ ],
+ [
+ 321,
+ 181,
+ 318
+ ],
+ [
+ 321,
+ 182,
+ 351
+ ],
+ [
+ 321,
+ 183,
+ 351
+ ],
+ [
+ 321,
+ 184,
+ 353
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 95,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 95
+ },
+ "0x03ba": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 424,
+ 122,
+ 0
+ ],
+ [
+ 424,
+ 123,
+ 43
+ ],
+ [
+ 424,
+ 124,
+ 59
+ ],
+ [
+ 424,
+ 127,
+ 89
+ ],
+ [
+ 424,
+ 130,
+ 90
+ ],
+ [
+ 424,
+ 133,
+ 91
+ ],
+ [
+ 424,
+ 136,
+ 124
+ ],
+ [
+ 424,
+ 149,
+ 128
+ ],
+ [
+ 424,
+ 153,
+ 144
+ ],
+ [
+ 424,
+ 157,
+ 164
+ ],
+ [
+ 424,
+ 170,
+ 165
+ ],
+ [
+ 424,
+ 176,
+ 190
+ ],
+ [
+ 423,
+ 178,
+ 190
+ ],
+ [
+ 423,
+ 180,
+ 195
+ ],
+ [
+ 423,
+ 182,
+ 222
+ ],
+ [
+ 423,
+ 187,
+ 223
+ ],
+ [
+ 423,
+ 188,
+ 256
+ ],
+ [
+ 423,
+ 189,
+ 257
+ ],
+ [
+ 423,
+ 190,
+ 289
+ ],
+ [
+ 423,
+ 189,
+ 420
+ ],
+ [
+ 423,
+ 188,
+ 427
+ ],
+ [
+ 423,
+ 186,
+ 472
+ ]
+ ],
+ [
+ [
+ 476,
+ 122,
+ 919
+ ],
+ [
+ 476,
+ 124,
+ 971
+ ],
+ [
+ 473,
+ 126,
+ 996
+ ],
+ [
+ 473,
+ 127,
+ 996
+ ],
+ [
+ 468,
+ 130,
+ 1021
+ ],
+ [
+ 467,
+ 132,
+ 1024
+ ],
+ [
+ 465,
+ 132,
+ 1028
+ ],
+ [
+ 461,
+ 134,
+ 1053
+ ],
+ [
+ 454,
+ 139,
+ 1065
+ ],
+ [
+ 449,
+ 141,
+ 1067
+ ],
+ [
+ 445,
+ 143,
+ 1068
+ ],
+ [
+ 437,
+ 147,
+ 1104
+ ],
+ [
+ 430,
+ 151,
+ 1105
+ ],
+ [
+ 428,
+ 152,
+ 1107
+ ],
+ [
+ 426,
+ 153,
+ 1137
+ ],
+ [
+ 420,
+ 155,
+ 1137
+ ],
+ [
+ 418,
+ 155,
+ 1138
+ ],
+ [
+ 418,
+ 156,
+ 1170
+ ],
+ [
+ 417,
+ 156,
+ 1171
+ ],
+ [
+ 419,
+ 156,
+ 1300
+ ],
+ [
+ 424,
+ 157,
+ 1352
+ ],
+ [
+ 426,
+ 157,
+ 1353
+ ],
+ [
+ 428,
+ 157,
+ 1354
+ ],
+ [
+ 434,
+ 157,
+ 1386
+ ],
+ [
+ 438,
+ 158,
+ 1387
+ ],
+ [
+ 443,
+ 159,
+ 1419
+ ],
+ [
+ 447,
+ 163,
+ 1420
+ ],
+ [
+ 451,
+ 165,
+ 1453
+ ],
+ [
+ 453,
+ 168,
+ 1453
+ ],
+ [
+ 455,
+ 171,
+ 1486
+ ],
+ [
+ 455,
+ 173,
+ 1487
+ ],
+ [
+ 455,
+ 174,
+ 1491
+ ],
+ [
+ 456,
+ 176,
+ 1519
+ ],
+ [
+ 457,
+ 177,
+ 1523
+ ],
+ [
+ 457,
+ 178,
+ 1552
+ ],
+ [
+ 458,
+ 180,
+ 1553
+ ],
+ [
+ 459,
+ 180,
+ 1586
+ ],
+ [
+ 459,
+ 181,
+ 1586
+ ],
+ [
+ 460,
+ 181,
+ 1635
+ ],
+ [
+ 460,
+ 182,
+ 1670
+ ],
+ [
+ 460,
+ 183,
+ 1702
+ ],
+ [
+ 461,
+ 183,
+ 1754
+ ],
+ [
+ 461,
+ 184,
+ 1799
+ ],
+ [
+ 462,
+ 185,
+ 1801
+ ],
+ [
+ 461,
+ 185,
+ 1971
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 95,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 95
+ },
+ "0x03bb": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 308,
+ 61,
+ 0
+ ],
+ [
+ 309,
+ 61,
+ 67
+ ],
+ [
+ 309,
+ 62,
+ 83
+ ],
+ [
+ 310,
+ 66,
+ 109
+ ],
+ [
+ 311,
+ 68,
+ 112
+ ],
+ [
+ 312,
+ 70,
+ 127
+ ],
+ [
+ 313,
+ 74,
+ 147
+ ],
+ [
+ 319,
+ 84,
+ 148
+ ],
+ [
+ 329,
+ 96,
+ 172
+ ],
+ [
+ 330,
+ 101,
+ 173
+ ],
+ [
+ 338,
+ 114,
+ 204
+ ],
+ [
+ 346,
+ 124,
+ 205
+ ],
+ [
+ 352,
+ 134,
+ 237
+ ],
+ [
+ 358,
+ 145,
+ 238
+ ],
+ [
+ 361,
+ 149,
+ 254
+ ],
+ [
+ 363,
+ 153,
+ 270
+ ],
+ [
+ 365,
+ 160,
+ 271
+ ],
+ [
+ 368,
+ 165,
+ 303
+ ],
+ [
+ 370,
+ 170,
+ 304
+ ],
+ [
+ 371,
+ 173,
+ 307
+ ],
+ [
+ 374,
+ 177,
+ 337
+ ],
+ [
+ 374,
+ 178,
+ 338
+ ],
+ [
+ 375,
+ 179,
+ 370
+ ],
+ [
+ 375,
+ 180,
+ 371
+ ],
+ [
+ 375,
+ 181,
+ 402
+ ],
+ [
+ 375,
+ 182,
+ 403
+ ],
+ [
+ 375,
+ 183,
+ 437
+ ],
+ [
+ 375,
+ 182,
+ 540
+ ]
+ ],
+ [
+ [
+ 333,
+ 119,
+ 943
+ ],
+ [
+ 332,
+ 119,
+ 987
+ ],
+ [
+ 330,
+ 121,
+ 1003
+ ],
+ [
+ 326,
+ 124,
+ 1034
+ ],
+ [
+ 321,
+ 131,
+ 1035
+ ],
+ [
+ 315,
+ 137,
+ 1070
+ ],
+ [
+ 308,
+ 145,
+ 1074
+ ],
+ [
+ 305,
+ 149,
+ 1089
+ ],
+ [
+ 302,
+ 152,
+ 1110
+ ],
+ [
+ 290,
+ 159,
+ 1111
+ ],
+ [
+ 285,
+ 163,
+ 1136
+ ],
+ [
+ 284,
+ 165,
+ 1137
+ ],
+ [
+ 282,
+ 167,
+ 1139
+ ],
+ [
+ 281,
+ 168,
+ 1168
+ ],
+ [
+ 279,
+ 174,
+ 1169
+ ],
+ [
+ 277,
+ 175,
+ 1171
+ ],
+ [
+ 276,
+ 177,
+ 1202
+ ],
+ [
+ 274,
+ 179,
+ 1202
+ ],
+ [
+ 273,
+ 180,
+ 1235
+ ],
+ [
+ 271,
+ 180,
+ 1235
+ ],
+ [
+ 271,
+ 181,
+ 1268
+ ],
+ [
+ 269,
+ 181,
+ 1397
+ ],
+ [
+ 269,
+ 179,
+ 1440
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 95,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 95
+ },
+ "0x03bd": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 216,
+ 122,
+ 0
+ ],
+ [
+ 216,
+ 123,
+ 68
+ ],
+ [
+ 216,
+ 124,
+ 81
+ ],
+ [
+ 217,
+ 126,
+ 85
+ ],
+ [
+ 219,
+ 135,
+ 124
+ ],
+ [
+ 219,
+ 142,
+ 128
+ ],
+ [
+ 219,
+ 147,
+ 143
+ ],
+ [
+ 219,
+ 150,
+ 163
+ ],
+ [
+ 220,
+ 159,
+ 164
+ ],
+ [
+ 220,
+ 165,
+ 189
+ ],
+ [
+ 220,
+ 167,
+ 190
+ ],
+ [
+ 221,
+ 171,
+ 196
+ ],
+ [
+ 221,
+ 172,
+ 222
+ ],
+ [
+ 223,
+ 176,
+ 223
+ ],
+ [
+ 224,
+ 179,
+ 261
+ ],
+ [
+ 224,
+ 180,
+ 262
+ ],
+ [
+ 224,
+ 181,
+ 373
+ ],
+ [
+ 224,
+ 182,
+ 557
+ ],
+ [
+ 226,
+ 177,
+ 605
+ ],
+ [
+ 227,
+ 173,
+ 638
+ ],
+ [
+ 229,
+ 170,
+ 639
+ ],
+ [
+ 229,
+ 167,
+ 644
+ ],
+ [
+ 231,
+ 163,
+ 671
+ ],
+ [
+ 235,
+ 155,
+ 671
+ ],
+ [
+ 237,
+ 151,
+ 676
+ ],
+ [
+ 241,
+ 146,
+ 704
+ ],
+ [
+ 245,
+ 140,
+ 705
+ ],
+ [
+ 248,
+ 138,
+ 707
+ ],
+ [
+ 252,
+ 133,
+ 744
+ ],
+ [
+ 253,
+ 129,
+ 745
+ ],
+ [
+ 254,
+ 127,
+ 747
+ ],
+ [
+ 256,
+ 123,
+ 770
+ ],
+ [
+ 257,
+ 120,
+ 772
+ ],
+ [
+ 258,
+ 117,
+ 804
+ ],
+ [
+ 258,
+ 116,
+ 804
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 95,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 95
+ }
+}
diff --git a/tests/auto/inputpanel/data/inputpanel/unipen_data_hebrew.js b/tests/auto/inputpanel/data/inputpanel/unipen_data_hebrew.js
new file mode 100644
index 00000000..29c9d3eb
--- /dev/null
+++ b/tests/auto/inputpanel/data/inputpanel/unipen_data_hebrew.js
@@ -0,0 +1,6985 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+var unipenData = {
+ "0x05d0": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 510,
+ 64,
+ 0
+ ],
+ [
+ 510,
+ 65,
+ 53
+ ],
+ [
+ 510,
+ 68,
+ 54
+ ],
+ [
+ 510,
+ 77,
+ 114
+ ],
+ [
+ 513,
+ 90,
+ 115
+ ],
+ [
+ 513,
+ 103,
+ 180
+ ],
+ [
+ 513,
+ 118,
+ 181
+ ],
+ [
+ 511,
+ 132,
+ 236
+ ],
+ [
+ 511,
+ 144,
+ 236
+ ],
+ [
+ 511,
+ 149,
+ 296
+ ],
+ [
+ 509,
+ 160,
+ 297
+ ],
+ [
+ 509,
+ 164,
+ 357
+ ],
+ [
+ 509,
+ 166,
+ 358
+ ],
+ [
+ 509,
+ 168,
+ 363
+ ],
+ [
+ 509,
+ 169,
+ 421
+ ],
+ [
+ 509,
+ 170,
+ 451
+ ],
+ [
+ 509,
+ 172,
+ 482
+ ],
+ [
+ 509,
+ 173,
+ 700
+ ]
+ ],
+ [
+ [
+ 573,
+ 128,
+ 1152
+ ],
+ [
+ 570,
+ 123,
+ 1216
+ ],
+ [
+ 566,
+ 121,
+ 1217
+ ],
+ [
+ 562,
+ 120,
+ 1219
+ ],
+ [
+ 559,
+ 120,
+ 1274
+ ],
+ [
+ 548,
+ 122,
+ 1276
+ ],
+ [
+ 538,
+ 126,
+ 1333
+ ],
+ [
+ 526,
+ 132,
+ 1334
+ ],
+ [
+ 521,
+ 138,
+ 1394
+ ],
+ [
+ 521,
+ 141,
+ 1394
+ ],
+ [
+ 522,
+ 148,
+ 1395
+ ],
+ [
+ 522,
+ 149,
+ 1454
+ ],
+ [
+ 525,
+ 154,
+ 1455
+ ],
+ [
+ 530,
+ 159,
+ 1515
+ ],
+ [
+ 548,
+ 170,
+ 1516
+ ],
+ [
+ 568,
+ 179,
+ 1576
+ ],
+ [
+ 587,
+ 182,
+ 1577
+ ],
+ [
+ 594,
+ 182,
+ 1579
+ ],
+ [
+ 599,
+ 182,
+ 1637
+ ],
+ [
+ 605,
+ 182,
+ 1638
+ ],
+ [
+ 610,
+ 180,
+ 1703
+ ],
+ [
+ 611,
+ 178,
+ 1703
+ ],
+ [
+ 611,
+ 176,
+ 1780
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ },
+ "0x05d1": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 436,
+ 76,
+ 0
+ ],
+ [
+ 436,
+ 75,
+ 117
+ ],
+ [
+ 437,
+ 74,
+ 143
+ ],
+ [
+ 437,
+ 73,
+ 167
+ ],
+ [
+ 438,
+ 72,
+ 193
+ ],
+ [
+ 438,
+ 69,
+ 194
+ ],
+ [
+ 439,
+ 68,
+ 196
+ ],
+ [
+ 441,
+ 65,
+ 261
+ ],
+ [
+ 448,
+ 62,
+ 263
+ ],
+ [
+ 457,
+ 59,
+ 317
+ ],
+ [
+ 467,
+ 57,
+ 318
+ ],
+ [
+ 482,
+ 56,
+ 380
+ ],
+ [
+ 489,
+ 57,
+ 382
+ ],
+ [
+ 496,
+ 59,
+ 438
+ ],
+ [
+ 502,
+ 63,
+ 439
+ ],
+ [
+ 509,
+ 67,
+ 499
+ ],
+ [
+ 510,
+ 69,
+ 500
+ ],
+ [
+ 512,
+ 72,
+ 501
+ ],
+ [
+ 513,
+ 77,
+ 560
+ ],
+ [
+ 514,
+ 87,
+ 561
+ ],
+ [
+ 515,
+ 96,
+ 621
+ ],
+ [
+ 515,
+ 101,
+ 621
+ ],
+ [
+ 515,
+ 111,
+ 681
+ ],
+ [
+ 514,
+ 113,
+ 682
+ ],
+ [
+ 512,
+ 119,
+ 683
+ ],
+ [
+ 512,
+ 121,
+ 684
+ ],
+ [
+ 509,
+ 125,
+ 742
+ ],
+ [
+ 506,
+ 131,
+ 743
+ ],
+ [
+ 504,
+ 134,
+ 748
+ ],
+ [
+ 503,
+ 136,
+ 807
+ ],
+ [
+ 500,
+ 138,
+ 809
+ ],
+ [
+ 497,
+ 141,
+ 813
+ ],
+ [
+ 494,
+ 143,
+ 866
+ ],
+ [
+ 491,
+ 145,
+ 866
+ ],
+ [
+ 489,
+ 146,
+ 926
+ ],
+ [
+ 488,
+ 146,
+ 927
+ ],
+ [
+ 487,
+ 146,
+ 932
+ ],
+ [
+ 484,
+ 146,
+ 989
+ ],
+ [
+ 475,
+ 146,
+ 990
+ ],
+ [
+ 468,
+ 143,
+ 1052
+ ],
+ [
+ 465,
+ 142,
+ 1055
+ ],
+ [
+ 460,
+ 142,
+ 1111
+ ],
+ [
+ 455,
+ 141,
+ 1112
+ ],
+ [
+ 453,
+ 141,
+ 1171
+ ],
+ [
+ 452,
+ 141,
+ 1233
+ ],
+ [
+ 449,
+ 141,
+ 1234
+ ],
+ [
+ 448,
+ 141,
+ 1294
+ ],
+ [
+ 444,
+ 141,
+ 1294
+ ],
+ [
+ 443,
+ 143,
+ 1356
+ ],
+ [
+ 441,
+ 145,
+ 1357
+ ],
+ [
+ 440,
+ 148,
+ 1417
+ ],
+ [
+ 437,
+ 155,
+ 1417
+ ],
+ [
+ 435,
+ 158,
+ 1477
+ ],
+ [
+ 433,
+ 162,
+ 1478
+ ],
+ [
+ 431,
+ 167,
+ 1538
+ ],
+ [
+ 430,
+ 171,
+ 1538
+ ],
+ [
+ 429,
+ 173,
+ 1602
+ ],
+ [
+ 428,
+ 174,
+ 1603
+ ],
+ [
+ 427,
+ 177,
+ 1660
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ },
+ "0x05d2": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 541,
+ 57,
+ 0
+ ],
+ [
+ 542,
+ 58,
+ 133
+ ],
+ [
+ 542,
+ 59,
+ 160
+ ],
+ [
+ 543,
+ 60,
+ 206
+ ],
+ [
+ 544,
+ 62,
+ 207
+ ],
+ [
+ 546,
+ 67,
+ 266
+ ],
+ [
+ 546,
+ 68,
+ 267
+ ],
+ [
+ 546,
+ 72,
+ 268
+ ],
+ [
+ 547,
+ 78,
+ 328
+ ],
+ [
+ 548,
+ 86,
+ 329
+ ],
+ [
+ 550,
+ 95,
+ 390
+ ],
+ [
+ 550,
+ 103,
+ 391
+ ],
+ [
+ 551,
+ 108,
+ 454
+ ],
+ [
+ 553,
+ 118,
+ 455
+ ],
+ [
+ 554,
+ 125,
+ 511
+ ],
+ [
+ 555,
+ 130,
+ 512
+ ],
+ [
+ 555,
+ 131,
+ 516
+ ],
+ [
+ 555,
+ 133,
+ 572
+ ],
+ [
+ 555,
+ 134,
+ 633
+ ],
+ [
+ 555,
+ 135,
+ 634
+ ],
+ [
+ 555,
+ 136,
+ 694
+ ],
+ [
+ 555,
+ 135,
+ 989
+ ],
+ [
+ 555,
+ 134,
+ 1035
+ ],
+ [
+ 555,
+ 132,
+ 1036
+ ],
+ [
+ 555,
+ 130,
+ 1091
+ ],
+ [
+ 555,
+ 126,
+ 1092
+ ],
+ [
+ 555,
+ 123,
+ 1152
+ ],
+ [
+ 555,
+ 120,
+ 1154
+ ],
+ [
+ 553,
+ 119,
+ 1157
+ ],
+ [
+ 551,
+ 117,
+ 1213
+ ],
+ [
+ 549,
+ 116,
+ 1214
+ ],
+ [
+ 544,
+ 116,
+ 1274
+ ],
+ [
+ 538,
+ 116,
+ 1275
+ ],
+ [
+ 531,
+ 116,
+ 1277
+ ],
+ [
+ 524,
+ 117,
+ 1335
+ ],
+ [
+ 513,
+ 119,
+ 1336
+ ],
+ [
+ 502,
+ 127,
+ 1395
+ ],
+ [
+ 501,
+ 130,
+ 1396
+ ],
+ [
+ 498,
+ 135,
+ 1457
+ ],
+ [
+ 495,
+ 145,
+ 1457
+ ],
+ [
+ 495,
+ 154,
+ 1518
+ ],
+ [
+ 496,
+ 162,
+ 1519
+ ],
+ [
+ 501,
+ 171,
+ 1579
+ ],
+ [
+ 507,
+ 178,
+ 1580
+ ],
+ [
+ 517,
+ 184,
+ 1639
+ ],
+ [
+ 527,
+ 188,
+ 1640
+ ],
+ [
+ 538,
+ 189,
+ 1701
+ ],
+ [
+ 545,
+ 189,
+ 1702
+ ],
+ [
+ 560,
+ 186,
+ 1762
+ ],
+ [
+ 570,
+ 182,
+ 1763
+ ],
+ [
+ 572,
+ 179,
+ 1823
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ },
+ "0x05d3": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 470,
+ 76,
+ 0
+ ],
+ [
+ 470,
+ 74,
+ 67
+ ],
+ [
+ 470,
+ 72,
+ 97
+ ],
+ [
+ 475,
+ 69,
+ 158
+ ],
+ [
+ 477,
+ 67,
+ 159
+ ],
+ [
+ 482,
+ 65,
+ 188
+ ],
+ [
+ 484,
+ 65,
+ 219
+ ],
+ [
+ 488,
+ 65,
+ 220
+ ],
+ [
+ 497,
+ 64,
+ 278
+ ],
+ [
+ 515,
+ 65,
+ 279
+ ],
+ [
+ 517,
+ 66,
+ 284
+ ],
+ [
+ 520,
+ 67,
+ 340
+ ],
+ [
+ 523,
+ 70,
+ 341
+ ],
+ [
+ 525,
+ 74,
+ 400
+ ],
+ [
+ 528,
+ 83,
+ 401
+ ],
+ [
+ 530,
+ 97,
+ 466
+ ],
+ [
+ 530,
+ 102,
+ 466
+ ],
+ [
+ 530,
+ 110,
+ 523
+ ],
+ [
+ 530,
+ 112,
+ 524
+ ],
+ [
+ 527,
+ 118,
+ 524
+ ],
+ [
+ 526,
+ 119,
+ 587
+ ],
+ [
+ 513,
+ 127,
+ 590
+ ],
+ [
+ 504,
+ 130,
+ 650
+ ],
+ [
+ 500,
+ 131,
+ 651
+ ],
+ [
+ 494,
+ 132,
+ 707
+ ],
+ [
+ 490,
+ 133,
+ 708
+ ],
+ [
+ 483,
+ 134,
+ 768
+ ],
+ [
+ 481,
+ 134,
+ 769
+ ],
+ [
+ 480,
+ 134,
+ 772
+ ],
+ [
+ 479,
+ 134,
+ 830
+ ],
+ [
+ 478,
+ 134,
+ 862
+ ],
+ [
+ 477,
+ 134,
+ 888
+ ],
+ [
+ 475,
+ 131,
+ 889
+ ],
+ [
+ 475,
+ 130,
+ 953
+ ],
+ [
+ 475,
+ 129,
+ 953
+ ],
+ [
+ 477,
+ 129,
+ 1010
+ ],
+ [
+ 479,
+ 129,
+ 1011
+ ],
+ [
+ 483,
+ 129,
+ 1070
+ ],
+ [
+ 486,
+ 129,
+ 1071
+ ],
+ [
+ 492,
+ 131,
+ 1130
+ ],
+ [
+ 497,
+ 136,
+ 1131
+ ],
+ [
+ 503,
+ 142,
+ 1195
+ ],
+ [
+ 506,
+ 145,
+ 1197
+ ],
+ [
+ 510,
+ 150,
+ 1198
+ ],
+ [
+ 514,
+ 157,
+ 1252
+ ],
+ [
+ 518,
+ 164,
+ 1254
+ ],
+ [
+ 519,
+ 172,
+ 1313
+ ],
+ [
+ 520,
+ 174,
+ 1314
+ ],
+ [
+ 521,
+ 178,
+ 1315
+ ],
+ [
+ 523,
+ 182,
+ 1374
+ ],
+ [
+ 524,
+ 187,
+ 1375
+ ],
+ [
+ 525,
+ 190,
+ 1439
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ },
+ "0x05d4": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 463,
+ 92,
+ 0
+ ],
+ [
+ 463,
+ 91,
+ 68
+ ],
+ [
+ 462,
+ 90,
+ 70
+ ],
+ [
+ 462,
+ 89,
+ 103
+ ],
+ [
+ 462,
+ 87,
+ 104
+ ],
+ [
+ 462,
+ 85,
+ 154
+ ],
+ [
+ 462,
+ 83,
+ 155
+ ],
+ [
+ 464,
+ 80,
+ 156
+ ],
+ [
+ 466,
+ 76,
+ 215
+ ],
+ [
+ 466,
+ 75,
+ 216
+ ],
+ [
+ 471,
+ 69,
+ 221
+ ],
+ [
+ 475,
+ 67,
+ 277
+ ],
+ [
+ 478,
+ 65,
+ 278
+ ],
+ [
+ 481,
+ 63,
+ 278
+ ],
+ [
+ 483,
+ 63,
+ 336
+ ],
+ [
+ 497,
+ 60,
+ 337
+ ],
+ [
+ 508,
+ 60,
+ 340
+ ],
+ [
+ 517,
+ 60,
+ 397
+ ],
+ [
+ 523,
+ 60,
+ 398
+ ],
+ [
+ 527,
+ 62,
+ 458
+ ],
+ [
+ 534,
+ 65,
+ 459
+ ],
+ [
+ 541,
+ 69,
+ 518
+ ],
+ [
+ 544,
+ 76,
+ 519
+ ],
+ [
+ 545,
+ 84,
+ 584
+ ],
+ [
+ 548,
+ 95,
+ 585
+ ],
+ [
+ 548,
+ 97,
+ 588
+ ],
+ [
+ 549,
+ 100,
+ 640
+ ],
+ [
+ 550,
+ 107,
+ 641
+ ],
+ [
+ 551,
+ 108,
+ 644
+ ],
+ [
+ 552,
+ 112,
+ 701
+ ],
+ [
+ 554,
+ 117,
+ 702
+ ],
+ [
+ 557,
+ 124,
+ 762
+ ],
+ [
+ 559,
+ 132,
+ 763
+ ],
+ [
+ 560,
+ 137,
+ 823
+ ],
+ [
+ 561,
+ 143,
+ 824
+ ],
+ [
+ 561,
+ 146,
+ 889
+ ],
+ [
+ 561,
+ 152,
+ 890
+ ],
+ [
+ 561,
+ 154,
+ 945
+ ],
+ [
+ 561,
+ 157,
+ 946
+ ],
+ [
+ 561,
+ 160,
+ 1007
+ ],
+ [
+ 561,
+ 161,
+ 1008
+ ],
+ [
+ 561,
+ 163,
+ 1073
+ ],
+ [
+ 561,
+ 166,
+ 1129
+ ],
+ [
+ 561,
+ 168,
+ 1189
+ ],
+ [
+ 561,
+ 169,
+ 1285
+ ],
+ [
+ 560,
+ 169,
+ 1397
+ ]
+ ],
+ [
+ [
+ 504,
+ 145,
+ 2008
+ ],
+ [
+ 504,
+ 147,
+ 2077
+ ],
+ [
+ 504,
+ 149,
+ 2094
+ ],
+ [
+ 504,
+ 152,
+ 2132
+ ],
+ [
+ 504,
+ 153,
+ 2133
+ ],
+ [
+ 503,
+ 161,
+ 2193
+ ],
+ [
+ 502,
+ 167,
+ 2193
+ ],
+ [
+ 502,
+ 169,
+ 2196
+ ],
+ [
+ 502,
+ 170,
+ 2253
+ ],
+ [
+ 502,
+ 174,
+ 2254
+ ],
+ [
+ 502,
+ 175,
+ 2364
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ },
+ "0x05d5": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 450,
+ 36,
+ 0
+ ],
+ [
+ 450,
+ 37,
+ 60
+ ],
+ [
+ 450,
+ 39,
+ 89
+ ],
+ [
+ 451,
+ 40,
+ 92
+ ],
+ [
+ 451,
+ 44,
+ 152
+ ],
+ [
+ 452,
+ 46,
+ 154
+ ],
+ [
+ 452,
+ 49,
+ 156
+ ],
+ [
+ 452,
+ 51,
+ 211
+ ],
+ [
+ 452,
+ 58,
+ 212
+ ],
+ [
+ 452,
+ 63,
+ 276
+ ],
+ [
+ 451,
+ 68,
+ 277
+ ],
+ [
+ 450,
+ 73,
+ 278
+ ],
+ [
+ 449,
+ 87,
+ 333
+ ],
+ [
+ 447,
+ 99,
+ 334
+ ],
+ [
+ 446,
+ 110,
+ 394
+ ],
+ [
+ 445,
+ 112,
+ 395
+ ],
+ [
+ 444,
+ 119,
+ 396
+ ],
+ [
+ 443,
+ 127,
+ 453
+ ],
+ [
+ 442,
+ 138,
+ 454
+ ],
+ [
+ 440,
+ 148,
+ 517
+ ],
+ [
+ 439,
+ 158,
+ 519
+ ],
+ [
+ 437,
+ 164,
+ 576
+ ],
+ [
+ 436,
+ 171,
+ 577
+ ],
+ [
+ 435,
+ 174,
+ 639
+ ],
+ [
+ 435,
+ 176,
+ 641
+ ],
+ [
+ 435,
+ 177,
+ 644
+ ],
+ [
+ 435,
+ 178,
+ 699
+ ],
+ [
+ 434,
+ 178,
+ 700
+ ],
+ [
+ 434,
+ 179,
+ 772
+ ],
+ [
+ 434,
+ 180,
+ 821
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ },
+ "0x05d6": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 472,
+ 63,
+ 0
+ ],
+ [
+ 472,
+ 64,
+ 49
+ ],
+ [
+ 471,
+ 67,
+ 50
+ ],
+ [
+ 471,
+ 69,
+ 52
+ ],
+ [
+ 469,
+ 75,
+ 115
+ ],
+ [
+ 468,
+ 79,
+ 115
+ ],
+ [
+ 467,
+ 86,
+ 172
+ ],
+ [
+ 466,
+ 95,
+ 172
+ ],
+ [
+ 465,
+ 97,
+ 233
+ ],
+ [
+ 464,
+ 104,
+ 234
+ ],
+ [
+ 463,
+ 106,
+ 235
+ ],
+ [
+ 461,
+ 116,
+ 294
+ ],
+ [
+ 461,
+ 120,
+ 296
+ ],
+ [
+ 461,
+ 122,
+ 355
+ ],
+ [
+ 460,
+ 124,
+ 356
+ ],
+ [
+ 460,
+ 123,
+ 507
+ ],
+ [
+ 460,
+ 122,
+ 568
+ ],
+ [
+ 465,
+ 121,
+ 569
+ ],
+ [
+ 466,
+ 120,
+ 571
+ ],
+ [
+ 475,
+ 119,
+ 629
+ ],
+ [
+ 481,
+ 119,
+ 630
+ ],
+ [
+ 490,
+ 119,
+ 691
+ ],
+ [
+ 494,
+ 120,
+ 693
+ ],
+ [
+ 499,
+ 123,
+ 750
+ ],
+ [
+ 502,
+ 126,
+ 751
+ ],
+ [
+ 505,
+ 130,
+ 755
+ ],
+ [
+ 506,
+ 133,
+ 811
+ ],
+ [
+ 510,
+ 141,
+ 813
+ ],
+ [
+ 511,
+ 145,
+ 872
+ ],
+ [
+ 513,
+ 153,
+ 873
+ ],
+ [
+ 513,
+ 160,
+ 876
+ ],
+ [
+ 513,
+ 164,
+ 936
+ ],
+ [
+ 513,
+ 172,
+ 939
+ ],
+ [
+ 509,
+ 177,
+ 993
+ ],
+ [
+ 507,
+ 179,
+ 994
+ ],
+ [
+ 506,
+ 181,
+ 995
+ ],
+ [
+ 503,
+ 182,
+ 1056
+ ],
+ [
+ 497,
+ 184,
+ 1058
+ ],
+ [
+ 488,
+ 184,
+ 1116
+ ],
+ [
+ 485,
+ 184,
+ 1117
+ ],
+ [
+ 473,
+ 184,
+ 1178
+ ],
+ [
+ 467,
+ 182,
+ 1179
+ ],
+ [
+ 463,
+ 180,
+ 1239
+ ],
+ [
+ 459,
+ 178,
+ 1240
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ },
+ "0x05d7": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 435,
+ 74,
+ 0
+ ],
+ [
+ 435,
+ 73,
+ 156
+ ],
+ [
+ 435,
+ 71,
+ 181
+ ],
+ [
+ 445,
+ 65,
+ 250
+ ],
+ [
+ 451,
+ 62,
+ 252
+ ],
+ [
+ 455,
+ 61,
+ 310
+ ],
+ [
+ 466,
+ 58,
+ 311
+ ],
+ [
+ 476,
+ 57,
+ 371
+ ],
+ [
+ 479,
+ 57,
+ 372
+ ],
+ [
+ 488,
+ 63,
+ 432
+ ],
+ [
+ 495,
+ 73,
+ 433
+ ],
+ [
+ 499,
+ 80,
+ 493
+ ],
+ [
+ 501,
+ 87,
+ 495
+ ],
+ [
+ 502,
+ 91,
+ 524
+ ],
+ [
+ 503,
+ 99,
+ 557
+ ],
+ [
+ 504,
+ 111,
+ 558
+ ],
+ [
+ 504,
+ 116,
+ 614
+ ],
+ [
+ 502,
+ 125,
+ 617
+ ],
+ [
+ 502,
+ 128,
+ 620
+ ],
+ [
+ 502,
+ 133,
+ 674
+ ],
+ [
+ 498,
+ 142,
+ 674
+ ],
+ [
+ 495,
+ 152,
+ 738
+ ],
+ [
+ 495,
+ 159,
+ 740
+ ],
+ [
+ 495,
+ 162,
+ 795
+ ],
+ [
+ 495,
+ 165,
+ 797
+ ],
+ [
+ 495,
+ 167,
+ 856
+ ],
+ [
+ 495,
+ 170,
+ 857
+ ],
+ [
+ 495,
+ 172,
+ 919
+ ],
+ [
+ 495,
+ 173,
+ 977
+ ],
+ [
+ 495,
+ 174,
+ 978
+ ],
+ [
+ 494,
+ 174,
+ 1124
+ ],
+ [
+ 494,
+ 173,
+ 1189
+ ]
+ ],
+ [
+ [
+ 436,
+ 64,
+ 1560
+ ],
+ [
+ 436,
+ 68,
+ 1615
+ ],
+ [
+ 436,
+ 73,
+ 1616
+ ],
+ [
+ 435,
+ 75,
+ 1619
+ ],
+ [
+ 434,
+ 83,
+ 1675
+ ],
+ [
+ 432,
+ 93,
+ 1676
+ ],
+ [
+ 430,
+ 106,
+ 1736
+ ],
+ [
+ 425,
+ 117,
+ 1737
+ ],
+ [
+ 423,
+ 122,
+ 1797
+ ],
+ [
+ 421,
+ 133,
+ 1797
+ ],
+ [
+ 419,
+ 147,
+ 1860
+ ],
+ [
+ 418,
+ 154,
+ 1863
+ ],
+ [
+ 417,
+ 160,
+ 1920
+ ],
+ [
+ 417,
+ 163,
+ 1920
+ ],
+ [
+ 416,
+ 169,
+ 1981
+ ],
+ [
+ 416,
+ 171,
+ 1982
+ ],
+ [
+ 415,
+ 174,
+ 2046
+ ],
+ [
+ 414,
+ 174,
+ 2207
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ },
+ "0x05d8": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 504,
+ 89,
+ 0
+ ],
+ [
+ 504,
+ 92,
+ 57
+ ],
+ [
+ 504,
+ 94,
+ 88
+ ],
+ [
+ 505,
+ 98,
+ 91
+ ],
+ [
+ 505,
+ 100,
+ 148
+ ],
+ [
+ 506,
+ 109,
+ 149
+ ],
+ [
+ 504,
+ 128,
+ 209
+ ],
+ [
+ 501,
+ 137,
+ 210
+ ],
+ [
+ 501,
+ 139,
+ 211
+ ],
+ [
+ 499,
+ 144,
+ 271
+ ],
+ [
+ 491,
+ 150,
+ 272
+ ],
+ [
+ 485,
+ 154,
+ 275
+ ],
+ [
+ 479,
+ 156,
+ 337
+ ],
+ [
+ 465,
+ 159,
+ 337
+ ],
+ [
+ 459,
+ 161,
+ 340
+ ],
+ [
+ 453,
+ 161,
+ 393
+ ],
+ [
+ 446,
+ 162,
+ 394
+ ],
+ [
+ 428,
+ 157,
+ 455
+ ],
+ [
+ 417,
+ 150,
+ 456
+ ],
+ [
+ 410,
+ 138,
+ 515
+ ],
+ [
+ 403,
+ 122,
+ 516
+ ],
+ [
+ 401,
+ 117,
+ 576
+ ],
+ [
+ 403,
+ 92,
+ 577
+ ],
+ [
+ 423,
+ 67,
+ 639
+ ],
+ [
+ 441,
+ 50,
+ 641
+ ],
+ [
+ 459,
+ 39,
+ 698
+ ],
+ [
+ 470,
+ 32,
+ 699
+ ],
+ [
+ 497,
+ 24,
+ 759
+ ],
+ [
+ 503,
+ 22,
+ 760
+ ],
+ [
+ 506,
+ 21,
+ 820
+ ],
+ [
+ 508,
+ 21,
+ 821
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ },
+ "0x05d9": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 474,
+ 54,
+ 0
+ ],
+ [
+ 474,
+ 55,
+ 51
+ ],
+ [
+ 474,
+ 57,
+ 52
+ ],
+ [
+ 474,
+ 62,
+ 111
+ ],
+ [
+ 473,
+ 65,
+ 112
+ ],
+ [
+ 470,
+ 72,
+ 116
+ ],
+ [
+ 469,
+ 74,
+ 163
+ ],
+ [
+ 467,
+ 82,
+ 164
+ ],
+ [
+ 467,
+ 84,
+ 223
+ ],
+ [
+ 467,
+ 85,
+ 285
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ },
+ "0x05da": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 401,
+ 74,
+ 0
+ ],
+ [
+ 400,
+ 73,
+ 158
+ ],
+ [
+ 400,
+ 72,
+ 183
+ ],
+ [
+ 400,
+ 67,
+ 254
+ ],
+ [
+ 401,
+ 65,
+ 255
+ ],
+ [
+ 407,
+ 62,
+ 318
+ ],
+ [
+ 412,
+ 60,
+ 319
+ ],
+ [
+ 416,
+ 59,
+ 375
+ ],
+ [
+ 429,
+ 58,
+ 376
+ ],
+ [
+ 437,
+ 58,
+ 381
+ ],
+ [
+ 446,
+ 58,
+ 437
+ ],
+ [
+ 454,
+ 58,
+ 438
+ ],
+ [
+ 457,
+ 60,
+ 498
+ ],
+ [
+ 461,
+ 67,
+ 499
+ ],
+ [
+ 465,
+ 77,
+ 564
+ ],
+ [
+ 466,
+ 91,
+ 565
+ ],
+ [
+ 466,
+ 97,
+ 620
+ ],
+ [
+ 465,
+ 105,
+ 620
+ ],
+ [
+ 462,
+ 109,
+ 622
+ ],
+ [
+ 460,
+ 113,
+ 681
+ ],
+ [
+ 456,
+ 118,
+ 682
+ ],
+ [
+ 451,
+ 122,
+ 685
+ ],
+ [
+ 447,
+ 124,
+ 742
+ ],
+ [
+ 445,
+ 128,
+ 743
+ ],
+ [
+ 442,
+ 132,
+ 804
+ ],
+ [
+ 441,
+ 135,
+ 804
+ ],
+ [
+ 440,
+ 139,
+ 863
+ ],
+ [
+ 440,
+ 144,
+ 864
+ ],
+ [
+ 440,
+ 146,
+ 868
+ ],
+ [
+ 440,
+ 150,
+ 924
+ ],
+ [
+ 440,
+ 154,
+ 925
+ ],
+ [
+ 440,
+ 158,
+ 985
+ ],
+ [
+ 440,
+ 163,
+ 986
+ ],
+ [
+ 440,
+ 167,
+ 989
+ ],
+ [
+ 440,
+ 174,
+ 1051
+ ],
+ [
+ 438,
+ 182,
+ 1051
+ ],
+ [
+ 438,
+ 184,
+ 1054
+ ],
+ [
+ 438,
+ 188,
+ 1106
+ ],
+ [
+ 438,
+ 196,
+ 1107
+ ],
+ [
+ 436,
+ 205,
+ 1167
+ ],
+ [
+ 435,
+ 212,
+ 1167
+ ],
+ [
+ 435,
+ 216,
+ 1228
+ ],
+ [
+ 435,
+ 219,
+ 1229
+ ],
+ [
+ 434,
+ 220,
+ 1230
+ ],
+ [
+ 434,
+ 221,
+ 1288
+ ],
+ [
+ 434,
+ 224,
+ 1289
+ ],
+ [
+ 434,
+ 225,
+ 1349
+ ],
+ [
+ 434,
+ 226,
+ 1410
+ ],
+ [
+ 433,
+ 226,
+ 1518
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ },
+ "0x05db": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 419,
+ 65,
+ 0
+ ],
+ [
+ 420,
+ 65,
+ 99
+ ],
+ [
+ 423,
+ 63,
+ 126
+ ],
+ [
+ 426,
+ 61,
+ 167
+ ],
+ [
+ 429,
+ 60,
+ 171
+ ],
+ [
+ 431,
+ 60,
+ 227
+ ],
+ [
+ 438,
+ 59,
+ 228
+ ],
+ [
+ 444,
+ 59,
+ 288
+ ],
+ [
+ 455,
+ 59,
+ 289
+ ],
+ [
+ 461,
+ 60,
+ 292
+ ],
+ [
+ 467,
+ 61,
+ 350
+ ],
+ [
+ 475,
+ 65,
+ 351
+ ],
+ [
+ 481,
+ 70,
+ 411
+ ],
+ [
+ 488,
+ 78,
+ 412
+ ],
+ [
+ 493,
+ 85,
+ 472
+ ],
+ [
+ 495,
+ 90,
+ 473
+ ],
+ [
+ 498,
+ 106,
+ 537
+ ],
+ [
+ 498,
+ 118,
+ 538
+ ],
+ [
+ 497,
+ 121,
+ 539
+ ],
+ [
+ 494,
+ 129,
+ 594
+ ],
+ [
+ 493,
+ 131,
+ 595
+ ],
+ [
+ 484,
+ 142,
+ 654
+ ],
+ [
+ 474,
+ 149,
+ 655
+ ],
+ [
+ 465,
+ 155,
+ 715
+ ],
+ [
+ 461,
+ 157,
+ 716
+ ],
+ [
+ 457,
+ 159,
+ 717
+ ],
+ [
+ 454,
+ 159,
+ 777
+ ],
+ [
+ 446,
+ 161,
+ 779
+ ],
+ [
+ 442,
+ 161,
+ 780
+ ],
+ [
+ 438,
+ 161,
+ 838
+ ],
+ [
+ 428,
+ 161,
+ 839
+ ],
+ [
+ 420,
+ 160,
+ 898
+ ],
+ [
+ 413,
+ 159,
+ 899
+ ],
+ [
+ 409,
+ 158,
+ 959
+ ],
+ [
+ 408,
+ 158,
+ 1019
+ ],
+ [
+ 406,
+ 156,
+ 1020
+ ],
+ [
+ 405,
+ 155,
+ 1083
+ ],
+ [
+ 404,
+ 155,
+ 1085
+ ],
+ [
+ 404,
+ 154,
+ 1141
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ },
+ "0x05dc": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 477,
+ 154,
+ 0
+ ],
+ [
+ 476,
+ 154,
+ 308
+ ],
+ [
+ 474,
+ 155,
+ 340
+ ],
+ [
+ 472,
+ 156,
+ 380
+ ],
+ [
+ 471,
+ 157,
+ 446
+ ],
+ [
+ 467,
+ 160,
+ 448
+ ],
+ [
+ 466,
+ 162,
+ 501
+ ],
+ [
+ 465,
+ 164,
+ 502
+ ],
+ [
+ 463,
+ 166,
+ 562
+ ],
+ [
+ 462,
+ 169,
+ 564
+ ],
+ [
+ 461,
+ 173,
+ 622
+ ],
+ [
+ 461,
+ 174,
+ 623
+ ],
+ [
+ 461,
+ 177,
+ 682
+ ],
+ [
+ 461,
+ 179,
+ 683
+ ],
+ [
+ 461,
+ 180,
+ 684
+ ],
+ [
+ 462,
+ 180,
+ 745
+ ],
+ [
+ 464,
+ 184,
+ 747
+ ],
+ [
+ 467,
+ 186,
+ 804
+ ],
+ [
+ 472,
+ 188,
+ 865
+ ],
+ [
+ 474,
+ 189,
+ 866
+ ],
+ [
+ 478,
+ 189,
+ 930
+ ],
+ [
+ 483,
+ 189,
+ 931
+ ],
+ [
+ 485,
+ 187,
+ 988
+ ],
+ [
+ 487,
+ 184,
+ 988
+ ],
+ [
+ 489,
+ 176,
+ 1049
+ ],
+ [
+ 489,
+ 175,
+ 1052
+ ],
+ [
+ 488,
+ 170,
+ 1108
+ ],
+ [
+ 484,
+ 166,
+ 1109
+ ],
+ [
+ 479,
+ 164,
+ 1169
+ ],
+ [
+ 475,
+ 161,
+ 1171
+ ],
+ [
+ 471,
+ 156,
+ 1231
+ ],
+ [
+ 468,
+ 153,
+ 1232
+ ],
+ [
+ 466,
+ 150,
+ 1235
+ ],
+ [
+ 464,
+ 147,
+ 1293
+ ],
+ [
+ 462,
+ 143,
+ 1296
+ ],
+ [
+ 459,
+ 135,
+ 1351
+ ],
+ [
+ 458,
+ 133,
+ 1352
+ ],
+ [
+ 457,
+ 124,
+ 1356
+ ],
+ [
+ 456,
+ 117,
+ 1412
+ ],
+ [
+ 455,
+ 111,
+ 1413
+ ],
+ [
+ 454,
+ 106,
+ 1414
+ ],
+ [
+ 454,
+ 94,
+ 1472
+ ],
+ [
+ 454,
+ 86,
+ 1473
+ ],
+ [
+ 454,
+ 78,
+ 1476
+ ],
+ [
+ 457,
+ 69,
+ 1534
+ ],
+ [
+ 460,
+ 54,
+ 1535
+ ],
+ [
+ 463,
+ 46,
+ 1540
+ ],
+ [
+ 465,
+ 40,
+ 1594
+ ],
+ [
+ 473,
+ 31,
+ 1595
+ ],
+ [
+ 480,
+ 25,
+ 1656
+ ],
+ [
+ 491,
+ 20,
+ 1657
+ ],
+ [
+ 493,
+ 18,
+ 1659
+ ],
+ [
+ 499,
+ 16,
+ 1717
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ },
+ "0x05dd": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 452,
+ 111,
+ 0
+ ],
+ [
+ 455,
+ 113,
+ 68
+ ],
+ [
+ 469,
+ 117,
+ 104
+ ],
+ [
+ 487,
+ 121,
+ 107
+ ],
+ [
+ 503,
+ 124,
+ 159
+ ],
+ [
+ 511,
+ 125,
+ 160
+ ],
+ [
+ 518,
+ 125,
+ 162
+ ],
+ [
+ 520,
+ 125,
+ 221
+ ],
+ [
+ 533,
+ 124,
+ 222
+ ],
+ [
+ 540,
+ 122,
+ 227
+ ],
+ [
+ 545,
+ 119,
+ 281
+ ],
+ [
+ 548,
+ 116,
+ 282
+ ],
+ [
+ 548,
+ 114,
+ 283
+ ],
+ [
+ 549,
+ 109,
+ 344
+ ],
+ [
+ 549,
+ 101,
+ 346
+ ],
+ [
+ 548,
+ 91,
+ 404
+ ],
+ [
+ 543,
+ 82,
+ 405
+ ],
+ [
+ 540,
+ 78,
+ 464
+ ],
+ [
+ 531,
+ 70,
+ 465
+ ],
+ [
+ 528,
+ 68,
+ 525
+ ],
+ [
+ 518,
+ 63,
+ 526
+ ],
+ [
+ 516,
+ 63,
+ 586
+ ],
+ [
+ 501,
+ 62,
+ 587
+ ],
+ [
+ 486,
+ 64,
+ 645
+ ],
+ [
+ 471,
+ 70,
+ 646
+ ],
+ [
+ 462,
+ 77,
+ 711
+ ],
+ [
+ 456,
+ 84,
+ 712
+ ],
+ [
+ 450,
+ 93,
+ 716
+ ],
+ [
+ 448,
+ 105,
+ 768
+ ],
+ [
+ 447,
+ 113,
+ 769
+ ],
+ [
+ 446,
+ 122,
+ 771
+ ],
+ [
+ 445,
+ 130,
+ 831
+ ],
+ [
+ 443,
+ 145,
+ 833
+ ],
+ [
+ 443,
+ 148,
+ 836
+ ],
+ [
+ 442,
+ 153,
+ 889
+ ],
+ [
+ 442,
+ 162,
+ 890
+ ],
+ [
+ 442,
+ 163,
+ 891
+ ],
+ [
+ 442,
+ 168,
+ 949
+ ],
+ [
+ 442,
+ 171,
+ 950
+ ],
+ [
+ 442,
+ 175,
+ 1015
+ ],
+ [
+ 441,
+ 177,
+ 1073
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ },
+ "0x05de": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 583,
+ 58,
+ 0
+ ],
+ [
+ 582,
+ 59,
+ 63
+ ],
+ [
+ 581,
+ 63,
+ 93
+ ],
+ [
+ 581,
+ 64,
+ 154
+ ],
+ [
+ 579,
+ 79,
+ 155
+ ],
+ [
+ 579,
+ 90,
+ 215
+ ],
+ [
+ 578,
+ 107,
+ 216
+ ],
+ [
+ 577,
+ 111,
+ 218
+ ],
+ [
+ 576,
+ 122,
+ 278
+ ],
+ [
+ 574,
+ 133,
+ 280
+ ],
+ [
+ 571,
+ 147,
+ 336
+ ],
+ [
+ 569,
+ 159,
+ 337
+ ],
+ [
+ 565,
+ 167,
+ 398
+ ],
+ [
+ 562,
+ 173,
+ 399
+ ],
+ [
+ 559,
+ 177,
+ 404
+ ],
+ [
+ 557,
+ 180,
+ 458
+ ],
+ [
+ 556,
+ 181,
+ 459
+ ],
+ [
+ 556,
+ 182,
+ 520
+ ],
+ [
+ 556,
+ 183,
+ 520
+ ],
+ [
+ 554,
+ 181,
+ 604
+ ],
+ [
+ 550,
+ 176,
+ 673
+ ],
+ [
+ 534,
+ 158,
+ 675
+ ],
+ [
+ 524,
+ 144,
+ 731
+ ],
+ [
+ 516,
+ 129,
+ 732
+ ],
+ [
+ 510,
+ 113,
+ 792
+ ],
+ [
+ 500,
+ 92,
+ 793
+ ],
+ [
+ 495,
+ 80,
+ 855
+ ],
+ [
+ 490,
+ 66,
+ 857
+ ],
+ [
+ 489,
+ 62,
+ 860
+ ],
+ [
+ 486,
+ 55,
+ 914
+ ],
+ [
+ 485,
+ 53,
+ 915
+ ],
+ [
+ 484,
+ 51,
+ 915
+ ],
+ [
+ 484,
+ 53,
+ 1100
+ ],
+ [
+ 481,
+ 60,
+ 1157
+ ],
+ [
+ 478,
+ 70,
+ 1158
+ ],
+ [
+ 476,
+ 83,
+ 1218
+ ],
+ [
+ 474,
+ 93,
+ 1219
+ ],
+ [
+ 473,
+ 98,
+ 1219
+ ],
+ [
+ 470,
+ 108,
+ 1279
+ ],
+ [
+ 466,
+ 119,
+ 1280
+ ],
+ [
+ 461,
+ 136,
+ 1340
+ ],
+ [
+ 458,
+ 149,
+ 1341
+ ],
+ [
+ 455,
+ 159,
+ 1401
+ ],
+ [
+ 452,
+ 169,
+ 1403
+ ],
+ [
+ 448,
+ 176,
+ 1404
+ ],
+ [
+ 446,
+ 182,
+ 1462
+ ],
+ [
+ 446,
+ 186,
+ 1463
+ ],
+ [
+ 444,
+ 188,
+ 1467
+ ],
+ [
+ 443,
+ 189,
+ 1524
+ ],
+ [
+ 443,
+ 190,
+ 1525
+ ],
+ [
+ 442,
+ 191,
+ 1588
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ },
+ "0x05df": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 454,
+ 58,
+ 0
+ ],
+ [
+ 454,
+ 61,
+ 54
+ ],
+ [
+ 454,
+ 62,
+ 59
+ ],
+ [
+ 454,
+ 64,
+ 114
+ ],
+ [
+ 454,
+ 67,
+ 114
+ ],
+ [
+ 454,
+ 73,
+ 180
+ ],
+ [
+ 455,
+ 83,
+ 181
+ ],
+ [
+ 456,
+ 91,
+ 237
+ ],
+ [
+ 456,
+ 103,
+ 238
+ ],
+ [
+ 456,
+ 114,
+ 297
+ ],
+ [
+ 456,
+ 129,
+ 298
+ ],
+ [
+ 457,
+ 144,
+ 358
+ ],
+ [
+ 457,
+ 152,
+ 359
+ ],
+ [
+ 458,
+ 163,
+ 362
+ ],
+ [
+ 458,
+ 167,
+ 430
+ ],
+ [
+ 463,
+ 190,
+ 432
+ ],
+ [
+ 463,
+ 192,
+ 434
+ ],
+ [
+ 463,
+ 197,
+ 489
+ ],
+ [
+ 463,
+ 203,
+ 490
+ ],
+ [
+ 463,
+ 207,
+ 551
+ ],
+ [
+ 463,
+ 211,
+ 552
+ ],
+ [
+ 463,
+ 213,
+ 606
+ ],
+ [
+ 463,
+ 214,
+ 606
+ ],
+ [
+ 463,
+ 216,
+ 611
+ ],
+ [
+ 463,
+ 217,
+ 669
+ ],
+ [
+ 463,
+ 218,
+ 932
+ ],
+ [
+ 463,
+ 219,
+ 1000
+ ],
+ [
+ 463,
+ 220,
+ 1061
+ ],
+ [
+ 463,
+ 221,
+ 1121
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ },
+ "0x05e0": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 519,
+ 63,
+ 0
+ ],
+ [
+ 519,
+ 65,
+ 83
+ ],
+ [
+ 519,
+ 67,
+ 100
+ ],
+ [
+ 519,
+ 77,
+ 145
+ ],
+ [
+ 517,
+ 85,
+ 205
+ ],
+ [
+ 516,
+ 99,
+ 206
+ ],
+ [
+ 516,
+ 113,
+ 266
+ ],
+ [
+ 516,
+ 123,
+ 267
+ ],
+ [
+ 516,
+ 125,
+ 327
+ ],
+ [
+ 515,
+ 139,
+ 328
+ ],
+ [
+ 514,
+ 147,
+ 388
+ ],
+ [
+ 513,
+ 154,
+ 388
+ ],
+ [
+ 512,
+ 161,
+ 450
+ ],
+ [
+ 511,
+ 164,
+ 450
+ ],
+ [
+ 509,
+ 167,
+ 512
+ ],
+ [
+ 506,
+ 170,
+ 514
+ ],
+ [
+ 504,
+ 172,
+ 516
+ ],
+ [
+ 503,
+ 173,
+ 572
+ ],
+ [
+ 500,
+ 175,
+ 573
+ ],
+ [
+ 492,
+ 177,
+ 632
+ ],
+ [
+ 492,
+ 178,
+ 633
+ ],
+ [
+ 486,
+ 179,
+ 634
+ ],
+ [
+ 482,
+ 179,
+ 694
+ ],
+ [
+ 478,
+ 180,
+ 695
+ ],
+ [
+ 476,
+ 180,
+ 699
+ ],
+ [
+ 472,
+ 180,
+ 755
+ ],
+ [
+ 462,
+ 178,
+ 756
+ ],
+ [
+ 451,
+ 175,
+ 823
+ ],
+ [
+ 447,
+ 173,
+ 824
+ ],
+ [
+ 443,
+ 171,
+ 827
+ ],
+ [
+ 440,
+ 171,
+ 883
+ ],
+ [
+ 438,
+ 170,
+ 884
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ },
+ "0x05e1": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 510,
+ 62,
+ 0
+ ],
+ [
+ 511,
+ 62,
+ 76
+ ],
+ [
+ 516,
+ 62,
+ 100
+ ],
+ [
+ 519,
+ 62,
+ 133
+ ],
+ [
+ 521,
+ 62,
+ 134
+ ],
+ [
+ 528,
+ 65,
+ 194
+ ],
+ [
+ 533,
+ 69,
+ 195
+ ],
+ [
+ 537,
+ 76,
+ 255
+ ],
+ [
+ 539,
+ 81,
+ 256
+ ],
+ [
+ 542,
+ 92,
+ 259
+ ],
+ [
+ 546,
+ 106,
+ 316
+ ],
+ [
+ 548,
+ 121,
+ 317
+ ],
+ [
+ 549,
+ 131,
+ 377
+ ],
+ [
+ 549,
+ 140,
+ 378
+ ],
+ [
+ 547,
+ 144,
+ 380
+ ],
+ [
+ 545,
+ 151,
+ 443
+ ],
+ [
+ 541,
+ 160,
+ 443
+ ],
+ [
+ 534,
+ 167,
+ 498
+ ],
+ [
+ 532,
+ 169,
+ 499
+ ],
+ [
+ 526,
+ 172,
+ 560
+ ],
+ [
+ 521,
+ 173,
+ 561
+ ],
+ [
+ 518,
+ 173,
+ 564
+ ],
+ [
+ 514,
+ 173,
+ 621
+ ],
+ [
+ 507,
+ 173,
+ 622
+ ],
+ [
+ 497,
+ 171,
+ 682
+ ],
+ [
+ 484,
+ 165,
+ 683
+ ],
+ [
+ 480,
+ 163,
+ 685
+ ],
+ [
+ 468,
+ 154,
+ 742
+ ],
+ [
+ 459,
+ 145,
+ 743
+ ],
+ [
+ 455,
+ 138,
+ 808
+ ],
+ [
+ 453,
+ 127,
+ 809
+ ],
+ [
+ 452,
+ 116,
+ 865
+ ],
+ [
+ 452,
+ 110,
+ 866
+ ],
+ [
+ 455,
+ 101,
+ 868
+ ],
+ [
+ 456,
+ 98,
+ 926
+ ],
+ [
+ 470,
+ 83,
+ 927
+ ],
+ [
+ 481,
+ 76,
+ 985
+ ],
+ [
+ 484,
+ 74,
+ 987
+ ],
+ [
+ 492,
+ 70,
+ 988
+ ],
+ [
+ 496,
+ 68,
+ 1046
+ ],
+ [
+ 505,
+ 62,
+ 1047
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ },
+ "0x05e2": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 484,
+ 63,
+ 0
+ ],
+ [
+ 485,
+ 63,
+ 47
+ ],
+ [
+ 491,
+ 64,
+ 77
+ ],
+ [
+ 500,
+ 69,
+ 138
+ ],
+ [
+ 511,
+ 77,
+ 139
+ ],
+ [
+ 523,
+ 90,
+ 199
+ ],
+ [
+ 531,
+ 101,
+ 200
+ ],
+ [
+ 537,
+ 116,
+ 263
+ ],
+ [
+ 540,
+ 131,
+ 265
+ ],
+ [
+ 542,
+ 137,
+ 321
+ ],
+ [
+ 544,
+ 150,
+ 322
+ ],
+ [
+ 545,
+ 162,
+ 383
+ ],
+ [
+ 545,
+ 174,
+ 384
+ ],
+ [
+ 543,
+ 180,
+ 388
+ ],
+ [
+ 540,
+ 185,
+ 450
+ ],
+ [
+ 538,
+ 187,
+ 451
+ ],
+ [
+ 534,
+ 189,
+ 452
+ ],
+ [
+ 528,
+ 191,
+ 506
+ ],
+ [
+ 519,
+ 191,
+ 507
+ ],
+ [
+ 516,
+ 191,
+ 508
+ ],
+ [
+ 509,
+ 187,
+ 565
+ ],
+ [
+ 504,
+ 182,
+ 566
+ ],
+ [
+ 500,
+ 175,
+ 627
+ ],
+ [
+ 497,
+ 164,
+ 629
+ ],
+ [
+ 496,
+ 155,
+ 688
+ ],
+ [
+ 496,
+ 144,
+ 689
+ ],
+ [
+ 498,
+ 133,
+ 691
+ ],
+ [
+ 507,
+ 122,
+ 749
+ ],
+ [
+ 520,
+ 108,
+ 750
+ ],
+ [
+ 523,
+ 105,
+ 808
+ ],
+ [
+ 540,
+ 91,
+ 809
+ ],
+ [
+ 546,
+ 87,
+ 812
+ ],
+ [
+ 554,
+ 83,
+ 869
+ ],
+ [
+ 562,
+ 79,
+ 871
+ ],
+ [
+ 564,
+ 76,
+ 937
+ ],
+ [
+ 564,
+ 75,
+ 939
+ ],
+ [
+ 564,
+ 74,
+ 1005
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ },
+ "0x05e3": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 475,
+ 93,
+ 0
+ ],
+ [
+ 475,
+ 92,
+ 67
+ ],
+ [
+ 474,
+ 92,
+ 92
+ ],
+ [
+ 473,
+ 92,
+ 143
+ ],
+ [
+ 470,
+ 89,
+ 144
+ ],
+ [
+ 468,
+ 88,
+ 205
+ ],
+ [
+ 465,
+ 83,
+ 205
+ ],
+ [
+ 464,
+ 82,
+ 261
+ ],
+ [
+ 463,
+ 77,
+ 262
+ ],
+ [
+ 463,
+ 75,
+ 267
+ ],
+ [
+ 465,
+ 73,
+ 322
+ ],
+ [
+ 470,
+ 67,
+ 323
+ ],
+ [
+ 482,
+ 63,
+ 384
+ ],
+ [
+ 490,
+ 58,
+ 386
+ ],
+ [
+ 501,
+ 51,
+ 444
+ ],
+ [
+ 510,
+ 41,
+ 445
+ ],
+ [
+ 514,
+ 34,
+ 505
+ ],
+ [
+ 515,
+ 24,
+ 506
+ ],
+ [
+ 515,
+ 18,
+ 565
+ ],
+ [
+ 511,
+ 14,
+ 569
+ ],
+ [
+ 504,
+ 11,
+ 630
+ ],
+ [
+ 497,
+ 9,
+ 631
+ ],
+ [
+ 494,
+ 9,
+ 691
+ ],
+ [
+ 479,
+ 8,
+ 692
+ ],
+ [
+ 475,
+ 11,
+ 748
+ ],
+ [
+ 469,
+ 17,
+ 749
+ ],
+ [
+ 468,
+ 33,
+ 809
+ ],
+ [
+ 473,
+ 47,
+ 810
+ ],
+ [
+ 482,
+ 64,
+ 869
+ ],
+ [
+ 494,
+ 81,
+ 870
+ ],
+ [
+ 507,
+ 100,
+ 930
+ ],
+ [
+ 513,
+ 111,
+ 931
+ ],
+ [
+ 515,
+ 121,
+ 991
+ ],
+ [
+ 516,
+ 134,
+ 992
+ ],
+ [
+ 516,
+ 143,
+ 1053
+ ],
+ [
+ 508,
+ 152,
+ 1055
+ ],
+ [
+ 496,
+ 161,
+ 1112
+ ],
+ [
+ 491,
+ 164,
+ 1113
+ ],
+ [
+ 485,
+ 166,
+ 1115
+ ],
+ [
+ 478,
+ 168,
+ 1172
+ ],
+ [
+ 467,
+ 169,
+ 1173
+ ],
+ [
+ 457,
+ 169,
+ 1233
+ ],
+ [
+ 453,
+ 167,
+ 1234
+ ],
+ [
+ 450,
+ 165,
+ 1235
+ ],
+ [
+ 446,
+ 159,
+ 1297
+ ],
+ [
+ 444,
+ 154,
+ 1299
+ ],
+ [
+ 443,
+ 150,
+ 1301
+ ],
+ [
+ 443,
+ 141,
+ 1356
+ ],
+ [
+ 445,
+ 135,
+ 1356
+ ],
+ [
+ 454,
+ 126,
+ 1417
+ ],
+ [
+ 472,
+ 117,
+ 1418
+ ],
+ [
+ 490,
+ 112,
+ 1477
+ ],
+ [
+ 502,
+ 109,
+ 1478
+ ],
+ [
+ 506,
+ 107,
+ 1540
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ },
+ "0x05e4": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 439,
+ 67,
+ 0
+ ],
+ [
+ 439,
+ 66,
+ 69
+ ],
+ [
+ 440,
+ 64,
+ 85
+ ],
+ [
+ 442,
+ 63,
+ 134
+ ],
+ [
+ 451,
+ 57,
+ 135
+ ],
+ [
+ 463,
+ 55,
+ 200
+ ],
+ [
+ 475,
+ 53,
+ 200
+ ],
+ [
+ 486,
+ 53,
+ 255
+ ],
+ [
+ 497,
+ 56,
+ 256
+ ],
+ [
+ 507,
+ 64,
+ 315
+ ],
+ [
+ 512,
+ 69,
+ 316
+ ],
+ [
+ 516,
+ 74,
+ 318
+ ],
+ [
+ 519,
+ 82,
+ 377
+ ],
+ [
+ 524,
+ 95,
+ 378
+ ],
+ [
+ 524,
+ 101,
+ 381
+ ],
+ [
+ 525,
+ 109,
+ 438
+ ],
+ [
+ 525,
+ 119,
+ 439
+ ],
+ [
+ 522,
+ 138,
+ 498
+ ],
+ [
+ 515,
+ 153,
+ 499
+ ],
+ [
+ 513,
+ 155,
+ 502
+ ],
+ [
+ 505,
+ 164,
+ 559
+ ],
+ [
+ 500,
+ 171,
+ 560
+ ],
+ [
+ 498,
+ 173,
+ 566
+ ],
+ [
+ 494,
+ 177,
+ 620
+ ],
+ [
+ 485,
+ 183,
+ 621
+ ],
+ [
+ 478,
+ 185,
+ 688
+ ],
+ [
+ 471,
+ 184,
+ 690
+ ],
+ [
+ 469,
+ 182,
+ 693
+ ],
+ [
+ 462,
+ 172,
+ 751
+ ],
+ [
+ 456,
+ 160,
+ 753
+ ],
+ [
+ 453,
+ 157,
+ 757
+ ],
+ [
+ 452,
+ 152,
+ 813
+ ],
+ [
+ 449,
+ 143,
+ 814
+ ],
+ [
+ 449,
+ 137,
+ 874
+ ],
+ [
+ 449,
+ 131,
+ 876
+ ],
+ [
+ 456,
+ 125,
+ 927
+ ],
+ [
+ 464,
+ 120,
+ 927
+ ],
+ [
+ 470,
+ 119,
+ 986
+ ],
+ [
+ 476,
+ 118,
+ 987
+ ],
+ [
+ 484,
+ 117,
+ 1046
+ ],
+ [
+ 485,
+ 117,
+ 1047
+ ],
+ [
+ 486,
+ 117,
+ 1107
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ },
+ "0x05e5": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 507,
+ 123,
+ 0
+ ],
+ [
+ 505,
+ 124,
+ 164
+ ],
+ [
+ 502,
+ 125,
+ 189
+ ],
+ [
+ 501,
+ 126,
+ 234
+ ],
+ [
+ 499,
+ 126,
+ 234
+ ],
+ [
+ 497,
+ 127,
+ 237
+ ],
+ [
+ 496,
+ 128,
+ 301
+ ],
+ [
+ 482,
+ 138,
+ 302
+ ],
+ [
+ 476,
+ 144,
+ 356
+ ],
+ [
+ 470,
+ 153,
+ 356
+ ],
+ [
+ 466,
+ 160,
+ 416
+ ],
+ [
+ 463,
+ 168,
+ 417
+ ],
+ [
+ 461,
+ 177,
+ 484
+ ],
+ [
+ 461,
+ 189,
+ 486
+ ],
+ [
+ 463,
+ 193,
+ 539
+ ],
+ [
+ 464,
+ 195,
+ 540
+ ],
+ [
+ 467,
+ 201,
+ 540
+ ],
+ [
+ 472,
+ 204,
+ 599
+ ],
+ [
+ 478,
+ 208,
+ 600
+ ],
+ [
+ 479,
+ 209,
+ 604
+ ],
+ [
+ 484,
+ 210,
+ 660
+ ],
+ [
+ 492,
+ 210,
+ 661
+ ],
+ [
+ 515,
+ 208,
+ 721
+ ],
+ [
+ 530,
+ 205,
+ 722
+ ],
+ [
+ 538,
+ 196,
+ 782
+ ],
+ [
+ 540,
+ 189,
+ 783
+ ],
+ [
+ 542,
+ 177,
+ 788
+ ],
+ [
+ 543,
+ 174,
+ 843
+ ],
+ [
+ 543,
+ 162,
+ 844
+ ],
+ [
+ 535,
+ 149,
+ 904
+ ],
+ [
+ 517,
+ 135,
+ 905
+ ],
+ [
+ 500,
+ 129,
+ 970
+ ],
+ [
+ 479,
+ 122,
+ 971
+ ],
+ [
+ 467,
+ 117,
+ 1028
+ ],
+ [
+ 456,
+ 110,
+ 1030
+ ],
+ [
+ 450,
+ 105,
+ 1088
+ ],
+ [
+ 449,
+ 100,
+ 1089
+ ],
+ [
+ 448,
+ 94,
+ 1148
+ ],
+ [
+ 447,
+ 85,
+ 1149
+ ],
+ [
+ 453,
+ 73,
+ 1209
+ ],
+ [
+ 460,
+ 65,
+ 1210
+ ],
+ [
+ 473,
+ 55,
+ 1269
+ ],
+ [
+ 489,
+ 42,
+ 1270
+ ],
+ [
+ 501,
+ 32,
+ 1331
+ ],
+ [
+ 510,
+ 28,
+ 1333
+ ],
+ [
+ 523,
+ 25,
+ 1390
+ ],
+ [
+ 532,
+ 24,
+ 1392
+ ],
+ [
+ 535,
+ 24,
+ 1396
+ ],
+ [
+ 536,
+ 24,
+ 1451
+ ],
+ [
+ 537,
+ 26,
+ 1452
+ ],
+ [
+ 535,
+ 44,
+ 1512
+ ],
+ [
+ 530,
+ 52,
+ 1513
+ ],
+ [
+ 522,
+ 59,
+ 1516
+ ],
+ [
+ 506,
+ 66,
+ 1574
+ ],
+ [
+ 486,
+ 71,
+ 1575
+ ],
+ [
+ 439,
+ 71,
+ 1634
+ ],
+ [
+ 416,
+ 72,
+ 1636
+ ],
+ [
+ 408,
+ 72,
+ 1637
+ ],
+ [
+ 393,
+ 72,
+ 1694
+ ],
+ [
+ 386,
+ 71,
+ 1695
+ ],
+ [
+ 384,
+ 68,
+ 1757
+ ],
+ [
+ 384,
+ 67,
+ 1758
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ },
+ "0x05e6": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 458,
+ 51,
+ 0
+ ],
+ [
+ 459,
+ 51,
+ 115
+ ],
+ [
+ 460,
+ 49,
+ 139
+ ],
+ [
+ 462,
+ 47,
+ 195
+ ],
+ [
+ 469,
+ 43,
+ 195
+ ],
+ [
+ 475,
+ 40,
+ 255
+ ],
+ [
+ 485,
+ 36,
+ 256
+ ],
+ [
+ 495,
+ 33,
+ 316
+ ],
+ [
+ 510,
+ 33,
+ 317
+ ],
+ [
+ 525,
+ 36,
+ 378
+ ],
+ [
+ 528,
+ 40,
+ 379
+ ],
+ [
+ 530,
+ 47,
+ 437
+ ],
+ [
+ 532,
+ 60,
+ 438
+ ],
+ [
+ 532,
+ 63,
+ 442
+ ],
+ [
+ 534,
+ 75,
+ 497
+ ],
+ [
+ 533,
+ 84,
+ 499
+ ],
+ [
+ 530,
+ 87,
+ 558
+ ],
+ [
+ 528,
+ 91,
+ 559
+ ],
+ [
+ 525,
+ 93,
+ 562
+ ],
+ [
+ 524,
+ 95,
+ 619
+ ],
+ [
+ 519,
+ 100,
+ 620
+ ],
+ [
+ 512,
+ 104,
+ 686
+ ],
+ [
+ 511,
+ 105,
+ 687
+ ],
+ [
+ 510,
+ 106,
+ 691
+ ],
+ [
+ 509,
+ 106,
+ 742
+ ],
+ [
+ 507,
+ 107,
+ 746
+ ],
+ [
+ 506,
+ 108,
+ 803
+ ],
+ [
+ 504,
+ 109,
+ 804
+ ],
+ [
+ 503,
+ 109,
+ 864
+ ],
+ [
+ 501,
+ 110,
+ 865
+ ],
+ [
+ 500,
+ 110,
+ 925
+ ],
+ [
+ 499,
+ 110,
+ 985
+ ],
+ [
+ 498,
+ 111,
+ 988
+ ],
+ [
+ 499,
+ 111,
+ 1227
+ ],
+ [
+ 502,
+ 111,
+ 1286
+ ],
+ [
+ 508,
+ 111,
+ 1287
+ ],
+ [
+ 512,
+ 113,
+ 1349
+ ],
+ [
+ 516,
+ 119,
+ 1351
+ ],
+ [
+ 516,
+ 121,
+ 1355
+ ],
+ [
+ 519,
+ 129,
+ 1408
+ ],
+ [
+ 522,
+ 137,
+ 1408
+ ],
+ [
+ 522,
+ 149,
+ 1469
+ ],
+ [
+ 519,
+ 158,
+ 1469
+ ],
+ [
+ 513,
+ 169,
+ 1532
+ ],
+ [
+ 507,
+ 178,
+ 1534
+ ],
+ [
+ 497,
+ 187,
+ 1590
+ ],
+ [
+ 489,
+ 189,
+ 1591
+ ],
+ [
+ 485,
+ 190,
+ 1594
+ ],
+ [
+ 483,
+ 190,
+ 1655
+ ],
+ [
+ 469,
+ 189,
+ 1656
+ ],
+ [
+ 453,
+ 182,
+ 1712
+ ],
+ [
+ 449,
+ 179,
+ 1713
+ ],
+ [
+ 447,
+ 176,
+ 1715
+ ],
+ [
+ 444,
+ 175,
+ 1772
+ ],
+ [
+ 443,
+ 175,
+ 1773
+ ],
+ [
+ 443,
+ 174,
+ 1804
+ ],
+ [
+ 441,
+ 171,
+ 1834
+ ],
+ [
+ 441,
+ 170,
+ 2227
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ },
+ "0x05e7": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 441,
+ 77,
+ 0
+ ],
+ [
+ 442,
+ 76,
+ 76
+ ],
+ [
+ 442,
+ 75,
+ 100
+ ],
+ [
+ 442,
+ 73,
+ 142
+ ],
+ [
+ 444,
+ 71,
+ 143
+ ],
+ [
+ 445,
+ 69,
+ 171
+ ],
+ [
+ 451,
+ 63,
+ 202
+ ],
+ [
+ 452,
+ 60,
+ 203
+ ],
+ [
+ 455,
+ 57,
+ 262
+ ],
+ [
+ 463,
+ 53,
+ 263
+ ],
+ [
+ 468,
+ 51,
+ 323
+ ],
+ [
+ 473,
+ 49,
+ 324
+ ],
+ [
+ 480,
+ 48,
+ 384
+ ],
+ [
+ 492,
+ 48,
+ 385
+ ],
+ [
+ 498,
+ 48,
+ 387
+ ],
+ [
+ 506,
+ 48,
+ 449
+ ],
+ [
+ 510,
+ 52,
+ 450
+ ],
+ [
+ 513,
+ 57,
+ 505
+ ],
+ [
+ 516,
+ 65,
+ 506
+ ],
+ [
+ 517,
+ 68,
+ 508
+ ],
+ [
+ 519,
+ 75,
+ 566
+ ],
+ [
+ 520,
+ 81,
+ 567
+ ],
+ [
+ 520,
+ 85,
+ 628
+ ],
+ [
+ 521,
+ 92,
+ 629
+ ],
+ [
+ 521,
+ 93,
+ 689
+ ],
+ [
+ 521,
+ 94,
+ 1164
+ ]
+ ],
+ [
+ [
+ 480,
+ 79,
+ 1560
+ ],
+ [
+ 480,
+ 80,
+ 1631
+ ],
+ [
+ 479,
+ 84,
+ 1661
+ ],
+ [
+ 476,
+ 94,
+ 1722
+ ],
+ [
+ 473,
+ 110,
+ 1723
+ ],
+ [
+ 471,
+ 120,
+ 1784
+ ],
+ [
+ 467,
+ 133,
+ 1785
+ ],
+ [
+ 464,
+ 144,
+ 1844
+ ],
+ [
+ 461,
+ 155,
+ 1845
+ ],
+ [
+ 457,
+ 163,
+ 1907
+ ],
+ [
+ 453,
+ 172,
+ 1909
+ ],
+ [
+ 451,
+ 177,
+ 1971
+ ],
+ [
+ 450,
+ 179,
+ 1971
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ },
+ "0x05e8": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 389,
+ 81,
+ 0
+ ],
+ [
+ 389,
+ 80,
+ 227
+ ],
+ [
+ 389,
+ 79,
+ 254
+ ],
+ [
+ 389,
+ 78,
+ 300
+ ],
+ [
+ 391,
+ 74,
+ 362
+ ],
+ [
+ 393,
+ 72,
+ 363
+ ],
+ [
+ 395,
+ 70,
+ 364
+ ],
+ [
+ 395,
+ 69,
+ 423
+ ],
+ [
+ 401,
+ 65,
+ 425
+ ],
+ [
+ 405,
+ 62,
+ 427
+ ],
+ [
+ 409,
+ 60,
+ 484
+ ],
+ [
+ 421,
+ 56,
+ 485
+ ],
+ [
+ 428,
+ 55,
+ 544
+ ],
+ [
+ 435,
+ 55,
+ 545
+ ],
+ [
+ 441,
+ 55,
+ 547
+ ],
+ [
+ 452,
+ 57,
+ 605
+ ],
+ [
+ 464,
+ 62,
+ 606
+ ],
+ [
+ 471,
+ 67,
+ 666
+ ],
+ [
+ 477,
+ 72,
+ 667
+ ],
+ [
+ 481,
+ 79,
+ 727
+ ],
+ [
+ 485,
+ 88,
+ 729
+ ],
+ [
+ 486,
+ 92,
+ 731
+ ],
+ [
+ 488,
+ 98,
+ 791
+ ],
+ [
+ 489,
+ 106,
+ 792
+ ],
+ [
+ 490,
+ 108,
+ 794
+ ],
+ [
+ 490,
+ 113,
+ 845
+ ],
+ [
+ 491,
+ 117,
+ 847
+ ],
+ [
+ 491,
+ 121,
+ 878
+ ],
+ [
+ 491,
+ 124,
+ 879
+ ],
+ [
+ 491,
+ 131,
+ 939
+ ],
+ [
+ 492,
+ 138,
+ 940
+ ],
+ [
+ 492,
+ 146,
+ 1000
+ ],
+ [
+ 492,
+ 149,
+ 1001
+ ],
+ [
+ 491,
+ 156,
+ 1002
+ ],
+ [
+ 490,
+ 158,
+ 1061
+ ],
+ [
+ 486,
+ 164,
+ 1062
+ ],
+ [
+ 484,
+ 170,
+ 1066
+ ],
+ [
+ 483,
+ 172,
+ 1123
+ ],
+ [
+ 481,
+ 178,
+ 1124
+ ],
+ [
+ 480,
+ 181,
+ 1184
+ ],
+ [
+ 479,
+ 182,
+ 1186
+ ],
+ [
+ 478,
+ 182,
+ 1187
+ ],
+ [
+ 478,
+ 183,
+ 1245
+ ],
+ [
+ 477,
+ 184,
+ 1246
+ ],
+ [
+ 476,
+ 185,
+ 1307
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ },
+ "0x05e9": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 491,
+ 116,
+ 0
+ ],
+ [
+ 492,
+ 116,
+ 124
+ ],
+ [
+ 493,
+ 116,
+ 164
+ ],
+ [
+ 494,
+ 116,
+ 197
+ ],
+ [
+ 496,
+ 116,
+ 198
+ ],
+ [
+ 498,
+ 115,
+ 257
+ ],
+ [
+ 501,
+ 115,
+ 258
+ ],
+ [
+ 503,
+ 114,
+ 259
+ ],
+ [
+ 508,
+ 113,
+ 318
+ ],
+ [
+ 509,
+ 113,
+ 319
+ ],
+ [
+ 513,
+ 112,
+ 323
+ ],
+ [
+ 516,
+ 111,
+ 380
+ ],
+ [
+ 524,
+ 108,
+ 381
+ ],
+ [
+ 532,
+ 101,
+ 442
+ ],
+ [
+ 536,
+ 98,
+ 444
+ ],
+ [
+ 550,
+ 86,
+ 503
+ ],
+ [
+ 555,
+ 83,
+ 504
+ ],
+ [
+ 560,
+ 78,
+ 507
+ ],
+ [
+ 563,
+ 73,
+ 565
+ ],
+ [
+ 567,
+ 65,
+ 566
+ ],
+ [
+ 570,
+ 59,
+ 626
+ ],
+ [
+ 573,
+ 54,
+ 627
+ ],
+ [
+ 573,
+ 52,
+ 686
+ ],
+ [
+ 573,
+ 51,
+ 687
+ ],
+ [
+ 572,
+ 51,
+ 748
+ ],
+ [
+ 567,
+ 51,
+ 749
+ ],
+ [
+ 559,
+ 51,
+ 808
+ ],
+ [
+ 550,
+ 52,
+ 809
+ ],
+ [
+ 539,
+ 54,
+ 870
+ ],
+ [
+ 530,
+ 58,
+ 871
+ ],
+ [
+ 522,
+ 62,
+ 931
+ ],
+ [
+ 515,
+ 65,
+ 932
+ ],
+ [
+ 507,
+ 72,
+ 997
+ ],
+ [
+ 499,
+ 79,
+ 1000
+ ],
+ [
+ 495,
+ 83,
+ 1059
+ ],
+ [
+ 486,
+ 95,
+ 1061
+ ],
+ [
+ 484,
+ 107,
+ 1113
+ ],
+ [
+ 480,
+ 117,
+ 1114
+ ],
+ [
+ 477,
+ 126,
+ 1173
+ ],
+ [
+ 476,
+ 142,
+ 1174
+ ],
+ [
+ 477,
+ 151,
+ 1236
+ ],
+ [
+ 479,
+ 157,
+ 1239
+ ],
+ [
+ 480,
+ 159,
+ 1295
+ ],
+ [
+ 490,
+ 170,
+ 1296
+ ],
+ [
+ 498,
+ 173,
+ 1357
+ ],
+ [
+ 511,
+ 174,
+ 1357
+ ],
+ [
+ 518,
+ 174,
+ 1416
+ ],
+ [
+ 532,
+ 174,
+ 1417
+ ],
+ [
+ 543,
+ 172,
+ 1482
+ ],
+ [
+ 551,
+ 169,
+ 1483
+ ],
+ [
+ 555,
+ 167,
+ 1484
+ ],
+ [
+ 557,
+ 166,
+ 1541
+ ],
+ [
+ 562,
+ 165,
+ 1543
+ ],
+ [
+ 570,
+ 163,
+ 1599
+ ],
+ [
+ 571,
+ 163,
+ 1600
+ ],
+ [
+ 571,
+ 162,
+ 1660
+ ],
+ [
+ 572,
+ 162,
+ 1661
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ },
+ "0x05ea": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 471,
+ 66,
+ 0
+ ],
+ [
+ 471,
+ 69,
+ 63
+ ],
+ [
+ 471,
+ 72,
+ 64
+ ],
+ [
+ 471,
+ 77,
+ 127
+ ],
+ [
+ 472,
+ 81,
+ 128
+ ],
+ [
+ 474,
+ 90,
+ 131
+ ],
+ [
+ 476,
+ 99,
+ 189
+ ],
+ [
+ 476,
+ 110,
+ 190
+ ],
+ [
+ 476,
+ 113,
+ 249
+ ],
+ [
+ 474,
+ 130,
+ 251
+ ],
+ [
+ 473,
+ 132,
+ 252
+ ],
+ [
+ 472,
+ 137,
+ 302
+ ],
+ [
+ 471,
+ 140,
+ 303
+ ],
+ [
+ 469,
+ 143,
+ 307
+ ],
+ [
+ 466,
+ 149,
+ 362
+ ],
+ [
+ 466,
+ 151,
+ 363
+ ],
+ [
+ 462,
+ 157,
+ 364
+ ],
+ [
+ 460,
+ 161,
+ 424
+ ],
+ [
+ 456,
+ 163,
+ 427
+ ],
+ [
+ 449,
+ 167,
+ 489
+ ],
+ [
+ 443,
+ 170,
+ 489
+ ],
+ [
+ 442,
+ 170,
+ 492
+ ],
+ [
+ 429,
+ 172,
+ 549
+ ],
+ [
+ 422,
+ 173,
+ 606
+ ],
+ [
+ 420,
+ 173,
+ 607
+ ],
+ [
+ 417,
+ 174,
+ 612
+ ],
+ [
+ 415,
+ 174,
+ 667
+ ],
+ [
+ 410,
+ 175,
+ 668
+ ],
+ [
+ 408,
+ 175,
+ 728
+ ],
+ [
+ 407,
+ 176,
+ 729
+ ],
+ [
+ 406,
+ 176,
+ 820
+ ]
+ ],
+ [
+ [
+ 469,
+ 65,
+ 1895
+ ],
+ [
+ 470,
+ 65,
+ 1940
+ ],
+ [
+ 472,
+ 62,
+ 1941
+ ],
+ [
+ 477,
+ 60,
+ 2002
+ ],
+ [
+ 482,
+ 58,
+ 2003
+ ],
+ [
+ 492,
+ 56,
+ 2063
+ ],
+ [
+ 506,
+ 55,
+ 2064
+ ],
+ [
+ 523,
+ 55,
+ 2123
+ ],
+ [
+ 538,
+ 60,
+ 2124
+ ],
+ [
+ 543,
+ 62,
+ 2187
+ ],
+ [
+ 550,
+ 70,
+ 2189
+ ],
+ [
+ 553,
+ 74,
+ 2191
+ ],
+ [
+ 554,
+ 77,
+ 2245
+ ],
+ [
+ 559,
+ 86,
+ 2246
+ ],
+ [
+ 561,
+ 91,
+ 2306
+ ],
+ [
+ 564,
+ 98,
+ 2307
+ ],
+ [
+ 566,
+ 103,
+ 2308
+ ],
+ [
+ 568,
+ 110,
+ 2367
+ ],
+ [
+ 569,
+ 116,
+ 2368
+ ],
+ [
+ 569,
+ 118,
+ 2428
+ ],
+ [
+ 569,
+ 124,
+ 2430
+ ],
+ [
+ 570,
+ 130,
+ 2494
+ ],
+ [
+ 570,
+ 131,
+ 2494
+ ],
+ [
+ 570,
+ 133,
+ 2555
+ ],
+ [
+ 570,
+ 135,
+ 2556
+ ],
+ [
+ 570,
+ 137,
+ 2613
+ ],
+ [
+ 570,
+ 138,
+ 2615
+ ],
+ [
+ 570,
+ 139,
+ 2671
+ ],
+ [
+ 570,
+ 142,
+ 2672
+ ],
+ [
+ 569,
+ 146,
+ 2733
+ ],
+ [
+ 569,
+ 150,
+ 2734
+ ],
+ [
+ 568,
+ 154,
+ 2794
+ ],
+ [
+ 568,
+ 156,
+ 2794
+ ],
+ [
+ 568,
+ 158,
+ 2795
+ ],
+ [
+ 568,
+ 161,
+ 2855
+ ],
+ [
+ 567,
+ 164,
+ 2857
+ ],
+ [
+ 567,
+ 166,
+ 2916
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ },
+ "0x20aa": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 593,
+ 121,
+ 0
+ ],
+ [
+ 593,
+ 123,
+ 53
+ ],
+ [
+ 593,
+ 124,
+ 83
+ ],
+ [
+ 593,
+ 126,
+ 85
+ ],
+ [
+ 593,
+ 130,
+ 143
+ ],
+ [
+ 593,
+ 141,
+ 144
+ ],
+ [
+ 591,
+ 153,
+ 206
+ ],
+ [
+ 587,
+ 164,
+ 206
+ ],
+ [
+ 581,
+ 173,
+ 265
+ ],
+ [
+ 576,
+ 177,
+ 266
+ ],
+ [
+ 571,
+ 180,
+ 267
+ ],
+ [
+ 560,
+ 184,
+ 326
+ ],
+ [
+ 544,
+ 189,
+ 327
+ ],
+ [
+ 532,
+ 191,
+ 388
+ ],
+ [
+ 517,
+ 191,
+ 389
+ ],
+ [
+ 507,
+ 189,
+ 449
+ ],
+ [
+ 492,
+ 186,
+ 450
+ ],
+ [
+ 487,
+ 184,
+ 451
+ ],
+ [
+ 482,
+ 178,
+ 518
+ ],
+ [
+ 474,
+ 171,
+ 519
+ ],
+ [
+ 471,
+ 165,
+ 571
+ ],
+ [
+ 470,
+ 159,
+ 572
+ ],
+ [
+ 470,
+ 147,
+ 634
+ ],
+ [
+ 471,
+ 137,
+ 635
+ ],
+ [
+ 472,
+ 132,
+ 636
+ ],
+ [
+ 473,
+ 128,
+ 694
+ ],
+ [
+ 476,
+ 123,
+ 695
+ ],
+ [
+ 476,
+ 122,
+ 756
+ ],
+ [
+ 476,
+ 121,
+ 757
+ ]
+ ],
+ [
+ [
+ 537,
+ 136,
+ 2303
+ ],
+ [
+ 537,
+ 134,
+ 2379
+ ],
+ [
+ 537,
+ 132,
+ 2395
+ ],
+ [
+ 537,
+ 130,
+ 2453
+ ],
+ [
+ 537,
+ 118,
+ 2453
+ ],
+ [
+ 534,
+ 95,
+ 2519
+ ],
+ [
+ 530,
+ 81,
+ 2520
+ ],
+ [
+ 525,
+ 69,
+ 2576
+ ],
+ [
+ 523,
+ 66,
+ 2577
+ ],
+ [
+ 521,
+ 63,
+ 2579
+ ],
+ [
+ 519,
+ 60,
+ 2636
+ ],
+ [
+ 508,
+ 56,
+ 2637
+ ],
+ [
+ 503,
+ 55,
+ 2696
+ ],
+ [
+ 492,
+ 55,
+ 2697
+ ],
+ [
+ 487,
+ 55,
+ 2700
+ ],
+ [
+ 481,
+ 55,
+ 2756
+ ],
+ [
+ 467,
+ 58,
+ 2757
+ ],
+ [
+ 453,
+ 65,
+ 2818
+ ],
+ [
+ 439,
+ 74,
+ 2819
+ ],
+ [
+ 429,
+ 82,
+ 2879
+ ],
+ [
+ 423,
+ 86,
+ 2880
+ ],
+ [
+ 420,
+ 93,
+ 2943
+ ],
+ [
+ 417,
+ 102,
+ 2945
+ ],
+ [
+ 417,
+ 104,
+ 2948
+ ],
+ [
+ 415,
+ 109,
+ 3006
+ ],
+ [
+ 415,
+ 119,
+ 3007
+ ],
+ [
+ 415,
+ 124,
+ 3011
+ ],
+ [
+ 415,
+ 127,
+ 3062
+ ],
+ [
+ 415,
+ 136,
+ 3065
+ ],
+ [
+ 415,
+ 139,
+ 3128
+ ],
+ [
+ 415,
+ 140,
+ 3128
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ }
+}
diff --git a/tests/auto/inputpanel/data/inputpanel/unipen_data_japanese.js b/tests/auto/inputpanel/data/inputpanel/unipen_data_japanese.js
new file mode 100644
index 00000000..bef4fc56
--- /dev/null
+++ b/tests/auto/inputpanel/data/inputpanel/unipen_data_japanese.js
@@ -0,0 +1,2503 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+var unipenData = {
+ "0x65e5": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 113,
+ 59,
+ 0
+ ],
+ [
+ 113,
+ 64,
+ 56
+ ],
+ [
+ 113,
+ 71,
+ 86
+ ],
+ [
+ 113,
+ 78,
+ 92
+ ],
+ [
+ 113,
+ 85,
+ 148
+ ],
+ [
+ 113,
+ 95,
+ 149
+ ],
+ [
+ 113,
+ 109,
+ 212
+ ],
+ [
+ 111,
+ 127,
+ 213
+ ],
+ [
+ 111,
+ 131,
+ 268
+ ],
+ [
+ 111,
+ 143,
+ 269
+ ],
+ [
+ 110,
+ 150,
+ 330
+ ],
+ [
+ 109,
+ 156,
+ 331
+ ],
+ [
+ 109,
+ 160,
+ 391
+ ],
+ [
+ 109,
+ 164,
+ 392
+ ],
+ [
+ 109,
+ 167,
+ 453
+ ],
+ [
+ 109,
+ 170,
+ 455
+ ],
+ [
+ 109,
+ 171,
+ 512
+ ],
+ [
+ 109,
+ 172,
+ 513
+ ],
+ [
+ 109,
+ 173,
+ 516
+ ],
+ [
+ 109,
+ 175,
+ 573
+ ],
+ [
+ 109,
+ 177,
+ 634
+ ],
+ [
+ 109,
+ 178,
+ 636
+ ],
+ [
+ 110,
+ 179,
+ 698
+ ],
+ [
+ 110,
+ 180,
+ 701
+ ]
+ ],
+ [
+ [
+ 116,
+ 58,
+ 1545
+ ],
+ [
+ 117,
+ 58,
+ 1612
+ ],
+ [
+ 130,
+ 57,
+ 1640
+ ],
+ [
+ 153,
+ 58,
+ 1699
+ ],
+ [
+ 165,
+ 59,
+ 1700
+ ],
+ [
+ 187,
+ 60,
+ 1764
+ ],
+ [
+ 195,
+ 62,
+ 1766
+ ],
+ [
+ 200,
+ 63,
+ 1820
+ ],
+ [
+ 202,
+ 63,
+ 1821
+ ],
+ [
+ 203,
+ 63,
+ 2004
+ ],
+ [
+ 203,
+ 65,
+ 2061
+ ],
+ [
+ 203,
+ 69,
+ 2061
+ ],
+ [
+ 204,
+ 72,
+ 2124
+ ],
+ [
+ 204,
+ 87,
+ 2125
+ ],
+ [
+ 203,
+ 90,
+ 2183
+ ],
+ [
+ 200,
+ 103,
+ 2185
+ ],
+ [
+ 198,
+ 115,
+ 2188
+ ],
+ [
+ 198,
+ 119,
+ 2248
+ ],
+ [
+ 197,
+ 139,
+ 2248
+ ],
+ [
+ 196,
+ 148,
+ 2304
+ ],
+ [
+ 195,
+ 158,
+ 2307
+ ],
+ [
+ 195,
+ 160,
+ 2308
+ ],
+ [
+ 195,
+ 165,
+ 2364
+ ],
+ [
+ 195,
+ 173,
+ 2365
+ ],
+ [
+ 194,
+ 179,
+ 2425
+ ],
+ [
+ 194,
+ 181,
+ 2426
+ ],
+ [
+ 194,
+ 185,
+ 2427
+ ],
+ [
+ 194,
+ 187,
+ 2485
+ ],
+ [
+ 193,
+ 190,
+ 2486
+ ],
+ [
+ 193,
+ 189,
+ 2740
+ ]
+ ],
+ [
+ [
+ 113,
+ 123,
+ 3457
+ ],
+ [
+ 114,
+ 123,
+ 3517
+ ],
+ [
+ 120,
+ 123,
+ 3545
+ ],
+ [
+ 127,
+ 123,
+ 3547
+ ],
+ [
+ 131,
+ 123,
+ 3610
+ ],
+ [
+ 166,
+ 126,
+ 3611
+ ],
+ [
+ 185,
+ 127,
+ 3669
+ ],
+ [
+ 194,
+ 128,
+ 3670
+ ],
+ [
+ 195,
+ 128,
+ 3731
+ ]
+ ],
+ [
+ [
+ 110,
+ 180,
+ 4616
+ ],
+ [
+ 110,
+ 181,
+ 4683
+ ],
+ [
+ 115,
+ 181,
+ 4701
+ ],
+ [
+ 122,
+ 182,
+ 4765
+ ],
+ [
+ 143,
+ 182,
+ 4765
+ ],
+ [
+ 174,
+ 183,
+ 4820
+ ],
+ [
+ 179,
+ 184,
+ 4821
+ ],
+ [
+ 181,
+ 184,
+ 4824
+ ],
+ [
+ 187,
+ 184,
+ 4882
+ ],
+ [
+ 188,
+ 184,
+ 4972
+ ],
+ [
+ 190,
+ 184,
+ 5036
+ ],
+ [
+ 191,
+ 184,
+ 5096
+ ],
+ [
+ 192,
+ 184,
+ 5098
+ ],
+ [
+ 193,
+ 184,
+ 5157
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ },
+ "0x672c": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 314,
+ 61,
+ 0
+ ],
+ [
+ 315,
+ 61,
+ 71
+ ],
+ [
+ 319,
+ 61,
+ 95
+ ],
+ [
+ 329,
+ 61,
+ 154
+ ],
+ [
+ 341,
+ 61,
+ 155
+ ],
+ [
+ 355,
+ 61,
+ 215
+ ],
+ [
+ 381,
+ 61,
+ 216
+ ],
+ [
+ 398,
+ 60,
+ 277
+ ],
+ [
+ 402,
+ 60,
+ 277
+ ],
+ [
+ 413,
+ 60,
+ 279
+ ],
+ [
+ 424,
+ 60,
+ 340
+ ],
+ [
+ 436,
+ 61,
+ 342
+ ],
+ [
+ 437,
+ 61,
+ 343
+ ],
+ [
+ 443,
+ 61,
+ 398
+ ],
+ [
+ 449,
+ 62,
+ 399
+ ],
+ [
+ 452,
+ 63,
+ 462
+ ],
+ [
+ 453,
+ 63,
+ 599
+ ],
+ [
+ 452,
+ 62,
+ 871
+ ]
+ ],
+ [
+ [
+ 386,
+ 40,
+ 2172
+ ],
+ [
+ 386,
+ 41,
+ 2327
+ ],
+ [
+ 386,
+ 45,
+ 2351
+ ],
+ [
+ 386,
+ 48,
+ 2415
+ ],
+ [
+ 386,
+ 51,
+ 2418
+ ],
+ [
+ 386,
+ 54,
+ 2423
+ ],
+ [
+ 386,
+ 60,
+ 2479
+ ],
+ [
+ 384,
+ 69,
+ 2480
+ ],
+ [
+ 384,
+ 72,
+ 2537
+ ],
+ [
+ 384,
+ 89,
+ 2539
+ ],
+ [
+ 383,
+ 102,
+ 2596
+ ],
+ [
+ 382,
+ 113,
+ 2597
+ ],
+ [
+ 382,
+ 117,
+ 2599
+ ],
+ [
+ 381,
+ 123,
+ 2657
+ ],
+ [
+ 380,
+ 130,
+ 2658
+ ],
+ [
+ 380,
+ 135,
+ 2718
+ ],
+ [
+ 380,
+ 143,
+ 2718
+ ],
+ [
+ 380,
+ 147,
+ 2779
+ ],
+ [
+ 380,
+ 151,
+ 2780
+ ],
+ [
+ 380,
+ 157,
+ 2840
+ ],
+ [
+ 380,
+ 162,
+ 2841
+ ],
+ [
+ 380,
+ 163,
+ 2900
+ ],
+ [
+ 380,
+ 165,
+ 2901
+ ],
+ [
+ 380,
+ 168,
+ 2968
+ ],
+ [
+ 380,
+ 170,
+ 2970
+ ],
+ [
+ 380,
+ 173,
+ 3021
+ ],
+ [
+ 380,
+ 174,
+ 3082
+ ],
+ [
+ 380,
+ 175,
+ 3087
+ ],
+ [
+ 380,
+ 176,
+ 3143
+ ],
+ [
+ 380,
+ 177,
+ 3204
+ ],
+ [
+ 380,
+ 178,
+ 3266
+ ]
+ ],
+ [
+ [
+ 386,
+ 66,
+ 4292
+ ],
+ [
+ 383,
+ 68,
+ 4355
+ ],
+ [
+ 380,
+ 71,
+ 4386
+ ],
+ [
+ 374,
+ 78,
+ 4391
+ ],
+ [
+ 366,
+ 85,
+ 4444
+ ],
+ [
+ 360,
+ 88,
+ 4445
+ ],
+ [
+ 357,
+ 91,
+ 4446
+ ],
+ [
+ 346,
+ 97,
+ 4505
+ ],
+ [
+ 345,
+ 98,
+ 4506
+ ],
+ [
+ 328,
+ 105,
+ 4565
+ ],
+ [
+ 323,
+ 108,
+ 4566
+ ],
+ [
+ 321,
+ 109,
+ 4626
+ ],
+ [
+ 322,
+ 108,
+ 4959
+ ]
+ ],
+ [
+ [
+ 382,
+ 63,
+ 5579
+ ],
+ [
+ 383,
+ 64,
+ 5630
+ ],
+ [
+ 385,
+ 67,
+ 5631
+ ],
+ [
+ 387,
+ 71,
+ 5692
+ ],
+ [
+ 391,
+ 80,
+ 5693
+ ],
+ [
+ 394,
+ 85,
+ 5695
+ ],
+ [
+ 397,
+ 90,
+ 5750
+ ],
+ [
+ 403,
+ 99,
+ 5751
+ ],
+ [
+ 407,
+ 102,
+ 5811
+ ],
+ [
+ 416,
+ 108,
+ 5812
+ ],
+ [
+ 417,
+ 110,
+ 5815
+ ],
+ [
+ 424,
+ 114,
+ 5872
+ ],
+ [
+ 427,
+ 115,
+ 5873
+ ],
+ [
+ 433,
+ 118,
+ 5935
+ ],
+ [
+ 436,
+ 121,
+ 5936
+ ],
+ [
+ 439,
+ 123,
+ 5997
+ ],
+ [
+ 440,
+ 123,
+ 6111
+ ]
+ ],
+ [
+ [
+ 321,
+ 131,
+ 7508
+ ],
+ [
+ 323,
+ 131,
+ 7590
+ ],
+ [
+ 325,
+ 131,
+ 7611
+ ],
+ [
+ 341,
+ 131,
+ 7661
+ ],
+ [
+ 369,
+ 133,
+ 7662
+ ],
+ [
+ 387,
+ 134,
+ 7723
+ ],
+ [
+ 397,
+ 135,
+ 7723
+ ],
+ [
+ 404,
+ 135,
+ 7784
+ ],
+ [
+ 406,
+ 135,
+ 7785
+ ],
+ [
+ 407,
+ 135,
+ 7880
+ ],
+ [
+ 408,
+ 135,
+ 8103
+ ],
+ [
+ 409,
+ 135,
+ 8147
+ ],
+ [
+ 410,
+ 135,
+ 8148
+ ],
+ [
+ 414,
+ 135,
+ 8208
+ ],
+ [
+ 416,
+ 135,
+ 8271
+ ],
+ [
+ 418,
+ 135,
+ 8330
+ ],
+ [
+ 419,
+ 135,
+ 8330
+ ],
+ [
+ 421,
+ 135,
+ 8391
+ ],
+ [
+ 422,
+ 135,
+ 8453
+ ],
+ [
+ 423,
+ 135,
+ 8456
+ ],
+ [
+ 424,
+ 135,
+ 8516
+ ],
+ [
+ 425,
+ 135,
+ 8519
+ ],
+ [
+ 426,
+ 135,
+ 8735
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ },
+ "0x8a9e": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 513,
+ 47,
+ 0
+ ],
+ [
+ 514,
+ 47,
+ 83
+ ],
+ [
+ 515,
+ 47,
+ 106
+ ],
+ [
+ 517,
+ 47,
+ 148
+ ],
+ [
+ 524,
+ 48,
+ 149
+ ],
+ [
+ 531,
+ 48,
+ 209
+ ],
+ [
+ 538,
+ 49,
+ 210
+ ],
+ [
+ 542,
+ 49,
+ 210
+ ],
+ [
+ 548,
+ 50,
+ 276
+ ],
+ [
+ 556,
+ 51,
+ 276
+ ],
+ [
+ 557,
+ 51,
+ 331
+ ],
+ [
+ 559,
+ 51,
+ 398
+ ],
+ [
+ 563,
+ 51,
+ 399
+ ]
+ ],
+ [
+ [
+ 509,
+ 76,
+ 1311
+ ],
+ [
+ 510,
+ 76,
+ 1365
+ ],
+ [
+ 512,
+ 76,
+ 1395
+ ],
+ [
+ 519,
+ 75,
+ 1396
+ ],
+ [
+ 522,
+ 75,
+ 1450
+ ],
+ [
+ 526,
+ 74,
+ 1451
+ ],
+ [
+ 530,
+ 74,
+ 1451
+ ],
+ [
+ 536,
+ 74,
+ 1511
+ ],
+ [
+ 545,
+ 74,
+ 1511
+ ],
+ [
+ 547,
+ 74,
+ 1514
+ ],
+ [
+ 552,
+ 74,
+ 1572
+ ],
+ [
+ 554,
+ 74,
+ 1633
+ ],
+ [
+ 557,
+ 74,
+ 1634
+ ],
+ [
+ 559,
+ 74,
+ 1694
+ ],
+ [
+ 560,
+ 73,
+ 1695
+ ],
+ [
+ 561,
+ 73,
+ 1834
+ ],
+ [
+ 562,
+ 73,
+ 1875
+ ],
+ [
+ 563,
+ 73,
+ 1876
+ ],
+ [
+ 564,
+ 73,
+ 1935
+ ]
+ ],
+ [
+ [
+ 509,
+ 97,
+ 4408
+ ],
+ [
+ 510,
+ 97,
+ 4480
+ ],
+ [
+ 514,
+ 96,
+ 4483
+ ],
+ [
+ 518,
+ 96,
+ 4512
+ ],
+ [
+ 526,
+ 96,
+ 4569
+ ],
+ [
+ 528,
+ 96,
+ 4570
+ ],
+ [
+ 538,
+ 95,
+ 4629
+ ],
+ [
+ 551,
+ 95,
+ 4630
+ ],
+ [
+ 554,
+ 95,
+ 4689
+ ],
+ [
+ 556,
+ 95,
+ 4690
+ ],
+ [
+ 557,
+ 95,
+ 4752
+ ],
+ [
+ 558,
+ 95,
+ 4811
+ ],
+ [
+ 559,
+ 95,
+ 4811
+ ],
+ [
+ 560,
+ 94,
+ 4875
+ ],
+ [
+ 561,
+ 94,
+ 4877
+ ],
+ [
+ 562,
+ 94,
+ 4937
+ ]
+ ],
+ [
+ [
+ 512,
+ 120,
+ 8559
+ ],
+ [
+ 512,
+ 121,
+ 8626
+ ],
+ [
+ 512,
+ 123,
+ 8651
+ ],
+ [
+ 512,
+ 126,
+ 8722
+ ],
+ [
+ 512,
+ 132,
+ 8723
+ ],
+ [
+ 512,
+ 140,
+ 8784
+ ],
+ [
+ 511,
+ 142,
+ 8786
+ ],
+ [
+ 510,
+ 146,
+ 8787
+ ],
+ [
+ 509,
+ 148,
+ 8843
+ ],
+ [
+ 508,
+ 152,
+ 8844
+ ],
+ [
+ 508,
+ 157,
+ 8904
+ ],
+ [
+ 508,
+ 161,
+ 8905
+ ],
+ [
+ 508,
+ 162,
+ 8967
+ ],
+ [
+ 507,
+ 162,
+ 8969
+ ]
+ ],
+ [
+ [
+ 510,
+ 119,
+ 9777
+ ],
+ [
+ 513,
+ 117,
+ 9846
+ ],
+ [
+ 514,
+ 116,
+ 9847
+ ],
+ [
+ 518,
+ 116,
+ 9851
+ ],
+ [
+ 522,
+ 116,
+ 9907
+ ],
+ [
+ 532,
+ 116,
+ 9908
+ ],
+ [
+ 540,
+ 116,
+ 9969
+ ],
+ [
+ 542,
+ 116,
+ 9971
+ ],
+ [
+ 544,
+ 116,
+ 10036
+ ],
+ [
+ 545,
+ 116,
+ 10090
+ ],
+ [
+ 546,
+ 116,
+ 10151
+ ],
+ [
+ 547,
+ 116,
+ 10154
+ ],
+ [
+ 548,
+ 116,
+ 10214
+ ],
+ [
+ 551,
+ 118,
+ 10220
+ ],
+ [
+ 552,
+ 118,
+ 10273
+ ],
+ [
+ 553,
+ 119,
+ 10274
+ ],
+ [
+ 554,
+ 119,
+ 10274
+ ],
+ [
+ 556,
+ 120,
+ 10334
+ ],
+ [
+ 557,
+ 120,
+ 10398
+ ],
+ [
+ 558,
+ 121,
+ 10456
+ ],
+ [
+ 559,
+ 121,
+ 10457
+ ],
+ [
+ 560,
+ 121,
+ 10524
+ ],
+ [
+ 560,
+ 124,
+ 10576
+ ],
+ [
+ 561,
+ 126,
+ 10578
+ ],
+ [
+ 561,
+ 128,
+ 10638
+ ],
+ [
+ 561,
+ 133,
+ 10639
+ ],
+ [
+ 561,
+ 138,
+ 10698
+ ],
+ [
+ 561,
+ 144,
+ 10699
+ ],
+ [
+ 560,
+ 147,
+ 10761
+ ],
+ [
+ 558,
+ 152,
+ 10763
+ ],
+ [
+ 558,
+ 153,
+ 10765
+ ],
+ [
+ 558,
+ 155,
+ 10818
+ ],
+ [
+ 558,
+ 158,
+ 10819
+ ],
+ [
+ 558,
+ 161,
+ 10881
+ ],
+ [
+ 558,
+ 162,
+ 10941
+ ],
+ [
+ 558,
+ 164,
+ 10942
+ ]
+ ],
+ [
+ [
+ 507,
+ 164,
+ 11623
+ ],
+ [
+ 508,
+ 164,
+ 11682
+ ],
+ [
+ 510,
+ 164,
+ 11701
+ ],
+ [
+ 512,
+ 163,
+ 11706
+ ],
+ [
+ 517,
+ 163,
+ 11761
+ ],
+ [
+ 520,
+ 163,
+ 11762
+ ],
+ [
+ 527,
+ 162,
+ 11763
+ ],
+ [
+ 532,
+ 162,
+ 11821
+ ],
+ [
+ 536,
+ 161,
+ 11822
+ ],
+ [
+ 537,
+ 161,
+ 11882
+ ],
+ [
+ 538,
+ 161,
+ 11883
+ ],
+ [
+ 541,
+ 161,
+ 11943
+ ],
+ [
+ 543,
+ 161,
+ 11944
+ ],
+ [
+ 544,
+ 161,
+ 12010
+ ],
+ [
+ 548,
+ 161,
+ 12012
+ ],
+ [
+ 550,
+ 161,
+ 12067
+ ],
+ [
+ 552,
+ 161,
+ 12069
+ ],
+ [
+ 554,
+ 161,
+ 12126
+ ],
+ [
+ 555,
+ 161,
+ 12188
+ ],
+ [
+ 556,
+ 161,
+ 12189
+ ],
+ [
+ 559,
+ 161,
+ 12251
+ ],
+ [
+ 560,
+ 161,
+ 12259
+ ],
+ [
+ 562,
+ 161,
+ 12313
+ ],
+ [
+ 563,
+ 161,
+ 12373
+ ]
+ ],
+ [
+ [
+ 600,
+ 48,
+ 18967
+ ],
+ [
+ 601,
+ 48,
+ 19050
+ ],
+ [
+ 605,
+ 48,
+ 19082
+ ],
+ [
+ 607,
+ 48,
+ 19140
+ ],
+ [
+ 610,
+ 48,
+ 19141
+ ],
+ [
+ 620,
+ 48,
+ 19199
+ ],
+ [
+ 638,
+ 48,
+ 19200
+ ],
+ [
+ 651,
+ 48,
+ 19260
+ ],
+ [
+ 658,
+ 49,
+ 19261
+ ],
+ [
+ 668,
+ 51,
+ 19321
+ ],
+ [
+ 673,
+ 51,
+ 19321
+ ],
+ [
+ 674,
+ 51,
+ 19322
+ ],
+ [
+ 676,
+ 51,
+ 19382
+ ],
+ [
+ 683,
+ 51,
+ 19383
+ ],
+ [
+ 688,
+ 51,
+ 19387
+ ],
+ [
+ 692,
+ 50,
+ 19444
+ ],
+ [
+ 696,
+ 50,
+ 19446
+ ],
+ [
+ 697,
+ 49,
+ 19451
+ ],
+ [
+ 699,
+ 49,
+ 19503
+ ],
+ [
+ 701,
+ 49,
+ 19504
+ ],
+ [
+ 706,
+ 48,
+ 19563
+ ],
+ [
+ 708,
+ 48,
+ 19564
+ ],
+ [
+ 709,
+ 48,
+ 19631
+ ],
+ [
+ 710,
+ 48,
+ 19636
+ ],
+ [
+ 711,
+ 48,
+ 19687
+ ]
+ ],
+ [
+ [
+ 624,
+ 44,
+ 21231
+ ],
+ [
+ 624,
+ 45,
+ 21296
+ ],
+ [
+ 624,
+ 49,
+ 21297
+ ],
+ [
+ 624,
+ 51,
+ 21356
+ ],
+ [
+ 624,
+ 59,
+ 21357
+ ],
+ [
+ 624,
+ 60,
+ 21362
+ ],
+ [
+ 624,
+ 65,
+ 21416
+ ],
+ [
+ 624,
+ 66,
+ 21417
+ ],
+ [
+ 624,
+ 71,
+ 21477
+ ],
+ [
+ 624,
+ 73,
+ 21539
+ ],
+ [
+ 624,
+ 76,
+ 21599
+ ],
+ [
+ 623,
+ 78,
+ 21600
+ ],
+ [
+ 623,
+ 79,
+ 21661
+ ]
+ ],
+ [
+ [
+ 621,
+ 78,
+ 23544
+ ],
+ [
+ 622,
+ 78,
+ 23699
+ ],
+ [
+ 623,
+ 78,
+ 23726
+ ],
+ [
+ 628,
+ 78,
+ 23731
+ ],
+ [
+ 630,
+ 78,
+ 23781
+ ],
+ [
+ 640,
+ 79,
+ 23782
+ ],
+ [
+ 643,
+ 79,
+ 23815
+ ],
+ [
+ 653,
+ 80,
+ 23845
+ ],
+ [
+ 661,
+ 80,
+ 23847
+ ],
+ [
+ 670,
+ 80,
+ 23903
+ ],
+ [
+ 676,
+ 79,
+ 23904
+ ],
+ [
+ 677,
+ 79,
+ 23979
+ ],
+ [
+ 678,
+ 79,
+ 24027
+ ],
+ [
+ 678,
+ 80,
+ 24307
+ ],
+ [
+ 678,
+ 81,
+ 24360
+ ],
+ [
+ 678,
+ 83,
+ 24362
+ ],
+ [
+ 677,
+ 88,
+ 24422
+ ],
+ [
+ 676,
+ 95,
+ 24423
+ ],
+ [
+ 676,
+ 96,
+ 24427
+ ],
+ [
+ 676,
+ 100,
+ 24484
+ ],
+ [
+ 676,
+ 104,
+ 24485
+ ],
+ [
+ 676,
+ 106,
+ 24490
+ ],
+ [
+ 676,
+ 108,
+ 24545
+ ],
+ [
+ 676,
+ 109,
+ 24546
+ ],
+ [
+ 676,
+ 111,
+ 24606
+ ],
+ [
+ 676,
+ 112,
+ 24606
+ ],
+ [
+ 676,
+ 113,
+ 24670
+ ],
+ [
+ 676,
+ 114,
+ 24675
+ ],
+ [
+ 676,
+ 116,
+ 24729
+ ],
+ [
+ 676,
+ 118,
+ 24789
+ ]
+ ],
+ [
+ [
+ 622,
+ 78,
+ 25560
+ ],
+ [
+ 622,
+ 79,
+ 25675
+ ],
+ [
+ 622,
+ 80,
+ 25703
+ ],
+ [
+ 622,
+ 83,
+ 25707
+ ],
+ [
+ 622,
+ 89,
+ 25759
+ ],
+ [
+ 622,
+ 95,
+ 25763
+ ],
+ [
+ 621,
+ 100,
+ 25822
+ ],
+ [
+ 621,
+ 105,
+ 25824
+ ],
+ [
+ 621,
+ 106,
+ 25827
+ ],
+ [
+ 620,
+ 110,
+ 25880
+ ],
+ [
+ 620,
+ 112,
+ 25881
+ ],
+ [
+ 620,
+ 113,
+ 25943
+ ],
+ [
+ 620,
+ 115,
+ 26002
+ ],
+ [
+ 620,
+ 116,
+ 26063
+ ]
+ ],
+ [
+ [
+ 592,
+ 116,
+ 27111
+ ],
+ [
+ 598,
+ 116,
+ 27189
+ ],
+ [
+ 620,
+ 116,
+ 27216
+ ],
+ [
+ 637,
+ 117,
+ 27275
+ ],
+ [
+ 654,
+ 118,
+ 27276
+ ],
+ [
+ 664,
+ 119,
+ 27337
+ ],
+ [
+ 674,
+ 120,
+ 27339
+ ],
+ [
+ 677,
+ 120,
+ 27397
+ ],
+ [
+ 683,
+ 120,
+ 27398
+ ],
+ [
+ 687,
+ 120,
+ 27458
+ ],
+ [
+ 688,
+ 120,
+ 27459
+ ],
+ [
+ 689,
+ 120,
+ 27518
+ ],
+ [
+ 692,
+ 120,
+ 27519
+ ],
+ [
+ 692,
+ 119,
+ 27579
+ ],
+ [
+ 696,
+ 119,
+ 27581
+ ],
+ [
+ 697,
+ 119,
+ 27639
+ ],
+ [
+ 698,
+ 119,
+ 27640
+ ],
+ [
+ 699,
+ 119,
+ 27708
+ ],
+ [
+ 700,
+ 119,
+ 27761
+ ]
+ ],
+ [
+ [
+ 616,
+ 126,
+ 30647
+ ],
+ [
+ 616,
+ 128,
+ 30740
+ ],
+ [
+ 616,
+ 132,
+ 30771
+ ],
+ [
+ 616,
+ 137,
+ 30831
+ ],
+ [
+ 616,
+ 143,
+ 30832
+ ],
+ [
+ 616,
+ 147,
+ 30835
+ ],
+ [
+ 616,
+ 149,
+ 30892
+ ],
+ [
+ 616,
+ 154,
+ 30893
+ ],
+ [
+ 616,
+ 158,
+ 30951
+ ],
+ [
+ 616,
+ 160,
+ 30952
+ ],
+ [
+ 616,
+ 163,
+ 31012
+ ],
+ [
+ 616,
+ 166,
+ 31013
+ ],
+ [
+ 616,
+ 167,
+ 31073
+ ],
+ [
+ 615,
+ 168,
+ 31074
+ ],
+ [
+ 615,
+ 170,
+ 31136
+ ],
+ [
+ 615,
+ 171,
+ 31196
+ ],
+ [
+ 615,
+ 172,
+ 31323
+ ]
+ ],
+ [
+ [
+ 614,
+ 127,
+ 32047
+ ],
+ [
+ 620,
+ 126,
+ 32108
+ ],
+ [
+ 630,
+ 125,
+ 32138
+ ],
+ [
+ 640,
+ 125,
+ 32200
+ ],
+ [
+ 645,
+ 125,
+ 32202
+ ],
+ [
+ 648,
+ 125,
+ 32265
+ ],
+ [
+ 653,
+ 125,
+ 32320
+ ],
+ [
+ 655,
+ 125,
+ 32321
+ ],
+ [
+ 658,
+ 125,
+ 32322
+ ],
+ [
+ 659,
+ 125,
+ 32381
+ ],
+ [
+ 667,
+ 127,
+ 32382
+ ],
+ [
+ 670,
+ 127,
+ 32442
+ ],
+ [
+ 672,
+ 127,
+ 32442
+ ],
+ [
+ 675,
+ 128,
+ 32504
+ ],
+ [
+ 676,
+ 128,
+ 32505
+ ],
+ [
+ 677,
+ 128,
+ 32564
+ ],
+ [
+ 678,
+ 128,
+ 32625
+ ],
+ [
+ 679,
+ 128,
+ 32686
+ ],
+ [
+ 680,
+ 129,
+ 32755
+ ],
+ [
+ 680,
+ 131,
+ 32808
+ ],
+ [
+ 680,
+ 132,
+ 32809
+ ],
+ [
+ 679,
+ 136,
+ 32868
+ ],
+ [
+ 677,
+ 143,
+ 32869
+ ],
+ [
+ 675,
+ 152,
+ 32929
+ ],
+ [
+ 675,
+ 156,
+ 32930
+ ],
+ [
+ 675,
+ 157,
+ 32991
+ ],
+ [
+ 674,
+ 161,
+ 32992
+ ],
+ [
+ 674,
+ 167,
+ 33051
+ ],
+ [
+ 674,
+ 170,
+ 33052
+ ],
+ [
+ 674,
+ 171,
+ 33113
+ ],
+ [
+ 674,
+ 172,
+ 33114
+ ],
+ [
+ 674,
+ 173,
+ 33173
+ ],
+ [
+ 674,
+ 174,
+ 33174
+ ],
+ [
+ 674,
+ 175,
+ 33238
+ ],
+ [
+ 674,
+ 176,
+ 33242
+ ],
+ [
+ 673,
+ 176,
+ 33386
+ ]
+ ],
+ [
+ [
+ 617,
+ 172,
+ 34039
+ ],
+ [
+ 618,
+ 171,
+ 34117
+ ],
+ [
+ 621,
+ 170,
+ 34146
+ ],
+ [
+ 622,
+ 170,
+ 34147
+ ],
+ [
+ 630,
+ 169,
+ 34206
+ ],
+ [
+ 637,
+ 169,
+ 34207
+ ],
+ [
+ 641,
+ 168,
+ 34212
+ ],
+ [
+ 649,
+ 168,
+ 34271
+ ],
+ [
+ 653,
+ 168,
+ 34272
+ ],
+ [
+ 660,
+ 168,
+ 34275
+ ],
+ [
+ 662,
+ 168,
+ 34327
+ ],
+ [
+ 664,
+ 168,
+ 34389
+ ],
+ [
+ 667,
+ 168,
+ 34391
+ ],
+ [
+ 668,
+ 168,
+ 34448
+ ],
+ [
+ 669,
+ 169,
+ 34449
+ ],
+ [
+ 670,
+ 170,
+ 34509
+ ],
+ [
+ 672,
+ 171,
+ 34510
+ ],
+ [
+ 674,
+ 171,
+ 34571
+ ],
+ [
+ 675,
+ 172,
+ 34632
+ ],
+ [
+ 676,
+ 172,
+ 34811
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ }
+}
diff --git a/tests/auto/inputpanel/data/inputpanel/unipen_data_korean.js b/tests/auto/inputpanel/data/inputpanel/unipen_data_korean.js
new file mode 100644
index 00000000..1b487c49
--- /dev/null
+++ b/tests/auto/inputpanel/data/inputpanel/unipen_data_korean.js
@@ -0,0 +1,1708 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+var unipenData = {
+ "0xad6d": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 379,
+ 53,
+ 0
+ ],
+ [
+ 380,
+ 53,
+ 155
+ ],
+ [
+ 382,
+ 53,
+ 177
+ ],
+ [
+ 385,
+ 53,
+ 179
+ ],
+ [
+ 391,
+ 53,
+ 243
+ ],
+ [
+ 400,
+ 53,
+ 244
+ ],
+ [
+ 421,
+ 55,
+ 311
+ ],
+ [
+ 437,
+ 55,
+ 313
+ ],
+ [
+ 441,
+ 55,
+ 315
+ ],
+ [
+ 448,
+ 55,
+ 365
+ ],
+ [
+ 454,
+ 55,
+ 366
+ ],
+ [
+ 461,
+ 55,
+ 370
+ ],
+ [
+ 467,
+ 54,
+ 426
+ ],
+ [
+ 472,
+ 54,
+ 427
+ ],
+ [
+ 475,
+ 54,
+ 486
+ ],
+ [
+ 477,
+ 54,
+ 487
+ ],
+ [
+ 478,
+ 54,
+ 490
+ ],
+ [
+ 479,
+ 54,
+ 548
+ ],
+ [
+ 480,
+ 54,
+ 549
+ ],
+ [
+ 482,
+ 54,
+ 610
+ ],
+ [
+ 485,
+ 54,
+ 610
+ ],
+ [
+ 488,
+ 54,
+ 670
+ ],
+ [
+ 489,
+ 54,
+ 731
+ ],
+ [
+ 489,
+ 55,
+ 939
+ ],
+ [
+ 489,
+ 56,
+ 1003
+ ],
+ [
+ 489,
+ 60,
+ 1004
+ ],
+ [
+ 489,
+ 64,
+ 1064
+ ],
+ [
+ 489,
+ 66,
+ 1065
+ ],
+ [
+ 489,
+ 72,
+ 1124
+ ],
+ [
+ 489,
+ 75,
+ 1125
+ ],
+ [
+ 489,
+ 79,
+ 1131
+ ],
+ [
+ 489,
+ 81,
+ 1184
+ ],
+ [
+ 489,
+ 86,
+ 1185
+ ],
+ [
+ 489,
+ 91,
+ 1245
+ ],
+ [
+ 489,
+ 92,
+ 1246
+ ],
+ [
+ 489,
+ 97,
+ 1306
+ ],
+ [
+ 489,
+ 99,
+ 1307
+ ],
+ [
+ 489,
+ 101,
+ 1366
+ ],
+ [
+ 489,
+ 102,
+ 1367
+ ],
+ [
+ 489,
+ 103,
+ 1427
+ ],
+ [
+ 489,
+ 105,
+ 1429
+ ],
+ [
+ 489,
+ 106,
+ 1500
+ ],
+ [
+ 489,
+ 107,
+ 1549
+ ],
+ [
+ 489,
+ 108,
+ 1550
+ ],
+ [
+ 489,
+ 109,
+ 1614
+ ]
+ ],
+ [
+ [
+ 383,
+ 113,
+ 2999
+ ],
+ [
+ 384,
+ 113,
+ 3259
+ ],
+ [
+ 385,
+ 112,
+ 3291
+ ],
+ [
+ 386,
+ 112,
+ 3360
+ ],
+ [
+ 399,
+ 112,
+ 3361
+ ],
+ [
+ 412,
+ 112,
+ 3389
+ ],
+ [
+ 434,
+ 112,
+ 3449
+ ],
+ [
+ 440,
+ 112,
+ 3450
+ ],
+ [
+ 451,
+ 112,
+ 3451
+ ],
+ [
+ 455,
+ 112,
+ 3510
+ ],
+ [
+ 479,
+ 111,
+ 3511
+ ],
+ [
+ 493,
+ 110,
+ 3574
+ ],
+ [
+ 506,
+ 109,
+ 3576
+ ],
+ [
+ 513,
+ 109,
+ 3632
+ ],
+ [
+ 515,
+ 109,
+ 3633
+ ],
+ [
+ 516,
+ 109,
+ 3636
+ ]
+ ],
+ [
+ [
+ 430,
+ 115,
+ 5767
+ ],
+ [
+ 430,
+ 116,
+ 5851
+ ],
+ [
+ 432,
+ 120,
+ 5884
+ ],
+ [
+ 433,
+ 123,
+ 5937
+ ],
+ [
+ 433,
+ 127,
+ 5938
+ ],
+ [
+ 434,
+ 130,
+ 6000
+ ],
+ [
+ 434,
+ 133,
+ 6002
+ ],
+ [
+ 435,
+ 139,
+ 6058
+ ],
+ [
+ 435,
+ 141,
+ 6059
+ ],
+ [
+ 435,
+ 142,
+ 6124
+ ],
+ [
+ 435,
+ 143,
+ 6523
+ ]
+ ],
+ [
+ [
+ 393,
+ 151,
+ 7943
+ ],
+ [
+ 394,
+ 151,
+ 8099
+ ],
+ [
+ 399,
+ 150,
+ 8124
+ ],
+ [
+ 412,
+ 150,
+ 8184
+ ],
+ [
+ 422,
+ 150,
+ 8185
+ ],
+ [
+ 438,
+ 150,
+ 8245
+ ],
+ [
+ 448,
+ 150,
+ 8246
+ ],
+ [
+ 465,
+ 149,
+ 8305
+ ],
+ [
+ 478,
+ 149,
+ 8306
+ ],
+ [
+ 485,
+ 149,
+ 8366
+ ],
+ [
+ 487,
+ 149,
+ 8366
+ ],
+ [
+ 488,
+ 149,
+ 8432
+ ],
+ [
+ 489,
+ 149,
+ 8490
+ ],
+ [
+ 491,
+ 149,
+ 8492
+ ],
+ [
+ 492,
+ 149,
+ 8549
+ ],
+ [
+ 492,
+ 150,
+ 8835
+ ],
+ [
+ 492,
+ 152,
+ 8882
+ ],
+ [
+ 492,
+ 155,
+ 8883
+ ],
+ [
+ 492,
+ 159,
+ 8944
+ ],
+ [
+ 492,
+ 163,
+ 8945
+ ],
+ [
+ 492,
+ 168,
+ 9005
+ ],
+ [
+ 491,
+ 173,
+ 9005
+ ],
+ [
+ 491,
+ 177,
+ 9067
+ ],
+ [
+ 490,
+ 182,
+ 9068
+ ],
+ [
+ 490,
+ 188,
+ 9126
+ ],
+ [
+ 490,
+ 192,
+ 9126
+ ],
+ [
+ 490,
+ 193,
+ 9130
+ ],
+ [
+ 490,
+ 196,
+ 9188
+ ],
+ [
+ 490,
+ 198,
+ 9247
+ ],
+ [
+ 490,
+ 200,
+ 9247
+ ],
+ [
+ 490,
+ 202,
+ 9307
+ ],
+ [
+ 490,
+ 203,
+ 9308
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ },
+ "0xc5b4": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 569,
+ 64,
+ 0
+ ],
+ [
+ 568,
+ 64,
+ 53
+ ],
+ [
+ 565,
+ 64,
+ 54
+ ],
+ [
+ 559,
+ 64,
+ 114
+ ],
+ [
+ 553,
+ 65,
+ 115
+ ],
+ [
+ 545,
+ 66,
+ 174
+ ],
+ [
+ 533,
+ 71,
+ 175
+ ],
+ [
+ 526,
+ 79,
+ 242
+ ],
+ [
+ 522,
+ 87,
+ 245
+ ],
+ [
+ 520,
+ 92,
+ 246
+ ],
+ [
+ 519,
+ 94,
+ 296
+ ],
+ [
+ 517,
+ 103,
+ 297
+ ],
+ [
+ 516,
+ 114,
+ 357
+ ],
+ [
+ 518,
+ 130,
+ 358
+ ],
+ [
+ 520,
+ 141,
+ 417
+ ],
+ [
+ 522,
+ 146,
+ 418
+ ],
+ [
+ 524,
+ 152,
+ 478
+ ],
+ [
+ 528,
+ 159,
+ 479
+ ],
+ [
+ 533,
+ 165,
+ 540
+ ],
+ [
+ 536,
+ 169,
+ 541
+ ],
+ [
+ 538,
+ 171,
+ 601
+ ],
+ [
+ 543,
+ 174,
+ 601
+ ],
+ [
+ 544,
+ 175,
+ 604
+ ],
+ [
+ 545,
+ 175,
+ 662
+ ],
+ [
+ 549,
+ 175,
+ 664
+ ],
+ [
+ 557,
+ 174,
+ 723
+ ],
+ [
+ 564,
+ 170,
+ 727
+ ],
+ [
+ 570,
+ 164,
+ 789
+ ],
+ [
+ 578,
+ 159,
+ 793
+ ],
+ [
+ 581,
+ 155,
+ 849
+ ],
+ [
+ 584,
+ 151,
+ 849
+ ],
+ [
+ 586,
+ 147,
+ 852
+ ],
+ [
+ 588,
+ 143,
+ 904
+ ],
+ [
+ 588,
+ 137,
+ 905
+ ],
+ [
+ 590,
+ 131,
+ 907
+ ],
+ [
+ 590,
+ 125,
+ 965
+ ],
+ [
+ 590,
+ 115,
+ 966
+ ],
+ [
+ 589,
+ 109,
+ 997
+ ],
+ [
+ 585,
+ 98,
+ 1029
+ ],
+ [
+ 583,
+ 88,
+ 1030
+ ],
+ [
+ 580,
+ 83,
+ 1089
+ ],
+ [
+ 576,
+ 75,
+ 1091
+ ],
+ [
+ 576,
+ 73,
+ 1092
+ ],
+ [
+ 572,
+ 70,
+ 1151
+ ],
+ [
+ 568,
+ 65,
+ 1153
+ ],
+ [
+ 568,
+ 64,
+ 1209
+ ],
+ [
+ 567,
+ 64,
+ 1453
+ ]
+ ],
+ [
+ [
+ 592,
+ 124,
+ 2520
+ ],
+ [
+ 593,
+ 124,
+ 2621
+ ],
+ [
+ 595,
+ 123,
+ 2645
+ ],
+ [
+ 601,
+ 123,
+ 2711
+ ],
+ [
+ 607,
+ 122,
+ 2712
+ ],
+ [
+ 614,
+ 122,
+ 2779
+ ],
+ [
+ 618,
+ 122,
+ 2781
+ ],
+ [
+ 622,
+ 121,
+ 2840
+ ],
+ [
+ 623,
+ 121,
+ 2957
+ ],
+ [
+ 624,
+ 121,
+ 3045
+ ],
+ [
+ 625,
+ 120,
+ 3236
+ ]
+ ],
+ [
+ [
+ 614,
+ 42,
+ 3848
+ ],
+ [
+ 614,
+ 45,
+ 3896
+ ],
+ [
+ 614,
+ 47,
+ 3897
+ ],
+ [
+ 614,
+ 54,
+ 3900
+ ],
+ [
+ 615,
+ 63,
+ 3958
+ ],
+ [
+ 617,
+ 76,
+ 3958
+ ],
+ [
+ 619,
+ 92,
+ 4017
+ ],
+ [
+ 620,
+ 100,
+ 4018
+ ],
+ [
+ 620,
+ 115,
+ 4078
+ ],
+ [
+ 620,
+ 133,
+ 4079
+ ],
+ [
+ 618,
+ 141,
+ 4084
+ ],
+ [
+ 616,
+ 153,
+ 4138
+ ],
+ [
+ 616,
+ 157,
+ 4139
+ ],
+ [
+ 615,
+ 169,
+ 4200
+ ],
+ [
+ 614,
+ 176,
+ 4201
+ ],
+ [
+ 614,
+ 178,
+ 4205
+ ],
+ [
+ 613,
+ 184,
+ 4260
+ ],
+ [
+ 613,
+ 188,
+ 4261
+ ],
+ [
+ 613,
+ 190,
+ 4420
+ ],
+ [
+ 613,
+ 191,
+ 4540
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ },
+ "0xd55c": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 169,
+ 59,
+ 0
+ ],
+ [
+ 171,
+ 59,
+ 148
+ ],
+ [
+ 175,
+ 59,
+ 170
+ ],
+ [
+ 183,
+ 59,
+ 228
+ ],
+ [
+ 197,
+ 59,
+ 229
+ ],
+ [
+ 210,
+ 59,
+ 288
+ ],
+ [
+ 223,
+ 61,
+ 289
+ ],
+ [
+ 233,
+ 61,
+ 292
+ ],
+ [
+ 241,
+ 61,
+ 350
+ ],
+ [
+ 252,
+ 62,
+ 350
+ ],
+ [
+ 260,
+ 62,
+ 418
+ ],
+ [
+ 265,
+ 62,
+ 419
+ ],
+ [
+ 266,
+ 62,
+ 748
+ ]
+ ],
+ [
+ [
+ 224,
+ 27,
+ 1367
+ ],
+ [
+ 223,
+ 27,
+ 1414
+ ],
+ [
+ 222,
+ 34,
+ 1444
+ ],
+ [
+ 222,
+ 39,
+ 1502
+ ],
+ [
+ 223,
+ 46,
+ 1503
+ ],
+ [
+ 223,
+ 47,
+ 1508
+ ],
+ [
+ 223,
+ 50,
+ 1566
+ ],
+ [
+ 224,
+ 53,
+ 1568
+ ],
+ [
+ 224,
+ 56,
+ 1629
+ ],
+ [
+ 224,
+ 57,
+ 1630
+ ],
+ [
+ 225,
+ 59,
+ 1630
+ ],
+ [
+ 225,
+ 61,
+ 1686
+ ],
+ [
+ 225,
+ 62,
+ 1687
+ ]
+ ],
+ [
+ [
+ 244,
+ 82,
+ 3184
+ ],
+ [
+ 243,
+ 81,
+ 3259
+ ],
+ [
+ 242,
+ 81,
+ 3285
+ ],
+ [
+ 238,
+ 80,
+ 3349
+ ],
+ [
+ 225,
+ 80,
+ 3350
+ ],
+ [
+ 210,
+ 80,
+ 3412
+ ],
+ [
+ 198,
+ 82,
+ 3414
+ ],
+ [
+ 192,
+ 84,
+ 3474
+ ],
+ [
+ 186,
+ 88,
+ 3476
+ ],
+ [
+ 184,
+ 90,
+ 3478
+ ],
+ [
+ 180,
+ 95,
+ 3532
+ ],
+ [
+ 178,
+ 100,
+ 3533
+ ],
+ [
+ 178,
+ 109,
+ 3595
+ ],
+ [
+ 178,
+ 117,
+ 3598
+ ],
+ [
+ 181,
+ 125,
+ 3657
+ ],
+ [
+ 186,
+ 130,
+ 3658
+ ],
+ [
+ 194,
+ 136,
+ 3716
+ ],
+ [
+ 197,
+ 137,
+ 3717
+ ],
+ [
+ 199,
+ 137,
+ 3775
+ ],
+ [
+ 202,
+ 137,
+ 3776
+ ],
+ [
+ 204,
+ 137,
+ 3780
+ ],
+ [
+ 206,
+ 137,
+ 3835
+ ],
+ [
+ 223,
+ 135,
+ 3836
+ ],
+ [
+ 234,
+ 133,
+ 3897
+ ],
+ [
+ 240,
+ 130,
+ 3898
+ ],
+ [
+ 242,
+ 129,
+ 3900
+ ],
+ [
+ 244,
+ 128,
+ 3958
+ ],
+ [
+ 251,
+ 120,
+ 3959
+ ],
+ [
+ 253,
+ 117,
+ 4017
+ ],
+ [
+ 253,
+ 114,
+ 4020
+ ],
+ [
+ 253,
+ 110,
+ 4081
+ ],
+ [
+ 251,
+ 104,
+ 4083
+ ],
+ [
+ 249,
+ 99,
+ 4140
+ ],
+ [
+ 247,
+ 95,
+ 4141
+ ],
+ [
+ 243,
+ 89,
+ 4205
+ ],
+ [
+ 242,
+ 86,
+ 4206
+ ],
+ [
+ 242,
+ 85,
+ 4212
+ ],
+ [
+ 241,
+ 84,
+ 4284
+ ],
+ [
+ 240,
+ 84,
+ 4324
+ ],
+ [
+ 239,
+ 84,
+ 4596
+ ]
+ ],
+ [
+ [
+ 177,
+ 144,
+ 6344
+ ],
+ [
+ 178,
+ 144,
+ 6573
+ ],
+ [
+ 178,
+ 146,
+ 6600
+ ],
+ [
+ 179,
+ 148,
+ 6604
+ ],
+ [
+ 179,
+ 150,
+ 6657
+ ],
+ [
+ 180,
+ 153,
+ 6658
+ ],
+ [
+ 181,
+ 160,
+ 6719
+ ],
+ [
+ 182,
+ 167,
+ 6720
+ ],
+ [
+ 183,
+ 176,
+ 6779
+ ],
+ [
+ 184,
+ 182,
+ 6780
+ ],
+ [
+ 184,
+ 185,
+ 6840
+ ],
+ [
+ 185,
+ 189,
+ 6841
+ ],
+ [
+ 186,
+ 189,
+ 7108
+ ],
+ [
+ 195,
+ 189,
+ 7174
+ ],
+ [
+ 206,
+ 187,
+ 7234
+ ],
+ [
+ 213,
+ 186,
+ 7236
+ ],
+ [
+ 219,
+ 186,
+ 7294
+ ],
+ [
+ 224,
+ 186,
+ 7296
+ ],
+ [
+ 233,
+ 186,
+ 7355
+ ],
+ [
+ 241,
+ 185,
+ 7355
+ ],
+ [
+ 252,
+ 185,
+ 7417
+ ],
+ [
+ 262,
+ 185,
+ 7419
+ ],
+ [
+ 268,
+ 186,
+ 7421
+ ],
+ [
+ 276,
+ 186,
+ 7475
+ ],
+ [
+ 281,
+ 186,
+ 7476
+ ],
+ [
+ 289,
+ 186,
+ 7536
+ ],
+ [
+ 290,
+ 186,
+ 7537
+ ],
+ [
+ 291,
+ 186,
+ 7597
+ ],
+ [
+ 292,
+ 186,
+ 7660
+ ],
+ [
+ 293,
+ 186,
+ 7724
+ ],
+ [
+ 294,
+ 186,
+ 7725
+ ],
+ [
+ 295,
+ 186,
+ 8172
+ ]
+ ],
+ [
+ [
+ 283,
+ 25,
+ 9136
+ ],
+ [
+ 283,
+ 26,
+ 9220
+ ],
+ [
+ 283,
+ 27,
+ 9244
+ ],
+ [
+ 283,
+ 33,
+ 9299
+ ],
+ [
+ 283,
+ 41,
+ 9300
+ ],
+ [
+ 282,
+ 53,
+ 9359
+ ],
+ [
+ 282,
+ 65,
+ 9359
+ ],
+ [
+ 282,
+ 78,
+ 9420
+ ],
+ [
+ 282,
+ 92,
+ 9421
+ ],
+ [
+ 281,
+ 115,
+ 9481
+ ],
+ [
+ 280,
+ 124,
+ 9482
+ ],
+ [
+ 279,
+ 133,
+ 9484
+ ],
+ [
+ 279,
+ 135,
+ 9542
+ ],
+ [
+ 278,
+ 142,
+ 9542
+ ],
+ [
+ 277,
+ 148,
+ 9605
+ ],
+ [
+ 277,
+ 150,
+ 9607
+ ],
+ [
+ 277,
+ 151,
+ 9764
+ ],
+ [
+ 277,
+ 153,
+ 9816
+ ],
+ [
+ 277,
+ 154,
+ 9876
+ ],
+ [
+ 277,
+ 153,
+ 10124
+ ],
+ [
+ 277,
+ 151,
+ 10180
+ ]
+ ],
+ [
+ [
+ 282,
+ 89,
+ 10651
+ ],
+ [
+ 283,
+ 89,
+ 10796
+ ],
+ [
+ 286,
+ 89,
+ 10821
+ ],
+ [
+ 288,
+ 88,
+ 10879
+ ],
+ [
+ 291,
+ 88,
+ 10879
+ ],
+ [
+ 294,
+ 88,
+ 10941
+ ],
+ [
+ 295,
+ 88,
+ 10941
+ ],
+ [
+ 297,
+ 88,
+ 11003
+ ],
+ [
+ 298,
+ 88,
+ 11004
+ ],
+ [
+ 299,
+ 88,
+ 11061
+ ],
+ [
+ 300,
+ 88,
+ 11062
+ ],
+ [
+ 301,
+ 88,
+ 11121
+ ],
+ [
+ 302,
+ 88,
+ 11123
+ ],
+ [
+ 303,
+ 88,
+ 11185
+ ],
+ [
+ 304,
+ 88,
+ 11187
+ ],
+ [
+ 305,
+ 88,
+ 11189
+ ],
+ [
+ 306,
+ 88,
+ 11248
+ ],
+ [
+ 307,
+ 88,
+ 11249
+ ],
+ [
+ 309,
+ 89,
+ 11304
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ }
+}
diff --git a/tests/auto/inputpanel/data/inputpanel/unipen_data_simp_chinese.js b/tests/auto/inputpanel/data/inputpanel/unipen_data_simp_chinese.js
new file mode 100644
index 00000000..b5942e6b
--- /dev/null
+++ b/tests/auto/inputpanel/data/inputpanel/unipen_data_simp_chinese.js
@@ -0,0 +1,1851 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+var unipenData = {
+ "0x4e2d": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 185,
+ 59,
+ 0
+ ],
+ [
+ 185,
+ 61,
+ 181
+ ],
+ [
+ 185,
+ 63,
+ 202
+ ],
+ [
+ 185,
+ 65,
+ 205
+ ],
+ [
+ 185,
+ 68,
+ 235
+ ],
+ [
+ 185,
+ 70,
+ 236
+ ],
+ [
+ 185,
+ 73,
+ 236
+ ],
+ [
+ 185,
+ 75,
+ 268
+ ],
+ [
+ 185,
+ 80,
+ 269
+ ],
+ [
+ 185,
+ 84,
+ 301
+ ],
+ [
+ 185,
+ 87,
+ 302
+ ],
+ [
+ 185,
+ 89,
+ 334
+ ],
+ [
+ 185,
+ 92,
+ 335
+ ],
+ [
+ 185,
+ 94,
+ 368
+ ],
+ [
+ 184,
+ 97,
+ 369
+ ],
+ [
+ 184,
+ 98,
+ 372
+ ],
+ [
+ 184,
+ 99,
+ 401
+ ],
+ [
+ 184,
+ 101,
+ 402
+ ],
+ [
+ 184,
+ 102,
+ 405
+ ],
+ [
+ 184,
+ 104,
+ 434
+ ],
+ [
+ 184,
+ 105,
+ 467
+ ],
+ [
+ 184,
+ 106,
+ 501
+ ],
+ [
+ 184,
+ 107,
+ 534
+ ],
+ [
+ 184,
+ 108,
+ 535
+ ],
+ [
+ 184,
+ 109,
+ 567
+ ],
+ [
+ 184,
+ 111,
+ 567
+ ],
+ [
+ 184,
+ 112,
+ 604
+ ],
+ [
+ 184,
+ 113,
+ 634
+ ],
+ [
+ 184,
+ 114,
+ 667
+ ],
+ [
+ 184,
+ 115,
+ 700
+ ],
+ [
+ 184,
+ 116,
+ 734
+ ],
+ [
+ 184,
+ 117,
+ 767
+ ],
+ [
+ 184,
+ 118,
+ 801
+ ],
+ [
+ 184,
+ 119,
+ 805
+ ],
+ [
+ 184,
+ 120,
+ 833
+ ],
+ [
+ 184,
+ 121,
+ 837
+ ],
+ [
+ 184,
+ 123,
+ 866
+ ],
+ [
+ 184,
+ 124,
+ 902
+ ],
+ [
+ 184,
+ 125,
+ 937
+ ],
+ [
+ 184,
+ 126,
+ 997
+ ],
+ [
+ 184,
+ 127,
+ 1040
+ ],
+ [
+ 184,
+ 128,
+ 1149
+ ]
+ ],
+ [
+ [
+ 184,
+ 63,
+ 1871
+ ],
+ [
+ 185,
+ 63,
+ 1917
+ ],
+ [
+ 186,
+ 63,
+ 1918
+ ],
+ [
+ 188,
+ 63,
+ 1947
+ ],
+ [
+ 190,
+ 62,
+ 1948
+ ],
+ [
+ 191,
+ 62,
+ 1948
+ ],
+ [
+ 196,
+ 62,
+ 1980
+ ],
+ [
+ 202,
+ 62,
+ 1981
+ ],
+ [
+ 209,
+ 61,
+ 2014
+ ],
+ [
+ 217,
+ 61,
+ 2015
+ ],
+ [
+ 228,
+ 61,
+ 2047
+ ],
+ [
+ 241,
+ 61,
+ 2048
+ ],
+ [
+ 248,
+ 61,
+ 2052
+ ],
+ [
+ 253,
+ 61,
+ 2080
+ ],
+ [
+ 264,
+ 61,
+ 2081
+ ],
+ [
+ 267,
+ 61,
+ 2084
+ ],
+ [
+ 271,
+ 61,
+ 2114
+ ],
+ [
+ 277,
+ 61,
+ 2114
+ ],
+ [
+ 279,
+ 61,
+ 2117
+ ],
+ [
+ 283,
+ 61,
+ 2147
+ ],
+ [
+ 288,
+ 61,
+ 2148
+ ],
+ [
+ 290,
+ 61,
+ 2149
+ ],
+ [
+ 292,
+ 61,
+ 2180
+ ],
+ [
+ 296,
+ 61,
+ 2181
+ ],
+ [
+ 298,
+ 61,
+ 2213
+ ],
+ [
+ 299,
+ 61,
+ 2214
+ ],
+ [
+ 301,
+ 60,
+ 2246
+ ],
+ [
+ 302,
+ 60,
+ 2437
+ ],
+ [
+ 303,
+ 60,
+ 2485
+ ],
+ [
+ 304,
+ 60,
+ 2532
+ ],
+ [
+ 305,
+ 60,
+ 2564
+ ],
+ [
+ 305,
+ 61,
+ 2596
+ ],
+ [
+ 305,
+ 62,
+ 2629
+ ],
+ [
+ 305,
+ 64,
+ 2630
+ ],
+ [
+ 305,
+ 66,
+ 2662
+ ],
+ [
+ 305,
+ 67,
+ 2663
+ ],
+ [
+ 306,
+ 69,
+ 2695
+ ],
+ [
+ 306,
+ 71,
+ 2696
+ ],
+ [
+ 306,
+ 75,
+ 2729
+ ],
+ [
+ 306,
+ 78,
+ 2730
+ ],
+ [
+ 306,
+ 79,
+ 2732
+ ],
+ [
+ 306,
+ 81,
+ 2762
+ ],
+ [
+ 306,
+ 85,
+ 2763
+ ],
+ [
+ 306,
+ 87,
+ 2764
+ ],
+ [
+ 306,
+ 89,
+ 2796
+ ],
+ [
+ 306,
+ 93,
+ 2796
+ ],
+ [
+ 306,
+ 95,
+ 2796
+ ],
+ [
+ 306,
+ 101,
+ 2828
+ ],
+ [
+ 305,
+ 105,
+ 2829
+ ],
+ [
+ 305,
+ 109,
+ 2862
+ ],
+ [
+ 305,
+ 113,
+ 2863
+ ],
+ [
+ 304,
+ 119,
+ 2896
+ ],
+ [
+ 304,
+ 122,
+ 2896
+ ],
+ [
+ 304,
+ 123,
+ 2901
+ ],
+ [
+ 303,
+ 126,
+ 2929
+ ],
+ [
+ 303,
+ 128,
+ 2929
+ ],
+ [
+ 303,
+ 130,
+ 2962
+ ],
+ [
+ 303,
+ 131,
+ 2962
+ ],
+ [
+ 303,
+ 132,
+ 2995
+ ],
+ [
+ 303,
+ 133,
+ 3029
+ ]
+ ],
+ [
+ [
+ 184,
+ 129,
+ 4367
+ ],
+ [
+ 188,
+ 129,
+ 4409
+ ],
+ [
+ 190,
+ 129,
+ 4410
+ ],
+ [
+ 191,
+ 129,
+ 4413
+ ],
+ [
+ 193,
+ 129,
+ 4441
+ ],
+ [
+ 197,
+ 128,
+ 4442
+ ],
+ [
+ 198,
+ 128,
+ 4444
+ ],
+ [
+ 200,
+ 128,
+ 4474
+ ],
+ [
+ 203,
+ 128,
+ 4475
+ ],
+ [
+ 205,
+ 127,
+ 4476
+ ],
+ [
+ 209,
+ 127,
+ 4508
+ ],
+ [
+ 219,
+ 127,
+ 4509
+ ],
+ [
+ 227,
+ 127,
+ 4541
+ ],
+ [
+ 237,
+ 127,
+ 4542
+ ],
+ [
+ 244,
+ 127,
+ 4574
+ ],
+ [
+ 246,
+ 127,
+ 4575
+ ],
+ [
+ 248,
+ 127,
+ 4607
+ ],
+ [
+ 250,
+ 127,
+ 4608
+ ],
+ [
+ 252,
+ 126,
+ 4640
+ ],
+ [
+ 255,
+ 126,
+ 4641
+ ],
+ [
+ 257,
+ 126,
+ 4644
+ ],
+ [
+ 259,
+ 125,
+ 4674
+ ],
+ [
+ 261,
+ 125,
+ 4675
+ ],
+ [
+ 263,
+ 125,
+ 4677
+ ],
+ [
+ 265,
+ 125,
+ 4707
+ ],
+ [
+ 266,
+ 125,
+ 4740
+ ],
+ [
+ 269,
+ 125,
+ 4741
+ ],
+ [
+ 270,
+ 125,
+ 4774
+ ],
+ [
+ 275,
+ 125,
+ 4775
+ ],
+ [
+ 279,
+ 125,
+ 4807
+ ],
+ [
+ 283,
+ 125,
+ 4808
+ ],
+ [
+ 287,
+ 125,
+ 4840
+ ],
+ [
+ 289,
+ 125,
+ 4841
+ ],
+ [
+ 291,
+ 125,
+ 4873
+ ],
+ [
+ 292,
+ 125,
+ 4874
+ ],
+ [
+ 293,
+ 125,
+ 4876
+ ],
+ [
+ 294,
+ 125,
+ 4907
+ ],
+ [
+ 296,
+ 125,
+ 4908
+ ],
+ [
+ 298,
+ 125,
+ 4909
+ ],
+ [
+ 299,
+ 125,
+ 4940
+ ],
+ [
+ 302,
+ 125,
+ 4941
+ ],
+ [
+ 303,
+ 126,
+ 4974
+ ],
+ [
+ 304,
+ 126,
+ 5006
+ ],
+ [
+ 305,
+ 126,
+ 5007
+ ],
+ [
+ 306,
+ 126,
+ 5040
+ ]
+ ],
+ [
+ [
+ 244,
+ 32,
+ 6303
+ ],
+ [
+ 244,
+ 34,
+ 6340
+ ],
+ [
+ 244,
+ 35,
+ 6355
+ ],
+ [
+ 244,
+ 37,
+ 6356
+ ],
+ [
+ 244,
+ 40,
+ 6386
+ ],
+ [
+ 244,
+ 46,
+ 6387
+ ],
+ [
+ 244,
+ 50,
+ 6388
+ ],
+ [
+ 244,
+ 54,
+ 6419
+ ],
+ [
+ 245,
+ 67,
+ 6420
+ ],
+ [
+ 247,
+ 75,
+ 6453
+ ],
+ [
+ 248,
+ 84,
+ 6453
+ ],
+ [
+ 249,
+ 89,
+ 6486
+ ],
+ [
+ 249,
+ 96,
+ 6487
+ ],
+ [
+ 250,
+ 102,
+ 6519
+ ],
+ [
+ 250,
+ 107,
+ 6520
+ ],
+ [
+ 251,
+ 111,
+ 6537
+ ],
+ [
+ 251,
+ 113,
+ 6553
+ ],
+ [
+ 251,
+ 118,
+ 6553
+ ],
+ [
+ 251,
+ 120,
+ 6557
+ ],
+ [
+ 251,
+ 122,
+ 6586
+ ],
+ [
+ 251,
+ 126,
+ 6587
+ ],
+ [
+ 251,
+ 128,
+ 6588
+ ],
+ [
+ 251,
+ 130,
+ 6619
+ ],
+ [
+ 252,
+ 133,
+ 6620
+ ],
+ [
+ 252,
+ 135,
+ 6620
+ ],
+ [
+ 252,
+ 138,
+ 6652
+ ],
+ [
+ 252,
+ 141,
+ 6653
+ ],
+ [
+ 252,
+ 144,
+ 6686
+ ],
+ [
+ 252,
+ 147,
+ 6686
+ ],
+ [
+ 252,
+ 151,
+ 6719
+ ],
+ [
+ 252,
+ 154,
+ 6719
+ ],
+ [
+ 252,
+ 156,
+ 6724
+ ],
+ [
+ 252,
+ 157,
+ 6752
+ ],
+ [
+ 252,
+ 161,
+ 6753
+ ],
+ [
+ 252,
+ 162,
+ 6756
+ ],
+ [
+ 252,
+ 165,
+ 6786
+ ],
+ [
+ 252,
+ 167,
+ 6788
+ ],
+ [
+ 252,
+ 170,
+ 6819
+ ],
+ [
+ 252,
+ 172,
+ 6820
+ ],
+ [
+ 252,
+ 174,
+ 6852
+ ],
+ [
+ 252,
+ 176,
+ 6852
+ ],
+ [
+ 252,
+ 178,
+ 6885
+ ],
+ [
+ 252,
+ 180,
+ 6886
+ ],
+ [
+ 252,
+ 182,
+ 6918
+ ],
+ [
+ 252,
+ 183,
+ 6919
+ ],
+ [
+ 252,
+ 184,
+ 6935
+ ],
+ [
+ 251,
+ 185,
+ 6952
+ ],
+ [
+ 251,
+ 186,
+ 6956
+ ],
+ [
+ 251,
+ 187,
+ 6985
+ ],
+ [
+ 251,
+ 188,
+ 7018
+ ],
+ [
+ 251,
+ 189,
+ 7205
+ ],
+ [
+ 251,
+ 190,
+ 7293
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 95,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 95
+ },
+ "0x6587": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 415,
+ 26,
+ 0
+ ],
+ [
+ 416,
+ 28,
+ 46
+ ],
+ [
+ 417,
+ 28,
+ 63
+ ],
+ [
+ 418,
+ 30,
+ 96
+ ],
+ [
+ 419,
+ 31,
+ 97
+ ],
+ [
+ 420,
+ 31,
+ 100
+ ],
+ [
+ 422,
+ 34,
+ 130
+ ],
+ [
+ 424,
+ 36,
+ 163
+ ],
+ [
+ 425,
+ 38,
+ 163
+ ],
+ [
+ 426,
+ 39,
+ 164
+ ],
+ [
+ 427,
+ 42,
+ 196
+ ],
+ [
+ 428,
+ 45,
+ 196
+ ],
+ [
+ 429,
+ 47,
+ 229
+ ],
+ [
+ 430,
+ 50,
+ 230
+ ],
+ [
+ 431,
+ 52,
+ 263
+ ],
+ [
+ 431,
+ 54,
+ 263
+ ],
+ [
+ 432,
+ 55,
+ 296
+ ],
+ [
+ 433,
+ 56,
+ 296
+ ],
+ [
+ 433,
+ 57,
+ 300
+ ],
+ [
+ 433,
+ 58,
+ 330
+ ],
+ [
+ 433,
+ 59,
+ 330
+ ],
+ [
+ 433,
+ 60,
+ 364
+ ],
+ [
+ 433,
+ 61,
+ 365
+ ],
+ [
+ 433,
+ 62,
+ 404
+ ]
+ ],
+ [
+ [
+ 356,
+ 80,
+ 1935
+ ],
+ [
+ 357,
+ 80,
+ 1980
+ ],
+ [
+ 358,
+ 81,
+ 1981
+ ],
+ [
+ 359,
+ 81,
+ 2008
+ ],
+ [
+ 361,
+ 81,
+ 2012
+ ],
+ [
+ 363,
+ 81,
+ 2041
+ ],
+ [
+ 365,
+ 81,
+ 2045
+ ],
+ [
+ 367,
+ 81,
+ 2075
+ ],
+ [
+ 370,
+ 81,
+ 2075
+ ],
+ [
+ 372,
+ 81,
+ 2076
+ ],
+ [
+ 375,
+ 81,
+ 2108
+ ],
+ [
+ 379,
+ 81,
+ 2109
+ ],
+ [
+ 385,
+ 80,
+ 2141
+ ],
+ [
+ 390,
+ 80,
+ 2142
+ ],
+ [
+ 396,
+ 79,
+ 2174
+ ],
+ [
+ 403,
+ 79,
+ 2175
+ ],
+ [
+ 406,
+ 79,
+ 2180
+ ],
+ [
+ 410,
+ 77,
+ 2208
+ ],
+ [
+ 416,
+ 77,
+ 2209
+ ],
+ [
+ 420,
+ 76,
+ 2213
+ ],
+ [
+ 422,
+ 76,
+ 2241
+ ],
+ [
+ 428,
+ 75,
+ 2242
+ ],
+ [
+ 431,
+ 75,
+ 2245
+ ],
+ [
+ 434,
+ 74,
+ 2274
+ ],
+ [
+ 443,
+ 73,
+ 2275
+ ],
+ [
+ 446,
+ 73,
+ 2276
+ ],
+ [
+ 451,
+ 71,
+ 2307
+ ],
+ [
+ 460,
+ 70,
+ 2308
+ ],
+ [
+ 464,
+ 68,
+ 2341
+ ],
+ [
+ 468,
+ 67,
+ 2341
+ ],
+ [
+ 470,
+ 66,
+ 2374
+ ],
+ [
+ 475,
+ 64,
+ 2374
+ ],
+ [
+ 477,
+ 64,
+ 2392
+ ],
+ [
+ 479,
+ 63,
+ 2407
+ ],
+ [
+ 484,
+ 62,
+ 2408
+ ],
+ [
+ 485,
+ 61,
+ 2440
+ ],
+ [
+ 487,
+ 60,
+ 2441
+ ],
+ [
+ 489,
+ 59,
+ 2444
+ ],
+ [
+ 491,
+ 57,
+ 2474
+ ],
+ [
+ 493,
+ 56,
+ 2508
+ ],
+ [
+ 495,
+ 55,
+ 2508
+ ],
+ [
+ 496,
+ 54,
+ 2508
+ ],
+ [
+ 498,
+ 53,
+ 2540
+ ],
+ [
+ 499,
+ 52,
+ 2541
+ ],
+ [
+ 500,
+ 50,
+ 2573
+ ],
+ [
+ 501,
+ 49,
+ 2607
+ ],
+ [
+ 502,
+ 48,
+ 2640
+ ],
+ [
+ 503,
+ 47,
+ 2641
+ ],
+ [
+ 504,
+ 46,
+ 2673
+ ],
+ [
+ 504,
+ 45,
+ 2724
+ ],
+ [
+ 504,
+ 44,
+ 3053
+ ]
+ ],
+ [
+ [
+ 434,
+ 82,
+ 4671
+ ],
+ [
+ 434,
+ 84,
+ 4718
+ ],
+ [
+ 434,
+ 86,
+ 4735
+ ],
+ [
+ 434,
+ 88,
+ 4740
+ ],
+ [
+ 434,
+ 89,
+ 4768
+ ],
+ [
+ 434,
+ 92,
+ 4769
+ ],
+ [
+ 433,
+ 94,
+ 4772
+ ],
+ [
+ 432,
+ 96,
+ 4802
+ ],
+ [
+ 430,
+ 101,
+ 4802
+ ],
+ [
+ 429,
+ 103,
+ 4804
+ ],
+ [
+ 429,
+ 106,
+ 4835
+ ],
+ [
+ 428,
+ 112,
+ 4836
+ ],
+ [
+ 428,
+ 114,
+ 4836
+ ],
+ [
+ 425,
+ 121,
+ 4868
+ ],
+ [
+ 423,
+ 127,
+ 4869
+ ],
+ [
+ 421,
+ 132,
+ 4901
+ ],
+ [
+ 417,
+ 137,
+ 4902
+ ],
+ [
+ 414,
+ 143,
+ 4934
+ ],
+ [
+ 412,
+ 148,
+ 4935
+ ],
+ [
+ 406,
+ 156,
+ 4968
+ ],
+ [
+ 401,
+ 163,
+ 4969
+ ],
+ [
+ 398,
+ 166,
+ 4972
+ ],
+ [
+ 397,
+ 169,
+ 5001
+ ],
+ [
+ 393,
+ 173,
+ 5002
+ ],
+ [
+ 392,
+ 175,
+ 5005
+ ],
+ [
+ 391,
+ 176,
+ 5034
+ ],
+ [
+ 390,
+ 178,
+ 5035
+ ],
+ [
+ 389,
+ 179,
+ 5036
+ ],
+ [
+ 388,
+ 180,
+ 5067
+ ],
+ [
+ 387,
+ 181,
+ 5068
+ ],
+ [
+ 386,
+ 182,
+ 5101
+ ],
+ [
+ 385,
+ 182,
+ 5589
+ ],
+ [
+ 384,
+ 182,
+ 5616
+ ]
+ ],
+ [
+ [
+ 385,
+ 84,
+ 6399
+ ],
+ [
+ 386,
+ 84,
+ 6468
+ ],
+ [
+ 387,
+ 87,
+ 6489
+ ],
+ [
+ 388,
+ 90,
+ 6531
+ ],
+ [
+ 391,
+ 95,
+ 6531
+ ],
+ [
+ 392,
+ 97,
+ 6532
+ ],
+ [
+ 394,
+ 99,
+ 6564
+ ],
+ [
+ 396,
+ 106,
+ 6564
+ ],
+ [
+ 401,
+ 113,
+ 6597
+ ],
+ [
+ 406,
+ 120,
+ 6598
+ ],
+ [
+ 411,
+ 126,
+ 6630
+ ],
+ [
+ 416,
+ 132,
+ 6631
+ ],
+ [
+ 422,
+ 138,
+ 6663
+ ],
+ [
+ 426,
+ 143,
+ 6664
+ ],
+ [
+ 427,
+ 143,
+ 6668
+ ],
+ [
+ 429,
+ 145,
+ 6697
+ ],
+ [
+ 432,
+ 150,
+ 6697
+ ],
+ [
+ 433,
+ 153,
+ 6700
+ ],
+ [
+ 436,
+ 156,
+ 6730
+ ],
+ [
+ 440,
+ 160,
+ 6730
+ ],
+ [
+ 444,
+ 163,
+ 6732
+ ],
+ [
+ 447,
+ 165,
+ 6763
+ ],
+ [
+ 454,
+ 171,
+ 6764
+ ],
+ [
+ 457,
+ 173,
+ 6797
+ ],
+ [
+ 458,
+ 173,
+ 6798
+ ],
+ [
+ 459,
+ 174,
+ 6830
+ ],
+ [
+ 460,
+ 175,
+ 6831
+ ],
+ [
+ 462,
+ 176,
+ 6863
+ ],
+ [
+ 466,
+ 178,
+ 6864
+ ],
+ [
+ 471,
+ 179,
+ 6897
+ ],
+ [
+ 473,
+ 179,
+ 6897
+ ],
+ [
+ 474,
+ 180,
+ 6900
+ ],
+ [
+ 475,
+ 180,
+ 6930
+ ],
+ [
+ 477,
+ 180,
+ 6964
+ ],
+ [
+ 478,
+ 180,
+ 6996
+ ],
+ [
+ 479,
+ 180,
+ 7029
+ ],
+ [
+ 480,
+ 180,
+ 7064
+ ],
+ [
+ 481,
+ 181,
+ 7097
+ ],
+ [
+ 483,
+ 181,
+ 7100
+ ],
+ [
+ 485,
+ 181,
+ 7149
+ ],
+ [
+ 486,
+ 181,
+ 7180
+ ],
+ [
+ 487,
+ 181,
+ 7213
+ ],
+ [
+ 488,
+ 181,
+ 7304
+ ],
+ [
+ 489,
+ 181,
+ 7346
+ ],
+ [
+ 490,
+ 181,
+ 7396
+ ],
+ [
+ 491,
+ 181,
+ 7428
+ ],
+ [
+ 491,
+ 182,
+ 7629
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 95,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 95
+ }
+}
diff --git a/tests/auto/inputpanel/data/inputpanel/unipen_data_trad_chinese.js b/tests/auto/inputpanel/data/inputpanel/unipen_data_trad_chinese.js
new file mode 100644
index 00000000..5e0c5c3f
--- /dev/null
+++ b/tests/auto/inputpanel/data/inputpanel/unipen_data_trad_chinese.js
@@ -0,0 +1,1310 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+var unipenData = {
+ "0x570b": {
+ ".COORD": [
+ "X",
+ "Y",
+ "T"
+ ],
+ ".HIERARCHY": "CHARACTER",
+ ".PEN": [
+ [
+ [
+ 232,
+ 61,
+ 0
+ ],
+ [
+ 232,
+ 62,
+ 51
+ ],
+ [
+ 232,
+ 63,
+ 71
+ ],
+ [
+ 232,
+ 65,
+ 75
+ ],
+ [
+ 232,
+ 74,
+ 132
+ ],
+ [
+ 232,
+ 77,
+ 133
+ ],
+ [
+ 234,
+ 90,
+ 193
+ ],
+ [
+ 238,
+ 110,
+ 194
+ ],
+ [
+ 239,
+ 113,
+ 195
+ ],
+ [
+ 240,
+ 118,
+ 259
+ ],
+ [
+ 242,
+ 128,
+ 260
+ ],
+ [
+ 243,
+ 131,
+ 317
+ ],
+ [
+ 244,
+ 136,
+ 319
+ ],
+ [
+ 245,
+ 140,
+ 376
+ ],
+ [
+ 245,
+ 144,
+ 377
+ ],
+ [
+ 246,
+ 147,
+ 439
+ ],
+ [
+ 246,
+ 154,
+ 441
+ ],
+ [
+ 247,
+ 158,
+ 497
+ ],
+ [
+ 248,
+ 162,
+ 498
+ ],
+ [
+ 248,
+ 165,
+ 561
+ ],
+ [
+ 248,
+ 170,
+ 562
+ ],
+ [
+ 248,
+ 172,
+ 619
+ ],
+ [
+ 248,
+ 174,
+ 620
+ ],
+ [
+ 248,
+ 175,
+ 679
+ ],
+ [
+ 248,
+ 176,
+ 743
+ ],
+ [
+ 248,
+ 177,
+ 744
+ ],
+ [
+ 248,
+ 178,
+ 748
+ ],
+ [
+ 248,
+ 179,
+ 987
+ ]
+ ],
+ [
+ [
+ 229,
+ 61,
+ 2287
+ ],
+ [
+ 230,
+ 61,
+ 2346
+ ],
+ [
+ 231,
+ 61,
+ 2347
+ ],
+ [
+ 232,
+ 61,
+ 2409
+ ],
+ [
+ 234,
+ 61,
+ 2411
+ ],
+ [
+ 241,
+ 61,
+ 2470
+ ],
+ [
+ 252,
+ 60,
+ 2472
+ ],
+ [
+ 256,
+ 60,
+ 2475
+ ],
+ [
+ 288,
+ 58,
+ 2532
+ ],
+ [
+ 308,
+ 57,
+ 2590
+ ],
+ [
+ 325,
+ 57,
+ 2591
+ ],
+ [
+ 338,
+ 57,
+ 2654
+ ],
+ [
+ 347,
+ 56,
+ 2655
+ ],
+ [
+ 350,
+ 55,
+ 2713
+ ],
+ [
+ 351,
+ 55,
+ 2714
+ ],
+ [
+ 352,
+ 55,
+ 2779
+ ],
+ [
+ 353,
+ 54,
+ 2780
+ ],
+ [
+ 355,
+ 54,
+ 2837
+ ],
+ [
+ 357,
+ 53,
+ 2839
+ ],
+ [
+ 358,
+ 53,
+ 2924
+ ],
+ [
+ 359,
+ 53,
+ 3211
+ ],
+ [
+ 360,
+ 54,
+ 3331
+ ],
+ [
+ 361,
+ 56,
+ 3380
+ ],
+ [
+ 362,
+ 58,
+ 3381
+ ],
+ [
+ 363,
+ 61,
+ 3440
+ ],
+ [
+ 363,
+ 68,
+ 3441
+ ],
+ [
+ 363,
+ 72,
+ 3442
+ ],
+ [
+ 363,
+ 82,
+ 3504
+ ],
+ [
+ 363,
+ 99,
+ 3505
+ ],
+ [
+ 363,
+ 102,
+ 3507
+ ],
+ [
+ 365,
+ 111,
+ 3564
+ ],
+ [
+ 366,
+ 119,
+ 3565
+ ],
+ [
+ 368,
+ 132,
+ 3626
+ ],
+ [
+ 370,
+ 146,
+ 3627
+ ],
+ [
+ 370,
+ 152,
+ 3686
+ ],
+ [
+ 370,
+ 157,
+ 3687
+ ],
+ [
+ 370,
+ 162,
+ 3691
+ ],
+ [
+ 370,
+ 166,
+ 3747
+ ],
+ [
+ 370,
+ 171,
+ 3748
+ ],
+ [
+ 370,
+ 175,
+ 3813
+ ],
+ [
+ 370,
+ 177,
+ 3871
+ ],
+ [
+ 370,
+ 178,
+ 3876
+ ],
+ [
+ 370,
+ 179,
+ 4091
+ ],
+ [
+ 371,
+ 179,
+ 4239
+ ]
+ ],
+ [
+ [
+ 261,
+ 103,
+ 7159
+ ],
+ [
+ 262,
+ 103,
+ 7207
+ ],
+ [
+ 263,
+ 103,
+ 7208
+ ],
+ [
+ 268,
+ 103,
+ 7268
+ ],
+ [
+ 277,
+ 102,
+ 7269
+ ],
+ [
+ 285,
+ 101,
+ 7334
+ ],
+ [
+ 291,
+ 101,
+ 7335
+ ],
+ [
+ 296,
+ 100,
+ 7338
+ ],
+ [
+ 297,
+ 100,
+ 7390
+ ],
+ [
+ 310,
+ 97,
+ 7392
+ ],
+ [
+ 315,
+ 95,
+ 7449
+ ],
+ [
+ 317,
+ 94,
+ 7450
+ ],
+ [
+ 318,
+ 93,
+ 7451
+ ],
+ [
+ 319,
+ 92,
+ 7511
+ ],
+ [
+ 321,
+ 92,
+ 7571
+ ],
+ [
+ 323,
+ 92,
+ 7572
+ ],
+ [
+ 325,
+ 92,
+ 7631
+ ],
+ [
+ 325,
+ 91,
+ 7632
+ ],
+ [
+ 326,
+ 91,
+ 7692
+ ],
+ [
+ 327,
+ 91,
+ 7755
+ ],
+ [
+ 328,
+ 90,
+ 7844
+ ]
+ ],
+ [
+ [
+ 263,
+ 126,
+ 9608
+ ],
+ [
+ 264,
+ 126,
+ 9663
+ ],
+ [
+ 264,
+ 127,
+ 9664
+ ],
+ [
+ 265,
+ 133,
+ 9723
+ ],
+ [
+ 265,
+ 136,
+ 9724
+ ],
+ [
+ 265,
+ 139,
+ 9785
+ ],
+ [
+ 265,
+ 141,
+ 9786
+ ],
+ [
+ 265,
+ 142,
+ 9845
+ ],
+ [
+ 266,
+ 144,
+ 9846
+ ],
+ [
+ 266,
+ 145,
+ 9906
+ ],
+ [
+ 266,
+ 146,
+ 9908
+ ],
+ [
+ 267,
+ 148,
+ 9965
+ ],
+ [
+ 267,
+ 149,
+ 9966
+ ]
+ ],
+ [
+ [
+ 264,
+ 126,
+ 10655
+ ],
+ [
+ 267,
+ 126,
+ 10724
+ ],
+ [
+ 272,
+ 125,
+ 10741
+ ],
+ [
+ 277,
+ 125,
+ 10786
+ ],
+ [
+ 281,
+ 125,
+ 10787
+ ],
+ [
+ 287,
+ 125,
+ 10847
+ ],
+ [
+ 288,
+ 125,
+ 10848
+ ],
+ [
+ 291,
+ 124,
+ 10851
+ ],
+ [
+ 293,
+ 123,
+ 10915
+ ],
+ [
+ 293,
+ 125,
+ 11083
+ ],
+ [
+ 293,
+ 126,
+ 11149
+ ],
+ [
+ 293,
+ 130,
+ 11150
+ ],
+ [
+ 293,
+ 132,
+ 11155
+ ],
+ [
+ 293,
+ 135,
+ 11210
+ ],
+ [
+ 293,
+ 138,
+ 11211
+ ],
+ [
+ 293,
+ 139,
+ 11271
+ ],
+ [
+ 294,
+ 142,
+ 11272
+ ],
+ [
+ 294,
+ 143,
+ 11371
+ ],
+ [
+ 294,
+ 144,
+ 11425
+ ],
+ [
+ 294,
+ 145,
+ 11428
+ ],
+ [
+ 295,
+ 146,
+ 11484
+ ]
+ ],
+ [
+ [
+ 269,
+ 152,
+ 12343
+ ],
+ [
+ 271,
+ 152,
+ 12435
+ ],
+ [
+ 272,
+ 152,
+ 12461
+ ],
+ [
+ 275,
+ 152,
+ 12520
+ ],
+ [
+ 277,
+ 151,
+ 12521
+ ],
+ [
+ 278,
+ 151,
+ 12523
+ ],
+ [
+ 280,
+ 151,
+ 12581
+ ],
+ [
+ 281,
+ 151,
+ 12582
+ ],
+ [
+ 282,
+ 151,
+ 12642
+ ],
+ [
+ 284,
+ 151,
+ 12643
+ ],
+ [
+ 285,
+ 150,
+ 12644
+ ],
+ [
+ 286,
+ 150,
+ 12704
+ ],
+ [
+ 287,
+ 150,
+ 12762
+ ],
+ [
+ 288,
+ 150,
+ 12763
+ ],
+ [
+ 289,
+ 150,
+ 12824
+ ],
+ [
+ 290,
+ 150,
+ 12889
+ ],
+ [
+ 291,
+ 150,
+ 12947
+ ],
+ [
+ 292,
+ 150,
+ 13005
+ ],
+ [
+ 293,
+ 150,
+ 13066
+ ]
+ ],
+ [
+ [
+ 270,
+ 172,
+ 18223
+ ],
+ [
+ 271,
+ 172,
+ 18227
+ ],
+ [
+ 273,
+ 172,
+ 18277
+ ],
+ [
+ 277,
+ 172,
+ 18278
+ ],
+ [
+ 280,
+ 172,
+ 18339
+ ],
+ [
+ 283,
+ 170,
+ 18340
+ ],
+ [
+ 288,
+ 168,
+ 18398
+ ],
+ [
+ 292,
+ 167,
+ 18398
+ ],
+ [
+ 295,
+ 167,
+ 18402
+ ],
+ [
+ 296,
+ 167,
+ 18465
+ ],
+ [
+ 298,
+ 167,
+ 18466
+ ],
+ [
+ 300,
+ 166,
+ 18522
+ ],
+ [
+ 301,
+ 166,
+ 18583
+ ],
+ [
+ 302,
+ 166,
+ 18779
+ ]
+ ],
+ [
+ [
+ 301,
+ 79,
+ 19886
+ ],
+ [
+ 301,
+ 80,
+ 19995
+ ],
+ [
+ 301,
+ 82,
+ 20021
+ ],
+ [
+ 302,
+ 84,
+ 20027
+ ],
+ [
+ 303,
+ 86,
+ 20075
+ ],
+ [
+ 304,
+ 88,
+ 20076
+ ],
+ [
+ 304,
+ 90,
+ 20130
+ ],
+ [
+ 306,
+ 94,
+ 20131
+ ],
+ [
+ 309,
+ 101,
+ 20190
+ ],
+ [
+ 312,
+ 109,
+ 20191
+ ],
+ [
+ 314,
+ 113,
+ 20195
+ ],
+ [
+ 315,
+ 117,
+ 20250
+ ],
+ [
+ 316,
+ 123,
+ 20251
+ ],
+ [
+ 318,
+ 129,
+ 20311
+ ],
+ [
+ 321,
+ 136,
+ 20312
+ ],
+ [
+ 324,
+ 141,
+ 20372
+ ],
+ [
+ 326,
+ 145,
+ 20374
+ ],
+ [
+ 329,
+ 150,
+ 20432
+ ],
+ [
+ 330,
+ 153,
+ 20434
+ ],
+ [
+ 331,
+ 155,
+ 20499
+ ],
+ [
+ 332,
+ 157,
+ 20500
+ ],
+ [
+ 333,
+ 158,
+ 20555
+ ],
+ [
+ 333,
+ 160,
+ 20557
+ ],
+ [
+ 333,
+ 161,
+ 20614
+ ],
+ [
+ 334,
+ 162,
+ 20677
+ ],
+ [
+ 334,
+ 163,
+ 20739
+ ],
+ [
+ 335,
+ 164,
+ 20799
+ ],
+ [
+ 336,
+ 165,
+ 20801
+ ],
+ [
+ 337,
+ 165,
+ 20859
+ ],
+ [
+ 338,
+ 167,
+ 20860
+ ],
+ [
+ 338,
+ 168,
+ 20919
+ ],
+ [
+ 339,
+ 168,
+ 21020
+ ],
+ [
+ 340,
+ 168,
+ 21131
+ ],
+ [
+ 341,
+ 166,
+ 21192
+ ],
+ [
+ 342,
+ 166,
+ 21193
+ ],
+ [
+ 342,
+ 163,
+ 21253
+ ],
+ [
+ 343,
+ 162,
+ 21254
+ ],
+ [
+ 344,
+ 160,
+ 21258
+ ],
+ [
+ 344,
+ 159,
+ 21316
+ ],
+ [
+ 345,
+ 158,
+ 21317
+ ]
+ ],
+ [
+ [
+ 339,
+ 113,
+ 23351
+ ],
+ [
+ 338,
+ 113,
+ 23426
+ ],
+ [
+ 337,
+ 117,
+ 23453
+ ],
+ [
+ 336,
+ 117,
+ 23485
+ ],
+ [
+ 334,
+ 122,
+ 23505
+ ],
+ [
+ 333,
+ 124,
+ 23506
+ ],
+ [
+ 332,
+ 125,
+ 23507
+ ],
+ [
+ 331,
+ 129,
+ 23561
+ ],
+ [
+ 329,
+ 132,
+ 23562
+ ],
+ [
+ 327,
+ 135,
+ 23623
+ ],
+ [
+ 323,
+ 143,
+ 23625
+ ],
+ [
+ 320,
+ 149,
+ 23682
+ ],
+ [
+ 319,
+ 150,
+ 23683
+ ],
+ [
+ 317,
+ 152,
+ 23745
+ ],
+ [
+ 314,
+ 157,
+ 23747
+ ],
+ [
+ 313,
+ 159,
+ 23805
+ ],
+ [
+ 310,
+ 165,
+ 23806
+ ],
+ [
+ 310,
+ 166,
+ 23810
+ ],
+ [
+ 309,
+ 167,
+ 23908
+ ]
+ ],
+ [
+ [
+ 319,
+ 69,
+ 25630
+ ],
+ [
+ 321,
+ 70,
+ 25747
+ ],
+ [
+ 322,
+ 71,
+ 25774
+ ],
+ [
+ 326,
+ 73,
+ 25779
+ ],
+ [
+ 327,
+ 74,
+ 25843
+ ],
+ [
+ 333,
+ 78,
+ 25844
+ ],
+ [
+ 335,
+ 80,
+ 25904
+ ]
+ ],
+ [
+ [
+ 256,
+ 179,
+ 27231
+ ],
+ [
+ 257,
+ 179,
+ 27302
+ ],
+ [
+ 263,
+ 179,
+ 27332
+ ],
+ [
+ 282,
+ 179,
+ 27393
+ ],
+ [
+ 290,
+ 179,
+ 27394
+ ],
+ [
+ 314,
+ 179,
+ 27455
+ ],
+ [
+ 326,
+ 180,
+ 27457
+ ],
+ [
+ 329,
+ 180,
+ 27460
+ ],
+ [
+ 336,
+ 180,
+ 27516
+ ],
+ [
+ 343,
+ 180,
+ 27516
+ ],
+ [
+ 344,
+ 180,
+ 27578
+ ],
+ [
+ 345,
+ 180,
+ 27580
+ ],
+ [
+ 346,
+ 180,
+ 27639
+ ],
+ [
+ 347,
+ 180,
+ 27641
+ ],
+ [
+ 348,
+ 179,
+ 27698
+ ],
+ [
+ 350,
+ 179,
+ 27759
+ ],
+ [
+ 352,
+ 179,
+ 27760
+ ],
+ [
+ 354,
+ 179,
+ 27821
+ ],
+ [
+ 357,
+ 179,
+ 27882
+ ],
+ [
+ 358,
+ 179,
+ 27944
+ ],
+ [
+ 359,
+ 179,
+ 28003
+ ],
+ [
+ 361,
+ 179,
+ 28004
+ ]
+ ]
+ ],
+ ".POINTS_PER_SECOND": 60,
+ ".SEGMENT": "CHARACTER",
+ ".VERSION": "1.0",
+ ".X_DIM": 1032,
+ ".X_POINTS_PER_INCH": 94,
+ ".Y_DIM": 263,
+ ".Y_POINTS_PER_INCH": 94
+ }
+}
diff --git a/tests/auto/inputpanel/data/tst_inputpanel.qml b/tests/auto/inputpanel/data/tst_inputpanel.qml
index 67796016..89bd1d70 100644
--- a/tests/auto/inputpanel/data/tst_inputpanel.qml
+++ b/tests/auto/inputpanel/data/tst_inputpanel.qml
@@ -105,6 +105,11 @@ Rectangle {
verify(inputPanel.setLocale(locale))
if (localeChanged && !(textInput.inputMethodHints & Qt.ImhNoPredictiveText))
wait(300)
+ if (data !== undefined && data.hasOwnProperty("initHwrMode") && data.initHwrMode) {
+ if (!inputPanel.setHandwritingMode(true))
+ expectFail("", "Handwriting not enabled")
+ verify(inputPanel.handwritingMode === true)
+ }
if (data !== undefined && data.hasOwnProperty("initInputMode")) {
var inputMode = inputPanel.mapInputMode(data.initInputMode)
if (!inputPanel.isInputModeSupported(inputMode))
@@ -310,19 +315,26 @@ Rectangle {
return [
{ initLocale: "ar_AR", initInputMethodHints: Qt.ImhNoPredictiveText, inputSequence: "\u0645\u0631\u062D\u0628\u0627", outputText: "\u0645\u0631\u062D\u0628\u0627" },
{ initLocale: "fa_FA", initInputMethodHints: Qt.ImhNoPredictiveText, inputSequence: "\u0633\u0644\u0627\u0645", outputText: "\u0633\u0644\u0627\u0645" },
+ { initLocale: "cs_CZ", initInputMethodHints: Qt.ImhNoPredictiveText, inputSequence: "ahoj", outputText: "Ahoj" },
{ initLocale: "da_DK", initInputMethodHints: Qt.ImhNoPredictiveText, inputSequence: "hej", outputText: "Hej" },
{ initLocale: "de_DE", initInputMethodHints: Qt.ImhNoPredictiveText, inputSequence: "hallo", outputText: "Hallo" },
+ { initLocale: "el_GR", initInputMethodHints: Qt.ImhNoPredictiveText, inputSequence: "\u03C7\u03B1\u03AF\u03C1\u03B5\u03C4\u03B5", outputText: "\u03A7\u03B1\u03AF\u03C1\u03B5\u03C4\u03B5" },
{ initLocale: "en_GB", initInputMethodHints: Qt.ImhNoPredictiveText, inputSequence: "hello", outputText: "Hello" },
{ initLocale: "es_ES", initInputMethodHints: Qt.ImhNoPredictiveText, inputSequence: "hola", outputText: "Hola" },
+ { initLocale: "et_EE", initInputMethodHints: Qt.ImhNoPredictiveText, inputSequence: "tere", outputText: "Tere" },
{ initLocale: "hi_IN", initInputMethodHints: Qt.ImhNoPredictiveText, inputSequence: "\u0928\u092E\u0938\u094D\u0915\u093E\u0930", outputText: "\u0928\u092E\u0938\u094D\u0915\u093E\u0930" },
+ { initLocale: "hr_HR", initInputMethodHints: Qt.ImhNoPredictiveText, inputSequence: "zdravo", outputText: "Zdravo" },
+ { initLocale: "hu_HU", initInputMethodHints: Qt.ImhNoPredictiveText, inputSequence: "helló", outputText: "Helló" },
{ initLocale: "fi_FI", initInputMethodHints: Qt.ImhNoPredictiveText, inputSequence: "hei", outputText: "Hei" },
{ initLocale: "fr_FR", initInputMethodHints: Qt.ImhNoPredictiveText, inputSequence: "bonjour", outputText: "Bonjour" },
{ initLocale: "it_IT", initInputMethodHints: Qt.ImhNoPredictiveText, inputSequence: "ciao", outputText: "Ciao" },
{ initLocale: "ja_JP", initInputMethodHints: Qt.ImhNoPredictiveText, inputSequence: "watashi", outputText: "\u308F\u305F\u3057" },
{ initLocale: "nb_NO", initInputMethodHints: Qt.ImhNoPredictiveText, inputSequence: "hallo", outputText: "Hallo" },
+ { initLocale: "nl_NL", initInputMethodHints: Qt.ImhNoPredictiveText, inputSequence: "hallo", outputText: "Hallo" },
{ initLocale: "pl_PL", initInputMethodHints: Qt.ImhNoPredictiveText, inputSequence: "cze\u015B\u0107", outputText: "Cze\u015B\u0107" },
{ initLocale: "pt_PT", initInputMethodHints: Qt.ImhNoPredictiveText, inputSequence: "ol\u00E1", outputText: "Ol\u00E1" },
{ initLocale: "ru_RU", initInputMethodHints: Qt.ImhNoPredictiveText, inputSequence: "\u043F\u0440\u0438\u0432\u0435\u0442", outputText: "\u041F\u0440\u0438\u0432\u0435\u0442" },
+ { initLocale: "sr_SP", initInputMethodHints: Qt.ImhNoPredictiveText, inputSequence: "\u0437\u0434\u0440\u0430\u0432\u043E", outputText: "\u0417\u0434\u0440\u0430\u0432\u043E" },
{ initLocale: "sv_SE", initInputMethodHints: Qt.ImhNoPredictiveText, inputSequence: "hall\u00E5", outputText: "Hall\u00E5" }
]
}
@@ -348,6 +360,12 @@ Rectangle {
{ initInputMethodHints: Qt.ImhNoPredictiveText | Qt.ImhDigitsOnly, inputSequence: "1234567890" + decmialPoint, outputText: "1234567890" + decmialPoint },
{ initInputMethodHints: Qt.ImhNoPredictiveText | Qt.ImhFormattedNumbersOnly, inputSequence: "1234567890+-,.()", outputText: "1234567890+-,.()" },
{ initInputMethodHints: Qt.ImhNoPredictiveText | Qt.ImhDialableCharactersOnly, inputSequence: "1234567890+*#", outputText: "1234567890+*#" },
+ { initInputMethodHints: Qt.ImhNoPredictiveText | Qt.ImhEmailCharactersOnly, inputSequence: "a@b.c", outputText: "a@b.c" },
+ // Note: Some non-latin keyboards provide a QWERTY layout
+ { initLocale: "el_GR", initInputMethodHints: Qt.ImhNoPredictiveText | Qt.ImhEmailCharactersOnly, inputSequence: "a@b.c", outputText: "a@b.c" },
+ { initLocale: "el_GR", initInputMethodHints: Qt.ImhNoPredictiveText | Qt.ImhLatinOnly, inputSequence: "abc", outputText: "Abc" },
+ { initLocale: "he_IL", initInputMethodHints: Qt.ImhNoPredictiveText | Qt.ImhEmailCharactersOnly, inputSequence: "a@b.c", outputText: "a@b.c" },
+ { initLocale: "he_IL", initInputMethodHints: Qt.ImhNoPredictiveText | Qt.ImhLatinOnly, inputSequence: "abc", outputText: "Abc" },
]
}
@@ -1095,19 +1113,25 @@ Rectangle {
function test_hwrInputSequence_data() {
return [
- { initInputMethodHints: Qt.ImhNoPredictiveText, toggleShiftCount: 0, inputSequence: "abcdefghij", outputText: "Abcdefghij" },
- { initInputMethodHints: Qt.ImhNoPredictiveText, toggleShiftCount: 1, inputSequence: "klmnopqrst", outputText: "klmnopqrst" },
- { initInputMethodHints: Qt.ImhNoPredictiveText, toggleShiftCount: 3, inputSequence: "uvwxyz", outputText: "UVWXYZ" },
+ { initHwrMode: true, initInputMethodHints: Qt.ImhNoPredictiveText, toggleShiftCount: 0, inputSequence: "abcdefghij", outputText: "Abcdefghij" },
+ { initHwrMode: true, initInputMethodHints: Qt.ImhNoPredictiveText, toggleShiftCount: 1, inputSequence: "klmnopqrst", outputText: "klmnopqrst" },
+ { initHwrMode: true, initInputMethodHints: Qt.ImhNoPredictiveText, toggleShiftCount: 3, inputSequence: "uvwxyz", outputText: "UVWXYZ" },
+ { initHwrMode: true, initInputMethodHints: Qt.ImhNone, initLocale: "zh_CN", initInputMode: "ChineseHandwriting", inputSequence: "\u4e2d\u6587", outputText: "\u4e2d\u6587" },
+ { initHwrMode: true, initInputMethodHints: Qt.ImhNone, initLocale: "zh_TW", initInputMode: "ChineseHandwriting", inputSequence: "\u570b", outputText: "\u570b" },
+ { initHwrMode: true, initInputMethodHints: Qt.ImhNone, initLocale: "ja_JP", initInputMode: "JapaneseHandwriting", inputSequence: "\u65E5\u672C\u8A9E", outputText: "\u65E5\u672C\u8A9E" },
+ { initHwrMode: true, initInputMethodHints: Qt.ImhNone, initLocale: "ko_KR", initInputMode: "KoreanHandwriting", inputSequence: "\uD55C\uAD6D\uC5B4", outputText: "\uD55C\uAD6D\uC5B4" },
+ { initHwrMode: true, initInputMethodHints: Qt.ImhNone, initLocale: "el_GR", initInputMode: "Greek", inputSequence: "\u0395\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AC", outputText: "\u0395\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AC" },
+ { initHwrMode: true, initInputMethodHints: Qt.ImhNone, initLocale: "bg_BG", initInputMode: "Cyrillic", inputSequence: "\u0431\u044A\u043B\u0433\u0430\u0440\u0441\u043A\u0438", outputText: "\u0411\u044A\u043B\u0433\u0430\u0440\u0441\u043A\u0438" },
+ { initHwrMode: true, initInputMethodHints: Qt.ImhNone, initLocale: "cs_CZ", initInputMode: "Latin", inputSequence: "ahoj", outputText: "Ahoj" },
+ { initHwrMode: true, initInputMethodHints: Qt.ImhNone, initLocale: "ar_AR", initInputMode: "Arabic", inputSequence: "\u0643\u062A\u0627\u0628", outputText: "\u0643\u062A\u0627\u0628" },
+ { initHwrMode: true, initInputMethodHints: Qt.ImhNone, initLocale: "fa_FA", initInputMode: "Arabic", inputSequence: "\u0686\u0627\u06CC", outputText: "\u0686\u0627\u06CC" },
+ { initHwrMode: true, initInputMethodHints: Qt.ImhNone, initLocale: "he_IL", initInputMode: "Hebrew", inputSequence: "\u05D0\u05D5\u05D8\u05D5", outputText: "\u05D0\u05D5\u05D8\u05D5" },
]
}
function test_hwrInputSequence(data) {
prepareTest(data)
- if (!inputPanel.setHandwritingMode(true))
- expectFail("", "Handwriting not enabled")
- verify(inputPanel.handwritingMode === true)
-
for (var i = 0; i < data.toggleShiftCount; i++) {
inputPanel.toggleShift()
}
@@ -1128,20 +1152,20 @@ Rectangle {
function test_hwrNumericInputSequence_data() {
return [
- { initInputMethodHints: Qt.ImhNoPredictiveText | Qt.ImhPreferNumbers, modeSwitchAllowed: true, inputSequence: "0123456789", outputText: "0123456789" },
- { initInputMethodHints: Qt.ImhNoPredictiveText | Qt.ImhDigitsOnly, modeSwitchAllowed: false, inputSequence: "1234567890", outputText: "1234567890" },
- { initInputMethodHints: Qt.ImhNoPredictiveText | Qt.ImhFormattedNumbersOnly, modeSwitchAllowed: false, inputSequence: "1234567890+", outputText: "1234567890+" },
- { initInputMethodHints: Qt.ImhNoPredictiveText | Qt.ImhDialableCharactersOnly, modeSwitchAllowed: false, inputSequence: "1234567890+", outputText: "1234567890+" },
+ { initHwrMode: true, initInputMethodHints: Qt.ImhNoPredictiveText | Qt.ImhPreferNumbers, modeSwitchAllowed: true, inputSequence: "0123456789", outputText: "0123456789" },
+ { initHwrMode: true, initInputMethodHints: Qt.ImhNoPredictiveText | Qt.ImhDigitsOnly, modeSwitchAllowed: false, inputSequence: "1234567890", outputText: "1234567890" },
+ { initHwrMode: true, initInputMethodHints: Qt.ImhNoPredictiveText | Qt.ImhFormattedNumbersOnly, modeSwitchAllowed: false, inputSequence: "1234567890+", outputText: "1234567890+" },
+ { initHwrMode: true, initInputMethodHints: Qt.ImhNoPredictiveText | Qt.ImhDialableCharactersOnly, modeSwitchAllowed: false, inputSequence: "1234567890+", outputText: "1234567890+" },
+ { initHwrMode: true, initLocale: "zh_CN", initInputMethodHints: Qt.ImhNoPredictiveText | Qt.ImhPreferNumbers, modeSwitchAllowed: true, inputSequence: "0123456789", outputText: "0123456789" },
+ { initHwrMode: true, initLocale: "zh_CN", initInputMethodHints: Qt.ImhNoPredictiveText | Qt.ImhDigitsOnly, modeSwitchAllowed: false, inputSequence: "1234567890", outputText: "1234567890" },
+ { initHwrMode: true, initLocale: "zh_CN", initInputMethodHints: Qt.ImhNoPredictiveText | Qt.ImhFormattedNumbersOnly, modeSwitchAllowed: false, inputSequence: "1234567890+", outputText: "1234567890+" },
+ { initHwrMode: true, initLocale: "zh_CN", initInputMethodHints: Qt.ImhNoPredictiveText | Qt.ImhDialableCharactersOnly, modeSwitchAllowed: false, inputSequence: "1234567890+", outputText: "1234567890+" },
]
}
function test_hwrNumericInputSequence(data) {
prepareTest(data)
- if (!inputPanel.setHandwritingMode(true))
- expectFail("", "Handwriting not enabled")
- verify(inputPanel.handwritingMode === true)
-
for (var inputIndex in data.inputSequence) {
verify(inputPanel.emulateHandwriting(data.inputSequence.charAt(inputIndex), true))
}
@@ -1267,6 +1291,7 @@ Rectangle {
function test_hwrFullScreenGestures_data() {
return [
{ initInputMethodHints: Qt.ImhNoPredictiveText, inputSequence: ["a","b","c",Qt.Key_Backspace,Qt.Key_Space,"c"], outputText: "Ab c" },
+ { initHwrMode: true, initInputMethodHints: Qt.ImhNone, initLocale: "zh_CN", initInputMode: "ChineseHandwriting", inputSequence: ["\u4e2d", "\u6587", Qt.Key_Backspace], outputText: "\u4e2d" },
]
}
@@ -1300,7 +1325,8 @@ Rectangle {
prepareTest(data)
if (!handwritingInputPanel.enabled)
- skip("Handwriting not enabled")
+ expectFail("", "Handwriting not enabled")
+ verify(handwritingInputPanel.enabled)
handwritingInputPanel.available = true
if (!inputPanel.wordCandidateListVisibleHint)
skip("Word candidates not available (spell correction/hwr suggestions)")
diff --git a/tests/auto/inputpanel/hwr_test_data/alphanumeric/113_100_0.txt b/tests/auto/inputpanel/hwr_test_data/alphanumeric/113_100_0.txt
index 714ad4c8..14d57b77 100644
--- a/tests/auto/inputpanel/hwr_test_data/alphanumeric/113_100_0.txt
+++ b/tests/auto/inputpanel/hwr_test_data/alphanumeric/113_100_0.txt
@@ -2,55 +2,75 @@
.HIERARCHY CHARACTER
.COORD X Y T
.SEGMENT CHARACTER
-.X_DIM 821
-.Y_DIM 211
-.X_POINTS_PER_INCH 100
-.Y_POINTS_PER_INCH 100
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 95
+.Y_POINTS_PER_INCH 95
.POINTS_PER_SECOND 60
.PEN_DOWN
-435 78 0
-435 77 13
-435 76 33
-435 75 70
-434 74 84
-434 73 109
-431 70 130
-417 65 156
-407 65 174
-385 70 194
-377 73 214
-361 83 238
-355 88 247
-349 100 275
-354 113 310
-360 117 338
-368 120 357
-379 120 377
-408 110 412
-414 105 437
-423 95 462
-424 91 484
-426 87 511
-426 83 541
-427 81 564
-426 80 591
-427 79 648
-427 81 698
-427 83 722
-428 90 741
-430 98 760
-432 118 788
-434 129 797
-436 151 829
-436 160 844
-437 166 863
-437 171 899
-437 173 921
-437 176 938
-437 177 964
-437 178 985
-437 179 1013
-437 180 1032
-437 181 1101
-438 181 1136
+407 75 0
+406 74 76
+403 74 96
+401 73 100
+395 73 128
+392 73 129
+388 73 131
+385 73 162
+375 73 162
+370 75 163
+360 78 195
+349 85 196
+342 91 228
+338 98 229
+337 107 261
+337 115 261
+342 125 294
+347 133 295
+351 135 299
+353 139 328
+359 143 329
+363 144 331
+365 145 361
+369 148 362
+371 148 363
+372 148 395
+376 146 396
+382 143 427
+387 137 428
+391 129 461
+395 123 461
+400 118 494
+401 113 494
+402 108 527
+404 103 528
+406 99 531
+406 96 561
+408 90 561
+408 88 564
+408 86 593
+409 84 594
+409 83 627
+409 82 661
+409 81 694
+409 83 844
+409 89 878
+409 93 879
+409 98 884
+408 103 910
+407 118 911
+407 135 943
+407 157 944
+407 166 948
+409 175 976
+410 186 977
+410 191 979
+411 196 1009
+411 203 1010
+413 207 1011
+413 211 1042
+413 223 1043
+413 230 1076
+413 234 1077
+413 235 1109
+413 236 1110
.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/arabic/1575_100_0.txt b/tests/auto/inputpanel/hwr_test_data/arabic/1575_100_0.txt
new file mode 100644
index 00000000..909439f2
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/arabic/1575_100_0.txt
@@ -0,0 +1,28 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+354 61 0
+354 64 76
+354 69 92
+354 83 133
+348 104 196
+345 127 198
+345 137 255
+347 157 256
+347 159 260
+347 164 315
+346 170 316
+345 174 376
+345 177 377
+344 179 379
+344 181 437
+344 182 438
+344 183 499
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/arabic/1576_100_0.txt b/tests/auto/inputpanel/hwr_test_data/arabic/1576_100_0.txt
new file mode 100644
index 00000000..6b14f1a0
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/arabic/1576_100_0.txt
@@ -0,0 +1,59 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+264 132 0
+264 133 68
+263 139 69
+262 146 127
+262 149 128
+259 160 132
+259 163 188
+255 180 190
+252 184 251
+251 185 254
+246 186 310
+241 186 374
+236 186 376
+234 186 380
+232 186 433
+218 184 434
+214 184 436
+204 183 493
+195 181 494
+187 180 556
+181 179 558
+175 178 617
+169 178 618
+162 177 676
+159 177 677
+154 177 737
+146 176 738
+145 176 797
+143 174 859
+140 170 861
+140 168 918
+140 165 919
+140 160 978
+140 151 979
+140 139 1041
+142 132 1043
+143 131 1102
+143 127 1103
+143 126 1228
+.PEN_UP
+.PEN_DOWN
+193 204 1784
+193 206 1836
+193 208 1863
+193 210 1867
+193 211 1923
+193 212 1924
+193 213 1984
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/arabic/1578_100_0.txt b/tests/auto/inputpanel/hwr_test_data/arabic/1578_100_0.txt
new file mode 100644
index 00000000..f3fa71a3
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/arabic/1578_100_0.txt
@@ -0,0 +1,77 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+497 124 0
+497 125 76
+497 129 99
+496 132 135
+496 135 136
+495 140 198
+493 148 199
+491 158 259
+491 160 259
+491 165 260
+490 167 319
+487 176 320
+487 178 382
+485 183 383
+483 185 443
+479 188 445
+476 190 501
+471 192 503
+468 192 532
+465 193 562
+456 194 563
+452 195 564
+448 195 624
+436 195 624
+432 195 627
+420 194 687
+410 192 688
+403 190 691
+396 189 746
+381 188 747
+370 186 806
+354 183 807
+340 182 867
+334 182 868
+332 181 928
+330 181 929
+330 179 989
+330 176 1050
+332 174 1051
+333 171 1051
+335 168 1113
+337 164 1114
+339 162 1117
+340 160 1174
+341 156 1174
+343 152 1232
+345 143 1233
+345 142 1292
+345 141 1353
+.PEN_UP
+.PEN_DOWN
+398 104 1752
+399 105 1809
+403 116 1810
+404 124 1871
+404 128 1871
+406 130 1933
+.PEN_UP
+.PEN_DOWN
+436 109 2182
+436 113 2209
+436 114 2211
+435 122 2212
+434 124 2270
+433 130 2272
+433 134 2328
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/arabic/1603_100_0.txt b/tests/auto/inputpanel/hwr_test_data/arabic/1603_100_0.txt
new file mode 100644
index 00000000..8f950deb
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/arabic/1603_100_0.txt
@@ -0,0 +1,99 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+634 60 0
+634 61 47
+634 63 50
+635 69 110
+636 79 111
+636 85 140
+636 90 169
+636 103 170
+637 118 230
+637 135 231
+637 138 260
+637 148 290
+637 153 291
+637 157 353
+637 161 354
+637 162 356
+637 163 412
+637 168 413
+636 169 473
+634 174 474
+633 175 477
+633 176 533
+632 177 535
+627 178 594
+625 180 595
+620 181 656
+613 182 657
+601 183 717
+590 184 718
+582 185 778
+580 186 779
+578 186 780
+573 186 839
+565 186 840
+563 186 843
+559 186 902
+556 186 909
+550 185 961
+546 184 1022
+544 184 1083
+542 183 1084
+539 183 1144
+538 182 1145
+535 180 1207
+534 179 1209
+534 178 1212
+533 176 1267
+532 176 1268
+531 174 1269
+531 172 1328
+530 168 1329
+528 162 1390
+527 158 1392
+527 157 1451
+526 154 1453
+526 153 1510
+526 152 1571
+.PEN_UP
+.PEN_DOWN
+597 77 2271
+595 77 2329
+591 79 2361
+587 81 2363
+583 83 2419
+581 84 2420
+578 87 2420
+576 88 2480
+572 96 2480
+571 102 2542
+571 107 2542
+573 111 2602
+578 117 2603
+581 118 2663
+583 118 2668
+586 118 2724
+593 118 2725
+601 115 2784
+603 113 2785
+603 112 2788
+603 111 2956
+600 115 2997
+597 119 3057
+594 122 3058
+588 128 3117
+585 131 3118
+582 134 3181
+581 134 3183
+580 135 3244
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/arabic/1670_100_0.txt b/tests/auto/inputpanel/hwr_test_data/arabic/1670_100_0.txt
new file mode 100644
index 00000000..58580245
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/arabic/1670_100_0.txt
@@ -0,0 +1,60 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+458 113 0
+457 112 48
+457 111 49
+454 107 103
+446 99 104
+440 94 165
+426 75 166
+419 61 227
+419 58 228
+420 53 230
+441 49 288
+473 49 289
+508 55 349
+517 65 350
+517 71 409
+501 85 411
+454 104 471
+435 108 472
+417 112 475
+397 119 536
+383 126 537
+377 130 539
+376 138 594
+376 144 595
+378 148 596
+383 156 654
+390 162 655
+410 169 716
+446 172 717
+467 172 749
+487 172 777
+503 173 778
+517 173 779
+533 170 838
+553 169 838
+555 169 868
+555 168 899
+.PEN_UP
+.PEN_DOWN
+505 127 1279
+503 127 1283
+491 127 1351
+475 128 1352
+471 131 1412
+475 142 1413
+504 149 1474
+512 145 1475
+512 143 1539
+510 134 1541
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/arabic/1740_100_0.txt b/tests/auto/inputpanel/hwr_test_data/arabic/1740_100_0.txt
new file mode 100644
index 00000000..f119560c
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/arabic/1740_100_0.txt
@@ -0,0 +1,55 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+399 119 0
+399 118 49
+399 116 50
+399 111 110
+399 107 110
+399 104 141
+398 99 171
+397 97 172
+395 88 173
+391 79 234
+384 70 236
+381 68 298
+380 67 298
+379 67 300
+376 67 353
+371 69 353
+366 71 356
+363 73 414
+357 78 415
+352 91 476
+349 105 477
+349 116 536
+355 129 537
+356 132 539
+357 137 596
+362 150 597
+363 156 661
+362 161 662
+359 165 717
+349 171 718
+331 178 777
+328 179 778
+320 181 780
+311 182 840
+297 182 841
+289 181 900
+284 179 901
+282 177 961
+276 170 962
+275 164 1023
+275 160 1023
+275 156 1083
+275 151 1084
+275 147 1143
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/build_unipen_data.py b/tests/auto/inputpanel/hwr_test_data/build_unipen_data.py
index 639912b9..eb4231c3 100755
--- a/tests/auto/inputpanel/hwr_test_data/build_unipen_data.py
+++ b/tests/auto/inputpanel/hwr_test_data/build_unipen_data.py
@@ -2,19 +2,30 @@
#############################################################################
##
-## Copyright (C) 2015 The Qt Company Ltd
-## All rights reserved.
-## For any questions to The Qt Company, please use contact form at http://qt.io
+## Copyright (C) 2017 The Qt Company Ltd.
+## Contact: https://www.qt.io/licensing/
##
-## This file is part of the Qt Virtual Keyboard add-on.
+## This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
##
-## Licensees holding valid commercial license for Qt may use this file in
-## accordance with the Qt License Agreement provided with the Software
-## or, alternatively, in accordance with the terms contained in a written
-## agreement between you and The Qt Company.
+## $QT_BEGIN_LICENSE:GPL$
+## Commercial License Usage
+## Licensees holding valid commercial Qt licenses may use this file in
+## accordance with the commercial license agreement provided with the
+## Software or, alternatively, in accordance with the terms contained in
+## a written agreement between you and The Qt Company. For licensing terms
+## and conditions see https://www.qt.io/terms-conditions. For further
+## information use the contact form at https://www.qt.io/contact-us.
##
-## If you have questions regarding the use of this file, please use
-## contact form at http://qt.io
+## GNU General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU
+## General Public License version 3 or (at your option) any later version
+## approved by the KDE Free Qt Foundation. The licenses are as published by
+## the Free Software Foundation and appearing in the file LICENSE.GPL3
+## included in the packaging of this file. Please review the following
+## information to ensure the GNU General Public License requirements will
+## be met: https://www.gnu.org/licenses/gpl-3.0.html.
+##
+## $QT_END_LICENSE$
##
#############################################################################
@@ -28,23 +39,34 @@ import re
unipen_file_pattern = re.compile(r'(^[0-9]{2,9}).*\.txt')
def print_header():
- print """/******************************************************************************
+ print """/****************************************************************************
+**
+** Copyright (C) %s The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
**
-** Copyright (C) %s The Qt Company Ltd
-** All rights reserved.
-** For any questions to The Qt Company, please use contact form at http://qt.io
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
**
-** This file is part of the Qt Virtual Keyboard add-on.
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
**
-** Licensees holding valid commercial license for Qt may use this file in
-** accordance with the Qt License Agreement provided with the Software
-** or, alternatively, in accordance with the terms contained in a written
-** agreement between you and The Qt Company.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
-** If you have questions regarding the use of this file, please use
-** contact form at http://qt.io
+** $QT_END_LICENSE$
**
-******************************************************************************/""" % datetime.datetime.now().year
+****************************************************************************/""" % datetime.datetime.now().year
def scan_unipen_files(path):
file_list = []
diff --git a/tests/auto/inputpanel/hwr_test_data/cyrillic/1072_100_0.txt b/tests/auto/inputpanel/hwr_test_data/cyrillic/1072_100_0.txt
new file mode 100644
index 00000000..b9749e07
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/cyrillic/1072_100_0.txt
@@ -0,0 +1,91 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 95
+.Y_POINTS_PER_INCH 95
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+531 128 0
+532 128 56
+534 127 72
+536 127 100
+538 124 100
+539 124 103
+541 123 133
+544 122 133
+546 122 136
+548 122 165
+554 122 166
+557 121 168
+561 121 199
+570 125 200
+575 130 232
+579 135 233
+583 141 266
+586 148 266
+586 154 298
+586 160 299
+586 163 303
+586 166 332
+587 171 333
+587 174 336
+587 176 366
+587 180 367
+587 181 368
+587 182 399
+587 183 399
+588 185 400
+589 188 432
+589 190 465
+589 189 511
+589 187 548
+.PEN_UP
+.PEN_DOWN
+572 155 892
+567 153 935
+565 152 935
+562 150 964
+559 150 965
+556 150 967
+553 150 997
+548 150 998
+546 150 1000
+544 150 1030
+541 150 1031
+540 152 1031
+537 153 1064
+535 155 1064
+531 158 1065
+527 163 1097
+526 166 1098
+524 168 1130
+524 172 1131
+524 173 1136
+524 175 1163
+526 178 1164
+526 180 1167
+527 180 1196
+530 183 1197
+532 184 1199
+534 185 1229
+539 187 1230
+541 187 1231
+544 187 1263
+546 187 1264
+551 187 1264
+555 187 1297
+562 186 1297
+567 184 1330
+575 180 1330
+578 178 1347
+579 176 1363
+580 175 1363
+580 174 1380
+581 173 1396
+582 173 1440
+583 173 1465
+582 173 1640
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/cyrillic/1073_100_0.txt b/tests/auto/inputpanel/hwr_test_data/cyrillic/1073_100_0.txt
new file mode 100644
index 00000000..3709db8e
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/cyrillic/1073_100_0.txt
@@ -0,0 +1,102 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 95
+.Y_POINTS_PER_INCH 95
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+262 61 0
+260 61 5
+252 60 47
+246 60 49
+243 60 53
+239 60 86
+233 60 86
+229 60 118
+223 60 119
+216 60 151
+209 63 152
+204 64 156
+200 65 192
+192 67 193
+190 68 196
+188 70 218
+185 71 218
+180 74 220
+176 76 251
+170 81 252
+167 86 253
+162 94 289
+162 95 291
+160 98 292
+159 101 317
+157 107 318
+155 112 351
+154 119 352
+154 121 356
+154 125 384
+154 131 385
+154 134 388
+154 138 417
+154 143 418
+154 146 421
+155 148 450
+156 155 451
+156 157 452
+157 160 484
+158 170 485
+160 172 517
+164 178 518
+168 181 550
+173 185 551
+176 186 557
+178 187 584
+185 188 585
+188 188 589
+191 189 617
+196 189 618
+200 189 620
+202 189 650
+208 189 650
+210 188 652
+214 187 683
+218 184 684
+220 182 684
+221 180 717
+224 172 718
+226 166 757
+226 159 759
+226 158 783
+226 153 784
+226 151 789
+225 148 816
+224 145 817
+224 142 820
+224 141 849
+222 137 850
+221 136 852
+220 134 883
+216 130 883
+214 128 884
+211 127 916
+201 125 917
+194 122 949
+188 122 950
+183 121 983
+178 121 984
+173 121 1017
+169 121 1020
+168 121 1021
+162 121 1066
+160 121 1067
+157 121 1069
+156 122 1099
+154 122 1100
+152 122 1100
+151 123 1132
+149 124 1133
+147 124 1165
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/cyrillic/1073_100_1.txt b/tests/auto/inputpanel/hwr_test_data/cyrillic/1073_100_1.txt
new file mode 100644
index 00000000..e3ba5b8d
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/cyrillic/1073_100_1.txt
@@ -0,0 +1,98 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 95
+.Y_POINTS_PER_INCH 95
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+214 62 0
+210 62 38
+207 62 39
+203 62 72
+197 62 73
+194 62 76
+192 62 106
+186 63 109
+184 65 110
+175 67 155
+169 69 156
+166 70 156
+163 70 188
+154 74 189
+148 77 221
+144 82 222
+140 87 255
+138 93 256
+136 98 288
+134 103 289
+134 107 293
+134 109 326
+134 120 327
+134 125 355
+134 128 355
+133 132 356
+133 134 387
+133 143 389
+133 148 421
+133 153 422
+134 158 454
+135 164 454
+136 167 488
+138 173 489
+139 175 493
+141 177 521
+142 183 522
+144 185 524
+146 189 554
+150 193 555
+153 193 557
+157 194 590
+168 194 592
+177 194 620
+186 194 622
+195 193 654
+205 191 655
+211 190 687
+221 184 688
+223 183 693
+234 169 737
+243 163 738
+243 161 741
+244 159 770
+244 154 771
+244 152 773
+243 144 812
+237 137 813
+233 131 836
+232 128 837
+225 127 870
+221 127 871
+215 127 903
+208 127 904
+203 127 908
+198 127 936
+188 126 936
+184 126 941
+179 126 969
+171 126 970
+167 126 973
+162 126 1003
+156 126 1004
+154 126 1004
+151 126 1036
+146 126 1036
+142 128 1069
+140 129 1070
+137 131 1107
+133 131 1108
+132 132 1110
+131 132 1136
+128 132 1137
+127 132 1141
+127 133 1169
+125 134 1170
+125 135 1202
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/cyrillic/1075_100_0.txt b/tests/auto/inputpanel/hwr_test_data/cyrillic/1075_100_0.txt
new file mode 100644
index 00000000..8bd436ae
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/cyrillic/1075_100_0.txt
@@ -0,0 +1,60 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 95
+.Y_POINTS_PER_INCH 95
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+466 177 0
+466 176 60
+466 175 75
+466 173 105
+465 173 108
+465 172 134
+465 169 134
+464 167 167
+464 165 168
+463 161 200
+462 156 201
+462 154 203
+460 151 250
+460 148 251
+459 148 252
+459 147 283
+458 143 284
+458 140 316
+458 138 317
+458 136 350
+458 134 350
+458 133 383
+458 131 384
+458 129 417
+457 128 466
+457 127 466
+457 126 499
+457 125 533
+457 124 644
+459 124 749
+466 124 786
+469 124 787
+472 124 788
+481 124 815
+485 124 816
+488 125 820
+492 125 848
+499 125 849
+504 125 851
+508 125 881
+518 125 882
+523 125 883
+525 125 915
+532 125 916
+535 125 916
+540 125 948
+544 125 948
+547 125 997
+548 125 998
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/cyrillic/1080_100_0.txt b/tests/auto/inputpanel/hwr_test_data/cyrillic/1080_100_0.txt
new file mode 100644
index 00000000..3e481cec
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/cyrillic/1080_100_0.txt
@@ -0,0 +1,80 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 95
+.Y_POINTS_PER_INCH 95
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+751 123 0
+751 124 48
+751 126 65
+751 127 68
+751 128 98
+751 131 99
+751 133 100
+751 136 131
+751 140 132
+751 146 133
+751 152 164
+753 158 165
+756 165 197
+759 169 198
+759 171 232
+761 172 232
+761 173 236
+763 174 264
+764 176 265
+764 177 268
+767 178 298
+768 178 331
+772 178 332
+773 178 332
+776 178 364
+779 178 366
+781 176 397
+785 172 398
+788 166 430
+790 162 431
+792 159 437
+794 154 464
+797 148 465
+799 146 468
+801 144 501
+802 138 503
+802 134 530
+802 132 531
+802 129 532
+804 128 564
+807 123 564
+807 120 597
+807 118 598
+807 117 630
+807 116 663
+807 117 741
+808 120 783
+808 123 783
+810 129 813
+810 131 814
+810 136 847
+810 139 847
+810 141 852
+810 144 879
+810 149 880
+810 153 884
+810 155 912
+810 162 914
+810 164 916
+810 167 946
+811 171 947
+811 173 948
+811 174 979
+813 179 980
+814 181 1012
+814 183 1013
+814 184 1046
+814 186 1047
+815 187 1079
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/cyrillic/1082_100_0.txt b/tests/auto/inputpanel/hwr_test_data/cyrillic/1082_100_0.txt
new file mode 100644
index 00000000..2892d7b9
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/cyrillic/1082_100_0.txt
@@ -0,0 +1,99 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 95
+.Y_POINTS_PER_INCH 95
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+649 124 0
+649 125 189
+649 126 214
+649 127 255
+649 128 256
+649 130 256
+649 131 260
+649 133 289
+649 136 293
+649 138 322
+649 142 323
+649 143 324
+649 145 355
+649 149 356
+649 151 356
+649 156 388
+649 162 389
+650 164 421
+651 167 423
+651 170 454
+651 172 455
+651 174 461
+651 175 488
+651 177 489
+651 179 492
+651 180 521
+651 182 522
+651 183 554
+651 184 588
+651 183 853
+651 182 887
+.PEN_UP
+.PEN_DOWN
+690 123 1328
+689 123 1369
+689 124 1373
+687 126 1402
+686 126 1435
+682 129 1436
+681 132 1469
+678 132 1470
+673 136 1518
+669 140 1519
+667 140 1524
+666 141 1552
+664 142 1553
+663 143 1556
+661 143 1585
+659 145 1586
+657 147 1589
+655 147 1618
+654 148 1651
+653 149 1685
+653 150 1718
+652 150 1724
+.PEN_UP
+.PEN_DOWN
+653 151 2376
+654 151 2419
+655 151 2419
+656 151 2450
+657 151 2452
+658 151 2483
+660 151 2516
+663 151 2517
+664 152 2549
+666 153 2550
+669 153 2583
+671 155 2584
+673 156 2588
+674 156 2616
+677 157 2617
+678 158 2650
+680 159 2650
+680 161 2653
+681 161 2683
+683 163 2683
+684 164 2684
+685 165 2716
+687 167 2717
+688 167 2749
+689 168 2783
+689 169 2784
+691 170 2788
+692 171 2815
+692 172 2820
+692 173 2849
+692 174 2882
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/cyrillic/1083_100_0.txt b/tests/auto/inputpanel/hwr_test_data/cyrillic/1083_100_0.txt
new file mode 100644
index 00000000..47f48853
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/cyrillic/1083_100_0.txt
@@ -0,0 +1,69 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 95
+.Y_POINTS_PER_INCH 95
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+313 163 0
+313 164 52
+313 165 68
+313 168 102
+314 172 103
+315 174 134
+316 175 135
+320 177 168
+323 178 169
+324 178 173
+327 178 201
+332 178 202
+335 178 205
+340 178 243
+344 178 244
+346 176 245
+349 174 284
+352 169 285
+354 166 318
+357 163 318
+360 158 350
+362 154 351
+364 151 357
+365 150 384
+369 144 385
+371 140 388
+372 139 417
+375 133 417
+376 132 421
+380 131 451
+381 130 452
+382 129 484
+385 129 484
+387 129 517
+389 129 518
+391 129 550
+394 129 552
+395 129 557
+398 131 584
+400 131 588
+402 132 617
+403 133 618
+404 134 620
+405 134 650
+407 135 651
+408 135 652
+410 137 683
+410 138 684
+410 139 684
+412 141 717
+413 143 717
+414 145 751
+415 147 751
+415 148 784
+416 149 816
+416 150 820
+416 151 849
+416 152 852
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/cyrillic/1088_100_0.txt b/tests/auto/inputpanel/hwr_test_data/cyrillic/1088_100_0.txt
new file mode 100644
index 00000000..820a029e
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/cyrillic/1088_100_0.txt
@@ -0,0 +1,97 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 95
+.Y_POINTS_PER_INCH 95
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+639 127 0
+639 128 48
+640 130 65
+640 132 68
+640 133 98
+640 138 99
+640 140 101
+640 150 148
+641 159 149
+644 167 181
+646 176 182
+646 185 215
+646 193 216
+646 200 247
+646 209 248
+646 211 253
+647 215 281
+647 218 282
+647 220 285
+647 221 314
+648 225 315
+648 227 317
+648 228 349
+648 233 350
+648 237 399
+648 240 400
+648 241 430
+648 243 431
+648 245 464
+648 246 497
+648 247 498
+648 246 605
+.PEN_UP
+.PEN_DOWN
+644 143 1072
+644 142 1105
+644 138 1126
+644 135 1127
+644 129 1168
+644 126 1169
+644 123 1173
+645 122 1196
+646 122 1196
+648 120 1197
+649 119 1229
+654 117 1229
+657 114 1262
+660 113 1263
+664 113 1295
+668 113 1295
+674 113 1328
+677 113 1329
+679 114 1333
+680 114 1361
+683 116 1362
+685 117 1365
+687 118 1395
+689 122 1395
+690 124 1396
+690 126 1428
+691 131 1429
+691 136 1465
+691 143 1467
+690 145 1469
+688 151 1511
+687 158 1512
+685 159 1516
+684 160 1544
+681 163 1545
+680 164 1549
+678 164 1577
+674 166 1578
+673 166 1581
+671 166 1611
+667 167 1612
+666 167 1612
+664 167 1644
+663 168 1645
+661 168 1645
+658 168 1677
+656 168 1678
+654 168 1711
+653 168 1712
+651 168 1745
+650 168 1745
+650 167 1778
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/cyrillic/1089_100_0.txt b/tests/auto/inputpanel/hwr_test_data/cyrillic/1089_100_0.txt
new file mode 100644
index 00000000..31275451
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/cyrillic/1089_100_0.txt
@@ -0,0 +1,47 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 95
+.Y_POINTS_PER_INCH 95
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+633 126 0
+631 126 39
+629 126 40
+627 125 43
+625 125 70
+620 125 70
+617 125 75
+616 125 103
+611 125 104
+607 125 108
+603 125 136
+597 126 139
+593 128 143
+585 133 172
+578 139 173
+574 144 203
+572 152 205
+572 157 236
+572 164 238
+573 171 269
+576 176 270
+583 182 304
+587 184 306
+591 184 309
+606 185 353
+617 184 353
+623 182 355
+627 180 386
+634 178 387
+635 177 387
+635 176 419
+635 174 420
+633 173 453
+632 173 453
+632 172 488
+631 172 492
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/cyrillic/1098_100_0.txt b/tests/auto/inputpanel/hwr_test_data/cyrillic/1098_100_0.txt
new file mode 100644
index 00000000..fe0e80f8
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/cyrillic/1098_100_0.txt
@@ -0,0 +1,112 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 95
+.Y_POINTS_PER_INCH 95
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+259 124 0
+260 124 69
+262 124 90
+264 124 93
+266 124 114
+267 124 117
+269 124 145
+271 124 146
+272 124 149
+273 125 178
+274 125 179
+275 125 180
+277 125 211
+278 127 212
+278 129 245
+279 132 246
+279 134 278
+279 136 279
+279 139 312
+279 142 313
+279 145 317
+279 146 345
+279 151 345
+279 154 348
+279 156 378
+279 162 379
+279 164 381
+279 166 412
+279 171 412
+279 172 413
+279 175 444
+279 178 445
+279 179 478
+279 180 480
+279 181 484
+279 182 511
+279 181 1037
+279 178 1085
+279 176 1086
+279 173 1109
+279 172 1110
+279 171 1143
+279 169 1144
+279 167 1177
+279 165 1177
+280 163 1180
+281 162 1210
+282 156 1210
+282 155 1212
+282 152 1244
+283 150 1246
+285 149 1293
+290 149 1293
+293 149 1327
+295 149 1327
+298 149 1359
+300 149 1360
+302 149 1392
+303 150 1393
+304 150 1426
+305 152 1426
+305 153 1429
+306 155 1459
+306 157 1460
+307 159 1461
+308 160 1492
+308 166 1493
+309 169 1526
+309 171 1526
+309 173 1558
+309 175 1592
+309 176 1593
+309 177 1597
+308 178 1625
+308 180 1626
+307 180 1629
+307 181 1659
+306 182 1659
+305 182 1661
+303 182 1691
+302 182 1692
+301 182 1725
+300 182 1726
+298 182 1759
+296 182 1759
+294 182 1792
+293 182 1797
+291 182 1825
+291 181 1858
+289 181 1858
+289 180 1891
+288 180 1925
+287 180 1965
+286 180 2061
+285 179 2108
+284 179 2108
+283 179 2140
+283 178 2141
+281 178 2174
+280 177 2174
+279 177 2223
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/greek/917_100_0.txt b/tests/auto/inputpanel/hwr_test_data/greek/917_100_0.txt
new file mode 100644
index 00000000..91f3e306
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/greek/917_100_0.txt
@@ -0,0 +1,100 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 95
+.Y_POINTS_PER_INCH 95
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+199 59 0
+199 60 52
+199 62 68
+199 68 105
+199 77 108
+199 80 113
+199 103 153
+199 108 159
+200 115 165
+200 120 183
+201 129 205
+202 138 223
+202 145 244
+202 151 257
+202 154 271
+202 158 287
+202 161 304
+203 162 320
+203 164 337
+203 165 353
+204 167 370
+205 169 387
+206 173 404
+208 175 420
+208 176 437
+209 177 453
+210 178 470
+210 179 486
+211 180 520
+214 180 520
+217 180 523
+218 180 553
+226 180 555
+231 180 557
+245 180 603
+261 180 604
+274 180 636
+285 180 637
+294 180 669
+301 180 670
+306 180 702
+310 180 703
+311 180 707
+312 180 736
+311 179 836
+309 177 869
+.PEN_UP
+.PEN_DOWN
+198 122 1336
+200 122 1396
+207 122 1414
+210 122 1448
+220 122 1469
+231 122 1473
+236 122 1501
+240 122 1512
+243 121 1514
+245 121 1515
+247 121 1551
+249 121 1551
+250 120 1556
+251 119 1585
+.PEN_UP
+.PEN_DOWN
+199 48 2190
+199 50 2235
+200 50 2236
+203 50 2266
+206 50 2266
+209 50 2268
+212 50 2298
+225 50 2301
+235 50 2305
+243 50 2321
+252 50 2341
+278 50 2342
+291 50 2366
+296 50 2367
+298 50 2399
+299 50 2435
+302 50 2482
+303 50 2483
+304 50 2515
+307 50 2515
+310 50 2557
+315 50 2559
+317 50 2563
+318 50 2587
+319 50 2652
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/greek/940_100_0.txt b/tests/auto/inputpanel/hwr_test_data/greek/940_100_0.txt
new file mode 100644
index 00000000..383fe4f2
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/greek/940_100_0.txt
@@ -0,0 +1,77 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 95
+.Y_POINTS_PER_INCH 95
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+546 127 0
+545 127 66
+544 126 91
+543 126 127
+540 125 137
+538 125 159
+531 125 180
+524 127 198
+518 130 220
+513 135 236
+508 143 253
+507 148 270
+506 154 286
+506 161 303
+506 170 319
+506 177 336
+506 184 353
+507 190 369
+510 193 386
+515 196 403
+518 196 419
+520 196 436
+522 196 452
+524 194 469
+527 190 486
+531 186 503
+535 181 518
+542 177 535
+548 173 552
+552 167 569
+554 164 586
+555 159 602
+556 152 619
+556 146 635
+556 142 652
+557 138 668
+557 135 685
+557 133 702
+556 132 718
+556 130 735
+555 130 752
+556 135 965
+557 137 971
+559 144 1001
+560 149 1002
+560 152 1003
+561 163 1034
+562 170 1035
+562 176 1067
+563 182 1067
+564 184 1100
+564 187 1101
+564 188 1134
+563 188 1186
+562 186 1233
+561 185 1234
+.PEN_UP
+.PEN_DOWN
+534 87 1751
+534 89 1798
+534 92 1799
+534 93 1803
+534 94 1832
+534 96 1833
+534 97 1835
+534 98 1865
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/greek/951_100_0.txt b/tests/auto/inputpanel/hwr_test_data/greek/951_100_0.txt
new file mode 100644
index 00000000..242010c9
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/greek/951_100_0.txt
@@ -0,0 +1,77 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 95
+.Y_POINTS_PER_INCH 95
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+453 123 0
+453 125 49
+453 127 50
+453 128 52
+453 130 82
+453 133 83
+453 135 85
+453 139 115
+453 148 118
+453 155 149
+453 163 160
+453 167 161
+453 171 164
+453 174 198
+453 183 200
+453 184 204
+453 186 231
+453 188 232
+453 189 236
+453 190 264
+453 188 436
+453 179 486
+455 175 486
+456 171 514
+457 169 515
+458 166 516
+458 161 547
+461 155 547
+466 148 580
+471 141 581
+475 137 614
+477 135 614
+481 132 647
+483 130 648
+484 130 652
+485 129 680
+486 129 681
+487 129 714
+489 129 715
+490 129 747
+491 130 748
+493 132 780
+500 137 780
+504 142 813
+508 150 813
+512 157 846
+514 164 847
+515 169 852
+515 173 880
+516 183 880
+516 186 883
+516 191 913
+516 200 913
+516 203 917
+516 208 946
+516 215 947
+516 220 948
+515 226 980
+514 233 980
+514 238 1013
+513 242 1014
+513 245 1046
+513 247 1047
+513 248 1052
+513 249 1096
+513 250 1129
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/greek/953_100_0.txt b/tests/auto/inputpanel/hwr_test_data/greek/953_100_0.txt
new file mode 100644
index 00000000..168d4ad4
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/greek/953_100_0.txt
@@ -0,0 +1,36 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 95
+.Y_POINTS_PER_INCH 95
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+322 123 0
+322 124 48
+322 125 61
+322 127 65
+322 129 85
+322 131 85
+322 133 89
+322 136 119
+322 140 120
+322 143 123
+322 147 160
+322 155 161
+322 162 185
+322 164 186
+322 168 218
+322 171 218
+322 174 250
+322 177 251
+321 178 284
+321 179 289
+321 180 318
+321 181 318
+321 182 351
+321 183 351
+321 184 353
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/greek/954_100_0.txt b/tests/auto/inputpanel/hwr_test_data/greek/954_100_0.txt
new file mode 100644
index 00000000..65bc0d94
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/greek/954_100_0.txt
@@ -0,0 +1,80 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 95
+.Y_POINTS_PER_INCH 95
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+424 122 0
+424 123 43
+424 124 59
+424 127 89
+424 130 90
+424 133 91
+424 136 124
+424 149 128
+424 153 144
+424 157 164
+424 170 165
+424 176 190
+423 178 190
+423 180 195
+423 182 222
+423 187 223
+423 188 256
+423 189 257
+423 190 289
+423 189 420
+423 188 427
+423 186 472
+.PEN_UP
+.PEN_DOWN
+476 122 919
+476 124 971
+473 126 996
+473 127 996
+468 130 1021
+467 132 1024
+465 132 1028
+461 134 1053
+454 139 1065
+449 141 1067
+445 143 1068
+437 147 1104
+430 151 1105
+428 152 1107
+426 153 1137
+420 155 1137
+418 155 1138
+418 156 1170
+417 156 1171
+419 156 1300
+424 157 1352
+426 157 1353
+428 157 1354
+434 157 1386
+438 158 1387
+443 159 1419
+447 163 1420
+451 165 1453
+453 168 1453
+455 171 1486
+455 173 1487
+455 174 1491
+456 176 1519
+457 177 1523
+457 178 1552
+458 180 1553
+459 180 1586
+459 181 1586
+460 181 1635
+460 182 1670
+460 183 1702
+461 183 1754
+461 184 1799
+462 185 1801
+461 185 1971
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/greek/955_100_0.txt b/tests/auto/inputpanel/hwr_test_data/greek/955_100_0.txt
new file mode 100644
index 00000000..d651821f
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/greek/955_100_0.txt
@@ -0,0 +1,64 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 95
+.Y_POINTS_PER_INCH 95
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+308 61 0
+309 61 67
+309 62 83
+310 66 109
+311 68 112
+312 70 127
+313 74 147
+319 84 148
+329 96 172
+330 101 173
+338 114 204
+346 124 205
+352 134 237
+358 145 238
+361 149 254
+363 153 270
+365 160 271
+368 165 303
+370 170 304
+371 173 307
+374 177 337
+374 178 338
+375 179 370
+375 180 371
+375 181 402
+375 182 403
+375 183 437
+375 182 540
+.PEN_UP
+.PEN_DOWN
+333 119 943
+332 119 987
+330 121 1003
+326 124 1034
+321 131 1035
+315 137 1070
+308 145 1074
+305 149 1089
+302 152 1110
+290 159 1111
+285 163 1136
+284 165 1137
+282 167 1139
+281 168 1168
+279 174 1169
+277 175 1171
+276 177 1202
+274 179 1202
+273 180 1235
+271 180 1235
+271 181 1268
+269 181 1397
+269 179 1440
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/greek/957_100_0.txt b/tests/auto/inputpanel/hwr_test_data/greek/957_100_0.txt
new file mode 100644
index 00000000..60ffed1a
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/greek/957_100_0.txt
@@ -0,0 +1,46 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 95
+.Y_POINTS_PER_INCH 95
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+216 122 0
+216 123 68
+216 124 81
+217 126 85
+219 135 124
+219 142 128
+219 147 143
+219 150 163
+220 159 164
+220 165 189
+220 167 190
+221 171 196
+221 172 222
+223 176 223
+224 179 261
+224 180 262
+224 181 373
+224 182 557
+226 177 605
+227 173 638
+229 170 639
+229 167 644
+231 163 671
+235 155 671
+237 151 676
+241 146 704
+245 140 705
+248 138 707
+252 133 744
+253 129 745
+254 127 747
+256 123 770
+257 120 772
+258 117 804
+258 116 804
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/hebrew/1488_100_0.txt b/tests/auto/inputpanel/hwr_test_data/hebrew/1488_100_0.txt
new file mode 100644
index 00000000..c26b2dab
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/hebrew/1488_100_0.txt
@@ -0,0 +1,54 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+510 64 0
+510 65 53
+510 68 54
+510 77 114
+513 90 115
+513 103 180
+513 118 181
+511 132 236
+511 144 236
+511 149 296
+509 160 297
+509 164 357
+509 166 358
+509 168 363
+509 169 421
+509 170 451
+509 172 482
+509 173 700
+.PEN_UP
+.PEN_DOWN
+573 128 1152
+570 123 1216
+566 121 1217
+562 120 1219
+559 120 1274
+548 122 1276
+538 126 1333
+526 132 1334
+521 138 1394
+521 141 1394
+522 148 1395
+522 149 1454
+525 154 1455
+530 159 1515
+548 170 1516
+568 179 1576
+587 182 1577
+594 182 1579
+599 182 1637
+605 182 1638
+610 180 1703
+611 178 1703
+611 176 1780
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/hebrew/1489_100_0.txt b/tests/auto/inputpanel/hwr_test_data/hebrew/1489_100_0.txt
new file mode 100644
index 00000000..706d0ef5
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/hebrew/1489_100_0.txt
@@ -0,0 +1,70 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+436 76 0
+436 75 117
+437 74 143
+437 73 167
+438 72 193
+438 69 194
+439 68 196
+441 65 261
+448 62 263
+457 59 317
+467 57 318
+482 56 380
+489 57 382
+496 59 438
+502 63 439
+509 67 499
+510 69 500
+512 72 501
+513 77 560
+514 87 561
+515 96 621
+515 101 621
+515 111 681
+514 113 682
+512 119 683
+512 121 684
+509 125 742
+506 131 743
+504 134 748
+503 136 807
+500 138 809
+497 141 813
+494 143 866
+491 145 866
+489 146 926
+488 146 927
+487 146 932
+484 146 989
+475 146 990
+468 143 1052
+465 142 1055
+460 142 1111
+455 141 1112
+453 141 1171
+452 141 1233
+449 141 1234
+448 141 1294
+444 141 1294
+443 143 1356
+441 145 1357
+440 148 1417
+437 155 1417
+435 158 1477
+433 162 1478
+431 167 1538
+430 171 1538
+429 173 1602
+428 174 1603
+427 177 1660
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/hebrew/1490_100_0.txt b/tests/auto/inputpanel/hwr_test_data/hebrew/1490_100_0.txt
new file mode 100644
index 00000000..9dab500a
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/hebrew/1490_100_0.txt
@@ -0,0 +1,62 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+541 57 0
+542 58 133
+542 59 160
+543 60 206
+544 62 207
+546 67 266
+546 68 267
+546 72 268
+547 78 328
+548 86 329
+550 95 390
+550 103 391
+551 108 454
+553 118 455
+554 125 511
+555 130 512
+555 131 516
+555 133 572
+555 134 633
+555 135 634
+555 136 694
+555 135 989
+555 134 1035
+555 132 1036
+555 130 1091
+555 126 1092
+555 123 1152
+555 120 1154
+553 119 1157
+551 117 1213
+549 116 1214
+544 116 1274
+538 116 1275
+531 116 1277
+524 117 1335
+513 119 1336
+502 127 1395
+501 130 1396
+498 135 1457
+495 145 1457
+495 154 1518
+496 162 1519
+501 171 1579
+507 178 1580
+517 184 1639
+527 188 1640
+538 189 1701
+545 189 1702
+560 186 1762
+570 182 1763
+572 179 1823
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/hebrew/1491_100_0.txt b/tests/auto/inputpanel/hwr_test_data/hebrew/1491_100_0.txt
new file mode 100644
index 00000000..8260c68b
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/hebrew/1491_100_0.txt
@@ -0,0 +1,63 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+470 76 0
+470 74 67
+470 72 97
+475 69 158
+477 67 159
+482 65 188
+484 65 219
+488 65 220
+497 64 278
+515 65 279
+517 66 284
+520 67 340
+523 70 341
+525 74 400
+528 83 401
+530 97 466
+530 102 466
+530 110 523
+530 112 524
+527 118 524
+526 119 587
+513 127 590
+504 130 650
+500 131 651
+494 132 707
+490 133 708
+483 134 768
+481 134 769
+480 134 772
+479 134 830
+478 134 862
+477 134 888
+475 131 889
+475 130 953
+475 129 953
+477 129 1010
+479 129 1011
+483 129 1070
+486 129 1071
+492 131 1130
+497 136 1131
+503 142 1195
+506 145 1197
+510 150 1198
+514 157 1252
+518 164 1254
+519 172 1313
+520 174 1314
+521 178 1315
+523 182 1374
+524 187 1375
+525 190 1439
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/hebrew/1492_100_0.txt b/tests/auto/inputpanel/hwr_test_data/hebrew/1492_100_0.txt
new file mode 100644
index 00000000..1edc1b99
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/hebrew/1492_100_0.txt
@@ -0,0 +1,70 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+463 92 0
+463 91 68
+462 90 70
+462 89 103
+462 87 104
+462 85 154
+462 83 155
+464 80 156
+466 76 215
+466 75 216
+471 69 221
+475 67 277
+478 65 278
+481 63 278
+483 63 336
+497 60 337
+508 60 340
+517 60 397
+523 60 398
+527 62 458
+534 65 459
+541 69 518
+544 76 519
+545 84 584
+548 95 585
+548 97 588
+549 100 640
+550 107 641
+551 108 644
+552 112 701
+554 117 702
+557 124 762
+559 132 763
+560 137 823
+561 143 824
+561 146 889
+561 152 890
+561 154 945
+561 157 946
+561 160 1007
+561 161 1008
+561 163 1073
+561 166 1129
+561 168 1189
+561 169 1285
+560 169 1397
+.PEN_UP
+.PEN_DOWN
+504 145 2008
+504 147 2077
+504 149 2094
+504 152 2132
+504 153 2133
+503 161 2193
+502 167 2193
+502 169 2196
+502 170 2253
+502 174 2254
+502 175 2364
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/hebrew/1493_100_0.txt b/tests/auto/inputpanel/hwr_test_data/hebrew/1493_100_0.txt
new file mode 100644
index 00000000..fc8c12d7
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/hebrew/1493_100_0.txt
@@ -0,0 +1,41 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+450 36 0
+450 37 60
+450 39 89
+451 40 92
+451 44 152
+452 46 154
+452 49 156
+452 51 211
+452 58 212
+452 63 276
+451 68 277
+450 73 278
+449 87 333
+447 99 334
+446 110 394
+445 112 395
+444 119 396
+443 127 453
+442 138 454
+440 148 517
+439 158 519
+437 164 576
+436 171 577
+435 174 639
+435 176 641
+435 177 644
+435 178 699
+434 178 700
+434 179 772
+434 180 821
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/hebrew/1494_100_0.txt b/tests/auto/inputpanel/hwr_test_data/hebrew/1494_100_0.txt
new file mode 100644
index 00000000..dca35755
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/hebrew/1494_100_0.txt
@@ -0,0 +1,55 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+472 63 0
+472 64 49
+471 67 50
+471 69 52
+469 75 115
+468 79 115
+467 86 172
+466 95 172
+465 97 233
+464 104 234
+463 106 235
+461 116 294
+461 120 296
+461 122 355
+460 124 356
+460 123 507
+460 122 568
+465 121 569
+466 120 571
+475 119 629
+481 119 630
+490 119 691
+494 120 693
+499 123 750
+502 126 751
+505 130 755
+506 133 811
+510 141 813
+511 145 872
+513 153 873
+513 160 876
+513 164 936
+513 172 939
+509 177 993
+507 179 994
+506 181 995
+503 182 1056
+497 184 1058
+488 184 1116
+485 184 1117
+473 184 1178
+467 182 1179
+463 180 1239
+459 178 1240
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/hebrew/1495_100_0.txt b/tests/auto/inputpanel/hwr_test_data/hebrew/1495_100_0.txt
new file mode 100644
index 00000000..2cb36edb
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/hebrew/1495_100_0.txt
@@ -0,0 +1,63 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+435 74 0
+435 73 156
+435 71 181
+445 65 250
+451 62 252
+455 61 310
+466 58 311
+476 57 371
+479 57 372
+488 63 432
+495 73 433
+499 80 493
+501 87 495
+502 91 524
+503 99 557
+504 111 558
+504 116 614
+502 125 617
+502 128 620
+502 133 674
+498 142 674
+495 152 738
+495 159 740
+495 162 795
+495 165 797
+495 167 856
+495 170 857
+495 172 919
+495 173 977
+495 174 978
+494 174 1124
+494 173 1189
+.PEN_UP
+.PEN_DOWN
+436 64 1560
+436 68 1615
+436 73 1616
+435 75 1619
+434 83 1675
+432 93 1676
+430 106 1736
+425 117 1737
+423 122 1797
+421 133 1797
+419 147 1860
+418 154 1863
+417 160 1920
+417 163 1920
+416 169 1981
+416 171 1982
+415 174 2046
+414 174 2207
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/hebrew/1496_100_0.txt b/tests/auto/inputpanel/hwr_test_data/hebrew/1496_100_0.txt
new file mode 100644
index 00000000..bdaaa200
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/hebrew/1496_100_0.txt
@@ -0,0 +1,42 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+504 89 0
+504 92 57
+504 94 88
+505 98 91
+505 100 148
+506 109 149
+504 128 209
+501 137 210
+501 139 211
+499 144 271
+491 150 272
+485 154 275
+479 156 337
+465 159 337
+459 161 340
+453 161 393
+446 162 394
+428 157 455
+417 150 456
+410 138 515
+403 122 516
+401 117 576
+403 92 577
+423 67 639
+441 50 641
+459 39 698
+470 32 699
+497 24 759
+503 22 760
+506 21 820
+508 21 821
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/hebrew/1497_100_0.txt b/tests/auto/inputpanel/hwr_test_data/hebrew/1497_100_0.txt
new file mode 100644
index 00000000..d638304a
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/hebrew/1497_100_0.txt
@@ -0,0 +1,21 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+474 54 0
+474 55 51
+474 57 52
+474 62 111
+473 65 112
+470 72 116
+469 74 163
+467 82 164
+467 84 223
+467 85 285
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/hebrew/1498_100_0.txt b/tests/auto/inputpanel/hwr_test_data/hebrew/1498_100_0.txt
new file mode 100644
index 00000000..c23f0370
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/hebrew/1498_100_0.txt
@@ -0,0 +1,60 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+401 74 0
+400 73 158
+400 72 183
+400 67 254
+401 65 255
+407 62 318
+412 60 319
+416 59 375
+429 58 376
+437 58 381
+446 58 437
+454 58 438
+457 60 498
+461 67 499
+465 77 564
+466 91 565
+466 97 620
+465 105 620
+462 109 622
+460 113 681
+456 118 682
+451 122 685
+447 124 742
+445 128 743
+442 132 804
+441 135 804
+440 139 863
+440 144 864
+440 146 868
+440 150 924
+440 154 925
+440 158 985
+440 163 986
+440 167 989
+440 174 1051
+438 182 1051
+438 184 1054
+438 188 1106
+438 196 1107
+436 205 1167
+435 212 1167
+435 216 1228
+435 219 1229
+434 220 1230
+434 221 1288
+434 224 1289
+434 225 1349
+434 226 1410
+433 226 1518
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/hebrew/1499_100_0.txt b/tests/auto/inputpanel/hwr_test_data/hebrew/1499_100_0.txt
new file mode 100644
index 00000000..d722cdc6
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/hebrew/1499_100_0.txt
@@ -0,0 +1,50 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+419 65 0
+420 65 99
+423 63 126
+426 61 167
+429 60 171
+431 60 227
+438 59 228
+444 59 288
+455 59 289
+461 60 292
+467 61 350
+475 65 351
+481 70 411
+488 78 412
+493 85 472
+495 90 473
+498 106 537
+498 118 538
+497 121 539
+494 129 594
+493 131 595
+484 142 654
+474 149 655
+465 155 715
+461 157 716
+457 159 717
+454 159 777
+446 161 779
+442 161 780
+438 161 838
+428 161 839
+420 160 898
+413 159 899
+409 158 959
+408 158 1019
+406 156 1020
+405 155 1083
+404 155 1085
+404 154 1141
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/hebrew/1500_100_0.txt b/tests/auto/inputpanel/hwr_test_data/hebrew/1500_100_0.txt
new file mode 100644
index 00000000..c877d06a
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/hebrew/1500_100_0.txt
@@ -0,0 +1,64 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+477 154 0
+476 154 308
+474 155 340
+472 156 380
+471 157 446
+467 160 448
+466 162 501
+465 164 502
+463 166 562
+462 169 564
+461 173 622
+461 174 623
+461 177 682
+461 179 683
+461 180 684
+462 180 745
+464 184 747
+467 186 804
+472 188 865
+474 189 866
+478 189 930
+483 189 931
+485 187 988
+487 184 988
+489 176 1049
+489 175 1052
+488 170 1108
+484 166 1109
+479 164 1169
+475 161 1171
+471 156 1231
+468 153 1232
+466 150 1235
+464 147 1293
+462 143 1296
+459 135 1351
+458 133 1352
+457 124 1356
+456 117 1412
+455 111 1413
+454 106 1414
+454 94 1472
+454 86 1473
+454 78 1476
+457 69 1534
+460 54 1535
+463 46 1540
+465 40 1594
+473 31 1595
+480 25 1656
+491 20 1657
+493 18 1659
+499 16 1717
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/hebrew/1501_100_0.txt b/tests/auto/inputpanel/hwr_test_data/hebrew/1501_100_0.txt
new file mode 100644
index 00000000..a91ddc9f
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/hebrew/1501_100_0.txt
@@ -0,0 +1,52 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+452 111 0
+455 113 68
+469 117 104
+487 121 107
+503 124 159
+511 125 160
+518 125 162
+520 125 221
+533 124 222
+540 122 227
+545 119 281
+548 116 282
+548 114 283
+549 109 344
+549 101 346
+548 91 404
+543 82 405
+540 78 464
+531 70 465
+528 68 525
+518 63 526
+516 63 586
+501 62 587
+486 64 645
+471 70 646
+462 77 711
+456 84 712
+450 93 716
+448 105 768
+447 113 769
+446 122 771
+445 130 831
+443 145 833
+443 148 836
+442 153 889
+442 162 890
+442 163 891
+442 168 949
+442 171 950
+442 175 1015
+441 177 1073
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/hebrew/1502_100_0.txt b/tests/auto/inputpanel/hwr_test_data/hebrew/1502_100_0.txt
new file mode 100644
index 00000000..8d3728fc
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/hebrew/1502_100_0.txt
@@ -0,0 +1,62 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+583 58 0
+582 59 63
+581 63 93
+581 64 154
+579 79 155
+579 90 215
+578 107 216
+577 111 218
+576 122 278
+574 133 280
+571 147 336
+569 159 337
+565 167 398
+562 173 399
+559 177 404
+557 180 458
+556 181 459
+556 182 520
+556 183 520
+554 181 604
+550 176 673
+534 158 675
+524 144 731
+516 129 732
+510 113 792
+500 92 793
+495 80 855
+490 66 857
+489 62 860
+486 55 914
+485 53 915
+484 51 915
+484 53 1100
+481 60 1157
+478 70 1158
+476 83 1218
+474 93 1219
+473 98 1219
+470 108 1279
+466 119 1280
+461 136 1340
+458 149 1341
+455 159 1401
+452 169 1403
+448 176 1404
+446 182 1462
+446 186 1463
+444 188 1467
+443 189 1524
+443 190 1525
+442 191 1588
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/hebrew/1503_100_0.txt b/tests/auto/inputpanel/hwr_test_data/hebrew/1503_100_0.txt
new file mode 100644
index 00000000..93d0173a
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/hebrew/1503_100_0.txt
@@ -0,0 +1,40 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+454 58 0
+454 61 54
+454 62 59
+454 64 114
+454 67 114
+454 73 180
+455 83 181
+456 91 237
+456 103 238
+456 114 297
+456 129 298
+457 144 358
+457 152 359
+458 163 362
+458 167 430
+463 190 432
+463 192 434
+463 197 489
+463 203 490
+463 207 551
+463 211 552
+463 213 606
+463 214 606
+463 216 611
+463 217 669
+463 218 932
+463 219 1000
+463 220 1061
+463 221 1121
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/hebrew/1504_100_0.txt b/tests/auto/inputpanel/hwr_test_data/hebrew/1504_100_0.txt
new file mode 100644
index 00000000..48e6b8b0
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/hebrew/1504_100_0.txt
@@ -0,0 +1,43 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+519 63 0
+519 65 83
+519 67 100
+519 77 145
+517 85 205
+516 99 206
+516 113 266
+516 123 267
+516 125 327
+515 139 328
+514 147 388
+513 154 388
+512 161 450
+511 164 450
+509 167 512
+506 170 514
+504 172 516
+503 173 572
+500 175 573
+492 177 632
+492 178 633
+486 179 634
+482 179 694
+478 180 695
+476 180 699
+472 180 755
+462 178 756
+451 175 823
+447 173 824
+443 171 827
+440 171 883
+438 170 884
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/hebrew/1505_100_0.txt b/tests/auto/inputpanel/hwr_test_data/hebrew/1505_100_0.txt
new file mode 100644
index 00000000..531f9549
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/hebrew/1505_100_0.txt
@@ -0,0 +1,52 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+510 62 0
+511 62 76
+516 62 100
+519 62 133
+521 62 134
+528 65 194
+533 69 195
+537 76 255
+539 81 256
+542 92 259
+546 106 316
+548 121 317
+549 131 377
+549 140 378
+547 144 380
+545 151 443
+541 160 443
+534 167 498
+532 169 499
+526 172 560
+521 173 561
+518 173 564
+514 173 621
+507 173 622
+497 171 682
+484 165 683
+480 163 685
+468 154 742
+459 145 743
+455 138 808
+453 127 809
+452 116 865
+452 110 866
+455 101 868
+456 98 926
+470 83 927
+481 76 985
+484 74 987
+492 70 988
+496 68 1046
+505 62 1047
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/hebrew/1506_100_0.txt b/tests/auto/inputpanel/hwr_test_data/hebrew/1506_100_0.txt
new file mode 100644
index 00000000..94228e57
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/hebrew/1506_100_0.txt
@@ -0,0 +1,48 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+484 63 0
+485 63 47
+491 64 77
+500 69 138
+511 77 139
+523 90 199
+531 101 200
+537 116 263
+540 131 265
+542 137 321
+544 150 322
+545 162 383
+545 174 384
+543 180 388
+540 185 450
+538 187 451
+534 189 452
+528 191 506
+519 191 507
+516 191 508
+509 187 565
+504 182 566
+500 175 627
+497 164 629
+496 155 688
+496 144 689
+498 133 691
+507 122 749
+520 108 750
+523 105 808
+540 91 809
+546 87 812
+554 83 869
+562 79 871
+564 76 937
+564 75 939
+564 74 1005
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/hebrew/1507_100_0.txt b/tests/auto/inputpanel/hwr_test_data/hebrew/1507_100_0.txt
new file mode 100644
index 00000000..1269c595
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/hebrew/1507_100_0.txt
@@ -0,0 +1,65 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+475 93 0
+475 92 67
+474 92 92
+473 92 143
+470 89 144
+468 88 205
+465 83 205
+464 82 261
+463 77 262
+463 75 267
+465 73 322
+470 67 323
+482 63 384
+490 58 386
+501 51 444
+510 41 445
+514 34 505
+515 24 506
+515 18 565
+511 14 569
+504 11 630
+497 9 631
+494 9 691
+479 8 692
+475 11 748
+469 17 749
+468 33 809
+473 47 810
+482 64 869
+494 81 870
+507 100 930
+513 111 931
+515 121 991
+516 134 992
+516 143 1053
+508 152 1055
+496 161 1112
+491 164 1113
+485 166 1115
+478 168 1172
+467 169 1173
+457 169 1233
+453 167 1234
+450 165 1235
+446 159 1297
+444 154 1299
+443 150 1301
+443 141 1356
+445 135 1356
+454 126 1417
+472 117 1418
+490 112 1477
+502 109 1478
+506 107 1540
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/hebrew/1508_100_0.txt b/tests/auto/inputpanel/hwr_test_data/hebrew/1508_100_0.txt
new file mode 100644
index 00000000..89e15c7e
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/hebrew/1508_100_0.txt
@@ -0,0 +1,53 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+439 67 0
+439 66 69
+440 64 85
+442 63 134
+451 57 135
+463 55 200
+475 53 200
+486 53 255
+497 56 256
+507 64 315
+512 69 316
+516 74 318
+519 82 377
+524 95 378
+524 101 381
+525 109 438
+525 119 439
+522 138 498
+515 153 499
+513 155 502
+505 164 559
+500 171 560
+498 173 566
+494 177 620
+485 183 621
+478 185 688
+471 184 690
+469 182 693
+462 172 751
+456 160 753
+453 157 757
+452 152 813
+449 143 814
+449 137 874
+449 131 876
+456 125 927
+464 120 927
+470 119 986
+476 118 987
+484 117 1046
+485 117 1047
+486 117 1107
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/hebrew/1509_100_0.txt b/tests/auto/inputpanel/hwr_test_data/hebrew/1509_100_0.txt
new file mode 100644
index 00000000..c3773b78
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/hebrew/1509_100_0.txt
@@ -0,0 +1,73 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+507 123 0
+505 124 164
+502 125 189
+501 126 234
+499 126 234
+497 127 237
+496 128 301
+482 138 302
+476 144 356
+470 153 356
+466 160 416
+463 168 417
+461 177 484
+461 189 486
+463 193 539
+464 195 540
+467 201 540
+472 204 599
+478 208 600
+479 209 604
+484 210 660
+492 210 661
+515 208 721
+530 205 722
+538 196 782
+540 189 783
+542 177 788
+543 174 843
+543 162 844
+535 149 904
+517 135 905
+500 129 970
+479 122 971
+467 117 1028
+456 110 1030
+450 105 1088
+449 100 1089
+448 94 1148
+447 85 1149
+453 73 1209
+460 65 1210
+473 55 1269
+489 42 1270
+501 32 1331
+510 28 1333
+523 25 1390
+532 24 1392
+535 24 1396
+536 24 1451
+537 26 1452
+535 44 1512
+530 52 1513
+522 59 1516
+506 66 1574
+486 71 1575
+439 71 1634
+416 72 1636
+408 72 1637
+393 72 1694
+386 71 1695
+384 68 1757
+384 67 1758
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/hebrew/1510_100_0.txt b/tests/auto/inputpanel/hwr_test_data/hebrew/1510_100_0.txt
new file mode 100644
index 00000000..e3f74704
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/hebrew/1510_100_0.txt
@@ -0,0 +1,69 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+458 51 0
+459 51 115
+460 49 139
+462 47 195
+469 43 195
+475 40 255
+485 36 256
+495 33 316
+510 33 317
+525 36 378
+528 40 379
+530 47 437
+532 60 438
+532 63 442
+534 75 497
+533 84 499
+530 87 558
+528 91 559
+525 93 562
+524 95 619
+519 100 620
+512 104 686
+511 105 687
+510 106 691
+509 106 742
+507 107 746
+506 108 803
+504 109 804
+503 109 864
+501 110 865
+500 110 925
+499 110 985
+498 111 988
+499 111 1227
+502 111 1286
+508 111 1287
+512 113 1349
+516 119 1351
+516 121 1355
+519 129 1408
+522 137 1408
+522 149 1469
+519 158 1469
+513 169 1532
+507 178 1534
+497 187 1590
+489 189 1591
+485 190 1594
+483 190 1655
+469 189 1656
+453 182 1712
+449 179 1713
+447 176 1715
+444 175 1772
+443 175 1773
+443 174 1804
+441 171 1834
+441 170 2227
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/hebrew/1511_100_0.txt b/tests/auto/inputpanel/hwr_test_data/hebrew/1511_100_0.txt
new file mode 100644
index 00000000..cb6e07ea
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/hebrew/1511_100_0.txt
@@ -0,0 +1,52 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+441 77 0
+442 76 76
+442 75 100
+442 73 142
+444 71 143
+445 69 171
+451 63 202
+452 60 203
+455 57 262
+463 53 263
+468 51 323
+473 49 324
+480 48 384
+492 48 385
+498 48 387
+506 48 449
+510 52 450
+513 57 505
+516 65 506
+517 68 508
+519 75 566
+520 81 567
+520 85 628
+521 92 629
+521 93 689
+521 94 1164
+.PEN_UP
+.PEN_DOWN
+480 79 1560
+480 80 1631
+479 84 1661
+476 94 1722
+473 110 1723
+471 120 1784
+467 133 1785
+464 144 1844
+461 155 1845
+457 163 1907
+453 172 1909
+451 177 1971
+450 179 1971
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/hebrew/1512_100_0.txt b/tests/auto/inputpanel/hwr_test_data/hebrew/1512_100_0.txt
new file mode 100644
index 00000000..b4c89146
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/hebrew/1512_100_0.txt
@@ -0,0 +1,56 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+389 81 0
+389 80 227
+389 79 254
+389 78 300
+391 74 362
+393 72 363
+395 70 364
+395 69 423
+401 65 425
+405 62 427
+409 60 484
+421 56 485
+428 55 544
+435 55 545
+441 55 547
+452 57 605
+464 62 606
+471 67 666
+477 72 667
+481 79 727
+485 88 729
+486 92 731
+488 98 791
+489 106 792
+490 108 794
+490 113 845
+491 117 847
+491 121 878
+491 124 879
+491 131 939
+492 138 940
+492 146 1000
+492 149 1001
+491 156 1002
+490 158 1061
+486 164 1062
+484 170 1066
+483 172 1123
+481 178 1124
+480 181 1184
+479 182 1186
+478 182 1187
+478 183 1245
+477 184 1246
+476 185 1307
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/hebrew/1513_100_0.txt b/tests/auto/inputpanel/hwr_test_data/hebrew/1513_100_0.txt
new file mode 100644
index 00000000..8753a928
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/hebrew/1513_100_0.txt
@@ -0,0 +1,68 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+491 116 0
+492 116 124
+493 116 164
+494 116 197
+496 116 198
+498 115 257
+501 115 258
+503 114 259
+508 113 318
+509 113 319
+513 112 323
+516 111 380
+524 108 381
+532 101 442
+536 98 444
+550 86 503
+555 83 504
+560 78 507
+563 73 565
+567 65 566
+570 59 626
+573 54 627
+573 52 686
+573 51 687
+572 51 748
+567 51 749
+559 51 808
+550 52 809
+539 54 870
+530 58 871
+522 62 931
+515 65 932
+507 72 997
+499 79 1000
+495 83 1059
+486 95 1061
+484 107 1113
+480 117 1114
+477 126 1173
+476 142 1174
+477 151 1236
+479 157 1239
+480 159 1295
+490 170 1296
+498 173 1357
+511 174 1357
+518 174 1416
+532 174 1417
+543 172 1482
+551 169 1483
+555 167 1484
+557 166 1541
+562 165 1543
+570 163 1599
+571 163 1600
+571 162 1660
+572 162 1661
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/hebrew/1514_100_0.txt b/tests/auto/inputpanel/hwr_test_data/hebrew/1514_100_0.txt
new file mode 100644
index 00000000..46c20853
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/hebrew/1514_100_0.txt
@@ -0,0 +1,81 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+471 66 0
+471 69 63
+471 72 64
+471 77 127
+472 81 128
+474 90 131
+476 99 189
+476 110 190
+476 113 249
+474 130 251
+473 132 252
+472 137 302
+471 140 303
+469 143 307
+466 149 362
+466 151 363
+462 157 364
+460 161 424
+456 163 427
+449 167 489
+443 170 489
+442 170 492
+429 172 549
+422 173 606
+420 173 607
+417 174 612
+415 174 667
+410 175 668
+408 175 728
+407 176 729
+406 176 820
+.PEN_UP
+.PEN_DOWN
+469 65 1895
+470 65 1940
+472 62 1941
+477 60 2002
+482 58 2003
+492 56 2063
+506 55 2064
+523 55 2123
+538 60 2124
+543 62 2187
+550 70 2189
+553 74 2191
+554 77 2245
+559 86 2246
+561 91 2306
+564 98 2307
+566 103 2308
+568 110 2367
+569 116 2368
+569 118 2428
+569 124 2430
+570 130 2494
+570 131 2494
+570 133 2555
+570 135 2556
+570 137 2613
+570 138 2615
+570 139 2671
+570 142 2672
+569 146 2733
+569 150 2734
+568 154 2794
+568 156 2794
+568 158 2795
+568 161 2855
+567 164 2857
+567 166 2916
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/hebrew/8362_100_0.txt b/tests/auto/inputpanel/hwr_test_data/hebrew/8362_100_0.txt
new file mode 100644
index 00000000..5933548a
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/hebrew/8362_100_0.txt
@@ -0,0 +1,73 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+593 121 0
+593 123 53
+593 124 83
+593 126 85
+593 130 143
+593 141 144
+591 153 206
+587 164 206
+581 173 265
+576 177 266
+571 180 267
+560 184 326
+544 189 327
+532 191 388
+517 191 389
+507 189 449
+492 186 450
+487 184 451
+482 178 518
+474 171 519
+471 165 571
+470 159 572
+470 147 634
+471 137 635
+472 132 636
+473 128 694
+476 123 695
+476 122 756
+476 121 757
+.PEN_UP
+.PEN_DOWN
+537 136 2303
+537 134 2379
+537 132 2395
+537 130 2453
+537 118 2453
+534 95 2519
+530 81 2520
+525 69 2576
+523 66 2577
+521 63 2579
+519 60 2636
+508 56 2637
+503 55 2696
+492 55 2697
+487 55 2700
+481 55 2756
+467 58 2757
+453 65 2818
+439 74 2819
+429 82 2879
+423 86 2880
+420 93 2943
+417 102 2945
+417 104 2948
+415 109 3006
+415 119 3007
+415 124 3011
+415 127 3062
+415 136 3065
+415 139 3128
+415 140 3128
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/japanese/26085_100_0.txt b/tests/auto/inputpanel/hwr_test_data/japanese/26085_100_0.txt
new file mode 100644
index 00000000..57dbf06f
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/japanese/26085_100_0.txt
@@ -0,0 +1,94 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+113 59 0
+113 64 56
+113 71 86
+113 78 92
+113 85 148
+113 95 149
+113 109 212
+111 127 213
+111 131 268
+111 143 269
+110 150 330
+109 156 331
+109 160 391
+109 164 392
+109 167 453
+109 170 455
+109 171 512
+109 172 513
+109 173 516
+109 175 573
+109 177 634
+109 178 636
+110 179 698
+110 180 701
+.PEN_UP
+.PEN_DOWN
+116 58 1545
+117 58 1612
+130 57 1640
+153 58 1699
+165 59 1700
+187 60 1764
+195 62 1766
+200 63 1820
+202 63 1821
+203 63 2004
+203 65 2061
+203 69 2061
+204 72 2124
+204 87 2125
+203 90 2183
+200 103 2185
+198 115 2188
+198 119 2248
+197 139 2248
+196 148 2304
+195 158 2307
+195 160 2308
+195 165 2364
+195 173 2365
+194 179 2425
+194 181 2426
+194 185 2427
+194 187 2485
+193 190 2486
+193 189 2740
+.PEN_UP
+.PEN_DOWN
+113 123 3457
+114 123 3517
+120 123 3545
+127 123 3547
+131 123 3610
+166 126 3611
+185 127 3669
+194 128 3670
+195 128 3731
+.PEN_UP
+.PEN_DOWN
+110 180 4616
+110 181 4683
+115 181 4701
+122 182 4765
+143 182 4765
+174 183 4820
+179 184 4821
+181 184 4824
+187 184 4882
+188 184 4972
+190 184 5036
+191 184 5096
+192 184 5098
+193 184 5157
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/japanese/26412_100_0.txt b/tests/auto/inputpanel/hwr_test_data/japanese/26412_100_0.txt
new file mode 100644
index 00000000..2518d293
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/japanese/26412_100_0.txt
@@ -0,0 +1,121 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+314 61 0
+315 61 71
+319 61 95
+329 61 154
+341 61 155
+355 61 215
+381 61 216
+398 60 277
+402 60 277
+413 60 279
+424 60 340
+436 61 342
+437 61 343
+443 61 398
+449 62 399
+452 63 462
+453 63 599
+452 62 871
+.PEN_UP
+.PEN_DOWN
+386 40 2172
+386 41 2327
+386 45 2351
+386 48 2415
+386 51 2418
+386 54 2423
+386 60 2479
+384 69 2480
+384 72 2537
+384 89 2539
+383 102 2596
+382 113 2597
+382 117 2599
+381 123 2657
+380 130 2658
+380 135 2718
+380 143 2718
+380 147 2779
+380 151 2780
+380 157 2840
+380 162 2841
+380 163 2900
+380 165 2901
+380 168 2968
+380 170 2970
+380 173 3021
+380 174 3082
+380 175 3087
+380 176 3143
+380 177 3204
+380 178 3266
+.PEN_UP
+.PEN_DOWN
+386 66 4292
+383 68 4355
+380 71 4386
+374 78 4391
+366 85 4444
+360 88 4445
+357 91 4446
+346 97 4505
+345 98 4506
+328 105 4565
+323 108 4566
+321 109 4626
+322 108 4959
+.PEN_UP
+.PEN_DOWN
+382 63 5579
+383 64 5630
+385 67 5631
+387 71 5692
+391 80 5693
+394 85 5695
+397 90 5750
+403 99 5751
+407 102 5811
+416 108 5812
+417 110 5815
+424 114 5872
+427 115 5873
+433 118 5935
+436 121 5936
+439 123 5997
+440 123 6111
+.PEN_UP
+.PEN_DOWN
+321 131 7508
+323 131 7590
+325 131 7611
+341 131 7661
+369 133 7662
+387 134 7723
+397 135 7723
+404 135 7784
+406 135 7785
+407 135 7880
+408 135 8103
+409 135 8147
+410 135 8148
+414 135 8208
+416 135 8271
+418 135 8330
+419 135 8330
+421 135 8391
+422 135 8453
+423 135 8456
+424 135 8516
+425 135 8519
+426 135 8735
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/japanese/35486_100_0.txt b/tests/auto/inputpanel/hwr_test_data/japanese/35486_100_0.txt
new file mode 100644
index 00000000..90293518
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/japanese/35486_100_0.txt
@@ -0,0 +1,333 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+513 47 0
+514 47 83
+515 47 106
+517 47 148
+524 48 149
+531 48 209
+538 49 210
+542 49 210
+548 50 276
+556 51 276
+557 51 331
+559 51 398
+563 51 399
+.PEN_UP
+.PEN_DOWN
+509 76 1311
+510 76 1365
+512 76 1395
+519 75 1396
+522 75 1450
+526 74 1451
+530 74 1451
+536 74 1511
+545 74 1511
+547 74 1514
+552 74 1572
+554 74 1633
+557 74 1634
+559 74 1694
+560 73 1695
+561 73 1834
+562 73 1875
+563 73 1876
+564 73 1935
+.PEN_UP
+.PEN_DOWN
+509 97 4408
+510 97 4480
+514 96 4483
+518 96 4512
+526 96 4569
+528 96 4570
+538 95 4629
+551 95 4630
+554 95 4689
+556 95 4690
+557 95 4752
+558 95 4811
+559 95 4811
+560 94 4875
+561 94 4877
+562 94 4937
+.PEN_UP
+.PEN_DOWN
+512 120 8559
+512 121 8626
+512 123 8651
+512 126 8722
+512 132 8723
+512 140 8784
+511 142 8786
+510 146 8787
+509 148 8843
+508 152 8844
+508 157 8904
+508 161 8905
+508 162 8967
+507 162 8969
+.PEN_UP
+.PEN_DOWN
+510 119 9777
+513 117 9846
+514 116 9847
+518 116 9851
+522 116 9907
+532 116 9908
+540 116 9969
+542 116 9971
+544 116 10036
+545 116 10090
+546 116 10151
+547 116 10154
+548 116 10214
+551 118 10220
+552 118 10273
+553 119 10274
+554 119 10274
+556 120 10334
+557 120 10398
+558 121 10456
+559 121 10457
+560 121 10524
+560 124 10576
+561 126 10578
+561 128 10638
+561 133 10639
+561 138 10698
+561 144 10699
+560 147 10761
+558 152 10763
+558 153 10765
+558 155 10818
+558 158 10819
+558 161 10881
+558 162 10941
+558 164 10942
+.PEN_UP
+.PEN_DOWN
+507 164 11623
+508 164 11682
+510 164 11701
+512 163 11706
+517 163 11761
+520 163 11762
+527 162 11763
+532 162 11821
+536 161 11822
+537 161 11882
+538 161 11883
+541 161 11943
+543 161 11944
+544 161 12010
+548 161 12012
+550 161 12067
+552 161 12069
+554 161 12126
+555 161 12188
+556 161 12189
+559 161 12251
+560 161 12259
+562 161 12313
+563 161 12373
+.PEN_UP
+.PEN_DOWN
+600 48 18967
+601 48 19050
+605 48 19082
+607 48 19140
+610 48 19141
+620 48 19199
+638 48 19200
+651 48 19260
+658 49 19261
+668 51 19321
+673 51 19321
+674 51 19322
+676 51 19382
+683 51 19383
+688 51 19387
+692 50 19444
+696 50 19446
+697 49 19451
+699 49 19503
+701 49 19504
+706 48 19563
+708 48 19564
+709 48 19631
+710 48 19636
+711 48 19687
+.PEN_UP
+.PEN_DOWN
+624 44 21231
+624 45 21296
+624 49 21297
+624 51 21356
+624 59 21357
+624 60 21362
+624 65 21416
+624 66 21417
+624 71 21477
+624 73 21539
+624 76 21599
+623 78 21600
+623 79 21661
+.PEN_UP
+.PEN_DOWN
+621 78 23544
+622 78 23699
+623 78 23726
+628 78 23731
+630 78 23781
+640 79 23782
+643 79 23815
+653 80 23845
+661 80 23847
+670 80 23903
+676 79 23904
+677 79 23979
+678 79 24027
+678 80 24307
+678 81 24360
+678 83 24362
+677 88 24422
+676 95 24423
+676 96 24427
+676 100 24484
+676 104 24485
+676 106 24490
+676 108 24545
+676 109 24546
+676 111 24606
+676 112 24606
+676 113 24670
+676 114 24675
+676 116 24729
+676 118 24789
+.PEN_UP
+.PEN_DOWN
+622 78 25560
+622 79 25675
+622 80 25703
+622 83 25707
+622 89 25759
+622 95 25763
+621 100 25822
+621 105 25824
+621 106 25827
+620 110 25880
+620 112 25881
+620 113 25943
+620 115 26002
+620 116 26063
+.PEN_UP
+.PEN_DOWN
+592 116 27111
+598 116 27189
+620 116 27216
+637 117 27275
+654 118 27276
+664 119 27337
+674 120 27339
+677 120 27397
+683 120 27398
+687 120 27458
+688 120 27459
+689 120 27518
+692 120 27519
+692 119 27579
+696 119 27581
+697 119 27639
+698 119 27640
+699 119 27708
+700 119 27761
+.PEN_UP
+.PEN_DOWN
+616 126 30647
+616 128 30740
+616 132 30771
+616 137 30831
+616 143 30832
+616 147 30835
+616 149 30892
+616 154 30893
+616 158 30951
+616 160 30952
+616 163 31012
+616 166 31013
+616 167 31073
+615 168 31074
+615 170 31136
+615 171 31196
+615 172 31323
+.PEN_UP
+.PEN_DOWN
+614 127 32047
+620 126 32108
+630 125 32138
+640 125 32200
+645 125 32202
+648 125 32265
+653 125 32320
+655 125 32321
+658 125 32322
+659 125 32381
+667 127 32382
+670 127 32442
+672 127 32442
+675 128 32504
+676 128 32505
+677 128 32564
+678 128 32625
+679 128 32686
+680 129 32755
+680 131 32808
+680 132 32809
+679 136 32868
+677 143 32869
+675 152 32929
+675 156 32930
+675 157 32991
+674 161 32992
+674 167 33051
+674 170 33052
+674 171 33113
+674 172 33114
+674 173 33173
+674 174 33174
+674 175 33238
+674 176 33242
+673 176 33386
+.PEN_UP
+.PEN_DOWN
+617 172 34039
+618 171 34117
+621 170 34146
+622 170 34147
+630 169 34206
+637 169 34207
+641 168 34212
+649 168 34271
+653 168 34272
+660 168 34275
+662 168 34327
+664 168 34389
+667 168 34391
+668 168 34448
+669 169 34449
+670 170 34509
+672 171 34510
+674 171 34571
+675 172 34632
+676 172 34811
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/korean/44397_100_0.txt b/tests/auto/inputpanel/hwr_test_data/korean/44397_100_0.txt
new file mode 100644
index 00000000..cd2eab9b
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/korean/44397_100_0.txt
@@ -0,0 +1,121 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+379 53 0
+380 53 155
+382 53 177
+385 53 179
+391 53 243
+400 53 244
+421 55 311
+437 55 313
+441 55 315
+448 55 365
+454 55 366
+461 55 370
+467 54 426
+472 54 427
+475 54 486
+477 54 487
+478 54 490
+479 54 548
+480 54 549
+482 54 610
+485 54 610
+488 54 670
+489 54 731
+489 55 939
+489 56 1003
+489 60 1004
+489 64 1064
+489 66 1065
+489 72 1124
+489 75 1125
+489 79 1131
+489 81 1184
+489 86 1185
+489 91 1245
+489 92 1246
+489 97 1306
+489 99 1307
+489 101 1366
+489 102 1367
+489 103 1427
+489 105 1429
+489 106 1500
+489 107 1549
+489 108 1550
+489 109 1614
+.PEN_UP
+.PEN_DOWN
+383 113 2999
+384 113 3259
+385 112 3291
+386 112 3360
+399 112 3361
+412 112 3389
+434 112 3449
+440 112 3450
+451 112 3451
+455 112 3510
+479 111 3511
+493 110 3574
+506 109 3576
+513 109 3632
+515 109 3633
+516 109 3636
+.PEN_UP
+.PEN_DOWN
+430 115 5767
+430 116 5851
+432 120 5884
+433 123 5937
+433 127 5938
+434 130 6000
+434 133 6002
+435 139 6058
+435 141 6059
+435 142 6124
+435 143 6523
+.PEN_UP
+.PEN_DOWN
+393 151 7943
+394 151 8099
+399 150 8124
+412 150 8184
+422 150 8185
+438 150 8245
+448 150 8246
+465 149 8305
+478 149 8306
+485 149 8366
+487 149 8366
+488 149 8432
+489 149 8490
+491 149 8492
+492 149 8549
+492 150 8835
+492 152 8882
+492 155 8883
+492 159 8944
+492 163 8945
+492 168 9005
+491 173 9005
+491 177 9067
+490 182 9068
+490 188 9126
+490 192 9126
+490 193 9130
+490 196 9188
+490 198 9247
+490 200 9247
+490 202 9307
+490 203 9308
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/korean/50612_100_0.txt b/tests/auto/inputpanel/hwr_test_data/korean/50612_100_0.txt
new file mode 100644
index 00000000..fd22d87d
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/korean/50612_100_0.txt
@@ -0,0 +1,93 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+569 64 0
+568 64 53
+565 64 54
+559 64 114
+553 65 115
+545 66 174
+533 71 175
+526 79 242
+522 87 245
+520 92 246
+519 94 296
+517 103 297
+516 114 357
+518 130 358
+520 141 417
+522 146 418
+524 152 478
+528 159 479
+533 165 540
+536 169 541
+538 171 601
+543 174 601
+544 175 604
+545 175 662
+549 175 664
+557 174 723
+564 170 727
+570 164 789
+578 159 793
+581 155 849
+584 151 849
+586 147 852
+588 143 904
+588 137 905
+590 131 907
+590 125 965
+590 115 966
+589 109 997
+585 98 1029
+583 88 1030
+580 83 1089
+576 75 1091
+576 73 1092
+572 70 1151
+568 65 1153
+568 64 1209
+567 64 1453
+.PEN_UP
+.PEN_DOWN
+592 124 2520
+593 124 2621
+595 123 2645
+601 123 2711
+607 122 2712
+614 122 2779
+618 122 2781
+622 121 2840
+623 121 2957
+624 121 3045
+625 120 3236
+.PEN_UP
+.PEN_DOWN
+614 42 3848
+614 45 3896
+614 47 3897
+614 54 3900
+615 63 3958
+617 76 3958
+619 92 4017
+620 100 4018
+620 115 4078
+620 133 4079
+618 141 4084
+616 153 4138
+616 157 4139
+615 169 4200
+614 176 4201
+614 178 4205
+613 184 4260
+613 188 4261
+613 190 4420
+613 191 4540
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/korean/54620_100_0.txt b/tests/auto/inputpanel/hwr_test_data/korean/54620_100_0.txt
new file mode 100644
index 00000000..99f6f912
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/korean/54620_100_0.txt
@@ -0,0 +1,159 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+169 59 0
+171 59 148
+175 59 170
+183 59 228
+197 59 229
+210 59 288
+223 61 289
+233 61 292
+241 61 350
+252 62 350
+260 62 418
+265 62 419
+266 62 748
+.PEN_UP
+.PEN_DOWN
+224 27 1367
+223 27 1414
+222 34 1444
+222 39 1502
+223 46 1503
+223 47 1508
+223 50 1566
+224 53 1568
+224 56 1629
+224 57 1630
+225 59 1630
+225 61 1686
+225 62 1687
+.PEN_UP
+.PEN_DOWN
+244 82 3184
+243 81 3259
+242 81 3285
+238 80 3349
+225 80 3350
+210 80 3412
+198 82 3414
+192 84 3474
+186 88 3476
+184 90 3478
+180 95 3532
+178 100 3533
+178 109 3595
+178 117 3598
+181 125 3657
+186 130 3658
+194 136 3716
+197 137 3717
+199 137 3775
+202 137 3776
+204 137 3780
+206 137 3835
+223 135 3836
+234 133 3897
+240 130 3898
+242 129 3900
+244 128 3958
+251 120 3959
+253 117 4017
+253 114 4020
+253 110 4081
+251 104 4083
+249 99 4140
+247 95 4141
+243 89 4205
+242 86 4206
+242 85 4212
+241 84 4284
+240 84 4324
+239 84 4596
+.PEN_UP
+.PEN_DOWN
+177 144 6344
+178 144 6573
+178 146 6600
+179 148 6604
+179 150 6657
+180 153 6658
+181 160 6719
+182 167 6720
+183 176 6779
+184 182 6780
+184 185 6840
+185 189 6841
+186 189 7108
+195 189 7174
+206 187 7234
+213 186 7236
+219 186 7294
+224 186 7296
+233 186 7355
+241 185 7355
+252 185 7417
+262 185 7419
+268 186 7421
+276 186 7475
+281 186 7476
+289 186 7536
+290 186 7537
+291 186 7597
+292 186 7660
+293 186 7724
+294 186 7725
+295 186 8172
+.PEN_UP
+.PEN_DOWN
+283 25 9136
+283 26 9220
+283 27 9244
+283 33 9299
+283 41 9300
+282 53 9359
+282 65 9359
+282 78 9420
+282 92 9421
+281 115 9481
+280 124 9482
+279 133 9484
+279 135 9542
+278 142 9542
+277 148 9605
+277 150 9607
+277 151 9764
+277 153 9816
+277 154 9876
+277 153 10124
+277 151 10180
+.PEN_UP
+.PEN_DOWN
+282 89 10651
+283 89 10796
+286 89 10821
+288 88 10879
+291 88 10879
+294 88 10941
+295 88 10941
+297 88 11003
+298 88 11004
+299 88 11061
+300 88 11062
+301 88 11121
+302 88 11123
+303 88 11185
+304 88 11187
+305 88 11189
+306 88 11248
+307 88 11249
+309 89 11304
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/simp_chinese/20013_100_0.txt b/tests/auto/inputpanel/hwr_test_data/simp_chinese/20013_100_0.txt
new file mode 100644
index 00000000..27414acd
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/simp_chinese/20013_100_0.txt
@@ -0,0 +1,216 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 95
+.Y_POINTS_PER_INCH 95
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+185 59 0
+185 61 181
+185 63 202
+185 65 205
+185 68 235
+185 70 236
+185 73 236
+185 75 268
+185 80 269
+185 84 301
+185 87 302
+185 89 334
+185 92 335
+185 94 368
+184 97 369
+184 98 372
+184 99 401
+184 101 402
+184 102 405
+184 104 434
+184 105 467
+184 106 501
+184 107 534
+184 108 535
+184 109 567
+184 111 567
+184 112 604
+184 113 634
+184 114 667
+184 115 700
+184 116 734
+184 117 767
+184 118 801
+184 119 805
+184 120 833
+184 121 837
+184 123 866
+184 124 902
+184 125 937
+184 126 997
+184 127 1040
+184 128 1149
+.PEN_UP
+.PEN_DOWN
+184 63 1871
+185 63 1917
+186 63 1918
+188 63 1947
+190 62 1948
+191 62 1948
+196 62 1980
+202 62 1981
+209 61 2014
+217 61 2015
+228 61 2047
+241 61 2048
+248 61 2052
+253 61 2080
+264 61 2081
+267 61 2084
+271 61 2114
+277 61 2114
+279 61 2117
+283 61 2147
+288 61 2148
+290 61 2149
+292 61 2180
+296 61 2181
+298 61 2213
+299 61 2214
+301 60 2246
+302 60 2437
+303 60 2485
+304 60 2532
+305 60 2564
+305 61 2596
+305 62 2629
+305 64 2630
+305 66 2662
+305 67 2663
+306 69 2695
+306 71 2696
+306 75 2729
+306 78 2730
+306 79 2732
+306 81 2762
+306 85 2763
+306 87 2764
+306 89 2796
+306 93 2796
+306 95 2796
+306 101 2828
+305 105 2829
+305 109 2862
+305 113 2863
+304 119 2896
+304 122 2896
+304 123 2901
+303 126 2929
+303 128 2929
+303 130 2962
+303 131 2962
+303 132 2995
+303 133 3029
+.PEN_UP
+.PEN_DOWN
+184 129 4367
+188 129 4409
+190 129 4410
+191 129 4413
+193 129 4441
+197 128 4442
+198 128 4444
+200 128 4474
+203 128 4475
+205 127 4476
+209 127 4508
+219 127 4509
+227 127 4541
+237 127 4542
+244 127 4574
+246 127 4575
+248 127 4607
+250 127 4608
+252 126 4640
+255 126 4641
+257 126 4644
+259 125 4674
+261 125 4675
+263 125 4677
+265 125 4707
+266 125 4740
+269 125 4741
+270 125 4774
+275 125 4775
+279 125 4807
+283 125 4808
+287 125 4840
+289 125 4841
+291 125 4873
+292 125 4874
+293 125 4876
+294 125 4907
+296 125 4908
+298 125 4909
+299 125 4940
+302 125 4941
+303 126 4974
+304 126 5006
+305 126 5007
+306 126 5040
+.PEN_UP
+.PEN_DOWN
+244 32 6303
+244 34 6340
+244 35 6355
+244 37 6356
+244 40 6386
+244 46 6387
+244 50 6388
+244 54 6419
+245 67 6420
+247 75 6453
+248 84 6453
+249 89 6486
+249 96 6487
+250 102 6519
+250 107 6520
+251 111 6537
+251 113 6553
+251 118 6553
+251 120 6557
+251 122 6586
+251 126 6587
+251 128 6588
+251 130 6619
+252 133 6620
+252 135 6620
+252 138 6652
+252 141 6653
+252 144 6686
+252 147 6686
+252 151 6719
+252 154 6719
+252 156 6724
+252 157 6752
+252 161 6753
+252 162 6756
+252 165 6786
+252 167 6788
+252 170 6819
+252 172 6820
+252 174 6852
+252 176 6852
+252 178 6885
+252 180 6886
+252 182 6918
+252 183 6919
+252 184 6935
+251 185 6952
+251 186 6956
+251 187 6985
+251 188 7018
+251 189 7205
+251 190 7293
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/simp_chinese/25991_100_0.txt b/tests/auto/inputpanel/hwr_test_data/simp_chinese/25991_100_0.txt
new file mode 100644
index 00000000..eec059f5
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/simp_chinese/25991_100_0.txt
@@ -0,0 +1,172 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 95
+.Y_POINTS_PER_INCH 95
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+415 26 0
+416 28 46
+417 28 63
+418 30 96
+419 31 97
+420 31 100
+422 34 130
+424 36 163
+425 38 163
+426 39 164
+427 42 196
+428 45 196
+429 47 229
+430 50 230
+431 52 263
+431 54 263
+432 55 296
+433 56 296
+433 57 300
+433 58 330
+433 59 330
+433 60 364
+433 61 365
+433 62 404
+.PEN_UP
+.PEN_DOWN
+356 80 1935
+357 80 1980
+358 81 1981
+359 81 2008
+361 81 2012
+363 81 2041
+365 81 2045
+367 81 2075
+370 81 2075
+372 81 2076
+375 81 2108
+379 81 2109
+385 80 2141
+390 80 2142
+396 79 2174
+403 79 2175
+406 79 2180
+410 77 2208
+416 77 2209
+420 76 2213
+422 76 2241
+428 75 2242
+431 75 2245
+434 74 2274
+443 73 2275
+446 73 2276
+451 71 2307
+460 70 2308
+464 68 2341
+468 67 2341
+470 66 2374
+475 64 2374
+477 64 2392
+479 63 2407
+484 62 2408
+485 61 2440
+487 60 2441
+489 59 2444
+491 57 2474
+493 56 2508
+495 55 2508
+496 54 2508
+498 53 2540
+499 52 2541
+500 50 2573
+501 49 2607
+502 48 2640
+503 47 2641
+504 46 2673
+504 45 2724
+504 44 3053
+.PEN_UP
+.PEN_DOWN
+434 82 4671
+434 84 4718
+434 86 4735
+434 88 4740
+434 89 4768
+434 92 4769
+433 94 4772
+432 96 4802
+430 101 4802
+429 103 4804
+429 106 4835
+428 112 4836
+428 114 4836
+425 121 4868
+423 127 4869
+421 132 4901
+417 137 4902
+414 143 4934
+412 148 4935
+406 156 4968
+401 163 4969
+398 166 4972
+397 169 5001
+393 173 5002
+392 175 5005
+391 176 5034
+390 178 5035
+389 179 5036
+388 180 5067
+387 181 5068
+386 182 5101
+385 182 5589
+384 182 5616
+.PEN_UP
+.PEN_DOWN
+385 84 6399
+386 84 6468
+387 87 6489
+388 90 6531
+391 95 6531
+392 97 6532
+394 99 6564
+396 106 6564
+401 113 6597
+406 120 6598
+411 126 6630
+416 132 6631
+422 138 6663
+426 143 6664
+427 143 6668
+429 145 6697
+432 150 6697
+433 153 6700
+436 156 6730
+440 160 6730
+444 163 6732
+447 165 6763
+454 171 6764
+457 173 6797
+458 173 6798
+459 174 6830
+460 175 6831
+462 176 6863
+466 178 6864
+471 179 6897
+473 179 6897
+474 180 6900
+475 180 6930
+477 180 6964
+478 180 6996
+479 180 7029
+480 180 7064
+481 181 7097
+483 181 7100
+485 181 7149
+486 181 7180
+487 181 7213
+488 181 7304
+489 181 7346
+490 181 7396
+491 181 7428
+491 182 7629
+.PEN_UP
diff --git a/tests/auto/inputpanel/hwr_test_data/trad_chinese/22283_100_0.txt b/tests/auto/inputpanel/hwr_test_data/trad_chinese/22283_100_0.txt
new file mode 100644
index 00000000..2ee9924d
--- /dev/null
+++ b/tests/auto/inputpanel/hwr_test_data/trad_chinese/22283_100_0.txt
@@ -0,0 +1,279 @@
+.VERSION 1.0
+.HIERARCHY CHARACTER
+.COORD X Y T
+.SEGMENT CHARACTER
+.X_DIM 1032
+.Y_DIM 263
+.X_POINTS_PER_INCH 94
+.Y_POINTS_PER_INCH 94
+.POINTS_PER_SECOND 60
+.PEN_DOWN
+232 61 0
+232 62 51
+232 63 71
+232 65 75
+232 74 132
+232 77 133
+234 90 193
+238 110 194
+239 113 195
+240 118 259
+242 128 260
+243 131 317
+244 136 319
+245 140 376
+245 144 377
+246 147 439
+246 154 441
+247 158 497
+248 162 498
+248 165 561
+248 170 562
+248 172 619
+248 174 620
+248 175 679
+248 176 743
+248 177 744
+248 178 748
+248 179 987
+.PEN_UP
+.PEN_DOWN
+229 61 2287
+230 61 2346
+231 61 2347
+232 61 2409
+234 61 2411
+241 61 2470
+252 60 2472
+256 60 2475
+288 58 2532
+308 57 2590
+325 57 2591
+338 57 2654
+347 56 2655
+350 55 2713
+351 55 2714
+352 55 2779
+353 54 2780
+355 54 2837
+357 53 2839
+358 53 2924
+359 53 3211
+360 54 3331
+361 56 3380
+362 58 3381
+363 61 3440
+363 68 3441
+363 72 3442
+363 82 3504
+363 99 3505
+363 102 3507
+365 111 3564
+366 119 3565
+368 132 3626
+370 146 3627
+370 152 3686
+370 157 3687
+370 162 3691
+370 166 3747
+370 171 3748
+370 175 3813
+370 177 3871
+370 178 3876
+370 179 4091
+371 179 4239
+.PEN_UP
+.PEN_DOWN
+261 103 7159
+262 103 7207
+263 103 7208
+268 103 7268
+277 102 7269
+285 101 7334
+291 101 7335
+296 100 7338
+297 100 7390
+310 97 7392
+315 95 7449
+317 94 7450
+318 93 7451
+319 92 7511
+321 92 7571
+323 92 7572
+325 92 7631
+325 91 7632
+326 91 7692
+327 91 7755
+328 90 7844
+.PEN_UP
+.PEN_DOWN
+263 126 9608
+264 126 9663
+264 127 9664
+265 133 9723
+265 136 9724
+265 139 9785
+265 141 9786
+265 142 9845
+266 144 9846
+266 145 9906
+266 146 9908
+267 148 9965
+267 149 9966
+.PEN_UP
+.PEN_DOWN
+264 126 10655
+267 126 10724
+272 125 10741
+277 125 10786
+281 125 10787
+287 125 10847
+288 125 10848
+291 124 10851
+293 123 10915
+293 125 11083
+293 126 11149
+293 130 11150
+293 132 11155
+293 135 11210
+293 138 11211
+293 139 11271
+294 142 11272
+294 143 11371
+294 144 11425
+294 145 11428
+295 146 11484
+.PEN_UP
+.PEN_DOWN
+269 152 12343
+271 152 12435
+272 152 12461
+275 152 12520
+277 151 12521
+278 151 12523
+280 151 12581
+281 151 12582
+282 151 12642
+284 151 12643
+285 150 12644
+286 150 12704
+287 150 12762
+288 150 12763
+289 150 12824
+290 150 12889
+291 150 12947
+292 150 13005
+293 150 13066
+.PEN_UP
+.PEN_DOWN
+270 172 18223
+271 172 18227
+273 172 18277
+277 172 18278
+280 172 18339
+283 170 18340
+288 168 18398
+292 167 18398
+295 167 18402
+296 167 18465
+298 167 18466
+300 166 18522
+301 166 18583
+302 166 18779
+.PEN_UP
+.PEN_DOWN
+301 79 19886
+301 80 19995
+301 82 20021
+302 84 20027
+303 86 20075
+304 88 20076
+304 90 20130
+306 94 20131
+309 101 20190
+312 109 20191
+314 113 20195
+315 117 20250
+316 123 20251
+318 129 20311
+321 136 20312
+324 141 20372
+326 145 20374
+329 150 20432
+330 153 20434
+331 155 20499
+332 157 20500
+333 158 20555
+333 160 20557
+333 161 20614
+334 162 20677
+334 163 20739
+335 164 20799
+336 165 20801
+337 165 20859
+338 167 20860
+338 168 20919
+339 168 21020
+340 168 21131
+341 166 21192
+342 166 21193
+342 163 21253
+343 162 21254
+344 160 21258
+344 159 21316
+345 158 21317
+.PEN_UP
+.PEN_DOWN
+339 113 23351
+338 113 23426
+337 117 23453
+336 117 23485
+334 122 23505
+333 124 23506
+332 125 23507
+331 129 23561
+329 132 23562
+327 135 23623
+323 143 23625
+320 149 23682
+319 150 23683
+317 152 23745
+314 157 23747
+313 159 23805
+310 165 23806
+310 166 23810
+309 167 23908
+.PEN_UP
+.PEN_DOWN
+319 69 25630
+321 70 25747
+322 71 25774
+326 73 25779
+327 74 25843
+333 78 25844
+335 80 25904
+.PEN_UP
+.PEN_DOWN
+256 179 27231
+257 179 27302
+263 179 27332
+282 179 27393
+290 179 27394
+314 179 27455
+326 180 27457
+329 180 27460
+336 180 27516
+343 180 27516
+344 180 27578
+345 180 27580
+346 180 27639
+347 180 27641
+348 179 27698
+350 179 27759
+352 179 27760
+354 179 27821
+357 179 27882
+358 179 27944
+359 179 28003
+361 179 28004
+.PEN_UP