diff --git a/Telegram/Patches/qtbase_5_3_2.diff b/Telegram/Patches/qtbase_5_3_2.diff index fbdd4fdf39..1fbbb5d1b0 100644 --- a/Telegram/Patches/qtbase_5_3_2.diff +++ b/Telegram/Patches/qtbase_5_3_2.diff @@ -93,7 +93,7 @@ index ebff950..4300ca4 100644 // Make sure we're inside the viewport. diff --git a/src/gui/text/qtextlayout.cpp b/src/gui/text/qtextlayout.cpp -index 4879ae5..3251354 100644 +index 4879ae5..56cdcba 100644 --- a/src/gui/text/qtextlayout.cpp +++ b/src/gui/text/qtextlayout.cpp @@ -654,6 +654,9 @@ int QTextLayout::nextCursorPosition(int oldPos, CursorMode mode) const @@ -128,7 +128,7 @@ index 4879ae5..3251354 100644 QFixed minw; QFixed softHyphenWidth; QFixed rightBearing; -@@ -1634,13 +1641,17 @@ namespace { +@@ -1634,13 +1641,19 @@ namespace { if (currentPosition > 0 && logClusters[currentPosition - 1] < glyphs.numGlyphs) { previousGlyph = currentGlyph(); // needed to calculate right bearing later @@ -144,11 +144,13 @@ index 4879ae5..3251354 100644 { qreal rb; - fontEngine->getGlyphBearings(glyph, 0, &rb); ++ ++ // Patch: Backport a crash fix. + engine->getGlyphBearings(glyph, 0, &rb); rightBearing = qMin(QFixed(), QFixed::fromReal(rb)); } -@@ -1648,13 +1659,16 @@ namespace { +@@ -1648,13 +1661,16 @@ namespace { { if (currentPosition <= 0) return; diff --git a/Telegram/Patches/qtbase_5_6_2.diff b/Telegram/Patches/qtbase_5_6_2.diff new file mode 100644 index 0000000000..aeb46ca3e3 --- /dev/null +++ b/Telegram/Patches/qtbase_5_6_2.diff @@ -0,0 +1,12134 @@ +diff --git a/mkspecs/common/msvc-desktop.conf b/mkspecs/common/msvc-desktop.conf +index eec9e1f..7ae53c7 100644 +--- a/mkspecs/common/msvc-desktop.conf ++++ b/mkspecs/common/msvc-desktop.conf +@@ -30,9 +30,10 @@ QMAKE_YACCFLAGS = -d + QMAKE_CFLAGS = -nologo -Zc:wchar_t + QMAKE_CFLAGS_WARN_ON = -W3 + QMAKE_CFLAGS_WARN_OFF = -W0 +-QMAKE_CFLAGS_RELEASE = -O2 -MD +-QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MD -Zi +-QMAKE_CFLAGS_DEBUG = -Zi -MDd ++# Patch: Make this build use static runtime library. ++QMAKE_CFLAGS_RELEASE = -O2 -MT ++QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MT -Zi ++QMAKE_CFLAGS_DEBUG = -Zi -MTd + QMAKE_CFLAGS_YACC = + QMAKE_CFLAGS_LTCG = -GL + QMAKE_CFLAGS_SSE2 = -arch:SSE2 +diff --git a/src/corelib/tools/qunicodetables.cpp b/src/corelib/tools/qunicodetables.cpp +index 14e4fd1..0619a17 100644 +--- a/src/corelib/tools/qunicodetables.cpp ++++ b/src/corelib/tools/qunicodetables.cpp +@@ -6227,7 +6227,8 @@ static const Properties uc_properties[] = { + { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 7, 4, 4, 21, 11 }, + { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 11 }, + { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 85, 0, 8, 8, 12, 11 }, +- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 12, 17, 2 }, ++ // Patch: Some bad characters appeared in ui in case 2 was here instead of 11. ++ { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 12, 17, 11 }, + { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 11 }, + { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 11 }, + { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 11 }, +diff --git a/src/gui/kernel/qhighdpiscaling.cpp b/src/gui/kernel/qhighdpiscaling.cpp +index 2d00b9d..eeba86e 100644 +--- a/src/gui/kernel/qhighdpiscaling.cpp ++++ b/src/gui/kernel/qhighdpiscaling.cpp +@@ -51,6 +51,9 @@ static const char screenFactorsEnvVar[] = "QT_SCREEN_SCALE_FACTORS"; + + static inline qreal initialGlobalScaleFactor() + { ++ // Patch: Disable environment variable dpi scaling changing. ++ // It is not supported by Telegram Desktop :( ++ return 1.; + + qreal result = 1; + if (qEnvironmentVariableIsSet(scaleFactorEnvVar)) { +diff --git a/src/gui/kernel/qplatformdialoghelper.h b/src/gui/kernel/qplatformdialoghelper.h +index 5b2f4ec..790db46 100644 +--- a/src/gui/kernel/qplatformdialoghelper.h ++++ b/src/gui/kernel/qplatformdialoghelper.h +@@ -386,6 +386,10 @@ public: + virtual QUrl directory() const = 0; + virtual void selectFile(const QUrl &filename) = 0; + virtual QList selectedFiles() const = 0; ++ ++ // Patch: Adding select-by-url for Windows file dialog. ++ virtual QByteArray selectedRemoteContent() const { return QByteArray(); } ++ + virtual void setFilter() = 0; + virtual void selectNameFilter(const QString &filter) = 0; + virtual QString selectedNameFilter() const = 0; +diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp +index bcd29b6..bcb0672 100644 +--- a/src/gui/kernel/qwindow.cpp ++++ b/src/gui/kernel/qwindow.cpp +@@ -2525,7 +2525,8 @@ void QWindowPrivate::setCursor(const QCursor *newCursor) + void QWindowPrivate::applyCursor() + { + Q_Q(QWindow); +- if (platformWindow) { ++ // Patch: Fixing possible crash (crashdumps point on this code line). ++ if (platformWindow && q->screen() && q->screen()->handle()) { + if (QPlatformCursor *platformCursor = q->screen()->handle()->cursor()) { + QCursor *c = QGuiApplication::overrideCursor(); + if (!c && hasCursor) +diff --git a/src/gui/painting/qpaintengine_p.h b/src/gui/painting/qpaintengine_p.h +index 918c989..4158259 100644 +--- a/src/gui/painting/qpaintengine_p.h ++++ b/src/gui/painting/qpaintengine_p.h +@@ -80,8 +80,18 @@ public: + if (hasSystemTransform) { + if (systemTransform.type() <= QTransform::TxTranslate) + systemClip.translate(qRound(systemTransform.dx()), qRound(systemTransform.dy())); +- else ++ // Patch: Transform the system clip region back from device pixels to device-independent pixels before ++ // applying systemTransform, which already has transform from device-independent pixels to device pixels. ++ else { ++#ifdef Q_OS_MAC ++ QTransform scaleTransform; ++ const qreal invDevicePixelRatio = 1. / pdev->devicePixelRatio(); ++ scaleTransform.scale(invDevicePixelRatio, invDevicePixelRatio); ++ systemClip = systemTransform.map(scaleTransform.map(systemClip)); ++#else + systemClip = systemTransform.map(systemClip); ++#endif ++ } + } + + // Make sure we're inside the viewport. +diff --git a/src/gui/text/qtextengine_p.h b/src/gui/text/qtextengine_p.h +index 7e507bb..936e7a9 100644 +--- a/src/gui/text/qtextengine_p.h ++++ b/src/gui/text/qtextengine_p.h +@@ -283,7 +283,8 @@ private: + + struct QScriptItem; + /// Internal QTextItem +-class QTextItemInt : public QTextItem ++// Patch: Enable access to QTextItemInt in .dll for WinRT build. ++class Q_GUI_EXPORT QTextItemInt : public QTextItem + { + public: + inline QTextItemInt() +diff --git a/src/gui/text/qtextlayout.cpp b/src/gui/text/qtextlayout.cpp +index aca475a..5fa0be2 100644 +--- a/src/gui/text/qtextlayout.cpp ++++ b/src/gui/text/qtextlayout.cpp +@@ -694,6 +694,9 @@ int QTextLayout::nextCursorPosition(int oldPos, CursorMode mode) const + while (oldPos < len && !attributes[oldPos].graphemeBoundary) + oldPos++; + } else { ++ // Patch: Skip to the end of the current word, not to the start of the next one. ++ while (oldPos < len && attributes[oldPos].whiteSpace) ++ oldPos++; + if (oldPos < len && d->atWordSeparator(oldPos)) { + oldPos++; + while (oldPos < len && d->atWordSeparator(oldPos)) +@@ -702,8 +705,9 @@ int QTextLayout::nextCursorPosition(int oldPos, CursorMode mode) const + while (oldPos < len && !attributes[oldPos].whiteSpace && !d->atWordSeparator(oldPos)) + oldPos++; + } +- while (oldPos < len && attributes[oldPos].whiteSpace) +- oldPos++; ++ // Patch: Skip to the end of the current word, not to the start of the next one. ++ //while (oldPos < len && attributes[oldPos].whiteSpace) ++ // oldPos++; + } + + return oldPos; +@@ -1645,6 +1649,9 @@ namespace { + int currentPosition; + glyph_t previousGlyph; + ++ // Patch: Fix a crash in right bearing calculation. ++ QFontEngine *previousGlyphFontEngine; ++ + QFixed minw; + QFixed softHyphenWidth; + QFixed rightBearing; +@@ -1677,13 +1684,19 @@ namespace { + if (currentPosition > 0 && + logClusters[currentPosition - 1] < glyphs.numGlyphs) { + previousGlyph = currentGlyph(); // needed to calculate right bearing later ++ ++ // Patch: Fix a crash in right bearing calculation. ++ previousGlyphFontEngine = fontEngine; + } + } + +- inline void calculateRightBearing(glyph_t glyph) ++ // Patch: Fix a crash in right bearing calculation. ++ inline void calculateRightBearing(QFontEngine *engine, glyph_t glyph) + { + qreal rb; +- fontEngine->getGlyphBearings(glyph, 0, &rb); ++ ++ // Patch: Fix a crash in right bearing calculation. ++ engine->getGlyphBearings(glyph, 0, &rb); + + // We only care about negative right bearings, so we limit the range + // of the bearing here so that we can assume it's negative in the rest +@@ -1696,13 +1709,16 @@ namespace { + { + if (currentPosition <= 0) + return; +- calculateRightBearing(currentGlyph()); ++ ++ // Patch: Fix a crash in right bearing calculation. ++ calculateRightBearing(fontEngine, currentGlyph()); + } + + inline void calculateRightBearingForPreviousGlyph() + { + if (previousGlyph > 0) +- calculateRightBearing(previousGlyph); ++ // Patch: Fix a crash in right bearing calculation. ++ calculateRightBearing(previousGlyphFontEngine, previousGlyph); + } + + static const QFixed RightBearingNotCalculated; +diff --git a/src/gui/text/qtextlayout.h b/src/gui/text/qtextlayout.h +index f74d4d4..8ad672c 100644 +--- a/src/gui/text/qtextlayout.h ++++ b/src/gui/text/qtextlayout.h +@@ -196,6 +196,9 @@ private: + QRectF *brect, int tabstops, int* tabarray, int tabarraylen, + QPainter *painter); + QTextEngine *d; ++ ++ // Patch: Allow access to private constructor. ++ friend class TextBlock; + }; + + +diff --git a/src/network/socket/qnativesocketengine_win.cpp b/src/network/socket/qnativesocketengine_win.cpp +index 41834b2..8cdf4ab 100644 +--- a/src/network/socket/qnativesocketengine_win.cpp ++++ b/src/network/socket/qnativesocketengine_win.cpp +@@ -675,6 +675,13 @@ bool QNativeSocketEnginePrivate::nativeConnect(const QHostAddress &address, quin + errorDetected = true; + break; + } ++ // Patch: Handle network unreachable the same as host unreachable. ++ if (value == WSAENETUNREACH) { ++ setError(QAbstractSocket::NetworkError, NetworkUnreachableErrorString); ++ socketState = QAbstractSocket::UnconnectedState; ++ errorDetected = true; ++ break; ++ } + if (value == WSAEADDRNOTAVAIL) { + setError(QAbstractSocket::NetworkError, AddressNotAvailableErrorString); + socketState = QAbstractSocket::UnconnectedState; +diff --git a/src/platformsupport/fontdatabases/basic/qbasicfontdatabase.cpp b/src/platformsupport/fontdatabases/basic/qbasicfontdatabase.cpp +index 728b166..1dc6459 100644 +--- a/src/platformsupport/fontdatabases/basic/qbasicfontdatabase.cpp ++++ b/src/platformsupport/fontdatabases/basic/qbasicfontdatabase.cpp +@@ -172,6 +172,79 @@ void QBasicFontDatabase::releaseHandle(void *handle) + + extern FT_Library qt_getFreetype(); + ++// Patch: Enable Open Sans Semibold font family reading. ++// Copied from freetype with some modifications. ++ ++#ifndef FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY ++#define FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY FT_MAKE_TAG('i', 'g', 'p', 'f') ++#endif ++ ++#ifndef FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY ++#define FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY FT_MAKE_TAG('i', 'g', 'p', 's') ++#endif ++ ++/* there's a Mac-specific extended implementation of FT_New_Face() */ ++/* in src/base/ftmac.c */ ++ ++#if !defined( FT_MACINTOSH ) || defined( DARWIN_NO_CARBON ) ++ ++/* documentation is in freetype.h */ ++ ++FT_Error __ft_New_Face(FT_Library library, const char* pathname, FT_Long face_index, FT_Face *aface) { ++ FT_Open_Args args; ++ ++ /* test for valid `library' and `aface' delayed to FT_Open_Face() */ ++ if (!pathname) ++ return FT_Err_Invalid_Argument; ++ ++ FT_Parameter params[2]; ++ params[0].tag = FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY; ++ params[0].data = 0; ++ params[1].tag = FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY; ++ params[1].data = 0; ++ args.flags = FT_OPEN_PATHNAME | FT_OPEN_PARAMS; ++ args.pathname = (char*)pathname; ++ args.stream = NULL; ++ args.num_params = 2; ++ args.params = params; ++ ++ return FT_Open_Face(library, &args, face_index, aface); ++} ++ ++#else ++ ++FT_Error __ft_New_Face(FT_Library library, const char* pathname, FT_Long face_index, FT_Face *aface) { ++ return FT_New_Face(library, pathname, face_index, aface); ++} ++ ++#endif /* defined( FT_MACINTOSH ) && !defined( DARWIN_NO_CARBON ) */ ++ ++/* documentation is in freetype.h */ ++ ++FT_Error __ft_New_Memory_Face(FT_Library library, const FT_Byte* file_base, FT_Long file_size, FT_Long face_index, FT_Face *aface) { ++ FT_Open_Args args; ++ ++ /* test for valid `library' and `face' delayed to FT_Open_Face() */ ++ if (!file_base) ++ return FT_Err_Invalid_Argument; ++ ++ FT_Parameter params[2]; ++ params[0].tag = FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY; ++ params[0].data = 0; ++ params[1].tag = FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY; ++ params[1].data = 0; ++ args.flags = FT_OPEN_MEMORY | FT_OPEN_PARAMS; ++ args.memory_base = file_base; ++ args.memory_size = file_size; ++ args.stream = NULL; ++ args.num_params = 2; ++ args.params = params; ++ ++ return FT_Open_Face(library, &args, face_index, aface); ++} ++ ++// end ++ + QStringList QBasicFontDatabase::addTTFile(const QByteArray &fontData, const QByteArray &file) + { + FT_Library library = qt_getFreetype(); +@@ -183,9 +256,11 @@ QStringList QBasicFontDatabase::addTTFile(const QByteArray &fontData, const QByt + FT_Face face; + FT_Error error; + if (!fontData.isEmpty()) { +- error = FT_New_Memory_Face(library, (const FT_Byte *)fontData.constData(), fontData.size(), index, &face); ++ // Patch: Enable Open Sans Semibold font family reading. ++ error = __ft_New_Memory_Face(library, (const FT_Byte *)fontData.constData(), fontData.size(), index, &face); + } else { +- error = FT_New_Face(library, file.constData(), index, &face); ++ // Patch: Enable Open Sans Semibold font family reading. ++ error = __ft_New_Face(library, file.constData(), index, &face); + } + if (error != FT_Err_Ok) { + qDebug() << "FT_New_Face failed with index" << index << ':' << hex << error; +diff --git a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp +index 8ebabf3..7bb8abd 100644 +--- a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp ++++ b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp +@@ -375,6 +375,17 @@ static void populateFromPattern(FcPattern *pattern) + + familyName = QString::fromUtf8((const char *)value); + ++ // Patch: Enable Open Sans Semibold font family reading. ++ if (familyName == QLatin1String("Open Sans")) { ++ FcChar8 *styl = 0; ++ if (FcPatternGetString(pattern, FC_STYLE, 0, &styl) == FcResultMatch) { ++ QString style = QString::fromUtf8(reinterpret_cast(styl)); ++ if (style == QLatin1String("Semibold")) { ++ familyName.append(QChar(QChar::Space)).append(style); ++ } ++ } ++ } ++ + slant_value = FC_SLANT_ROMAN; + weight_value = FC_WEIGHT_REGULAR; + spacing_value = FC_PROPORTIONAL; +@@ -718,7 +729,19 @@ QStringList QFontconfigDatabase::fallbacksForFamily(const QString &family, QFont + if (FcPatternGetString(fontSet->fonts[i], FC_FAMILY, 0, &value) != FcResultMatch) + continue; + // capitalize(value); +- const QString familyName = QString::fromUtf8((const char *)value); ++ ++ // Patch: Enable Open Sans Semibold font family reading. ++ QString familyName = QString::fromUtf8((const char *)value); ++ if (familyName == QLatin1String("Open Sans")) { ++ FcChar8 *styl = 0; ++ if (FcPatternGetString(fontSet->fonts[i], FC_STYLE, 0, &styl) == FcResultMatch) { ++ QString style = QString::fromUtf8(reinterpret_cast(styl)); ++ if (style == QLatin1String("Semibold")) { ++ familyName.append(QChar(QChar::Space)).append(style); ++ } ++ } ++ } ++ + const QString familyNameCF = familyName.toCaseFolded(); + if (!duplicates.contains(familyNameCF)) { + fallbackFamilies << familyName; +@@ -784,6 +807,18 @@ QStringList QFontconfigDatabase::addApplicationFont(const QByteArray &fontData, + FcChar8 *fam = 0; + if (FcPatternGetString(pattern, FC_FAMILY, 0, &fam) == FcResultMatch) { + QString family = QString::fromUtf8(reinterpret_cast(fam)); ++ ++ // Patch: Enable Open Sans Semibold font family reading. ++ if (family == QLatin1String("Open Sans")) { ++ FcChar8 *styl = 0; ++ if (FcPatternGetString(pattern, FC_STYLE, 0, &styl) == FcResultMatch) { ++ QString style = QString::fromUtf8(reinterpret_cast(styl)); ++ if (style == QLatin1String("Semibold")) { ++ family.append(QChar(QChar::Space)).append(style); ++ } ++ } ++ } ++ + families << family; + } + populateFromPattern(pattern); +diff --git a/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm b/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm +index 566abf2..5b9c714 100644 +--- a/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm ++++ b/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm +@@ -265,6 +265,13 @@ static void getFontDescription(CTFontDescriptorRef font, FontDescription *fd) + + fd->foundryName = QStringLiteral("CoreText"); + fd->familyName = (CFStringRef) CTFontDescriptorCopyAttribute(font, kCTFontFamilyNameAttribute); ++ ++ // Patch: Enable Open Sans Semibold font family reading. ++ QCFString _displayName = (CFStringRef) CTFontDescriptorCopyAttribute(font, kCTFontDisplayNameAttribute); ++ if (_displayName == QStringLiteral("Open Sans Semibold")) { ++ fd->familyName = _displayName; ++ } ++ + fd->styleName = (CFStringRef)CTFontDescriptorCopyAttribute(font, kCTFontStyleNameAttribute); + fd->weight = QFont::Normal; + fd->style = QFont::StyleNormal; +diff --git a/src/plugins/platforminputcontexts/compose/compose.pro b/src/plugins/platforminputcontexts/compose/compose.pro +index 86bdd47..9b9c8de 100644 +--- a/src/plugins/platforminputcontexts/compose/compose.pro ++++ b/src/plugins/platforminputcontexts/compose/compose.pro +@@ -15,7 +15,8 @@ HEADERS += $$PWD/qcomposeplatforminputcontext.h \ + contains(QT_CONFIG, xkbcommon-qt): { + # dont't need x11 dependency for compose key plugin + QT_CONFIG -= use-xkbcommon-x11support +- include(../../../3rdparty/xkbcommon.pri) ++ # Patch: Adding fcitx input context plugin to our static build. ++ #include(../../../3rdparty/xkbcommon.pri) + } else { + LIBS += $$QMAKE_LIBS_XKBCOMMON + QMAKE_CXXFLAGS += $$QMAKE_CFLAGS_XKBCOMMON +diff --git a/src/plugins/platforminputcontexts/compose/qcomposeplatforminputcontext.cpp b/src/plugins/platforminputcontexts/compose/qcomposeplatforminputcontext.cpp +index d1bea9a..36a15a6 100644 +--- a/src/plugins/platforminputcontexts/compose/qcomposeplatforminputcontext.cpp ++++ b/src/plugins/platforminputcontexts/compose/qcomposeplatforminputcontext.cpp +@@ -232,6 +232,12 @@ bool QComposeInputContext::checkComposeTable() + + void QComposeInputContext::commitText(uint character) const + { ++ // Patch: Crash fix when not focused widget still receives input events. ++ if (!m_focusObject) { ++ qWarning("QComposeInputContext::commitText: m_focusObject == nullptr, cannot commit text"); ++ return; ++ } ++ + QInputMethodEvent event; + event.setCommitString(QChar(character)); + QCoreApplication::sendEvent(m_focusObject, &event); +diff --git a/src/plugins/platforminputcontexts/fcitx/fcitx.json b/src/plugins/platforminputcontexts/fcitx/fcitx.json +new file mode 100644 +index 0000000..6d2b389 +--- /dev/null ++++ b/src/plugins/platforminputcontexts/fcitx/fcitx.json +@@ -0,0 +1,3 @@ ++{ ++ "Keys": [ "fcitx" ] ++} +\ No newline at end of file +diff --git a/src/plugins/platforminputcontexts/fcitx/fcitx.pro b/src/plugins/platforminputcontexts/fcitx/fcitx.pro +new file mode 100644 +index 0000000..6f4f1e5 +--- /dev/null ++++ b/src/plugins/platforminputcontexts/fcitx/fcitx.pro +@@ -0,0 +1,38 @@ ++TARGET = fcitxplatforminputcontextplugin ++ ++PLUGIN_TYPE = platforminputcontexts ++PLUGIN_EXTENDS = - ++PLUGIN_CLASS_NAME = QFcitxPlatformInputContextPlugin ++load(qt_plugin) ++ ++QT += dbus gui-private ++SOURCES += $$PWD/fcitxqtconnection.cpp \ ++ $$PWD/fcitxqtformattedpreedit.cpp \ ++ $$PWD/fcitxqtinputcontextproxy.cpp \ ++ $$PWD/fcitxqtinputmethoditem.cpp \ ++ $$PWD/fcitxqtinputmethodproxy.cpp \ ++ $$PWD/fcitxqtkeyboardlayout.cpp \ ++ $$PWD/fcitxqtkeyboardproxy.cpp \ ++ $$PWD/keyuni.cpp \ ++ $$PWD/main.cpp \ ++ $$PWD/qfcitxplatforminputcontext.cpp \ ++ $$PWD/utils.cpp ++ ++HEADERS += $$PWD/fcitxqtconnection.h \ ++ $$PWD/fcitxqtconnection_p.h \ ++ $$PWD/fcitxqtdbusaddons_export.h \ ++ $$PWD/fcitxqtdbusaddons_version.h \ ++ $$PWD/fcitxqtformattedpreedit.h \ ++ $$PWD/fcitxqtinputcontextproxy.h \ ++ $$PWD/fcitxqtinputmethoditem.h \ ++ $$PWD/fcitxqtinputmethodproxy.h \ ++ $$PWD/fcitxqtkeyboardlayout.h \ ++ $$PWD/fcitxqtkeyboardproxy.h \ ++ $$PWD/keydata.h \ ++ $$PWD/keyserver_x11.h \ ++ $$PWD/keyuni.h \ ++ $$PWD/main.h \ ++ $$PWD/qfcitxplatforminputcontext.h \ ++ $$PWD/utils.h ++ ++OTHER_FILES += $$PWD/fcitx.json +diff --git a/src/plugins/platforminputcontexts/fcitx/fcitxqtconnection.cpp b/src/plugins/platforminputcontexts/fcitx/fcitxqtconnection.cpp +new file mode 100644 +index 0000000..a50178a +--- /dev/null ++++ b/src/plugins/platforminputcontexts/fcitx/fcitxqtconnection.cpp +@@ -0,0 +1,369 @@ ++/*************************************************************************** ++ * Copyright (C) 2012~2012 by CSSlayer * ++ * * ++ * This program is free software; you can redistribute it and/or modify * ++ * it under the terms of the GNU General Public License as published by * ++ * the Free Software Foundation; either version 2 of the License, or * ++ * (at your option) any later version. * ++ * * ++ * This program is distributed in the hope that it will be useful, * ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of * ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * ++ * GNU General Public License for more details. * ++ * * ++ * You should have received a copy of the GNU General Public License * ++ * along with this program; if not, write to the * ++ * Free Software Foundation, Inc., * ++ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ++ ***************************************************************************/ ++ ++#include "fcitxqtconnection_p.h" ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++// utils function in fcitx-utils and fcitx-config ++bool _pid_exists(pid_t pid) { ++ if (pid <= 0) ++ return 0; ++ return !(kill(pid, 0) && (errno == ESRCH)); ++} ++ ++ ++FcitxQtConnection::FcitxQtConnection(QObject* parent): QObject(parent) ++ ,d_ptr(new FcitxQtConnectionPrivate(this)) ++{ ++} ++ ++void FcitxQtConnection::startConnection() ++{ ++ Q_D(FcitxQtConnection); ++ if (!d->m_initialized) { ++ d->initialize(); ++ d->createConnection(); ++ } ++} ++ ++void FcitxQtConnection::endConnection() ++{ ++ Q_D(FcitxQtConnection); ++ d->cleanUp(); ++ d->finalize(); ++ d->m_connectedOnce = false; ++} ++ ++bool FcitxQtConnection::autoReconnect() ++{ ++ Q_D(FcitxQtConnection); ++ return d->m_autoReconnect; ++} ++ ++void FcitxQtConnection::setAutoReconnect(bool a) ++{ ++ Q_D(FcitxQtConnection); ++ d->m_autoReconnect = a; ++} ++ ++QDBusConnection* FcitxQtConnection::connection() ++{ ++ Q_D(FcitxQtConnection); ++ return d->m_connection; ++} ++ ++const QString& FcitxQtConnection::serviceName() ++{ ++ Q_D(FcitxQtConnection); ++ return d->m_serviceName; ++} ++ ++bool FcitxQtConnection::isConnected() ++{ ++ Q_D(FcitxQtConnection); ++ return d->isConnected(); ++} ++ ++ ++ ++FcitxQtConnection::~FcitxQtConnection() ++{ ++} ++ ++FcitxQtConnectionPrivate::FcitxQtConnectionPrivate(FcitxQtConnection* conn) : QObject(conn) ++ ,q_ptr(conn) ++ ,m_displayNumber(-1) ++ ,m_serviceName(QString("%1-%2").arg("org.fcitx.Fcitx").arg(displayNumber())) ++ ,m_connection(0) ++ ,m_serviceWatcher(new QDBusServiceWatcher(conn)) ++ ,m_watcher(new QFileSystemWatcher(this)) ++ ,m_autoReconnect(true) ++ ,m_connectedOnce(false) ++ ,m_initialized(false) ++{ ++} ++ ++FcitxQtConnectionPrivate::~FcitxQtConnectionPrivate() ++{ ++ if (m_connection) ++ delete m_connection; ++} ++ ++void FcitxQtConnectionPrivate::initialize() { ++ m_serviceWatcher->setConnection(QDBusConnection::sessionBus()); ++ m_serviceWatcher->addWatchedService(m_serviceName); ++ ++ QFileInfo info(socketFile()); ++ QDir dir(info.path()); ++ if (!dir.exists()) { ++ QDir rt(QDir::root()); ++ rt.mkpath(info.path()); ++ } ++ m_watcher->addPath(info.path()); ++ if (info.exists()) { ++ m_watcher->addPath(info.filePath()); ++ } ++ ++ connect(m_watcher, SIGNAL(fileChanged(QString)), this, SLOT(socketFileChanged())); ++ connect(m_watcher, SIGNAL(directoryChanged(QString)), this, SLOT(socketFileChanged())); ++ m_initialized = true; ++} ++ ++void FcitxQtConnectionPrivate::finalize() { ++ m_serviceWatcher->removeWatchedService(m_serviceName); ++ m_watcher->removePaths(m_watcher->files()); ++ m_watcher->removePaths(m_watcher->directories()); ++ m_watcher->disconnect(SIGNAL(fileChanged(QString))); ++ m_watcher->disconnect(SIGNAL(directoryChanged(QString))); ++ m_initialized = false; ++} ++ ++void FcitxQtConnectionPrivate::socketFileChanged() { ++ QFileInfo info(socketFile()); ++ if (info.exists()) { ++ if (m_watcher->files().indexOf(info.filePath()) == -1) ++ m_watcher->addPath(info.filePath()); ++ } ++ ++ QString addr = address(); ++ if (addr.isNull()) ++ return; ++ ++ cleanUp(); ++ createConnection(); ++} ++ ++QByteArray FcitxQtConnectionPrivate::localMachineId() ++{ ++#if QT_VERSION >= QT_VERSION_CHECK(4, 8, 0) ++ return QDBusConnection::localMachineId(); ++#else ++ QFile file1("/var/lib/dbus/machine-id"); ++ QFile file2("/etc/machine-id"); ++ QFile* fileToRead = NULL; ++ if (file1.open(QIODevice::ReadOnly)) { ++ fileToRead = &file1; ++ } ++ else if (file2.open(QIODevice::ReadOnly)) { ++ fileToRead = &file2; ++ } ++ if (fileToRead) { ++ QByteArray result = fileToRead->readLine(1024); ++ fileToRead->close(); ++ result = result.trimmed(); ++ if (!result.isEmpty()) ++ return result; ++ } ++ return "machine-id"; ++#endif ++} ++ ++int FcitxQtConnectionPrivate::displayNumber() { ++ if (m_displayNumber < 0) { ++ QByteArray displayNumber("0"); ++ QByteArray display(qgetenv("DISPLAY")); ++ int pos = display.indexOf(':'); ++ ++ if (pos >= 0) { ++ ++pos; ++ int pos2 = display.indexOf('.', pos); ++ if (pos2 > 0) { ++ displayNumber = display.mid(pos, pos2 - pos); ++ } else { ++ displayNumber = display.mid(pos); ++ } ++ } ++ ++ bool ok; ++ int d = displayNumber.toInt(&ok); ++ if (ok) { ++ m_displayNumber = d; ++ } else { ++ m_displayNumber = 0; ++ } ++ } ++ ++ return m_displayNumber; ++} ++ ++const QString& FcitxQtConnectionPrivate::socketFile() ++{ ++ if (!m_socketFile.isEmpty()) ++ return m_socketFile; ++ ++ QString filename = QString("%1-%2").arg(QString::fromLatin1(QDBusConnection::localMachineId())).arg(displayNumber()); ++ ++ QString home = QString::fromLocal8Bit(qgetenv("XDG_CONFIG_HOME")); ++ if (home.isEmpty()) { ++ home = QDir::homePath().append(QLatin1Literal("/.config")); ++ } ++ m_socketFile = QString("%1/fcitx/dbus/%2").arg(home).arg(filename); ++ ++ return m_socketFile; ++} ++ ++QString FcitxQtConnectionPrivate::address() ++{ ++ QString addr; ++ QByteArray addrVar = qgetenv("FCITX_DBUS_ADDRESS"); ++ if (!addrVar.isNull()) ++ return QString::fromLocal8Bit(addrVar); ++ ++ QFile file(socketFile()); ++ if (!file.open(QIODevice::ReadOnly)) ++ return QString(); ++ ++ const int BUFSIZE = 1024; ++ ++ char buffer[BUFSIZE]; ++ size_t sz = file.read(buffer, BUFSIZE); ++ file.close(); ++ if (sz == 0) ++ return QString(); ++ char* p = buffer; ++ while(*p) ++ p++; ++ size_t addrlen = p - buffer; ++ if (sz != addrlen + 2 * sizeof(pid_t) + 1) ++ return QString(); ++ ++ /* skip '\0' */ ++ p++; ++ pid_t *ppid = (pid_t*) p; ++ pid_t daemonpid = ppid[0]; ++ pid_t fcitxpid = ppid[1]; ++ ++ if (!_pid_exists(daemonpid) ++ || !_pid_exists(fcitxpid)) ++ return QString(); ++ ++ addr = QLatin1String(buffer); ++ ++ return addr; ++} ++ ++void FcitxQtConnectionPrivate::createConnection() { ++ if (m_connectedOnce && !m_autoReconnect) { ++ return; ++ } ++ ++ m_serviceWatcher->disconnect(SIGNAL(serviceOwnerChanged(QString,QString,QString))); ++ QString addr = address(); ++ if (!addr.isNull()) { ++ QDBusConnection connection(QDBusConnection::connectToBus(addr, "fcitx")); ++ if (connection.isConnected()) { ++ // qDebug() << "create private"; ++ m_connection = new QDBusConnection(connection); ++ } ++ else ++ QDBusConnection::disconnectFromBus("fcitx"); ++ } ++ ++ if (!m_connection) { ++ QDBusConnection* connection = new QDBusConnection(QDBusConnection::sessionBus()); ++ connect(m_serviceWatcher, SIGNAL(serviceOwnerChanged(QString,QString,QString)), this, SLOT(imChanged(QString,QString,QString))); ++ QDBusReply registered = connection->interface()->isServiceRegistered(m_serviceName); ++ if (!registered.isValid() || !registered.value()) { ++ delete connection; ++ } ++ else { ++ m_connection = connection; ++ } ++ } ++ ++ Q_Q(FcitxQtConnection); ++ if (m_connection) { ++ ++ m_connection->connect ("org.freedesktop.DBus.Local", ++ "/org/freedesktop/DBus/Local", ++ "org.freedesktop.DBus.Local", ++ "Disconnected", ++ this, ++ SLOT (dbusDisconnected ())); ++ m_connectedOnce = true; ++ emit q->connected(); ++ } ++} ++ ++ ++void FcitxQtConnectionPrivate::dbusDisconnected() ++{ ++ cleanUp(); ++ ++ createConnection(); ++} ++ ++void FcitxQtConnectionPrivate::imChanged(const QString& service, const QString& oldowner, const QString& newowner) ++{ ++ if (service == m_serviceName) { ++ /* old die */ ++ if (oldowner.length() > 0 || newowner.length() > 0) ++ cleanUp(); ++ ++ /* new rise */ ++ if (newowner.length() > 0) { ++ QTimer::singleShot(100, this, SLOT(newServiceAppear())); ++ } ++ } ++} ++ ++void FcitxQtConnectionPrivate::cleanUp() ++{ ++ Q_Q(FcitxQtConnection); ++ bool doemit = false; ++ QDBusConnection::disconnectFromBus("fcitx"); ++ if (m_connection) { ++ delete m_connection; ++ m_connection = 0; ++ doemit = true; ++ } ++ ++ if (!m_autoReconnect && m_connectedOnce) ++ finalize(); ++ ++ /* we want m_connection and finalize being called before the signal ++ * thus isConnected will return false in slot ++ * and startConnection can be called in slot ++ */ ++ if (doemit) ++ emit q->disconnected(); ++} ++ ++bool FcitxQtConnectionPrivate::isConnected() ++{ ++ return m_connection && m_connection->isConnected(); ++} ++ ++void FcitxQtConnectionPrivate::newServiceAppear() { ++ if (!isConnected()) { ++ cleanUp(); ++ ++ createConnection(); ++ } ++} +diff --git a/src/plugins/platforminputcontexts/fcitx/fcitxqtconnection.h b/src/plugins/platforminputcontexts/fcitx/fcitxqtconnection.h +new file mode 100644 +index 0000000..efe255f +--- /dev/null ++++ b/src/plugins/platforminputcontexts/fcitx/fcitxqtconnection.h +@@ -0,0 +1,111 @@ ++/*************************************************************************** ++ * Copyright (C) 2012~2012 by CSSlayer * ++ * * ++ * This program is free software; you can redistribute it and/or modify * ++ * it under the terms of the GNU General Public License as published by * ++ * the Free Software Foundation; either version 2 of the License, or * ++ * (at your option) any later version. * ++ * * ++ * This program is distributed in the hope that it will be useful, * ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of * ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * ++ * GNU General Public License for more details. * ++ * * ++ * You should have received a copy of the GNU General Public License * ++ * along with this program; if not, write to the * ++ * Free Software Foundation, Inc., * ++ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ++ ***************************************************************************/ ++ ++#ifndef FCITXQTCONNECTION_H ++#define FCITXQTCONNECTION_H ++ ++#include "fcitxqtdbusaddons_export.h" ++ ++#include ++ ++class QDBusConnection; ++ ++class FcitxQtConnectionPrivate; ++ ++ ++/** ++ * dbus connection to fcitx ++ **/ ++class FCITXQTDBUSADDONS_EXPORT FcitxQtConnection : public QObject { ++ Q_OBJECT ++ Q_PROPERTY(bool autoReconnect READ autoReconnect WRITE setAutoReconnect) ++ Q_PROPERTY(bool connected READ isConnected) ++ Q_PROPERTY(QDBusConnection* connection READ connection) ++ Q_PROPERTY(QString serviceName READ serviceName) ++public: ++ /** ++ * create a new connection ++ * ++ * @param parent ++ **/ ++ explicit FcitxQtConnection(QObject* parent = 0); ++ ++ /** ++ * destroy the connection ++ **/ ++ virtual ~FcitxQtConnection(); ++ ++ /** ++ * the connection will not start to work until you call this function ++ * you may want to connect to the signal before you call this function ++ **/ ++ void startConnection(); ++ void endConnection(); ++ /** ++ * automatically reconnect if fcitx disappeared ++ * ++ * @param a ... ++ * @return void ++ **/ ++ void setAutoReconnect(bool a); ++ ++ /** ++ * check this connection is doing automatical reconnect or not ++ * ++ * default value is true ++ **/ ++ bool autoReconnect(); ++ ++ /** ++ * return the current dbus connection to fcitx, notice, the object return ++ * by this function might be deteled if fcitx disappear, or might return 0 ++ * if fcitx is not running ++ * ++ * @return QDBusConnection* ++ **/ ++ QDBusConnection* connection(); ++ /** ++ * current fcitx dbus service name, can be used for create DBus proxy ++ * ++ * @return service name ++ **/ ++ const QString& serviceName(); ++ /** ++ * check its connected or not ++ **/ ++ bool isConnected(); ++ ++Q_SIGNALS: ++ /** ++ * this signal will be emitted upon fcitx appears ++ **/ ++ void connected(); ++ /** ++ * this signal will be emitted upon fcitx disappears ++ * ++ * it will come with connected in pair ++ **/ ++ void disconnected(); ++ ++private: ++ FcitxQtConnectionPrivate * const d_ptr; ++ Q_DECLARE_PRIVATE(FcitxQtConnection); ++}; ++ ++#endif // FCITXCONNECTION_H +diff --git a/src/plugins/platforminputcontexts/fcitx/fcitxqtconnection_p.h b/src/plugins/platforminputcontexts/fcitx/fcitxqtconnection_p.h +new file mode 100644 +index 0000000..dda726a +--- /dev/null ++++ b/src/plugins/platforminputcontexts/fcitx/fcitxqtconnection_p.h +@@ -0,0 +1,68 @@ ++/*************************************************************************** ++ * Copyright (C) 2012~2012 by CSSlayer * ++ * * ++ * This program is free software; you can redistribute it and/or modify * ++ * it under the terms of the GNU General Public License as published by * ++ * the Free Software Foundation; either version 2 of the License, or * ++ * (at your option) any later version. * ++ * * ++ * This program is distributed in the hope that it will be useful, * ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of * ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * ++ * GNU General Public License for more details. * ++ * * ++ * You should have received a copy of the GNU General Public License * ++ * along with this program; if not, write to the * ++ * Free Software Foundation, Inc., * ++ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ++ ***************************************************************************/ ++ ++#ifndef FCITXQTCONNECTION_P_H ++#define FCITXQTCONNECTION_P_H ++ ++#include "fcitxqtconnection.h" ++#include ++#include ++ ++class QDBusConnection; ++class QDBusServiceWatcher; ++ ++class FcitxQtConnectionPrivate : public QObject { ++ Q_OBJECT ++public: ++ FcitxQtConnectionPrivate(FcitxQtConnection* conn); ++ virtual ~FcitxQtConnectionPrivate(); ++ FcitxQtConnection * const q_ptr; ++ Q_DECLARE_PUBLIC(FcitxQtConnection); ++ ++private Q_SLOTS: ++ void imChanged(const QString& service, const QString& oldowner, const QString& newowner); ++ void dbusDisconnected(); ++ void cleanUp(); ++ void newServiceAppear(); ++ void socketFileChanged(); ++ ++private: ++ bool isConnected(); ++ ++ static QByteArray localMachineId(); ++ const QString& socketFile(); ++ void createConnection(); ++ QString address(); ++ int displayNumber(); ++ void initialize(); ++ void finalize(); ++ ++ int m_displayNumber; ++ QString m_serviceName; ++ QDBusConnection* m_connection; ++ QDBusServiceWatcher* m_serviceWatcher; ++ QFileSystemWatcher* m_watcher; ++ QString m_socketFile; ++ bool m_autoReconnect; ++ bool m_connectedOnce; ++ bool m_initialized; ++}; ++ ++ ++#endif // FCITXCONNECTION_P_H +diff --git a/src/plugins/platforminputcontexts/fcitx/fcitxqtdbusaddons_export.h b/src/plugins/platforminputcontexts/fcitx/fcitxqtdbusaddons_export.h +new file mode 100644 +index 0000000..3fabfb9 +--- /dev/null ++++ b/src/plugins/platforminputcontexts/fcitx/fcitxqtdbusaddons_export.h +@@ -0,0 +1,41 @@ ++ ++#ifndef FCITXQTDBUSADDONS_EXPORT_H ++#define FCITXQTDBUSADDONS_EXPORT_H ++ ++#ifdef FCITXQTDBUSADDONS_STATIC_DEFINE ++# define FCITXQTDBUSADDONS_EXPORT ++# define FCITXQTDBUSADDONS_NO_EXPORT ++#else ++# ifndef FCITXQTDBUSADDONS_EXPORT ++# ifdef FcitxQt5DBusAddons_EXPORTS ++ /* We are building this library */ ++# define FCITXQTDBUSADDONS_EXPORT __attribute__((visibility("default"))) ++# else ++ /* We are using this library */ ++# define FCITXQTDBUSADDONS_EXPORT __attribute__((visibility("default"))) ++# endif ++# endif ++ ++# ifndef FCITXQTDBUSADDONS_NO_EXPORT ++# define FCITXQTDBUSADDONS_NO_EXPORT __attribute__((visibility("hidden"))) ++# endif ++#endif ++ ++#ifndef FCITXQTDBUSADDONS_DEPRECATED ++# define FCITXQTDBUSADDONS_DEPRECATED __attribute__ ((__deprecated__)) ++#endif ++ ++#ifndef FCITXQTDBUSADDONS_DEPRECATED_EXPORT ++# define FCITXQTDBUSADDONS_DEPRECATED_EXPORT FCITXQTDBUSADDONS_EXPORT FCITXQTDBUSADDONS_DEPRECATED ++#endif ++ ++#ifndef FCITXQTDBUSADDONS_DEPRECATED_NO_EXPORT ++# define FCITXQTDBUSADDONS_DEPRECATED_NO_EXPORT FCITXQTDBUSADDONS_NO_EXPORT FCITXQTDBUSADDONS_DEPRECATED ++#endif ++ ++#define DEFINE_NO_DEPRECATED 0 ++#if DEFINE_NO_DEPRECATED ++# define FCITXQTDBUSADDONS_NO_DEPRECATED ++#endif ++ ++#endif +diff --git a/src/plugins/platforminputcontexts/fcitx/fcitxqtdbusaddons_version.h b/src/plugins/platforminputcontexts/fcitx/fcitxqtdbusaddons_version.h +new file mode 100644 +index 0000000..7b6dbf4 +--- /dev/null ++++ b/src/plugins/platforminputcontexts/fcitx/fcitxqtdbusaddons_version.h +@@ -0,0 +1,11 @@ ++ ++#ifndef FCITXQT5DBUSADDONS_VERSION_H ++#define FCITXQT5DBUSADDONS_VERSION_H ++ ++#define FCITXQT5DBUSADDONS_VERSION_STRING "1.0.0" ++#define FCITXQT5DBUSADDONS_VERSION_MAJOR 1 ++#define FCITXQT5DBUSADDONS_VERSION_MINOR 0 ++#define FCITXQT5DBUSADDONS_VERSION_PATCH 0 ++#define FCITXQT5DBUSADDONS_VERSION ((1<<16)|(0<<8)|(0)) ++ ++#endif +diff --git a/src/plugins/platforminputcontexts/fcitx/fcitxqtformattedpreedit.cpp b/src/plugins/platforminputcontexts/fcitx/fcitxqtformattedpreedit.cpp +new file mode 100644 +index 0000000..c6af845 +--- /dev/null ++++ b/src/plugins/platforminputcontexts/fcitx/fcitxqtformattedpreedit.cpp +@@ -0,0 +1,78 @@ ++/*************************************************************************** ++ * Copyright (C) 2012~2012 by CSSlayer * ++ * * ++ * This program is free software; you can redistribute it and/or modify * ++ * it under the terms of the GNU General Public License as published by * ++ * the Free Software Foundation; either version 2 of the License, or * ++ * (at your option) any later version. * ++ * * ++ * This program is distributed in the hope that it will be useful, * ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of * ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * ++ * GNU General Public License for more details. * ++ * * ++ * You should have received a copy of the GNU General Public License * ++ * along with this program; if not, write to the * ++ * Free Software Foundation, Inc., * ++ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ++ ***************************************************************************/ ++ ++#include ++ ++#include "fcitxqtformattedpreedit.h" ++ ++void FcitxQtFormattedPreedit::registerMetaType() ++{ ++ qRegisterMetaType("FcitxQtFormattedPreedit"); ++ qDBusRegisterMetaType(); ++ qRegisterMetaType("FcitxQtFormattedPreeditList"); ++ qDBusRegisterMetaType(); ++} ++ ++qint32 FcitxQtFormattedPreedit::format() const ++{ ++ return m_format; ++} ++ ++const QString& FcitxQtFormattedPreedit::string() const ++{ ++ return m_string; ++} ++ ++void FcitxQtFormattedPreedit::setFormat(qint32 format) ++{ ++ m_format = format; ++} ++ ++void FcitxQtFormattedPreedit::setString(const QString& str) ++{ ++ m_string = str; ++} ++ ++bool FcitxQtFormattedPreedit::operator==(const FcitxQtFormattedPreedit& preedit) const ++{ ++ return (preedit.m_format == m_format) && (preedit.m_string == m_string); ++} ++ ++FCITXQTDBUSADDONS_EXPORT ++QDBusArgument& operator<<(QDBusArgument& argument, const FcitxQtFormattedPreedit& preedit) ++{ ++ argument.beginStructure(); ++ argument << preedit.string(); ++ argument << preedit.format(); ++ argument.endStructure(); ++ return argument; ++} ++ ++FCITXQTDBUSADDONS_EXPORT ++const QDBusArgument& operator>>(const QDBusArgument& argument, FcitxQtFormattedPreedit& preedit) ++{ ++ QString str; ++ qint32 format; ++ argument.beginStructure(); ++ argument >> str >> format; ++ argument.endStructure(); ++ preedit.setString(str); ++ preedit.setFormat(format); ++ return argument; ++} +diff --git a/src/plugins/platforminputcontexts/fcitx/fcitxqtformattedpreedit.h b/src/plugins/platforminputcontexts/fcitx/fcitxqtformattedpreedit.h +new file mode 100644 +index 0000000..a00355c +--- /dev/null ++++ b/src/plugins/platforminputcontexts/fcitx/fcitxqtformattedpreedit.h +@@ -0,0 +1,51 @@ ++/*************************************************************************** ++ * Copyright (C) 2012~2012 by CSSlayer * ++ * * ++ * This program is free software; you can redistribute it and/or modify * ++ * it under the terms of the GNU General Public License as published by * ++ * the Free Software Foundation; either version 2 of the License, or * ++ * (at your option) any later version. * ++ * * ++ * This program is distributed in the hope that it will be useful, * ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of * ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * ++ * GNU General Public License for more details. * ++ * * ++ * You should have received a copy of the GNU General Public License * ++ * along with this program; if not, write to the * ++ * Free Software Foundation, Inc., * ++ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ++ ***************************************************************************/ ++ ++#ifndef FCITX_QT_FORMATTED_PREEDIT_H ++#define FCITX_QT_FORMATTED_PREEDIT_H ++ ++#include "fcitxqtdbusaddons_export.h" ++ ++#include ++#include ++ ++class FCITXQTDBUSADDONS_EXPORT FcitxQtFormattedPreedit { ++public: ++ const QString& string() const; ++ qint32 format() const; ++ void setString(const QString& str); ++ void setFormat(qint32 format); ++ ++ static void registerMetaType(); ++ ++ bool operator ==(const FcitxQtFormattedPreedit& preedit) const; ++private: ++ QString m_string; ++ qint32 m_format; ++}; ++ ++typedef QList FcitxQtFormattedPreeditList; ++ ++QDBusArgument& operator<<(QDBusArgument& argument, const FcitxQtFormattedPreedit& im); ++const QDBusArgument& operator>>(const QDBusArgument& argument, FcitxQtFormattedPreedit& im); ++ ++Q_DECLARE_METATYPE(FcitxQtFormattedPreedit) ++Q_DECLARE_METATYPE(FcitxQtFormattedPreeditList) ++ ++#endif +diff --git a/src/plugins/platforminputcontexts/fcitx/fcitxqtinputcontextproxy.cpp b/src/plugins/platforminputcontexts/fcitx/fcitxqtinputcontextproxy.cpp +new file mode 100644 +index 0000000..ef479b2 +--- /dev/null ++++ b/src/plugins/platforminputcontexts/fcitx/fcitxqtinputcontextproxy.cpp +@@ -0,0 +1,25 @@ ++/* ++ * This file was generated by qdbusxml2cpp version 0.8 ++ * Command line was: qdbusxml2cpp -N -p fcitxqtinputcontextproxy -c FcitxQtInputContextProxy interfaces/org.fcitx.Fcitx.InputContext.xml -i fcitxqtformattedpreedit.h -i fcitxqt_export.h ++ * ++ * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). ++ * ++ * This is an auto-generated file. ++ * This file may have been hand-edited. Look for HAND-EDIT comments ++ * before re-generating it. ++ */ ++ ++#include "fcitxqtinputcontextproxy.h" ++ ++/* ++ * Implementation of interface class FcitxQtInputContextProxy ++ */ ++ ++FcitxQtInputContextProxy::FcitxQtInputContextProxy(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent) ++ : QDBusAbstractInterface(service, path, staticInterfaceName(), connection, parent) ++{ ++} ++ ++FcitxQtInputContextProxy::~FcitxQtInputContextProxy() ++{ ++} +diff --git a/src/plugins/platforminputcontexts/fcitx/fcitxqtinputcontextproxy.h b/src/plugins/platforminputcontexts/fcitx/fcitxqtinputcontextproxy.h +new file mode 100644 +index 0000000..19874dc +--- /dev/null ++++ b/src/plugins/platforminputcontexts/fcitx/fcitxqtinputcontextproxy.h +@@ -0,0 +1,136 @@ ++/* ++ * This file was generated by qdbusxml2cpp version 0.8 ++ * Command line was: qdbusxml2cpp -N -p fcitxqtinputcontextproxy -c FcitxQtInputContextProxy interfaces/org.fcitx.Fcitx.InputContext.xml -i fcitxqtformattedpreedit.h -i fcitxqt_export.h ++ * ++ * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). ++ * ++ * This is an auto-generated file. ++ * Do not edit! All changes made to it will be lost. ++ */ ++ ++#ifndef FCITXQTINPUTCONTEXTPROXY_H_1409252990 ++#define FCITXQTINPUTCONTEXTPROXY_H_1409252990 ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include "fcitxqtformattedpreedit.h" ++#include "fcitxqtdbusaddons_export.h" ++ ++/* ++ * Proxy class for interface org.fcitx.Fcitx.InputContext ++ */ ++class FCITXQTDBUSADDONS_EXPORT FcitxQtInputContextProxy: public QDBusAbstractInterface ++{ ++ Q_OBJECT ++public: ++ static inline const char *staticInterfaceName() ++ { return "org.fcitx.Fcitx.InputContext"; } ++ ++public: ++ FcitxQtInputContextProxy(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0); ++ ++ ~FcitxQtInputContextProxy(); ++ ++public Q_SLOTS: // METHODS ++ inline QDBusPendingReply<> CloseIC() ++ { ++ QList argumentList; ++ return asyncCallWithArgumentList(QLatin1String("CloseIC"), argumentList); ++ } ++ ++ inline QDBusPendingReply<> DestroyIC() ++ { ++ QList argumentList; ++ return asyncCallWithArgumentList(QLatin1String("DestroyIC"), argumentList); ++ } ++ ++ inline QDBusPendingReply<> EnableIC() ++ { ++ QList argumentList; ++ return asyncCallWithArgumentList(QLatin1String("EnableIC"), argumentList); ++ } ++ ++ inline QDBusPendingReply<> FocusIn() ++ { ++ QList argumentList; ++ return asyncCallWithArgumentList(QLatin1String("FocusIn"), argumentList); ++ } ++ ++ inline QDBusPendingReply<> FocusOut() ++ { ++ QList argumentList; ++ return asyncCallWithArgumentList(QLatin1String("FocusOut"), argumentList); ++ } ++ ++ inline QDBusPendingReply<> MouseEvent(int x) ++ { ++ QList argumentList; ++ argumentList << QVariant::fromValue(x); ++ return asyncCallWithArgumentList(QLatin1String("MouseEvent"), argumentList); ++ } ++ ++ inline QDBusPendingReply ProcessKeyEvent(uint keyval, uint keycode, uint state, int type, uint time) ++ { ++ QList argumentList; ++ argumentList << QVariant::fromValue(keyval) << QVariant::fromValue(keycode) << QVariant::fromValue(state) << QVariant::fromValue(type) << QVariant::fromValue(time); ++ return asyncCallWithArgumentList(QLatin1String("ProcessKeyEvent"), argumentList); ++ } ++ ++ inline QDBusPendingReply<> Reset() ++ { ++ QList argumentList; ++ return asyncCallWithArgumentList(QLatin1String("Reset"), argumentList); ++ } ++ ++ inline QDBusPendingReply<> SetCapacity(uint caps) ++ { ++ QList argumentList; ++ argumentList << QVariant::fromValue(caps); ++ return asyncCallWithArgumentList(QLatin1String("SetCapacity"), argumentList); ++ } ++ ++ inline QDBusPendingReply<> SetCursorLocation(int x, int y) ++ { ++ QList argumentList; ++ argumentList << QVariant::fromValue(x) << QVariant::fromValue(y); ++ return asyncCallWithArgumentList(QLatin1String("SetCursorLocation"), argumentList); ++ } ++ ++ inline QDBusPendingReply<> SetCursorRect(int x, int y, int w, int h) ++ { ++ QList argumentList; ++ argumentList << QVariant::fromValue(x) << QVariant::fromValue(y) << QVariant::fromValue(w) << QVariant::fromValue(h); ++ return asyncCallWithArgumentList(QLatin1String("SetCursorRect"), argumentList); ++ } ++ ++ inline QDBusPendingReply<> SetSurroundingText(const QString &text, uint cursor, uint anchor) ++ { ++ QList argumentList; ++ argumentList << QVariant::fromValue(text) << QVariant::fromValue(cursor) << QVariant::fromValue(anchor); ++ return asyncCallWithArgumentList(QLatin1String("SetSurroundingText"), argumentList); ++ } ++ ++ inline QDBusPendingReply<> SetSurroundingTextPosition(uint cursor, uint anchor) ++ { ++ QList argumentList; ++ argumentList << QVariant::fromValue(cursor) << QVariant::fromValue(anchor); ++ return asyncCallWithArgumentList(QLatin1String("SetSurroundingTextPosition"), argumentList); ++ } ++ ++Q_SIGNALS: // SIGNALS ++ void CloseIM(); ++ void CommitString(const QString &str); ++ void DeleteSurroundingText(int offset, uint nchar); ++ void EnableIM(); ++ void ForwardKey(uint keyval, uint state, int type); ++ void UpdateClientSideUI(const QString &auxup, const QString &auxdown, const QString &preedit, const QString &candidateword, const QString &imname, int cursorpos); ++ void UpdateFormattedPreedit(FcitxQtFormattedPreeditList str, int cursorpos); ++}; ++ ++#endif +diff --git a/src/plugins/platforminputcontexts/fcitx/fcitxqtinputmethoditem.cpp b/src/plugins/platforminputcontexts/fcitx/fcitxqtinputmethoditem.cpp +new file mode 100644 +index 0000000..d28ed11 +--- /dev/null ++++ b/src/plugins/platforminputcontexts/fcitx/fcitxqtinputmethoditem.cpp +@@ -0,0 +1,95 @@ ++/*************************************************************************** ++ * Copyright (C) 2011~2012 by CSSlayer * ++ * * ++ * This program is free software; you can redistribute it and/or modify * ++ * it under the terms of the GNU General Public License as published by * ++ * the Free Software Foundation; either version 2 of the License, or * ++ * (at your option) any later version. * ++ * * ++ * This program is distributed in the hope that it will be useful, * ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of * ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * ++ * GNU General Public License for more details. * ++ * * ++ * You should have received a copy of the GNU General Public License * ++ * along with this program; if not, write to the * ++ * Free Software Foundation, Inc., * ++ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ++ ***************************************************************************/ ++ ++// Qt ++#include ++#include ++ ++// self ++#include "fcitxqtinputmethoditem.h" ++ ++bool FcitxQtInputMethodItem::enabled() const ++{ ++ return m_enabled; ++} ++const QString& FcitxQtInputMethodItem::langCode() const ++{ ++ return m_langCode; ++} ++const QString& FcitxQtInputMethodItem::name() const ++{ ++ return m_name; ++} ++const QString& FcitxQtInputMethodItem::uniqueName() const ++{ ++ return m_uniqueName; ++} ++void FcitxQtInputMethodItem::setEnabled(bool enable) ++{ ++ m_enabled = enable; ++} ++void FcitxQtInputMethodItem::setLangCode(const QString& lang) ++{ ++ m_langCode = lang; ++} ++void FcitxQtInputMethodItem::setName(const QString& name) ++{ ++ m_name = name; ++} ++void FcitxQtInputMethodItem::setUniqueName(const QString& name) ++{ ++ m_uniqueName = name; ++} ++ ++void FcitxQtInputMethodItem::registerMetaType() ++{ ++ qRegisterMetaType("FcitxQtInputMethodItem"); ++ qDBusRegisterMetaType(); ++ qRegisterMetaType("FcitxQtInputMethodItemList"); ++ qDBusRegisterMetaType(); ++} ++ ++FCITXQTDBUSADDONS_EXPORT ++QDBusArgument& operator<<(QDBusArgument& argument, const FcitxQtInputMethodItem& im) ++{ ++ argument.beginStructure(); ++ argument << im.name(); ++ argument << im.uniqueName(); ++ argument << im.langCode(); ++ argument << im.enabled(); ++ argument.endStructure(); ++ return argument; ++} ++ ++FCITXQTDBUSADDONS_EXPORT ++const QDBusArgument& operator>>(const QDBusArgument& argument, FcitxQtInputMethodItem& im) ++{ ++ QString name; ++ QString uniqueName; ++ QString langCode; ++ bool enabled; ++ argument.beginStructure(); ++ argument >> name >> uniqueName >> langCode >> enabled; ++ argument.endStructure(); ++ im.setName(name); ++ im.setUniqueName(uniqueName); ++ im.setLangCode(langCode); ++ im.setEnabled(enabled); ++ return argument; ++} +diff --git a/src/plugins/platforminputcontexts/fcitx/fcitxqtinputmethoditem.h b/src/plugins/platforminputcontexts/fcitx/fcitxqtinputmethoditem.h +new file mode 100644 +index 0000000..6b8c780 +--- /dev/null ++++ b/src/plugins/platforminputcontexts/fcitx/fcitxqtinputmethoditem.h +@@ -0,0 +1,64 @@ ++/*************************************************************************** ++ * Copyright (C) 2011~2012 by CSSlayer * ++ * * ++ * This program is free software; you can redistribute it and/or modify * ++ * it under the terms of the GNU General Public License as published by * ++ * the Free Software Foundation; either version 2 of the License, or * ++ * (at your option) any later version. * ++ * * ++ * This program is distributed in the hope that it will be useful, * ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of * ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * ++ * GNU General Public License for more details. * ++ * * ++ * You should have received a copy of the GNU General Public License * ++ * along with this program; if not, write to the * ++ * Free Software Foundation, Inc., * ++ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ++ ***************************************************************************/ ++ ++#ifndef FCITX_QT_INPUT_METHOD_ITEM_H ++#define FCITX_QT_INPUT_METHOD_ITEM_H ++ ++#include "fcitxqtdbusaddons_export.h" ++ ++// Qt ++#include ++#include ++#include ++ ++class FCITXQTDBUSADDONS_EXPORT FcitxQtInputMethodItem ++{ ++public: ++ const QString& name() const; ++ const QString& uniqueName() const; ++ const QString& langCode() const; ++ bool enabled() const; ++ ++ void setName(const QString& name); ++ void setUniqueName(const QString& name); ++ void setLangCode(const QString& name); ++ void setEnabled(bool name); ++ static void registerMetaType(); ++ ++ inline bool operator < (const FcitxQtInputMethodItem& im) const { ++ if (m_enabled == true && im.m_enabled == false) ++ return true; ++ return false; ++ } ++private: ++ QString m_name; ++ QString m_uniqueName; ++ QString m_langCode; ++ bool m_enabled; ++}; ++ ++typedef QList FcitxQtInputMethodItemList; ++ ++QDBusArgument& operator<<(QDBusArgument& argument, const FcitxQtInputMethodItem& im); ++const QDBusArgument& operator>>(const QDBusArgument& argument, FcitxQtInputMethodItem& im); ++ ++Q_DECLARE_METATYPE(FcitxQtInputMethodItem) ++Q_DECLARE_METATYPE(FcitxQtInputMethodItemList) ++ ++#endif +diff --git a/src/plugins/platforminputcontexts/fcitx/fcitxqtinputmethodproxy.cpp b/src/plugins/platforminputcontexts/fcitx/fcitxqtinputmethodproxy.cpp +new file mode 100644 +index 0000000..cb7e4cf +--- /dev/null ++++ b/src/plugins/platforminputcontexts/fcitx/fcitxqtinputmethodproxy.cpp +@@ -0,0 +1,25 @@ ++/* ++ * This file was generated by qdbusxml2cpp version 0.8 ++ * Command line was: qdbusxml2cpp -N -p fcitxqtinputmethodproxy -c FcitxQtInputMethodProxy interfaces/org.fcitx.Fcitx.InputMethod.xml -i fcitxqtinputmethoditem.h -i fcitxqt_export.h ++ * ++ * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). ++ * ++ * This is an auto-generated file. ++ * This file may have been hand-edited. Look for HAND-EDIT comments ++ * before re-generating it. ++ */ ++ ++#include "fcitxqtinputmethodproxy.h" ++ ++/* ++ * Implementation of interface class FcitxQtInputMethodProxy ++ */ ++ ++FcitxQtInputMethodProxy::FcitxQtInputMethodProxy(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent) ++ : QDBusAbstractInterface(service, path, staticInterfaceName(), connection, parent) ++{ ++} ++ ++FcitxQtInputMethodProxy::~FcitxQtInputMethodProxy() ++{ ++} +diff --git a/src/plugins/platforminputcontexts/fcitx/fcitxqtinputmethodproxy.h b/src/plugins/platforminputcontexts/fcitx/fcitxqtinputmethodproxy.h +new file mode 100644 +index 0000000..7aa37e2 +--- /dev/null ++++ b/src/plugins/platforminputcontexts/fcitx/fcitxqtinputmethodproxy.h +@@ -0,0 +1,217 @@ ++/* ++ * This file was generated by qdbusxml2cpp version 0.8 ++ * Command line was: qdbusxml2cpp -N -p fcitxqtinputmethodproxy -c FcitxQtInputMethodProxy interfaces/org.fcitx.Fcitx.InputMethod.xml -i fcitxqtinputmethoditem.h -i fcitxqt_export.h ++ * ++ * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). ++ * ++ * This is an auto-generated file. ++ * Do not edit! All changes made to it will be lost. ++ */ ++ ++#ifndef FCITXQTINPUTMETHODPROXY_H_1409252990 ++#define FCITXQTINPUTMETHODPROXY_H_1409252990 ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include "fcitxqtinputmethoditem.h" ++#include "fcitxqtdbusaddons_export.h" ++ ++/* ++ * Proxy class for interface org.fcitx.Fcitx.InputMethod ++ */ ++class FCITXQTDBUSADDONS_EXPORT FcitxQtInputMethodProxy: public QDBusAbstractInterface ++{ ++ Q_OBJECT ++public: ++ static inline const char *staticInterfaceName() ++ { return "org.fcitx.Fcitx.InputMethod"; } ++ ++public: ++ FcitxQtInputMethodProxy(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0); ++ ++ ~FcitxQtInputMethodProxy(); ++ ++ Q_PROPERTY(QString CurrentIM READ currentIM WRITE setCurrentIM) ++ inline QString currentIM() const ++ { return qvariant_cast< QString >(property("CurrentIM")); } ++ inline void setCurrentIM(const QString &value) ++ { setProperty("CurrentIM", QVariant::fromValue(value)); } ++ ++ Q_PROPERTY(FcitxQtInputMethodItemList IMList READ iMList WRITE setIMList) ++ inline FcitxQtInputMethodItemList iMList() const ++ { return qvariant_cast< FcitxQtInputMethodItemList >(property("IMList")); } ++ inline void setIMList(FcitxQtInputMethodItemList value) ++ { setProperty("IMList", QVariant::fromValue(value)); } ++ ++public Q_SLOTS: // METHODS ++ inline QDBusPendingReply<> ActivateIM() ++ { ++ QList argumentList; ++ return asyncCallWithArgumentList(QLatin1String("ActivateIM"), argumentList); ++ } ++ ++ inline QDBusPendingReply<> Configure() ++ { ++ QList argumentList; ++ return asyncCallWithArgumentList(QLatin1String("Configure"), argumentList); ++ } ++ ++ inline QDBusPendingReply<> ConfigureAddon(const QString &addon) ++ { ++ QList argumentList; ++ argumentList << QVariant::fromValue(addon); ++ return asyncCallWithArgumentList(QLatin1String("ConfigureAddon"), argumentList); ++ } ++ ++ inline QDBusPendingReply<> ConfigureIM(const QString &im) ++ { ++ QList argumentList; ++ argumentList << QVariant::fromValue(im); ++ return asyncCallWithArgumentList(QLatin1String("ConfigureIM"), argumentList); ++ } ++ ++ inline QDBusPendingReply CreateIC() ++ { ++ QList argumentList; ++ return asyncCallWithArgumentList(QLatin1String("CreateIC"), argumentList); ++ } ++ inline QDBusReply CreateIC(uint &keyval1, uint &state1, uint &keyval2, uint &state2) ++ { ++ QList argumentList; ++ QDBusMessage reply = callWithArgumentList(QDBus::Block, QLatin1String("CreateIC"), argumentList); ++ if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 5) { ++ keyval1 = qdbus_cast(reply.arguments().at(1)); ++ state1 = qdbus_cast(reply.arguments().at(2)); ++ keyval2 = qdbus_cast(reply.arguments().at(3)); ++ state2 = qdbus_cast(reply.arguments().at(4)); ++ } ++ return reply; ++ } ++ ++ inline QDBusPendingReply CreateICv2(const QString &appname) ++ { ++ QList argumentList; ++ argumentList << QVariant::fromValue(appname); ++ return asyncCallWithArgumentList(QLatin1String("CreateICv2"), argumentList); ++ } ++ inline QDBusReply CreateICv2(const QString &appname, bool &enable, uint &keyval1, uint &state1, uint &keyval2, uint &state2) ++ { ++ QList argumentList; ++ argumentList << QVariant::fromValue(appname); ++ QDBusMessage reply = callWithArgumentList(QDBus::Block, QLatin1String("CreateICv2"), argumentList); ++ if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 6) { ++ enable = qdbus_cast(reply.arguments().at(1)); ++ keyval1 = qdbus_cast(reply.arguments().at(2)); ++ state1 = qdbus_cast(reply.arguments().at(3)); ++ keyval2 = qdbus_cast(reply.arguments().at(4)); ++ state2 = qdbus_cast(reply.arguments().at(5)); ++ } ++ return reply; ++ } ++ ++ inline QDBusPendingReply CreateICv3(const QString &appname, int pid) ++ { ++ QList argumentList; ++ argumentList << QVariant::fromValue(appname) << QVariant::fromValue(pid); ++ return asyncCallWithArgumentList(QLatin1String("CreateICv3"), argumentList); ++ } ++ inline QDBusReply CreateICv3(const QString &appname, int pid, bool &enable, uint &keyval1, uint &state1, uint &keyval2, uint &state2) ++ { ++ QList argumentList; ++ argumentList << QVariant::fromValue(appname) << QVariant::fromValue(pid); ++ QDBusMessage reply = callWithArgumentList(QDBus::Block, QLatin1String("CreateICv3"), argumentList); ++ if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 6) { ++ enable = qdbus_cast(reply.arguments().at(1)); ++ keyval1 = qdbus_cast(reply.arguments().at(2)); ++ state1 = qdbus_cast(reply.arguments().at(3)); ++ keyval2 = qdbus_cast(reply.arguments().at(4)); ++ state2 = qdbus_cast(reply.arguments().at(5)); ++ } ++ return reply; ++ } ++ ++ inline QDBusPendingReply<> Exit() ++ { ++ QList argumentList; ++ return asyncCallWithArgumentList(QLatin1String("Exit"), argumentList); ++ } ++ ++ inline QDBusPendingReply GetCurrentIM() ++ { ++ QList argumentList; ++ return asyncCallWithArgumentList(QLatin1String("GetCurrentIM"), argumentList); ++ } ++ ++ inline QDBusPendingReply GetCurrentState() ++ { ++ QList argumentList; ++ return asyncCallWithArgumentList(QLatin1String("GetCurrentState"), argumentList); ++ } ++ ++ inline QDBusPendingReply GetCurrentUI() ++ { ++ QList argumentList; ++ return asyncCallWithArgumentList(QLatin1String("GetCurrentUI"), argumentList); ++ } ++ ++ inline QDBusPendingReply GetIMAddon(const QString &im) ++ { ++ QList argumentList; ++ argumentList << QVariant::fromValue(im); ++ return asyncCallWithArgumentList(QLatin1String("GetIMAddon"), argumentList); ++ } ++ ++ inline QDBusPendingReply<> InactivateIM() ++ { ++ QList argumentList; ++ return asyncCallWithArgumentList(QLatin1String("InactivateIM"), argumentList); ++ } ++ ++ inline QDBusPendingReply<> ReloadAddonConfig(const QString &addon) ++ { ++ QList argumentList; ++ argumentList << QVariant::fromValue(addon); ++ return asyncCallWithArgumentList(QLatin1String("ReloadAddonConfig"), argumentList); ++ } ++ ++ inline QDBusPendingReply<> ReloadConfig() ++ { ++ QList argumentList; ++ return asyncCallWithArgumentList(QLatin1String("ReloadConfig"), argumentList); ++ } ++ ++ inline QDBusPendingReply<> ResetIMList() ++ { ++ QList argumentList; ++ return asyncCallWithArgumentList(QLatin1String("ResetIMList"), argumentList); ++ } ++ ++ inline QDBusPendingReply<> Restart() ++ { ++ QList argumentList; ++ return asyncCallWithArgumentList(QLatin1String("Restart"), argumentList); ++ } ++ ++ inline QDBusPendingReply<> SetCurrentIM(const QString &im) ++ { ++ QList argumentList; ++ argumentList << QVariant::fromValue(im); ++ return asyncCallWithArgumentList(QLatin1String("SetCurrentIM"), argumentList); ++ } ++ ++ inline QDBusPendingReply<> ToggleIM() ++ { ++ QList argumentList; ++ return asyncCallWithArgumentList(QLatin1String("ToggleIM"), argumentList); ++ } ++ ++Q_SIGNALS: // SIGNALS ++}; ++ ++#endif +diff --git a/src/plugins/platforminputcontexts/fcitx/fcitxqtkeyboardlayout.cpp b/src/plugins/platforminputcontexts/fcitx/fcitxqtkeyboardlayout.cpp +new file mode 100644 +index 0000000..32cd981 +--- /dev/null ++++ b/src/plugins/platforminputcontexts/fcitx/fcitxqtkeyboardlayout.cpp +@@ -0,0 +1,100 @@ ++/*************************************************************************** ++ * Copyright (C) 2011~2012 by CSSlayer * ++ * * ++ * This program is free software; you can redistribute it and/or modify * ++ * it under the terms of the GNU General Public License as published by * ++ * the Free Software Foundation; either version 2 of the License, or * ++ * (at your option) any later version. * ++ * * ++ * This program is distributed in the hope that it will be useful, * ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of * ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * ++ * GNU General Public License for more details. * ++ * * ++ * You should have received a copy of the GNU General Public License * ++ * along with this program; if not, write to the * ++ * Free Software Foundation, Inc., * ++ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ++ ***************************************************************************/ ++ ++// Qt ++#include ++#include ++ ++// self ++#include "fcitxqtkeyboardlayout.h" ++ ++const QString& FcitxQtKeyboardLayout::layout() const ++{ ++ return m_layout; ++} ++const QString& FcitxQtKeyboardLayout::langCode() const ++{ ++ return m_langCode; ++} ++const QString& FcitxQtKeyboardLayout::name() const ++{ ++ return m_name; ++} ++ ++const QString& FcitxQtKeyboardLayout::variant() const ++{ ++ return m_variant; ++} ++ ++void FcitxQtKeyboardLayout::setLayout(const QString& layout) ++{ ++ m_layout = layout; ++} ++ ++void FcitxQtKeyboardLayout::setLangCode(const QString& lang) ++{ ++ m_langCode = lang; ++} ++ ++void FcitxQtKeyboardLayout::setName(const QString& name) ++{ ++ m_name = name; ++} ++ ++void FcitxQtKeyboardLayout::setVariant(const QString& variant) ++{ ++ m_variant = variant; ++} ++ ++void FcitxQtKeyboardLayout::registerMetaType() ++{ ++ qRegisterMetaType("FcitxQtKeyboardLayout"); ++ qDBusRegisterMetaType(); ++ qRegisterMetaType("FcitxQtKeyboardLayoutList"); ++ qDBusRegisterMetaType(); ++} ++ ++FCITXQTDBUSADDONS_EXPORT ++QDBusArgument& operator<<(QDBusArgument& argument, const FcitxQtKeyboardLayout& layout) ++{ ++ argument.beginStructure(); ++ argument << layout.layout(); ++ argument << layout.variant(); ++ argument << layout.name(); ++ argument << layout.langCode(); ++ argument.endStructure(); ++ return argument; ++} ++ ++FCITXQTDBUSADDONS_EXPORT ++const QDBusArgument& operator>>(const QDBusArgument& argument, FcitxQtKeyboardLayout& layout) ++{ ++ QString l; ++ QString variant; ++ QString name; ++ QString langCode; ++ argument.beginStructure(); ++ argument >> l >> variant >> name >> langCode; ++ argument.endStructure(); ++ layout.setLayout(l); ++ layout.setVariant(variant); ++ layout.setName(name); ++ layout.setLangCode(langCode); ++ return argument; ++} +diff --git a/src/plugins/platforminputcontexts/fcitx/fcitxqtkeyboardlayout.h b/src/plugins/platforminputcontexts/fcitx/fcitxqtkeyboardlayout.h +new file mode 100644 +index 0000000..d33438d +--- /dev/null ++++ b/src/plugins/platforminputcontexts/fcitx/fcitxqtkeyboardlayout.h +@@ -0,0 +1,58 @@ ++/*************************************************************************** ++ * Copyright (C) 2011~2012 by CSSlayer * ++ * * ++ * This program is free software; you can redistribute it and/or modify * ++ * it under the terms of the GNU General Public License as published by * ++ * the Free Software Foundation; either version 2 of the License, or * ++ * (at your option) any later version. * ++ * * ++ * This program is distributed in the hope that it will be useful, * ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of * ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * ++ * GNU General Public License for more details. * ++ * * ++ * You should have received a copy of the GNU General Public License * ++ * along with this program; if not, write to the * ++ * Free Software Foundation, Inc., * ++ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ++ ***************************************************************************/ ++ ++#ifndef FCITX_QT_KEYBOARD_LAYOUT_H ++#define FCITX_QT_KEYBOARD_LAYOUT_H ++ ++#include "fcitxqtdbusaddons_export.h" ++ ++// Qt ++#include ++#include ++#include ++ ++class FCITXQTDBUSADDONS_EXPORT FcitxQtKeyboardLayout ++{ ++public: ++ const QString& layout() const; ++ const QString& variant() const; ++ const QString& name() const; ++ const QString& langCode() const; ++ void setLayout(const QString& layout); ++ void setLangCode(const QString& lang); ++ void setName(const QString& name); ++ void setVariant(const QString& variant); ++ ++ static void registerMetaType(); ++private: ++ QString m_layout; ++ QString m_variant; ++ QString m_name; ++ QString m_langCode; ++}; ++ ++typedef QList FcitxQtKeyboardLayoutList; ++ ++QDBusArgument& operator<<(QDBusArgument& argument, const FcitxQtKeyboardLayout& l); ++const QDBusArgument& operator>>(const QDBusArgument& argument, FcitxQtKeyboardLayout& l); ++ ++Q_DECLARE_METATYPE(FcitxQtKeyboardLayout) ++Q_DECLARE_METATYPE(FcitxQtKeyboardLayoutList) ++ ++#endif +diff --git a/src/plugins/platforminputcontexts/fcitx/fcitxqtkeyboardproxy.cpp b/src/plugins/platforminputcontexts/fcitx/fcitxqtkeyboardproxy.cpp +new file mode 100644 +index 0000000..fa97ab6 +--- /dev/null ++++ b/src/plugins/platforminputcontexts/fcitx/fcitxqtkeyboardproxy.cpp +@@ -0,0 +1,25 @@ ++/* ++ * This file was generated by qdbusxml2cpp version 0.8 ++ * Command line was: qdbusxml2cpp -N -p fcitxqtkeyboardproxy -c FcitxQtKeyboardProxy interfaces/org.fcitx.Fcitx.Keyboard.xml -i fcitxqtkeyboardlayout.h -i fcitxqt_export.h ++ * ++ * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). ++ * ++ * This is an auto-generated file. ++ * This file may have been hand-edited. Look for HAND-EDIT comments ++ * before re-generating it. ++ */ ++ ++#include "fcitxqtkeyboardproxy.h" ++ ++/* ++ * Implementation of interface class FcitxQtKeyboardProxy ++ */ ++ ++FcitxQtKeyboardProxy::FcitxQtKeyboardProxy(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent) ++ : QDBusAbstractInterface(service, path, staticInterfaceName(), connection, parent) ++{ ++} ++ ++FcitxQtKeyboardProxy::~FcitxQtKeyboardProxy() ++{ ++} +diff --git a/src/plugins/platforminputcontexts/fcitx/fcitxqtkeyboardproxy.h b/src/plugins/platforminputcontexts/fcitx/fcitxqtkeyboardproxy.h +new file mode 100644 +index 0000000..42a6561 +--- /dev/null ++++ b/src/plugins/platforminputcontexts/fcitx/fcitxqtkeyboardproxy.h +@@ -0,0 +1,74 @@ ++/* ++ * This file was generated by qdbusxml2cpp version 0.8 ++ * Command line was: qdbusxml2cpp -N -p fcitxqtkeyboardproxy -c FcitxQtKeyboardProxy interfaces/org.fcitx.Fcitx.Keyboard.xml -i fcitxqtkeyboardlayout.h -i fcitxqt_export.h ++ * ++ * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). ++ * ++ * This is an auto-generated file. ++ * Do not edit! All changes made to it will be lost. ++ */ ++ ++#ifndef FCITXQTKEYBOARDPROXY_H_1409252990 ++#define FCITXQTKEYBOARDPROXY_H_1409252990 ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include "fcitxqtkeyboardlayout.h" ++#include "fcitxqtdbusaddons_export.h" ++ ++/* ++ * Proxy class for interface org.fcitx.Fcitx.Keyboard ++ */ ++class FCITXQTDBUSADDONS_EXPORT FcitxQtKeyboardProxy: public QDBusAbstractInterface ++{ ++ Q_OBJECT ++public: ++ static inline const char *staticInterfaceName() ++ { return "org.fcitx.Fcitx.Keyboard"; } ++ ++public: ++ FcitxQtKeyboardProxy(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0); ++ ++ ~FcitxQtKeyboardProxy(); ++ ++public Q_SLOTS: // METHODS ++ inline QDBusPendingReply GetLayoutForIM(const QString &im) ++ { ++ QList argumentList; ++ argumentList << QVariant::fromValue(im); ++ return asyncCallWithArgumentList(QLatin1String("GetLayoutForIM"), argumentList); ++ } ++ inline QDBusReply GetLayoutForIM(const QString &im, QString &variant) ++ { ++ QList argumentList; ++ argumentList << QVariant::fromValue(im); ++ QDBusMessage reply = callWithArgumentList(QDBus::Block, QLatin1String("GetLayoutForIM"), argumentList); ++ if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 2) { ++ variant = qdbus_cast(reply.arguments().at(1)); ++ } ++ return reply; ++ } ++ ++ inline QDBusPendingReply GetLayouts() ++ { ++ QList argumentList; ++ return asyncCallWithArgumentList(QLatin1String("GetLayouts"), argumentList); ++ } ++ ++ inline QDBusPendingReply<> SetLayoutForIM(const QString &im, const QString &layout, const QString &variant) ++ { ++ QList argumentList; ++ argumentList << QVariant::fromValue(im) << QVariant::fromValue(layout) << QVariant::fromValue(variant); ++ return asyncCallWithArgumentList(QLatin1String("SetLayoutForIM"), argumentList); ++ } ++ ++Q_SIGNALS: // SIGNALS ++}; ++ ++#endif +diff --git a/src/plugins/platforminputcontexts/fcitx/interfaces/org.fcitx.Fcitx.InputContext.xml b/src/plugins/platforminputcontexts/fcitx/interfaces/org.fcitx.Fcitx.InputContext.xml +new file mode 100644 +index 0000000..1423d69 +--- /dev/null ++++ b/src/plugins/platforminputcontexts/fcitx/interfaces/org.fcitx.Fcitx.InputContext.xml +@@ -0,0 +1,81 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/src/plugins/platforminputcontexts/fcitx/interfaces/org.fcitx.Fcitx.InputMethod.xml b/src/plugins/platforminputcontexts/fcitx/interfaces/org.fcitx.Fcitx.InputMethod.xml +new file mode 100644 +index 0000000..00dc20a +--- /dev/null ++++ b/src/plugins/platforminputcontexts/fcitx/interfaces/org.fcitx.Fcitx.InputMethod.xml +@@ -0,0 +1,81 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/src/plugins/platforminputcontexts/fcitx/interfaces/org.fcitx.Fcitx.Keyboard.xml b/src/plugins/platforminputcontexts/fcitx/interfaces/org.fcitx.Fcitx.Keyboard.xml +new file mode 100644 +index 0000000..28ffa53 +--- /dev/null ++++ b/src/plugins/platforminputcontexts/fcitx/interfaces/org.fcitx.Fcitx.Keyboard.xml +@@ -0,0 +1,20 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +\ No newline at end of file +diff --git a/src/plugins/platforminputcontexts/fcitx/keydata.h b/src/plugins/platforminputcontexts/fcitx/keydata.h +new file mode 100644 +index 0000000..5cee565 +--- /dev/null ++++ b/src/plugins/platforminputcontexts/fcitx/keydata.h +@@ -0,0 +1,1612 @@ ++/*************************************************************************** ++ * Copyright (C) 2012~2013 by CSSlayer * ++ * * ++ * This program is free software; you can redistribute it and/or modify * ++ * it under the terms of the GNU General Public License as published by * ++ * the Free Software Foundation; either version 2 of the License, or * ++ * (at your option) any later version. * ++ * * ++ * This program is distributed in the hope that it will be useful, * ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of * ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * ++ * GNU General Public License for more details. * ++ * * ++ * You should have received a copy of the GNU General Public License * ++ * along with this program; if not, write to the * ++ * Free Software Foundation, Inc., * ++ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ++ ***************************************************************************/ ++ ++#ifndef KEYDATA_H ++#define KEYDATA_H ++ ++struct _FcitxKeySymToUnicode{ ++ uint16_t keysym; ++ uint16_t ucs; ++}; ++ ++struct _FcitxUnicodeToKeySym { ++ uint16_t keysym; ++ uint16_t ucs; ++}; ++ ++static const struct _FcitxKeySymToUnicode gdk_keysym_to_unicode_tab[] = { ++ { 0x01a1, 0x0104 }, /* Aogonek Ą LATIN CAPITAL LETTER A WITH OGONEK */ ++ { 0x01a2, 0x02d8 }, /* breve ˘ BREVE */ ++ { 0x01a3, 0x0141 }, /* Lstroke Ł LATIN CAPITAL LETTER L WITH STROKE */ ++ { 0x01a5, 0x013d }, /* Lcaron Ľ LATIN CAPITAL LETTER L WITH CARON */ ++ { 0x01a6, 0x015a }, /* Sacute Ś LATIN CAPITAL LETTER S WITH ACUTE */ ++ { 0x01a9, 0x0160 }, /* Scaron Š LATIN CAPITAL LETTER S WITH CARON */ ++ { 0x01aa, 0x015e }, /* Scedilla Ş LATIN CAPITAL LETTER S WITH CEDILLA */ ++ { 0x01ab, 0x0164 }, /* Tcaron Ť LATIN CAPITAL LETTER T WITH CARON */ ++ { 0x01ac, 0x0179 }, /* Zacute Ź LATIN CAPITAL LETTER Z WITH ACUTE */ ++ { 0x01ae, 0x017d }, /* Zcaron Ž LATIN CAPITAL LETTER Z WITH CARON */ ++ { 0x01af, 0x017b }, /* Zabovedot Ż LATIN CAPITAL LETTER Z WITH DOT ABOVE */ ++ { 0x01b1, 0x0105 }, /* aogonek ą LATIN SMALL LETTER A WITH OGONEK */ ++ { 0x01b2, 0x02db }, /* ogonek ˛ OGONEK */ ++ { 0x01b3, 0x0142 }, /* lstroke ł LATIN SMALL LETTER L WITH STROKE */ ++ { 0x01b5, 0x013e }, /* lcaron ľ LATIN SMALL LETTER L WITH CARON */ ++ { 0x01b6, 0x015b }, /* sacute ś LATIN SMALL LETTER S WITH ACUTE */ ++ { 0x01b7, 0x02c7 }, /* caron ˇ CARON */ ++ { 0x01b9, 0x0161 }, /* scaron š LATIN SMALL LETTER S WITH CARON */ ++ { 0x01ba, 0x015f }, /* scedilla ş LATIN SMALL LETTER S WITH CEDILLA */ ++ { 0x01bb, 0x0165 }, /* tcaron ť LATIN SMALL LETTER T WITH CARON */ ++ { 0x01bc, 0x017a }, /* zacute ź LATIN SMALL LETTER Z WITH ACUTE */ ++ { 0x01bd, 0x02dd }, /* doubleacute ˝ DOUBLE ACUTE ACCENT */ ++ { 0x01be, 0x017e }, /* zcaron ž LATIN SMALL LETTER Z WITH CARON */ ++ { 0x01bf, 0x017c }, /* zabovedot ż LATIN SMALL LETTER Z WITH DOT ABOVE */ ++ { 0x01c0, 0x0154 }, /* Racute Ŕ LATIN CAPITAL LETTER R WITH ACUTE */ ++ { 0x01c3, 0x0102 }, /* Abreve Ă LATIN CAPITAL LETTER A WITH BREVE */ ++ { 0x01c5, 0x0139 }, /* Lacute Ĺ LATIN CAPITAL LETTER L WITH ACUTE */ ++ { 0x01c6, 0x0106 }, /* Cacute Ć LATIN CAPITAL LETTER C WITH ACUTE */ ++ { 0x01c8, 0x010c }, /* Ccaron Č LATIN CAPITAL LETTER C WITH CARON */ ++ { 0x01ca, 0x0118 }, /* Eogonek Ę LATIN CAPITAL LETTER E WITH OGONEK */ ++ { 0x01cc, 0x011a }, /* Ecaron Ě LATIN CAPITAL LETTER E WITH CARON */ ++ { 0x01cf, 0x010e }, /* Dcaron Ď LATIN CAPITAL LETTER D WITH CARON */ ++ { 0x01d0, 0x0110 }, /* Dstroke Đ LATIN CAPITAL LETTER D WITH STROKE */ ++ { 0x01d1, 0x0143 }, /* Nacute Ń LATIN CAPITAL LETTER N WITH ACUTE */ ++ { 0x01d2, 0x0147 }, /* Ncaron Ň LATIN CAPITAL LETTER N WITH CARON */ ++ { 0x01d5, 0x0150 }, /* Odoubleacute Ő LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */ ++ { 0x01d8, 0x0158 }, /* Rcaron Ř LATIN CAPITAL LETTER R WITH CARON */ ++ { 0x01d9, 0x016e }, /* Uring Ů LATIN CAPITAL LETTER U WITH RING ABOVE */ ++ { 0x01db, 0x0170 }, /* Udoubleacute Ű LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */ ++ { 0x01de, 0x0162 }, /* Tcedilla Ţ LATIN CAPITAL LETTER T WITH CEDILLA */ ++ { 0x01e0, 0x0155 }, /* racute ŕ LATIN SMALL LETTER R WITH ACUTE */ ++ { 0x01e3, 0x0103 }, /* abreve ă LATIN SMALL LETTER A WITH BREVE */ ++ { 0x01e5, 0x013a }, /* lacute ĺ LATIN SMALL LETTER L WITH ACUTE */ ++ { 0x01e6, 0x0107 }, /* cacute ć LATIN SMALL LETTER C WITH ACUTE */ ++ { 0x01e8, 0x010d }, /* ccaron č LATIN SMALL LETTER C WITH CARON */ ++ { 0x01ea, 0x0119 }, /* eogonek ę LATIN SMALL LETTER E WITH OGONEK */ ++ { 0x01ec, 0x011b }, /* ecaron ě LATIN SMALL LETTER E WITH CARON */ ++ { 0x01ef, 0x010f }, /* dcaron ď LATIN SMALL LETTER D WITH CARON */ ++ { 0x01f0, 0x0111 }, /* dstroke đ LATIN SMALL LETTER D WITH STROKE */ ++ { 0x01f1, 0x0144 }, /* nacute ń LATIN SMALL LETTER N WITH ACUTE */ ++ { 0x01f2, 0x0148 }, /* ncaron ň LATIN SMALL LETTER N WITH CARON */ ++ { 0x01f5, 0x0151 }, /* odoubleacute ő LATIN SMALL LETTER O WITH DOUBLE ACUTE */ ++ { 0x01f8, 0x0159 }, /* rcaron ř LATIN SMALL LETTER R WITH CARON */ ++ { 0x01f9, 0x016f }, /* uring ů LATIN SMALL LETTER U WITH RING ABOVE */ ++ { 0x01fb, 0x0171 }, /* udoubleacute ű LATIN SMALL LETTER U WITH DOUBLE ACUTE */ ++ { 0x01fe, 0x0163 }, /* tcedilla ţ LATIN SMALL LETTER T WITH CEDILLA */ ++ { 0x01ff, 0x02d9 }, /* abovedot ˙ DOT ABOVE */ ++ { 0x02a1, 0x0126 }, /* Hstroke Ħ LATIN CAPITAL LETTER H WITH STROKE */ ++ { 0x02a6, 0x0124 }, /* Hcircumflex Ĥ LATIN CAPITAL LETTER H WITH CIRCUMFLEX */ ++ { 0x02a9, 0x0130 }, /* Iabovedot İ LATIN CAPITAL LETTER I WITH DOT ABOVE */ ++ { 0x02ab, 0x011e }, /* Gbreve Ğ LATIN CAPITAL LETTER G WITH BREVE */ ++ { 0x02ac, 0x0134 }, /* Jcircumflex Ĵ LATIN CAPITAL LETTER J WITH CIRCUMFLEX */ ++ { 0x02b1, 0x0127 }, /* hstroke ħ LATIN SMALL LETTER H WITH STROKE */ ++ { 0x02b6, 0x0125 }, /* hcircumflex ĥ LATIN SMALL LETTER H WITH CIRCUMFLEX */ ++ { 0x02b9, 0x0131 }, /* idotless ı LATIN SMALL LETTER DOTLESS I */ ++ { 0x02bb, 0x011f }, /* gbreve ğ LATIN SMALL LETTER G WITH BREVE */ ++ { 0x02bc, 0x0135 }, /* jcircumflex ĵ LATIN SMALL LETTER J WITH CIRCUMFLEX */ ++ { 0x02c5, 0x010a }, /* Cabovedot Ċ LATIN CAPITAL LETTER C WITH DOT ABOVE */ ++ { 0x02c6, 0x0108 }, /* Ccircumflex Ĉ LATIN CAPITAL LETTER C WITH CIRCUMFLEX */ ++ { 0x02d5, 0x0120 }, /* Gabovedot Ġ LATIN CAPITAL LETTER G WITH DOT ABOVE */ ++ { 0x02d8, 0x011c }, /* Gcircumflex Ĝ LATIN CAPITAL LETTER G WITH CIRCUMFLEX */ ++ { 0x02dd, 0x016c }, /* Ubreve Ŭ LATIN CAPITAL LETTER U WITH BREVE */ ++ { 0x02de, 0x015c }, /* Scircumflex Ŝ LATIN CAPITAL LETTER S WITH CIRCUMFLEX */ ++ { 0x02e5, 0x010b }, /* cabovedot ċ LATIN SMALL LETTER C WITH DOT ABOVE */ ++ { 0x02e6, 0x0109 }, /* ccircumflex ĉ LATIN SMALL LETTER C WITH CIRCUMFLEX */ ++ { 0x02f5, 0x0121 }, /* gabovedot ġ LATIN SMALL LETTER G WITH DOT ABOVE */ ++ { 0x02f8, 0x011d }, /* gcircumflex ĝ LATIN SMALL LETTER G WITH CIRCUMFLEX */ ++ { 0x02fd, 0x016d }, /* ubreve ŭ LATIN SMALL LETTER U WITH BREVE */ ++ { 0x02fe, 0x015d }, /* scircumflex ŝ LATIN SMALL LETTER S WITH CIRCUMFLEX */ ++ { 0x03a2, 0x0138 }, /* kra ĸ LATIN SMALL LETTER KRA */ ++ { 0x03a3, 0x0156 }, /* Rcedilla Ŗ LATIN CAPITAL LETTER R WITH CEDILLA */ ++ { 0x03a5, 0x0128 }, /* Itilde Ĩ LATIN CAPITAL LETTER I WITH TILDE */ ++ { 0x03a6, 0x013b }, /* Lcedilla Ļ LATIN CAPITAL LETTER L WITH CEDILLA */ ++ { 0x03aa, 0x0112 }, /* Emacron Ē LATIN CAPITAL LETTER E WITH MACRON */ ++ { 0x03ab, 0x0122 }, /* Gcedilla Ģ LATIN CAPITAL LETTER G WITH CEDILLA */ ++ { 0x03ac, 0x0166 }, /* Tslash Ŧ LATIN CAPITAL LETTER T WITH STROKE */ ++ { 0x03b3, 0x0157 }, /* rcedilla ŗ LATIN SMALL LETTER R WITH CEDILLA */ ++ { 0x03b5, 0x0129 }, /* itilde ĩ LATIN SMALL LETTER I WITH TILDE */ ++ { 0x03b6, 0x013c }, /* lcedilla ļ LATIN SMALL LETTER L WITH CEDILLA */ ++ { 0x03ba, 0x0113 }, /* emacron ē LATIN SMALL LETTER E WITH MACRON */ ++ { 0x03bb, 0x0123 }, /* gcedilla ģ LATIN SMALL LETTER G WITH CEDILLA */ ++ { 0x03bc, 0x0167 }, /* tslash ŧ LATIN SMALL LETTER T WITH STROKE */ ++ { 0x03bd, 0x014a }, /* ENG Ŋ LATIN CAPITAL LETTER ENG */ ++ { 0x03bf, 0x014b }, /* eng ŋ LATIN SMALL LETTER ENG */ ++ { 0x03c0, 0x0100 }, /* Amacron Ā LATIN CAPITAL LETTER A WITH MACRON */ ++ { 0x03c7, 0x012e }, /* Iogonek Į LATIN CAPITAL LETTER I WITH OGONEK */ ++ { 0x03cc, 0x0116 }, /* Eabovedot Ė LATIN CAPITAL LETTER E WITH DOT ABOVE */ ++ { 0x03cf, 0x012a }, /* Imacron Ī LATIN CAPITAL LETTER I WITH MACRON */ ++ { 0x03d1, 0x0145 }, /* Ncedilla Ņ LATIN CAPITAL LETTER N WITH CEDILLA */ ++ { 0x03d2, 0x014c }, /* Omacron Ō LATIN CAPITAL LETTER O WITH MACRON */ ++ { 0x03d3, 0x0136 }, /* Kcedilla Ķ LATIN CAPITAL LETTER K WITH CEDILLA */ ++ { 0x03d9, 0x0172 }, /* Uogonek Ų LATIN CAPITAL LETTER U WITH OGONEK */ ++ { 0x03dd, 0x0168 }, /* Utilde Ũ LATIN CAPITAL LETTER U WITH TILDE */ ++ { 0x03de, 0x016a }, /* Umacron Ū LATIN CAPITAL LETTER U WITH MACRON */ ++ { 0x03e0, 0x0101 }, /* amacron ā LATIN SMALL LETTER A WITH MACRON */ ++ { 0x03e7, 0x012f }, /* iogonek į LATIN SMALL LETTER I WITH OGONEK */ ++ { 0x03ec, 0x0117 }, /* eabovedot ė LATIN SMALL LETTER E WITH DOT ABOVE */ ++ { 0x03ef, 0x012b }, /* imacron ī LATIN SMALL LETTER I WITH MACRON */ ++ { 0x03f1, 0x0146 }, /* ncedilla ņ LATIN SMALL LETTER N WITH CEDILLA */ ++ { 0x03f2, 0x014d }, /* omacron ō LATIN SMALL LETTER O WITH MACRON */ ++ { 0x03f3, 0x0137 }, /* kcedilla ķ LATIN SMALL LETTER K WITH CEDILLA */ ++ { 0x03f9, 0x0173 }, /* uogonek ų LATIN SMALL LETTER U WITH OGONEK */ ++ { 0x03fd, 0x0169 }, /* utilde ũ LATIN SMALL LETTER U WITH TILDE */ ++ { 0x03fe, 0x016b }, /* umacron ū LATIN SMALL LETTER U WITH MACRON */ ++ { 0x047e, 0x203e }, /* overline ‾ OVERLINE */ ++ { 0x04a1, 0x3002 }, /* kana_fullstop 。 IDEOGRAPHIC FULL STOP */ ++ { 0x04a2, 0x300c }, /* kana_openingbracket 「 LEFT CORNER BRACKET */ ++ { 0x04a3, 0x300d }, /* kana_closingbracket 」 RIGHT CORNER BRACKET */ ++ { 0x04a4, 0x3001 }, /* kana_comma 、 IDEOGRAPHIC COMMA */ ++ { 0x04a5, 0x30fb }, /* kana_conjunctive ・ KATAKANA MIDDLE DOT */ ++ { 0x04a6, 0x30f2 }, /* kana_WO ヲ KATAKANA LETTER WO */ ++ { 0x04a7, 0x30a1 }, /* kana_a ァ KATAKANA LETTER SMALL A */ ++ { 0x04a8, 0x30a3 }, /* kana_i ィ KATAKANA LETTER SMALL I */ ++ { 0x04a9, 0x30a5 }, /* kana_u ゥ KATAKANA LETTER SMALL U */ ++ { 0x04aa, 0x30a7 }, /* kana_e ェ KATAKANA LETTER SMALL E */ ++ { 0x04ab, 0x30a9 }, /* kana_o ォ KATAKANA LETTER SMALL O */ ++ { 0x04ac, 0x30e3 }, /* kana_ya ャ KATAKANA LETTER SMALL YA */ ++ { 0x04ad, 0x30e5 }, /* kana_yu ュ KATAKANA LETTER SMALL YU */ ++ { 0x04ae, 0x30e7 }, /* kana_yo ョ KATAKANA LETTER SMALL YO */ ++ { 0x04af, 0x30c3 }, /* kana_tsu ッ KATAKANA LETTER SMALL TU */ ++ { 0x04b0, 0x30fc }, /* prolongedsound ー KATAKANA-HIRAGANA PROLONGED SOUND MARK */ ++ { 0x04b1, 0x30a2 }, /* kana_A ア KATAKANA LETTER A */ ++ { 0x04b2, 0x30a4 }, /* kana_I イ KATAKANA LETTER I */ ++ { 0x04b3, 0x30a6 }, /* kana_U ウ KATAKANA LETTER U */ ++ { 0x04b4, 0x30a8 }, /* kana_E エ KATAKANA LETTER E */ ++ { 0x04b5, 0x30aa }, /* kana_O オ KATAKANA LETTER O */ ++ { 0x04b6, 0x30ab }, /* kana_KA カ KATAKANA LETTER KA */ ++ { 0x04b7, 0x30ad }, /* kana_KI キ KATAKANA LETTER KI */ ++ { 0x04b8, 0x30af }, /* kana_KU ク KATAKANA LETTER KU */ ++ { 0x04b9, 0x30b1 }, /* kana_KE ケ KATAKANA LETTER KE */ ++ { 0x04ba, 0x30b3 }, /* kana_KO コ KATAKANA LETTER KO */ ++ { 0x04bb, 0x30b5 }, /* kana_SA サ KATAKANA LETTER SA */ ++ { 0x04bc, 0x30b7 }, /* kana_SHI シ KATAKANA LETTER SI */ ++ { 0x04bd, 0x30b9 }, /* kana_SU ス KATAKANA LETTER SU */ ++ { 0x04be, 0x30bb }, /* kana_SE セ KATAKANA LETTER SE */ ++ { 0x04bf, 0x30bd }, /* kana_SO ソ KATAKANA LETTER SO */ ++ { 0x04c0, 0x30bf }, /* kana_TA タ KATAKANA LETTER TA */ ++ { 0x04c1, 0x30c1 }, /* kana_CHI チ KATAKANA LETTER TI */ ++ { 0x04c2, 0x30c4 }, /* kana_TSU ツ KATAKANA LETTER TU */ ++ { 0x04c3, 0x30c6 }, /* kana_TE テ KATAKANA LETTER TE */ ++ { 0x04c4, 0x30c8 }, /* kana_TO ト KATAKANA LETTER TO */ ++ { 0x04c5, 0x30ca }, /* kana_NA ナ KATAKANA LETTER NA */ ++ { 0x04c6, 0x30cb }, /* kana_NI ニ KATAKANA LETTER NI */ ++ { 0x04c7, 0x30cc }, /* kana_NU ヌ KATAKANA LETTER NU */ ++ { 0x04c8, 0x30cd }, /* kana_NE ネ KATAKANA LETTER NE */ ++ { 0x04c9, 0x30ce }, /* kana_NO ノ KATAKANA LETTER NO */ ++ { 0x04ca, 0x30cf }, /* kana_HA ハ KATAKANA LETTER HA */ ++ { 0x04cb, 0x30d2 }, /* kana_HI ヒ KATAKANA LETTER HI */ ++ { 0x04cc, 0x30d5 }, /* kana_FU フ KATAKANA LETTER HU */ ++ { 0x04cd, 0x30d8 }, /* kana_HE ヘ KATAKANA LETTER HE */ ++ { 0x04ce, 0x30db }, /* kana_HO ホ KATAKANA LETTER HO */ ++ { 0x04cf, 0x30de }, /* kana_MA マ KATAKANA LETTER MA */ ++ { 0x04d0, 0x30df }, /* kana_MI ミ KATAKANA LETTER MI */ ++ { 0x04d1, 0x30e0 }, /* kana_MU ム KATAKANA LETTER MU */ ++ { 0x04d2, 0x30e1 }, /* kana_ME メ KATAKANA LETTER ME */ ++ { 0x04d3, 0x30e2 }, /* kana_MO モ KATAKANA LETTER MO */ ++ { 0x04d4, 0x30e4 }, /* kana_YA ヤ KATAKANA LETTER YA */ ++ { 0x04d5, 0x30e6 }, /* kana_YU ユ KATAKANA LETTER YU */ ++ { 0x04d6, 0x30e8 }, /* kana_YO ヨ KATAKANA LETTER YO */ ++ { 0x04d7, 0x30e9 }, /* kana_RA ラ KATAKANA LETTER RA */ ++ { 0x04d8, 0x30ea }, /* kana_RI リ KATAKANA LETTER RI */ ++ { 0x04d9, 0x30eb }, /* kana_RU ル KATAKANA LETTER RU */ ++ { 0x04da, 0x30ec }, /* kana_RE レ KATAKANA LETTER RE */ ++ { 0x04db, 0x30ed }, /* kana_RO ロ KATAKANA LETTER RO */ ++ { 0x04dc, 0x30ef }, /* kana_WA ワ KATAKANA LETTER WA */ ++ { 0x04dd, 0x30f3 }, /* kana_N ン KATAKANA LETTER N */ ++ { 0x04de, 0x309b }, /* voicedsound ゛ KATAKANA-HIRAGANA VOICED SOUND MARK */ ++ { 0x04df, 0x309c }, /* semivoicedsound ゜ KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */ ++ { 0x05ac, 0x060c }, /* Arabic_comma ، ARABIC COMMA */ ++ { 0x05bb, 0x061b }, /* Arabic_semicolon ؛ ARABIC SEMICOLON */ ++ { 0x05bf, 0x061f }, /* Arabic_question_mark ؟ ARABIC QUESTION MARK */ ++ { 0x05c1, 0x0621 }, /* Arabic_hamza ء ARABIC LETTER HAMZA */ ++ { 0x05c2, 0x0622 }, /* Arabic_maddaonalef آ ARABIC LETTER ALEF WITH MADDA ABOVE */ ++ { 0x05c3, 0x0623 }, /* Arabic_hamzaonalef أ ARABIC LETTER ALEF WITH HAMZA ABOVE */ ++ { 0x05c4, 0x0624 }, /* Arabic_hamzaonwaw ؤ ARABIC LETTER WAW WITH HAMZA ABOVE */ ++ { 0x05c5, 0x0625 }, /* Arabic_hamzaunderalef إ ARABIC LETTER ALEF WITH HAMZA BELOW */ ++ { 0x05c6, 0x0626 }, /* Arabic_hamzaonyeh ئ ARABIC LETTER YEH WITH HAMZA ABOVE */ ++ { 0x05c7, 0x0627 }, /* Arabic_alef ا ARABIC LETTER ALEF */ ++ { 0x05c8, 0x0628 }, /* Arabic_beh ب ARABIC LETTER BEH */ ++ { 0x05c9, 0x0629 }, /* Arabic_tehmarbuta ة ARABIC LETTER TEH MARBUTA */ ++ { 0x05ca, 0x062a }, /* Arabic_teh ت ARABIC LETTER TEH */ ++ { 0x05cb, 0x062b }, /* Arabic_theh ث ARABIC LETTER THEH */ ++ { 0x05cc, 0x062c }, /* Arabic_jeem ج ARABIC LETTER JEEM */ ++ { 0x05cd, 0x062d }, /* Arabic_hah ح ARABIC LETTER HAH */ ++ { 0x05ce, 0x062e }, /* Arabic_khah خ ARABIC LETTER KHAH */ ++ { 0x05cf, 0x062f }, /* Arabic_dal د ARABIC LETTER DAL */ ++ { 0x05d0, 0x0630 }, /* Arabic_thal ذ ARABIC LETTER THAL */ ++ { 0x05d1, 0x0631 }, /* Arabic_ra ر ARABIC LETTER REH */ ++ { 0x05d2, 0x0632 }, /* Arabic_zain ز ARABIC LETTER ZAIN */ ++ { 0x05d3, 0x0633 }, /* Arabic_seen س ARABIC LETTER SEEN */ ++ { 0x05d4, 0x0634 }, /* Arabic_sheen ش ARABIC LETTER SHEEN */ ++ { 0x05d5, 0x0635 }, /* Arabic_sad ص ARABIC LETTER SAD */ ++ { 0x05d6, 0x0636 }, /* Arabic_dad ض ARABIC LETTER DAD */ ++ { 0x05d7, 0x0637 }, /* Arabic_tah ط ARABIC LETTER TAH */ ++ { 0x05d8, 0x0638 }, /* Arabic_zah ظ ARABIC LETTER ZAH */ ++ { 0x05d9, 0x0639 }, /* Arabic_ain ع ARABIC LETTER AIN */ ++ { 0x05da, 0x063a }, /* Arabic_ghain غ ARABIC LETTER GHAIN */ ++ { 0x05e0, 0x0640 }, /* Arabic_tatweel ـ ARABIC TATWEEL */ ++ { 0x05e1, 0x0641 }, /* Arabic_feh ف ARABIC LETTER FEH */ ++ { 0x05e2, 0x0642 }, /* Arabic_qaf ق ARABIC LETTER QAF */ ++ { 0x05e3, 0x0643 }, /* Arabic_kaf ك ARABIC LETTER KAF */ ++ { 0x05e4, 0x0644 }, /* Arabic_lam ل ARABIC LETTER LAM */ ++ { 0x05e5, 0x0645 }, /* Arabic_meem م ARABIC LETTER MEEM */ ++ { 0x05e6, 0x0646 }, /* Arabic_noon ن ARABIC LETTER NOON */ ++ { 0x05e7, 0x0647 }, /* Arabic_ha ه ARABIC LETTER HEH */ ++ { 0x05e8, 0x0648 }, /* Arabic_waw و ARABIC LETTER WAW */ ++ { 0x05e9, 0x0649 }, /* Arabic_alefmaksura ى ARABIC LETTER ALEF MAKSURA */ ++ { 0x05ea, 0x064a }, /* Arabic_yeh ي ARABIC LETTER YEH */ ++ { 0x05eb, 0x064b }, /* Arabic_fathatan ً ARABIC FATHATAN */ ++ { 0x05ec, 0x064c }, /* Arabic_dammatan ٌ ARABIC DAMMATAN */ ++ { 0x05ed, 0x064d }, /* Arabic_kasratan ٍ ARABIC KASRATAN */ ++ { 0x05ee, 0x064e }, /* Arabic_fatha َ ARABIC FATHA */ ++ { 0x05ef, 0x064f }, /* Arabic_damma ُ ARABIC DAMMA */ ++ { 0x05f0, 0x0650 }, /* Arabic_kasra ِ ARABIC KASRA */ ++ { 0x05f1, 0x0651 }, /* Arabic_shadda ّ ARABIC SHADDA */ ++ { 0x05f2, 0x0652 }, /* Arabic_sukun ْ ARABIC SUKUN */ ++ { 0x06a1, 0x0452 }, /* Serbian_dje ђ CYRILLIC SMALL LETTER DJE */ ++ { 0x06a2, 0x0453 }, /* Macedonia_gje ѓ CYRILLIC SMALL LETTER GJE */ ++ { 0x06a3, 0x0451 }, /* Cyrillic_io ё CYRILLIC SMALL LETTER IO */ ++ { 0x06a4, 0x0454 }, /* Ukrainian_ie є CYRILLIC SMALL LETTER UKRAINIAN IE */ ++ { 0x06a5, 0x0455 }, /* Macedonia_dse ѕ CYRILLIC SMALL LETTER DZE */ ++ { 0x06a6, 0x0456 }, /* Ukrainian_i і CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I */ ++ { 0x06a7, 0x0457 }, /* Ukrainian_yi ї CYRILLIC SMALL LETTER YI */ ++ { 0x06a8, 0x0458 }, /* Cyrillic_je ј CYRILLIC SMALL LETTER JE */ ++ { 0x06a9, 0x0459 }, /* Cyrillic_lje љ CYRILLIC SMALL LETTER LJE */ ++ { 0x06aa, 0x045a }, /* Cyrillic_nje њ CYRILLIC SMALL LETTER NJE */ ++ { 0x06ab, 0x045b }, /* Serbian_tshe ћ CYRILLIC SMALL LETTER TSHE */ ++ { 0x06ac, 0x045c }, /* Macedonia_kje ќ CYRILLIC SMALL LETTER KJE */ ++ { 0x06ad, 0x0491 }, /* Ukrainian_ghe_with_upturn ґ CYRILLIC SMALL LETTER GHE WITH UPTURN */ ++ { 0x06ae, 0x045e }, /* Byelorussian_shortu ў CYRILLIC SMALL LETTER SHORT U */ ++ { 0x06af, 0x045f }, /* Cyrillic_dzhe џ CYRILLIC SMALL LETTER DZHE */ ++ { 0x06b0, 0x2116 }, /* numerosign № NUMERO SIGN */ ++ { 0x06b1, 0x0402 }, /* Serbian_DJE Ђ CYRILLIC CAPITAL LETTER DJE */ ++ { 0x06b2, 0x0403 }, /* Macedonia_GJE Ѓ CYRILLIC CAPITAL LETTER GJE */ ++ { 0x06b3, 0x0401 }, /* Cyrillic_IO Ё CYRILLIC CAPITAL LETTER IO */ ++ { 0x06b4, 0x0404 }, /* Ukrainian_IE Є CYRILLIC CAPITAL LETTER UKRAINIAN IE */ ++ { 0x06b5, 0x0405 }, /* Macedonia_DSE Ѕ CYRILLIC CAPITAL LETTER DZE */ ++ { 0x06b6, 0x0406 }, /* Ukrainian_I І CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */ ++ { 0x06b7, 0x0407 }, /* Ukrainian_YI Ї CYRILLIC CAPITAL LETTER YI */ ++ { 0x06b8, 0x0408 }, /* Cyrillic_JE Ј CYRILLIC CAPITAL LETTER JE */ ++ { 0x06b9, 0x0409 }, /* Cyrillic_LJE Љ CYRILLIC CAPITAL LETTER LJE */ ++ { 0x06ba, 0x040a }, /* Cyrillic_NJE Њ CYRILLIC CAPITAL LETTER NJE */ ++ { 0x06bb, 0x040b }, /* Serbian_TSHE Ћ CYRILLIC CAPITAL LETTER TSHE */ ++ { 0x06bc, 0x040c }, /* Macedonia_KJE Ќ CYRILLIC CAPITAL LETTER KJE */ ++ { 0x06bd, 0x0490 }, /* Ukrainian_GHE_WITH_UPTURN Ґ CYRILLIC CAPITAL LETTER GHE WITH UPTURN */ ++ { 0x06be, 0x040e }, /* Byelorussian_SHORTU Ў CYRILLIC CAPITAL LETTER SHORT U */ ++ { 0x06bf, 0x040f }, /* Cyrillic_DZHE Џ CYRILLIC CAPITAL LETTER DZHE */ ++ { 0x06c0, 0x044e }, /* Cyrillic_yu ю CYRILLIC SMALL LETTER YU */ ++ { 0x06c1, 0x0430 }, /* Cyrillic_a а CYRILLIC SMALL LETTER A */ ++ { 0x06c2, 0x0431 }, /* Cyrillic_be б CYRILLIC SMALL LETTER BE */ ++ { 0x06c3, 0x0446 }, /* Cyrillic_tse ц CYRILLIC SMALL LETTER TSE */ ++ { 0x06c4, 0x0434 }, /* Cyrillic_de д CYRILLIC SMALL LETTER DE */ ++ { 0x06c5, 0x0435 }, /* Cyrillic_ie е CYRILLIC SMALL LETTER IE */ ++ { 0x06c6, 0x0444 }, /* Cyrillic_ef ф CYRILLIC SMALL LETTER EF */ ++ { 0x06c7, 0x0433 }, /* Cyrillic_ghe г CYRILLIC SMALL LETTER GHE */ ++ { 0x06c8, 0x0445 }, /* Cyrillic_ha х CYRILLIC SMALL LETTER HA */ ++ { 0x06c9, 0x0438 }, /* Cyrillic_i и CYRILLIC SMALL LETTER I */ ++ { 0x06ca, 0x0439 }, /* Cyrillic_shorti й CYRILLIC SMALL LETTER SHORT I */ ++ { 0x06cb, 0x043a }, /* Cyrillic_ka к CYRILLIC SMALL LETTER KA */ ++ { 0x06cc, 0x043b }, /* Cyrillic_el л CYRILLIC SMALL LETTER EL */ ++ { 0x06cd, 0x043c }, /* Cyrillic_em м CYRILLIC SMALL LETTER EM */ ++ { 0x06ce, 0x043d }, /* Cyrillic_en н CYRILLIC SMALL LETTER EN */ ++ { 0x06cf, 0x043e }, /* Cyrillic_o о CYRILLIC SMALL LETTER O */ ++ { 0x06d0, 0x043f }, /* Cyrillic_pe п CYRILLIC SMALL LETTER PE */ ++ { 0x06d1, 0x044f }, /* Cyrillic_ya я CYRILLIC SMALL LETTER YA */ ++ { 0x06d2, 0x0440 }, /* Cyrillic_er р CYRILLIC SMALL LETTER ER */ ++ { 0x06d3, 0x0441 }, /* Cyrillic_es с CYRILLIC SMALL LETTER ES */ ++ { 0x06d4, 0x0442 }, /* Cyrillic_te т CYRILLIC SMALL LETTER TE */ ++ { 0x06d5, 0x0443 }, /* Cyrillic_u у CYRILLIC SMALL LETTER U */ ++ { 0x06d6, 0x0436 }, /* Cyrillic_zhe ж CYRILLIC SMALL LETTER ZHE */ ++ { 0x06d7, 0x0432 }, /* Cyrillic_ve в CYRILLIC SMALL LETTER VE */ ++ { 0x06d8, 0x044c }, /* Cyrillic_softsign ь CYRILLIC SMALL LETTER SOFT SIGN */ ++ { 0x06d9, 0x044b }, /* Cyrillic_yeru ы CYRILLIC SMALL LETTER YERU */ ++ { 0x06da, 0x0437 }, /* Cyrillic_ze з CYRILLIC SMALL LETTER ZE */ ++ { 0x06db, 0x0448 }, /* Cyrillic_sha ш CYRILLIC SMALL LETTER SHA */ ++ { 0x06dc, 0x044d }, /* Cyrillic_e э CYRILLIC SMALL LETTER E */ ++ { 0x06dd, 0x0449 }, /* Cyrillic_shcha щ CYRILLIC SMALL LETTER SHCHA */ ++ { 0x06de, 0x0447 }, /* Cyrillic_che ч CYRILLIC SMALL LETTER CHE */ ++ { 0x06df, 0x044a }, /* Cyrillic_hardsign ъ CYRILLIC SMALL LETTER HARD SIGN */ ++ { 0x06e0, 0x042e }, /* Cyrillic_YU Ю CYRILLIC CAPITAL LETTER YU */ ++ { 0x06e1, 0x0410 }, /* Cyrillic_A А CYRILLIC CAPITAL LETTER A */ ++ { 0x06e2, 0x0411 }, /* Cyrillic_BE Б CYRILLIC CAPITAL LETTER BE */ ++ { 0x06e3, 0x0426 }, /* Cyrillic_TSE Ц CYRILLIC CAPITAL LETTER TSE */ ++ { 0x06e4, 0x0414 }, /* Cyrillic_DE Д CYRILLIC CAPITAL LETTER DE */ ++ { 0x06e5, 0x0415 }, /* Cyrillic_IE Е CYRILLIC CAPITAL LETTER IE */ ++ { 0x06e6, 0x0424 }, /* Cyrillic_EF Ф CYRILLIC CAPITAL LETTER EF */ ++ { 0x06e7, 0x0413 }, /* Cyrillic_GHE Г CYRILLIC CAPITAL LETTER GHE */ ++ { 0x06e8, 0x0425 }, /* Cyrillic_HA Х CYRILLIC CAPITAL LETTER HA */ ++ { 0x06e9, 0x0418 }, /* Cyrillic_I И CYRILLIC CAPITAL LETTER I */ ++ { 0x06ea, 0x0419 }, /* Cyrillic_SHORTI Й CYRILLIC CAPITAL LETTER SHORT I */ ++ { 0x06eb, 0x041a }, /* Cyrillic_KA К CYRILLIC CAPITAL LETTER KA */ ++ { 0x06ec, 0x041b }, /* Cyrillic_EL Л CYRILLIC CAPITAL LETTER EL */ ++ { 0x06ed, 0x041c }, /* Cyrillic_EM М CYRILLIC CAPITAL LETTER EM */ ++ { 0x06ee, 0x041d }, /* Cyrillic_EN Н CYRILLIC CAPITAL LETTER EN */ ++ { 0x06ef, 0x041e }, /* Cyrillic_O О CYRILLIC CAPITAL LETTER O */ ++ { 0x06f0, 0x041f }, /* Cyrillic_PE П CYRILLIC CAPITAL LETTER PE */ ++ { 0x06f1, 0x042f }, /* Cyrillic_YA Я CYRILLIC CAPITAL LETTER YA */ ++ { 0x06f2, 0x0420 }, /* Cyrillic_ER Р CYRILLIC CAPITAL LETTER ER */ ++ { 0x06f3, 0x0421 }, /* Cyrillic_ES С CYRILLIC CAPITAL LETTER ES */ ++ { 0x06f4, 0x0422 }, /* Cyrillic_TE Т CYRILLIC CAPITAL LETTER TE */ ++ { 0x06f5, 0x0423 }, /* Cyrillic_U У CYRILLIC CAPITAL LETTER U */ ++ { 0x06f6, 0x0416 }, /* Cyrillic_ZHE Ж CYRILLIC CAPITAL LETTER ZHE */ ++ { 0x06f7, 0x0412 }, /* Cyrillic_VE В CYRILLIC CAPITAL LETTER VE */ ++ { 0x06f8, 0x042c }, /* Cyrillic_SOFTSIGN Ь CYRILLIC CAPITAL LETTER SOFT SIGN */ ++ { 0x06f9, 0x042b }, /* Cyrillic_YERU Ы CYRILLIC CAPITAL LETTER YERU */ ++ { 0x06fa, 0x0417 }, /* Cyrillic_ZE З CYRILLIC CAPITAL LETTER ZE */ ++ { 0x06fb, 0x0428 }, /* Cyrillic_SHA Ш CYRILLIC CAPITAL LETTER SHA */ ++ { 0x06fc, 0x042d }, /* Cyrillic_E Э CYRILLIC CAPITAL LETTER E */ ++ { 0x06fd, 0x0429 }, /* Cyrillic_SHCHA Щ CYRILLIC CAPITAL LETTER SHCHA */ ++ { 0x06fe, 0x0427 }, /* Cyrillic_CHE Ч CYRILLIC CAPITAL LETTER CHE */ ++ { 0x06ff, 0x042a }, /* Cyrillic_HARDSIGN Ъ CYRILLIC CAPITAL LETTER HARD SIGN */ ++ { 0x07a1, 0x0386 }, /* Greek_ALPHAaccent Ά GREEK CAPITAL LETTER ALPHA WITH TONOS */ ++ { 0x07a2, 0x0388 }, /* Greek_EPSILONaccent Έ GREEK CAPITAL LETTER EPSILON WITH TONOS */ ++ { 0x07a3, 0x0389 }, /* Greek_ETAaccent Ή GREEK CAPITAL LETTER ETA WITH TONOS */ ++ { 0x07a4, 0x038a }, /* Greek_IOTAaccent Ί GREEK CAPITAL LETTER IOTA WITH TONOS */ ++ { 0x07a5, 0x03aa }, /* Greek_IOTAdieresis Ϊ GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */ ++ { 0x07a7, 0x038c }, /* Greek_OMICRONaccent Ό GREEK CAPITAL LETTER OMICRON WITH TONOS */ ++ { 0x07a8, 0x038e }, /* Greek_UPSILONaccent Ύ GREEK CAPITAL LETTER UPSILON WITH TONOS */ ++ { 0x07a9, 0x03ab }, /* Greek_UPSILONdieresis Ϋ GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */ ++ { 0x07ab, 0x038f }, /* Greek_OMEGAaccent Ώ GREEK CAPITAL LETTER OMEGA WITH TONOS */ ++ { 0x07ae, 0x0385 }, /* Greek_accentdieresis ΅ GREEK DIALYTIKA TONOS */ ++ { 0x07af, 0x2015 }, /* Greek_horizbar ― HORIZONTAL BAR */ ++ { 0x07b1, 0x03ac }, /* Greek_alphaaccent ά GREEK SMALL LETTER ALPHA WITH TONOS */ ++ { 0x07b2, 0x03ad }, /* Greek_epsilonaccent έ GREEK SMALL LETTER EPSILON WITH TONOS */ ++ { 0x07b3, 0x03ae }, /* Greek_etaaccent ή GREEK SMALL LETTER ETA WITH TONOS */ ++ { 0x07b4, 0x03af }, /* Greek_iotaaccent ί GREEK SMALL LETTER IOTA WITH TONOS */ ++ { 0x07b5, 0x03ca }, /* Greek_iotadieresis ϊ GREEK SMALL LETTER IOTA WITH DIALYTIKA */ ++ { 0x07b6, 0x0390 }, /* Greek_iotaaccentdieresis ΐ GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */ ++ { 0x07b7, 0x03cc }, /* Greek_omicronaccent ό GREEK SMALL LETTER OMICRON WITH TONOS */ ++ { 0x07b8, 0x03cd }, /* Greek_upsilonaccent ύ GREEK SMALL LETTER UPSILON WITH TONOS */ ++ { 0x07b9, 0x03cb }, /* Greek_upsilondieresis ϋ GREEK SMALL LETTER UPSILON WITH DIALYTIKA */ ++ { 0x07ba, 0x03b0 }, /* Greek_upsilonaccentdieresis ΰ GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */ ++ { 0x07bb, 0x03ce }, /* Greek_omegaaccent ώ GREEK SMALL LETTER OMEGA WITH TONOS */ ++ { 0x07c1, 0x0391 }, /* Greek_ALPHA Α GREEK CAPITAL LETTER ALPHA */ ++ { 0x07c2, 0x0392 }, /* Greek_BETA Β GREEK CAPITAL LETTER BETA */ ++ { 0x07c3, 0x0393 }, /* Greek_GAMMA Γ GREEK CAPITAL LETTER GAMMA */ ++ { 0x07c4, 0x0394 }, /* Greek_DELTA Δ GREEK CAPITAL LETTER DELTA */ ++ { 0x07c5, 0x0395 }, /* Greek_EPSILON Ε GREEK CAPITAL LETTER EPSILON */ ++ { 0x07c6, 0x0396 }, /* Greek_ZETA Ζ GREEK CAPITAL LETTER ZETA */ ++ { 0x07c7, 0x0397 }, /* Greek_ETA Η GREEK CAPITAL LETTER ETA */ ++ { 0x07c8, 0x0398 }, /* Greek_THETA Θ GREEK CAPITAL LETTER THETA */ ++ { 0x07c9, 0x0399 }, /* Greek_IOTA Ι GREEK CAPITAL LETTER IOTA */ ++ { 0x07ca, 0x039a }, /* Greek_KAPPA Κ GREEK CAPITAL LETTER KAPPA */ ++ { 0x07cb, 0x039b }, /* Greek_LAMBDA Λ GREEK CAPITAL LETTER LAMDA */ ++ { 0x07cc, 0x039c }, /* Greek_MU Μ GREEK CAPITAL LETTER MU */ ++ { 0x07cd, 0x039d }, /* Greek_NU Ν GREEK CAPITAL LETTER NU */ ++ { 0x07ce, 0x039e }, /* Greek_XI Ξ GREEK CAPITAL LETTER XI */ ++ { 0x07cf, 0x039f }, /* Greek_OMICRON Ο GREEK CAPITAL LETTER OMICRON */ ++ { 0x07d0, 0x03a0 }, /* Greek_PI Π GREEK CAPITAL LETTER PI */ ++ { 0x07d1, 0x03a1 }, /* Greek_RHO Ρ GREEK CAPITAL LETTER RHO */ ++ { 0x07d2, 0x03a3 }, /* Greek_SIGMA Σ GREEK CAPITAL LETTER SIGMA */ ++ { 0x07d4, 0x03a4 }, /* Greek_TAU Τ GREEK CAPITAL LETTER TAU */ ++ { 0x07d5, 0x03a5 }, /* Greek_UPSILON Υ GREEK CAPITAL LETTER UPSILON */ ++ { 0x07d6, 0x03a6 }, /* Greek_PHI Φ GREEK CAPITAL LETTER PHI */ ++ { 0x07d7, 0x03a7 }, /* Greek_CHI Χ GREEK CAPITAL LETTER CHI */ ++ { 0x07d8, 0x03a8 }, /* Greek_PSI Ψ GREEK CAPITAL LETTER PSI */ ++ { 0x07d9, 0x03a9 }, /* Greek_OMEGA Ω GREEK CAPITAL LETTER OMEGA */ ++ { 0x07e1, 0x03b1 }, /* Greek_alpha α GREEK SMALL LETTER ALPHA */ ++ { 0x07e2, 0x03b2 }, /* Greek_beta β GREEK SMALL LETTER BETA */ ++ { 0x07e3, 0x03b3 }, /* Greek_gamma γ GREEK SMALL LETTER GAMMA */ ++ { 0x07e4, 0x03b4 }, /* Greek_delta δ GREEK SMALL LETTER DELTA */ ++ { 0x07e5, 0x03b5 }, /* Greek_epsilon ε GREEK SMALL LETTER EPSILON */ ++ { 0x07e6, 0x03b6 }, /* Greek_zeta ζ GREEK SMALL LETTER ZETA */ ++ { 0x07e7, 0x03b7 }, /* Greek_eta η GREEK SMALL LETTER ETA */ ++ { 0x07e8, 0x03b8 }, /* Greek_theta θ GREEK SMALL LETTER THETA */ ++ { 0x07e9, 0x03b9 }, /* Greek_iota ι GREEK SMALL LETTER IOTA */ ++ { 0x07ea, 0x03ba }, /* Greek_kappa κ GREEK SMALL LETTER KAPPA */ ++ { 0x07eb, 0x03bb }, /* Greek_lambda λ GREEK SMALL LETTER LAMDA */ ++ { 0x07ec, 0x03bc }, /* Greek_mu μ GREEK SMALL LETTER MU */ ++ { 0x07ed, 0x03bd }, /* Greek_nu ν GREEK SMALL LETTER NU */ ++ { 0x07ee, 0x03be }, /* Greek_xi ξ GREEK SMALL LETTER XI */ ++ { 0x07ef, 0x03bf }, /* Greek_omicron ο GREEK SMALL LETTER OMICRON */ ++ { 0x07f0, 0x03c0 }, /* Greek_pi π GREEK SMALL LETTER PI */ ++ { 0x07f1, 0x03c1 }, /* Greek_rho ρ GREEK SMALL LETTER RHO */ ++ { 0x07f2, 0x03c3 }, /* Greek_sigma σ GREEK SMALL LETTER SIGMA */ ++ { 0x07f3, 0x03c2 }, /* Greek_finalsmallsigma ς GREEK SMALL LETTER FINAL SIGMA */ ++ { 0x07f4, 0x03c4 }, /* Greek_tau τ GREEK SMALL LETTER TAU */ ++ { 0x07f5, 0x03c5 }, /* Greek_upsilon υ GREEK SMALL LETTER UPSILON */ ++ { 0x07f6, 0x03c6 }, /* Greek_phi φ GREEK SMALL LETTER PHI */ ++ { 0x07f7, 0x03c7 }, /* Greek_chi χ GREEK SMALL LETTER CHI */ ++ { 0x07f8, 0x03c8 }, /* Greek_psi ψ GREEK SMALL LETTER PSI */ ++ { 0x07f9, 0x03c9 }, /* Greek_omega ω GREEK SMALL LETTER OMEGA */ ++ /* 0x08a1 leftradical ? ??? */ ++ /* 0x08a2 topleftradical ? ??? */ ++ /* 0x08a3 horizconnector ? ??? */ ++ { 0x08a4, 0x2320 }, /* topintegral ⌠ TOP HALF INTEGRAL */ ++ { 0x08a5, 0x2321 }, /* botintegral ⌡ BOTTOM HALF INTEGRAL */ ++ { 0x08a6, 0x2502 }, /* vertconnector │ BOX DRAWINGS LIGHT VERTICAL */ ++ /* 0x08a7 topleftsqbracket ? ??? */ ++ /* 0x08a8 botleftsqbracket ? ??? */ ++ /* 0x08a9 toprightsqbracket ? ??? */ ++ /* 0x08aa botrightsqbracket ? ??? */ ++ /* 0x08ab topleftparens ? ??? */ ++ /* 0x08ac botleftparens ? ??? */ ++ /* 0x08ad toprightparens ? ??? */ ++ /* 0x08ae botrightparens ? ??? */ ++ /* 0x08af leftmiddlecurlybrace ? ??? */ ++ /* 0x08b0 rightmiddlecurlybrace ? ??? */ ++ /* 0x08b1 topleftsummation ? ??? */ ++ /* 0x08b2 botleftsummation ? ??? */ ++ /* 0x08b3 topvertsummationconnector ? ??? */ ++ /* 0x08b4 botvertsummationconnector ? ??? */ ++ /* 0x08b5 toprightsummation ? ??? */ ++ /* 0x08b6 botrightsummation ? ??? */ ++ /* 0x08b7 rightmiddlesummation ? ??? */ ++ { 0x08bc, 0x2264 }, /* lessthanequal ≤ LESS-THAN OR EQUAL TO */ ++ { 0x08bd, 0x2260 }, /* notequal ≠ NOT EQUAL TO */ ++ { 0x08be, 0x2265 }, /* greaterthanequal ≥ GREATER-THAN OR EQUAL TO */ ++ { 0x08bf, 0x222b }, /* integral ∫ INTEGRAL */ ++ { 0x08c0, 0x2234 }, /* therefore ∴ THEREFORE */ ++ { 0x08c1, 0x221d }, /* variation ∝ PROPORTIONAL TO */ ++ { 0x08c2, 0x221e }, /* infinity ∞ INFINITY */ ++ { 0x08c5, 0x2207 }, /* nabla ∇ NABLA */ ++ { 0x08c8, 0x2245 }, /* approximate ≅ APPROXIMATELY EQUAL TO */ ++ /* 0x08c9 similarequal ? ??? */ ++ { 0x08cd, 0x21d4 }, /* ifonlyif ⇔ LEFT RIGHT DOUBLE ARROW */ ++ { 0x08ce, 0x21d2 }, /* implies ⇒ RIGHTWARDS DOUBLE ARROW */ ++ { 0x08cf, 0x2261 }, /* identical ≡ IDENTICAL TO */ ++ { 0x08d6, 0x221a }, /* radical √ SQUARE ROOT */ ++ { 0x08da, 0x2282 }, /* includedin ⊂ SUBSET OF */ ++ { 0x08db, 0x2283 }, /* includes ⊃ SUPERSET OF */ ++ { 0x08dc, 0x2229 }, /* intersection ∩ INTERSECTION */ ++ { 0x08dd, 0x222a }, /* union ∪ UNION */ ++ { 0x08de, 0x2227 }, /* logicaland ∧ LOGICAL AND */ ++ { 0x08df, 0x2228 }, /* logicalor ∨ LOGICAL OR */ ++ { 0x08ef, 0x2202 }, /* partialderivative ∂ PARTIAL DIFFERENTIAL */ ++ { 0x08f6, 0x0192 }, /* function ƒ LATIN SMALL LETTER F WITH HOOK */ ++ { 0x08fb, 0x2190 }, /* leftarrow ← LEFTWARDS ARROW */ ++ { 0x08fc, 0x2191 }, /* uparrow ↑ UPWARDS ARROW */ ++ { 0x08fd, 0x2192 }, /* rightarrow → RIGHTWARDS ARROW */ ++ { 0x08fe, 0x2193 }, /* downarrow ↓ DOWNWARDS ARROW */ ++ { 0x09df, 0x2422 }, /* blank ␢ BLANK SYMBOL */ ++ { 0x09e0, 0x25c6 }, /* soliddiamond ◆ BLACK DIAMOND */ ++ { 0x09e1, 0x2592 }, /* checkerboard ▒ MEDIUM SHADE */ ++ { 0x09e2, 0x2409 }, /* ht ␉ SYMBOL FOR HORIZONTAL TABULATION */ ++ { 0x09e3, 0x240c }, /* ff ␌ SYMBOL FOR FORM FEED */ ++ { 0x09e4, 0x240d }, /* cr ␍ SYMBOL FOR CARRIAGE RETURN */ ++ { 0x09e5, 0x240a }, /* lf ␊ SYMBOL FOR LINE FEED */ ++ { 0x09e8, 0x2424 }, /* nl ␤ SYMBOL FOR NEWLINE */ ++ { 0x09e9, 0x240b }, /* vt ␋ SYMBOL FOR VERTICAL TABULATION */ ++ { 0x09ea, 0x2518 }, /* lowrightcorner ┘ BOX DRAWINGS LIGHT UP AND LEFT */ ++ { 0x09eb, 0x2510 }, /* uprightcorner ┐ BOX DRAWINGS LIGHT DOWN AND LEFT */ ++ { 0x09ec, 0x250c }, /* upleftcorner ┌ BOX DRAWINGS LIGHT DOWN AND RIGHT */ ++ { 0x09ed, 0x2514 }, /* lowleftcorner └ BOX DRAWINGS LIGHT UP AND RIGHT */ ++ { 0x09ee, 0x253c }, /* crossinglines ┼ BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */ ++ /* 0x09ef horizlinescan1 ? ??? */ ++ /* 0x09f0 horizlinescan3 ? ??? */ ++ { 0x09f1, 0x2500 }, /* horizlinescan5 ─ BOX DRAWINGS LIGHT HORIZONTAL */ ++ /* 0x09f2 horizlinescan7 ? ??? */ ++ /* 0x09f3 horizlinescan9 ? ??? */ ++ { 0x09f4, 0x251c }, /* leftt ├ BOX DRAWINGS LIGHT VERTICAL AND RIGHT */ ++ { 0x09f5, 0x2524 }, /* rightt ┤ BOX DRAWINGS LIGHT VERTICAL AND LEFT */ ++ { 0x09f6, 0x2534 }, /* bott ┴ BOX DRAWINGS LIGHT UP AND HORIZONTAL */ ++ { 0x09f7, 0x252c }, /* topt ┬ BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */ ++ { 0x09f8, 0x2502 }, /* vertbar │ BOX DRAWINGS LIGHT VERTICAL */ ++ { 0x0aa1, 0x2003 }, /* emspace   EM SPACE */ ++ { 0x0aa2, 0x2002 }, /* enspace   EN SPACE */ ++ { 0x0aa3, 0x2004 }, /* em3space   THREE-PER-EM SPACE */ ++ { 0x0aa4, 0x2005 }, /* em4space   FOUR-PER-EM SPACE */ ++ { 0x0aa5, 0x2007 }, /* digitspace   FIGURE SPACE */ ++ { 0x0aa6, 0x2008 }, /* punctspace   PUNCTUATION SPACE */ ++ { 0x0aa7, 0x2009 }, /* thinspace   THIN SPACE */ ++ { 0x0aa8, 0x200a }, /* hairspace   HAIR SPACE */ ++ { 0x0aa9, 0x2014 }, /* emdash — EM DASH */ ++ { 0x0aaa, 0x2013 }, /* endash – EN DASH */ ++ /* 0x0aac signifblank ? ??? */ ++ { 0x0aae, 0x2026 }, /* ellipsis … HORIZONTAL ELLIPSIS */ ++ /* 0x0aaf doubbaselinedot ? ??? */ ++ { 0x0ab0, 0x2153 }, /* onethird ⅓ VULGAR FRACTION ONE THIRD */ ++ { 0x0ab1, 0x2154 }, /* twothirds ⅔ VULGAR FRACTION TWO THIRDS */ ++ { 0x0ab2, 0x2155 }, /* onefifth ⅕ VULGAR FRACTION ONE FIFTH */ ++ { 0x0ab3, 0x2156 }, /* twofifths ⅖ VULGAR FRACTION TWO FIFTHS */ ++ { 0x0ab4, 0x2157 }, /* threefifths ⅗ VULGAR FRACTION THREE FIFTHS */ ++ { 0x0ab5, 0x2158 }, /* fourfifths ⅘ VULGAR FRACTION FOUR FIFTHS */ ++ { 0x0ab6, 0x2159 }, /* onesixth ⅙ VULGAR FRACTION ONE SIXTH */ ++ { 0x0ab7, 0x215a }, /* fivesixths ⅚ VULGAR FRACTION FIVE SIXTHS */ ++ { 0x0ab8, 0x2105 }, /* careof ℅ CARE OF */ ++ { 0x0abb, 0x2012 }, /* figdash ‒ FIGURE DASH */ ++ { 0x0abc, 0x2329 }, /* leftanglebracket 〈 LEFT-POINTING ANGLE BRACKET */ ++ { 0x0abd, 0x002e }, /* decimalpoint . FULL STOP */ ++ { 0x0abe, 0x232a }, /* rightanglebracket 〉 RIGHT-POINTING ANGLE BRACKET */ ++ /* 0x0abf marker ? ??? */ ++ { 0x0ac3, 0x215b }, /* oneeighth ⅛ VULGAR FRACTION ONE EIGHTH */ ++ { 0x0ac4, 0x215c }, /* threeeighths ⅜ VULGAR FRACTION THREE EIGHTHS */ ++ { 0x0ac5, 0x215d }, /* fiveeighths ⅝ VULGAR FRACTION FIVE EIGHTHS */ ++ { 0x0ac6, 0x215e }, /* seveneighths ⅞ VULGAR FRACTION SEVEN EIGHTHS */ ++ { 0x0ac9, 0x2122 }, /* trademark ™ TRADE MARK SIGN */ ++ { 0x0aca, 0x2613 }, /* signaturemark ☓ SALTIRE */ ++ /* 0x0acb trademarkincircle ? ??? */ ++ { 0x0acc, 0x25c1 }, /* leftopentriangle ◁ WHITE LEFT-POINTING TRIANGLE */ ++ { 0x0acd, 0x25b7 }, /* rightopentriangle ▷ WHITE RIGHT-POINTING TRIANGLE */ ++ { 0x0ace, 0x25cb }, /* emopencircle ○ WHITE CIRCLE */ ++ { 0x0acf, 0x25a1 }, /* emopenrectangle □ WHITE SQUARE */ ++ { 0x0ad0, 0x2018 }, /* leftsinglequotemark ‘ LEFT SINGLE QUOTATION MARK */ ++ { 0x0ad1, 0x2019 }, /* rightsinglequotemark ’ RIGHT SINGLE QUOTATION MARK */ ++ { 0x0ad2, 0x201c }, /* leftdoublequotemark “ LEFT DOUBLE QUOTATION MARK */ ++ { 0x0ad3, 0x201d }, /* rightdoublequotemark ” RIGHT DOUBLE QUOTATION MARK */ ++ { 0x0ad4, 0x211e }, /* prescription ℞ PRESCRIPTION TAKE */ ++ { 0x0ad6, 0x2032 }, /* minutes ′ PRIME */ ++ { 0x0ad7, 0x2033 }, /* seconds ″ DOUBLE PRIME */ ++ { 0x0ad9, 0x271d }, /* latincross ✝ LATIN CROSS */ ++ /* 0x0ada hexagram ? ??? */ ++ { 0x0adb, 0x25ac }, /* filledrectbullet ▬ BLACK RECTANGLE */ ++ { 0x0adc, 0x25c0 }, /* filledlefttribullet ◀ BLACK LEFT-POINTING TRIANGLE */ ++ { 0x0add, 0x25b6 }, /* filledrighttribullet ▶ BLACK RIGHT-POINTING TRIANGLE */ ++ { 0x0ade, 0x25cf }, /* emfilledcircle ● BLACK CIRCLE */ ++ { 0x0adf, 0x25a0 }, /* emfilledrect ■ BLACK SQUARE */ ++ { 0x0ae0, 0x25e6 }, /* enopencircbullet ◦ WHITE BULLET */ ++ { 0x0ae1, 0x25ab }, /* enopensquarebullet ▫ WHITE SMALL SQUARE */ ++ { 0x0ae2, 0x25ad }, /* openrectbullet ▭ WHITE RECTANGLE */ ++ { 0x0ae3, 0x25b3 }, /* opentribulletup △ WHITE UP-POINTING TRIANGLE */ ++ { 0x0ae4, 0x25bd }, /* opentribulletdown ▽ WHITE DOWN-POINTING TRIANGLE */ ++ { 0x0ae5, 0x2606 }, /* openstar ☆ WHITE STAR */ ++ { 0x0ae6, 0x2022 }, /* enfilledcircbullet • BULLET */ ++ { 0x0ae7, 0x25aa }, /* enfilledsqbullet ▪ BLACK SMALL SQUARE */ ++ { 0x0ae8, 0x25b2 }, /* filledtribulletup ▲ BLACK UP-POINTING TRIANGLE */ ++ { 0x0ae9, 0x25bc }, /* filledtribulletdown ▼ BLACK DOWN-POINTING TRIANGLE */ ++ { 0x0aea, 0x261c }, /* leftpointer ☜ WHITE LEFT POINTING INDEX */ ++ { 0x0aeb, 0x261e }, /* rightpointer ☞ WHITE RIGHT POINTING INDEX */ ++ { 0x0aec, 0x2663 }, /* club ♣ BLACK CLUB SUIT */ ++ { 0x0aed, 0x2666 }, /* diamond ♦ BLACK DIAMOND SUIT */ ++ { 0x0aee, 0x2665 }, /* heart ♥ BLACK HEART SUIT */ ++ { 0x0af0, 0x2720 }, /* maltesecross ✠ MALTESE CROSS */ ++ { 0x0af1, 0x2020 }, /* dagger † DAGGER */ ++ { 0x0af2, 0x2021 }, /* doubledagger ‡ DOUBLE DAGGER */ ++ { 0x0af3, 0x2713 }, /* checkmark ✓ CHECK MARK */ ++ { 0x0af4, 0x2717 }, /* ballotcross ✗ BALLOT X */ ++ { 0x0af5, 0x266f }, /* musicalsharp ♯ MUSIC SHARP SIGN */ ++ { 0x0af6, 0x266d }, /* musicalflat ♭ MUSIC FLAT SIGN */ ++ { 0x0af7, 0x2642 }, /* malesymbol ♂ MALE SIGN */ ++ { 0x0af8, 0x2640 }, /* femalesymbol ♀ FEMALE SIGN */ ++ { 0x0af9, 0x260e }, /* telephone ☎ BLACK TELEPHONE */ ++ { 0x0afa, 0x2315 }, /* telephonerecorder ⌕ TELEPHONE RECORDER */ ++ { 0x0afb, 0x2117 }, /* phonographcopyright ℗ SOUND RECORDING COPYRIGHT */ ++ { 0x0afc, 0x2038 }, /* caret ‸ CARET */ ++ { 0x0afd, 0x201a }, /* singlelowquotemark ‚ SINGLE LOW-9 QUOTATION MARK */ ++ { 0x0afe, 0x201e }, /* doublelowquotemark „ DOUBLE LOW-9 QUOTATION MARK */ ++ /* 0x0aff cursor ? ??? */ ++ { 0x0ba3, 0x003c }, /* leftcaret < LESS-THAN SIGN */ ++ { 0x0ba6, 0x003e }, /* rightcaret > GREATER-THAN SIGN */ ++ { 0x0ba8, 0x2228 }, /* downcaret ∨ LOGICAL OR */ ++ { 0x0ba9, 0x2227 }, /* upcaret ∧ LOGICAL AND */ ++ { 0x0bc0, 0x00af }, /* overbar ¯ MACRON */ ++ { 0x0bc2, 0x22a4 }, /* downtack ⊤ DOWN TACK */ ++ { 0x0bc3, 0x2229 }, /* upshoe ∩ INTERSECTION */ ++ { 0x0bc4, 0x230a }, /* downstile ⌊ LEFT FLOOR */ ++ { 0x0bc6, 0x005f }, /* underbar _ LOW LINE */ ++ { 0x0bca, 0x2218 }, /* jot ∘ RING OPERATOR */ ++ { 0x0bcc, 0x2395 }, /* quad ⎕ APL FUNCTIONAL SYMBOL QUAD (Unicode 3.0) */ ++ { 0x0bce, 0x22a5 }, /* uptack ⊥ UP TACK */ ++ { 0x0bcf, 0x25cb }, /* circle ○ WHITE CIRCLE */ ++ { 0x0bd3, 0x2308 }, /* upstile ⌈ LEFT CEILING */ ++ { 0x0bd6, 0x222a }, /* downshoe ∪ UNION */ ++ { 0x0bd8, 0x2283 }, /* rightshoe ⊃ SUPERSET OF */ ++ { 0x0bda, 0x2282 }, /* leftshoe ⊂ SUBSET OF */ ++ { 0x0bdc, 0x22a3 }, /* lefttack ⊣ LEFT TACK */ ++ { 0x0bfc, 0x22a2 }, /* righttack ⊢ RIGHT TACK */ ++ { 0x0cdf, 0x2017 }, /* hebrew_doublelowline ‗ DOUBLE LOW LINE */ ++ { 0x0ce0, 0x05d0 }, /* hebrew_aleph א HEBREW LETTER ALEF */ ++ { 0x0ce1, 0x05d1 }, /* hebrew_bet ב HEBREW LETTER BET */ ++ { 0x0ce2, 0x05d2 }, /* hebrew_gimel ג HEBREW LETTER GIMEL */ ++ { 0x0ce3, 0x05d3 }, /* hebrew_dalet ד HEBREW LETTER DALET */ ++ { 0x0ce4, 0x05d4 }, /* hebrew_he ה HEBREW LETTER HE */ ++ { 0x0ce5, 0x05d5 }, /* hebrew_waw ו HEBREW LETTER VAV */ ++ { 0x0ce6, 0x05d6 }, /* hebrew_zain ז HEBREW LETTER ZAYIN */ ++ { 0x0ce7, 0x05d7 }, /* hebrew_chet ח HEBREW LETTER HET */ ++ { 0x0ce8, 0x05d8 }, /* hebrew_tet ט HEBREW LETTER TET */ ++ { 0x0ce9, 0x05d9 }, /* hebrew_yod י HEBREW LETTER YOD */ ++ { 0x0cea, 0x05da }, /* hebrew_finalkaph ך HEBREW LETTER FINAL KAF */ ++ { 0x0ceb, 0x05db }, /* hebrew_kaph כ HEBREW LETTER KAF */ ++ { 0x0cec, 0x05dc }, /* hebrew_lamed ל HEBREW LETTER LAMED */ ++ { 0x0ced, 0x05dd }, /* hebrew_finalmem ם HEBREW LETTER FINAL MEM */ ++ { 0x0cee, 0x05de }, /* hebrew_mem מ HEBREW LETTER MEM */ ++ { 0x0cef, 0x05df }, /* hebrew_finalnun ן HEBREW LETTER FINAL NUN */ ++ { 0x0cf0, 0x05e0 }, /* hebrew_nun נ HEBREW LETTER NUN */ ++ { 0x0cf1, 0x05e1 }, /* hebrew_samech ס HEBREW LETTER SAMEKH */ ++ { 0x0cf2, 0x05e2 }, /* hebrew_ayin ע HEBREW LETTER AYIN */ ++ { 0x0cf3, 0x05e3 }, /* hebrew_finalpe ף HEBREW LETTER FINAL PE */ ++ { 0x0cf4, 0x05e4 }, /* hebrew_pe פ HEBREW LETTER PE */ ++ { 0x0cf5, 0x05e5 }, /* hebrew_finalzade ץ HEBREW LETTER FINAL TSADI */ ++ { 0x0cf6, 0x05e6 }, /* hebrew_zade צ HEBREW LETTER TSADI */ ++ { 0x0cf7, 0x05e7 }, /* hebrew_qoph ק HEBREW LETTER QOF */ ++ { 0x0cf8, 0x05e8 }, /* hebrew_resh ר HEBREW LETTER RESH */ ++ { 0x0cf9, 0x05e9 }, /* hebrew_shin ש HEBREW LETTER SHIN */ ++ { 0x0cfa, 0x05ea }, /* hebrew_taw ת HEBREW LETTER TAV */ ++ { 0x0da1, 0x0e01 }, /* Thai_kokai ก THAI CHARACTER KO KAI */ ++ { 0x0da2, 0x0e02 }, /* Thai_khokhai ข THAI CHARACTER KHO KHAI */ ++ { 0x0da3, 0x0e03 }, /* Thai_khokhuat ฃ THAI CHARACTER KHO KHUAT */ ++ { 0x0da4, 0x0e04 }, /* Thai_khokhwai ค THAI CHARACTER KHO KHWAI */ ++ { 0x0da5, 0x0e05 }, /* Thai_khokhon ฅ THAI CHARACTER KHO KHON */ ++ { 0x0da6, 0x0e06 }, /* Thai_khorakhang ฆ THAI CHARACTER KHO RAKHANG */ ++ { 0x0da7, 0x0e07 }, /* Thai_ngongu ง THAI CHARACTER NGO NGU */ ++ { 0x0da8, 0x0e08 }, /* Thai_chochan จ THAI CHARACTER CHO CHAN */ ++ { 0x0da9, 0x0e09 }, /* Thai_choching ฉ THAI CHARACTER CHO CHING */ ++ { 0x0daa, 0x0e0a }, /* Thai_chochang ช THAI CHARACTER CHO CHANG */ ++ { 0x0dab, 0x0e0b }, /* Thai_soso ซ THAI CHARACTER SO SO */ ++ { 0x0dac, 0x0e0c }, /* Thai_chochoe ฌ THAI CHARACTER CHO CHOE */ ++ { 0x0dad, 0x0e0d }, /* Thai_yoying ญ THAI CHARACTER YO YING */ ++ { 0x0dae, 0x0e0e }, /* Thai_dochada ฎ THAI CHARACTER DO CHADA */ ++ { 0x0daf, 0x0e0f }, /* Thai_topatak ฏ THAI CHARACTER TO PATAK */ ++ { 0x0db0, 0x0e10 }, /* Thai_thothan ฐ THAI CHARACTER THO THAN */ ++ { 0x0db1, 0x0e11 }, /* Thai_thonangmontho ฑ THAI CHARACTER THO NANGMONTHO */ ++ { 0x0db2, 0x0e12 }, /* Thai_thophuthao ฒ THAI CHARACTER THO PHUTHAO */ ++ { 0x0db3, 0x0e13 }, /* Thai_nonen ณ THAI CHARACTER NO NEN */ ++ { 0x0db4, 0x0e14 }, /* Thai_dodek ด THAI CHARACTER DO DEK */ ++ { 0x0db5, 0x0e15 }, /* Thai_totao ต THAI CHARACTER TO TAO */ ++ { 0x0db6, 0x0e16 }, /* Thai_thothung ถ THAI CHARACTER THO THUNG */ ++ { 0x0db7, 0x0e17 }, /* Thai_thothahan ท THAI CHARACTER THO THAHAN */ ++ { 0x0db8, 0x0e18 }, /* Thai_thothong ธ THAI CHARACTER THO THONG */ ++ { 0x0db9, 0x0e19 }, /* Thai_nonu น THAI CHARACTER NO NU */ ++ { 0x0dba, 0x0e1a }, /* Thai_bobaimai บ THAI CHARACTER BO BAIMAI */ ++ { 0x0dbb, 0x0e1b }, /* Thai_popla ป THAI CHARACTER PO PLA */ ++ { 0x0dbc, 0x0e1c }, /* Thai_phophung ผ THAI CHARACTER PHO PHUNG */ ++ { 0x0dbd, 0x0e1d }, /* Thai_fofa ฝ THAI CHARACTER FO FA */ ++ { 0x0dbe, 0x0e1e }, /* Thai_phophan พ THAI CHARACTER PHO PHAN */ ++ { 0x0dbf, 0x0e1f }, /* Thai_fofan ฟ THAI CHARACTER FO FAN */ ++ { 0x0dc0, 0x0e20 }, /* Thai_phosamphao ภ THAI CHARACTER PHO SAMPHAO */ ++ { 0x0dc1, 0x0e21 }, /* Thai_moma ม THAI CHARACTER MO MA */ ++ { 0x0dc2, 0x0e22 }, /* Thai_yoyak ย THAI CHARACTER YO YAK */ ++ { 0x0dc3, 0x0e23 }, /* Thai_rorua ร THAI CHARACTER RO RUA */ ++ { 0x0dc4, 0x0e24 }, /* Thai_ru ฤ THAI CHARACTER RU */ ++ { 0x0dc5, 0x0e25 }, /* Thai_loling ล THAI CHARACTER LO LING */ ++ { 0x0dc6, 0x0e26 }, /* Thai_lu ฦ THAI CHARACTER LU */ ++ { 0x0dc7, 0x0e27 }, /* Thai_wowaen ว THAI CHARACTER WO WAEN */ ++ { 0x0dc8, 0x0e28 }, /* Thai_sosala ศ THAI CHARACTER SO SALA */ ++ { 0x0dc9, 0x0e29 }, /* Thai_sorusi ษ THAI CHARACTER SO RUSI */ ++ { 0x0dca, 0x0e2a }, /* Thai_sosua ส THAI CHARACTER SO SUA */ ++ { 0x0dcb, 0x0e2b }, /* Thai_hohip ห THAI CHARACTER HO HIP */ ++ { 0x0dcc, 0x0e2c }, /* Thai_lochula ฬ THAI CHARACTER LO CHULA */ ++ { 0x0dcd, 0x0e2d }, /* Thai_oang อ THAI CHARACTER O ANG */ ++ { 0x0dce, 0x0e2e }, /* Thai_honokhuk ฮ THAI CHARACTER HO NOKHUK */ ++ { 0x0dcf, 0x0e2f }, /* Thai_paiyannoi ฯ THAI CHARACTER PAIYANNOI */ ++ { 0x0dd0, 0x0e30 }, /* Thai_saraa ะ THAI CHARACTER SARA A */ ++ { 0x0dd1, 0x0e31 }, /* Thai_maihanakat ั THAI CHARACTER MAI HAN-AKAT */ ++ { 0x0dd2, 0x0e32 }, /* Thai_saraaa า THAI CHARACTER SARA AA */ ++ { 0x0dd3, 0x0e33 }, /* Thai_saraam ำ THAI CHARACTER SARA AM */ ++ { 0x0dd4, 0x0e34 }, /* Thai_sarai ิ THAI CHARACTER SARA I */ ++ { 0x0dd5, 0x0e35 }, /* Thai_saraii ี THAI CHARACTER SARA II */ ++ { 0x0dd6, 0x0e36 }, /* Thai_saraue ึ THAI CHARACTER SARA UE */ ++ { 0x0dd7, 0x0e37 }, /* Thai_sarauee ื THAI CHARACTER SARA UEE */ ++ { 0x0dd8, 0x0e38 }, /* Thai_sarau ุ THAI CHARACTER SARA U */ ++ { 0x0dd9, 0x0e39 }, /* Thai_sarauu ู THAI CHARACTER SARA UU */ ++ { 0x0dda, 0x0e3a }, /* Thai_phinthu ฺ THAI CHARACTER PHINTHU */ ++ { 0x0dde, 0x0e3e }, /* Thai_maihanakat_maitho ฾ ??? */ ++ { 0x0ddf, 0x0e3f }, /* Thai_baht ฿ THAI CURRENCY SYMBOL BAHT */ ++ { 0x0de0, 0x0e40 }, /* Thai_sarae เ THAI CHARACTER SARA E */ ++ { 0x0de1, 0x0e41 }, /* Thai_saraae แ THAI CHARACTER SARA AE */ ++ { 0x0de2, 0x0e42 }, /* Thai_sarao โ THAI CHARACTER SARA O */ ++ { 0x0de3, 0x0e43 }, /* Thai_saraaimaimuan ใ THAI CHARACTER SARA AI MAIMUAN */ ++ { 0x0de4, 0x0e44 }, /* Thai_saraaimaimalai ไ THAI CHARACTER SARA AI MAIMALAI */ ++ { 0x0de5, 0x0e45 }, /* Thai_lakkhangyao ๅ THAI CHARACTER LAKKHANGYAO */ ++ { 0x0de6, 0x0e46 }, /* Thai_maiyamok ๆ THAI CHARACTER MAIYAMOK */ ++ { 0x0de7, 0x0e47 }, /* Thai_maitaikhu ็ THAI CHARACTER MAITAIKHU */ ++ { 0x0de8, 0x0e48 }, /* Thai_maiek ่ THAI CHARACTER MAI EK */ ++ { 0x0de9, 0x0e49 }, /* Thai_maitho ้ THAI CHARACTER MAI THO */ ++ { 0x0dea, 0x0e4a }, /* Thai_maitri ๊ THAI CHARACTER MAI TRI */ ++ { 0x0deb, 0x0e4b }, /* Thai_maichattawa ๋ THAI CHARACTER MAI CHATTAWA */ ++ { 0x0dec, 0x0e4c }, /* Thai_thanthakhat ์ THAI CHARACTER THANTHAKHAT */ ++ { 0x0ded, 0x0e4d }, /* Thai_nikhahit ํ THAI CHARACTER NIKHAHIT */ ++ { 0x0df0, 0x0e50 }, /* Thai_leksun ๐ THAI DIGIT ZERO */ ++ { 0x0df1, 0x0e51 }, /* Thai_leknung ๑ THAI DIGIT ONE */ ++ { 0x0df2, 0x0e52 }, /* Thai_leksong ๒ THAI DIGIT TWO */ ++ { 0x0df3, 0x0e53 }, /* Thai_leksam ๓ THAI DIGIT THREE */ ++ { 0x0df4, 0x0e54 }, /* Thai_leksi ๔ THAI DIGIT FOUR */ ++ { 0x0df5, 0x0e55 }, /* Thai_lekha ๕ THAI DIGIT FIVE */ ++ { 0x0df6, 0x0e56 }, /* Thai_lekhok ๖ THAI DIGIT SIX */ ++ { 0x0df7, 0x0e57 }, /* Thai_lekchet ๗ THAI DIGIT SEVEN */ ++ { 0x0df8, 0x0e58 }, /* Thai_lekpaet ๘ THAI DIGIT EIGHT */ ++ { 0x0df9, 0x0e59 }, /* Thai_lekkao ๙ THAI DIGIT NINE */ ++ { 0x0ea1, 0x3131 }, /* Hangul_Kiyeog ㄱ HANGUL LETTER KIYEOK */ ++ { 0x0ea2, 0x3132 }, /* Hangul_SsangKiyeog ㄲ HANGUL LETTER SSANGKIYEOK */ ++ { 0x0ea3, 0x3133 }, /* Hangul_KiyeogSios ㄳ HANGUL LETTER KIYEOK-SIOS */ ++ { 0x0ea4, 0x3134 }, /* Hangul_Nieun ㄴ HANGUL LETTER NIEUN */ ++ { 0x0ea5, 0x3135 }, /* Hangul_NieunJieuj ㄵ HANGUL LETTER NIEUN-CIEUC */ ++ { 0x0ea6, 0x3136 }, /* Hangul_NieunHieuh ㄶ HANGUL LETTER NIEUN-HIEUH */ ++ { 0x0ea7, 0x3137 }, /* Hangul_Dikeud ㄷ HANGUL LETTER TIKEUT */ ++ { 0x0ea8, 0x3138 }, /* Hangul_SsangDikeud ㄸ HANGUL LETTER SSANGTIKEUT */ ++ { 0x0ea9, 0x3139 }, /* Hangul_Rieul ㄹ HANGUL LETTER RIEUL */ ++ { 0x0eaa, 0x313a }, /* Hangul_RieulKiyeog ㄺ HANGUL LETTER RIEUL-KIYEOK */ ++ { 0x0eab, 0x313b }, /* Hangul_RieulMieum ㄻ HANGUL LETTER RIEUL-MIEUM */ ++ { 0x0eac, 0x313c }, /* Hangul_RieulPieub ㄼ HANGUL LETTER RIEUL-PIEUP */ ++ { 0x0ead, 0x313d }, /* Hangul_RieulSios ㄽ HANGUL LETTER RIEUL-SIOS */ ++ { 0x0eae, 0x313e }, /* Hangul_RieulTieut ㄾ HANGUL LETTER RIEUL-THIEUTH */ ++ { 0x0eaf, 0x313f }, /* Hangul_RieulPhieuf ㄿ HANGUL LETTER RIEUL-PHIEUPH */ ++ { 0x0eb0, 0x3140 }, /* Hangul_RieulHieuh ㅀ HANGUL LETTER RIEUL-HIEUH */ ++ { 0x0eb1, 0x3141 }, /* Hangul_Mieum ㅁ HANGUL LETTER MIEUM */ ++ { 0x0eb2, 0x3142 }, /* Hangul_Pieub ㅂ HANGUL LETTER PIEUP */ ++ { 0x0eb3, 0x3143 }, /* Hangul_SsangPieub ㅃ HANGUL LETTER SSANGPIEUP */ ++ { 0x0eb4, 0x3144 }, /* Hangul_PieubSios ㅄ HANGUL LETTER PIEUP-SIOS */ ++ { 0x0eb5, 0x3145 }, /* Hangul_Sios ㅅ HANGUL LETTER SIOS */ ++ { 0x0eb6, 0x3146 }, /* Hangul_SsangSios ㅆ HANGUL LETTER SSANGSIOS */ ++ { 0x0eb7, 0x3147 }, /* Hangul_Ieung ㅇ HANGUL LETTER IEUNG */ ++ { 0x0eb8, 0x3148 }, /* Hangul_Jieuj ㅈ HANGUL LETTER CIEUC */ ++ { 0x0eb9, 0x3149 }, /* Hangul_SsangJieuj ㅉ HANGUL LETTER SSANGCIEUC */ ++ { 0x0eba, 0x314a }, /* Hangul_Cieuc ㅊ HANGUL LETTER CHIEUCH */ ++ { 0x0ebb, 0x314b }, /* Hangul_Khieuq ㅋ HANGUL LETTER KHIEUKH */ ++ { 0x0ebc, 0x314c }, /* Hangul_Tieut ㅌ HANGUL LETTER THIEUTH */ ++ { 0x0ebd, 0x314d }, /* Hangul_Phieuf ㅍ HANGUL LETTER PHIEUPH */ ++ { 0x0ebe, 0x314e }, /* Hangul_Hieuh ㅎ HANGUL LETTER HIEUH */ ++ { 0x0ebf, 0x314f }, /* Hangul_A ㅏ HANGUL LETTER A */ ++ { 0x0ec0, 0x3150 }, /* Hangul_AE ㅐ HANGUL LETTER AE */ ++ { 0x0ec1, 0x3151 }, /* Hangul_YA ㅑ HANGUL LETTER YA */ ++ { 0x0ec2, 0x3152 }, /* Hangul_YAE ㅒ HANGUL LETTER YAE */ ++ { 0x0ec3, 0x3153 }, /* Hangul_EO ㅓ HANGUL LETTER EO */ ++ { 0x0ec4, 0x3154 }, /* Hangul_E ㅔ HANGUL LETTER E */ ++ { 0x0ec5, 0x3155 }, /* Hangul_YEO ㅕ HANGUL LETTER YEO */ ++ { 0x0ec6, 0x3156 }, /* Hangul_YE ㅖ HANGUL LETTER YE */ ++ { 0x0ec7, 0x3157 }, /* Hangul_O ㅗ HANGUL LETTER O */ ++ { 0x0ec8, 0x3158 }, /* Hangul_WA ㅘ HANGUL LETTER WA */ ++ { 0x0ec9, 0x3159 }, /* Hangul_WAE ㅙ HANGUL LETTER WAE */ ++ { 0x0eca, 0x315a }, /* Hangul_OE ㅚ HANGUL LETTER OE */ ++ { 0x0ecb, 0x315b }, /* Hangul_YO ㅛ HANGUL LETTER YO */ ++ { 0x0ecc, 0x315c }, /* Hangul_U ㅜ HANGUL LETTER U */ ++ { 0x0ecd, 0x315d }, /* Hangul_WEO ㅝ HANGUL LETTER WEO */ ++ { 0x0ece, 0x315e }, /* Hangul_WE ㅞ HANGUL LETTER WE */ ++ { 0x0ecf, 0x315f }, /* Hangul_WI ㅟ HANGUL LETTER WI */ ++ { 0x0ed0, 0x3160 }, /* Hangul_YU ㅠ HANGUL LETTER YU */ ++ { 0x0ed1, 0x3161 }, /* Hangul_EU ㅡ HANGUL LETTER EU */ ++ { 0x0ed2, 0x3162 }, /* Hangul_YI ㅢ HANGUL LETTER YI */ ++ { 0x0ed3, 0x3163 }, /* Hangul_I ㅣ HANGUL LETTER I */ ++ { 0x0ed4, 0x11a8 }, /* Hangul_J_Kiyeog ᆨ HANGUL JONGSEONG KIYEOK */ ++ { 0x0ed5, 0x11a9 }, /* Hangul_J_SsangKiyeog ᆩ HANGUL JONGSEONG SSANGKIYEOK */ ++ { 0x0ed6, 0x11aa }, /* Hangul_J_KiyeogSios ᆪ HANGUL JONGSEONG KIYEOK-SIOS */ ++ { 0x0ed7, 0x11ab }, /* Hangul_J_Nieun ᆫ HANGUL JONGSEONG NIEUN */ ++ { 0x0ed8, 0x11ac }, /* Hangul_J_NieunJieuj ᆬ HANGUL JONGSEONG NIEUN-CIEUC */ ++ { 0x0ed9, 0x11ad }, /* Hangul_J_NieunHieuh ᆭ HANGUL JONGSEONG NIEUN-HIEUH */ ++ { 0x0eda, 0x11ae }, /* Hangul_J_Dikeud ᆮ HANGUL JONGSEONG TIKEUT */ ++ { 0x0edb, 0x11af }, /* Hangul_J_Rieul ᆯ HANGUL JONGSEONG RIEUL */ ++ { 0x0edc, 0x11b0 }, /* Hangul_J_RieulKiyeog ᆰ HANGUL JONGSEONG RIEUL-KIYEOK */ ++ { 0x0edd, 0x11b1 }, /* Hangul_J_RieulMieum ᆱ HANGUL JONGSEONG RIEUL-MIEUM */ ++ { 0x0ede, 0x11b2 }, /* Hangul_J_RieulPieub ᆲ HANGUL JONGSEONG RIEUL-PIEUP */ ++ { 0x0edf, 0x11b3 }, /* Hangul_J_RieulSios ᆳ HANGUL JONGSEONG RIEUL-SIOS */ ++ { 0x0ee0, 0x11b4 }, /* Hangul_J_RieulTieut ᆴ HANGUL JONGSEONG RIEUL-THIEUTH */ ++ { 0x0ee1, 0x11b5 }, /* Hangul_J_RieulPhieuf ᆵ HANGUL JONGSEONG RIEUL-PHIEUPH */ ++ { 0x0ee2, 0x11b6 }, /* Hangul_J_RieulHieuh ᆶ HANGUL JONGSEONG RIEUL-HIEUH */ ++ { 0x0ee3, 0x11b7 }, /* Hangul_J_Mieum ᆷ HANGUL JONGSEONG MIEUM */ ++ { 0x0ee4, 0x11b8 }, /* Hangul_J_Pieub ᆸ HANGUL JONGSEONG PIEUP */ ++ { 0x0ee5, 0x11b9 }, /* Hangul_J_PieubSios ᆹ HANGUL JONGSEONG PIEUP-SIOS */ ++ { 0x0ee6, 0x11ba }, /* Hangul_J_Sios ᆺ HANGUL JONGSEONG SIOS */ ++ { 0x0ee7, 0x11bb }, /* Hangul_J_SsangSios ᆻ HANGUL JONGSEONG SSANGSIOS */ ++ { 0x0ee8, 0x11bc }, /* Hangul_J_Ieung ᆼ HANGUL JONGSEONG IEUNG */ ++ { 0x0ee9, 0x11bd }, /* Hangul_J_Jieuj ᆽ HANGUL JONGSEONG CIEUC */ ++ { 0x0eea, 0x11be }, /* Hangul_J_Cieuc ᆾ HANGUL JONGSEONG CHIEUCH */ ++ { 0x0eeb, 0x11bf }, /* Hangul_J_Khieuq ᆿ HANGUL JONGSEONG KHIEUKH */ ++ { 0x0eec, 0x11c0 }, /* Hangul_J_Tieut ᇀ HANGUL JONGSEONG THIEUTH */ ++ { 0x0eed, 0x11c1 }, /* Hangul_J_Phieuf ᇁ HANGUL JONGSEONG PHIEUPH */ ++ { 0x0eee, 0x11c2 }, /* Hangul_J_Hieuh ᇂ HANGUL JONGSEONG HIEUH */ ++ { 0x0eef, 0x316d }, /* Hangul_RieulYeorinHieuh ㅭ HANGUL LETTER RIEUL-YEORINHIEUH */ ++ { 0x0ef0, 0x3171 }, /* Hangul_SunkyeongeumMieum ㅱ HANGUL LETTER KAPYEOUNMIEUM */ ++ { 0x0ef1, 0x3178 }, /* Hangul_SunkyeongeumPieub ㅸ HANGUL LETTER KAPYEOUNPIEUP */ ++ { 0x0ef2, 0x317f }, /* Hangul_PanSios ㅿ HANGUL LETTER PANSIOS */ ++ /* 0x0ef3 Hangul_KkogjiDalrinIeung ? ??? */ ++ { 0x0ef4, 0x3184 }, /* Hangul_SunkyeongeumPhieuf ㆄ HANGUL LETTER KAPYEOUNPHIEUPH */ ++ { 0x0ef5, 0x3186 }, /* Hangul_YeorinHieuh ㆆ HANGUL LETTER YEORINHIEUH */ ++ { 0x0ef6, 0x318d }, /* Hangul_AraeA ㆍ HANGUL LETTER ARAEA */ ++ { 0x0ef7, 0x318e }, /* Hangul_AraeAE ㆎ HANGUL LETTER ARAEAE */ ++ { 0x0ef8, 0x11eb }, /* Hangul_J_PanSios ᇫ HANGUL JONGSEONG PANSIOS */ ++ /* 0x0ef9 Hangul_J_KkogjiDalrinIeung ? ??? */ ++ { 0x0efa, 0x11f9 }, /* Hangul_J_YeorinHieuh ᇹ HANGUL JONGSEONG YEORINHIEUH */ ++ { 0x0eff, 0x20a9 }, /* Korean_Won ₩ WON SIGN */ ++ { 0x13bc, 0x0152 }, /* OE Œ LATIN CAPITAL LIGATURE OE */ ++ { 0x13bd, 0x0153 }, /* oe œ LATIN SMALL LIGATURE OE */ ++ { 0x13be, 0x0178 }, /* Ydiaeresis Ÿ LATIN CAPITAL LETTER Y WITH DIAERESIS */ ++ { 0x20a0, 0x20a0 }, /* EcuSign ₠ EURO-CURRENCY SIGN */ ++ { 0x20a1, 0x20a1 }, /* ColonSign ₡ COLON SIGN */ ++ { 0x20a2, 0x20a2 }, /* CruzeiroSign ₢ CRUZEIRO SIGN */ ++ { 0x20a3, 0x20a3 }, /* FFrancSign ₣ FRENCH FRANC SIGN */ ++ { 0x20a4, 0x20a4 }, /* LiraSign ₤ LIRA SIGN */ ++ { 0x20a5, 0x20a5 }, /* MillSign ₥ MILL SIGN */ ++ { 0x20a6, 0x20a6 }, /* NairaSign ₦ NAIRA SIGN */ ++ { 0x20a7, 0x20a7 }, /* PesetaSign ₧ PESETA SIGN */ ++ { 0x20a8, 0x20a8 }, /* RupeeSign ₨ RUPEE SIGN */ ++ { 0x20a9, 0x20a9 }, /* WonSign ₩ WON SIGN */ ++ { 0x20aa, 0x20aa }, /* NewSheqelSign ₪ NEW SHEQEL SIGN */ ++ { 0x20ab, 0x20ab }, /* DongSign ₫ DONG SIGN */ ++ { 0x20ac, 0x20ac }, /* EuroSign € EURO SIGN */ ++ ++ ++ /* Following items added to GTK, not in the xterm table */ ++ ++ /* A few ASCII control characters */ ++ ++ { 0xFF08 /* Backspace */, '\b' }, ++ { 0xFF09 /* Tab */, '\t' }, ++ { 0xFF0A /* Linefeed */, '\n' }, ++ { 0xFF0B /* Vert. Tab */, '\v' }, ++ { 0xFF0D /* Return */, '\r' }, ++ { 0xFF1B /* Escape */, '\033' }, ++ ++ /* Numeric keypad */ ++ ++ { 0xFF80 /* Space */, ' ' }, ++ { 0xFFAA /* Multiply */, '*' }, ++ { 0xFFAB /* Add */, '+' }, ++ { 0xFFAC /* Separator */, ',' }, ++ { 0xFFAD /* Subtract */, '-' }, ++ { 0xFFAE /* Decimal */, '.' }, ++ { 0xFFAF /* Divide */, '/' }, ++ { 0xFFB0 /* 0 */, '0' }, ++ { 0xFFB1 /* 1 */, '1' }, ++ { 0xFFB2 /* 2 */, '2' }, ++ { 0xFFB3 /* 3 */, '3' }, ++ { 0xFFB4 /* 4 */, '4' }, ++ { 0xFFB5 /* 5 */, '5' }, ++ { 0xFFB6 /* 6 */, '6' }, ++ { 0xFFB7 /* 7 */, '7' }, ++ { 0xFFB8 /* 8 */, '8' }, ++ { 0xFFB9 /* 9 */, '9' }, ++ { 0xFFBD /* Equal */, '=' }, ++ ++ /* End numeric keypad */ ++ ++ { 0xFFFF /* Delete */, '\177' } ++}; ++ ++static const struct _FcitxUnicodeToKeySym gdk_unicode_to_keysym_tab[] = { ++ { 0x0abd, 0x002e }, /* decimalpoint . FULL STOP */ ++ { 0x0ba3, 0x003c }, /* leftcaret < LESS-THAN SIGN */ ++ { 0x0ba6, 0x003e }, /* rightcaret > GREATER-THAN SIGN */ ++ { 0x0bc6, 0x005f }, /* underbar _ LOW LINE */ ++ { 0x0bc0, 0x00af }, /* overbar ¯ MACRON */ ++ { 0x03c0, 0x0100 }, /* Amacron Ā LATIN CAPITAL LETTER A WITH MACRON */ ++ { 0x03e0, 0x0101 }, /* amacron ā LATIN SMALL LETTER A WITH MACRON */ ++ { 0x01c3, 0x0102 }, /* Abreve Ă LATIN CAPITAL LETTER A WITH BREVE */ ++ { 0x01e3, 0x0103 }, /* abreve ă LATIN SMALL LETTER A WITH BREVE */ ++ { 0x01a1, 0x0104 }, /* Aogonek Ą LATIN CAPITAL LETTER A WITH OGONEK */ ++ { 0x01b1, 0x0105 }, /* aogonek ą LATIN SMALL LETTER A WITH OGONEK */ ++ { 0x01c6, 0x0106 }, /* Cacute Ć LATIN CAPITAL LETTER C WITH ACUTE */ ++ { 0x01e6, 0x0107 }, /* cacute ć LATIN SMALL LETTER C WITH ACUTE */ ++ { 0x02c6, 0x0108 }, /* Ccircumflex Ĉ LATIN CAPITAL LETTER C WITH CIRCUMFLEX */ ++ { 0x02e6, 0x0109 }, /* ccircumflex ĉ LATIN SMALL LETTER C WITH CIRCUMFLEX */ ++ { 0x02c5, 0x010a }, /* Cabovedot Ċ LATIN CAPITAL LETTER C WITH DOT ABOVE */ ++ { 0x02e5, 0x010b }, /* cabovedot ċ LATIN SMALL LETTER C WITH DOT ABOVE */ ++ { 0x01c8, 0x010c }, /* Ccaron Č LATIN CAPITAL LETTER C WITH CARON */ ++ { 0x01e8, 0x010d }, /* ccaron č LATIN SMALL LETTER C WITH CARON */ ++ { 0x01cf, 0x010e }, /* Dcaron Ď LATIN CAPITAL LETTER D WITH CARON */ ++ { 0x01ef, 0x010f }, /* dcaron ď LATIN SMALL LETTER D WITH CARON */ ++ { 0x01d0, 0x0110 }, /* Dstroke Đ LATIN CAPITAL LETTER D WITH STROKE */ ++ { 0x01f0, 0x0111 }, /* dstroke đ LATIN SMALL LETTER D WITH STROKE */ ++ { 0x03aa, 0x0112 }, /* Emacron Ē LATIN CAPITAL LETTER E WITH MACRON */ ++ { 0x03ba, 0x0113 }, /* emacron ē LATIN SMALL LETTER E WITH MACRON */ ++ { 0x03cc, 0x0116 }, /* Eabovedot Ė LATIN CAPITAL LETTER E WITH DOT ABOVE */ ++ { 0x03ec, 0x0117 }, /* eabovedot ė LATIN SMALL LETTER E WITH DOT ABOVE */ ++ { 0x01ca, 0x0118 }, /* Eogonek Ę LATIN CAPITAL LETTER E WITH OGONEK */ ++ { 0x01ea, 0x0119 }, /* eogonek ę LATIN SMALL LETTER E WITH OGONEK */ ++ { 0x01cc, 0x011a }, /* Ecaron Ě LATIN CAPITAL LETTER E WITH CARON */ ++ { 0x01ec, 0x011b }, /* ecaron ě LATIN SMALL LETTER E WITH CARON */ ++ { 0x02d8, 0x011c }, /* Gcircumflex Ĝ LATIN CAPITAL LETTER G WITH CIRCUMFLEX */ ++ { 0x02f8, 0x011d }, /* gcircumflex ĝ LATIN SMALL LETTER G WITH CIRCUMFLEX */ ++ { 0x02ab, 0x011e }, /* Gbreve Ğ LATIN CAPITAL LETTER G WITH BREVE */ ++ { 0x02bb, 0x011f }, /* gbreve ğ LATIN SMALL LETTER G WITH BREVE */ ++ { 0x02d5, 0x0120 }, /* Gabovedot Ġ LATIN CAPITAL LETTER G WITH DOT ABOVE */ ++ { 0x02f5, 0x0121 }, /* gabovedot ġ LATIN SMALL LETTER G WITH DOT ABOVE */ ++ { 0x03ab, 0x0122 }, /* Gcedilla Ģ LATIN CAPITAL LETTER G WITH CEDILLA */ ++ { 0x03bb, 0x0123 }, /* gcedilla ģ LATIN SMALL LETTER G WITH CEDILLA */ ++ { 0x02a6, 0x0124 }, /* Hcircumflex Ĥ LATIN CAPITAL LETTER H WITH CIRCUMFLEX */ ++ { 0x02b6, 0x0125 }, /* hcircumflex ĥ LATIN SMALL LETTER H WITH CIRCUMFLEX */ ++ { 0x02a1, 0x0126 }, /* Hstroke Ħ LATIN CAPITAL LETTER H WITH STROKE */ ++ { 0x02b1, 0x0127 }, /* hstroke ħ LATIN SMALL LETTER H WITH STROKE */ ++ { 0x03a5, 0x0128 }, /* Itilde Ĩ LATIN CAPITAL LETTER I WITH TILDE */ ++ { 0x03b5, 0x0129 }, /* itilde ĩ LATIN SMALL LETTER I WITH TILDE */ ++ { 0x03cf, 0x012a }, /* Imacron Ī LATIN CAPITAL LETTER I WITH MACRON */ ++ { 0x03ef, 0x012b }, /* imacron ī LATIN SMALL LETTER I WITH MACRON */ ++ { 0x03c7, 0x012e }, /* Iogonek Į LATIN CAPITAL LETTER I WITH OGONEK */ ++ { 0x03e7, 0x012f }, /* iogonek į LATIN SMALL LETTER I WITH OGONEK */ ++ { 0x02a9, 0x0130 }, /* Iabovedot İ LATIN CAPITAL LETTER I WITH DOT ABOVE */ ++ { 0x02b9, 0x0131 }, /* idotless ı LATIN SMALL LETTER DOTLESS I */ ++ { 0x02ac, 0x0134 }, /* Jcircumflex Ĵ LATIN CAPITAL LETTER J WITH CIRCUMFLEX */ ++ { 0x02bc, 0x0135 }, /* jcircumflex ĵ LATIN SMALL LETTER J WITH CIRCUMFLEX */ ++ { 0x03d3, 0x0136 }, /* Kcedilla Ķ LATIN CAPITAL LETTER K WITH CEDILLA */ ++ { 0x03f3, 0x0137 }, /* kcedilla ķ LATIN SMALL LETTER K WITH CEDILLA */ ++ { 0x03a2, 0x0138 }, /* kra ĸ LATIN SMALL LETTER KRA */ ++ { 0x01c5, 0x0139 }, /* Lacute Ĺ LATIN CAPITAL LETTER L WITH ACUTE */ ++ { 0x01e5, 0x013a }, /* lacute ĺ LATIN SMALL LETTER L WITH ACUTE */ ++ { 0x03a6, 0x013b }, /* Lcedilla Ļ LATIN CAPITAL LETTER L WITH CEDILLA */ ++ { 0x03b6, 0x013c }, /* lcedilla ļ LATIN SMALL LETTER L WITH CEDILLA */ ++ { 0x01a5, 0x013d }, /* Lcaron Ľ LATIN CAPITAL LETTER L WITH CARON */ ++ { 0x01b5, 0x013e }, /* lcaron ľ LATIN SMALL LETTER L WITH CARON */ ++ { 0x01a3, 0x0141 }, /* Lstroke Ł LATIN CAPITAL LETTER L WITH STROKE */ ++ { 0x01b3, 0x0142 }, /* lstroke ł LATIN SMALL LETTER L WITH STROKE */ ++ { 0x01d1, 0x0143 }, /* Nacute Ń LATIN CAPITAL LETTER N WITH ACUTE */ ++ { 0x01f1, 0x0144 }, /* nacute ń LATIN SMALL LETTER N WITH ACUTE */ ++ { 0x03d1, 0x0145 }, /* Ncedilla Ņ LATIN CAPITAL LETTER N WITH CEDILLA */ ++ { 0x03f1, 0x0146 }, /* ncedilla ņ LATIN SMALL LETTER N WITH CEDILLA */ ++ { 0x01d2, 0x0147 }, /* Ncaron Ň LATIN CAPITAL LETTER N WITH CARON */ ++ { 0x01f2, 0x0148 }, /* ncaron ň LATIN SMALL LETTER N WITH CARON */ ++ { 0x03bd, 0x014a }, /* ENG Ŋ LATIN CAPITAL LETTER ENG */ ++ { 0x03bf, 0x014b }, /* eng ŋ LATIN SMALL LETTER ENG */ ++ { 0x03d2, 0x014c }, /* Omacron Ō LATIN CAPITAL LETTER O WITH MACRON */ ++ { 0x03f2, 0x014d }, /* omacron ō LATIN SMALL LETTER O WITH MACRON */ ++ { 0x01d5, 0x0150 }, /* Odoubleacute Ő LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */ ++ { 0x01f5, 0x0151 }, /* odoubleacute ő LATIN SMALL LETTER O WITH DOUBLE ACUTE */ ++ { 0x13bc, 0x0152 }, /* OE Œ LATIN CAPITAL LIGATURE OE */ ++ { 0x13bd, 0x0153 }, /* oe œ LATIN SMALL LIGATURE OE */ ++ { 0x01c0, 0x0154 }, /* Racute Ŕ LATIN CAPITAL LETTER R WITH ACUTE */ ++ { 0x01e0, 0x0155 }, /* racute ŕ LATIN SMALL LETTER R WITH ACUTE */ ++ { 0x03a3, 0x0156 }, /* Rcedilla Ŗ LATIN CAPITAL LETTER R WITH CEDILLA */ ++ { 0x03b3, 0x0157 }, /* rcedilla ŗ LATIN SMALL LETTER R WITH CEDILLA */ ++ { 0x01d8, 0x0158 }, /* Rcaron Ř LATIN CAPITAL LETTER R WITH CARON */ ++ { 0x01f8, 0x0159 }, /* rcaron ř LATIN SMALL LETTER R WITH CARON */ ++ { 0x01a6, 0x015a }, /* Sacute Ś LATIN CAPITAL LETTER S WITH ACUTE */ ++ { 0x01b6, 0x015b }, /* sacute ś LATIN SMALL LETTER S WITH ACUTE */ ++ { 0x02de, 0x015c }, /* Scircumflex Ŝ LATIN CAPITAL LETTER S WITH CIRCUMFLEX */ ++ { 0x02fe, 0x015d }, /* scircumflex ŝ LATIN SMALL LETTER S WITH CIRCUMFLEX */ ++ { 0x01aa, 0x015e }, /* Scedilla Ş LATIN CAPITAL LETTER S WITH CEDILLA */ ++ { 0x01ba, 0x015f }, /* scedilla ş LATIN SMALL LETTER S WITH CEDILLA */ ++ { 0x01a9, 0x0160 }, /* Scaron Š LATIN CAPITAL LETTER S WITH CARON */ ++ { 0x01b9, 0x0161 }, /* scaron š LATIN SMALL LETTER S WITH CARON */ ++ { 0x01de, 0x0162 }, /* Tcedilla Ţ LATIN CAPITAL LETTER T WITH CEDILLA */ ++ { 0x01fe, 0x0163 }, /* tcedilla ţ LATIN SMALL LETTER T WITH CEDILLA */ ++ { 0x01ab, 0x0164 }, /* Tcaron Ť LATIN CAPITAL LETTER T WITH CARON */ ++ { 0x01bb, 0x0165 }, /* tcaron ť LATIN SMALL LETTER T WITH CARON */ ++ { 0x03ac, 0x0166 }, /* Tslash Ŧ LATIN CAPITAL LETTER T WITH STROKE */ ++ { 0x03bc, 0x0167 }, /* tslash ŧ LATIN SMALL LETTER T WITH STROKE */ ++ { 0x03dd, 0x0168 }, /* Utilde Ũ LATIN CAPITAL LETTER U WITH TILDE */ ++ { 0x03fd, 0x0169 }, /* utilde ũ LATIN SMALL LETTER U WITH TILDE */ ++ { 0x03de, 0x016a }, /* Umacron Ū LATIN CAPITAL LETTER U WITH MACRON */ ++ { 0x03fe, 0x016b }, /* umacron ū LATIN SMALL LETTER U WITH MACRON */ ++ { 0x02dd, 0x016c }, /* Ubreve Ŭ LATIN CAPITAL LETTER U WITH BREVE */ ++ { 0x02fd, 0x016d }, /* ubreve ŭ LATIN SMALL LETTER U WITH BREVE */ ++ { 0x01d9, 0x016e }, /* Uring Ů LATIN CAPITAL LETTER U WITH RING ABOVE */ ++ { 0x01f9, 0x016f }, /* uring ů LATIN SMALL LETTER U WITH RING ABOVE */ ++ { 0x01db, 0x0170 }, /* Udoubleacute Ű LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */ ++ { 0x01fb, 0x0171 }, /* udoubleacute ű LATIN SMALL LETTER U WITH DOUBLE ACUTE */ ++ { 0x03d9, 0x0172 }, /* Uogonek Ų LATIN CAPITAL LETTER U WITH OGONEK */ ++ { 0x03f9, 0x0173 }, /* uogonek ų LATIN SMALL LETTER U WITH OGONEK */ ++ { 0x13be, 0x0178 }, /* Ydiaeresis Ÿ LATIN CAPITAL LETTER Y WITH DIAERESIS */ ++ { 0x01ac, 0x0179 }, /* Zacute Ź LATIN CAPITAL LETTER Z WITH ACUTE */ ++ { 0x01bc, 0x017a }, /* zacute ź LATIN SMALL LETTER Z WITH ACUTE */ ++ { 0x01af, 0x017b }, /* Zabovedot Ż LATIN CAPITAL LETTER Z WITH DOT ABOVE */ ++ { 0x01bf, 0x017c }, /* zabovedot ż LATIN SMALL LETTER Z WITH DOT ABOVE */ ++ { 0x01ae, 0x017d }, /* Zcaron Ž LATIN CAPITAL LETTER Z WITH CARON */ ++ { 0x01be, 0x017e }, /* zcaron ž LATIN SMALL LETTER Z WITH CARON */ ++ { 0x08f6, 0x0192 }, /* function ƒ LATIN SMALL LETTER F WITH HOOK */ ++ { 0x01b7, 0x02c7 }, /* caron ˇ CARON */ ++ { 0x01a2, 0x02d8 }, /* breve ˘ BREVE */ ++ { 0x01ff, 0x02d9 }, /* abovedot ˙ DOT ABOVE */ ++ { 0x01b2, 0x02db }, /* ogonek ˛ OGONEK */ ++ { 0x01bd, 0x02dd }, /* doubleacute ˝ DOUBLE ACUTE ACCENT */ ++ { 0x07ae, 0x0385 }, /* Greek_accentdieresis ΅ GREEK DIALYTIKA TONOS */ ++ { 0x07a1, 0x0386 }, /* Greek_ALPHAaccent Ά GREEK CAPITAL LETTER ALPHA WITH TONOS */ ++ { 0x07a2, 0x0388 }, /* Greek_EPSILONaccent Έ GREEK CAPITAL LETTER EPSILON WITH TONOS */ ++ { 0x07a3, 0x0389 }, /* Greek_ETAaccent Ή GREEK CAPITAL LETTER ETA WITH TONOS */ ++ { 0x07a4, 0x038a }, /* Greek_IOTAaccent Ί GREEK CAPITAL LETTER IOTA WITH TONOS */ ++ { 0x07a7, 0x038c }, /* Greek_OMICRONaccent Ό GREEK CAPITAL LETTER OMICRON WITH TONOS */ ++ { 0x07a8, 0x038e }, /* Greek_UPSILONaccent Ύ GREEK CAPITAL LETTER UPSILON WITH TONOS */ ++ { 0x07ab, 0x038f }, /* Greek_OMEGAaccent Ώ GREEK CAPITAL LETTER OMEGA WITH TONOS */ ++ { 0x07b6, 0x0390 }, /* Greek_iotaaccentdieresis ΐ GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */ ++ { 0x07c1, 0x0391 }, /* Greek_ALPHA Α GREEK CAPITAL LETTER ALPHA */ ++ { 0x07c2, 0x0392 }, /* Greek_BETA Β GREEK CAPITAL LETTER BETA */ ++ { 0x07c3, 0x0393 }, /* Greek_GAMMA Γ GREEK CAPITAL LETTER GAMMA */ ++ { 0x07c4, 0x0394 }, /* Greek_DELTA Δ GREEK CAPITAL LETTER DELTA */ ++ { 0x07c5, 0x0395 }, /* Greek_EPSILON Ε GREEK CAPITAL LETTER EPSILON */ ++ { 0x07c6, 0x0396 }, /* Greek_ZETA Ζ GREEK CAPITAL LETTER ZETA */ ++ { 0x07c7, 0x0397 }, /* Greek_ETA Η GREEK CAPITAL LETTER ETA */ ++ { 0x07c8, 0x0398 }, /* Greek_THETA Θ GREEK CAPITAL LETTER THETA */ ++ { 0x07c9, 0x0399 }, /* Greek_IOTA Ι GREEK CAPITAL LETTER IOTA */ ++ { 0x07ca, 0x039a }, /* Greek_KAPPA Κ GREEK CAPITAL LETTER KAPPA */ ++ { 0x07cb, 0x039b }, /* Greek_LAMBDA Λ GREEK CAPITAL LETTER LAMDA */ ++ { 0x07cc, 0x039c }, /* Greek_MU Μ GREEK CAPITAL LETTER MU */ ++ { 0x07cd, 0x039d }, /* Greek_NU Ν GREEK CAPITAL LETTER NU */ ++ { 0x07ce, 0x039e }, /* Greek_XI Ξ GREEK CAPITAL LETTER XI */ ++ { 0x07cf, 0x039f }, /* Greek_OMICRON Ο GREEK CAPITAL LETTER OMICRON */ ++ { 0x07d0, 0x03a0 }, /* Greek_PI Π GREEK CAPITAL LETTER PI */ ++ { 0x07d1, 0x03a1 }, /* Greek_RHO Ρ GREEK CAPITAL LETTER RHO */ ++ { 0x07d2, 0x03a3 }, /* Greek_SIGMA Σ GREEK CAPITAL LETTER SIGMA */ ++ { 0x07d4, 0x03a4 }, /* Greek_TAU Τ GREEK CAPITAL LETTER TAU */ ++ { 0x07d5, 0x03a5 }, /* Greek_UPSILON Υ GREEK CAPITAL LETTER UPSILON */ ++ { 0x07d6, 0x03a6 }, /* Greek_PHI Φ GREEK CAPITAL LETTER PHI */ ++ { 0x07d7, 0x03a7 }, /* Greek_CHI Χ GREEK CAPITAL LETTER CHI */ ++ { 0x07d8, 0x03a8 }, /* Greek_PSI Ψ GREEK CAPITAL LETTER PSI */ ++ { 0x07d9, 0x03a9 }, /* Greek_OMEGA Ω GREEK CAPITAL LETTER OMEGA */ ++ { 0x07a5, 0x03aa }, /* Greek_IOTAdieresis Ϊ GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */ ++ { 0x07a9, 0x03ab }, /* Greek_UPSILONdieresis Ϋ GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */ ++ { 0x07b1, 0x03ac }, /* Greek_alphaaccent ά GREEK SMALL LETTER ALPHA WITH TONOS */ ++ { 0x07b2, 0x03ad }, /* Greek_epsilonaccent έ GREEK SMALL LETTER EPSILON WITH TONOS */ ++ { 0x07b3, 0x03ae }, /* Greek_etaaccent ή GREEK SMALL LETTER ETA WITH TONOS */ ++ { 0x07b4, 0x03af }, /* Greek_iotaaccent ί GREEK SMALL LETTER IOTA WITH TONOS */ ++ { 0x07ba, 0x03b0 }, /* Greek_upsilonaccentdieresis ΰ GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */ ++ { 0x07e1, 0x03b1 }, /* Greek_alpha α GREEK SMALL LETTER ALPHA */ ++ { 0x07e2, 0x03b2 }, /* Greek_beta β GREEK SMALL LETTER BETA */ ++ { 0x07e3, 0x03b3 }, /* Greek_gamma γ GREEK SMALL LETTER GAMMA */ ++ { 0x07e4, 0x03b4 }, /* Greek_delta δ GREEK SMALL LETTER DELTA */ ++ { 0x07e5, 0x03b5 }, /* Greek_epsilon ε GREEK SMALL LETTER EPSILON */ ++ { 0x07e6, 0x03b6 }, /* Greek_zeta ζ GREEK SMALL LETTER ZETA */ ++ { 0x07e7, 0x03b7 }, /* Greek_eta η GREEK SMALL LETTER ETA */ ++ { 0x07e8, 0x03b8 }, /* Greek_theta θ GREEK SMALL LETTER THETA */ ++ { 0x07e9, 0x03b9 }, /* Greek_iota ι GREEK SMALL LETTER IOTA */ ++ { 0x07ea, 0x03ba }, /* Greek_kappa κ GREEK SMALL LETTER KAPPA */ ++ { 0x07eb, 0x03bb }, /* Greek_lambda λ GREEK SMALL LETTER LAMDA */ ++ { 0x07ec, 0x03bc }, /* Greek_mu μ GREEK SMALL LETTER MU */ ++ { 0x07ed, 0x03bd }, /* Greek_nu ν GREEK SMALL LETTER NU */ ++ { 0x07ee, 0x03be }, /* Greek_xi ξ GREEK SMALL LETTER XI */ ++ { 0x07ef, 0x03bf }, /* Greek_omicron ο GREEK SMALL LETTER OMICRON */ ++ { 0x07f0, 0x03c0 }, /* Greek_pi π GREEK SMALL LETTER PI */ ++ { 0x07f1, 0x03c1 }, /* Greek_rho ρ GREEK SMALL LETTER RHO */ ++ { 0x07f3, 0x03c2 }, /* Greek_finalsmallsigma ς GREEK SMALL LETTER FINAL SIGMA */ ++ { 0x07f2, 0x03c3 }, /* Greek_sigma σ GREEK SMALL LETTER SIGMA */ ++ { 0x07f4, 0x03c4 }, /* Greek_tau τ GREEK SMALL LETTER TAU */ ++ { 0x07f5, 0x03c5 }, /* Greek_upsilon υ GREEK SMALL LETTER UPSILON */ ++ { 0x07f6, 0x03c6 }, /* Greek_phi φ GREEK SMALL LETTER PHI */ ++ { 0x07f7, 0x03c7 }, /* Greek_chi χ GREEK SMALL LETTER CHI */ ++ { 0x07f8, 0x03c8 }, /* Greek_psi ψ GREEK SMALL LETTER PSI */ ++ { 0x07f9, 0x03c9 }, /* Greek_omega ω GREEK SMALL LETTER OMEGA */ ++ { 0x07b5, 0x03ca }, /* Greek_iotadieresis ϊ GREEK SMALL LETTER IOTA WITH DIALYTIKA */ ++ { 0x07b9, 0x03cb }, /* Greek_upsilondieresis ϋ GREEK SMALL LETTER UPSILON WITH DIALYTIKA */ ++ { 0x07b7, 0x03cc }, /* Greek_omicronaccent ό GREEK SMALL LETTER OMICRON WITH TONOS */ ++ { 0x07b8, 0x03cd }, /* Greek_upsilonaccent ύ GREEK SMALL LETTER UPSILON WITH TONOS */ ++ { 0x07bb, 0x03ce }, /* Greek_omegaaccent ώ GREEK SMALL LETTER OMEGA WITH TONOS */ ++ { 0x06b3, 0x0401 }, /* Cyrillic_IO Ё CYRILLIC CAPITAL LETTER IO */ ++ { 0x06b1, 0x0402 }, /* Serbian_DJE Ђ CYRILLIC CAPITAL LETTER DJE */ ++ { 0x06b2, 0x0403 }, /* Macedonia_GJE Ѓ CYRILLIC CAPITAL LETTER GJE */ ++ { 0x06b4, 0x0404 }, /* Ukrainian_IE Є CYRILLIC CAPITAL LETTER UKRAINIAN IE */ ++ { 0x06b5, 0x0405 }, /* Macedonia_DSE Ѕ CYRILLIC CAPITAL LETTER DZE */ ++ { 0x06b6, 0x0406 }, /* Ukrainian_I І CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */ ++ { 0x06b7, 0x0407 }, /* Ukrainian_YI Ї CYRILLIC CAPITAL LETTER YI */ ++ { 0x06b8, 0x0408 }, /* Cyrillic_JE Ј CYRILLIC CAPITAL LETTER JE */ ++ { 0x06b9, 0x0409 }, /* Cyrillic_LJE Љ CYRILLIC CAPITAL LETTER LJE */ ++ { 0x06ba, 0x040a }, /* Cyrillic_NJE Њ CYRILLIC CAPITAL LETTER NJE */ ++ { 0x06bb, 0x040b }, /* Serbian_TSHE Ћ CYRILLIC CAPITAL LETTER TSHE */ ++ { 0x06bc, 0x040c }, /* Macedonia_KJE Ќ CYRILLIC CAPITAL LETTER KJE */ ++ { 0x06be, 0x040e }, /* Byelorussian_SHORTU Ў CYRILLIC CAPITAL LETTER SHORT U */ ++ { 0x06bf, 0x040f }, /* Cyrillic_DZHE Џ CYRILLIC CAPITAL LETTER DZHE */ ++ { 0x06e1, 0x0410 }, /* Cyrillic_A А CYRILLIC CAPITAL LETTER A */ ++ { 0x06e2, 0x0411 }, /* Cyrillic_BE Б CYRILLIC CAPITAL LETTER BE */ ++ { 0x06f7, 0x0412 }, /* Cyrillic_VE В CYRILLIC CAPITAL LETTER VE */ ++ { 0x06e7, 0x0413 }, /* Cyrillic_GHE Г CYRILLIC CAPITAL LETTER GHE */ ++ { 0x06e4, 0x0414 }, /* Cyrillic_DE Д CYRILLIC CAPITAL LETTER DE */ ++ { 0x06e5, 0x0415 }, /* Cyrillic_IE Е CYRILLIC CAPITAL LETTER IE */ ++ { 0x06f6, 0x0416 }, /* Cyrillic_ZHE Ж CYRILLIC CAPITAL LETTER ZHE */ ++ { 0x06fa, 0x0417 }, /* Cyrillic_ZE З CYRILLIC CAPITAL LETTER ZE */ ++ { 0x06e9, 0x0418 }, /* Cyrillic_I И CYRILLIC CAPITAL LETTER I */ ++ { 0x06ea, 0x0419 }, /* Cyrillic_SHORTI Й CYRILLIC CAPITAL LETTER SHORT I */ ++ { 0x06eb, 0x041a }, /* Cyrillic_KA К CYRILLIC CAPITAL LETTER KA */ ++ { 0x06ec, 0x041b }, /* Cyrillic_EL Л CYRILLIC CAPITAL LETTER EL */ ++ { 0x06ed, 0x041c }, /* Cyrillic_EM М CYRILLIC CAPITAL LETTER EM */ ++ { 0x06ee, 0x041d }, /* Cyrillic_EN Н CYRILLIC CAPITAL LETTER EN */ ++ { 0x06ef, 0x041e }, /* Cyrillic_O О CYRILLIC CAPITAL LETTER O */ ++ { 0x06f0, 0x041f }, /* Cyrillic_PE П CYRILLIC CAPITAL LETTER PE */ ++ { 0x06f2, 0x0420 }, /* Cyrillic_ER Р CYRILLIC CAPITAL LETTER ER */ ++ { 0x06f3, 0x0421 }, /* Cyrillic_ES С CYRILLIC CAPITAL LETTER ES */ ++ { 0x06f4, 0x0422 }, /* Cyrillic_TE Т CYRILLIC CAPITAL LETTER TE */ ++ { 0x06f5, 0x0423 }, /* Cyrillic_U У CYRILLIC CAPITAL LETTER U */ ++ { 0x06e6, 0x0424 }, /* Cyrillic_EF Ф CYRILLIC CAPITAL LETTER EF */ ++ { 0x06e8, 0x0425 }, /* Cyrillic_HA Х CYRILLIC CAPITAL LETTER HA */ ++ { 0x06e3, 0x0426 }, /* Cyrillic_TSE Ц CYRILLIC CAPITAL LETTER TSE */ ++ { 0x06fe, 0x0427 }, /* Cyrillic_CHE Ч CYRILLIC CAPITAL LETTER CHE */ ++ { 0x06fb, 0x0428 }, /* Cyrillic_SHA Ш CYRILLIC CAPITAL LETTER SHA */ ++ { 0x06fd, 0x0429 }, /* Cyrillic_SHCHA Щ CYRILLIC CAPITAL LETTER SHCHA */ ++ { 0x06ff, 0x042a }, /* Cyrillic_HARDSIGN Ъ CYRILLIC CAPITAL LETTER HARD SIGN */ ++ { 0x06f9, 0x042b }, /* Cyrillic_YERU Ы CYRILLIC CAPITAL LETTER YERU */ ++ { 0x06f8, 0x042c }, /* Cyrillic_SOFTSIGN Ь CYRILLIC CAPITAL LETTER SOFT SIGN */ ++ { 0x06fc, 0x042d }, /* Cyrillic_E Э CYRILLIC CAPITAL LETTER E */ ++ { 0x06e0, 0x042e }, /* Cyrillic_YU Ю CYRILLIC CAPITAL LETTER YU */ ++ { 0x06f1, 0x042f }, /* Cyrillic_YA Я CYRILLIC CAPITAL LETTER YA */ ++ { 0x06c1, 0x0430 }, /* Cyrillic_a а CYRILLIC SMALL LETTER A */ ++ { 0x06c2, 0x0431 }, /* Cyrillic_be б CYRILLIC SMALL LETTER BE */ ++ { 0x06d7, 0x0432 }, /* Cyrillic_ve в CYRILLIC SMALL LETTER VE */ ++ { 0x06c7, 0x0433 }, /* Cyrillic_ghe г CYRILLIC SMALL LETTER GHE */ ++ { 0x06c4, 0x0434 }, /* Cyrillic_de д CYRILLIC SMALL LETTER DE */ ++ { 0x06c5, 0x0435 }, /* Cyrillic_ie е CYRILLIC SMALL LETTER IE */ ++ { 0x06d6, 0x0436 }, /* Cyrillic_zhe ж CYRILLIC SMALL LETTER ZHE */ ++ { 0x06da, 0x0437 }, /* Cyrillic_ze з CYRILLIC SMALL LETTER ZE */ ++ { 0x06c9, 0x0438 }, /* Cyrillic_i и CYRILLIC SMALL LETTER I */ ++ { 0x06ca, 0x0439 }, /* Cyrillic_shorti й CYRILLIC SMALL LETTER SHORT I */ ++ { 0x06cb, 0x043a }, /* Cyrillic_ka к CYRILLIC SMALL LETTER KA */ ++ { 0x06cc, 0x043b }, /* Cyrillic_el л CYRILLIC SMALL LETTER EL */ ++ { 0x06cd, 0x043c }, /* Cyrillic_em м CYRILLIC SMALL LETTER EM */ ++ { 0x06ce, 0x043d }, /* Cyrillic_en н CYRILLIC SMALL LETTER EN */ ++ { 0x06cf, 0x043e }, /* Cyrillic_o о CYRILLIC SMALL LETTER O */ ++ { 0x06d0, 0x043f }, /* Cyrillic_pe п CYRILLIC SMALL LETTER PE */ ++ { 0x06d2, 0x0440 }, /* Cyrillic_er р CYRILLIC SMALL LETTER ER */ ++ { 0x06d3, 0x0441 }, /* Cyrillic_es с CYRILLIC SMALL LETTER ES */ ++ { 0x06d4, 0x0442 }, /* Cyrillic_te т CYRILLIC SMALL LETTER TE */ ++ { 0x06d5, 0x0443 }, /* Cyrillic_u у CYRILLIC SMALL LETTER U */ ++ { 0x06c6, 0x0444 }, /* Cyrillic_ef ф CYRILLIC SMALL LETTER EF */ ++ { 0x06c8, 0x0445 }, /* Cyrillic_ha х CYRILLIC SMALL LETTER HA */ ++ { 0x06c3, 0x0446 }, /* Cyrillic_tse ц CYRILLIC SMALL LETTER TSE */ ++ { 0x06de, 0x0447 }, /* Cyrillic_che ч CYRILLIC SMALL LETTER CHE */ ++ { 0x06db, 0x0448 }, /* Cyrillic_sha ш CYRILLIC SMALL LETTER SHA */ ++ { 0x06dd, 0x0449 }, /* Cyrillic_shcha щ CYRILLIC SMALL LETTER SHCHA */ ++ { 0x06df, 0x044a }, /* Cyrillic_hardsign ъ CYRILLIC SMALL LETTER HARD SIGN */ ++ { 0x06d9, 0x044b }, /* Cyrillic_yeru ы CYRILLIC SMALL LETTER YERU */ ++ { 0x06d8, 0x044c }, /* Cyrillic_softsign ь CYRILLIC SMALL LETTER SOFT SIGN */ ++ { 0x06dc, 0x044d }, /* Cyrillic_e э CYRILLIC SMALL LETTER E */ ++ { 0x06c0, 0x044e }, /* Cyrillic_yu ю CYRILLIC SMALL LETTER YU */ ++ { 0x06d1, 0x044f }, /* Cyrillic_ya я CYRILLIC SMALL LETTER YA */ ++ { 0x06a3, 0x0451 }, /* Cyrillic_io ё CYRILLIC SMALL LETTER IO */ ++ { 0x06a1, 0x0452 }, /* Serbian_dje ђ CYRILLIC SMALL LETTER DJE */ ++ { 0x06a2, 0x0453 }, /* Macedonia_gje ѓ CYRILLIC SMALL LETTER GJE */ ++ { 0x06a4, 0x0454 }, /* Ukrainian_ie є CYRILLIC SMALL LETTER UKRAINIAN IE */ ++ { 0x06a5, 0x0455 }, /* Macedonia_dse ѕ CYRILLIC SMALL LETTER DZE */ ++ { 0x06a6, 0x0456 }, /* Ukrainian_i і CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I */ ++ { 0x06a7, 0x0457 }, /* Ukrainian_yi ї CYRILLIC SMALL LETTER YI */ ++ { 0x06a8, 0x0458 }, /* Cyrillic_je ј CYRILLIC SMALL LETTER JE */ ++ { 0x06a9, 0x0459 }, /* Cyrillic_lje љ CYRILLIC SMALL LETTER LJE */ ++ { 0x06aa, 0x045a }, /* Cyrillic_nje њ CYRILLIC SMALL LETTER NJE */ ++ { 0x06ab, 0x045b }, /* Serbian_tshe ћ CYRILLIC SMALL LETTER TSHE */ ++ { 0x06ac, 0x045c }, /* Macedonia_kje ќ CYRILLIC SMALL LETTER KJE */ ++ { 0x06ae, 0x045e }, /* Byelorussian_shortu ў CYRILLIC SMALL LETTER SHORT U */ ++ { 0x06af, 0x045f }, /* Cyrillic_dzhe џ CYRILLIC SMALL LETTER DZHE */ ++ { 0x0ce0, 0x05d0 }, /* hebrew_aleph א HEBREW LETTER ALEF */ ++ { 0x0ce1, 0x05d1 }, /* hebrew_bet ב HEBREW LETTER BET */ ++ { 0x0ce2, 0x05d2 }, /* hebrew_gimel ג HEBREW LETTER GIMEL */ ++ { 0x0ce3, 0x05d3 }, /* hebrew_dalet ד HEBREW LETTER DALET */ ++ { 0x0ce4, 0x05d4 }, /* hebrew_he ה HEBREW LETTER HE */ ++ { 0x0ce5, 0x05d5 }, /* hebrew_waw ו HEBREW LETTER VAV */ ++ { 0x0ce6, 0x05d6 }, /* hebrew_zain ז HEBREW LETTER ZAYIN */ ++ { 0x0ce7, 0x05d7 }, /* hebrew_chet ח HEBREW LETTER HET */ ++ { 0x0ce8, 0x05d8 }, /* hebrew_tet ט HEBREW LETTER TET */ ++ { 0x0ce9, 0x05d9 }, /* hebrew_yod י HEBREW LETTER YOD */ ++ { 0x0cea, 0x05da }, /* hebrew_finalkaph ך HEBREW LETTER FINAL KAF */ ++ { 0x0ceb, 0x05db }, /* hebrew_kaph כ HEBREW LETTER KAF */ ++ { 0x0cec, 0x05dc }, /* hebrew_lamed ל HEBREW LETTER LAMED */ ++ { 0x0ced, 0x05dd }, /* hebrew_finalmem ם HEBREW LETTER FINAL MEM */ ++ { 0x0cee, 0x05de }, /* hebrew_mem מ HEBREW LETTER MEM */ ++ { 0x0cef, 0x05df }, /* hebrew_finalnun ן HEBREW LETTER FINAL NUN */ ++ { 0x0cf0, 0x05e0 }, /* hebrew_nun נ HEBREW LETTER NUN */ ++ { 0x0cf1, 0x05e1 }, /* hebrew_samech ס HEBREW LETTER SAMEKH */ ++ { 0x0cf2, 0x05e2 }, /* hebrew_ayin ע HEBREW LETTER AYIN */ ++ { 0x0cf3, 0x05e3 }, /* hebrew_finalpe ף HEBREW LETTER FINAL PE */ ++ { 0x0cf4, 0x05e4 }, /* hebrew_pe פ HEBREW LETTER PE */ ++ { 0x0cf5, 0x05e5 }, /* hebrew_finalzade ץ HEBREW LETTER FINAL TSADI */ ++ { 0x0cf6, 0x05e6 }, /* hebrew_zade צ HEBREW LETTER TSADI */ ++ { 0x0cf7, 0x05e7 }, /* hebrew_qoph ק HEBREW LETTER QOF */ ++ { 0x0cf8, 0x05e8 }, /* hebrew_resh ר HEBREW LETTER RESH */ ++ { 0x0cf9, 0x05e9 }, /* hebrew_shin ש HEBREW LETTER SHIN */ ++ { 0x0cfa, 0x05ea }, /* hebrew_taw ת HEBREW LETTER TAV */ ++ { 0x05ac, 0x060c }, /* Arabic_comma ، ARABIC COMMA */ ++ { 0x05bb, 0x061b }, /* Arabic_semicolon ؛ ARABIC SEMICOLON */ ++ { 0x05bf, 0x061f }, /* Arabic_question_mark ؟ ARABIC QUESTION MARK */ ++ { 0x05c1, 0x0621 }, /* Arabic_hamza ء ARABIC LETTER HAMZA */ ++ { 0x05c2, 0x0622 }, /* Arabic_maddaonalef آ ARABIC LETTER ALEF WITH MADDA ABOVE */ ++ { 0x05c3, 0x0623 }, /* Arabic_hamzaonalef أ ARABIC LETTER ALEF WITH HAMZA ABOVE */ ++ { 0x05c4, 0x0624 }, /* Arabic_hamzaonwaw ؤ ARABIC LETTER WAW WITH HAMZA ABOVE */ ++ { 0x05c5, 0x0625 }, /* Arabic_hamzaunderalef إ ARABIC LETTER ALEF WITH HAMZA BELOW */ ++ { 0x05c6, 0x0626 }, /* Arabic_hamzaonyeh ئ ARABIC LETTER YEH WITH HAMZA ABOVE */ ++ { 0x05c7, 0x0627 }, /* Arabic_alef ا ARABIC LETTER ALEF */ ++ { 0x05c8, 0x0628 }, /* Arabic_beh ب ARABIC LETTER BEH */ ++ { 0x05c9, 0x0629 }, /* Arabic_tehmarbuta ة ARABIC LETTER TEH MARBUTA */ ++ { 0x05ca, 0x062a }, /* Arabic_teh ت ARABIC LETTER TEH */ ++ { 0x05cb, 0x062b }, /* Arabic_theh ث ARABIC LETTER THEH */ ++ { 0x05cc, 0x062c }, /* Arabic_jeem ج ARABIC LETTER JEEM */ ++ { 0x05cd, 0x062d }, /* Arabic_hah ح ARABIC LETTER HAH */ ++ { 0x05ce, 0x062e }, /* Arabic_khah خ ARABIC LETTER KHAH */ ++ { 0x05cf, 0x062f }, /* Arabic_dal د ARABIC LETTER DAL */ ++ { 0x05d0, 0x0630 }, /* Arabic_thal ذ ARABIC LETTER THAL */ ++ { 0x05d1, 0x0631 }, /* Arabic_ra ر ARABIC LETTER REH */ ++ { 0x05d2, 0x0632 }, /* Arabic_zain ز ARABIC LETTER ZAIN */ ++ { 0x05d3, 0x0633 }, /* Arabic_seen س ARABIC LETTER SEEN */ ++ { 0x05d4, 0x0634 }, /* Arabic_sheen ش ARABIC LETTER SHEEN */ ++ { 0x05d5, 0x0635 }, /* Arabic_sad ص ARABIC LETTER SAD */ ++ { 0x05d6, 0x0636 }, /* Arabic_dad ض ARABIC LETTER DAD */ ++ { 0x05d7, 0x0637 }, /* Arabic_tah ط ARABIC LETTER TAH */ ++ { 0x05d8, 0x0638 }, /* Arabic_zah ظ ARABIC LETTER ZAH */ ++ { 0x05d9, 0x0639 }, /* Arabic_ain ع ARABIC LETTER AIN */ ++ { 0x05da, 0x063a }, /* Arabic_ghain غ ARABIC LETTER GHAIN */ ++ { 0x05e0, 0x0640 }, /* Arabic_tatweel ـ ARABIC TATWEEL */ ++ { 0x05e1, 0x0641 }, /* Arabic_feh ف ARABIC LETTER FEH */ ++ { 0x05e2, 0x0642 }, /* Arabic_qaf ق ARABIC LETTER QAF */ ++ { 0x05e3, 0x0643 }, /* Arabic_kaf ك ARABIC LETTER KAF */ ++ { 0x05e4, 0x0644 }, /* Arabic_lam ل ARABIC LETTER LAM */ ++ { 0x05e5, 0x0645 }, /* Arabic_meem م ARABIC LETTER MEEM */ ++ { 0x05e6, 0x0646 }, /* Arabic_noon ن ARABIC LETTER NOON */ ++ { 0x05e7, 0x0647 }, /* Arabic_ha ه ARABIC LETTER HEH */ ++ { 0x05e8, 0x0648 }, /* Arabic_waw و ARABIC LETTER WAW */ ++ { 0x05e9, 0x0649 }, /* Arabic_alefmaksura ى ARABIC LETTER ALEF MAKSURA */ ++ { 0x05ea, 0x064a }, /* Arabic_yeh ي ARABIC LETTER YEH */ ++ { 0x05eb, 0x064b }, /* Arabic_fathatan ً ARABIC FATHATAN */ ++ { 0x05ec, 0x064c }, /* Arabic_dammatan ٌ ARABIC DAMMATAN */ ++ { 0x05ed, 0x064d }, /* Arabic_kasratan ٍ ARABIC KASRATAN */ ++ { 0x05ee, 0x064e }, /* Arabic_fatha َ ARABIC FATHA */ ++ { 0x05ef, 0x064f }, /* Arabic_damma ُ ARABIC DAMMA */ ++ { 0x05f0, 0x0650 }, /* Arabic_kasra ِ ARABIC KASRA */ ++ { 0x05f1, 0x0651 }, /* Arabic_shadda ّ ARABIC SHADDA */ ++ { 0x05f2, 0x0652 }, /* Arabic_sukun ْ ARABIC SUKUN */ ++ { 0x0da1, 0x0e01 }, /* Thai_kokai ก THAI CHARACTER KO KAI */ ++ { 0x0da2, 0x0e02 }, /* Thai_khokhai ข THAI CHARACTER KHO KHAI */ ++ { 0x0da3, 0x0e03 }, /* Thai_khokhuat ฃ THAI CHARACTER KHO KHUAT */ ++ { 0x0da4, 0x0e04 }, /* Thai_khokhwai ค THAI CHARACTER KHO KHWAI */ ++ { 0x0da5, 0x0e05 }, /* Thai_khokhon ฅ THAI CHARACTER KHO KHON */ ++ { 0x0da6, 0x0e06 }, /* Thai_khorakhang ฆ THAI CHARACTER KHO RAKHANG */ ++ { 0x0da7, 0x0e07 }, /* Thai_ngongu ง THAI CHARACTER NGO NGU */ ++ { 0x0da8, 0x0e08 }, /* Thai_chochan จ THAI CHARACTER CHO CHAN */ ++ { 0x0da9, 0x0e09 }, /* Thai_choching ฉ THAI CHARACTER CHO CHING */ ++ { 0x0daa, 0x0e0a }, /* Thai_chochang ช THAI CHARACTER CHO CHANG */ ++ { 0x0dab, 0x0e0b }, /* Thai_soso ซ THAI CHARACTER SO SO */ ++ { 0x0dac, 0x0e0c }, /* Thai_chochoe ฌ THAI CHARACTER CHO CHOE */ ++ { 0x0dad, 0x0e0d }, /* Thai_yoying ญ THAI CHARACTER YO YING */ ++ { 0x0dae, 0x0e0e }, /* Thai_dochada ฎ THAI CHARACTER DO CHADA */ ++ { 0x0daf, 0x0e0f }, /* Thai_topatak ฏ THAI CHARACTER TO PATAK */ ++ { 0x0db0, 0x0e10 }, /* Thai_thothan ฐ THAI CHARACTER THO THAN */ ++ { 0x0db1, 0x0e11 }, /* Thai_thonangmontho ฑ THAI CHARACTER THO NANGMONTHO */ ++ { 0x0db2, 0x0e12 }, /* Thai_thophuthao ฒ THAI CHARACTER THO PHUTHAO */ ++ { 0x0db3, 0x0e13 }, /* Thai_nonen ณ THAI CHARACTER NO NEN */ ++ { 0x0db4, 0x0e14 }, /* Thai_dodek ด THAI CHARACTER DO DEK */ ++ { 0x0db5, 0x0e15 }, /* Thai_totao ต THAI CHARACTER TO TAO */ ++ { 0x0db6, 0x0e16 }, /* Thai_thothung ถ THAI CHARACTER THO THUNG */ ++ { 0x0db7, 0x0e17 }, /* Thai_thothahan ท THAI CHARACTER THO THAHAN */ ++ { 0x0db8, 0x0e18 }, /* Thai_thothong ธ THAI CHARACTER THO THONG */ ++ { 0x0db9, 0x0e19 }, /* Thai_nonu น THAI CHARACTER NO NU */ ++ { 0x0dba, 0x0e1a }, /* Thai_bobaimai บ THAI CHARACTER BO BAIMAI */ ++ { 0x0dbb, 0x0e1b }, /* Thai_popla ป THAI CHARACTER PO PLA */ ++ { 0x0dbc, 0x0e1c }, /* Thai_phophung ผ THAI CHARACTER PHO PHUNG */ ++ { 0x0dbd, 0x0e1d }, /* Thai_fofa ฝ THAI CHARACTER FO FA */ ++ { 0x0dbe, 0x0e1e }, /* Thai_phophan พ THAI CHARACTER PHO PHAN */ ++ { 0x0dbf, 0x0e1f }, /* Thai_fofan ฟ THAI CHARACTER FO FAN */ ++ { 0x0dc0, 0x0e20 }, /* Thai_phosamphao ภ THAI CHARACTER PHO SAMPHAO */ ++ { 0x0dc1, 0x0e21 }, /* Thai_moma ม THAI CHARACTER MO MA */ ++ { 0x0dc2, 0x0e22 }, /* Thai_yoyak ย THAI CHARACTER YO YAK */ ++ { 0x0dc3, 0x0e23 }, /* Thai_rorua ร THAI CHARACTER RO RUA */ ++ { 0x0dc4, 0x0e24 }, /* Thai_ru ฤ THAI CHARACTER RU */ ++ { 0x0dc5, 0x0e25 }, /* Thai_loling ล THAI CHARACTER LO LING */ ++ { 0x0dc6, 0x0e26 }, /* Thai_lu ฦ THAI CHARACTER LU */ ++ { 0x0dc7, 0x0e27 }, /* Thai_wowaen ว THAI CHARACTER WO WAEN */ ++ { 0x0dc8, 0x0e28 }, /* Thai_sosala ศ THAI CHARACTER SO SALA */ ++ { 0x0dc9, 0x0e29 }, /* Thai_sorusi ษ THAI CHARACTER SO RUSI */ ++ { 0x0dca, 0x0e2a }, /* Thai_sosua ส THAI CHARACTER SO SUA */ ++ { 0x0dcb, 0x0e2b }, /* Thai_hohip ห THAI CHARACTER HO HIP */ ++ { 0x0dcc, 0x0e2c }, /* Thai_lochula ฬ THAI CHARACTER LO CHULA */ ++ { 0x0dcd, 0x0e2d }, /* Thai_oang อ THAI CHARACTER O ANG */ ++ { 0x0dce, 0x0e2e }, /* Thai_honokhuk ฮ THAI CHARACTER HO NOKHUK */ ++ { 0x0dcf, 0x0e2f }, /* Thai_paiyannoi ฯ THAI CHARACTER PAIYANNOI */ ++ { 0x0dd0, 0x0e30 }, /* Thai_saraa ะ THAI CHARACTER SARA A */ ++ { 0x0dd1, 0x0e31 }, /* Thai_maihanakat ั THAI CHARACTER MAI HAN-AKAT */ ++ { 0x0dd2, 0x0e32 }, /* Thai_saraaa า THAI CHARACTER SARA AA */ ++ { 0x0dd3, 0x0e33 }, /* Thai_saraam ำ THAI CHARACTER SARA AM */ ++ { 0x0dd4, 0x0e34 }, /* Thai_sarai ิ THAI CHARACTER SARA I */ ++ { 0x0dd5, 0x0e35 }, /* Thai_saraii ี THAI CHARACTER SARA II */ ++ { 0x0dd6, 0x0e36 }, /* Thai_saraue ึ THAI CHARACTER SARA UE */ ++ { 0x0dd7, 0x0e37 }, /* Thai_sarauee ื THAI CHARACTER SARA UEE */ ++ { 0x0dd8, 0x0e38 }, /* Thai_sarau ุ THAI CHARACTER SARA U */ ++ { 0x0dd9, 0x0e39 }, /* Thai_sarauu ู THAI CHARACTER SARA UU */ ++ { 0x0dda, 0x0e3a }, /* Thai_phinthu ฺ THAI CHARACTER PHINTHU */ ++ { 0x0ddf, 0x0e3f }, /* Thai_baht ฿ THAI CURRENCY SYMBOL BAHT */ ++ { 0x0de0, 0x0e40 }, /* Thai_sarae เ THAI CHARACTER SARA E */ ++ { 0x0de1, 0x0e41 }, /* Thai_saraae แ THAI CHARACTER SARA AE */ ++ { 0x0de2, 0x0e42 }, /* Thai_sarao โ THAI CHARACTER SARA O */ ++ { 0x0de3, 0x0e43 }, /* Thai_saraaimaimuan ใ THAI CHARACTER SARA AI MAIMUAN */ ++ { 0x0de4, 0x0e44 }, /* Thai_saraaimaimalai ไ THAI CHARACTER SARA AI MAIMALAI */ ++ { 0x0de5, 0x0e45 }, /* Thai_lakkhangyao ๅ THAI CHARACTER LAKKHANGYAO */ ++ { 0x0de6, 0x0e46 }, /* Thai_maiyamok ๆ THAI CHARACTER MAIYAMOK */ ++ { 0x0de7, 0x0e47 }, /* Thai_maitaikhu ็ THAI CHARACTER MAITAIKHU */ ++ { 0x0de8, 0x0e48 }, /* Thai_maiek ่ THAI CHARACTER MAI EK */ ++ { 0x0de9, 0x0e49 }, /* Thai_maitho ้ THAI CHARACTER MAI THO */ ++ { 0x0dea, 0x0e4a }, /* Thai_maitri ๊ THAI CHARACTER MAI TRI */ ++ { 0x0deb, 0x0e4b }, /* Thai_maichattawa ๋ THAI CHARACTER MAI CHATTAWA */ ++ { 0x0dec, 0x0e4c }, /* Thai_thanthakhat ์ THAI CHARACTER THANTHAKHAT */ ++ { 0x0ded, 0x0e4d }, /* Thai_nikhahit ํ THAI CHARACTER NIKHAHIT */ ++ { 0x0df0, 0x0e50 }, /* Thai_leksun ๐ THAI DIGIT ZERO */ ++ { 0x0df1, 0x0e51 }, /* Thai_leknung ๑ THAI DIGIT ONE */ ++ { 0x0df2, 0x0e52 }, /* Thai_leksong ๒ THAI DIGIT TWO */ ++ { 0x0df3, 0x0e53 }, /* Thai_leksam ๓ THAI DIGIT THREE */ ++ { 0x0df4, 0x0e54 }, /* Thai_leksi ๔ THAI DIGIT FOUR */ ++ { 0x0df5, 0x0e55 }, /* Thai_lekha ๕ THAI DIGIT FIVE */ ++ { 0x0df6, 0x0e56 }, /* Thai_lekhok ๖ THAI DIGIT SIX */ ++ { 0x0df7, 0x0e57 }, /* Thai_lekchet ๗ THAI DIGIT SEVEN */ ++ { 0x0df8, 0x0e58 }, /* Thai_lekpaet ๘ THAI DIGIT EIGHT */ ++ { 0x0df9, 0x0e59 }, /* Thai_lekkao ๙ THAI DIGIT NINE */ ++ { 0x0ed4, 0x11a8 }, /* Hangul_J_Kiyeog ᆨ HANGUL JONGSEONG KIYEOK */ ++ { 0x0ed5, 0x11a9 }, /* Hangul_J_SsangKiyeog ᆩ HANGUL JONGSEONG SSANGKIYEOK */ ++ { 0x0ed6, 0x11aa }, /* Hangul_J_KiyeogSios ᆪ HANGUL JONGSEONG KIYEOK-SIOS */ ++ { 0x0ed7, 0x11ab }, /* Hangul_J_Nieun ᆫ HANGUL JONGSEONG NIEUN */ ++ { 0x0ed8, 0x11ac }, /* Hangul_J_NieunJieuj ᆬ HANGUL JONGSEONG NIEUN-CIEUC */ ++ { 0x0ed9, 0x11ad }, /* Hangul_J_NieunHieuh ᆭ HANGUL JONGSEONG NIEUN-HIEUH */ ++ { 0x0eda, 0x11ae }, /* Hangul_J_Dikeud ᆮ HANGUL JONGSEONG TIKEUT */ ++ { 0x0edb, 0x11af }, /* Hangul_J_Rieul ᆯ HANGUL JONGSEONG RIEUL */ ++ { 0x0edc, 0x11b0 }, /* Hangul_J_RieulKiyeog ᆰ HANGUL JONGSEONG RIEUL-KIYEOK */ ++ { 0x0edd, 0x11b1 }, /* Hangul_J_RieulMieum ᆱ HANGUL JONGSEONG RIEUL-MIEUM */ ++ { 0x0ede, 0x11b2 }, /* Hangul_J_RieulPieub ᆲ HANGUL JONGSEONG RIEUL-PIEUP */ ++ { 0x0edf, 0x11b3 }, /* Hangul_J_RieulSios ᆳ HANGUL JONGSEONG RIEUL-SIOS */ ++ { 0x0ee0, 0x11b4 }, /* Hangul_J_RieulTieut ᆴ HANGUL JONGSEONG RIEUL-THIEUTH */ ++ { 0x0ee1, 0x11b5 }, /* Hangul_J_RieulPhieuf ᆵ HANGUL JONGSEONG RIEUL-PHIEUPH */ ++ { 0x0ee2, 0x11b6 }, /* Hangul_J_RieulHieuh ᆶ HANGUL JONGSEONG RIEUL-HIEUH */ ++ { 0x0ee3, 0x11b7 }, /* Hangul_J_Mieum ᆷ HANGUL JONGSEONG MIEUM */ ++ { 0x0ee4, 0x11b8 }, /* Hangul_J_Pieub ᆸ HANGUL JONGSEONG PIEUP */ ++ { 0x0ee5, 0x11b9 }, /* Hangul_J_PieubSios ᆹ HANGUL JONGSEONG PIEUP-SIOS */ ++ { 0x0ee6, 0x11ba }, /* Hangul_J_Sios ᆺ HANGUL JONGSEONG SIOS */ ++ { 0x0ee7, 0x11bb }, /* Hangul_J_SsangSios ᆻ HANGUL JONGSEONG SSANGSIOS */ ++ { 0x0ee8, 0x11bc }, /* Hangul_J_Ieung ᆼ HANGUL JONGSEONG IEUNG */ ++ { 0x0ee9, 0x11bd }, /* Hangul_J_Jieuj ᆽ HANGUL JONGSEONG CIEUC */ ++ { 0x0eea, 0x11be }, /* Hangul_J_Cieuc ᆾ HANGUL JONGSEONG CHIEUCH */ ++ { 0x0eeb, 0x11bf }, /* Hangul_J_Khieuq ᆿ HANGUL JONGSEONG KHIEUKH */ ++ { 0x0eec, 0x11c0 }, /* Hangul_J_Tieut ᇀ HANGUL JONGSEONG THIEUTH */ ++ { 0x0eed, 0x11c1 }, /* Hangul_J_Phieuf ᇁ HANGUL JONGSEONG PHIEUPH */ ++ { 0x0eee, 0x11c2 }, /* Hangul_J_Hieuh ᇂ HANGUL JONGSEONG HIEUH */ ++ { 0x0ef8, 0x11eb }, /* Hangul_J_PanSios ᇫ HANGUL JONGSEONG PANSIOS */ ++ { 0x0efa, 0x11f9 }, /* Hangul_J_YeorinHieuh ᇹ HANGUL JONGSEONG YEORINHIEUH */ ++ { 0x0aa2, 0x2002 }, /* enspace   EN SPACE */ ++ { 0x0aa1, 0x2003 }, /* emspace   EM SPACE */ ++ { 0x0aa3, 0x2004 }, /* em3space   THREE-PER-EM SPACE */ ++ { 0x0aa4, 0x2005 }, /* em4space   FOUR-PER-EM SPACE */ ++ { 0x0aa5, 0x2007 }, /* digitspace   FIGURE SPACE */ ++ { 0x0aa6, 0x2008 }, /* punctspace   PUNCTUATION SPACE */ ++ { 0x0aa7, 0x2009 }, /* thinspace   THIN SPACE */ ++ { 0x0aa8, 0x200a }, /* hairspace   HAIR SPACE */ ++ { 0x0abb, 0x2012 }, /* figdash ‒ FIGURE DASH */ ++ { 0x0aaa, 0x2013 }, /* endash – EN DASH */ ++ { 0x0aa9, 0x2014 }, /* emdash — EM DASH */ ++ { 0x07af, 0x2015 }, /* Greek_horizbar ― HORIZONTAL BAR */ ++ { 0x0cdf, 0x2017 }, /* hebrew_doublelowline ‗ DOUBLE LOW LINE */ ++ { 0x0ad0, 0x2018 }, /* leftsinglequotemark ‘ LEFT SINGLE QUOTATION MARK */ ++ { 0x0ad1, 0x2019 }, /* rightsinglequotemark ’ RIGHT SINGLE QUOTATION MARK */ ++ { 0x0afd, 0x201a }, /* singlelowquotemark ‚ SINGLE LOW-9 QUOTATION MARK */ ++ { 0x0ad2, 0x201c }, /* leftdoublequotemark “ LEFT DOUBLE QUOTATION MARK */ ++ { 0x0ad3, 0x201d }, /* rightdoublequotemark ” RIGHT DOUBLE QUOTATION MARK */ ++ { 0x0afe, 0x201e }, /* doublelowquotemark „ DOUBLE LOW-9 QUOTATION MARK */ ++ { 0x0af1, 0x2020 }, /* dagger † DAGGER */ ++ { 0x0af2, 0x2021 }, /* doubledagger ‡ DOUBLE DAGGER */ ++ { 0x0ae6, 0x2022 }, /* enfilledcircbullet • BULLET */ ++ { 0x0aae, 0x2026 }, /* ellipsis … HORIZONTAL ELLIPSIS */ ++ { 0x0ad6, 0x2032 }, /* minutes ′ PRIME */ ++ { 0x0ad7, 0x2033 }, /* seconds ″ DOUBLE PRIME */ ++ { 0x0afc, 0x2038 }, /* caret ‸ CARET */ ++ { 0x047e, 0x203e }, /* overline ‾ OVERLINE */ ++ { 0x20a0, 0x20a0 }, /* EcuSign ₠ EURO-CURRENCY SIGN */ ++ { 0x20a1, 0x20a1 }, /* ColonSign ₡ COLON SIGN */ ++ { 0x20a2, 0x20a2 }, /* CruzeiroSign ₢ CRUZEIRO SIGN */ ++ { 0x20a3, 0x20a3 }, /* FFrancSign ₣ FRENCH FRANC SIGN */ ++ { 0x20a4, 0x20a4 }, /* LiraSign ₤ LIRA SIGN */ ++ { 0x20a5, 0x20a5 }, /* MillSign ₥ MILL SIGN */ ++ { 0x20a6, 0x20a6 }, /* NairaSign ₦ NAIRA SIGN */ ++ { 0x20a7, 0x20a7 }, /* PesetaSign ₧ PESETA SIGN */ ++ { 0x20a8, 0x20a8 }, /* RupeeSign ₨ RUPEE SIGN */ ++ { 0x0eff, 0x20a9 }, /* Korean_Won ₩ WON SIGN */ ++ { 0x20a9, 0x20a9 }, /* WonSign ₩ WON SIGN */ ++ { 0x20aa, 0x20aa }, /* NewSheqelSign ₪ NEW SHEQEL SIGN */ ++ { 0x20ab, 0x20ab }, /* DongSign ₫ DONG SIGN */ ++ { 0x20ac, 0x20ac }, /* EuroSign € EURO SIGN */ ++ { 0x0ab8, 0x2105 }, /* careof ℅ CARE OF */ ++ { 0x06b0, 0x2116 }, /* numerosign № NUMERO SIGN */ ++ { 0x0afb, 0x2117 }, /* phonographcopyright ℗ SOUND RECORDING COPYRIGHT */ ++ { 0x0ad4, 0x211e }, /* prescription ℞ PRESCRIPTION TAKE */ ++ { 0x0ac9, 0x2122 }, /* trademark ™ TRADE MARK SIGN */ ++ { 0x0ab0, 0x2153 }, /* onethird ⅓ VULGAR FRACTION ONE THIRD */ ++ { 0x0ab1, 0x2154 }, /* twothirds ⅔ VULGAR FRACTION TWO THIRDS */ ++ { 0x0ab2, 0x2155 }, /* onefifth ⅕ VULGAR FRACTION ONE FIFTH */ ++ { 0x0ab3, 0x2156 }, /* twofifths ⅖ VULGAR FRACTION TWO FIFTHS */ ++ { 0x0ab4, 0x2157 }, /* threefifths ⅗ VULGAR FRACTION THREE FIFTHS */ ++ { 0x0ab5, 0x2158 }, /* fourfifths ⅘ VULGAR FRACTION FOUR FIFTHS */ ++ { 0x0ab6, 0x2159 }, /* onesixth ⅙ VULGAR FRACTION ONE SIXTH */ ++ { 0x0ab7, 0x215a }, /* fivesixths ⅚ VULGAR FRACTION FIVE SIXTHS */ ++ { 0x0ac3, 0x215b }, /* oneeighth ⅛ VULGAR FRACTION ONE EIGHTH */ ++ { 0x0ac4, 0x215c }, /* threeeighths ⅜ VULGAR FRACTION THREE EIGHTHS */ ++ { 0x0ac5, 0x215d }, /* fiveeighths ⅝ VULGAR FRACTION FIVE EIGHTHS */ ++ { 0x0ac6, 0x215e }, /* seveneighths ⅞ VULGAR FRACTION SEVEN EIGHTHS */ ++ { 0x08fb, 0x2190 }, /* leftarrow ← LEFTWARDS ARROW */ ++ { 0x08fc, 0x2191 }, /* uparrow ↑ UPWARDS ARROW */ ++ { 0x08fd, 0x2192 }, /* rightarrow → RIGHTWARDS ARROW */ ++ { 0x08fe, 0x2193 }, /* downarrow ↓ DOWNWARDS ARROW */ ++ { 0x08ce, 0x21d2 }, /* implies ⇒ RIGHTWARDS DOUBLE ARROW */ ++ { 0x08cd, 0x21d4 }, /* ifonlyif ⇔ LEFT RIGHT DOUBLE ARROW */ ++ { 0x08ef, 0x2202 }, /* partialderivative ∂ PARTIAL DIFFERENTIAL */ ++ { 0x08c5, 0x2207 }, /* nabla ∇ NABLA */ ++ { 0x0bca, 0x2218 }, /* jot ∘ RING OPERATOR */ ++ { 0x08d6, 0x221a }, /* radical √ SQUARE ROOT */ ++ { 0x08c1, 0x221d }, /* variation ∝ PROPORTIONAL TO */ ++ { 0x08c2, 0x221e }, /* infinity ∞ INFINITY */ ++ { 0x08de, 0x2227 }, /* logicaland ∧ LOGICAL AND */ ++ { 0x0ba9, 0x2227 }, /* upcaret ∧ LOGICAL AND */ ++ { 0x08df, 0x2228 }, /* logicalor ∨ LOGICAL OR */ ++ { 0x0ba8, 0x2228 }, /* downcaret ∨ LOGICAL OR */ ++ { 0x08dc, 0x2229 }, /* intersection ∩ INTERSECTION */ ++ { 0x0bc3, 0x2229 }, /* upshoe ∩ INTERSECTION */ ++ { 0x08dd, 0x222a }, /* union ∪ UNION */ ++ { 0x0bd6, 0x222a }, /* downshoe ∪ UNION */ ++ { 0x08bf, 0x222b }, /* integral ∫ INTEGRAL */ ++ { 0x08c0, 0x2234 }, /* therefore ∴ THEREFORE */ ++ { 0x08c8, 0x2245 }, /* approximate ≅ APPROXIMATELY EQUAL TO */ ++ { 0x08bd, 0x2260 }, /* notequal ≠ NOT EQUAL TO */ ++ { 0x08cf, 0x2261 }, /* identical ≡ IDENTICAL TO */ ++ { 0x08bc, 0x2264 }, /* lessthanequal ≤ LESS-THAN OR EQUAL TO */ ++ { 0x08be, 0x2265 }, /* greaterthanequal ≥ GREATER-THAN OR EQUAL TO */ ++ { 0x08da, 0x2282 }, /* includedin ⊂ SUBSET OF */ ++ { 0x0bda, 0x2282 }, /* leftshoe ⊂ SUBSET OF */ ++ { 0x08db, 0x2283 }, /* includes ⊃ SUPERSET OF */ ++ { 0x0bd8, 0x2283 }, /* rightshoe ⊃ SUPERSET OF */ ++ { 0x0bfc, 0x22a2 }, /* righttack ⊢ RIGHT TACK */ ++ { 0x0bdc, 0x22a3 }, /* lefttack ⊣ LEFT TACK */ ++ { 0x0bc2, 0x22a4 }, /* downtack ⊤ DOWN TACK */ ++ { 0x0bce, 0x22a5 }, /* uptack ⊥ UP TACK */ ++ { 0x0bd3, 0x2308 }, /* upstile ⌈ LEFT CEILING */ ++ { 0x0bc4, 0x230a }, /* downstile ⌊ LEFT FLOOR */ ++ { 0x0afa, 0x2315 }, /* telephonerecorder ⌕ TELEPHONE RECORDER */ ++ { 0x08a4, 0x2320 }, /* topintegral ⌠ TOP HALF INTEGRAL */ ++ { 0x08a5, 0x2321 }, /* botintegral ⌡ BOTTOM HALF INTEGRAL */ ++ { 0x0abc, 0x2329 }, /* leftanglebracket 〈 LEFT-POINTING ANGLE BRACKET */ ++ { 0x0abe, 0x232a }, /* rightanglebracket 〉 RIGHT-POINTING ANGLE BRACKET */ ++ { 0x0bcc, 0x2395 }, /* quad ⎕ APL FUNCTIONAL SYMBOL QUAD (Unicode 3.0) */ ++ { 0x09e2, 0x2409 }, /* ht ␉ SYMBOL FOR HORIZONTAL TABULATION */ ++ { 0x09e5, 0x240a }, /* lf ␊ SYMBOL FOR LINE FEED */ ++ { 0x09e9, 0x240b }, /* vt ␋ SYMBOL FOR VERTICAL TABULATION */ ++ { 0x09e3, 0x240c }, /* ff ␌ SYMBOL FOR FORM FEED */ ++ { 0x09e4, 0x240d }, /* cr ␍ SYMBOL FOR CARRIAGE RETURN */ ++ { 0x09df, 0x2422 }, /* blank ␢ BLANK SYMBOL */ ++ { 0x09e8, 0x2424 }, /* nl ␤ SYMBOL FOR NEWLINE */ ++ { 0x09f1, 0x2500 }, /* horizlinescan5 ─ BOX DRAWINGS LIGHT HORIZONTAL */ ++ { 0x08a6, 0x2502 }, /* vertconnector │ BOX DRAWINGS LIGHT VERTICAL */ ++ { 0x09f8, 0x2502 }, /* vertbar │ BOX DRAWINGS LIGHT VERTICAL */ ++ { 0x09ec, 0x250c }, /* upleftcorner ┌ BOX DRAWINGS LIGHT DOWN AND RIGHT */ ++ { 0x09eb, 0x2510 }, /* uprightcorner ┐ BOX DRAWINGS LIGHT DOWN AND LEFT */ ++ { 0x09ed, 0x2514 }, /* lowleftcorner └ BOX DRAWINGS LIGHT UP AND RIGHT */ ++ { 0x09ea, 0x2518 }, /* lowrightcorner ┘ BOX DRAWINGS LIGHT UP AND LEFT */ ++ { 0x09f4, 0x251c }, /* leftt ├ BOX DRAWINGS LIGHT VERTICAL AND RIGHT */ ++ { 0x09f5, 0x2524 }, /* rightt ┤ BOX DRAWINGS LIGHT VERTICAL AND LEFT */ ++ { 0x09f7, 0x252c }, /* topt ┬ BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */ ++ { 0x09f6, 0x2534 }, /* bott ┴ BOX DRAWINGS LIGHT UP AND HORIZONTAL */ ++ { 0x09ee, 0x253c }, /* crossinglines ┼ BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */ ++ { 0x09e1, 0x2592 }, /* checkerboard ▒ MEDIUM SHADE */ ++ { 0x0adf, 0x25a0 }, /* emfilledrect ■ BLACK SQUARE */ ++ { 0x0acf, 0x25a1 }, /* emopenrectangle □ WHITE SQUARE */ ++ { 0x0ae7, 0x25aa }, /* enfilledsqbullet ▪ BLACK SMALL SQUARE */ ++ { 0x0ae1, 0x25ab }, /* enopensquarebullet ▫ WHITE SMALL SQUARE */ ++ { 0x0adb, 0x25ac }, /* filledrectbullet ▬ BLACK RECTANGLE */ ++ { 0x0ae2, 0x25ad }, /* openrectbullet ▭ WHITE RECTANGLE */ ++ { 0x0ae8, 0x25b2 }, /* filledtribulletup ▲ BLACK UP-POINTING TRIANGLE */ ++ { 0x0ae3, 0x25b3 }, /* opentribulletup △ WHITE UP-POINTING TRIANGLE */ ++ { 0x0add, 0x25b6 }, /* filledrighttribullet ▶ BLACK RIGHT-POINTING TRIANGLE */ ++ { 0x0acd, 0x25b7 }, /* rightopentriangle ▷ WHITE RIGHT-POINTING TRIANGLE */ ++ { 0x0ae9, 0x25bc }, /* filledtribulletdown ▼ BLACK DOWN-POINTING TRIANGLE */ ++ { 0x0ae4, 0x25bd }, /* opentribulletdown ▽ WHITE DOWN-POINTING TRIANGLE */ ++ { 0x0adc, 0x25c0 }, /* filledlefttribullet ◀ BLACK LEFT-POINTING TRIANGLE */ ++ { 0x0acc, 0x25c1 }, /* leftopentriangle ◁ WHITE LEFT-POINTING TRIANGLE */ ++ { 0x09e0, 0x25c6 }, /* soliddiamond ◆ BLACK DIAMOND */ ++ { 0x0ace, 0x25cb }, /* emopencircle ○ WHITE CIRCLE */ ++ { 0x0bcf, 0x25cb }, /* circle ○ WHITE CIRCLE */ ++ { 0x0ade, 0x25cf }, /* emfilledcircle ● BLACK CIRCLE */ ++ { 0x0ae0, 0x25e6 }, /* enopencircbullet ◦ WHITE BULLET */ ++ { 0x0ae5, 0x2606 }, /* openstar ☆ WHITE STAR */ ++ { 0x0af9, 0x260e }, /* telephone ☎ BLACK TELEPHONE */ ++ { 0x0aca, 0x2613 }, /* signaturemark ☓ SALTIRE */ ++ { 0x0aea, 0x261c }, /* leftpointer ☜ WHITE LEFT POINTING INDEX */ ++ { 0x0aeb, 0x261e }, /* rightpointer ☞ WHITE RIGHT POINTING INDEX */ ++ { 0x0af8, 0x2640 }, /* femalesymbol ♀ FEMALE SIGN */ ++ { 0x0af7, 0x2642 }, /* malesymbol ♂ MALE SIGN */ ++ { 0x0aec, 0x2663 }, /* club ♣ BLACK CLUB SUIT */ ++ { 0x0aee, 0x2665 }, /* heart ♥ BLACK HEART SUIT */ ++ { 0x0aed, 0x2666 }, /* diamond ♦ BLACK DIAMOND SUIT */ ++ { 0x0af6, 0x266d }, /* musicalflat ♭ MUSIC FLAT SIGN */ ++ { 0x0af5, 0x266f }, /* musicalsharp ♯ MUSIC SHARP SIGN */ ++ { 0x0af3, 0x2713 }, /* checkmark ✓ CHECK MARK */ ++ { 0x0af4, 0x2717 }, /* ballotcross ✗ BALLOT X */ ++ { 0x0ad9, 0x271d }, /* latincross ✝ LATIN CROSS */ ++ { 0x0af0, 0x2720 }, /* maltesecross ✠ MALTESE CROSS */ ++ { 0x04a4, 0x3001 }, /* kana_comma 、 IDEOGRAPHIC COMMA */ ++ { 0x04a1, 0x3002 }, /* kana_fullstop 。 IDEOGRAPHIC FULL STOP */ ++ { 0x04a2, 0x300c }, /* kana_openingbracket 「 LEFT CORNER BRACKET */ ++ { 0x04a3, 0x300d }, /* kana_closingbracket 」 RIGHT CORNER BRACKET */ ++ { 0x04de, 0x309b }, /* voicedsound ゛ KATAKANA-HIRAGANA VOICED SOUND MARK */ ++ { 0x04df, 0x309c }, /* semivoicedsound ゜ KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */ ++ { 0x04a7, 0x30a1 }, /* kana_a ァ KATAKANA LETTER SMALL A */ ++ { 0x04b1, 0x30a2 }, /* kana_A ア KATAKANA LETTER A */ ++ { 0x04a8, 0x30a3 }, /* kana_i ィ KATAKANA LETTER SMALL I */ ++ { 0x04b2, 0x30a4 }, /* kana_I イ KATAKANA LETTER I */ ++ { 0x04a9, 0x30a5 }, /* kana_u ゥ KATAKANA LETTER SMALL U */ ++ { 0x04b3, 0x30a6 }, /* kana_U ウ KATAKANA LETTER U */ ++ { 0x04aa, 0x30a7 }, /* kana_e ェ KATAKANA LETTER SMALL E */ ++ { 0x04b4, 0x30a8 }, /* kana_E エ KATAKANA LETTER E */ ++ { 0x04ab, 0x30a9 }, /* kana_o ォ KATAKANA LETTER SMALL O */ ++ { 0x04b5, 0x30aa }, /* kana_O オ KATAKANA LETTER O */ ++ { 0x04b6, 0x30ab }, /* kana_KA カ KATAKANA LETTER KA */ ++ { 0x04b7, 0x30ad }, /* kana_KI キ KATAKANA LETTER KI */ ++ { 0x04b8, 0x30af }, /* kana_KU ク KATAKANA LETTER KU */ ++ { 0x04b9, 0x30b1 }, /* kana_KE ケ KATAKANA LETTER KE */ ++ { 0x04ba, 0x30b3 }, /* kana_KO コ KATAKANA LETTER KO */ ++ { 0x04bb, 0x30b5 }, /* kana_SA サ KATAKANA LETTER SA */ ++ { 0x04bc, 0x30b7 }, /* kana_SHI シ KATAKANA LETTER SI */ ++ { 0x04bd, 0x30b9 }, /* kana_SU ス KATAKANA LETTER SU */ ++ { 0x04be, 0x30bb }, /* kana_SE セ KATAKANA LETTER SE */ ++ { 0x04bf, 0x30bd }, /* kana_SO ソ KATAKANA LETTER SO */ ++ { 0x04c0, 0x30bf }, /* kana_TA タ KATAKANA LETTER TA */ ++ { 0x04c1, 0x30c1 }, /* kana_CHI チ KATAKANA LETTER TI */ ++ { 0x04af, 0x30c3 }, /* kana_tsu ッ KATAKANA LETTER SMALL TU */ ++ { 0x04c2, 0x30c4 }, /* kana_TSU ツ KATAKANA LETTER TU */ ++ { 0x04c3, 0x30c6 }, /* kana_TE テ KATAKANA LETTER TE */ ++ { 0x04c4, 0x30c8 }, /* kana_TO ト KATAKANA LETTER TO */ ++ { 0x04c5, 0x30ca }, /* kana_NA ナ KATAKANA LETTER NA */ ++ { 0x04c6, 0x30cb }, /* kana_NI ニ KATAKANA LETTER NI */ ++ { 0x04c7, 0x30cc }, /* kana_NU ヌ KATAKANA LETTER NU */ ++ { 0x04c8, 0x30cd }, /* kana_NE ネ KATAKANA LETTER NE */ ++ { 0x04c9, 0x30ce }, /* kana_NO ノ KATAKANA LETTER NO */ ++ { 0x04ca, 0x30cf }, /* kana_HA ハ KATAKANA LETTER HA */ ++ { 0x04cb, 0x30d2 }, /* kana_HI ヒ KATAKANA LETTER HI */ ++ { 0x04cc, 0x30d5 }, /* kana_FU フ KATAKANA LETTER HU */ ++ { 0x04cd, 0x30d8 }, /* kana_HE ヘ KATAKANA LETTER HE */ ++ { 0x04ce, 0x30db }, /* kana_HO ホ KATAKANA LETTER HO */ ++ { 0x04cf, 0x30de }, /* kana_MA マ KATAKANA LETTER MA */ ++ { 0x04d0, 0x30df }, /* kana_MI ミ KATAKANA LETTER MI */ ++ { 0x04d1, 0x30e0 }, /* kana_MU ム KATAKANA LETTER MU */ ++ { 0x04d2, 0x30e1 }, /* kana_ME メ KATAKANA LETTER ME */ ++ { 0x04d3, 0x30e2 }, /* kana_MO モ KATAKANA LETTER MO */ ++ { 0x04ac, 0x30e3 }, /* kana_ya ャ KATAKANA LETTER SMALL YA */ ++ { 0x04d4, 0x30e4 }, /* kana_YA ヤ KATAKANA LETTER YA */ ++ { 0x04ad, 0x30e5 }, /* kana_yu ュ KATAKANA LETTER SMALL YU */ ++ { 0x04d5, 0x30e6 }, /* kana_YU ユ KATAKANA LETTER YU */ ++ { 0x04ae, 0x30e7 }, /* kana_yo ョ KATAKANA LETTER SMALL YO */ ++ { 0x04d6, 0x30e8 }, /* kana_YO ヨ KATAKANA LETTER YO */ ++ { 0x04d7, 0x30e9 }, /* kana_RA ラ KATAKANA LETTER RA */ ++ { 0x04d8, 0x30ea }, /* kana_RI リ KATAKANA LETTER RI */ ++ { 0x04d9, 0x30eb }, /* kana_RU ル KATAKANA LETTER RU */ ++ { 0x04da, 0x30ec }, /* kana_RE レ KATAKANA LETTER RE */ ++ { 0x04db, 0x30ed }, /* kana_RO ロ KATAKANA LETTER RO */ ++ { 0x04dc, 0x30ef }, /* kana_WA ワ KATAKANA LETTER WA */ ++ { 0x04a6, 0x30f2 }, /* kana_WO ヲ KATAKANA LETTER WO */ ++ { 0x04dd, 0x30f3 }, /* kana_N ン KATAKANA LETTER N */ ++ { 0x04a5, 0x30fb }, /* kana_conjunctive ・ KATAKANA MIDDLE DOT */ ++ { 0x04b0, 0x30fc }, /* prolongedsound ー KATAKANA-HIRAGANA PROLONGED SOUND MARK */ ++ { 0x0ea1, 0x3131 }, /* Hangul_Kiyeog ㄱ HANGUL LETTER KIYEOK */ ++ { 0x0ea2, 0x3132 }, /* Hangul_SsangKiyeog ㄲ HANGUL LETTER SSANGKIYEOK */ ++ { 0x0ea3, 0x3133 }, /* Hangul_KiyeogSios ㄳ HANGUL LETTER KIYEOK-SIOS */ ++ { 0x0ea4, 0x3134 }, /* Hangul_Nieun ㄴ HANGUL LETTER NIEUN */ ++ { 0x0ea5, 0x3135 }, /* Hangul_NieunJieuj ㄵ HANGUL LETTER NIEUN-CIEUC */ ++ { 0x0ea6, 0x3136 }, /* Hangul_NieunHieuh ㄶ HANGUL LETTER NIEUN-HIEUH */ ++ { 0x0ea7, 0x3137 }, /* Hangul_Dikeud ㄷ HANGUL LETTER TIKEUT */ ++ { 0x0ea8, 0x3138 }, /* Hangul_SsangDikeud ㄸ HANGUL LETTER SSANGTIKEUT */ ++ { 0x0ea9, 0x3139 }, /* Hangul_Rieul ㄹ HANGUL LETTER RIEUL */ ++ { 0x0eaa, 0x313a }, /* Hangul_RieulKiyeog ㄺ HANGUL LETTER RIEUL-KIYEOK */ ++ { 0x0eab, 0x313b }, /* Hangul_RieulMieum ㄻ HANGUL LETTER RIEUL-MIEUM */ ++ { 0x0eac, 0x313c }, /* Hangul_RieulPieub ㄼ HANGUL LETTER RIEUL-PIEUP */ ++ { 0x0ead, 0x313d }, /* Hangul_RieulSios ㄽ HANGUL LETTER RIEUL-SIOS */ ++ { 0x0eae, 0x313e }, /* Hangul_RieulTieut ㄾ HANGUL LETTER RIEUL-THIEUTH */ ++ { 0x0eaf, 0x313f }, /* Hangul_RieulPhieuf ㄿ HANGUL LETTER RIEUL-PHIEUPH */ ++ { 0x0eb0, 0x3140 }, /* Hangul_RieulHieuh ㅀ HANGUL LETTER RIEUL-HIEUH */ ++ { 0x0eb1, 0x3141 }, /* Hangul_Mieum ㅁ HANGUL LETTER MIEUM */ ++ { 0x0eb2, 0x3142 }, /* Hangul_Pieub ㅂ HANGUL LETTER PIEUP */ ++ { 0x0eb3, 0x3143 }, /* Hangul_SsangPieub ㅃ HANGUL LETTER SSANGPIEUP */ ++ { 0x0eb4, 0x3144 }, /* Hangul_PieubSios ㅄ HANGUL LETTER PIEUP-SIOS */ ++ { 0x0eb5, 0x3145 }, /* Hangul_Sios ㅅ HANGUL LETTER SIOS */ ++ { 0x0eb6, 0x3146 }, /* Hangul_SsangSios ㅆ HANGUL LETTER SSANGSIOS */ ++ { 0x0eb7, 0x3147 }, /* Hangul_Ieung ㅇ HANGUL LETTER IEUNG */ ++ { 0x0eb8, 0x3148 }, /* Hangul_Jieuj ㅈ HANGUL LETTER CIEUC */ ++ { 0x0eb9, 0x3149 }, /* Hangul_SsangJieuj ㅉ HANGUL LETTER SSANGCIEUC */ ++ { 0x0eba, 0x314a }, /* Hangul_Cieuc ㅊ HANGUL LETTER CHIEUCH */ ++ { 0x0ebb, 0x314b }, /* Hangul_Khieuq ㅋ HANGUL LETTER KHIEUKH */ ++ { 0x0ebc, 0x314c }, /* Hangul_Tieut ㅌ HANGUL LETTER THIEUTH */ ++ { 0x0ebd, 0x314d }, /* Hangul_Phieuf ㅍ HANGUL LETTER PHIEUPH */ ++ { 0x0ebe, 0x314e }, /* Hangul_Hieuh ㅎ HANGUL LETTER HIEUH */ ++ { 0x0ebf, 0x314f }, /* Hangul_A ㅏ HANGUL LETTER A */ ++ { 0x0ec0, 0x3150 }, /* Hangul_AE ㅐ HANGUL LETTER AE */ ++ { 0x0ec1, 0x3151 }, /* Hangul_YA ㅑ HANGUL LETTER YA */ ++ { 0x0ec2, 0x3152 }, /* Hangul_YAE ㅒ HANGUL LETTER YAE */ ++ { 0x0ec3, 0x3153 }, /* Hangul_EO ㅓ HANGUL LETTER EO */ ++ { 0x0ec4, 0x3154 }, /* Hangul_E ㅔ HANGUL LETTER E */ ++ { 0x0ec5, 0x3155 }, /* Hangul_YEO ㅕ HANGUL LETTER YEO */ ++ { 0x0ec6, 0x3156 }, /* Hangul_YE ㅖ HANGUL LETTER YE */ ++ { 0x0ec7, 0x3157 }, /* Hangul_O ㅗ HANGUL LETTER O */ ++ { 0x0ec8, 0x3158 }, /* Hangul_WA ㅘ HANGUL LETTER WA */ ++ { 0x0ec9, 0x3159 }, /* Hangul_WAE ㅙ HANGUL LETTER WAE */ ++ { 0x0eca, 0x315a }, /* Hangul_OE ㅚ HANGUL LETTER OE */ ++ { 0x0ecb, 0x315b }, /* Hangul_YO ㅛ HANGUL LETTER YO */ ++ { 0x0ecc, 0x315c }, /* Hangul_U ㅜ HANGUL LETTER U */ ++ { 0x0ecd, 0x315d }, /* Hangul_WEO ㅝ HANGUL LETTER WEO */ ++ { 0x0ece, 0x315e }, /* Hangul_WE ㅞ HANGUL LETTER WE */ ++ { 0x0ecf, 0x315f }, /* Hangul_WI ㅟ HANGUL LETTER WI */ ++ { 0x0ed0, 0x3160 }, /* Hangul_YU ㅠ HANGUL LETTER YU */ ++ { 0x0ed1, 0x3161 }, /* Hangul_EU ㅡ HANGUL LETTER EU */ ++ { 0x0ed2, 0x3162 }, /* Hangul_YI ㅢ HANGUL LETTER YI */ ++ { 0x0ed3, 0x3163 }, /* Hangul_I ㅣ HANGUL LETTER I */ ++ { 0x0eef, 0x316d }, /* Hangul_RieulYeorinHieuh ㅭ HANGUL LETTER RIEUL-YEORINHIEUH */ ++ { 0x0ef0, 0x3171 }, /* Hangul_SunkyeongeumMieum ㅱ HANGUL LETTER KAPYEOUNMIEUM */ ++ { 0x0ef1, 0x3178 }, /* Hangul_SunkyeongeumPieub ㅸ HANGUL LETTER KAPYEOUNPIEUP */ ++ { 0x0ef2, 0x317f }, /* Hangul_PanSios ㅿ HANGUL LETTER PANSIOS */ ++ { 0x0ef4, 0x3184 }, /* Hangul_SunkyeongeumPhieuf ㆄ HANGUL LETTER KAPYEOUNPHIEUPH */ ++ { 0x0ef5, 0x3186 }, /* Hangul_YeorinHieuh ㆆ HANGUL LETTER YEORINHIEUH */ ++ { 0x0ef6, 0x318d }, /* Hangul_AraeA ㆍ HANGUL LETTER ARAEA */ ++ { 0x0ef7, 0x318e }, /* Hangul_AraeAE ㆎ HANGUL LETTER ARAEAE */ ++}; ++ ++#endif // KEYDATA_H +diff --git a/src/plugins/platforminputcontexts/fcitx/keyserver_x11.h b/src/plugins/platforminputcontexts/fcitx/keyserver_x11.h +new file mode 100644 +index 0000000..e735210 +--- /dev/null ++++ b/src/plugins/platforminputcontexts/fcitx/keyserver_x11.h +@@ -0,0 +1,173 @@ ++/* ++ Copyright (C) 2001 Ellis Whitehead ++ ++ Win32 port: ++ Copyright (C) 2004 Jaroslaw Staniek ++ ++ This library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Library General Public ++ License as published by the Free Software Foundation; either ++ version 2 of the License, or (at your option) any later version. ++ ++ This library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Library General Public License for more details. ++ ++ You should have received a copy of the GNU Library General Public License ++ along with this library; see the file COPYING.LIB. If not, write to ++ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ++ Boston, MA 02110-1301, USA. ++ */ ++ ++#ifndef KEYSERVER_X11_H ++#define KEYSERVER_X11_H ++ ++#include ++ ++struct TransKey { ++ int keySymQt; ++ uint keySymX; ++}; ++ ++static const TransKey g_rgQtToSymX[] = { ++ { Qt::Key_Escape, XK_Escape }, ++ { Qt::Key_Tab, XK_Tab }, ++ { Qt::Key_Backtab, XK_ISO_Left_Tab }, ++ { Qt::Key_Backspace, XK_BackSpace }, ++ { Qt::Key_Return, XK_Return }, ++ { Qt::Key_Enter, XK_KP_Enter }, ++ { Qt::Key_Insert, XK_Insert }, ++ { Qt::Key_Delete, XK_Delete }, ++ { Qt::Key_Pause, XK_Pause }, ++#ifdef sun ++ { Qt::Key_Print, XK_F22 }, ++#else ++ { Qt::Key_Print, XK_Print }, ++#endif ++ { Qt::Key_SysReq, XK_Sys_Req }, ++ { Qt::Key_Home, XK_Home }, ++ { Qt::Key_End, XK_End }, ++ { Qt::Key_Left, XK_Left }, ++ { Qt::Key_Up, XK_Up }, ++ { Qt::Key_Right, XK_Right }, ++ { Qt::Key_Down, XK_Down }, ++ //{ Qt::Key_Shift, 0 }, ++ //{ Qt::Key_Control, 0 }, ++ //{ Qt::Key_Meta, 0 }, ++ //{ Qt::Key_Alt, 0 }, ++ { Qt::Key_CapsLock, XK_Caps_Lock }, ++ { Qt::Key_NumLock, XK_Num_Lock }, ++ { Qt::Key_ScrollLock, XK_Scroll_Lock }, ++ { Qt::Key_F1, XK_F1 }, ++ { Qt::Key_F2, XK_F2 }, ++ { Qt::Key_F3, XK_F3 }, ++ { Qt::Key_F4, XK_F4 }, ++ { Qt::Key_F5, XK_F5 }, ++ { Qt::Key_F6, XK_F6 }, ++ { Qt::Key_F7, XK_F7 }, ++ { Qt::Key_F8, XK_F8 }, ++ { Qt::Key_F9, XK_F9 }, ++ { Qt::Key_F10, XK_F10 }, ++ { Qt::Key_F11, XK_F11 }, ++ { Qt::Key_F12, XK_F12 }, ++ { Qt::Key_F13, XK_F13 }, ++ { Qt::Key_F14, XK_F14 }, ++ { Qt::Key_F15, XK_F15 }, ++ { Qt::Key_F16, XK_F16 }, ++ { Qt::Key_F17, XK_F17 }, ++ { Qt::Key_F18, XK_F18 }, ++ { Qt::Key_F19, XK_F19 }, ++ { Qt::Key_F20, XK_F20 }, ++ { Qt::Key_F21, XK_F21 }, ++ { Qt::Key_F22, XK_F22 }, ++ { Qt::Key_F23, XK_F23 }, ++ { Qt::Key_F24, XK_F24 }, ++ { Qt::Key_F25, XK_F25 }, ++ { Qt::Key_F26, XK_F26 }, ++ { Qt::Key_F27, XK_F27 }, ++ { Qt::Key_F28, XK_F28 }, ++ { Qt::Key_F29, XK_F29 }, ++ { Qt::Key_F30, XK_F30 }, ++ { Qt::Key_F31, XK_F31 }, ++ { Qt::Key_F32, XK_F32 }, ++ { Qt::Key_F33, XK_F33 }, ++ { Qt::Key_F34, XK_F34 }, ++ { Qt::Key_F35, XK_F35 }, ++ { Qt::Key_Super_L, XK_Super_L }, ++ { Qt::Key_Super_R, XK_Super_R }, ++ { Qt::Key_Menu, XK_Menu }, ++ { Qt::Key_Hyper_L, XK_Hyper_L }, ++ { Qt::Key_Hyper_R, XK_Hyper_R }, ++ { Qt::Key_Help, XK_Help }, ++ ++ { '/', XK_KP_Divide }, ++ { '*', XK_KP_Multiply }, ++ { '-', XK_KP_Subtract }, ++ { '+', XK_KP_Add }, ++ { Qt::Key_Return, XK_KP_Enter }, ++ {Qt::Key_Multi_key, XK_Multi_key}, ++ {Qt::Key_Codeinput, XK_Codeinput}, ++ {Qt::Key_SingleCandidate, XK_SingleCandidate}, ++ {Qt::Key_MultipleCandidate, XK_MultipleCandidate}, ++ {Qt::Key_PreviousCandidate, XK_PreviousCandidate}, ++ {Qt::Key_Mode_switch, XK_Mode_switch}, ++ {Qt::Key_Kanji, XK_Kanji}, ++ {Qt::Key_Muhenkan, XK_Muhenkan}, ++ {Qt::Key_Henkan, XK_Henkan}, ++ {Qt::Key_Romaji, XK_Romaji}, ++ {Qt::Key_Hiragana, XK_Hiragana}, ++ {Qt::Key_Katakana, XK_Katakana}, ++ {Qt::Key_Hiragana_Katakana, XK_Hiragana_Katakana}, ++ {Qt::Key_Zenkaku, XK_Zenkaku}, ++ {Qt::Key_Hankaku, XK_Hankaku}, ++ {Qt::Key_Zenkaku_Hankaku, XK_Zenkaku_Hankaku}, ++ {Qt::Key_Touroku, XK_Touroku}, ++ {Qt::Key_Massyo, XK_Massyo}, ++ {Qt::Key_Kana_Lock, XK_Kana_Lock}, ++ {Qt::Key_Kana_Shift, XK_Kana_Shift}, ++ {Qt::Key_Eisu_Shift, XK_Eisu_Shift}, ++ {Qt::Key_Eisu_toggle, XK_Eisu_toggle}, ++ {Qt::Key_Hangul, XK_Hangul}, ++ {Qt::Key_Hangul_Start, XK_Hangul_Start}, ++ {Qt::Key_Hangul_End, XK_Hangul_End}, ++ {Qt::Key_Hangul_Hanja, XK_Hangul_Hanja}, ++ {Qt::Key_Hangul_Jamo, XK_Hangul_Jamo}, ++ {Qt::Key_Hangul_Romaja, XK_Hangul_Romaja}, ++ {Qt::Key_Hangul_Jeonja, XK_Hangul_Jeonja}, ++ {Qt::Key_Hangul_Banja, XK_Hangul_Banja}, ++ {Qt::Key_Hangul_PreHanja, XK_Hangul_PreHanja}, ++ {Qt::Key_Hangul_PostHanja, XK_Hangul_PostHanja}, ++ {Qt::Key_Hangul_Special, XK_Hangul_Special}, ++}; ++ ++#include ++ ++inline int map_sym_to_qt(uint keySym) ++{ ++ if (keySym < 0x1000) { ++ if (keySym >= 'a' && keySym <= 'z') ++ return QChar(keySym).toUpper().unicode(); ++ return keySym; ++ } ++#ifdef Q_WS_WIN ++ if (keySym < 0x3000) ++ return keySym; ++#else ++ if (keySym < 0x3000) ++ return keySym | Qt::UNICODE_ACCEL; ++ ++ for (uint i = 0; i < sizeof(g_rgQtToSymX) / sizeof(TransKey); i++) ++ if (g_rgQtToSymX[i].keySymX == keySym) ++ return g_rgQtToSymX[i].keySymQt; ++#endif ++ return Qt::Key_unknown; ++} ++ ++static bool symToKeyQt(uint keySym, int& keyQt) ++{ ++ keyQt = map_sym_to_qt(keySym); ++ return (keyQt != Qt::Key_unknown); ++} ++ ++#endif +diff --git a/src/plugins/platforminputcontexts/fcitx/keyuni.cpp b/src/plugins/platforminputcontexts/fcitx/keyuni.cpp +new file mode 100644 +index 0000000..a4dec94 +--- /dev/null ++++ b/src/plugins/platforminputcontexts/fcitx/keyuni.cpp +@@ -0,0 +1,56 @@ ++/*************************************************************************** ++ * Copyright (C) 2012~2013 by CSSlayer * ++ * * ++ * This program is free software; you can redistribute it and/or modify * ++ * it under the terms of the GNU General Public License as published by * ++ * the Free Software Foundation; either version 2 of the License, or * ++ * (at your option) any later version. * ++ * * ++ * This program is distributed in the hope that it will be useful, * ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of * ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * ++ * GNU General Public License for more details. * ++ * * ++ * You should have received a copy of the GNU General Public License * ++ * along with this program; if not, write to the * ++ * Free Software Foundation, Inc., * ++ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ++ ***************************************************************************/ ++ ++#include ++#include "keyuni.h" ++#include "keydata.h" ++ ++uint32_t ++FcitxKeySymToUnicode (uint32_t keyval) ++{ ++ int min = 0; ++ int max = sizeof (gdk_keysym_to_unicode_tab) / sizeof(gdk_keysym_to_unicode_tab[0]) - 1; ++ int mid; ++ ++ /* First check for Latin-1 characters (1:1 mapping) */ ++ if ((keyval >= 0x0020 && keyval <= 0x007e) || ++ (keyval >= 0x00a0 && keyval <= 0x00ff)) ++ return keyval; ++ ++ /* Also check for directly encoded 24-bit UCS characters: ++ */ ++ if ((keyval & 0xff000000) == 0x01000000) ++ return keyval & 0x00ffffff; ++ ++ /* binary search in table */ ++ while (max >= min) { ++ mid = (min + max) / 2; ++ if (gdk_keysym_to_unicode_tab[mid].keysym < keyval) ++ min = mid + 1; ++ else if (gdk_keysym_to_unicode_tab[mid].keysym > keyval) ++ max = mid - 1; ++ else { ++ /* found it */ ++ return gdk_keysym_to_unicode_tab[mid].ucs; ++ } ++ } ++ ++ /* No matching Unicode value found */ ++ return 0; ++} +diff --git a/src/plugins/platforminputcontexts/fcitx/keyuni.h b/src/plugins/platforminputcontexts/fcitx/keyuni.h +new file mode 100644 +index 0000000..02af14d +--- /dev/null ++++ b/src/plugins/platforminputcontexts/fcitx/keyuni.h +@@ -0,0 +1,29 @@ ++/*************************************************************************** ++ * Copyright (C) 2012~2013 by CSSlayer * ++ * * ++ * This program is free software; you can redistribute it and/or modify * ++ * it under the terms of the GNU General Public License as published by * ++ * the Free Software Foundation; either version 2 of the License, or * ++ * (at your option) any later version. * ++ * * ++ * This program is distributed in the hope that it will be useful, * ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of * ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * ++ * GNU General Public License for more details. * ++ * * ++ * You should have received a copy of the GNU General Public License * ++ * along with this program; if not, write to the * ++ * Free Software Foundation, Inc., * ++ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ++ ***************************************************************************/ ++ ++#ifndef KEYUNI_H ++#define KEYUNI_H ++ ++#include ++ ++quint32 ++FcitxKeySymToUnicode (quint32 keyval); ++ ++ ++#endif // KEYUNI_H +diff --git a/src/plugins/platforminputcontexts/fcitx/main.cpp b/src/plugins/platforminputcontexts/fcitx/main.cpp +new file mode 100644 +index 0000000..d522818 +--- /dev/null ++++ b/src/plugins/platforminputcontexts/fcitx/main.cpp +@@ -0,0 +1,35 @@ ++/*************************************************************************** ++ * Copyright (C) 2012~2013 by CSSlayer * ++ * * ++ * This program is free software; you can redistribute it and/or modify * ++ * it under the terms of the GNU General Public License as published by * ++ * the Free Software Foundation; either version 2 of the License, or * ++ * (at your option) any later version. * ++ * * ++ * This program is distributed in the hope that it will be useful, * ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of * ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * ++ * GNU General Public License for more details. * ++ * * ++ * You should have received a copy of the GNU General Public License * ++ * along with this program; if not, write to the * ++ * Free Software Foundation, Inc., * ++ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ++ ***************************************************************************/ ++ ++#include "main.h" ++ ++ ++QStringList QFcitxPlatformInputContextPlugin::keys() const ++{ ++ return QStringList(QStringLiteral("fcitx")); ++ ++} ++ ++QFcitxPlatformInputContext *QFcitxPlatformInputContextPlugin::create(const QString& system, const QStringList& paramList) ++{ ++ Q_UNUSED(paramList); ++ if (system.compare(system, QStringLiteral("fcitx"), Qt::CaseInsensitive) == 0) ++ return new QFcitxPlatformInputContext; ++ return 0; ++} +diff --git a/src/plugins/platforminputcontexts/fcitx/main.h b/src/plugins/platforminputcontexts/fcitx/main.h +new file mode 100644 +index 0000000..9938da1 +--- /dev/null ++++ b/src/plugins/platforminputcontexts/fcitx/main.h +@@ -0,0 +1,37 @@ ++/*************************************************************************** ++ * Copyright (C) 2012~2013 by CSSlayer * ++ * * ++ * This program is free software; you can redistribute it and/or modify * ++ * it under the terms of the GNU General Public License as published by * ++ * the Free Software Foundation; either version 2 of the License, or * ++ * (at your option) any later version. * ++ * * ++ * This program is distributed in the hope that it will be useful, * ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of * ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * ++ * GNU General Public License for more details. * ++ * * ++ * You should have received a copy of the GNU General Public License * ++ * along with this program; if not, write to the * ++ * Free Software Foundation, Inc., * ++ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ++ ***************************************************************************/ ++ ++#ifndef MAIN_H ++#define MAIN_H ++ ++#include ++#include ++ ++#include "qfcitxplatforminputcontext.h" ++ ++class QFcitxPlatformInputContextPlugin : public QPlatformInputContextPlugin ++{ ++ Q_OBJECT ++public: ++ Q_PLUGIN_METADATA(IID QPlatformInputContextFactoryInterface_iid FILE "fcitx.json") ++ QStringList keys() const; ++ QFcitxPlatformInputContext *create(const QString& system, const QStringList& paramList); ++}; ++ ++#endif // MAIN_H +diff --git a/src/plugins/platforminputcontexts/fcitx/qfcitxplatforminputcontext.cpp b/src/plugins/platforminputcontexts/fcitx/qfcitxplatforminputcontext.cpp +new file mode 100644 +index 0000000..adbf1bd +--- /dev/null ++++ b/src/plugins/platforminputcontexts/fcitx/qfcitxplatforminputcontext.cpp +@@ -0,0 +1,770 @@ ++/*************************************************************************** ++ * Copyright (C) 2011~2013 by CSSlayer * ++ * * ++ * This program is free software; you can redistribute it and/or modify * ++ * it under the terms of the GNU General Public License as published by * ++ * the Free Software Foundation; either version 2 of the License, or * ++ * (at your option) any later version. * ++ * * ++ * This program is distributed in the hope that it will be useful, * ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of * ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * ++ * GNU General Public License for more details. * ++ * * ++ * You should have received a copy of the GNU General Public License * ++ * along with this program; if not, write to the * ++ * Free Software Foundation, Inc., * ++ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ++ ***************************************************************************/ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++ ++#include "keyserver_x11.h" ++ ++#include "qfcitxplatforminputcontext.h" ++#include "fcitxqtinputcontextproxy.h" ++#include "fcitxqtinputmethodproxy.h" ++#include "fcitxqtconnection.h" ++#include "keyuni.h" ++#include "utils.h" ++ ++static bool key_filtered = false; ++ ++static bool ++get_boolean_env(const char *name, ++ bool defval) ++{ ++ const char *value = getenv(name); ++ ++ if (value == NULL) ++ return defval; ++ ++ if (strcmp(value, "") == 0 || ++ strcmp(value, "0") == 0 || ++ strcmp(value, "false") == 0 || ++ strcmp(value, "False") == 0 || ++ strcmp(value, "FALSE") == 0) ++ return false; ++ ++ return true; ++} ++ ++static inline const char* ++get_locale() ++{ ++ const char* locale = getenv("LC_ALL"); ++ if (!locale) ++ locale = getenv("LC_CTYPE"); ++ if (!locale) ++ locale = getenv("LANG"); ++ if (!locale) ++ locale = "C"; ++ ++ return locale; ++} ++ ++struct xkb_context* _xkb_context_new_helper() ++{ ++ struct xkb_context* context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); ++ if (context) { ++ xkb_context_set_log_level(context, XKB_LOG_LEVEL_CRITICAL); ++ } ++ ++ return context; ++} ++ ++QFcitxPlatformInputContext::QFcitxPlatformInputContext() : ++ m_connection(new FcitxQtConnection(this)), ++ m_improxy(0), ++ m_n_compose(0), ++ m_cursorPos(0), ++ m_useSurroundingText(false), ++ m_syncMode(true), ++ m_lastWId(0), ++ m_destroy(false), ++ m_xkbContext(_xkb_context_new_helper()), ++ m_xkbComposeTable(m_xkbContext ? xkb_compose_table_new_from_locale(m_xkbContext.data(), get_locale(), XKB_COMPOSE_COMPILE_NO_FLAGS) : 0), ++ m_xkbComposeState(m_xkbComposeTable ? xkb_compose_state_new(m_xkbComposeTable.data(), XKB_COMPOSE_STATE_NO_FLAGS) : 0) ++{ ++ FcitxQtFormattedPreedit::registerMetaType(); ++ ++ memset(m_compose_buffer, 0, sizeof(uint) * (MAX_COMPOSE_LEN + 1)); ++ connect(m_connection, SIGNAL(connected()), this, SLOT(connected())); ++ connect(m_connection, SIGNAL(disconnected()), this, SLOT(cleanUp())); ++ ++ m_connection->startConnection(); ++} ++ ++QFcitxPlatformInputContext::~QFcitxPlatformInputContext() ++{ ++ m_destroy = true; ++ cleanUp(); ++} ++ ++void QFcitxPlatformInputContext::connected() ++{ ++ if (!m_connection->isConnected()) ++ return; ++ ++ // qDebug() << "create Input Context" << m_connection->name(); ++ if (m_improxy) { ++ delete m_improxy; ++ m_improxy = 0; ++ } ++ m_improxy = new FcitxQtInputMethodProxy(m_connection->serviceName(), QLatin1String("/inputmethod"), *m_connection->connection(), this); ++ ++ QWindow* w = qApp->focusWindow(); ++ if (w) ++ createICData(w); ++} ++ ++void QFcitxPlatformInputContext::cleanUp() ++{ ++ for(QHash::const_iterator i = m_icMap.constBegin(), ++ e = m_icMap.constEnd(); i != e; ++i) { ++ FcitxQtICData* data = i.value(); ++ ++ if (data->proxy) ++ delete data->proxy; ++ } ++ ++ m_icMap.clear(); ++ ++ if (m_improxy) { ++ delete m_improxy; ++ m_improxy = 0; ++ } ++ ++ if (!m_destroy) { ++ commitPreedit(); ++ } ++} ++ ++bool QFcitxPlatformInputContext::isValid() const ++{ ++ return true; ++} ++ ++void QFcitxPlatformInputContext::invokeAction(QInputMethod::Action action, int cursorPosition) ++{ ++ if (action == QInputMethod::Click ++ && (cursorPosition <= 0 || cursorPosition >= m_preedit.length()) ++ ) ++ { ++ // qDebug() << action << cursorPosition; ++ commitPreedit(); ++ } ++} ++ ++void QFcitxPlatformInputContext::commitPreedit() ++{ ++ QObject *input = qApp->focusObject(); ++ if (!input) ++ return; ++ if (m_commitPreedit.length() <= 0) ++ return; ++ QInputMethodEvent e; ++ e.setCommitString(m_commitPreedit); ++ QCoreApplication::sendEvent(input, &e); ++ m_commitPreedit.clear(); ++} ++ ++ ++void QFcitxPlatformInputContext::reset() ++{ ++ commitPreedit(); ++ FcitxQtInputContextProxy* proxy = validIC(); ++ if (proxy) ++ proxy->Reset(); ++ if (m_xkbComposeState) { ++ xkb_compose_state_reset(m_xkbComposeState.data()); ++ } ++ QPlatformInputContext::reset(); ++} ++ ++void QFcitxPlatformInputContext::update(Qt::InputMethodQueries queries ) ++{ ++ QWindow* window = qApp->focusWindow(); ++ FcitxQtInputContextProxy* proxy = validICByWindow(window); ++ if (!proxy) ++ return; ++ ++ FcitxQtICData* data = m_icMap.value(window->winId()); ++ ++ QInputMethod *method = qApp->inputMethod(); ++ QObject *input = qApp->focusObject(); ++ if (!input) ++ return; ++ ++ QInputMethodQueryEvent query(queries); ++ QGuiApplication::sendEvent(input, &query); ++ ++ if (queries & Qt::ImCursorRectangle) { ++ cursorRectChanged(); ++ } ++ ++ if (queries & Qt::ImHints) { ++ Qt::InputMethodHints hints = Qt::InputMethodHints(query.value(Qt::ImHints).toUInt()); ++ ++ ++#define CHECK_HINTS(_HINTS, _CAPACITY) \ ++ if (hints & _HINTS) \ ++ addCapacity(data, _CAPACITY); \ ++ else \ ++ removeCapacity(data, _CAPACITY); ++ ++ CHECK_HINTS(Qt::ImhNoAutoUppercase, CAPACITY_NOAUTOUPPERCASE) ++ CHECK_HINTS(Qt::ImhPreferNumbers, CAPACITY_NUMBER) ++ CHECK_HINTS(Qt::ImhPreferUppercase, CAPACITY_UPPERCASE) ++ CHECK_HINTS(Qt::ImhPreferLowercase, CAPACITY_LOWERCASE) ++ CHECK_HINTS(Qt::ImhNoPredictiveText, CAPACITY_NO_SPELLCHECK) ++ CHECK_HINTS(Qt::ImhDigitsOnly, CAPACITY_DIGIT) ++ CHECK_HINTS(Qt::ImhFormattedNumbersOnly, CAPACITY_NUMBER) ++ CHECK_HINTS(Qt::ImhUppercaseOnly, CAPACITY_UPPERCASE) ++ CHECK_HINTS(Qt::ImhLowercaseOnly, CAPACITY_LOWERCASE) ++ CHECK_HINTS(Qt::ImhDialableCharactersOnly, CAPACITY_DIALABLE) ++ CHECK_HINTS(Qt::ImhEmailCharactersOnly, CAPACITY_EMAIL) ++ } ++ ++ bool setSurrounding = false; ++ do { ++ if (!m_useSurroundingText) ++ break; ++ if (!((queries & Qt::ImSurroundingText) && (queries & Qt::ImCursorPosition))) ++ break; ++ if (data->capacity.testFlag(CAPACITY_PASSWORD)) ++ break; ++ QVariant var = query.value(Qt::ImSurroundingText); ++ QVariant var1 = query.value(Qt::ImCursorPosition); ++ QVariant var2 = query.value(Qt::ImAnchorPosition); ++ if (!var.isValid() || !var1.isValid()) ++ break; ++ QString text = var.toString(); ++ /* we don't want to waste too much memory here */ ++#define SURROUNDING_THRESHOLD 4096 ++ if (text.length() < SURROUNDING_THRESHOLD) { ++ if (_utf8_check_string(text.toUtf8().data())) { ++ addCapacity(data, CAPACITY_SURROUNDING_TEXT); ++ ++ int cursor = var1.toInt(); ++ int anchor; ++ if (var2.isValid()) ++ anchor = var2.toInt(); ++ else ++ anchor = cursor; ++ if (data->surroundingText != text) { ++ data->surroundingText = text; ++ proxy->SetSurroundingText(text, cursor, anchor); ++ } ++ else { ++ if (data->surroundingAnchor != anchor || ++ data->surroundingCursor != cursor) ++ proxy->SetSurroundingTextPosition(cursor, anchor); ++ } ++ data->surroundingCursor = cursor; ++ data->surroundingAnchor = anchor; ++ setSurrounding = true; ++ } ++ } ++ if (!setSurrounding) { ++ data->surroundingAnchor = -1; ++ data->surroundingCursor = -1; ++ data->surroundingText = QString::null; ++ removeCapacity(data, CAPACITY_SURROUNDING_TEXT); ++ } ++ } while(0); ++} ++ ++void QFcitxPlatformInputContext::commit() ++{ ++ QPlatformInputContext::commit(); ++} ++ ++void QFcitxPlatformInputContext::setFocusObject(QObject* object) ++{ ++ FcitxQtInputContextProxy* proxy = validICByWId(m_lastWId); ++ if (proxy) { ++ proxy->FocusOut(); ++ } ++ ++ QWindow *window = qApp->focusWindow(); ++ if (window) { ++ m_lastWId = window->winId(); ++ } else { ++ m_lastWId = 0; ++ return; ++ } ++ proxy = validICByWindow(window); ++ if (proxy) ++ proxy->FocusIn(); ++ else { ++ FcitxQtICData* data = m_icMap.value(window->winId()); ++ if (!data) { ++ createICData(window); ++ return; ++ } ++ } ++} ++ ++void QFcitxPlatformInputContext::windowDestroyed(QObject* object) ++{ ++ /* access QWindow is not possible here, so we use our own map to do so */ ++ WId wid = m_windowToWidMap.take(object); ++ if (!wid) ++ return; ++ FcitxQtICData* data = m_icMap.take(wid); ++ if (!data) ++ return; ++ ++ delete data; ++ // qDebug() << "Window Destroyed and we destroy IC correctly, horray!"; ++} ++ ++void QFcitxPlatformInputContext::cursorRectChanged() ++{ ++ QWindow *inputWindow = qApp->focusWindow(); ++ if (!inputWindow) ++ return; ++ FcitxQtInputContextProxy* proxy = validICByWindow(inputWindow); ++ if (!proxy) ++ return; ++ ++ FcitxQtICData* data = m_icMap.value(inputWindow->winId()); ++ ++ QRect r = qApp->inputMethod()->cursorRectangle().toRect(); ++ if(!r.isValid()) ++ return; ++ ++ r.moveTopLeft(inputWindow->mapToGlobal(r.topLeft())); ++ ++ qreal scale = inputWindow->devicePixelRatio(); ++ if (data->rect != r) { ++ data->rect = r; ++ proxy->SetCursorRect(r.x() * scale, r.y() * scale, ++ r.width() * scale, r.height() * scale); ++ } ++} ++ ++void QFcitxPlatformInputContext::createInputContext(WId w) ++{ ++ if (!m_connection->isConnected()) ++ return; ++ ++ // qDebug() << "create Input Context" << m_connection->connection()->name(); ++ ++ if (m_improxy) { ++ delete m_improxy; ++ m_improxy = NULL; ++ } ++ m_improxy = new FcitxQtInputMethodProxy(m_connection->serviceName(), QLatin1String("/inputmethod"), *m_connection->connection(), this); ++ ++ if (!m_improxy->isValid()) ++ return; ++ ++ QFileInfo info(QCoreApplication::applicationFilePath()); ++ QDBusPendingReply< int, bool, uint, uint, uint, uint > result = m_improxy->CreateICv3(info.fileName(), QCoreApplication::applicationPid()); ++ QDBusPendingCallWatcher* watcher = new QDBusPendingCallWatcher(result); ++ watcher->setProperty("wid", (qulonglong) w); ++ connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), this, SLOT(createInputContextFinished(QDBusPendingCallWatcher*))); ++} ++ ++void QFcitxPlatformInputContext::createInputContextFinished(QDBusPendingCallWatcher* watcher) ++{ ++ WId w = watcher->property("wid").toULongLong(); ++ FcitxQtICData* data = m_icMap.value(w); ++ if (!data) ++ return; ++ ++ QDBusPendingReply< int, bool, uint, uint, uint, uint > result = *watcher; ++ ++ do { ++ if (result.isError()) { ++ break; ++ } ++ ++ if (!m_connection->isConnected()) ++ break; ++ ++ int id = qdbus_cast(result.argumentAt(0)); ++ QString path = QString("/inputcontext_%1").arg(id); ++ if (data->proxy) { ++ delete data->proxy; ++ } ++ data->proxy = new FcitxQtInputContextProxy(m_connection->serviceName(), path, *m_connection->connection(), this); ++ connect(data->proxy, SIGNAL(CommitString(QString)), this, SLOT(commitString(QString))); ++ connect(data->proxy, SIGNAL(ForwardKey(uint, uint, int)), this, SLOT(forwardKey(uint, uint, int))); ++ connect(data->proxy, SIGNAL(UpdateFormattedPreedit(FcitxQtFormattedPreeditList,int)), this, SLOT(updateFormattedPreedit(FcitxQtFormattedPreeditList,int))); ++ connect(data->proxy, SIGNAL(DeleteSurroundingText(int,uint)), this, SLOT(deleteSurroundingText(int,uint))); ++ ++ if (data->proxy->isValid()) { ++ QWindow* window = qApp->focusWindow(); ++ if (window && window->winId() == w) ++ data->proxy->FocusIn(); ++ } ++ ++ QFlags flag; ++ flag |= CAPACITY_PREEDIT; ++ flag |= CAPACITY_FORMATTED_PREEDIT; ++ flag |= CAPACITY_CLIENT_UNFOCUS_COMMIT; ++ m_useSurroundingText = get_boolean_env("FCITX_QT_ENABLE_SURROUNDING_TEXT", true); ++ if (m_useSurroundingText) ++ flag |= CAPACITY_SURROUNDING_TEXT; ++ ++ /* ++ * event loop will cause some problem, so we tries to use async way. ++ */ ++ m_syncMode = get_boolean_env("FCITX_QT_USE_SYNC", false); ++ ++ addCapacity(data, flag, true); ++ } while(0); ++ delete watcher; ++} ++ ++void QFcitxPlatformInputContext::updateCapacity(FcitxQtICData* data) ++{ ++ if (!data->proxy || !data->proxy->isValid()) ++ return; ++ ++ QDBusPendingReply< void > result = data->proxy->SetCapacity((uint) data->capacity); ++} ++ ++void QFcitxPlatformInputContext::commitString(const QString& str) ++{ ++ m_cursorPos = 0; ++ m_preeditList.clear(); ++ m_commitPreedit.clear(); ++ QObject *input = qApp->focusObject(); ++ if (!input) ++ return; ++ ++ QInputMethodEvent event; ++ event.setCommitString(str); ++ QCoreApplication::sendEvent(input, &event); ++} ++ ++void QFcitxPlatformInputContext::updateFormattedPreedit(const FcitxQtFormattedPreeditList& preeditList, int cursorPos) ++{ ++ QObject *input = qApp->focusObject(); ++ if (!input) ++ return; ++ if (cursorPos == m_cursorPos && preeditList == m_preeditList) ++ return; ++ m_preeditList = preeditList; ++ m_cursorPos = cursorPos; ++ QString str, commitStr; ++ int pos = 0; ++ QList attrList; ++ Q_FOREACH(const FcitxQtFormattedPreedit& preedit, preeditList) ++ { ++ str += preedit.string(); ++ if (!(preedit.format() & MSG_DONOT_COMMIT_WHEN_UNFOCUS)) ++ commitStr += preedit.string(); ++ QTextCharFormat format; ++ if ((preedit.format() & MSG_NOUNDERLINE) == 0) { ++ format.setUnderlineStyle(QTextCharFormat::DashUnderline); ++ } ++ if (preedit.format() & MSG_HIGHLIGHT) { ++ QBrush brush; ++ QPalette palette; ++ palette = QGuiApplication::palette(); ++ format.setBackground(QBrush(QColor(palette.color(QPalette::Active, QPalette::Highlight)))); ++ format.setForeground(QBrush(QColor(palette.color(QPalette::Active, QPalette::HighlightedText)))); ++ } ++ attrList.append(QInputMethodEvent::Attribute(QInputMethodEvent::TextFormat, pos, preedit.string().length(), format)); ++ pos += preedit.string().length(); ++ } ++ ++ QByteArray array = str.toUtf8(); ++ array.truncate(cursorPos); ++ cursorPos = QString::fromUtf8(array).length(); ++ ++ attrList.append(QInputMethodEvent::Attribute(QInputMethodEvent::Cursor, cursorPos, 1, 0)); ++ m_preedit = str; ++ m_commitPreedit = commitStr; ++ QInputMethodEvent event(str, attrList); ++ QCoreApplication::sendEvent(input, &event); ++ update(Qt::ImCursorRectangle); ++} ++ ++void QFcitxPlatformInputContext::deleteSurroundingText(int offset, uint nchar) ++{ ++ QObject *input = qApp->focusObject(); ++ if (!input) ++ return; ++ ++ QInputMethodEvent event; ++ event.setCommitString("", offset, nchar); ++ QCoreApplication::sendEvent(input, &event); ++} ++ ++void QFcitxPlatformInputContext::forwardKey(uint keyval, uint state, int type) ++{ ++ QObject *input = qApp->focusObject(); ++ if (input != NULL) { ++ key_filtered = true; ++ QKeyEvent *keyevent = createKeyEvent(keyval, state, type); ++ QCoreApplication::sendEvent(input, keyevent); ++ delete keyevent; ++ key_filtered = false; ++ } ++} ++ ++void QFcitxPlatformInputContext::createICData(QWindow* w) ++{ ++ FcitxQtICData* data = m_icMap.value(w->winId()); ++ if (!data) { ++ data = new FcitxQtICData; ++ m_icMap[w->winId()] = data; ++ m_windowToWidMap[w] = w->winId(); ++ connect(w, SIGNAL(destroyed(QObject*)), this, SLOT(windowDestroyed(QObject*))); ++ } ++ createInputContext(w->winId()); ++} ++ ++QKeyEvent* QFcitxPlatformInputContext::createKeyEvent(uint keyval, uint state, int type) ++{ ++ Qt::KeyboardModifiers qstate = Qt::NoModifier; ++ ++ int count = 1; ++ if (state & FcitxKeyState_Alt) { ++ qstate |= Qt::AltModifier; ++ count ++; ++ } ++ ++ if (state & FcitxKeyState_Shift) { ++ qstate |= Qt::ShiftModifier; ++ count ++; ++ } ++ ++ if (state & FcitxKeyState_Ctrl) { ++ qstate |= Qt::ControlModifier; ++ count ++; ++ } ++ ++ int key; ++ symToKeyQt(keyval, key); ++ ++ QKeyEvent* keyevent = new QKeyEvent( ++ (type == FCITX_PRESS_KEY) ? (QEvent::KeyPress) : (QEvent::KeyRelease), ++ key, ++ qstate, ++ QString(), ++ false, ++ count ++ ); ++ ++ return keyevent; ++} ++ ++bool QFcitxPlatformInputContext::filterEvent(const QEvent* event) ++{ ++ do { ++ if (event->type() != QEvent::KeyPress && event->type() != QEvent::KeyRelease) { ++ break; ++ } ++ ++ const QKeyEvent* keyEvent = static_cast(event); ++ quint32 keyval = keyEvent->nativeVirtualKey(); ++ quint32 keycode = keyEvent->nativeScanCode(); ++ quint32 state = keyEvent->nativeModifiers(); ++ bool press = keyEvent->type() == QEvent::KeyPress; ++ ++ if (key_filtered) { ++ break; ++ } ++ ++ if (!inputMethodAccepted()) ++ break; ++ ++ QObject *input = qApp->focusObject(); ++ ++ if (!input) { ++ break; ++ } ++ ++ FcitxQtInputContextProxy* proxy = validICByWindow(qApp->focusWindow()); ++ ++ if (!proxy) { ++ if (filterEventFallback(keyval, keycode, state, press)) { ++ return true; ++ } else { ++ break; ++ } ++ } ++ ++ proxy->FocusIn(); ++ ++ QDBusPendingReply< int > reply = proxy->ProcessKeyEvent(keyval, ++ keycode, ++ state, ++ (press) ? FCITX_PRESS_KEY : FCITX_RELEASE_KEY, ++ QDateTime::currentDateTime().toTime_t()); ++ ++ ++ if (Q_UNLIKELY(m_syncMode)) { ++ reply.waitForFinished(); ++ ++ if (!m_connection->isConnected() || !reply.isFinished() || reply.isError() || reply.value() <= 0) { ++ if (filterEventFallback(keyval, keycode, state, press)) { ++ return true; ++ } else { ++ break; ++ } ++ } else { ++ update(Qt::ImCursorRectangle); ++ return true; ++ } ++ } ++ else { ++ ProcessKeyWatcher* watcher = new ProcessKeyWatcher(*keyEvent, qApp->focusWindow(), reply, this); ++ connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), ++ this, SLOT(processKeyEventFinished(QDBusPendingCallWatcher*))); ++ return true; ++ } ++ } while(0); ++ return QPlatformInputContext::filterEvent(event); ++} ++ ++void QFcitxPlatformInputContext::processKeyEventFinished(QDBusPendingCallWatcher* w) ++{ ++ ProcessKeyWatcher* watcher = static_cast(w); ++ QDBusPendingReply< int > result(*watcher); ++ bool filtered = false; ++ ++ QWindow* window = watcher->window(); ++ // if window is already destroyed, we can only throw this event away. ++ if (!window) { ++ return; ++ } ++ ++ const QKeyEvent& keyEvent = watcher->event(); ++ ++ // use same variable name as in QXcbKeyboard::handleKeyEvent ++ QEvent::Type type = keyEvent.type(); ++ int qtcode = keyEvent.key(); ++ Qt::KeyboardModifiers modifiers = keyEvent.modifiers(); ++ quint32 code = keyEvent.nativeScanCode(); ++ quint32 sym = keyEvent.nativeVirtualKey(); ++ quint32 state = keyEvent.nativeModifiers(); ++ QString string = keyEvent.text(); ++ bool isAutoRepeat = keyEvent.isAutoRepeat(); ++ ulong time = keyEvent.timestamp(); ++ ++ if (result.isError() || result.value() <= 0) { ++ filtered = filterEventFallback(sym, code, state, type == QEvent::KeyPress); ++ } else { ++ filtered = true; ++ } ++ ++ if (!result.isError()) { ++ update(Qt::ImCursorRectangle); ++ } ++ ++ if (!filtered) { ++ // copied from QXcbKeyboard::handleKeyEvent() ++ if (type == QEvent::KeyPress && qtcode == Qt::Key_Menu) { ++ const QPoint globalPos = window->screen()->handle()->cursor()->pos(); ++ const QPoint pos = window->mapFromGlobal(globalPos); QWindowSystemInterface::handleContextMenuEvent(window, false, pos, globalPos, modifiers); ++ } ++ QWindowSystemInterface::handleExtendedKeyEvent(window, time, type, qtcode, modifiers, ++ code, sym, state, string, isAutoRepeat); ++ } ++ ++ delete watcher; ++} ++ ++ ++bool QFcitxPlatformInputContext::filterEventFallback(uint keyval, uint keycode, uint state, bool press) ++{ ++ Q_UNUSED(keycode); ++ if (processCompose(keyval, state, (press) ? FCITX_PRESS_KEY : FCITX_RELEASE_KEY)) { ++ return true; ++ } ++ return false; ++} ++ ++FcitxQtInputContextProxy* QFcitxPlatformInputContext::validIC() ++{ ++ if (m_icMap.isEmpty()) { ++ return 0; ++ } ++ QWindow* window = qApp->focusWindow(); ++ return validICByWindow(window); ++} ++ ++FcitxQtInputContextProxy* QFcitxPlatformInputContext::validICByWId(WId wid) ++{ ++ if (m_icMap.isEmpty()) { ++ return 0; ++ } ++ FcitxQtICData* icData = m_icMap.value(wid); ++ if (!icData) ++ return 0; ++ if (icData->proxy.isNull()) { ++ return 0; ++ } else if (icData->proxy->isValid()) { ++ return icData->proxy.data(); ++ } ++ return 0; ++} ++ ++FcitxQtInputContextProxy* QFcitxPlatformInputContext::validICByWindow(QWindow* w) ++{ ++ if (!w) { ++ return 0; ++ } ++ ++ if (m_icMap.isEmpty()) { ++ return 0; ++ } ++ return validICByWId(w->winId()); ++} ++ ++ ++bool QFcitxPlatformInputContext::processCompose(uint keyval, uint state, FcitxKeyEventType event) ++{ ++ Q_UNUSED(state); ++ ++ if (!m_xkbComposeTable || event == FCITX_RELEASE_KEY) ++ return false; ++ ++ struct xkb_compose_state* xkbComposeState = m_xkbComposeState.data(); ++ ++ enum xkb_compose_feed_result result = xkb_compose_state_feed(xkbComposeState, keyval); ++ if (result == XKB_COMPOSE_FEED_IGNORED) { ++ return false; ++ } ++ ++ enum xkb_compose_status status = xkb_compose_state_get_status(xkbComposeState); ++ if (status == XKB_COMPOSE_NOTHING) { ++ return 0; ++ } else if (status == XKB_COMPOSE_COMPOSED) { ++ char buffer[] = {'\0', '\0', '\0', '\0', '\0', '\0', '\0'}; ++ int length = xkb_compose_state_get_utf8(xkbComposeState, buffer, sizeof(buffer)); ++ xkb_compose_state_reset(xkbComposeState); ++ if (length != 0) { ++ commitString(QString::fromUtf8(buffer)); ++ } ++ ++ } else if (status == XKB_COMPOSE_CANCELLED) { ++ xkb_compose_state_reset(xkbComposeState); ++ } ++ ++ return true; ++} ++ ++ ++// kate: indent-mode cstyle; space-indent on; indent-width 0; +diff --git a/src/plugins/platforminputcontexts/fcitx/qfcitxplatforminputcontext.h b/src/plugins/platforminputcontexts/fcitx/qfcitxplatforminputcontext.h +new file mode 100644 +index 0000000..1371278 +--- /dev/null ++++ b/src/plugins/platforminputcontexts/fcitx/qfcitxplatforminputcontext.h +@@ -0,0 +1,269 @@ ++/*************************************************************************** ++ * Copyright (C) 2012~2013 by CSSlayer * ++ * * ++ * This program is free software; you can redistribute it and/or modify * ++ * it under the terms of the GNU General Public License as published by * ++ * the Free Software Foundation; either version 2 of the License, or * ++ * (at your option) any later version. * ++ * * ++ * This program is distributed in the hope that it will be useful, * ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of * ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * ++ * GNU General Public License for more details. * ++ * * ++ * You should have received a copy of the GNU General Public License * ++ * along with this program; if not, write to the * ++ * Free Software Foundation, Inc., * ++ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ++ ***************************************************************************/ ++ ++#ifndef QFCITXPLATFORMINPUTCONTEXT_H ++#define QFCITXPLATFORMINPUTCONTEXT_H ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include "fcitxqtformattedpreedit.h" ++#include "fcitxqtinputcontextproxy.h" ++ ++#define MAX_COMPOSE_LEN 7 ++ ++class FcitxQtConnection; ++class QFileSystemWatcher; ++enum FcitxKeyEventType { ++ FCITX_PRESS_KEY, ++ FCITX_RELEASE_KEY ++}; ++ ++enum FcitxCapacityFlags { ++ CAPACITY_NONE = 0, ++ CAPACITY_CLIENT_SIDE_UI = (1 << 0), ++ CAPACITY_PREEDIT = (1 << 1), ++ CAPACITY_CLIENT_SIDE_CONTROL_STATE = (1 << 2), ++ CAPACITY_PASSWORD = (1 << 3), ++ CAPACITY_FORMATTED_PREEDIT = (1 << 4), ++ CAPACITY_CLIENT_UNFOCUS_COMMIT = (1 << 5), ++ CAPACITY_SURROUNDING_TEXT = (1 << 6), ++ CAPACITY_EMAIL = (1 << 7), ++ CAPACITY_DIGIT = (1 << 8), ++ CAPACITY_UPPERCASE = (1 << 9), ++ CAPACITY_LOWERCASE = (1 << 10), ++ CAPACITY_NOAUTOUPPERCASE = (1 << 11), ++ CAPACITY_URL = (1 << 12), ++ CAPACITY_DIALABLE = (1 << 13), ++ CAPACITY_NUMBER = (1 << 14), ++ CAPACITY_NO_ON_SCREEN_KEYBOARD = (1 << 15), ++ CAPACITY_SPELLCHECK = (1 << 16), ++ CAPACITY_NO_SPELLCHECK = (1 << 17), ++ CAPACITY_WORD_COMPLETION = (1 << 18), ++ CAPACITY_UPPERCASE_WORDS = (1 << 19), ++ CAPACITY_UPPERCASE_SENTENCES = (1 << 20), ++ CAPACITY_ALPHA = (1 << 21), ++ CAPACITY_NAME = (1 << 22) ++} ; ++ ++/** message type and flags */ ++enum FcitxMessageType { ++ MSG_TYPE_FIRST = 0, ++ MSG_TYPE_LAST = 6, ++ MSG_TIPS = 0, /**< Hint Text */ ++ MSG_INPUT = 1, /**< User Input */ ++ MSG_INDEX = 2, /**< Index Number */ ++ MSG_FIRSTCAND = 3, /**< First candidate */ ++ MSG_USERPHR = 4, /**< User Phrase */ ++ MSG_CODE = 5, /**< Typed character */ ++ MSG_OTHER = 6, /**< Other Text */ ++ MSG_NOUNDERLINE = (1 << 3), /**< backward compatible, no underline is a flag */ ++ MSG_HIGHLIGHT = (1 << 4), /**< highlight the preedit */ ++ MSG_DONOT_COMMIT_WHEN_UNFOCUS = (1 << 5), /**< backward compatible */ ++ MSG_REGULAR_MASK = 0x7 /**< regular color type mask */ ++}; ++ ++ ++enum FcitxKeyState { ++ FcitxKeyState_None = 0, ++ FcitxKeyState_Shift = 1 << 0, ++ FcitxKeyState_CapsLock = 1 << 1, ++ FcitxKeyState_Ctrl = 1 << 2, ++ FcitxKeyState_Alt = 1 << 3, ++ FcitxKeyState_Alt_Shift = FcitxKeyState_Alt | FcitxKeyState_Shift, ++ FcitxKeyState_Ctrl_Shift = FcitxKeyState_Ctrl | FcitxKeyState_Shift, ++ FcitxKeyState_Ctrl_Alt = FcitxKeyState_Ctrl | FcitxKeyState_Alt, ++ FcitxKeyState_Ctrl_Alt_Shift = FcitxKeyState_Ctrl | FcitxKeyState_Alt | FcitxKeyState_Shift, ++ FcitxKeyState_NumLock = 1 << 4, ++ FcitxKeyState_Super = 1 << 6, ++ FcitxKeyState_ScrollLock = 1 << 7, ++ FcitxKeyState_MousePressed = 1 << 8, ++ FcitxKeyState_HandledMask = 1 << 24, ++ FcitxKeyState_IgnoredMask = 1 << 25, ++ FcitxKeyState_Super2 = 1 << 26, ++ FcitxKeyState_Hyper = 1 << 27, ++ FcitxKeyState_Meta = 1 << 28, ++ FcitxKeyState_UsedMask = 0x5c001fff ++}; ++ ++struct FcitxQtICData { ++ FcitxQtICData() : capacity(0), proxy(0), surroundingAnchor(-1), surroundingCursor(-1) {} ++ ~FcitxQtICData() { ++ if (proxy && proxy->isValid()) { ++ proxy->DestroyIC(); ++ delete proxy; ++ } ++ } ++ QFlags capacity; ++ QPointer proxy; ++ QRect rect; ++ QString surroundingText; ++ int surroundingAnchor; ++ int surroundingCursor; ++}; ++ ++ ++class ProcessKeyWatcher : public QDBusPendingCallWatcher ++{ ++ Q_OBJECT ++public: ++ ProcessKeyWatcher(const QKeyEvent& event, QWindow* window, const QDBusPendingCall &call, QObject *parent = 0) : ++ QDBusPendingCallWatcher(call, parent) ++ ,m_event(event.type(), event.key(), event.modifiers(), ++ event.nativeScanCode(), event.nativeVirtualKey(), event.nativeModifiers(), ++ event.text(), event.isAutoRepeat(), event.count()) ++ ,m_window(window) ++ { ++ } ++ ++ virtual ~ProcessKeyWatcher() { ++ } ++ ++ const QKeyEvent& event() { ++ return m_event; ++ } ++ ++ QWindow* window() { ++ return m_window.data(); ++ } ++ ++private: ++ QKeyEvent m_event; ++ QPointer m_window; ++}; ++ ++struct XkbContextDeleter ++{ ++ static inline void cleanup(struct xkb_context* pointer) ++ { ++ if (pointer) xkb_context_unref(pointer); ++ } ++}; ++ ++struct XkbComposeTableDeleter ++{ ++ static inline void cleanup(struct xkb_compose_table* pointer) ++ { ++ if (pointer) xkb_compose_table_unref(pointer); ++ } ++}; ++ ++struct XkbComposeStateDeleter ++{ ++ static inline void cleanup(struct xkb_compose_state* pointer) ++ { ++ if (pointer) xkb_compose_state_unref(pointer); ++ } ++}; ++ ++class FcitxQtInputMethodProxy; ++ ++class QFcitxPlatformInputContext : public QPlatformInputContext ++{ ++ Q_OBJECT ++public: ++ QFcitxPlatformInputContext(); ++ virtual ~QFcitxPlatformInputContext(); ++ ++ virtual bool filterEvent(const QEvent* event); ++ virtual bool isValid() const; ++ virtual void invokeAction(QInputMethod::Action , int cursorPosition); ++ virtual void reset(); ++ virtual void commit(); ++ virtual void update(Qt::InputMethodQueries quries ); ++ virtual void setFocusObject(QObject* object); ++ ++ ++public Q_SLOTS: ++ void cursorRectChanged(); ++ void commitString(const QString& str); ++ void updateFormattedPreedit(const FcitxQtFormattedPreeditList& preeditList, int cursorPos); ++ void deleteSurroundingText(int offset, uint nchar); ++ void forwardKey(uint keyval, uint state, int type); ++ void createInputContextFinished(QDBusPendingCallWatcher* watcher); ++ void connected(); ++ void cleanUp(); ++ void windowDestroyed(QObject* object); ++ ++ ++private: ++ void createInputContext(WId w); ++ bool processCompose(uint keyval, uint state, FcitxKeyEventType event); ++ bool checkAlgorithmically(); ++ bool checkCompactTable(const struct _FcitxComposeTableCompact *table); ++ QKeyEvent* createKeyEvent(uint keyval, uint state, int type); ++ ++ ++ void addCapacity(FcitxQtICData* data, QFlags capacity, bool forceUpdate = false) ++ { ++ QFlags< FcitxCapacityFlags > newcaps = data->capacity | capacity; ++ if (data->capacity != newcaps || forceUpdate) { ++ data->capacity = newcaps; ++ updateCapacity(data); ++ } ++ } ++ ++ void removeCapacity(FcitxQtICData* data, QFlags capacity, bool forceUpdate = false) ++ { ++ QFlags< FcitxCapacityFlags > newcaps = data->capacity & (~capacity); ++ if (data->capacity != newcaps || forceUpdate) { ++ data->capacity = newcaps; ++ updateCapacity(data); ++ } ++ } ++ ++ void updateCapacity(FcitxQtICData* data); ++ void commitPreedit(); ++ void createICData(QWindow* w); ++ FcitxQtInputContextProxy* validIC(); ++ FcitxQtInputContextProxy* validICByWindow(QWindow* window); ++ FcitxQtInputContextProxy* validICByWId(WId wid); ++ bool filterEventFallback(uint keyval, uint keycode, uint state, bool press); ++ ++ FcitxQtInputMethodProxy* m_improxy; ++ uint m_compose_buffer[MAX_COMPOSE_LEN + 1]; ++ int m_n_compose; ++ QString m_preedit; ++ QString m_commitPreedit; ++ FcitxQtFormattedPreeditList m_preeditList; ++ int m_cursorPos; ++ bool m_useSurroundingText; ++ bool m_syncMode; ++ FcitxQtConnection* m_connection; ++ QString m_lastSurroundingText; ++ int m_lastSurroundingAnchor; ++ int m_lastSurroundingCursor; ++ QHash m_icMap; ++ QHash m_windowToWidMap; ++ WId m_lastWId; ++ bool m_destroy; ++ QScopedPointer m_xkbContext; ++ QScopedPointer m_xkbComposeTable; ++ QScopedPointer m_xkbComposeState; ++private slots: ++ void processKeyEventFinished(QDBusPendingCallWatcher*); ++}; ++ ++#endif // QFCITXPLATFORMINPUTCONTEXT_H +diff --git a/src/plugins/platforminputcontexts/fcitx/utils.cpp b/src/plugins/platforminputcontexts/fcitx/utils.cpp +new file mode 100644 +index 0000000..fe4eda1 +--- /dev/null ++++ b/src/plugins/platforminputcontexts/fcitx/utils.cpp +@@ -0,0 +1,177 @@ ++/*************************************************************************** ++ * Copyright (C) 2012~2013 by CSSlayer * ++ * * ++ * This program is free software; you can redistribute it and/or modify * ++ * it under the terms of the GNU General Public License as published by * ++ * the Free Software Foundation; either version 2 of the License, or * ++ * (at your option) any later version. * ++ * * ++ * This program is distributed in the hope that it will be useful, * ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of * ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * ++ * GNU General Public License for more details. * ++ * * ++ * You should have received a copy of the GNU General Public License * ++ * along with this program; if not, write to the * ++ * Free Software Foundation, Inc., * ++ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ++ ***************************************************************************/ ++ ++#include "utils.h" ++/** check utf8 character */ ++#define ISUTF8_CB(c) (((c)&0xc0) == 0x80) ++ ++#define CONT(i) ISUTF8_CB(in[i]) ++#define VAL(i, s) ((in[i]&0x3f) << s) ++ ++#define UTF8_LENGTH(Char) \ ++ ((Char) < 0x80 ? 1 : \ ++ ((Char) < 0x800 ? 2 : \ ++ ((Char) < 0x10000 ? 3 : \ ++ ((Char) < 0x200000 ? 4 : \ ++ ((Char) < 0x4000000 ? 5 : 6))))) ++ ++#define UNICODE_VALID(Char) \ ++ ((Char) < 0x110000 && \ ++ (((Char) & 0xFFFFF800) != 0xD800) && \ ++ ((Char) < 0xFDD0 || (Char) > 0xFDEF) && \ ++ ((Char) & 0xFFFE) != 0xFFFE) ++ ++int ++_utf8_get_char_extended(const char *s, ++ int max_len) ++{ ++ const unsigned char*p = (const unsigned char*)s; ++ int i, len; ++ unsigned int wc = (unsigned char) * p; ++ ++ if (wc < 0x80) { ++ return wc; ++ } else if (wc < 0xc0) { ++ return (unsigned int) - 1; ++ } else if (wc < 0xe0) { ++ len = 2; ++ wc &= 0x1f; ++ } else if (wc < 0xf0) { ++ len = 3; ++ wc &= 0x0f; ++ } else if (wc < 0xf8) { ++ len = 4; ++ wc &= 0x07; ++ } else if (wc < 0xfc) { ++ len = 5; ++ wc &= 0x03; ++ } else if (wc < 0xfe) { ++ len = 6; ++ wc &= 0x01; ++ } else { ++ return (unsigned int) - 1; ++ } ++ ++ if (max_len >= 0 && len > max_len) { ++ for (i = 1; i < max_len; i++) { ++ if ((((unsigned char *)p)[i] & 0xc0) != 0x80) ++ return (unsigned int) - 1; ++ } ++ ++ return (unsigned int) - 2; ++ } ++ ++ for (i = 1; i < len; ++i) { ++ unsigned int ch = ((unsigned char *)p)[i]; ++ ++ if ((ch & 0xc0) != 0x80) { ++ if (ch) ++ return (unsigned int) - 1; ++ else ++ return (unsigned int) - 2; ++ } ++ ++ wc <<= 6; ++ ++ wc |= (ch & 0x3f); ++ } ++ ++ if (UTF8_LENGTH(wc) != len) ++ return (unsigned int) - 1; ++ ++ return wc; ++} ++ ++int _utf8_get_char_validated(const char *p, ++ int max_len) ++{ ++ int result; ++ ++ if (max_len == 0) ++ return -2; ++ ++ result = _utf8_get_char_extended(p, max_len); ++ ++ if (result & 0x80000000) ++ return result; ++ else if (!UNICODE_VALID(result)) ++ return -1; ++ else ++ return result; ++} ++ ++ ++char * ++_utf8_get_char(const char *i, uint32_t *chr) ++{ ++ const unsigned char* in = (const unsigned char *)i; ++ if (!(in[0] & 0x80)) { ++ *(chr) = *(in); ++ return (char *)in + 1; ++ } ++ ++ /* 2-byte, 0x80-0x7ff */ ++ if ((in[0] & 0xe0) == 0xc0 && CONT(1)) { ++ *chr = ((in[0] & 0x1f) << 6) | VAL(1, 0); ++ return (char *)in + 2; ++ } ++ ++ /* 3-byte, 0x800-0xffff */ ++ if ((in[0] & 0xf0) == 0xe0 && CONT(1) && CONT(2)) { ++ *chr = ((in[0] & 0xf) << 12) | VAL(1, 6) | VAL(2, 0); ++ return (char *)in + 3; ++ } ++ ++ /* 4-byte, 0x10000-0x1FFFFF */ ++ if ((in[0] & 0xf8) == 0xf0 && CONT(1) && CONT(2) && CONT(3)) { ++ *chr = ((in[0] & 0x7) << 18) | VAL(1, 12) | VAL(2, 6) | VAL(3, 0); ++ return (char *)in + 4; ++ } ++ ++ /* 5-byte, 0x200000-0x3FFFFFF */ ++ if ((in[0] & 0xfc) == 0xf8 && CONT(1) && CONT(2) && CONT(3) && CONT(4)) { ++ *chr = ((in[0] & 0x3) << 24) | VAL(1, 18) | VAL(2, 12) | VAL(3, 6) | VAL(4, 0); ++ return (char *)in + 5; ++ } ++ ++ /* 6-byte, 0x400000-0x7FFFFFF */ ++ if ((in[0] & 0xfe) == 0xfc && CONT(1) && CONT(2) && CONT(3) && CONT(4) && CONT(5)) { ++ *chr = ((in[0] & 0x1) << 30) | VAL(1, 24) | VAL(2, 18) | VAL(3, 12) | VAL(4, 6) | VAL(5, 0); ++ return (char *)in + 6; ++ } ++ ++ *chr = *in; ++ ++ return (char *)in + 1; ++} ++ ++ ++int _utf8_check_string(const char *s) ++{ ++ while (*s) { ++ uint32_t chr; ++ ++ if (_utf8_get_char_validated(s, 6) < 0) ++ return 0; ++ ++ s = _utf8_get_char(s, &chr); ++ } ++ ++ return 1; ++} +diff --git a/src/plugins/platforminputcontexts/fcitx/utils.h b/src/plugins/platforminputcontexts/fcitx/utils.h +new file mode 100644 +index 0000000..ae0c79c +--- /dev/null ++++ b/src/plugins/platforminputcontexts/fcitx/utils.h +@@ -0,0 +1,35 @@ ++/*************************************************************************** ++ * Copyright (C) 2012~2013 by CSSlayer * ++ * * ++ * This program is free software; you can redistribute it and/or modify * ++ * it under the terms of the GNU General Public License as published by * ++ * the Free Software Foundation; either version 2 of the License, or * ++ * (at your option) any later version. * ++ * * ++ * This program is distributed in the hope that it will be useful, * ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of * ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * ++ * GNU General Public License for more details. * ++ * * ++ * You should have received a copy of the GNU General Public License * ++ * along with this program; if not, write to the * ++ * Free Software Foundation, Inc., * ++ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ++ ***************************************************************************/ ++ ++#ifndef UTILS_H ++#define UTILS_H ++ ++#include ++ ++int ++_utf8_get_char_extended(const char *s, ++ int max_len); ++int _utf8_get_char_validated(const char *p, ++ int max_len); ++char * ++_utf8_get_char(const char *i, uint32_t *chr); ++int _utf8_check_string(const char *s); ++ ++ ++#endif // UTILS_H +diff --git a/src/plugins/platforminputcontexts/fcitx/xkbcommon/xkbcommon-compat.h b/src/plugins/platforminputcontexts/fcitx/xkbcommon/xkbcommon-compat.h +new file mode 100644 +index 0000000..299732f +--- /dev/null ++++ b/src/plugins/platforminputcontexts/fcitx/xkbcommon/xkbcommon-compat.h +@@ -0,0 +1,98 @@ ++/* ++ * Copyright © 2012 Daniel Stone ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining a ++ * copy of this software and associated documentation files (the "Software"), ++ * to deal in the Software without restriction, including without limitation ++ * the rights to use, copy, modify, merge, publish, distribute, sublicense, ++ * and/or sell copies of the Software, and to permit persons to whom the ++ * Software is furnished to do so, subject to the following conditions: ++ * ++ * The above copyright notice and this permission notice (including the next ++ * paragraph) shall be included in all copies or substantial portions of the ++ * Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ++ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++ * DEALINGS IN THE SOFTWARE. ++ * ++ * Author: Daniel Stone ++ */ ++ ++#ifndef _XKBCOMMON_COMPAT_H ++#define _XKBCOMMON_COMPAT_H ++ ++/** ++ * Renamed keymap API. ++ */ ++#define xkb_group_index_t xkb_layout_index_t ++#define xkb_group_mask_t xkb_layout_mask_t ++#define xkb_map_compile_flags xkb_keymap_compile_flags ++#define XKB_GROUP_INVALID XKB_LAYOUT_INVALID ++ ++#define XKB_STATE_DEPRESSED \ ++ (XKB_STATE_MODS_DEPRESSED | XKB_STATE_LAYOUT_DEPRESSED) ++#define XKB_STATE_LATCHED \ ++ (XKB_STATE_MODS_LATCHED | XKB_STATE_LAYOUT_LATCHED) ++#define XKB_STATE_LOCKED \ ++ (XKB_STATE_MODS_LOCKED | XKB_STATE_LAYOUT_LOCKED) ++#define XKB_STATE_EFFECTIVE \ ++ (XKB_STATE_DEPRESSED | XKB_STATE_LATCHED | XKB_STATE_LOCKED | \ ++ XKB_STATE_MODS_EFFECTIVE | XKB_STATE_LAYOUT_EFFECTIVE) ++ ++#define xkb_map_new_from_names(context, names, flags) \ ++ xkb_keymap_new_from_names(context, names, flags) ++#define xkb_map_new_from_file(context, file, format, flags) \ ++ xkb_keymap_new_from_file(context, file, format, flags) ++#define xkb_map_new_from_string(context, string, format, flags) \ ++ xkb_keymap_new_from_string(context, string, format, flags) ++#define xkb_map_get_as_string(keymap) \ ++ xkb_keymap_get_as_string(keymap, XKB_KEYMAP_FORMAT_TEXT_V1) ++#define xkb_map_ref(keymap) xkb_keymap_ref(keymap) ++#define xkb_map_unref(keymap) xkb_keymap_unref(keymap) ++ ++#define xkb_map_num_mods(keymap) xkb_keymap_num_mods(keymap) ++#define xkb_map_mod_get_name(keymap, idx) xkb_keymap_mod_get_name(keymap, idx) ++#define xkb_map_mod_get_index(keymap, str) xkb_keymap_mod_get_index(keymap, str) ++#define xkb_key_mod_index_is_consumed(state, key, mod) \ ++ xkb_state_mod_index_is_consumed(state, key, mod) ++#define xkb_key_mod_mask_remove_consumed(state, key, modmask) \ ++ xkb_state_mod_mask_remove_consumed(state, key, modmask) ++ ++#define xkb_map_num_groups(keymap) xkb_keymap_num_layouts(keymap) ++#define xkb_key_num_groups(keymap, key) \ ++ xkb_keymap_num_layouts_for_key(keymap, key) ++#define xkb_map_group_get_name(keymap, idx) \ ++ xkb_keymap_layout_get_name(keymap, idx) ++#define xkb_map_group_get_index(keymap, str) \ ++ xkb_keymap_layout_get_index(keymap, str) ++ ++#define xkb_map_num_leds(keymap) xkb_keymap_num_leds(keymap) ++#define xkb_map_led_get_name(keymap, idx) xkb_keymap_led_get_name(keymap, idx) ++#define xkb_map_led_get_index(keymap, str) \ ++ xkb_keymap_led_get_index(keymap, str) ++ ++#define xkb_key_repeats(keymap, key) xkb_keymap_key_repeats(keymap, key) ++ ++#define xkb_key_get_syms(state, key, syms_out) \ ++ xkb_state_key_get_syms(state, key, syms_out) ++ ++#define xkb_state_group_name_is_active(state, name, type) \ ++ xkb_state_layout_name_is_active(state, name, type) ++#define xkb_state_group_index_is_active(state, idx, type) \ ++ xkb_state_layout_index_is_active(state, idx, type) ++ ++#define xkb_state_serialize_group(state, component) \ ++ xkb_state_serialize_layout(state, component) ++ ++#define xkb_state_get_map(state) xkb_state_get_keymap(state) ++ ++/* Not needed anymore, since there's NO_FLAGS. */ ++#define XKB_MAP_COMPILE_PLACEHOLDER XKB_KEYMAP_COMPILE_NO_FLAGS ++#define XKB_MAP_COMPILE_NO_FLAGS XKB_KEYMAP_COMPILE_NO_FLAGS ++ ++#endif +diff --git a/src/plugins/platforminputcontexts/fcitx/xkbcommon/xkbcommon-compose.h b/src/plugins/platforminputcontexts/fcitx/xkbcommon/xkbcommon-compose.h +new file mode 100644 +index 0000000..7414c37 +--- /dev/null ++++ b/src/plugins/platforminputcontexts/fcitx/xkbcommon/xkbcommon-compose.h +@@ -0,0 +1,488 @@ ++/* ++ * Copyright © 2013 Ran Benita ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining a ++ * copy of this software and associated documentation files (the "Software"), ++ * to deal in the Software without restriction, including without limitation ++ * the rights to use, copy, modify, merge, publish, distribute, sublicense, ++ * and/or sell copies of the Software, and to permit persons to whom the ++ * Software is furnished to do so, subject to the following conditions: ++ * ++ * The above copyright notice and this permission notice (including the next ++ * paragraph) shall be included in all copies or substantial portions of the ++ * Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ++ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++ * DEALINGS IN THE SOFTWARE. ++ */ ++ ++#ifndef _XKBCOMMON_COMPOSE_H ++#define _XKBCOMMON_COMPOSE_H ++ ++#include ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++/** ++ * @file ++ * libxkbcommon Compose API - support for Compose and dead-keys. ++ */ ++ ++/** ++ * @defgroup compose Compose and dead-keys support ++ * Support for Compose and dead-keys. ++ * @since 0.5.0 ++ * ++ * @{ ++ */ ++ ++/** ++ * @page compose-overview Overview ++ * @parblock ++ * ++ * Compose and dead-keys are a common feature of many keyboard input ++ * systems. They extend the range of the keysysm that can be produced ++ * directly from a keyboard by using a sequence of key strokes, instead ++ * of just one. ++ * ++ * Here are some example sequences, in the libX11 Compose file format: ++ * ++ * : "á" aacute # LATIN SMALL LETTER A WITH ACUTE ++ * : "@" at # COMMERCIAL AT ++ * ++ * When the user presses a key which produces the `` keysym, ++ * nothing initially happens (thus the key is dubbed a "dead-key"). But ++ * when the user enters ``, "á" is "composed", in place of "a". If ++ * instead the user had entered a keysym which does not follow ++ * `` in any compose sequence, the sequence is said to be ++ * "cancelled". ++ * ++ * Compose files define many such sequences. For a description of the ++ * common file format for Compose files, see the Compose(5) man page. ++ * ++ * A successfuly-composed sequence has two results: a keysym and a UTF-8 ++ * string. At least one of the two is defined for each sequence. If only ++ * a keysym is given, the keysym's string representation is used for the ++ * result string (using xkb_keysym_to_utf8()). ++ * ++ * This library provides low-level support for Compose file parsing and ++ * processing. Higher-level APIs (such as libX11's `Xutf8LookupString`(3)) ++ * may be built upon it, or it can be used directly. ++ * ++ * @endparblock ++ */ ++ ++/** ++ * @page compose-conflicting Conflicting Sequences ++ * @parblock ++ * ++ * To avoid ambiguity, a sequence is not allowed to be a prefix of another. ++ * In such a case, the conflict is resolved thus: ++ * ++ * 1. A longer sequence overrides a shorter one. ++ * 2. An equal sequence overrides an existing one. ++ * 3. A shorter sequence does not override a longer one. ++ * ++ * Sequences of length 1 are allowed. ++ * ++ * @endparblock ++ */ ++ ++/** ++ * @page compose-cancellation Cancellation Behavior ++ * @parblock ++ * ++ * What should happen when a sequence is cancelled? For example, consider ++ * there are only the above sequences, and the input keysyms are ++ * ` `. There are a few approaches: ++ * ++ * 1. Swallow the cancelling keysym; that is, no keysym is produced. ++ * This is the approach taken by libX11. ++ * 2. Let the cancelling keysym through; that is, `` is produced. ++ * 3. Replay the entire sequence; that is, ` ` is produced. ++ * This is the approach taken by Microsoft Windows (approximately; ++ * instead of ``, the underlying key is used. This is ++ * difficult to simulate with XKB keymaps). ++ * ++ * You can program whichever approach best fits users' expectations. ++ * ++ * @endparblock ++ */ ++ ++/** ++ * @struct xkb_compose_table ++ * Opaque Compose table object. ++ * ++ * The compose table holds the definitions of the Compose sequences, as ++ * gathered from Compose files. It is immutable. ++ */ ++struct xkb_compose_table; ++ ++/** ++ * @struct xkb_compose_state ++ * Opaque Compose state object. ++ * ++ * The compose state maintains state for compose sequence matching, such ++ * as which possible sequences are being matched, and the position within ++ * these sequences. It acts as a simple state machine wherein keysyms are ++ * the input, and composed keysyms and strings are the output. ++ * ++ * The compose state is usually associated with a keyboard device. ++ */ ++struct xkb_compose_state; ++ ++/** Flags affecting Compose file compilation. */ ++enum xkb_compose_compile_flags { ++ /** Do not apply any flags. */ ++ XKB_COMPOSE_COMPILE_NO_FLAGS = 0 ++}; ++ ++/** The recognized Compose file formats. */ ++enum xkb_compose_format { ++ /** The classic libX11 Compose text format, described in Compose(5). */ ++ XKB_COMPOSE_FORMAT_TEXT_V1 = 1 ++}; ++ ++/** ++ * @page compose-locale Compose Locale ++ * @parblock ++ * ++ * Compose files are locale dependent: ++ * - Compose files are written for a locale, and the locale is used when ++ * searching for the appropriate file to use. ++ * - Compose files may reference the locale internally, with directives ++ * such as \%L. ++ * ++ * As such, functions like xkb_compose_table_new_from_locale() require ++ * a `locale` parameter. This will usually be the current locale (see ++ * locale(7) for more details). You may also want to allow the user to ++ * explicitly configure it, so he can use the Compose file of a given ++ * locale, but not use that locale for other things. ++ * ++ * You may query the current locale as follows: ++ * @code ++ * const char *locale; ++ * locale = setlocale(LC_CTYPE, NULL); ++ * @endcode ++ * ++ * This will only give useful results if the program had previously set ++ * the current locale using setlocale(3), with `LC_CTYPE` or `LC_ALL` ++ * and a non-NULL argument. ++ * ++ * If you prefer not to use the locale system of the C runtime library, ++ * you may nevertheless obtain the user's locale directly using ++ * environment variables, as described in locale(7). For example, ++ * @code ++ * locale = getenv("LC_ALL"); ++ * if (!locale) ++ * locale = getenv("LC_CTYPE"); ++ * if (!locale) ++ * locale = getenv("LANG"); ++ * if (!locale) ++ * locale = "C"; ++ * @endcode ++ * ++ * Note that some locales supported by the C standard library may not ++ * have a Compose file assigned. ++ * ++ * @endparblock ++ */ ++ ++/** ++ * Create a compose table for a given locale. ++ * ++ * The locale is used for searching the file-system for an appropriate ++ * Compose file. The search order is described in Compose(5). It is ++ * affected by the following environment variables: ++ * ++ * 1. `XCOMPOSEFILE` - see Compose(5). ++ * 2. `HOME` - see Compose(5). ++ * 3. `XLOCALEDIR` - if set, used as the base directory for the system's ++ * X locale files, e.g. `/usr/share/X11/locale`, instead of the ++ * preconfigured directory. ++ * ++ * @param context ++ * The library context in which to create the compose table. ++ * @param locale ++ * The current locale. See @ref compose-locale. ++ * @param flags ++ * Optional flags for the compose table, or 0. ++ * ++ * @returns A compose table for the given locale, or NULL if the ++ * compilation failed or a Compose file was not found. ++ * ++ * @memberof xkb_compose_table ++ */ ++struct xkb_compose_table * ++xkb_compose_table_new_from_locale(struct xkb_context *context, ++ const char *locale, ++ enum xkb_compose_compile_flags flags); ++ ++/** ++ * Create a new compose table from a Compose file. ++ * ++ * @param context ++ * The library context in which to create the compose table. ++ * @param file ++ * The Compose file to compile. ++ * @param locale ++ * The current locale. See @ref compose-locale. ++ * @param format ++ * The text format of the Compose file to compile. ++ * @param flags ++ * Optional flags for the compose table, or 0. ++ * ++ * @returns A compose table compiled from the given file, or NULL if ++ * the compilation failed. ++ * ++ * @memberof xkb_compose_table ++ */ ++struct xkb_compose_table * ++xkb_compose_table_new_from_file(struct xkb_context *context, ++ FILE *file, ++ const char *locale, ++ enum xkb_compose_format format, ++ enum xkb_compose_compile_flags flags); ++ ++/** ++ * Create a new compose table from a memory buffer. ++ * ++ * This is just like xkb_compose_table_new_from_file(), but instead of ++ * a file, gets the table as one enormous string. ++ * ++ * @see xkb_compose_table_new_from_file() ++ * @memberof xkb_compose_table ++ */ ++struct xkb_compose_table * ++xkb_compose_table_new_from_buffer(struct xkb_context *context, ++ const char *buffer, size_t length, ++ const char *locale, ++ enum xkb_compose_format format, ++ enum xkb_compose_compile_flags flags); ++ ++/** ++ * Take a new reference on a compose table. ++ * ++ * @returns The passed in object. ++ * ++ * @memberof xkb_compose_table ++ */ ++struct xkb_compose_table * ++xkb_compose_table_ref(struct xkb_compose_table *table); ++ ++/** ++ * Release a reference on a compose table, and possibly free it. ++ * ++ * @param table The object. If it is NULL, this function does nothing. ++ * ++ * @memberof xkb_compose_table ++ */ ++void ++xkb_compose_table_unref(struct xkb_compose_table *table); ++ ++/** Flags for compose state creation. */ ++enum xkb_compose_state_flags { ++ /** Do not apply any flags. */ ++ XKB_COMPOSE_STATE_NO_FLAGS = 0 ++}; ++ ++/** ++ * Create a new compose state object. ++ * ++ * @param table ++ * The compose table the state will use. ++ * @param flags ++ * Optional flags for the compose state, or 0. ++ * ++ * @returns A new compose state, or NULL on failure. ++ * ++ * @memberof xkb_compose_state ++ */ ++struct xkb_compose_state * ++xkb_compose_state_new(struct xkb_compose_table *table, ++ enum xkb_compose_state_flags flags); ++ ++/** ++ * Take a new reference on a compose state object. ++ * ++ * @returns The passed in object. ++ * ++ * @memberof xkb_compose_state ++ */ ++struct xkb_compose_state * ++xkb_compose_state_ref(struct xkb_compose_state *state); ++ ++/** ++ * Release a reference on a compose state object, and possibly free it. ++ * ++ * @param state The object. If NULL, do nothing. ++ * ++ * @memberof xkb_compose_state ++ */ ++void ++xkb_compose_state_unref(struct xkb_compose_state *state); ++ ++/** ++ * Get the compose table which a compose state object is using. ++ * ++ * @returns The compose table which was passed to xkb_compose_state_new() ++ * when creating this state object. ++ * ++ * This function does not take a new reference on the compose table; you ++ * must explicitly reference it yourself if you plan to use it beyond the ++ * lifetime of the state. ++ * ++ * @memberof xkb_compose_state ++ */ ++struct xkb_compose_table * ++xkb_compose_state_get_compose_table(struct xkb_compose_state *state); ++ ++/** Status of the Compose sequence state machine. */ ++enum xkb_compose_status { ++ /** The initial state; no sequence has started yet. */ ++ XKB_COMPOSE_NOTHING, ++ /** In the middle of a sequence. */ ++ XKB_COMPOSE_COMPOSING, ++ /** A complete sequence has been matched. */ ++ XKB_COMPOSE_COMPOSED, ++ /** The last sequence was cancelled due to an unmatched keysym. */ ++ XKB_COMPOSE_CANCELLED ++}; ++ ++/** The effect of a keysym fed to xkb_compose_state_feed(). */ ++enum xkb_compose_feed_result { ++ /** The keysym had no effect - it did not affect the status. */ ++ XKB_COMPOSE_FEED_IGNORED, ++ /** The keysym started, advanced or cancelled a sequence. */ ++ XKB_COMPOSE_FEED_ACCEPTED ++}; ++ ++/** ++ * Feed one keysym to the Compose sequence state machine. ++ * ++ * This function can advance into a compose sequence, cancel a sequence, ++ * start a new sequence, or do nothing in particular. The resulting ++ * status may be observed with xkb_compose_state_get_status(). ++ * ++ * Some keysyms, such as keysyms for modifier keys, are ignored - they ++ * have no effect on the status or otherwise. ++ * ++ * The following is a description of the possible status transitions, in ++ * the format CURRENT STATUS => NEXT STATUS, given a non-ignored input ++ * keysym `keysym`: ++ * ++ @verbatim ++ NOTHING or CANCELLED or COMPOSED => ++ NOTHING if keysym does not start a sequence. ++ COMPOSING if keysym starts a sequence. ++ COMPOSED if keysym starts and terminates a single-keysym sequence. ++ ++ COMPOSING => ++ COMPOSING if keysym advances any of the currently possible ++ sequences but does not terminate any of them. ++ COMPOSED if keysym terminates one of the currently possible ++ sequences. ++ CANCELLED if keysym does not advance any of the currently ++ possible sequences. ++ @endverbatim ++ * ++ * The current Compose formats do not support multiple-keysyms. ++ * Therefore, if you are using a function such as xkb_state_key_get_syms() ++ * and it returns more than one keysym, consider feeding XKB_KEY_NoSymbol ++ * instead. ++ * ++ * @param state ++ * The compose state object. ++ * @param keysym ++ * A keysym, usually obtained after a key-press event, with a ++ * function such as xkb_state_key_get_one_sym(). ++ * ++ * @returns Whether the keysym was ignored. This is useful, for example, ++ * if you want to keep a record of the sequence matched thus far. ++ * ++ * @memberof xkb_compose_state ++ */ ++enum xkb_compose_feed_result ++xkb_compose_state_feed(struct xkb_compose_state *state, ++ xkb_keysym_t keysym); ++ ++/** ++ * Reset the Compose sequence state machine. ++ * ++ * The status is set to XKB_COMPOSE_NOTHING, and the current sequence ++ * is discarded. ++ * ++ * @memberof xkb_compose_state ++ */ ++void ++xkb_compose_state_reset(struct xkb_compose_state *state); ++ ++/** ++ * Get the current status of the compose state machine. ++ * ++ * @see xkb_compose_status ++ * @memberof xkb_compose_state ++ **/ ++enum xkb_compose_status ++xkb_compose_state_get_status(struct xkb_compose_state *state); ++ ++/** ++ * Get the result Unicode/UTF-8 string for a composed sequence. ++ * ++ * See @ref compose-overview for more details. This function is only ++ * useful when the status is XKB_COMPOSE_COMPOSED. ++ * ++ * @param[in] state ++ * The compose state. ++ * @param[out] buffer ++ * A buffer to write the string into. ++ * @param[in] size ++ * Size of the buffer. ++ * ++ * @warning If the buffer passed is too small, the string is truncated ++ * (though still NUL-terminated). ++ * ++ * @returns ++ * The number of bytes required for the string, excluding the NUL byte. ++ * If the sequence is not complete, or does not have a viable result ++ * string, returns 0, and sets `buffer` to the empty string (if possible). ++ * @returns ++ * You may check if truncation has occurred by comparing the return value ++ * with the size of `buffer`, similarly to the `snprintf`(3) function. ++ * You may safely pass NULL and 0 to `buffer` and `size` to find the ++ * required size (without the NUL-byte). ++ * ++ * @memberof xkb_compose_state ++ **/ ++int ++xkb_compose_state_get_utf8(struct xkb_compose_state *state, ++ char *buffer, size_t size); ++ ++/** ++ * Get the result keysym for a composed sequence. ++ * ++ * See @ref compose-overview for more details. This function is only ++ * useful when the status is XKB_COMPOSE_COMPOSED. ++ * ++ * @returns The result keysym. If the sequence is not complete, or does ++ * not specify a result keysym, returns XKB_KEY_NoSymbol. ++ * ++ * @memberof xkb_compose_state ++ **/ ++xkb_keysym_t ++xkb_compose_state_get_one_sym(struct xkb_compose_state *state); ++ ++/** @} */ ++ ++#ifdef __cplusplus ++} /* extern "C" */ ++#endif ++ ++#endif /* _XKBCOMMON_COMPOSE_H */ +diff --git a/src/plugins/platforminputcontexts/fcitx/xkbcommon/xkbcommon-keysyms.h b/src/plugins/platforminputcontexts/fcitx/xkbcommon/xkbcommon-keysyms.h +new file mode 100644 +index 0000000..3e8d644 +--- /dev/null ++++ b/src/plugins/platforminputcontexts/fcitx/xkbcommon/xkbcommon-keysyms.h +@@ -0,0 +1,3012 @@ ++#ifndef _XKBCOMMON_KEYSYMS_H ++#define _XKBCOMMON_KEYSYMS_H ++ ++/* This file is autogenerated from Makefile.am; please do not commit directly. */ ++ ++#define XKB_KEY_NoSymbol 0x000000 /* Special KeySym */ ++ ++/*********************************************************** ++Copyright 1987, 1994, 1998 The Open Group ++ ++Permission to use, copy, modify, distribute, and sell this software and its ++documentation for any purpose is hereby granted without fee, provided that ++the above copyright notice appear in all copies and that both that ++copyright notice and this permission notice appear in supporting ++documentation. ++ ++The above copyright notice and this permission notice shall be included ++in all copies or substantial portions of the Software. ++ ++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ++OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR ++OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++OTHER DEALINGS IN THE SOFTWARE. ++ ++Except as contained in this notice, the name of The Open Group shall ++not be used in advertising or otherwise to promote the sale, use or ++other dealings in this Software without prior written authorization ++from The Open Group. ++ ++ ++Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts ++ ++ All Rights Reserved ++ ++Permission to use, copy, modify, and distribute this software and its ++documentation for any purpose and without fee is hereby granted, ++provided that the above copyright notice appear in all copies and that ++both that copyright notice and this permission notice appear in ++supporting documentation, and that the name of Digital not be ++used in advertising or publicity pertaining to distribution of the ++software without specific, written prior permission. ++ ++DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ++ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL ++DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ++ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, ++WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ++ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS ++SOFTWARE. ++ ++******************************************************************/ ++ ++/* ++ * The "X11 Window System Protocol" standard defines in Appendix A the ++ * keysym codes. These 29-bit integer values identify characters or ++ * functions associated with each key (e.g., via the visible ++ * engraving) of a keyboard layout. This file assigns mnemonic macro ++ * names for these keysyms. ++ * ++ * This file is also compiled (by src/util/makekeys.c in libX11) into ++ * hash tables that can be accessed with X11 library functions such as ++ * XStringToKeysym() and XKeysymToString(). ++ * ++ * Where a keysym corresponds one-to-one to an ISO 10646 / Unicode ++ * character, this is noted in a comment that provides both the U+xxxx ++ * Unicode position, as well as the official Unicode name of the ++ * character. ++ * ++ * Where the correspondence is either not one-to-one or semantically ++ * unclear, the Unicode position and name are enclosed in ++ * parentheses. Such legacy keysyms should be considered deprecated ++ * and are not recommended for use in future keyboard mappings. ++ * ++ * For any future extension of the keysyms with characters already ++ * found in ISO 10646 / Unicode, the following algorithm shall be ++ * used. The new keysym code position will simply be the character's ++ * Unicode number plus 0x01000000. The keysym values in the range ++ * 0x01000100 to 0x0110ffff are reserved to represent Unicode ++ * characters in the range U+0100 to U+10FFFF. ++ * ++ * While most newer Unicode-based X11 clients do already accept ++ * Unicode-mapped keysyms in the range 0x01000100 to 0x0110ffff, it ++ * will remain necessary for clients -- in the interest of ++ * compatibility with existing servers -- to also understand the ++ * existing legacy keysym values in the range 0x0100 to 0x20ff. ++ * ++ * Where several mnemonic names are defined for the same keysym in this ++ * file, all but the first one listed should be considered deprecated. ++ * ++ * Mnemonic names for keysyms are defined in this file with lines ++ * that match one of these Perl regular expressions: ++ * ++ * /^\#define XKB_KEY_([a-zA-Z_0-9]+)\s+0x([0-9a-f]+)\s*\/\* U+([0-9A-F]{4,6}) (.*) \*\/\s*$/ ++ * /^\#define XKB_KEY_([a-zA-Z_0-9]+)\s+0x([0-9a-f]+)\s*\/\*\(U+([0-9A-F]{4,6}) (.*)\)\*\/\s*$/ ++ * /^\#define XKB_KEY_([a-zA-Z_0-9]+)\s+0x([0-9a-f]+)\s*(\/\*\s*(.*)\s*\*\/)?\s*$/ ++ * ++ * Before adding new keysyms, please do consider the following: In ++ * addition to the keysym names defined in this file, the ++ * XStringToKeysym() and XKeysymToString() functions will also handle ++ * any keysym string of the form "U0020" to "U007E" and "U00A0" to ++ * "U10FFFF" for all possible Unicode characters. In other words, ++ * every possible Unicode character has already a keysym string ++ * defined algorithmically, even if it is not listed here. Therefore, ++ * defining an additional keysym macro is only necessary where a ++ * non-hexadecimal mnemonic name is needed, or where the new keysym ++ * does not represent any existing Unicode character. ++ * ++ * When adding new keysyms to this file, do not forget to also update the ++ * following as needed: ++ * ++ * - the mappings in src/KeyBind.c in the repo ++ * git://anongit.freedesktop.org/xorg/lib/libX11.git ++ * ++ * - the protocol specification in specs/keysyms.xml ++ * in the repo git://anongit.freedesktop.org/xorg/proto/x11proto.git ++ * ++ */ ++ ++#define XKB_KEY_VoidSymbol 0xffffff /* Void symbol */ ++ ++/* ++ * TTY function keys, cleverly chosen to map to ASCII, for convenience of ++ * programming, but could have been arbitrary (at the cost of lookup ++ * tables in client code). ++ */ ++ ++#define XKB_KEY_BackSpace 0xff08 /* Back space, back char */ ++#define XKB_KEY_Tab 0xff09 ++#define XKB_KEY_Linefeed 0xff0a /* Linefeed, LF */ ++#define XKB_KEY_Clear 0xff0b ++#define XKB_KEY_Return 0xff0d /* Return, enter */ ++#define XKB_KEY_Pause 0xff13 /* Pause, hold */ ++#define XKB_KEY_Scroll_Lock 0xff14 ++#define XKB_KEY_Sys_Req 0xff15 ++#define XKB_KEY_Escape 0xff1b ++#define XKB_KEY_Delete 0xffff /* Delete, rubout */ ++ ++ ++ ++/* International & multi-key character composition */ ++ ++#define XKB_KEY_Multi_key 0xff20 /* Multi-key character compose */ ++#define XKB_KEY_Codeinput 0xff37 ++#define XKB_KEY_SingleCandidate 0xff3c ++#define XKB_KEY_MultipleCandidate 0xff3d ++#define XKB_KEY_PreviousCandidate 0xff3e ++ ++/* Japanese keyboard support */ ++ ++#define XKB_KEY_Kanji 0xff21 /* Kanji, Kanji convert */ ++#define XKB_KEY_Muhenkan 0xff22 /* Cancel Conversion */ ++#define XKB_KEY_Henkan_Mode 0xff23 /* Start/Stop Conversion */ ++#define XKB_KEY_Henkan 0xff23 /* Alias for Henkan_Mode */ ++#define XKB_KEY_Romaji 0xff24 /* to Romaji */ ++#define XKB_KEY_Hiragana 0xff25 /* to Hiragana */ ++#define XKB_KEY_Katakana 0xff26 /* to Katakana */ ++#define XKB_KEY_Hiragana_Katakana 0xff27 /* Hiragana/Katakana toggle */ ++#define XKB_KEY_Zenkaku 0xff28 /* to Zenkaku */ ++#define XKB_KEY_Hankaku 0xff29 /* to Hankaku */ ++#define XKB_KEY_Zenkaku_Hankaku 0xff2a /* Zenkaku/Hankaku toggle */ ++#define XKB_KEY_Touroku 0xff2b /* Add to Dictionary */ ++#define XKB_KEY_Massyo 0xff2c /* Delete from Dictionary */ ++#define XKB_KEY_Kana_Lock 0xff2d /* Kana Lock */ ++#define XKB_KEY_Kana_Shift 0xff2e /* Kana Shift */ ++#define XKB_KEY_Eisu_Shift 0xff2f /* Alphanumeric Shift */ ++#define XKB_KEY_Eisu_toggle 0xff30 /* Alphanumeric toggle */ ++#define XKB_KEY_Kanji_Bangou 0xff37 /* Codeinput */ ++#define XKB_KEY_Zen_Koho 0xff3d /* Multiple/All Candidate(s) */ ++#define XKB_KEY_Mae_Koho 0xff3e /* Previous Candidate */ ++ ++/* 0xff31 thru 0xff3f are under XK_KOREAN */ ++ ++/* Cursor control & motion */ ++ ++#define XKB_KEY_Home 0xff50 ++#define XKB_KEY_Left 0xff51 /* Move left, left arrow */ ++#define XKB_KEY_Up 0xff52 /* Move up, up arrow */ ++#define XKB_KEY_Right 0xff53 /* Move right, right arrow */ ++#define XKB_KEY_Down 0xff54 /* Move down, down arrow */ ++#define XKB_KEY_Prior 0xff55 /* Prior, previous */ ++#define XKB_KEY_Page_Up 0xff55 ++#define XKB_KEY_Next 0xff56 /* Next */ ++#define XKB_KEY_Page_Down 0xff56 ++#define XKB_KEY_End 0xff57 /* EOL */ ++#define XKB_KEY_Begin 0xff58 /* BOL */ ++ ++ ++/* Misc functions */ ++ ++#define XKB_KEY_Select 0xff60 /* Select, mark */ ++#define XKB_KEY_Print 0xff61 ++#define XKB_KEY_Execute 0xff62 /* Execute, run, do */ ++#define XKB_KEY_Insert 0xff63 /* Insert, insert here */ ++#define XKB_KEY_Undo 0xff65 ++#define XKB_KEY_Redo 0xff66 /* Redo, again */ ++#define XKB_KEY_Menu 0xff67 ++#define XKB_KEY_Find 0xff68 /* Find, search */ ++#define XKB_KEY_Cancel 0xff69 /* Cancel, stop, abort, exit */ ++#define XKB_KEY_Help 0xff6a /* Help */ ++#define XKB_KEY_Break 0xff6b ++#define XKB_KEY_Mode_switch 0xff7e /* Character set switch */ ++#define XKB_KEY_script_switch 0xff7e /* Alias for mode_switch */ ++#define XKB_KEY_Num_Lock 0xff7f ++ ++/* Keypad functions, keypad numbers cleverly chosen to map to ASCII */ ++ ++#define XKB_KEY_KP_Space 0xff80 /* Space */ ++#define XKB_KEY_KP_Tab 0xff89 ++#define XKB_KEY_KP_Enter 0xff8d /* Enter */ ++#define XKB_KEY_KP_F1 0xff91 /* PF1, KP_A, ... */ ++#define XKB_KEY_KP_F2 0xff92 ++#define XKB_KEY_KP_F3 0xff93 ++#define XKB_KEY_KP_F4 0xff94 ++#define XKB_KEY_KP_Home 0xff95 ++#define XKB_KEY_KP_Left 0xff96 ++#define XKB_KEY_KP_Up 0xff97 ++#define XKB_KEY_KP_Right 0xff98 ++#define XKB_KEY_KP_Down 0xff99 ++#define XKB_KEY_KP_Prior 0xff9a ++#define XKB_KEY_KP_Page_Up 0xff9a ++#define XKB_KEY_KP_Next 0xff9b ++#define XKB_KEY_KP_Page_Down 0xff9b ++#define XKB_KEY_KP_End 0xff9c ++#define XKB_KEY_KP_Begin 0xff9d ++#define XKB_KEY_KP_Insert 0xff9e ++#define XKB_KEY_KP_Delete 0xff9f ++#define XKB_KEY_KP_Equal 0xffbd /* Equals */ ++#define XKB_KEY_KP_Multiply 0xffaa ++#define XKB_KEY_KP_Add 0xffab ++#define XKB_KEY_KP_Separator 0xffac /* Separator, often comma */ ++#define XKB_KEY_KP_Subtract 0xffad ++#define XKB_KEY_KP_Decimal 0xffae ++#define XKB_KEY_KP_Divide 0xffaf ++ ++#define XKB_KEY_KP_0 0xffb0 ++#define XKB_KEY_KP_1 0xffb1 ++#define XKB_KEY_KP_2 0xffb2 ++#define XKB_KEY_KP_3 0xffb3 ++#define XKB_KEY_KP_4 0xffb4 ++#define XKB_KEY_KP_5 0xffb5 ++#define XKB_KEY_KP_6 0xffb6 ++#define XKB_KEY_KP_7 0xffb7 ++#define XKB_KEY_KP_8 0xffb8 ++#define XKB_KEY_KP_9 0xffb9 ++ ++ ++ ++/* ++ * Auxiliary functions; note the duplicate definitions for left and right ++ * function keys; Sun keyboards and a few other manufacturers have such ++ * function key groups on the left and/or right sides of the keyboard. ++ * We've not found a keyboard with more than 35 function keys total. ++ */ ++ ++#define XKB_KEY_F1 0xffbe ++#define XKB_KEY_F2 0xffbf ++#define XKB_KEY_F3 0xffc0 ++#define XKB_KEY_F4 0xffc1 ++#define XKB_KEY_F5 0xffc2 ++#define XKB_KEY_F6 0xffc3 ++#define XKB_KEY_F7 0xffc4 ++#define XKB_KEY_F8 0xffc5 ++#define XKB_KEY_F9 0xffc6 ++#define XKB_KEY_F10 0xffc7 ++#define XKB_KEY_F11 0xffc8 ++#define XKB_KEY_L1 0xffc8 ++#define XKB_KEY_F12 0xffc9 ++#define XKB_KEY_L2 0xffc9 ++#define XKB_KEY_F13 0xffca ++#define XKB_KEY_L3 0xffca ++#define XKB_KEY_F14 0xffcb ++#define XKB_KEY_L4 0xffcb ++#define XKB_KEY_F15 0xffcc ++#define XKB_KEY_L5 0xffcc ++#define XKB_KEY_F16 0xffcd ++#define XKB_KEY_L6 0xffcd ++#define XKB_KEY_F17 0xffce ++#define XKB_KEY_L7 0xffce ++#define XKB_KEY_F18 0xffcf ++#define XKB_KEY_L8 0xffcf ++#define XKB_KEY_F19 0xffd0 ++#define XKB_KEY_L9 0xffd0 ++#define XKB_KEY_F20 0xffd1 ++#define XKB_KEY_L10 0xffd1 ++#define XKB_KEY_F21 0xffd2 ++#define XKB_KEY_R1 0xffd2 ++#define XKB_KEY_F22 0xffd3 ++#define XKB_KEY_R2 0xffd3 ++#define XKB_KEY_F23 0xffd4 ++#define XKB_KEY_R3 0xffd4 ++#define XKB_KEY_F24 0xffd5 ++#define XKB_KEY_R4 0xffd5 ++#define XKB_KEY_F25 0xffd6 ++#define XKB_KEY_R5 0xffd6 ++#define XKB_KEY_F26 0xffd7 ++#define XKB_KEY_R6 0xffd7 ++#define XKB_KEY_F27 0xffd8 ++#define XKB_KEY_R7 0xffd8 ++#define XKB_KEY_F28 0xffd9 ++#define XKB_KEY_R8 0xffd9 ++#define XKB_KEY_F29 0xffda ++#define XKB_KEY_R9 0xffda ++#define XKB_KEY_F30 0xffdb ++#define XKB_KEY_R10 0xffdb ++#define XKB_KEY_F31 0xffdc ++#define XKB_KEY_R11 0xffdc ++#define XKB_KEY_F32 0xffdd ++#define XKB_KEY_R12 0xffdd ++#define XKB_KEY_F33 0xffde ++#define XKB_KEY_R13 0xffde ++#define XKB_KEY_F34 0xffdf ++#define XKB_KEY_R14 0xffdf ++#define XKB_KEY_F35 0xffe0 ++#define XKB_KEY_R15 0xffe0 ++ ++/* Modifiers */ ++ ++#define XKB_KEY_Shift_L 0xffe1 /* Left shift */ ++#define XKB_KEY_Shift_R 0xffe2 /* Right shift */ ++#define XKB_KEY_Control_L 0xffe3 /* Left control */ ++#define XKB_KEY_Control_R 0xffe4 /* Right control */ ++#define XKB_KEY_Caps_Lock 0xffe5 /* Caps lock */ ++#define XKB_KEY_Shift_Lock 0xffe6 /* Shift lock */ ++ ++#define XKB_KEY_Meta_L 0xffe7 /* Left meta */ ++#define XKB_KEY_Meta_R 0xffe8 /* Right meta */ ++#define XKB_KEY_Alt_L 0xffe9 /* Left alt */ ++#define XKB_KEY_Alt_R 0xffea /* Right alt */ ++#define XKB_KEY_Super_L 0xffeb /* Left super */ ++#define XKB_KEY_Super_R 0xffec /* Right super */ ++#define XKB_KEY_Hyper_L 0xffed /* Left hyper */ ++#define XKB_KEY_Hyper_R 0xffee /* Right hyper */ ++ ++/* ++ * Keyboard (XKB) Extension function and modifier keys ++ * (from Appendix C of "The X Keyboard Extension: Protocol Specification") ++ * Byte 3 = 0xfe ++ */ ++ ++#define XKB_KEY_ISO_Lock 0xfe01 ++#define XKB_KEY_ISO_Level2_Latch 0xfe02 ++#define XKB_KEY_ISO_Level3_Shift 0xfe03 ++#define XKB_KEY_ISO_Level3_Latch 0xfe04 ++#define XKB_KEY_ISO_Level3_Lock 0xfe05 ++#define XKB_KEY_ISO_Level5_Shift 0xfe11 ++#define XKB_KEY_ISO_Level5_Latch 0xfe12 ++#define XKB_KEY_ISO_Level5_Lock 0xfe13 ++#define XKB_KEY_ISO_Group_Shift 0xff7e /* Alias for mode_switch */ ++#define XKB_KEY_ISO_Group_Latch 0xfe06 ++#define XKB_KEY_ISO_Group_Lock 0xfe07 ++#define XKB_KEY_ISO_Next_Group 0xfe08 ++#define XKB_KEY_ISO_Next_Group_Lock 0xfe09 ++#define XKB_KEY_ISO_Prev_Group 0xfe0a ++#define XKB_KEY_ISO_Prev_Group_Lock 0xfe0b ++#define XKB_KEY_ISO_First_Group 0xfe0c ++#define XKB_KEY_ISO_First_Group_Lock 0xfe0d ++#define XKB_KEY_ISO_Last_Group 0xfe0e ++#define XKB_KEY_ISO_Last_Group_Lock 0xfe0f ++ ++#define XKB_KEY_ISO_Left_Tab 0xfe20 ++#define XKB_KEY_ISO_Move_Line_Up 0xfe21 ++#define XKB_KEY_ISO_Move_Line_Down 0xfe22 ++#define XKB_KEY_ISO_Partial_Line_Up 0xfe23 ++#define XKB_KEY_ISO_Partial_Line_Down 0xfe24 ++#define XKB_KEY_ISO_Partial_Space_Left 0xfe25 ++#define XKB_KEY_ISO_Partial_Space_Right 0xfe26 ++#define XKB_KEY_ISO_Set_Margin_Left 0xfe27 ++#define XKB_KEY_ISO_Set_Margin_Right 0xfe28 ++#define XKB_KEY_ISO_Release_Margin_Left 0xfe29 ++#define XKB_KEY_ISO_Release_Margin_Right 0xfe2a ++#define XKB_KEY_ISO_Release_Both_Margins 0xfe2b ++#define XKB_KEY_ISO_Fast_Cursor_Left 0xfe2c ++#define XKB_KEY_ISO_Fast_Cursor_Right 0xfe2d ++#define XKB_KEY_ISO_Fast_Cursor_Up 0xfe2e ++#define XKB_KEY_ISO_Fast_Cursor_Down 0xfe2f ++#define XKB_KEY_ISO_Continuous_Underline 0xfe30 ++#define XKB_KEY_ISO_Discontinuous_Underline 0xfe31 ++#define XKB_KEY_ISO_Emphasize 0xfe32 ++#define XKB_KEY_ISO_Center_Object 0xfe33 ++#define XKB_KEY_ISO_Enter 0xfe34 ++ ++#define XKB_KEY_dead_grave 0xfe50 ++#define XKB_KEY_dead_acute 0xfe51 ++#define XKB_KEY_dead_circumflex 0xfe52 ++#define XKB_KEY_dead_tilde 0xfe53 ++#define XKB_KEY_dead_perispomeni 0xfe53 /* alias for dead_tilde */ ++#define XKB_KEY_dead_macron 0xfe54 ++#define XKB_KEY_dead_breve 0xfe55 ++#define XKB_KEY_dead_abovedot 0xfe56 ++#define XKB_KEY_dead_diaeresis 0xfe57 ++#define XKB_KEY_dead_abovering 0xfe58 ++#define XKB_KEY_dead_doubleacute 0xfe59 ++#define XKB_KEY_dead_caron 0xfe5a ++#define XKB_KEY_dead_cedilla 0xfe5b ++#define XKB_KEY_dead_ogonek 0xfe5c ++#define XKB_KEY_dead_iota 0xfe5d ++#define XKB_KEY_dead_voiced_sound 0xfe5e ++#define XKB_KEY_dead_semivoiced_sound 0xfe5f ++#define XKB_KEY_dead_belowdot 0xfe60 ++#define XKB_KEY_dead_hook 0xfe61 ++#define XKB_KEY_dead_horn 0xfe62 ++#define XKB_KEY_dead_stroke 0xfe63 ++#define XKB_KEY_dead_abovecomma 0xfe64 ++#define XKB_KEY_dead_psili 0xfe64 /* alias for dead_abovecomma */ ++#define XKB_KEY_dead_abovereversedcomma 0xfe65 ++#define XKB_KEY_dead_dasia 0xfe65 /* alias for dead_abovereversedcomma */ ++#define XKB_KEY_dead_doublegrave 0xfe66 ++#define XKB_KEY_dead_belowring 0xfe67 ++#define XKB_KEY_dead_belowmacron 0xfe68 ++#define XKB_KEY_dead_belowcircumflex 0xfe69 ++#define XKB_KEY_dead_belowtilde 0xfe6a ++#define XKB_KEY_dead_belowbreve 0xfe6b ++#define XKB_KEY_dead_belowdiaeresis 0xfe6c ++#define XKB_KEY_dead_invertedbreve 0xfe6d ++#define XKB_KEY_dead_belowcomma 0xfe6e ++#define XKB_KEY_dead_currency 0xfe6f ++ ++/* extra dead elements for German T3 layout */ ++#define XKB_KEY_dead_lowline 0xfe90 ++#define XKB_KEY_dead_aboveverticalline 0xfe91 ++#define XKB_KEY_dead_belowverticalline 0xfe92 ++#define XKB_KEY_dead_longsolidusoverlay 0xfe93 ++ ++/* dead vowels for universal syllable entry */ ++#define XKB_KEY_dead_a 0xfe80 ++#define XKB_KEY_dead_A 0xfe81 ++#define XKB_KEY_dead_e 0xfe82 ++#define XKB_KEY_dead_E 0xfe83 ++#define XKB_KEY_dead_i 0xfe84 ++#define XKB_KEY_dead_I 0xfe85 ++#define XKB_KEY_dead_o 0xfe86 ++#define XKB_KEY_dead_O 0xfe87 ++#define XKB_KEY_dead_u 0xfe88 ++#define XKB_KEY_dead_U 0xfe89 ++#define XKB_KEY_dead_small_schwa 0xfe8a ++#define XKB_KEY_dead_capital_schwa 0xfe8b ++ ++#define XKB_KEY_dead_greek 0xfe8c ++ ++#define XKB_KEY_First_Virtual_Screen 0xfed0 ++#define XKB_KEY_Prev_Virtual_Screen 0xfed1 ++#define XKB_KEY_Next_Virtual_Screen 0xfed2 ++#define XKB_KEY_Last_Virtual_Screen 0xfed4 ++#define XKB_KEY_Terminate_Server 0xfed5 ++ ++#define XKB_KEY_AccessX_Enable 0xfe70 ++#define XKB_KEY_AccessX_Feedback_Enable 0xfe71 ++#define XKB_KEY_RepeatKeys_Enable 0xfe72 ++#define XKB_KEY_SlowKeys_Enable 0xfe73 ++#define XKB_KEY_BounceKeys_Enable 0xfe74 ++#define XKB_KEY_StickyKeys_Enable 0xfe75 ++#define XKB_KEY_MouseKeys_Enable 0xfe76 ++#define XKB_KEY_MouseKeys_Accel_Enable 0xfe77 ++#define XKB_KEY_Overlay1_Enable 0xfe78 ++#define XKB_KEY_Overlay2_Enable 0xfe79 ++#define XKB_KEY_AudibleBell_Enable 0xfe7a ++ ++#define XKB_KEY_Pointer_Left 0xfee0 ++#define XKB_KEY_Pointer_Right 0xfee1 ++#define XKB_KEY_Pointer_Up 0xfee2 ++#define XKB_KEY_Pointer_Down 0xfee3 ++#define XKB_KEY_Pointer_UpLeft 0xfee4 ++#define XKB_KEY_Pointer_UpRight 0xfee5 ++#define XKB_KEY_Pointer_DownLeft 0xfee6 ++#define XKB_KEY_Pointer_DownRight 0xfee7 ++#define XKB_KEY_Pointer_Button_Dflt 0xfee8 ++#define XKB_KEY_Pointer_Button1 0xfee9 ++#define XKB_KEY_Pointer_Button2 0xfeea ++#define XKB_KEY_Pointer_Button3 0xfeeb ++#define XKB_KEY_Pointer_Button4 0xfeec ++#define XKB_KEY_Pointer_Button5 0xfeed ++#define XKB_KEY_Pointer_DblClick_Dflt 0xfeee ++#define XKB_KEY_Pointer_DblClick1 0xfeef ++#define XKB_KEY_Pointer_DblClick2 0xfef0 ++#define XKB_KEY_Pointer_DblClick3 0xfef1 ++#define XKB_KEY_Pointer_DblClick4 0xfef2 ++#define XKB_KEY_Pointer_DblClick5 0xfef3 ++#define XKB_KEY_Pointer_Drag_Dflt 0xfef4 ++#define XKB_KEY_Pointer_Drag1 0xfef5 ++#define XKB_KEY_Pointer_Drag2 0xfef6 ++#define XKB_KEY_Pointer_Drag3 0xfef7 ++#define XKB_KEY_Pointer_Drag4 0xfef8 ++#define XKB_KEY_Pointer_Drag5 0xfefd ++ ++#define XKB_KEY_Pointer_EnableKeys 0xfef9 ++#define XKB_KEY_Pointer_Accelerate 0xfefa ++#define XKB_KEY_Pointer_DfltBtnNext 0xfefb ++#define XKB_KEY_Pointer_DfltBtnPrev 0xfefc ++ ++/* Single-Stroke Multiple-Character N-Graph Keysyms For The X Input Method */ ++ ++#define XKB_KEY_ch 0xfea0 ++#define XKB_KEY_Ch 0xfea1 ++#define XKB_KEY_CH 0xfea2 ++#define XKB_KEY_c_h 0xfea3 ++#define XKB_KEY_C_h 0xfea4 ++#define XKB_KEY_C_H 0xfea5 ++ ++ ++/* ++ * 3270 Terminal Keys ++ * Byte 3 = 0xfd ++ */ ++ ++#define XKB_KEY_3270_Duplicate 0xfd01 ++#define XKB_KEY_3270_FieldMark 0xfd02 ++#define XKB_KEY_3270_Right2 0xfd03 ++#define XKB_KEY_3270_Left2 0xfd04 ++#define XKB_KEY_3270_BackTab 0xfd05 ++#define XKB_KEY_3270_EraseEOF 0xfd06 ++#define XKB_KEY_3270_EraseInput 0xfd07 ++#define XKB_KEY_3270_Reset 0xfd08 ++#define XKB_KEY_3270_Quit 0xfd09 ++#define XKB_KEY_3270_PA1 0xfd0a ++#define XKB_KEY_3270_PA2 0xfd0b ++#define XKB_KEY_3270_PA3 0xfd0c ++#define XKB_KEY_3270_Test 0xfd0d ++#define XKB_KEY_3270_Attn 0xfd0e ++#define XKB_KEY_3270_CursorBlink 0xfd0f ++#define XKB_KEY_3270_AltCursor 0xfd10 ++#define XKB_KEY_3270_KeyClick 0xfd11 ++#define XKB_KEY_3270_Jump 0xfd12 ++#define XKB_KEY_3270_Ident 0xfd13 ++#define XKB_KEY_3270_Rule 0xfd14 ++#define XKB_KEY_3270_Copy 0xfd15 ++#define XKB_KEY_3270_Play 0xfd16 ++#define XKB_KEY_3270_Setup 0xfd17 ++#define XKB_KEY_3270_Record 0xfd18 ++#define XKB_KEY_3270_ChangeScreen 0xfd19 ++#define XKB_KEY_3270_DeleteWord 0xfd1a ++#define XKB_KEY_3270_ExSelect 0xfd1b ++#define XKB_KEY_3270_CursorSelect 0xfd1c ++#define XKB_KEY_3270_PrintScreen 0xfd1d ++#define XKB_KEY_3270_Enter 0xfd1e ++ ++/* ++ * Latin 1 ++ * (ISO/IEC 8859-1 = Unicode U+0020..U+00FF) ++ * Byte 3 = 0 ++ */ ++#define XKB_KEY_space 0x0020 /* U+0020 SPACE */ ++#define XKB_KEY_exclam 0x0021 /* U+0021 EXCLAMATION MARK */ ++#define XKB_KEY_quotedbl 0x0022 /* U+0022 QUOTATION MARK */ ++#define XKB_KEY_numbersign 0x0023 /* U+0023 NUMBER SIGN */ ++#define XKB_KEY_dollar 0x0024 /* U+0024 DOLLAR SIGN */ ++#define XKB_KEY_percent 0x0025 /* U+0025 PERCENT SIGN */ ++#define XKB_KEY_ampersand 0x0026 /* U+0026 AMPERSAND */ ++#define XKB_KEY_apostrophe 0x0027 /* U+0027 APOSTROPHE */ ++#define XKB_KEY_quoteright 0x0027 /* deprecated */ ++#define XKB_KEY_parenleft 0x0028 /* U+0028 LEFT PARENTHESIS */ ++#define XKB_KEY_parenright 0x0029 /* U+0029 RIGHT PARENTHESIS */ ++#define XKB_KEY_asterisk 0x002a /* U+002A ASTERISK */ ++#define XKB_KEY_plus 0x002b /* U+002B PLUS SIGN */ ++#define XKB_KEY_comma 0x002c /* U+002C COMMA */ ++#define XKB_KEY_minus 0x002d /* U+002D HYPHEN-MINUS */ ++#define XKB_KEY_period 0x002e /* U+002E FULL STOP */ ++#define XKB_KEY_slash 0x002f /* U+002F SOLIDUS */ ++#define XKB_KEY_0 0x0030 /* U+0030 DIGIT ZERO */ ++#define XKB_KEY_1 0x0031 /* U+0031 DIGIT ONE */ ++#define XKB_KEY_2 0x0032 /* U+0032 DIGIT TWO */ ++#define XKB_KEY_3 0x0033 /* U+0033 DIGIT THREE */ ++#define XKB_KEY_4 0x0034 /* U+0034 DIGIT FOUR */ ++#define XKB_KEY_5 0x0035 /* U+0035 DIGIT FIVE */ ++#define XKB_KEY_6 0x0036 /* U+0036 DIGIT SIX */ ++#define XKB_KEY_7 0x0037 /* U+0037 DIGIT SEVEN */ ++#define XKB_KEY_8 0x0038 /* U+0038 DIGIT EIGHT */ ++#define XKB_KEY_9 0x0039 /* U+0039 DIGIT NINE */ ++#define XKB_KEY_colon 0x003a /* U+003A COLON */ ++#define XKB_KEY_semicolon 0x003b /* U+003B SEMICOLON */ ++#define XKB_KEY_less 0x003c /* U+003C LESS-THAN SIGN */ ++#define XKB_KEY_equal 0x003d /* U+003D EQUALS SIGN */ ++#define XKB_KEY_greater 0x003e /* U+003E GREATER-THAN SIGN */ ++#define XKB_KEY_question 0x003f /* U+003F QUESTION MARK */ ++#define XKB_KEY_at 0x0040 /* U+0040 COMMERCIAL AT */ ++#define XKB_KEY_A 0x0041 /* U+0041 LATIN CAPITAL LETTER A */ ++#define XKB_KEY_B 0x0042 /* U+0042 LATIN CAPITAL LETTER B */ ++#define XKB_KEY_C 0x0043 /* U+0043 LATIN CAPITAL LETTER C */ ++#define XKB_KEY_D 0x0044 /* U+0044 LATIN CAPITAL LETTER D */ ++#define XKB_KEY_E 0x0045 /* U+0045 LATIN CAPITAL LETTER E */ ++#define XKB_KEY_F 0x0046 /* U+0046 LATIN CAPITAL LETTER F */ ++#define XKB_KEY_G 0x0047 /* U+0047 LATIN CAPITAL LETTER G */ ++#define XKB_KEY_H 0x0048 /* U+0048 LATIN CAPITAL LETTER H */ ++#define XKB_KEY_I 0x0049 /* U+0049 LATIN CAPITAL LETTER I */ ++#define XKB_KEY_J 0x004a /* U+004A LATIN CAPITAL LETTER J */ ++#define XKB_KEY_K 0x004b /* U+004B LATIN CAPITAL LETTER K */ ++#define XKB_KEY_L 0x004c /* U+004C LATIN CAPITAL LETTER L */ ++#define XKB_KEY_M 0x004d /* U+004D LATIN CAPITAL LETTER M */ ++#define XKB_KEY_N 0x004e /* U+004E LATIN CAPITAL LETTER N */ ++#define XKB_KEY_O 0x004f /* U+004F LATIN CAPITAL LETTER O */ ++#define XKB_KEY_P 0x0050 /* U+0050 LATIN CAPITAL LETTER P */ ++#define XKB_KEY_Q 0x0051 /* U+0051 LATIN CAPITAL LETTER Q */ ++#define XKB_KEY_R 0x0052 /* U+0052 LATIN CAPITAL LETTER R */ ++#define XKB_KEY_S 0x0053 /* U+0053 LATIN CAPITAL LETTER S */ ++#define XKB_KEY_T 0x0054 /* U+0054 LATIN CAPITAL LETTER T */ ++#define XKB_KEY_U 0x0055 /* U+0055 LATIN CAPITAL LETTER U */ ++#define XKB_KEY_V 0x0056 /* U+0056 LATIN CAPITAL LETTER V */ ++#define XKB_KEY_W 0x0057 /* U+0057 LATIN CAPITAL LETTER W */ ++#define XKB_KEY_X 0x0058 /* U+0058 LATIN CAPITAL LETTER X */ ++#define XKB_KEY_Y 0x0059 /* U+0059 LATIN CAPITAL LETTER Y */ ++#define XKB_KEY_Z 0x005a /* U+005A LATIN CAPITAL LETTER Z */ ++#define XKB_KEY_bracketleft 0x005b /* U+005B LEFT SQUARE BRACKET */ ++#define XKB_KEY_backslash 0x005c /* U+005C REVERSE SOLIDUS */ ++#define XKB_KEY_bracketright 0x005d /* U+005D RIGHT SQUARE BRACKET */ ++#define XKB_KEY_asciicircum 0x005e /* U+005E CIRCUMFLEX ACCENT */ ++#define XKB_KEY_underscore 0x005f /* U+005F LOW LINE */ ++#define XKB_KEY_grave 0x0060 /* U+0060 GRAVE ACCENT */ ++#define XKB_KEY_quoteleft 0x0060 /* deprecated */ ++#define XKB_KEY_a 0x0061 /* U+0061 LATIN SMALL LETTER A */ ++#define XKB_KEY_b 0x0062 /* U+0062 LATIN SMALL LETTER B */ ++#define XKB_KEY_c 0x0063 /* U+0063 LATIN SMALL LETTER C */ ++#define XKB_KEY_d 0x0064 /* U+0064 LATIN SMALL LETTER D */ ++#define XKB_KEY_e 0x0065 /* U+0065 LATIN SMALL LETTER E */ ++#define XKB_KEY_f 0x0066 /* U+0066 LATIN SMALL LETTER F */ ++#define XKB_KEY_g 0x0067 /* U+0067 LATIN SMALL LETTER G */ ++#define XKB_KEY_h 0x0068 /* U+0068 LATIN SMALL LETTER H */ ++#define XKB_KEY_i 0x0069 /* U+0069 LATIN SMALL LETTER I */ ++#define XKB_KEY_j 0x006a /* U+006A LATIN SMALL LETTER J */ ++#define XKB_KEY_k 0x006b /* U+006B LATIN SMALL LETTER K */ ++#define XKB_KEY_l 0x006c /* U+006C LATIN SMALL LETTER L */ ++#define XKB_KEY_m 0x006d /* U+006D LATIN SMALL LETTER M */ ++#define XKB_KEY_n 0x006e /* U+006E LATIN SMALL LETTER N */ ++#define XKB_KEY_o 0x006f /* U+006F LATIN SMALL LETTER O */ ++#define XKB_KEY_p 0x0070 /* U+0070 LATIN SMALL LETTER P */ ++#define XKB_KEY_q 0x0071 /* U+0071 LATIN SMALL LETTER Q */ ++#define XKB_KEY_r 0x0072 /* U+0072 LATIN SMALL LETTER R */ ++#define XKB_KEY_s 0x0073 /* U+0073 LATIN SMALL LETTER S */ ++#define XKB_KEY_t 0x0074 /* U+0074 LATIN SMALL LETTER T */ ++#define XKB_KEY_u 0x0075 /* U+0075 LATIN SMALL LETTER U */ ++#define XKB_KEY_v 0x0076 /* U+0076 LATIN SMALL LETTER V */ ++#define XKB_KEY_w 0x0077 /* U+0077 LATIN SMALL LETTER W */ ++#define XKB_KEY_x 0x0078 /* U+0078 LATIN SMALL LETTER X */ ++#define XKB_KEY_y 0x0079 /* U+0079 LATIN SMALL LETTER Y */ ++#define XKB_KEY_z 0x007a /* U+007A LATIN SMALL LETTER Z */ ++#define XKB_KEY_braceleft 0x007b /* U+007B LEFT CURLY BRACKET */ ++#define XKB_KEY_bar 0x007c /* U+007C VERTICAL LINE */ ++#define XKB_KEY_braceright 0x007d /* U+007D RIGHT CURLY BRACKET */ ++#define XKB_KEY_asciitilde 0x007e /* U+007E TILDE */ ++ ++#define XKB_KEY_nobreakspace 0x00a0 /* U+00A0 NO-BREAK SPACE */ ++#define XKB_KEY_exclamdown 0x00a1 /* U+00A1 INVERTED EXCLAMATION MARK */ ++#define XKB_KEY_cent 0x00a2 /* U+00A2 CENT SIGN */ ++#define XKB_KEY_sterling 0x00a3 /* U+00A3 POUND SIGN */ ++#define XKB_KEY_currency 0x00a4 /* U+00A4 CURRENCY SIGN */ ++#define XKB_KEY_yen 0x00a5 /* U+00A5 YEN SIGN */ ++#define XKB_KEY_brokenbar 0x00a6 /* U+00A6 BROKEN BAR */ ++#define XKB_KEY_section 0x00a7 /* U+00A7 SECTION SIGN */ ++#define XKB_KEY_diaeresis 0x00a8 /* U+00A8 DIAERESIS */ ++#define XKB_KEY_copyright 0x00a9 /* U+00A9 COPYRIGHT SIGN */ ++#define XKB_KEY_ordfeminine 0x00aa /* U+00AA FEMININE ORDINAL INDICATOR */ ++#define XKB_KEY_guillemotleft 0x00ab /* U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */ ++#define XKB_KEY_notsign 0x00ac /* U+00AC NOT SIGN */ ++#define XKB_KEY_hyphen 0x00ad /* U+00AD SOFT HYPHEN */ ++#define XKB_KEY_registered 0x00ae /* U+00AE REGISTERED SIGN */ ++#define XKB_KEY_macron 0x00af /* U+00AF MACRON */ ++#define XKB_KEY_degree 0x00b0 /* U+00B0 DEGREE SIGN */ ++#define XKB_KEY_plusminus 0x00b1 /* U+00B1 PLUS-MINUS SIGN */ ++#define XKB_KEY_twosuperior 0x00b2 /* U+00B2 SUPERSCRIPT TWO */ ++#define XKB_KEY_threesuperior 0x00b3 /* U+00B3 SUPERSCRIPT THREE */ ++#define XKB_KEY_acute 0x00b4 /* U+00B4 ACUTE ACCENT */ ++#define XKB_KEY_mu 0x00b5 /* U+00B5 MICRO SIGN */ ++#define XKB_KEY_paragraph 0x00b6 /* U+00B6 PILCROW SIGN */ ++#define XKB_KEY_periodcentered 0x00b7 /* U+00B7 MIDDLE DOT */ ++#define XKB_KEY_cedilla 0x00b8 /* U+00B8 CEDILLA */ ++#define XKB_KEY_onesuperior 0x00b9 /* U+00B9 SUPERSCRIPT ONE */ ++#define XKB_KEY_masculine 0x00ba /* U+00BA MASCULINE ORDINAL INDICATOR */ ++#define XKB_KEY_guillemotright 0x00bb /* U+00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */ ++#define XKB_KEY_onequarter 0x00bc /* U+00BC VULGAR FRACTION ONE QUARTER */ ++#define XKB_KEY_onehalf 0x00bd /* U+00BD VULGAR FRACTION ONE HALF */ ++#define XKB_KEY_threequarters 0x00be /* U+00BE VULGAR FRACTION THREE QUARTERS */ ++#define XKB_KEY_questiondown 0x00bf /* U+00BF INVERTED QUESTION MARK */ ++#define XKB_KEY_Agrave 0x00c0 /* U+00C0 LATIN CAPITAL LETTER A WITH GRAVE */ ++#define XKB_KEY_Aacute 0x00c1 /* U+00C1 LATIN CAPITAL LETTER A WITH ACUTE */ ++#define XKB_KEY_Acircumflex 0x00c2 /* U+00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX */ ++#define XKB_KEY_Atilde 0x00c3 /* U+00C3 LATIN CAPITAL LETTER A WITH TILDE */ ++#define XKB_KEY_Adiaeresis 0x00c4 /* U+00C4 LATIN CAPITAL LETTER A WITH DIAERESIS */ ++#define XKB_KEY_Aring 0x00c5 /* U+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE */ ++#define XKB_KEY_AE 0x00c6 /* U+00C6 LATIN CAPITAL LETTER AE */ ++#define XKB_KEY_Ccedilla 0x00c7 /* U+00C7 LATIN CAPITAL LETTER C WITH CEDILLA */ ++#define XKB_KEY_Egrave 0x00c8 /* U+00C8 LATIN CAPITAL LETTER E WITH GRAVE */ ++#define XKB_KEY_Eacute 0x00c9 /* U+00C9 LATIN CAPITAL LETTER E WITH ACUTE */ ++#define XKB_KEY_Ecircumflex 0x00ca /* U+00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX */ ++#define XKB_KEY_Ediaeresis 0x00cb /* U+00CB LATIN CAPITAL LETTER E WITH DIAERESIS */ ++#define XKB_KEY_Igrave 0x00cc /* U+00CC LATIN CAPITAL LETTER I WITH GRAVE */ ++#define XKB_KEY_Iacute 0x00cd /* U+00CD LATIN CAPITAL LETTER I WITH ACUTE */ ++#define XKB_KEY_Icircumflex 0x00ce /* U+00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX */ ++#define XKB_KEY_Idiaeresis 0x00cf /* U+00CF LATIN CAPITAL LETTER I WITH DIAERESIS */ ++#define XKB_KEY_ETH 0x00d0 /* U+00D0 LATIN CAPITAL LETTER ETH */ ++#define XKB_KEY_Eth 0x00d0 /* deprecated */ ++#define XKB_KEY_Ntilde 0x00d1 /* U+00D1 LATIN CAPITAL LETTER N WITH TILDE */ ++#define XKB_KEY_Ograve 0x00d2 /* U+00D2 LATIN CAPITAL LETTER O WITH GRAVE */ ++#define XKB_KEY_Oacute 0x00d3 /* U+00D3 LATIN CAPITAL LETTER O WITH ACUTE */ ++#define XKB_KEY_Ocircumflex 0x00d4 /* U+00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX */ ++#define XKB_KEY_Otilde 0x00d5 /* U+00D5 LATIN CAPITAL LETTER O WITH TILDE */ ++#define XKB_KEY_Odiaeresis 0x00d6 /* U+00D6 LATIN CAPITAL LETTER O WITH DIAERESIS */ ++#define XKB_KEY_multiply 0x00d7 /* U+00D7 MULTIPLICATION SIGN */ ++#define XKB_KEY_Oslash 0x00d8 /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */ ++#define XKB_KEY_Ooblique 0x00d8 /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */ ++#define XKB_KEY_Ugrave 0x00d9 /* U+00D9 LATIN CAPITAL LETTER U WITH GRAVE */ ++#define XKB_KEY_Uacute 0x00da /* U+00DA LATIN CAPITAL LETTER U WITH ACUTE */ ++#define XKB_KEY_Ucircumflex 0x00db /* U+00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX */ ++#define XKB_KEY_Udiaeresis 0x00dc /* U+00DC LATIN CAPITAL LETTER U WITH DIAERESIS */ ++#define XKB_KEY_Yacute 0x00dd /* U+00DD LATIN CAPITAL LETTER Y WITH ACUTE */ ++#define XKB_KEY_THORN 0x00de /* U+00DE LATIN CAPITAL LETTER THORN */ ++#define XKB_KEY_Thorn 0x00de /* deprecated */ ++#define XKB_KEY_ssharp 0x00df /* U+00DF LATIN SMALL LETTER SHARP S */ ++#define XKB_KEY_agrave 0x00e0 /* U+00E0 LATIN SMALL LETTER A WITH GRAVE */ ++#define XKB_KEY_aacute 0x00e1 /* U+00E1 LATIN SMALL LETTER A WITH ACUTE */ ++#define XKB_KEY_acircumflex 0x00e2 /* U+00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX */ ++#define XKB_KEY_atilde 0x00e3 /* U+00E3 LATIN SMALL LETTER A WITH TILDE */ ++#define XKB_KEY_adiaeresis 0x00e4 /* U+00E4 LATIN SMALL LETTER A WITH DIAERESIS */ ++#define XKB_KEY_aring 0x00e5 /* U+00E5 LATIN SMALL LETTER A WITH RING ABOVE */ ++#define XKB_KEY_ae 0x00e6 /* U+00E6 LATIN SMALL LETTER AE */ ++#define XKB_KEY_ccedilla 0x00e7 /* U+00E7 LATIN SMALL LETTER C WITH CEDILLA */ ++#define XKB_KEY_egrave 0x00e8 /* U+00E8 LATIN SMALL LETTER E WITH GRAVE */ ++#define XKB_KEY_eacute 0x00e9 /* U+00E9 LATIN SMALL LETTER E WITH ACUTE */ ++#define XKB_KEY_ecircumflex 0x00ea /* U+00EA LATIN SMALL LETTER E WITH CIRCUMFLEX */ ++#define XKB_KEY_ediaeresis 0x00eb /* U+00EB LATIN SMALL LETTER E WITH DIAERESIS */ ++#define XKB_KEY_igrave 0x00ec /* U+00EC LATIN SMALL LETTER I WITH GRAVE */ ++#define XKB_KEY_iacute 0x00ed /* U+00ED LATIN SMALL LETTER I WITH ACUTE */ ++#define XKB_KEY_icircumflex 0x00ee /* U+00EE LATIN SMALL LETTER I WITH CIRCUMFLEX */ ++#define XKB_KEY_idiaeresis 0x00ef /* U+00EF LATIN SMALL LETTER I WITH DIAERESIS */ ++#define XKB_KEY_eth 0x00f0 /* U+00F0 LATIN SMALL LETTER ETH */ ++#define XKB_KEY_ntilde 0x00f1 /* U+00F1 LATIN SMALL LETTER N WITH TILDE */ ++#define XKB_KEY_ograve 0x00f2 /* U+00F2 LATIN SMALL LETTER O WITH GRAVE */ ++#define XKB_KEY_oacute 0x00f3 /* U+00F3 LATIN SMALL LETTER O WITH ACUTE */ ++#define XKB_KEY_ocircumflex 0x00f4 /* U+00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX */ ++#define XKB_KEY_otilde 0x00f5 /* U+00F5 LATIN SMALL LETTER O WITH TILDE */ ++#define XKB_KEY_odiaeresis 0x00f6 /* U+00F6 LATIN SMALL LETTER O WITH DIAERESIS */ ++#define XKB_KEY_division 0x00f7 /* U+00F7 DIVISION SIGN */ ++#define XKB_KEY_oslash 0x00f8 /* U+00F8 LATIN SMALL LETTER O WITH STROKE */ ++#define XKB_KEY_ooblique 0x00f8 /* U+00F8 LATIN SMALL LETTER O WITH STROKE */ ++#define XKB_KEY_ugrave 0x00f9 /* U+00F9 LATIN SMALL LETTER U WITH GRAVE */ ++#define XKB_KEY_uacute 0x00fa /* U+00FA LATIN SMALL LETTER U WITH ACUTE */ ++#define XKB_KEY_ucircumflex 0x00fb /* U+00FB LATIN SMALL LETTER U WITH CIRCUMFLEX */ ++#define XKB_KEY_udiaeresis 0x00fc /* U+00FC LATIN SMALL LETTER U WITH DIAERESIS */ ++#define XKB_KEY_yacute 0x00fd /* U+00FD LATIN SMALL LETTER Y WITH ACUTE */ ++#define XKB_KEY_thorn 0x00fe /* U+00FE LATIN SMALL LETTER THORN */ ++#define XKB_KEY_ydiaeresis 0x00ff /* U+00FF LATIN SMALL LETTER Y WITH DIAERESIS */ ++ ++/* ++ * Latin 2 ++ * Byte 3 = 1 ++ */ ++ ++#define XKB_KEY_Aogonek 0x01a1 /* U+0104 LATIN CAPITAL LETTER A WITH OGONEK */ ++#define XKB_KEY_breve 0x01a2 /* U+02D8 BREVE */ ++#define XKB_KEY_Lstroke 0x01a3 /* U+0141 LATIN CAPITAL LETTER L WITH STROKE */ ++#define XKB_KEY_Lcaron 0x01a5 /* U+013D LATIN CAPITAL LETTER L WITH CARON */ ++#define XKB_KEY_Sacute 0x01a6 /* U+015A LATIN CAPITAL LETTER S WITH ACUTE */ ++#define XKB_KEY_Scaron 0x01a9 /* U+0160 LATIN CAPITAL LETTER S WITH CARON */ ++#define XKB_KEY_Scedilla 0x01aa /* U+015E LATIN CAPITAL LETTER S WITH CEDILLA */ ++#define XKB_KEY_Tcaron 0x01ab /* U+0164 LATIN CAPITAL LETTER T WITH CARON */ ++#define XKB_KEY_Zacute 0x01ac /* U+0179 LATIN CAPITAL LETTER Z WITH ACUTE */ ++#define XKB_KEY_Zcaron 0x01ae /* U+017D LATIN CAPITAL LETTER Z WITH CARON */ ++#define XKB_KEY_Zabovedot 0x01af /* U+017B LATIN CAPITAL LETTER Z WITH DOT ABOVE */ ++#define XKB_KEY_aogonek 0x01b1 /* U+0105 LATIN SMALL LETTER A WITH OGONEK */ ++#define XKB_KEY_ogonek 0x01b2 /* U+02DB OGONEK */ ++#define XKB_KEY_lstroke 0x01b3 /* U+0142 LATIN SMALL LETTER L WITH STROKE */ ++#define XKB_KEY_lcaron 0x01b5 /* U+013E LATIN SMALL LETTER L WITH CARON */ ++#define XKB_KEY_sacute 0x01b6 /* U+015B LATIN SMALL LETTER S WITH ACUTE */ ++#define XKB_KEY_caron 0x01b7 /* U+02C7 CARON */ ++#define XKB_KEY_scaron 0x01b9 /* U+0161 LATIN SMALL LETTER S WITH CARON */ ++#define XKB_KEY_scedilla 0x01ba /* U+015F LATIN SMALL LETTER S WITH CEDILLA */ ++#define XKB_KEY_tcaron 0x01bb /* U+0165 LATIN SMALL LETTER T WITH CARON */ ++#define XKB_KEY_zacute 0x01bc /* U+017A LATIN SMALL LETTER Z WITH ACUTE */ ++#define XKB_KEY_doubleacute 0x01bd /* U+02DD DOUBLE ACUTE ACCENT */ ++#define XKB_KEY_zcaron 0x01be /* U+017E LATIN SMALL LETTER Z WITH CARON */ ++#define XKB_KEY_zabovedot 0x01bf /* U+017C LATIN SMALL LETTER Z WITH DOT ABOVE */ ++#define XKB_KEY_Racute 0x01c0 /* U+0154 LATIN CAPITAL LETTER R WITH ACUTE */ ++#define XKB_KEY_Abreve 0x01c3 /* U+0102 LATIN CAPITAL LETTER A WITH BREVE */ ++#define XKB_KEY_Lacute 0x01c5 /* U+0139 LATIN CAPITAL LETTER L WITH ACUTE */ ++#define XKB_KEY_Cacute 0x01c6 /* U+0106 LATIN CAPITAL LETTER C WITH ACUTE */ ++#define XKB_KEY_Ccaron 0x01c8 /* U+010C LATIN CAPITAL LETTER C WITH CARON */ ++#define XKB_KEY_Eogonek 0x01ca /* U+0118 LATIN CAPITAL LETTER E WITH OGONEK */ ++#define XKB_KEY_Ecaron 0x01cc /* U+011A LATIN CAPITAL LETTER E WITH CARON */ ++#define XKB_KEY_Dcaron 0x01cf /* U+010E LATIN CAPITAL LETTER D WITH CARON */ ++#define XKB_KEY_Dstroke 0x01d0 /* U+0110 LATIN CAPITAL LETTER D WITH STROKE */ ++#define XKB_KEY_Nacute 0x01d1 /* U+0143 LATIN CAPITAL LETTER N WITH ACUTE */ ++#define XKB_KEY_Ncaron 0x01d2 /* U+0147 LATIN CAPITAL LETTER N WITH CARON */ ++#define XKB_KEY_Odoubleacute 0x01d5 /* U+0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */ ++#define XKB_KEY_Rcaron 0x01d8 /* U+0158 LATIN CAPITAL LETTER R WITH CARON */ ++#define XKB_KEY_Uring 0x01d9 /* U+016E LATIN CAPITAL LETTER U WITH RING ABOVE */ ++#define XKB_KEY_Udoubleacute 0x01db /* U+0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */ ++#define XKB_KEY_Tcedilla 0x01de /* U+0162 LATIN CAPITAL LETTER T WITH CEDILLA */ ++#define XKB_KEY_racute 0x01e0 /* U+0155 LATIN SMALL LETTER R WITH ACUTE */ ++#define XKB_KEY_abreve 0x01e3 /* U+0103 LATIN SMALL LETTER A WITH BREVE */ ++#define XKB_KEY_lacute 0x01e5 /* U+013A LATIN SMALL LETTER L WITH ACUTE */ ++#define XKB_KEY_cacute 0x01e6 /* U+0107 LATIN SMALL LETTER C WITH ACUTE */ ++#define XKB_KEY_ccaron 0x01e8 /* U+010D LATIN SMALL LETTER C WITH CARON */ ++#define XKB_KEY_eogonek 0x01ea /* U+0119 LATIN SMALL LETTER E WITH OGONEK */ ++#define XKB_KEY_ecaron 0x01ec /* U+011B LATIN SMALL LETTER E WITH CARON */ ++#define XKB_KEY_dcaron 0x01ef /* U+010F LATIN SMALL LETTER D WITH CARON */ ++#define XKB_KEY_dstroke 0x01f0 /* U+0111 LATIN SMALL LETTER D WITH STROKE */ ++#define XKB_KEY_nacute 0x01f1 /* U+0144 LATIN SMALL LETTER N WITH ACUTE */ ++#define XKB_KEY_ncaron 0x01f2 /* U+0148 LATIN SMALL LETTER N WITH CARON */ ++#define XKB_KEY_odoubleacute 0x01f5 /* U+0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE */ ++#define XKB_KEY_rcaron 0x01f8 /* U+0159 LATIN SMALL LETTER R WITH CARON */ ++#define XKB_KEY_uring 0x01f9 /* U+016F LATIN SMALL LETTER U WITH RING ABOVE */ ++#define XKB_KEY_udoubleacute 0x01fb /* U+0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE */ ++#define XKB_KEY_tcedilla 0x01fe /* U+0163 LATIN SMALL LETTER T WITH CEDILLA */ ++#define XKB_KEY_abovedot 0x01ff /* U+02D9 DOT ABOVE */ ++ ++/* ++ * Latin 3 ++ * Byte 3 = 2 ++ */ ++ ++#define XKB_KEY_Hstroke 0x02a1 /* U+0126 LATIN CAPITAL LETTER H WITH STROKE */ ++#define XKB_KEY_Hcircumflex 0x02a6 /* U+0124 LATIN CAPITAL LETTER H WITH CIRCUMFLEX */ ++#define XKB_KEY_Iabovedot 0x02a9 /* U+0130 LATIN CAPITAL LETTER I WITH DOT ABOVE */ ++#define XKB_KEY_Gbreve 0x02ab /* U+011E LATIN CAPITAL LETTER G WITH BREVE */ ++#define XKB_KEY_Jcircumflex 0x02ac /* U+0134 LATIN CAPITAL LETTER J WITH CIRCUMFLEX */ ++#define XKB_KEY_hstroke 0x02b1 /* U+0127 LATIN SMALL LETTER H WITH STROKE */ ++#define XKB_KEY_hcircumflex 0x02b6 /* U+0125 LATIN SMALL LETTER H WITH CIRCUMFLEX */ ++#define XKB_KEY_idotless 0x02b9 /* U+0131 LATIN SMALL LETTER DOTLESS I */ ++#define XKB_KEY_gbreve 0x02bb /* U+011F LATIN SMALL LETTER G WITH BREVE */ ++#define XKB_KEY_jcircumflex 0x02bc /* U+0135 LATIN SMALL LETTER J WITH CIRCUMFLEX */ ++#define XKB_KEY_Cabovedot 0x02c5 /* U+010A LATIN CAPITAL LETTER C WITH DOT ABOVE */ ++#define XKB_KEY_Ccircumflex 0x02c6 /* U+0108 LATIN CAPITAL LETTER C WITH CIRCUMFLEX */ ++#define XKB_KEY_Gabovedot 0x02d5 /* U+0120 LATIN CAPITAL LETTER G WITH DOT ABOVE */ ++#define XKB_KEY_Gcircumflex 0x02d8 /* U+011C LATIN CAPITAL LETTER G WITH CIRCUMFLEX */ ++#define XKB_KEY_Ubreve 0x02dd /* U+016C LATIN CAPITAL LETTER U WITH BREVE */ ++#define XKB_KEY_Scircumflex 0x02de /* U+015C LATIN CAPITAL LETTER S WITH CIRCUMFLEX */ ++#define XKB_KEY_cabovedot 0x02e5 /* U+010B LATIN SMALL LETTER C WITH DOT ABOVE */ ++#define XKB_KEY_ccircumflex 0x02e6 /* U+0109 LATIN SMALL LETTER C WITH CIRCUMFLEX */ ++#define XKB_KEY_gabovedot 0x02f5 /* U+0121 LATIN SMALL LETTER G WITH DOT ABOVE */ ++#define XKB_KEY_gcircumflex 0x02f8 /* U+011D LATIN SMALL LETTER G WITH CIRCUMFLEX */ ++#define XKB_KEY_ubreve 0x02fd /* U+016D LATIN SMALL LETTER U WITH BREVE */ ++#define XKB_KEY_scircumflex 0x02fe /* U+015D LATIN SMALL LETTER S WITH CIRCUMFLEX */ ++ ++ ++/* ++ * Latin 4 ++ * Byte 3 = 3 ++ */ ++ ++#define XKB_KEY_kra 0x03a2 /* U+0138 LATIN SMALL LETTER KRA */ ++#define XKB_KEY_kappa 0x03a2 /* deprecated */ ++#define XKB_KEY_Rcedilla 0x03a3 /* U+0156 LATIN CAPITAL LETTER R WITH CEDILLA */ ++#define XKB_KEY_Itilde 0x03a5 /* U+0128 LATIN CAPITAL LETTER I WITH TILDE */ ++#define XKB_KEY_Lcedilla 0x03a6 /* U+013B LATIN CAPITAL LETTER L WITH CEDILLA */ ++#define XKB_KEY_Emacron 0x03aa /* U+0112 LATIN CAPITAL LETTER E WITH MACRON */ ++#define XKB_KEY_Gcedilla 0x03ab /* U+0122 LATIN CAPITAL LETTER G WITH CEDILLA */ ++#define XKB_KEY_Tslash 0x03ac /* U+0166 LATIN CAPITAL LETTER T WITH STROKE */ ++#define XKB_KEY_rcedilla 0x03b3 /* U+0157 LATIN SMALL LETTER R WITH CEDILLA */ ++#define XKB_KEY_itilde 0x03b5 /* U+0129 LATIN SMALL LETTER I WITH TILDE */ ++#define XKB_KEY_lcedilla 0x03b6 /* U+013C LATIN SMALL LETTER L WITH CEDILLA */ ++#define XKB_KEY_emacron 0x03ba /* U+0113 LATIN SMALL LETTER E WITH MACRON */ ++#define XKB_KEY_gcedilla 0x03bb /* U+0123 LATIN SMALL LETTER G WITH CEDILLA */ ++#define XKB_KEY_tslash 0x03bc /* U+0167 LATIN SMALL LETTER T WITH STROKE */ ++#define XKB_KEY_ENG 0x03bd /* U+014A LATIN CAPITAL LETTER ENG */ ++#define XKB_KEY_eng 0x03bf /* U+014B LATIN SMALL LETTER ENG */ ++#define XKB_KEY_Amacron 0x03c0 /* U+0100 LATIN CAPITAL LETTER A WITH MACRON */ ++#define XKB_KEY_Iogonek 0x03c7 /* U+012E LATIN CAPITAL LETTER I WITH OGONEK */ ++#define XKB_KEY_Eabovedot 0x03cc /* U+0116 LATIN CAPITAL LETTER E WITH DOT ABOVE */ ++#define XKB_KEY_Imacron 0x03cf /* U+012A LATIN CAPITAL LETTER I WITH MACRON */ ++#define XKB_KEY_Ncedilla 0x03d1 /* U+0145 LATIN CAPITAL LETTER N WITH CEDILLA */ ++#define XKB_KEY_Omacron 0x03d2 /* U+014C LATIN CAPITAL LETTER O WITH MACRON */ ++#define XKB_KEY_Kcedilla 0x03d3 /* U+0136 LATIN CAPITAL LETTER K WITH CEDILLA */ ++#define XKB_KEY_Uogonek 0x03d9 /* U+0172 LATIN CAPITAL LETTER U WITH OGONEK */ ++#define XKB_KEY_Utilde 0x03dd /* U+0168 LATIN CAPITAL LETTER U WITH TILDE */ ++#define XKB_KEY_Umacron 0x03de /* U+016A LATIN CAPITAL LETTER U WITH MACRON */ ++#define XKB_KEY_amacron 0x03e0 /* U+0101 LATIN SMALL LETTER A WITH MACRON */ ++#define XKB_KEY_iogonek 0x03e7 /* U+012F LATIN SMALL LETTER I WITH OGONEK */ ++#define XKB_KEY_eabovedot 0x03ec /* U+0117 LATIN SMALL LETTER E WITH DOT ABOVE */ ++#define XKB_KEY_imacron 0x03ef /* U+012B LATIN SMALL LETTER I WITH MACRON */ ++#define XKB_KEY_ncedilla 0x03f1 /* U+0146 LATIN SMALL LETTER N WITH CEDILLA */ ++#define XKB_KEY_omacron 0x03f2 /* U+014D LATIN SMALL LETTER O WITH MACRON */ ++#define XKB_KEY_kcedilla 0x03f3 /* U+0137 LATIN SMALL LETTER K WITH CEDILLA */ ++#define XKB_KEY_uogonek 0x03f9 /* U+0173 LATIN SMALL LETTER U WITH OGONEK */ ++#define XKB_KEY_utilde 0x03fd /* U+0169 LATIN SMALL LETTER U WITH TILDE */ ++#define XKB_KEY_umacron 0x03fe /* U+016B LATIN SMALL LETTER U WITH MACRON */ ++ ++/* ++ * Latin 8 ++ */ ++#define XKB_KEY_Wcircumflex 0x1000174 /* U+0174 LATIN CAPITAL LETTER W WITH CIRCUMFLEX */ ++#define XKB_KEY_wcircumflex 0x1000175 /* U+0175 LATIN SMALL LETTER W WITH CIRCUMFLEX */ ++#define XKB_KEY_Ycircumflex 0x1000176 /* U+0176 LATIN CAPITAL LETTER Y WITH CIRCUMFLEX */ ++#define XKB_KEY_ycircumflex 0x1000177 /* U+0177 LATIN SMALL LETTER Y WITH CIRCUMFLEX */ ++#define XKB_KEY_Babovedot 0x1001e02 /* U+1E02 LATIN CAPITAL LETTER B WITH DOT ABOVE */ ++#define XKB_KEY_babovedot 0x1001e03 /* U+1E03 LATIN SMALL LETTER B WITH DOT ABOVE */ ++#define XKB_KEY_Dabovedot 0x1001e0a /* U+1E0A LATIN CAPITAL LETTER D WITH DOT ABOVE */ ++#define XKB_KEY_dabovedot 0x1001e0b /* U+1E0B LATIN SMALL LETTER D WITH DOT ABOVE */ ++#define XKB_KEY_Fabovedot 0x1001e1e /* U+1E1E LATIN CAPITAL LETTER F WITH DOT ABOVE */ ++#define XKB_KEY_fabovedot 0x1001e1f /* U+1E1F LATIN SMALL LETTER F WITH DOT ABOVE */ ++#define XKB_KEY_Mabovedot 0x1001e40 /* U+1E40 LATIN CAPITAL LETTER M WITH DOT ABOVE */ ++#define XKB_KEY_mabovedot 0x1001e41 /* U+1E41 LATIN SMALL LETTER M WITH DOT ABOVE */ ++#define XKB_KEY_Pabovedot 0x1001e56 /* U+1E56 LATIN CAPITAL LETTER P WITH DOT ABOVE */ ++#define XKB_KEY_pabovedot 0x1001e57 /* U+1E57 LATIN SMALL LETTER P WITH DOT ABOVE */ ++#define XKB_KEY_Sabovedot 0x1001e60 /* U+1E60 LATIN CAPITAL LETTER S WITH DOT ABOVE */ ++#define XKB_KEY_sabovedot 0x1001e61 /* U+1E61 LATIN SMALL LETTER S WITH DOT ABOVE */ ++#define XKB_KEY_Tabovedot 0x1001e6a /* U+1E6A LATIN CAPITAL LETTER T WITH DOT ABOVE */ ++#define XKB_KEY_tabovedot 0x1001e6b /* U+1E6B LATIN SMALL LETTER T WITH DOT ABOVE */ ++#define XKB_KEY_Wgrave 0x1001e80 /* U+1E80 LATIN CAPITAL LETTER W WITH GRAVE */ ++#define XKB_KEY_wgrave 0x1001e81 /* U+1E81 LATIN SMALL LETTER W WITH GRAVE */ ++#define XKB_KEY_Wacute 0x1001e82 /* U+1E82 LATIN CAPITAL LETTER W WITH ACUTE */ ++#define XKB_KEY_wacute 0x1001e83 /* U+1E83 LATIN SMALL LETTER W WITH ACUTE */ ++#define XKB_KEY_Wdiaeresis 0x1001e84 /* U+1E84 LATIN CAPITAL LETTER W WITH DIAERESIS */ ++#define XKB_KEY_wdiaeresis 0x1001e85 /* U+1E85 LATIN SMALL LETTER W WITH DIAERESIS */ ++#define XKB_KEY_Ygrave 0x1001ef2 /* U+1EF2 LATIN CAPITAL LETTER Y WITH GRAVE */ ++#define XKB_KEY_ygrave 0x1001ef3 /* U+1EF3 LATIN SMALL LETTER Y WITH GRAVE */ ++ ++/* ++ * Latin 9 ++ * Byte 3 = 0x13 ++ */ ++ ++#define XKB_KEY_OE 0x13bc /* U+0152 LATIN CAPITAL LIGATURE OE */ ++#define XKB_KEY_oe 0x13bd /* U+0153 LATIN SMALL LIGATURE OE */ ++#define XKB_KEY_Ydiaeresis 0x13be /* U+0178 LATIN CAPITAL LETTER Y WITH DIAERESIS */ ++ ++/* ++ * Katakana ++ * Byte 3 = 4 ++ */ ++ ++#define XKB_KEY_overline 0x047e /* U+203E OVERLINE */ ++#define XKB_KEY_kana_fullstop 0x04a1 /* U+3002 IDEOGRAPHIC FULL STOP */ ++#define XKB_KEY_kana_openingbracket 0x04a2 /* U+300C LEFT CORNER BRACKET */ ++#define XKB_KEY_kana_closingbracket 0x04a3 /* U+300D RIGHT CORNER BRACKET */ ++#define XKB_KEY_kana_comma 0x04a4 /* U+3001 IDEOGRAPHIC COMMA */ ++#define XKB_KEY_kana_conjunctive 0x04a5 /* U+30FB KATAKANA MIDDLE DOT */ ++#define XKB_KEY_kana_middledot 0x04a5 /* deprecated */ ++#define XKB_KEY_kana_WO 0x04a6 /* U+30F2 KATAKANA LETTER WO */ ++#define XKB_KEY_kana_a 0x04a7 /* U+30A1 KATAKANA LETTER SMALL A */ ++#define XKB_KEY_kana_i 0x04a8 /* U+30A3 KATAKANA LETTER SMALL I */ ++#define XKB_KEY_kana_u 0x04a9 /* U+30A5 KATAKANA LETTER SMALL U */ ++#define XKB_KEY_kana_e 0x04aa /* U+30A7 KATAKANA LETTER SMALL E */ ++#define XKB_KEY_kana_o 0x04ab /* U+30A9 KATAKANA LETTER SMALL O */ ++#define XKB_KEY_kana_ya 0x04ac /* U+30E3 KATAKANA LETTER SMALL YA */ ++#define XKB_KEY_kana_yu 0x04ad /* U+30E5 KATAKANA LETTER SMALL YU */ ++#define XKB_KEY_kana_yo 0x04ae /* U+30E7 KATAKANA LETTER SMALL YO */ ++#define XKB_KEY_kana_tsu 0x04af /* U+30C3 KATAKANA LETTER SMALL TU */ ++#define XKB_KEY_kana_tu 0x04af /* deprecated */ ++#define XKB_KEY_prolongedsound 0x04b0 /* U+30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK */ ++#define XKB_KEY_kana_A 0x04b1 /* U+30A2 KATAKANA LETTER A */ ++#define XKB_KEY_kana_I 0x04b2 /* U+30A4 KATAKANA LETTER I */ ++#define XKB_KEY_kana_U 0x04b3 /* U+30A6 KATAKANA LETTER U */ ++#define XKB_KEY_kana_E 0x04b4 /* U+30A8 KATAKANA LETTER E */ ++#define XKB_KEY_kana_O 0x04b5 /* U+30AA KATAKANA LETTER O */ ++#define XKB_KEY_kana_KA 0x04b6 /* U+30AB KATAKANA LETTER KA */ ++#define XKB_KEY_kana_KI 0x04b7 /* U+30AD KATAKANA LETTER KI */ ++#define XKB_KEY_kana_KU 0x04b8 /* U+30AF KATAKANA LETTER KU */ ++#define XKB_KEY_kana_KE 0x04b9 /* U+30B1 KATAKANA LETTER KE */ ++#define XKB_KEY_kana_KO 0x04ba /* U+30B3 KATAKANA LETTER KO */ ++#define XKB_KEY_kana_SA 0x04bb /* U+30B5 KATAKANA LETTER SA */ ++#define XKB_KEY_kana_SHI 0x04bc /* U+30B7 KATAKANA LETTER SI */ ++#define XKB_KEY_kana_SU 0x04bd /* U+30B9 KATAKANA LETTER SU */ ++#define XKB_KEY_kana_SE 0x04be /* U+30BB KATAKANA LETTER SE */ ++#define XKB_KEY_kana_SO 0x04bf /* U+30BD KATAKANA LETTER SO */ ++#define XKB_KEY_kana_TA 0x04c0 /* U+30BF KATAKANA LETTER TA */ ++#define XKB_KEY_kana_CHI 0x04c1 /* U+30C1 KATAKANA LETTER TI */ ++#define XKB_KEY_kana_TI 0x04c1 /* deprecated */ ++#define XKB_KEY_kana_TSU 0x04c2 /* U+30C4 KATAKANA LETTER TU */ ++#define XKB_KEY_kana_TU 0x04c2 /* deprecated */ ++#define XKB_KEY_kana_TE 0x04c3 /* U+30C6 KATAKANA LETTER TE */ ++#define XKB_KEY_kana_TO 0x04c4 /* U+30C8 KATAKANA LETTER TO */ ++#define XKB_KEY_kana_NA 0x04c5 /* U+30CA KATAKANA LETTER NA */ ++#define XKB_KEY_kana_NI 0x04c6 /* U+30CB KATAKANA LETTER NI */ ++#define XKB_KEY_kana_NU 0x04c7 /* U+30CC KATAKANA LETTER NU */ ++#define XKB_KEY_kana_NE 0x04c8 /* U+30CD KATAKANA LETTER NE */ ++#define XKB_KEY_kana_NO 0x04c9 /* U+30CE KATAKANA LETTER NO */ ++#define XKB_KEY_kana_HA 0x04ca /* U+30CF KATAKANA LETTER HA */ ++#define XKB_KEY_kana_HI 0x04cb /* U+30D2 KATAKANA LETTER HI */ ++#define XKB_KEY_kana_FU 0x04cc /* U+30D5 KATAKANA LETTER HU */ ++#define XKB_KEY_kana_HU 0x04cc /* deprecated */ ++#define XKB_KEY_kana_HE 0x04cd /* U+30D8 KATAKANA LETTER HE */ ++#define XKB_KEY_kana_HO 0x04ce /* U+30DB KATAKANA LETTER HO */ ++#define XKB_KEY_kana_MA 0x04cf /* U+30DE KATAKANA LETTER MA */ ++#define XKB_KEY_kana_MI 0x04d0 /* U+30DF KATAKANA LETTER MI */ ++#define XKB_KEY_kana_MU 0x04d1 /* U+30E0 KATAKANA LETTER MU */ ++#define XKB_KEY_kana_ME 0x04d2 /* U+30E1 KATAKANA LETTER ME */ ++#define XKB_KEY_kana_MO 0x04d3 /* U+30E2 KATAKANA LETTER MO */ ++#define XKB_KEY_kana_YA 0x04d4 /* U+30E4 KATAKANA LETTER YA */ ++#define XKB_KEY_kana_YU 0x04d5 /* U+30E6 KATAKANA LETTER YU */ ++#define XKB_KEY_kana_YO 0x04d6 /* U+30E8 KATAKANA LETTER YO */ ++#define XKB_KEY_kana_RA 0x04d7 /* U+30E9 KATAKANA LETTER RA */ ++#define XKB_KEY_kana_RI 0x04d8 /* U+30EA KATAKANA LETTER RI */ ++#define XKB_KEY_kana_RU 0x04d9 /* U+30EB KATAKANA LETTER RU */ ++#define XKB_KEY_kana_RE 0x04da /* U+30EC KATAKANA LETTER RE */ ++#define XKB_KEY_kana_RO 0x04db /* U+30ED KATAKANA LETTER RO */ ++#define XKB_KEY_kana_WA 0x04dc /* U+30EF KATAKANA LETTER WA */ ++#define XKB_KEY_kana_N 0x04dd /* U+30F3 KATAKANA LETTER N */ ++#define XKB_KEY_voicedsound 0x04de /* U+309B KATAKANA-HIRAGANA VOICED SOUND MARK */ ++#define XKB_KEY_semivoicedsound 0x04df /* U+309C KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */ ++#define XKB_KEY_kana_switch 0xff7e /* Alias for mode_switch */ ++ ++/* ++ * Arabic ++ * Byte 3 = 5 ++ */ ++ ++#define XKB_KEY_Farsi_0 0x10006f0 /* U+06F0 EXTENDED ARABIC-INDIC DIGIT ZERO */ ++#define XKB_KEY_Farsi_1 0x10006f1 /* U+06F1 EXTENDED ARABIC-INDIC DIGIT ONE */ ++#define XKB_KEY_Farsi_2 0x10006f2 /* U+06F2 EXTENDED ARABIC-INDIC DIGIT TWO */ ++#define XKB_KEY_Farsi_3 0x10006f3 /* U+06F3 EXTENDED ARABIC-INDIC DIGIT THREE */ ++#define XKB_KEY_Farsi_4 0x10006f4 /* U+06F4 EXTENDED ARABIC-INDIC DIGIT FOUR */ ++#define XKB_KEY_Farsi_5 0x10006f5 /* U+06F5 EXTENDED ARABIC-INDIC DIGIT FIVE */ ++#define XKB_KEY_Farsi_6 0x10006f6 /* U+06F6 EXTENDED ARABIC-INDIC DIGIT SIX */ ++#define XKB_KEY_Farsi_7 0x10006f7 /* U+06F7 EXTENDED ARABIC-INDIC DIGIT SEVEN */ ++#define XKB_KEY_Farsi_8 0x10006f8 /* U+06F8 EXTENDED ARABIC-INDIC DIGIT EIGHT */ ++#define XKB_KEY_Farsi_9 0x10006f9 /* U+06F9 EXTENDED ARABIC-INDIC DIGIT NINE */ ++#define XKB_KEY_Arabic_percent 0x100066a /* U+066A ARABIC PERCENT SIGN */ ++#define XKB_KEY_Arabic_superscript_alef 0x1000670 /* U+0670 ARABIC LETTER SUPERSCRIPT ALEF */ ++#define XKB_KEY_Arabic_tteh 0x1000679 /* U+0679 ARABIC LETTER TTEH */ ++#define XKB_KEY_Arabic_peh 0x100067e /* U+067E ARABIC LETTER PEH */ ++#define XKB_KEY_Arabic_tcheh 0x1000686 /* U+0686 ARABIC LETTER TCHEH */ ++#define XKB_KEY_Arabic_ddal 0x1000688 /* U+0688 ARABIC LETTER DDAL */ ++#define XKB_KEY_Arabic_rreh 0x1000691 /* U+0691 ARABIC LETTER RREH */ ++#define XKB_KEY_Arabic_comma 0x05ac /* U+060C ARABIC COMMA */ ++#define XKB_KEY_Arabic_fullstop 0x10006d4 /* U+06D4 ARABIC FULL STOP */ ++#define XKB_KEY_Arabic_0 0x1000660 /* U+0660 ARABIC-INDIC DIGIT ZERO */ ++#define XKB_KEY_Arabic_1 0x1000661 /* U+0661 ARABIC-INDIC DIGIT ONE */ ++#define XKB_KEY_Arabic_2 0x1000662 /* U+0662 ARABIC-INDIC DIGIT TWO */ ++#define XKB_KEY_Arabic_3 0x1000663 /* U+0663 ARABIC-INDIC DIGIT THREE */ ++#define XKB_KEY_Arabic_4 0x1000664 /* U+0664 ARABIC-INDIC DIGIT FOUR */ ++#define XKB_KEY_Arabic_5 0x1000665 /* U+0665 ARABIC-INDIC DIGIT FIVE */ ++#define XKB_KEY_Arabic_6 0x1000666 /* U+0666 ARABIC-INDIC DIGIT SIX */ ++#define XKB_KEY_Arabic_7 0x1000667 /* U+0667 ARABIC-INDIC DIGIT SEVEN */ ++#define XKB_KEY_Arabic_8 0x1000668 /* U+0668 ARABIC-INDIC DIGIT EIGHT */ ++#define XKB_KEY_Arabic_9 0x1000669 /* U+0669 ARABIC-INDIC DIGIT NINE */ ++#define XKB_KEY_Arabic_semicolon 0x05bb /* U+061B ARABIC SEMICOLON */ ++#define XKB_KEY_Arabic_question_mark 0x05bf /* U+061F ARABIC QUESTION MARK */ ++#define XKB_KEY_Arabic_hamza 0x05c1 /* U+0621 ARABIC LETTER HAMZA */ ++#define XKB_KEY_Arabic_maddaonalef 0x05c2 /* U+0622 ARABIC LETTER ALEF WITH MADDA ABOVE */ ++#define XKB_KEY_Arabic_hamzaonalef 0x05c3 /* U+0623 ARABIC LETTER ALEF WITH HAMZA ABOVE */ ++#define XKB_KEY_Arabic_hamzaonwaw 0x05c4 /* U+0624 ARABIC LETTER WAW WITH HAMZA ABOVE */ ++#define XKB_KEY_Arabic_hamzaunderalef 0x05c5 /* U+0625 ARABIC LETTER ALEF WITH HAMZA BELOW */ ++#define XKB_KEY_Arabic_hamzaonyeh 0x05c6 /* U+0626 ARABIC LETTER YEH WITH HAMZA ABOVE */ ++#define XKB_KEY_Arabic_alef 0x05c7 /* U+0627 ARABIC LETTER ALEF */ ++#define XKB_KEY_Arabic_beh 0x05c8 /* U+0628 ARABIC LETTER BEH */ ++#define XKB_KEY_Arabic_tehmarbuta 0x05c9 /* U+0629 ARABIC LETTER TEH MARBUTA */ ++#define XKB_KEY_Arabic_teh 0x05ca /* U+062A ARABIC LETTER TEH */ ++#define XKB_KEY_Arabic_theh 0x05cb /* U+062B ARABIC LETTER THEH */ ++#define XKB_KEY_Arabic_jeem 0x05cc /* U+062C ARABIC LETTER JEEM */ ++#define XKB_KEY_Arabic_hah 0x05cd /* U+062D ARABIC LETTER HAH */ ++#define XKB_KEY_Arabic_khah 0x05ce /* U+062E ARABIC LETTER KHAH */ ++#define XKB_KEY_Arabic_dal 0x05cf /* U+062F ARABIC LETTER DAL */ ++#define XKB_KEY_Arabic_thal 0x05d0 /* U+0630 ARABIC LETTER THAL */ ++#define XKB_KEY_Arabic_ra 0x05d1 /* U+0631 ARABIC LETTER REH */ ++#define XKB_KEY_Arabic_zain 0x05d2 /* U+0632 ARABIC LETTER ZAIN */ ++#define XKB_KEY_Arabic_seen 0x05d3 /* U+0633 ARABIC LETTER SEEN */ ++#define XKB_KEY_Arabic_sheen 0x05d4 /* U+0634 ARABIC LETTER SHEEN */ ++#define XKB_KEY_Arabic_sad 0x05d5 /* U+0635 ARABIC LETTER SAD */ ++#define XKB_KEY_Arabic_dad 0x05d6 /* U+0636 ARABIC LETTER DAD */ ++#define XKB_KEY_Arabic_tah 0x05d7 /* U+0637 ARABIC LETTER TAH */ ++#define XKB_KEY_Arabic_zah 0x05d8 /* U+0638 ARABIC LETTER ZAH */ ++#define XKB_KEY_Arabic_ain 0x05d9 /* U+0639 ARABIC LETTER AIN */ ++#define XKB_KEY_Arabic_ghain 0x05da /* U+063A ARABIC LETTER GHAIN */ ++#define XKB_KEY_Arabic_tatweel 0x05e0 /* U+0640 ARABIC TATWEEL */ ++#define XKB_KEY_Arabic_feh 0x05e1 /* U+0641 ARABIC LETTER FEH */ ++#define XKB_KEY_Arabic_qaf 0x05e2 /* U+0642 ARABIC LETTER QAF */ ++#define XKB_KEY_Arabic_kaf 0x05e3 /* U+0643 ARABIC LETTER KAF */ ++#define XKB_KEY_Arabic_lam 0x05e4 /* U+0644 ARABIC LETTER LAM */ ++#define XKB_KEY_Arabic_meem 0x05e5 /* U+0645 ARABIC LETTER MEEM */ ++#define XKB_KEY_Arabic_noon 0x05e6 /* U+0646 ARABIC LETTER NOON */ ++#define XKB_KEY_Arabic_ha 0x05e7 /* U+0647 ARABIC LETTER HEH */ ++#define XKB_KEY_Arabic_heh 0x05e7 /* deprecated */ ++#define XKB_KEY_Arabic_waw 0x05e8 /* U+0648 ARABIC LETTER WAW */ ++#define XKB_KEY_Arabic_alefmaksura 0x05e9 /* U+0649 ARABIC LETTER ALEF MAKSURA */ ++#define XKB_KEY_Arabic_yeh 0x05ea /* U+064A ARABIC LETTER YEH */ ++#define XKB_KEY_Arabic_fathatan 0x05eb /* U+064B ARABIC FATHATAN */ ++#define XKB_KEY_Arabic_dammatan 0x05ec /* U+064C ARABIC DAMMATAN */ ++#define XKB_KEY_Arabic_kasratan 0x05ed /* U+064D ARABIC KASRATAN */ ++#define XKB_KEY_Arabic_fatha 0x05ee /* U+064E ARABIC FATHA */ ++#define XKB_KEY_Arabic_damma 0x05ef /* U+064F ARABIC DAMMA */ ++#define XKB_KEY_Arabic_kasra 0x05f0 /* U+0650 ARABIC KASRA */ ++#define XKB_KEY_Arabic_shadda 0x05f1 /* U+0651 ARABIC SHADDA */ ++#define XKB_KEY_Arabic_sukun 0x05f2 /* U+0652 ARABIC SUKUN */ ++#define XKB_KEY_Arabic_madda_above 0x1000653 /* U+0653 ARABIC MADDAH ABOVE */ ++#define XKB_KEY_Arabic_hamza_above 0x1000654 /* U+0654 ARABIC HAMZA ABOVE */ ++#define XKB_KEY_Arabic_hamza_below 0x1000655 /* U+0655 ARABIC HAMZA BELOW */ ++#define XKB_KEY_Arabic_jeh 0x1000698 /* U+0698 ARABIC LETTER JEH */ ++#define XKB_KEY_Arabic_veh 0x10006a4 /* U+06A4 ARABIC LETTER VEH */ ++#define XKB_KEY_Arabic_keheh 0x10006a9 /* U+06A9 ARABIC LETTER KEHEH */ ++#define XKB_KEY_Arabic_gaf 0x10006af /* U+06AF ARABIC LETTER GAF */ ++#define XKB_KEY_Arabic_noon_ghunna 0x10006ba /* U+06BA ARABIC LETTER NOON GHUNNA */ ++#define XKB_KEY_Arabic_heh_doachashmee 0x10006be /* U+06BE ARABIC LETTER HEH DOACHASHMEE */ ++#define XKB_KEY_Farsi_yeh 0x10006cc /* U+06CC ARABIC LETTER FARSI YEH */ ++#define XKB_KEY_Arabic_farsi_yeh 0x10006cc /* U+06CC ARABIC LETTER FARSI YEH */ ++#define XKB_KEY_Arabic_yeh_baree 0x10006d2 /* U+06D2 ARABIC LETTER YEH BARREE */ ++#define XKB_KEY_Arabic_heh_goal 0x10006c1 /* U+06C1 ARABIC LETTER HEH GOAL */ ++#define XKB_KEY_Arabic_switch 0xff7e /* Alias for mode_switch */ ++ ++/* ++ * Cyrillic ++ * Byte 3 = 6 ++ */ ++#define XKB_KEY_Cyrillic_GHE_bar 0x1000492 /* U+0492 CYRILLIC CAPITAL LETTER GHE WITH STROKE */ ++#define XKB_KEY_Cyrillic_ghe_bar 0x1000493 /* U+0493 CYRILLIC SMALL LETTER GHE WITH STROKE */ ++#define XKB_KEY_Cyrillic_ZHE_descender 0x1000496 /* U+0496 CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER */ ++#define XKB_KEY_Cyrillic_zhe_descender 0x1000497 /* U+0497 CYRILLIC SMALL LETTER ZHE WITH DESCENDER */ ++#define XKB_KEY_Cyrillic_KA_descender 0x100049a /* U+049A CYRILLIC CAPITAL LETTER KA WITH DESCENDER */ ++#define XKB_KEY_Cyrillic_ka_descender 0x100049b /* U+049B CYRILLIC SMALL LETTER KA WITH DESCENDER */ ++#define XKB_KEY_Cyrillic_KA_vertstroke 0x100049c /* U+049C CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE */ ++#define XKB_KEY_Cyrillic_ka_vertstroke 0x100049d /* U+049D CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE */ ++#define XKB_KEY_Cyrillic_EN_descender 0x10004a2 /* U+04A2 CYRILLIC CAPITAL LETTER EN WITH DESCENDER */ ++#define XKB_KEY_Cyrillic_en_descender 0x10004a3 /* U+04A3 CYRILLIC SMALL LETTER EN WITH DESCENDER */ ++#define XKB_KEY_Cyrillic_U_straight 0x10004ae /* U+04AE CYRILLIC CAPITAL LETTER STRAIGHT U */ ++#define XKB_KEY_Cyrillic_u_straight 0x10004af /* U+04AF CYRILLIC SMALL LETTER STRAIGHT U */ ++#define XKB_KEY_Cyrillic_U_straight_bar 0x10004b0 /* U+04B0 CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE */ ++#define XKB_KEY_Cyrillic_u_straight_bar 0x10004b1 /* U+04B1 CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE */ ++#define XKB_KEY_Cyrillic_HA_descender 0x10004b2 /* U+04B2 CYRILLIC CAPITAL LETTER HA WITH DESCENDER */ ++#define XKB_KEY_Cyrillic_ha_descender 0x10004b3 /* U+04B3 CYRILLIC SMALL LETTER HA WITH DESCENDER */ ++#define XKB_KEY_Cyrillic_CHE_descender 0x10004b6 /* U+04B6 CYRILLIC CAPITAL LETTER CHE WITH DESCENDER */ ++#define XKB_KEY_Cyrillic_che_descender 0x10004b7 /* U+04B7 CYRILLIC SMALL LETTER CHE WITH DESCENDER */ ++#define XKB_KEY_Cyrillic_CHE_vertstroke 0x10004b8 /* U+04B8 CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE */ ++#define XKB_KEY_Cyrillic_che_vertstroke 0x10004b9 /* U+04B9 CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE */ ++#define XKB_KEY_Cyrillic_SHHA 0x10004ba /* U+04BA CYRILLIC CAPITAL LETTER SHHA */ ++#define XKB_KEY_Cyrillic_shha 0x10004bb /* U+04BB CYRILLIC SMALL LETTER SHHA */ ++ ++#define XKB_KEY_Cyrillic_SCHWA 0x10004d8 /* U+04D8 CYRILLIC CAPITAL LETTER SCHWA */ ++#define XKB_KEY_Cyrillic_schwa 0x10004d9 /* U+04D9 CYRILLIC SMALL LETTER SCHWA */ ++#define XKB_KEY_Cyrillic_I_macron 0x10004e2 /* U+04E2 CYRILLIC CAPITAL LETTER I WITH MACRON */ ++#define XKB_KEY_Cyrillic_i_macron 0x10004e3 /* U+04E3 CYRILLIC SMALL LETTER I WITH MACRON */ ++#define XKB_KEY_Cyrillic_O_bar 0x10004e8 /* U+04E8 CYRILLIC CAPITAL LETTER BARRED O */ ++#define XKB_KEY_Cyrillic_o_bar 0x10004e9 /* U+04E9 CYRILLIC SMALL LETTER BARRED O */ ++#define XKB_KEY_Cyrillic_U_macron 0x10004ee /* U+04EE CYRILLIC CAPITAL LETTER U WITH MACRON */ ++#define XKB_KEY_Cyrillic_u_macron 0x10004ef /* U+04EF CYRILLIC SMALL LETTER U WITH MACRON */ ++ ++#define XKB_KEY_Serbian_dje 0x06a1 /* U+0452 CYRILLIC SMALL LETTER DJE */ ++#define XKB_KEY_Macedonia_gje 0x06a2 /* U+0453 CYRILLIC SMALL LETTER GJE */ ++#define XKB_KEY_Cyrillic_io 0x06a3 /* U+0451 CYRILLIC SMALL LETTER IO */ ++#define XKB_KEY_Ukrainian_ie 0x06a4 /* U+0454 CYRILLIC SMALL LETTER UKRAINIAN IE */ ++#define XKB_KEY_Ukranian_je 0x06a4 /* deprecated */ ++#define XKB_KEY_Macedonia_dse 0x06a5 /* U+0455 CYRILLIC SMALL LETTER DZE */ ++#define XKB_KEY_Ukrainian_i 0x06a6 /* U+0456 CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I */ ++#define XKB_KEY_Ukranian_i 0x06a6 /* deprecated */ ++#define XKB_KEY_Ukrainian_yi 0x06a7 /* U+0457 CYRILLIC SMALL LETTER YI */ ++#define XKB_KEY_Ukranian_yi 0x06a7 /* deprecated */ ++#define XKB_KEY_Cyrillic_je 0x06a8 /* U+0458 CYRILLIC SMALL LETTER JE */ ++#define XKB_KEY_Serbian_je 0x06a8 /* deprecated */ ++#define XKB_KEY_Cyrillic_lje 0x06a9 /* U+0459 CYRILLIC SMALL LETTER LJE */ ++#define XKB_KEY_Serbian_lje 0x06a9 /* deprecated */ ++#define XKB_KEY_Cyrillic_nje 0x06aa /* U+045A CYRILLIC SMALL LETTER NJE */ ++#define XKB_KEY_Serbian_nje 0x06aa /* deprecated */ ++#define XKB_KEY_Serbian_tshe 0x06ab /* U+045B CYRILLIC SMALL LETTER TSHE */ ++#define XKB_KEY_Macedonia_kje 0x06ac /* U+045C CYRILLIC SMALL LETTER KJE */ ++#define XKB_KEY_Ukrainian_ghe_with_upturn 0x06ad /* U+0491 CYRILLIC SMALL LETTER GHE WITH UPTURN */ ++#define XKB_KEY_Byelorussian_shortu 0x06ae /* U+045E CYRILLIC SMALL LETTER SHORT U */ ++#define XKB_KEY_Cyrillic_dzhe 0x06af /* U+045F CYRILLIC SMALL LETTER DZHE */ ++#define XKB_KEY_Serbian_dze 0x06af /* deprecated */ ++#define XKB_KEY_numerosign 0x06b0 /* U+2116 NUMERO SIGN */ ++#define XKB_KEY_Serbian_DJE 0x06b1 /* U+0402 CYRILLIC CAPITAL LETTER DJE */ ++#define XKB_KEY_Macedonia_GJE 0x06b2 /* U+0403 CYRILLIC CAPITAL LETTER GJE */ ++#define XKB_KEY_Cyrillic_IO 0x06b3 /* U+0401 CYRILLIC CAPITAL LETTER IO */ ++#define XKB_KEY_Ukrainian_IE 0x06b4 /* U+0404 CYRILLIC CAPITAL LETTER UKRAINIAN IE */ ++#define XKB_KEY_Ukranian_JE 0x06b4 /* deprecated */ ++#define XKB_KEY_Macedonia_DSE 0x06b5 /* U+0405 CYRILLIC CAPITAL LETTER DZE */ ++#define XKB_KEY_Ukrainian_I 0x06b6 /* U+0406 CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */ ++#define XKB_KEY_Ukranian_I 0x06b6 /* deprecated */ ++#define XKB_KEY_Ukrainian_YI 0x06b7 /* U+0407 CYRILLIC CAPITAL LETTER YI */ ++#define XKB_KEY_Ukranian_YI 0x06b7 /* deprecated */ ++#define XKB_KEY_Cyrillic_JE 0x06b8 /* U+0408 CYRILLIC CAPITAL LETTER JE */ ++#define XKB_KEY_Serbian_JE 0x06b8 /* deprecated */ ++#define XKB_KEY_Cyrillic_LJE 0x06b9 /* U+0409 CYRILLIC CAPITAL LETTER LJE */ ++#define XKB_KEY_Serbian_LJE 0x06b9 /* deprecated */ ++#define XKB_KEY_Cyrillic_NJE 0x06ba /* U+040A CYRILLIC CAPITAL LETTER NJE */ ++#define XKB_KEY_Serbian_NJE 0x06ba /* deprecated */ ++#define XKB_KEY_Serbian_TSHE 0x06bb /* U+040B CYRILLIC CAPITAL LETTER TSHE */ ++#define XKB_KEY_Macedonia_KJE 0x06bc /* U+040C CYRILLIC CAPITAL LETTER KJE */ ++#define XKB_KEY_Ukrainian_GHE_WITH_UPTURN 0x06bd /* U+0490 CYRILLIC CAPITAL LETTER GHE WITH UPTURN */ ++#define XKB_KEY_Byelorussian_SHORTU 0x06be /* U+040E CYRILLIC CAPITAL LETTER SHORT U */ ++#define XKB_KEY_Cyrillic_DZHE 0x06bf /* U+040F CYRILLIC CAPITAL LETTER DZHE */ ++#define XKB_KEY_Serbian_DZE 0x06bf /* deprecated */ ++#define XKB_KEY_Cyrillic_yu 0x06c0 /* U+044E CYRILLIC SMALL LETTER YU */ ++#define XKB_KEY_Cyrillic_a 0x06c1 /* U+0430 CYRILLIC SMALL LETTER A */ ++#define XKB_KEY_Cyrillic_be 0x06c2 /* U+0431 CYRILLIC SMALL LETTER BE */ ++#define XKB_KEY_Cyrillic_tse 0x06c3 /* U+0446 CYRILLIC SMALL LETTER TSE */ ++#define XKB_KEY_Cyrillic_de 0x06c4 /* U+0434 CYRILLIC SMALL LETTER DE */ ++#define XKB_KEY_Cyrillic_ie 0x06c5 /* U+0435 CYRILLIC SMALL LETTER IE */ ++#define XKB_KEY_Cyrillic_ef 0x06c6 /* U+0444 CYRILLIC SMALL LETTER EF */ ++#define XKB_KEY_Cyrillic_ghe 0x06c7 /* U+0433 CYRILLIC SMALL LETTER GHE */ ++#define XKB_KEY_Cyrillic_ha 0x06c8 /* U+0445 CYRILLIC SMALL LETTER HA */ ++#define XKB_KEY_Cyrillic_i 0x06c9 /* U+0438 CYRILLIC SMALL LETTER I */ ++#define XKB_KEY_Cyrillic_shorti 0x06ca /* U+0439 CYRILLIC SMALL LETTER SHORT I */ ++#define XKB_KEY_Cyrillic_ka 0x06cb /* U+043A CYRILLIC SMALL LETTER KA */ ++#define XKB_KEY_Cyrillic_el 0x06cc /* U+043B CYRILLIC SMALL LETTER EL */ ++#define XKB_KEY_Cyrillic_em 0x06cd /* U+043C CYRILLIC SMALL LETTER EM */ ++#define XKB_KEY_Cyrillic_en 0x06ce /* U+043D CYRILLIC SMALL LETTER EN */ ++#define XKB_KEY_Cyrillic_o 0x06cf /* U+043E CYRILLIC SMALL LETTER O */ ++#define XKB_KEY_Cyrillic_pe 0x06d0 /* U+043F CYRILLIC SMALL LETTER PE */ ++#define XKB_KEY_Cyrillic_ya 0x06d1 /* U+044F CYRILLIC SMALL LETTER YA */ ++#define XKB_KEY_Cyrillic_er 0x06d2 /* U+0440 CYRILLIC SMALL LETTER ER */ ++#define XKB_KEY_Cyrillic_es 0x06d3 /* U+0441 CYRILLIC SMALL LETTER ES */ ++#define XKB_KEY_Cyrillic_te 0x06d4 /* U+0442 CYRILLIC SMALL LETTER TE */ ++#define XKB_KEY_Cyrillic_u 0x06d5 /* U+0443 CYRILLIC SMALL LETTER U */ ++#define XKB_KEY_Cyrillic_zhe 0x06d6 /* U+0436 CYRILLIC SMALL LETTER ZHE */ ++#define XKB_KEY_Cyrillic_ve 0x06d7 /* U+0432 CYRILLIC SMALL LETTER VE */ ++#define XKB_KEY_Cyrillic_softsign 0x06d8 /* U+044C CYRILLIC SMALL LETTER SOFT SIGN */ ++#define XKB_KEY_Cyrillic_yeru 0x06d9 /* U+044B CYRILLIC SMALL LETTER YERU */ ++#define XKB_KEY_Cyrillic_ze 0x06da /* U+0437 CYRILLIC SMALL LETTER ZE */ ++#define XKB_KEY_Cyrillic_sha 0x06db /* U+0448 CYRILLIC SMALL LETTER SHA */ ++#define XKB_KEY_Cyrillic_e 0x06dc /* U+044D CYRILLIC SMALL LETTER E */ ++#define XKB_KEY_Cyrillic_shcha 0x06dd /* U+0449 CYRILLIC SMALL LETTER SHCHA */ ++#define XKB_KEY_Cyrillic_che 0x06de /* U+0447 CYRILLIC SMALL LETTER CHE */ ++#define XKB_KEY_Cyrillic_hardsign 0x06df /* U+044A CYRILLIC SMALL LETTER HARD SIGN */ ++#define XKB_KEY_Cyrillic_YU 0x06e0 /* U+042E CYRILLIC CAPITAL LETTER YU */ ++#define XKB_KEY_Cyrillic_A 0x06e1 /* U+0410 CYRILLIC CAPITAL LETTER A */ ++#define XKB_KEY_Cyrillic_BE 0x06e2 /* U+0411 CYRILLIC CAPITAL LETTER BE */ ++#define XKB_KEY_Cyrillic_TSE 0x06e3 /* U+0426 CYRILLIC CAPITAL LETTER TSE */ ++#define XKB_KEY_Cyrillic_DE 0x06e4 /* U+0414 CYRILLIC CAPITAL LETTER DE */ ++#define XKB_KEY_Cyrillic_IE 0x06e5 /* U+0415 CYRILLIC CAPITAL LETTER IE */ ++#define XKB_KEY_Cyrillic_EF 0x06e6 /* U+0424 CYRILLIC CAPITAL LETTER EF */ ++#define XKB_KEY_Cyrillic_GHE 0x06e7 /* U+0413 CYRILLIC CAPITAL LETTER GHE */ ++#define XKB_KEY_Cyrillic_HA 0x06e8 /* U+0425 CYRILLIC CAPITAL LETTER HA */ ++#define XKB_KEY_Cyrillic_I 0x06e9 /* U+0418 CYRILLIC CAPITAL LETTER I */ ++#define XKB_KEY_Cyrillic_SHORTI 0x06ea /* U+0419 CYRILLIC CAPITAL LETTER SHORT I */ ++#define XKB_KEY_Cyrillic_KA 0x06eb /* U+041A CYRILLIC CAPITAL LETTER KA */ ++#define XKB_KEY_Cyrillic_EL 0x06ec /* U+041B CYRILLIC CAPITAL LETTER EL */ ++#define XKB_KEY_Cyrillic_EM 0x06ed /* U+041C CYRILLIC CAPITAL LETTER EM */ ++#define XKB_KEY_Cyrillic_EN 0x06ee /* U+041D CYRILLIC CAPITAL LETTER EN */ ++#define XKB_KEY_Cyrillic_O 0x06ef /* U+041E CYRILLIC CAPITAL LETTER O */ ++#define XKB_KEY_Cyrillic_PE 0x06f0 /* U+041F CYRILLIC CAPITAL LETTER PE */ ++#define XKB_KEY_Cyrillic_YA 0x06f1 /* U+042F CYRILLIC CAPITAL LETTER YA */ ++#define XKB_KEY_Cyrillic_ER 0x06f2 /* U+0420 CYRILLIC CAPITAL LETTER ER */ ++#define XKB_KEY_Cyrillic_ES 0x06f3 /* U+0421 CYRILLIC CAPITAL LETTER ES */ ++#define XKB_KEY_Cyrillic_TE 0x06f4 /* U+0422 CYRILLIC CAPITAL LETTER TE */ ++#define XKB_KEY_Cyrillic_U 0x06f5 /* U+0423 CYRILLIC CAPITAL LETTER U */ ++#define XKB_KEY_Cyrillic_ZHE 0x06f6 /* U+0416 CYRILLIC CAPITAL LETTER ZHE */ ++#define XKB_KEY_Cyrillic_VE 0x06f7 /* U+0412 CYRILLIC CAPITAL LETTER VE */ ++#define XKB_KEY_Cyrillic_SOFTSIGN 0x06f8 /* U+042C CYRILLIC CAPITAL LETTER SOFT SIGN */ ++#define XKB_KEY_Cyrillic_YERU 0x06f9 /* U+042B CYRILLIC CAPITAL LETTER YERU */ ++#define XKB_KEY_Cyrillic_ZE 0x06fa /* U+0417 CYRILLIC CAPITAL LETTER ZE */ ++#define XKB_KEY_Cyrillic_SHA 0x06fb /* U+0428 CYRILLIC CAPITAL LETTER SHA */ ++#define XKB_KEY_Cyrillic_E 0x06fc /* U+042D CYRILLIC CAPITAL LETTER E */ ++#define XKB_KEY_Cyrillic_SHCHA 0x06fd /* U+0429 CYRILLIC CAPITAL LETTER SHCHA */ ++#define XKB_KEY_Cyrillic_CHE 0x06fe /* U+0427 CYRILLIC CAPITAL LETTER CHE */ ++#define XKB_KEY_Cyrillic_HARDSIGN 0x06ff /* U+042A CYRILLIC CAPITAL LETTER HARD SIGN */ ++ ++/* ++ * Greek ++ * (based on an early draft of, and not quite identical to, ISO/IEC 8859-7) ++ * Byte 3 = 7 ++ */ ++ ++#define XKB_KEY_Greek_ALPHAaccent 0x07a1 /* U+0386 GREEK CAPITAL LETTER ALPHA WITH TONOS */ ++#define XKB_KEY_Greek_EPSILONaccent 0x07a2 /* U+0388 GREEK CAPITAL LETTER EPSILON WITH TONOS */ ++#define XKB_KEY_Greek_ETAaccent 0x07a3 /* U+0389 GREEK CAPITAL LETTER ETA WITH TONOS */ ++#define XKB_KEY_Greek_IOTAaccent 0x07a4 /* U+038A GREEK CAPITAL LETTER IOTA WITH TONOS */ ++#define XKB_KEY_Greek_IOTAdieresis 0x07a5 /* U+03AA GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */ ++#define XKB_KEY_Greek_IOTAdiaeresis 0x07a5 /* old typo */ ++#define XKB_KEY_Greek_OMICRONaccent 0x07a7 /* U+038C GREEK CAPITAL LETTER OMICRON WITH TONOS */ ++#define XKB_KEY_Greek_UPSILONaccent 0x07a8 /* U+038E GREEK CAPITAL LETTER UPSILON WITH TONOS */ ++#define XKB_KEY_Greek_UPSILONdieresis 0x07a9 /* U+03AB GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */ ++#define XKB_KEY_Greek_OMEGAaccent 0x07ab /* U+038F GREEK CAPITAL LETTER OMEGA WITH TONOS */ ++#define XKB_KEY_Greek_accentdieresis 0x07ae /* U+0385 GREEK DIALYTIKA TONOS */ ++#define XKB_KEY_Greek_horizbar 0x07af /* U+2015 HORIZONTAL BAR */ ++#define XKB_KEY_Greek_alphaaccent 0x07b1 /* U+03AC GREEK SMALL LETTER ALPHA WITH TONOS */ ++#define XKB_KEY_Greek_epsilonaccent 0x07b2 /* U+03AD GREEK SMALL LETTER EPSILON WITH TONOS */ ++#define XKB_KEY_Greek_etaaccent 0x07b3 /* U+03AE GREEK SMALL LETTER ETA WITH TONOS */ ++#define XKB_KEY_Greek_iotaaccent 0x07b4 /* U+03AF GREEK SMALL LETTER IOTA WITH TONOS */ ++#define XKB_KEY_Greek_iotadieresis 0x07b5 /* U+03CA GREEK SMALL LETTER IOTA WITH DIALYTIKA */ ++#define XKB_KEY_Greek_iotaaccentdieresis 0x07b6 /* U+0390 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */ ++#define XKB_KEY_Greek_omicronaccent 0x07b7 /* U+03CC GREEK SMALL LETTER OMICRON WITH TONOS */ ++#define XKB_KEY_Greek_upsilonaccent 0x07b8 /* U+03CD GREEK SMALL LETTER UPSILON WITH TONOS */ ++#define XKB_KEY_Greek_upsilondieresis 0x07b9 /* U+03CB GREEK SMALL LETTER UPSILON WITH DIALYTIKA */ ++#define XKB_KEY_Greek_upsilonaccentdieresis 0x07ba /* U+03B0 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */ ++#define XKB_KEY_Greek_omegaaccent 0x07bb /* U+03CE GREEK SMALL LETTER OMEGA WITH TONOS */ ++#define XKB_KEY_Greek_ALPHA 0x07c1 /* U+0391 GREEK CAPITAL LETTER ALPHA */ ++#define XKB_KEY_Greek_BETA 0x07c2 /* U+0392 GREEK CAPITAL LETTER BETA */ ++#define XKB_KEY_Greek_GAMMA 0x07c3 /* U+0393 GREEK CAPITAL LETTER GAMMA */ ++#define XKB_KEY_Greek_DELTA 0x07c4 /* U+0394 GREEK CAPITAL LETTER DELTA */ ++#define XKB_KEY_Greek_EPSILON 0x07c5 /* U+0395 GREEK CAPITAL LETTER EPSILON */ ++#define XKB_KEY_Greek_ZETA 0x07c6 /* U+0396 GREEK CAPITAL LETTER ZETA */ ++#define XKB_KEY_Greek_ETA 0x07c7 /* U+0397 GREEK CAPITAL LETTER ETA */ ++#define XKB_KEY_Greek_THETA 0x07c8 /* U+0398 GREEK CAPITAL LETTER THETA */ ++#define XKB_KEY_Greek_IOTA 0x07c9 /* U+0399 GREEK CAPITAL LETTER IOTA */ ++#define XKB_KEY_Greek_KAPPA 0x07ca /* U+039A GREEK CAPITAL LETTER KAPPA */ ++#define XKB_KEY_Greek_LAMDA 0x07cb /* U+039B GREEK CAPITAL LETTER LAMDA */ ++#define XKB_KEY_Greek_LAMBDA 0x07cb /* U+039B GREEK CAPITAL LETTER LAMDA */ ++#define XKB_KEY_Greek_MU 0x07cc /* U+039C GREEK CAPITAL LETTER MU */ ++#define XKB_KEY_Greek_NU 0x07cd /* U+039D GREEK CAPITAL LETTER NU */ ++#define XKB_KEY_Greek_XI 0x07ce /* U+039E GREEK CAPITAL LETTER XI */ ++#define XKB_KEY_Greek_OMICRON 0x07cf /* U+039F GREEK CAPITAL LETTER OMICRON */ ++#define XKB_KEY_Greek_PI 0x07d0 /* U+03A0 GREEK CAPITAL LETTER PI */ ++#define XKB_KEY_Greek_RHO 0x07d1 /* U+03A1 GREEK CAPITAL LETTER RHO */ ++#define XKB_KEY_Greek_SIGMA 0x07d2 /* U+03A3 GREEK CAPITAL LETTER SIGMA */ ++#define XKB_KEY_Greek_TAU 0x07d4 /* U+03A4 GREEK CAPITAL LETTER TAU */ ++#define XKB_KEY_Greek_UPSILON 0x07d5 /* U+03A5 GREEK CAPITAL LETTER UPSILON */ ++#define XKB_KEY_Greek_PHI 0x07d6 /* U+03A6 GREEK CAPITAL LETTER PHI */ ++#define XKB_KEY_Greek_CHI 0x07d7 /* U+03A7 GREEK CAPITAL LETTER CHI */ ++#define XKB_KEY_Greek_PSI 0x07d8 /* U+03A8 GREEK CAPITAL LETTER PSI */ ++#define XKB_KEY_Greek_OMEGA 0x07d9 /* U+03A9 GREEK CAPITAL LETTER OMEGA */ ++#define XKB_KEY_Greek_alpha 0x07e1 /* U+03B1 GREEK SMALL LETTER ALPHA */ ++#define XKB_KEY_Greek_beta 0x07e2 /* U+03B2 GREEK SMALL LETTER BETA */ ++#define XKB_KEY_Greek_gamma 0x07e3 /* U+03B3 GREEK SMALL LETTER GAMMA */ ++#define XKB_KEY_Greek_delta 0x07e4 /* U+03B4 GREEK SMALL LETTER DELTA */ ++#define XKB_KEY_Greek_epsilon 0x07e5 /* U+03B5 GREEK SMALL LETTER EPSILON */ ++#define XKB_KEY_Greek_zeta 0x07e6 /* U+03B6 GREEK SMALL LETTER ZETA */ ++#define XKB_KEY_Greek_eta 0x07e7 /* U+03B7 GREEK SMALL LETTER ETA */ ++#define XKB_KEY_Greek_theta 0x07e8 /* U+03B8 GREEK SMALL LETTER THETA */ ++#define XKB_KEY_Greek_iota 0x07e9 /* U+03B9 GREEK SMALL LETTER IOTA */ ++#define XKB_KEY_Greek_kappa 0x07ea /* U+03BA GREEK SMALL LETTER KAPPA */ ++#define XKB_KEY_Greek_lamda 0x07eb /* U+03BB GREEK SMALL LETTER LAMDA */ ++#define XKB_KEY_Greek_lambda 0x07eb /* U+03BB GREEK SMALL LETTER LAMDA */ ++#define XKB_KEY_Greek_mu 0x07ec /* U+03BC GREEK SMALL LETTER MU */ ++#define XKB_KEY_Greek_nu 0x07ed /* U+03BD GREEK SMALL LETTER NU */ ++#define XKB_KEY_Greek_xi 0x07ee /* U+03BE GREEK SMALL LETTER XI */ ++#define XKB_KEY_Greek_omicron 0x07ef /* U+03BF GREEK SMALL LETTER OMICRON */ ++#define XKB_KEY_Greek_pi 0x07f0 /* U+03C0 GREEK SMALL LETTER PI */ ++#define XKB_KEY_Greek_rho 0x07f1 /* U+03C1 GREEK SMALL LETTER RHO */ ++#define XKB_KEY_Greek_sigma 0x07f2 /* U+03C3 GREEK SMALL LETTER SIGMA */ ++#define XKB_KEY_Greek_finalsmallsigma 0x07f3 /* U+03C2 GREEK SMALL LETTER FINAL SIGMA */ ++#define XKB_KEY_Greek_tau 0x07f4 /* U+03C4 GREEK SMALL LETTER TAU */ ++#define XKB_KEY_Greek_upsilon 0x07f5 /* U+03C5 GREEK SMALL LETTER UPSILON */ ++#define XKB_KEY_Greek_phi 0x07f6 /* U+03C6 GREEK SMALL LETTER PHI */ ++#define XKB_KEY_Greek_chi 0x07f7 /* U+03C7 GREEK SMALL LETTER CHI */ ++#define XKB_KEY_Greek_psi 0x07f8 /* U+03C8 GREEK SMALL LETTER PSI */ ++#define XKB_KEY_Greek_omega 0x07f9 /* U+03C9 GREEK SMALL LETTER OMEGA */ ++#define XKB_KEY_Greek_switch 0xff7e /* Alias for mode_switch */ ++ ++/* ++ * Technical ++ * (from the DEC VT330/VT420 Technical Character Set, http://vt100.net/charsets/technical.html) ++ * Byte 3 = 8 ++ */ ++ ++#define XKB_KEY_leftradical 0x08a1 /* U+23B7 RADICAL SYMBOL BOTTOM */ ++#define XKB_KEY_topleftradical 0x08a2 /*(U+250C BOX DRAWINGS LIGHT DOWN AND RIGHT)*/ ++#define XKB_KEY_horizconnector 0x08a3 /*(U+2500 BOX DRAWINGS LIGHT HORIZONTAL)*/ ++#define XKB_KEY_topintegral 0x08a4 /* U+2320 TOP HALF INTEGRAL */ ++#define XKB_KEY_botintegral 0x08a5 /* U+2321 BOTTOM HALF INTEGRAL */ ++#define XKB_KEY_vertconnector 0x08a6 /*(U+2502 BOX DRAWINGS LIGHT VERTICAL)*/ ++#define XKB_KEY_topleftsqbracket 0x08a7 /* U+23A1 LEFT SQUARE BRACKET UPPER CORNER */ ++#define XKB_KEY_botleftsqbracket 0x08a8 /* U+23A3 LEFT SQUARE BRACKET LOWER CORNER */ ++#define XKB_KEY_toprightsqbracket 0x08a9 /* U+23A4 RIGHT SQUARE BRACKET UPPER CORNER */ ++#define XKB_KEY_botrightsqbracket 0x08aa /* U+23A6 RIGHT SQUARE BRACKET LOWER CORNER */ ++#define XKB_KEY_topleftparens 0x08ab /* U+239B LEFT PARENTHESIS UPPER HOOK */ ++#define XKB_KEY_botleftparens 0x08ac /* U+239D LEFT PARENTHESIS LOWER HOOK */ ++#define XKB_KEY_toprightparens 0x08ad /* U+239E RIGHT PARENTHESIS UPPER HOOK */ ++#define XKB_KEY_botrightparens 0x08ae /* U+23A0 RIGHT PARENTHESIS LOWER HOOK */ ++#define XKB_KEY_leftmiddlecurlybrace 0x08af /* U+23A8 LEFT CURLY BRACKET MIDDLE PIECE */ ++#define XKB_KEY_rightmiddlecurlybrace 0x08b0 /* U+23AC RIGHT CURLY BRACKET MIDDLE PIECE */ ++#define XKB_KEY_topleftsummation 0x08b1 ++#define XKB_KEY_botleftsummation 0x08b2 ++#define XKB_KEY_topvertsummationconnector 0x08b3 ++#define XKB_KEY_botvertsummationconnector 0x08b4 ++#define XKB_KEY_toprightsummation 0x08b5 ++#define XKB_KEY_botrightsummation 0x08b6 ++#define XKB_KEY_rightmiddlesummation 0x08b7 ++#define XKB_KEY_lessthanequal 0x08bc /* U+2264 LESS-THAN OR EQUAL TO */ ++#define XKB_KEY_notequal 0x08bd /* U+2260 NOT EQUAL TO */ ++#define XKB_KEY_greaterthanequal 0x08be /* U+2265 GREATER-THAN OR EQUAL TO */ ++#define XKB_KEY_integral 0x08bf /* U+222B INTEGRAL */ ++#define XKB_KEY_therefore 0x08c0 /* U+2234 THEREFORE */ ++#define XKB_KEY_variation 0x08c1 /* U+221D PROPORTIONAL TO */ ++#define XKB_KEY_infinity 0x08c2 /* U+221E INFINITY */ ++#define XKB_KEY_nabla 0x08c5 /* U+2207 NABLA */ ++#define XKB_KEY_approximate 0x08c8 /* U+223C TILDE OPERATOR */ ++#define XKB_KEY_similarequal 0x08c9 /* U+2243 ASYMPTOTICALLY EQUAL TO */ ++#define XKB_KEY_ifonlyif 0x08cd /* U+21D4 LEFT RIGHT DOUBLE ARROW */ ++#define XKB_KEY_implies 0x08ce /* U+21D2 RIGHTWARDS DOUBLE ARROW */ ++#define XKB_KEY_identical 0x08cf /* U+2261 IDENTICAL TO */ ++#define XKB_KEY_radical 0x08d6 /* U+221A SQUARE ROOT */ ++#define XKB_KEY_includedin 0x08da /* U+2282 SUBSET OF */ ++#define XKB_KEY_includes 0x08db /* U+2283 SUPERSET OF */ ++#define XKB_KEY_intersection 0x08dc /* U+2229 INTERSECTION */ ++#define XKB_KEY_union 0x08dd /* U+222A UNION */ ++#define XKB_KEY_logicaland 0x08de /* U+2227 LOGICAL AND */ ++#define XKB_KEY_logicalor 0x08df /* U+2228 LOGICAL OR */ ++#define XKB_KEY_partialderivative 0x08ef /* U+2202 PARTIAL DIFFERENTIAL */ ++#define XKB_KEY_function 0x08f6 /* U+0192 LATIN SMALL LETTER F WITH HOOK */ ++#define XKB_KEY_leftarrow 0x08fb /* U+2190 LEFTWARDS ARROW */ ++#define XKB_KEY_uparrow 0x08fc /* U+2191 UPWARDS ARROW */ ++#define XKB_KEY_rightarrow 0x08fd /* U+2192 RIGHTWARDS ARROW */ ++#define XKB_KEY_downarrow 0x08fe /* U+2193 DOWNWARDS ARROW */ ++ ++/* ++ * Special ++ * (from the DEC VT100 Special Graphics Character Set) ++ * Byte 3 = 9 ++ */ ++ ++#define XKB_KEY_blank 0x09df ++#define XKB_KEY_soliddiamond 0x09e0 /* U+25C6 BLACK DIAMOND */ ++#define XKB_KEY_checkerboard 0x09e1 /* U+2592 MEDIUM SHADE */ ++#define XKB_KEY_ht 0x09e2 /* U+2409 SYMBOL FOR HORIZONTAL TABULATION */ ++#define XKB_KEY_ff 0x09e3 /* U+240C SYMBOL FOR FORM FEED */ ++#define XKB_KEY_cr 0x09e4 /* U+240D SYMBOL FOR CARRIAGE RETURN */ ++#define XKB_KEY_lf 0x09e5 /* U+240A SYMBOL FOR LINE FEED */ ++#define XKB_KEY_nl 0x09e8 /* U+2424 SYMBOL FOR NEWLINE */ ++#define XKB_KEY_vt 0x09e9 /* U+240B SYMBOL FOR VERTICAL TABULATION */ ++#define XKB_KEY_lowrightcorner 0x09ea /* U+2518 BOX DRAWINGS LIGHT UP AND LEFT */ ++#define XKB_KEY_uprightcorner 0x09eb /* U+2510 BOX DRAWINGS LIGHT DOWN AND LEFT */ ++#define XKB_KEY_upleftcorner 0x09ec /* U+250C BOX DRAWINGS LIGHT DOWN AND RIGHT */ ++#define XKB_KEY_lowleftcorner 0x09ed /* U+2514 BOX DRAWINGS LIGHT UP AND RIGHT */ ++#define XKB_KEY_crossinglines 0x09ee /* U+253C BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */ ++#define XKB_KEY_horizlinescan1 0x09ef /* U+23BA HORIZONTAL SCAN LINE-1 */ ++#define XKB_KEY_horizlinescan3 0x09f0 /* U+23BB HORIZONTAL SCAN LINE-3 */ ++#define XKB_KEY_horizlinescan5 0x09f1 /* U+2500 BOX DRAWINGS LIGHT HORIZONTAL */ ++#define XKB_KEY_horizlinescan7 0x09f2 /* U+23BC HORIZONTAL SCAN LINE-7 */ ++#define XKB_KEY_horizlinescan9 0x09f3 /* U+23BD HORIZONTAL SCAN LINE-9 */ ++#define XKB_KEY_leftt 0x09f4 /* U+251C BOX DRAWINGS LIGHT VERTICAL AND RIGHT */ ++#define XKB_KEY_rightt 0x09f5 /* U+2524 BOX DRAWINGS LIGHT VERTICAL AND LEFT */ ++#define XKB_KEY_bott 0x09f6 /* U+2534 BOX DRAWINGS LIGHT UP AND HORIZONTAL */ ++#define XKB_KEY_topt 0x09f7 /* U+252C BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */ ++#define XKB_KEY_vertbar 0x09f8 /* U+2502 BOX DRAWINGS LIGHT VERTICAL */ ++ ++/* ++ * Publishing ++ * (these are probably from a long forgotten DEC Publishing ++ * font that once shipped with DECwrite) ++ * Byte 3 = 0x0a ++ */ ++ ++#define XKB_KEY_emspace 0x0aa1 /* U+2003 EM SPACE */ ++#define XKB_KEY_enspace 0x0aa2 /* U+2002 EN SPACE */ ++#define XKB_KEY_em3space 0x0aa3 /* U+2004 THREE-PER-EM SPACE */ ++#define XKB_KEY_em4space 0x0aa4 /* U+2005 FOUR-PER-EM SPACE */ ++#define XKB_KEY_digitspace 0x0aa5 /* U+2007 FIGURE SPACE */ ++#define XKB_KEY_punctspace 0x0aa6 /* U+2008 PUNCTUATION SPACE */ ++#define XKB_KEY_thinspace 0x0aa7 /* U+2009 THIN SPACE */ ++#define XKB_KEY_hairspace 0x0aa8 /* U+200A HAIR SPACE */ ++#define XKB_KEY_emdash 0x0aa9 /* U+2014 EM DASH */ ++#define XKB_KEY_endash 0x0aaa /* U+2013 EN DASH */ ++#define XKB_KEY_signifblank 0x0aac /*(U+2423 OPEN BOX)*/ ++#define XKB_KEY_ellipsis 0x0aae /* U+2026 HORIZONTAL ELLIPSIS */ ++#define XKB_KEY_doubbaselinedot 0x0aaf /* U+2025 TWO DOT LEADER */ ++#define XKB_KEY_onethird 0x0ab0 /* U+2153 VULGAR FRACTION ONE THIRD */ ++#define XKB_KEY_twothirds 0x0ab1 /* U+2154 VULGAR FRACTION TWO THIRDS */ ++#define XKB_KEY_onefifth 0x0ab2 /* U+2155 VULGAR FRACTION ONE FIFTH */ ++#define XKB_KEY_twofifths 0x0ab3 /* U+2156 VULGAR FRACTION TWO FIFTHS */ ++#define XKB_KEY_threefifths 0x0ab4 /* U+2157 VULGAR FRACTION THREE FIFTHS */ ++#define XKB_KEY_fourfifths 0x0ab5 /* U+2158 VULGAR FRACTION FOUR FIFTHS */ ++#define XKB_KEY_onesixth 0x0ab6 /* U+2159 VULGAR FRACTION ONE SIXTH */ ++#define XKB_KEY_fivesixths 0x0ab7 /* U+215A VULGAR FRACTION FIVE SIXTHS */ ++#define XKB_KEY_careof 0x0ab8 /* U+2105 CARE OF */ ++#define XKB_KEY_figdash 0x0abb /* U+2012 FIGURE DASH */ ++#define XKB_KEY_leftanglebracket 0x0abc /*(U+27E8 MATHEMATICAL LEFT ANGLE BRACKET)*/ ++#define XKB_KEY_decimalpoint 0x0abd /*(U+002E FULL STOP)*/ ++#define XKB_KEY_rightanglebracket 0x0abe /*(U+27E9 MATHEMATICAL RIGHT ANGLE BRACKET)*/ ++#define XKB_KEY_marker 0x0abf ++#define XKB_KEY_oneeighth 0x0ac3 /* U+215B VULGAR FRACTION ONE EIGHTH */ ++#define XKB_KEY_threeeighths 0x0ac4 /* U+215C VULGAR FRACTION THREE EIGHTHS */ ++#define XKB_KEY_fiveeighths 0x0ac5 /* U+215D VULGAR FRACTION FIVE EIGHTHS */ ++#define XKB_KEY_seveneighths 0x0ac6 /* U+215E VULGAR FRACTION SEVEN EIGHTHS */ ++#define XKB_KEY_trademark 0x0ac9 /* U+2122 TRADE MARK SIGN */ ++#define XKB_KEY_signaturemark 0x0aca /*(U+2613 SALTIRE)*/ ++#define XKB_KEY_trademarkincircle 0x0acb ++#define XKB_KEY_leftopentriangle 0x0acc /*(U+25C1 WHITE LEFT-POINTING TRIANGLE)*/ ++#define XKB_KEY_rightopentriangle 0x0acd /*(U+25B7 WHITE RIGHT-POINTING TRIANGLE)*/ ++#define XKB_KEY_emopencircle 0x0ace /*(U+25CB WHITE CIRCLE)*/ ++#define XKB_KEY_emopenrectangle 0x0acf /*(U+25AF WHITE VERTICAL RECTANGLE)*/ ++#define XKB_KEY_leftsinglequotemark 0x0ad0 /* U+2018 LEFT SINGLE QUOTATION MARK */ ++#define XKB_KEY_rightsinglequotemark 0x0ad1 /* U+2019 RIGHT SINGLE QUOTATION MARK */ ++#define XKB_KEY_leftdoublequotemark 0x0ad2 /* U+201C LEFT DOUBLE QUOTATION MARK */ ++#define XKB_KEY_rightdoublequotemark 0x0ad3 /* U+201D RIGHT DOUBLE QUOTATION MARK */ ++#define XKB_KEY_prescription 0x0ad4 /* U+211E PRESCRIPTION TAKE */ ++#define XKB_KEY_permille 0x0ad5 /* U+2030 PER MILLE SIGN */ ++#define XKB_KEY_minutes 0x0ad6 /* U+2032 PRIME */ ++#define XKB_KEY_seconds 0x0ad7 /* U+2033 DOUBLE PRIME */ ++#define XKB_KEY_latincross 0x0ad9 /* U+271D LATIN CROSS */ ++#define XKB_KEY_hexagram 0x0ada ++#define XKB_KEY_filledrectbullet 0x0adb /*(U+25AC BLACK RECTANGLE)*/ ++#define XKB_KEY_filledlefttribullet 0x0adc /*(U+25C0 BLACK LEFT-POINTING TRIANGLE)*/ ++#define XKB_KEY_filledrighttribullet 0x0add /*(U+25B6 BLACK RIGHT-POINTING TRIANGLE)*/ ++#define XKB_KEY_emfilledcircle 0x0ade /*(U+25CF BLACK CIRCLE)*/ ++#define XKB_KEY_emfilledrect 0x0adf /*(U+25AE BLACK VERTICAL RECTANGLE)*/ ++#define XKB_KEY_enopencircbullet 0x0ae0 /*(U+25E6 WHITE BULLET)*/ ++#define XKB_KEY_enopensquarebullet 0x0ae1 /*(U+25AB WHITE SMALL SQUARE)*/ ++#define XKB_KEY_openrectbullet 0x0ae2 /*(U+25AD WHITE RECTANGLE)*/ ++#define XKB_KEY_opentribulletup 0x0ae3 /*(U+25B3 WHITE UP-POINTING TRIANGLE)*/ ++#define XKB_KEY_opentribulletdown 0x0ae4 /*(U+25BD WHITE DOWN-POINTING TRIANGLE)*/ ++#define XKB_KEY_openstar 0x0ae5 /*(U+2606 WHITE STAR)*/ ++#define XKB_KEY_enfilledcircbullet 0x0ae6 /*(U+2022 BULLET)*/ ++#define XKB_KEY_enfilledsqbullet 0x0ae7 /*(U+25AA BLACK SMALL SQUARE)*/ ++#define XKB_KEY_filledtribulletup 0x0ae8 /*(U+25B2 BLACK UP-POINTING TRIANGLE)*/ ++#define XKB_KEY_filledtribulletdown 0x0ae9 /*(U+25BC BLACK DOWN-POINTING TRIANGLE)*/ ++#define XKB_KEY_leftpointer 0x0aea /*(U+261C WHITE LEFT POINTING INDEX)*/ ++#define XKB_KEY_rightpointer 0x0aeb /*(U+261E WHITE RIGHT POINTING INDEX)*/ ++#define XKB_KEY_club 0x0aec /* U+2663 BLACK CLUB SUIT */ ++#define XKB_KEY_diamond 0x0aed /* U+2666 BLACK DIAMOND SUIT */ ++#define XKB_KEY_heart 0x0aee /* U+2665 BLACK HEART SUIT */ ++#define XKB_KEY_maltesecross 0x0af0 /* U+2720 MALTESE CROSS */ ++#define XKB_KEY_dagger 0x0af1 /* U+2020 DAGGER */ ++#define XKB_KEY_doubledagger 0x0af2 /* U+2021 DOUBLE DAGGER */ ++#define XKB_KEY_checkmark 0x0af3 /* U+2713 CHECK MARK */ ++#define XKB_KEY_ballotcross 0x0af4 /* U+2717 BALLOT X */ ++#define XKB_KEY_musicalsharp 0x0af5 /* U+266F MUSIC SHARP SIGN */ ++#define XKB_KEY_musicalflat 0x0af6 /* U+266D MUSIC FLAT SIGN */ ++#define XKB_KEY_malesymbol 0x0af7 /* U+2642 MALE SIGN */ ++#define XKB_KEY_femalesymbol 0x0af8 /* U+2640 FEMALE SIGN */ ++#define XKB_KEY_telephone 0x0af9 /* U+260E BLACK TELEPHONE */ ++#define XKB_KEY_telephonerecorder 0x0afa /* U+2315 TELEPHONE RECORDER */ ++#define XKB_KEY_phonographcopyright 0x0afb /* U+2117 SOUND RECORDING COPYRIGHT */ ++#define XKB_KEY_caret 0x0afc /* U+2038 CARET */ ++#define XKB_KEY_singlelowquotemark 0x0afd /* U+201A SINGLE LOW-9 QUOTATION MARK */ ++#define XKB_KEY_doublelowquotemark 0x0afe /* U+201E DOUBLE LOW-9 QUOTATION MARK */ ++#define XKB_KEY_cursor 0x0aff ++ ++/* ++ * APL ++ * Byte 3 = 0x0b ++ */ ++ ++#define XKB_KEY_leftcaret 0x0ba3 /*(U+003C LESS-THAN SIGN)*/ ++#define XKB_KEY_rightcaret 0x0ba6 /*(U+003E GREATER-THAN SIGN)*/ ++#define XKB_KEY_downcaret 0x0ba8 /*(U+2228 LOGICAL OR)*/ ++#define XKB_KEY_upcaret 0x0ba9 /*(U+2227 LOGICAL AND)*/ ++#define XKB_KEY_overbar 0x0bc0 /*(U+00AF MACRON)*/ ++#define XKB_KEY_downtack 0x0bc2 /* U+22A4 DOWN TACK */ ++#define XKB_KEY_upshoe 0x0bc3 /*(U+2229 INTERSECTION)*/ ++#define XKB_KEY_downstile 0x0bc4 /* U+230A LEFT FLOOR */ ++#define XKB_KEY_underbar 0x0bc6 /*(U+005F LOW LINE)*/ ++#define XKB_KEY_jot 0x0bca /* U+2218 RING OPERATOR */ ++#define XKB_KEY_quad 0x0bcc /* U+2395 APL FUNCTIONAL SYMBOL QUAD */ ++#define XKB_KEY_uptack 0x0bce /* U+22A5 UP TACK */ ++#define XKB_KEY_circle 0x0bcf /* U+25CB WHITE CIRCLE */ ++#define XKB_KEY_upstile 0x0bd3 /* U+2308 LEFT CEILING */ ++#define XKB_KEY_downshoe 0x0bd6 /*(U+222A UNION)*/ ++#define XKB_KEY_rightshoe 0x0bd8 /*(U+2283 SUPERSET OF)*/ ++#define XKB_KEY_leftshoe 0x0bda /*(U+2282 SUBSET OF)*/ ++#define XKB_KEY_lefttack 0x0bdc /* U+22A3 LEFT TACK */ ++#define XKB_KEY_righttack 0x0bfc /* U+22A2 RIGHT TACK */ ++ ++/* ++ * Hebrew ++ * Byte 3 = 0x0c ++ */ ++ ++#define XKB_KEY_hebrew_doublelowline 0x0cdf /* U+2017 DOUBLE LOW LINE */ ++#define XKB_KEY_hebrew_aleph 0x0ce0 /* U+05D0 HEBREW LETTER ALEF */ ++#define XKB_KEY_hebrew_bet 0x0ce1 /* U+05D1 HEBREW LETTER BET */ ++#define XKB_KEY_hebrew_beth 0x0ce1 /* deprecated */ ++#define XKB_KEY_hebrew_gimel 0x0ce2 /* U+05D2 HEBREW LETTER GIMEL */ ++#define XKB_KEY_hebrew_gimmel 0x0ce2 /* deprecated */ ++#define XKB_KEY_hebrew_dalet 0x0ce3 /* U+05D3 HEBREW LETTER DALET */ ++#define XKB_KEY_hebrew_daleth 0x0ce3 /* deprecated */ ++#define XKB_KEY_hebrew_he 0x0ce4 /* U+05D4 HEBREW LETTER HE */ ++#define XKB_KEY_hebrew_waw 0x0ce5 /* U+05D5 HEBREW LETTER VAV */ ++#define XKB_KEY_hebrew_zain 0x0ce6 /* U+05D6 HEBREW LETTER ZAYIN */ ++#define XKB_KEY_hebrew_zayin 0x0ce6 /* deprecated */ ++#define XKB_KEY_hebrew_chet 0x0ce7 /* U+05D7 HEBREW LETTER HET */ ++#define XKB_KEY_hebrew_het 0x0ce7 /* deprecated */ ++#define XKB_KEY_hebrew_tet 0x0ce8 /* U+05D8 HEBREW LETTER TET */ ++#define XKB_KEY_hebrew_teth 0x0ce8 /* deprecated */ ++#define XKB_KEY_hebrew_yod 0x0ce9 /* U+05D9 HEBREW LETTER YOD */ ++#define XKB_KEY_hebrew_finalkaph 0x0cea /* U+05DA HEBREW LETTER FINAL KAF */ ++#define XKB_KEY_hebrew_kaph 0x0ceb /* U+05DB HEBREW LETTER KAF */ ++#define XKB_KEY_hebrew_lamed 0x0cec /* U+05DC HEBREW LETTER LAMED */ ++#define XKB_KEY_hebrew_finalmem 0x0ced /* U+05DD HEBREW LETTER FINAL MEM */ ++#define XKB_KEY_hebrew_mem 0x0cee /* U+05DE HEBREW LETTER MEM */ ++#define XKB_KEY_hebrew_finalnun 0x0cef /* U+05DF HEBREW LETTER FINAL NUN */ ++#define XKB_KEY_hebrew_nun 0x0cf0 /* U+05E0 HEBREW LETTER NUN */ ++#define XKB_KEY_hebrew_samech 0x0cf1 /* U+05E1 HEBREW LETTER SAMEKH */ ++#define XKB_KEY_hebrew_samekh 0x0cf1 /* deprecated */ ++#define XKB_KEY_hebrew_ayin 0x0cf2 /* U+05E2 HEBREW LETTER AYIN */ ++#define XKB_KEY_hebrew_finalpe 0x0cf3 /* U+05E3 HEBREW LETTER FINAL PE */ ++#define XKB_KEY_hebrew_pe 0x0cf4 /* U+05E4 HEBREW LETTER PE */ ++#define XKB_KEY_hebrew_finalzade 0x0cf5 /* U+05E5 HEBREW LETTER FINAL TSADI */ ++#define XKB_KEY_hebrew_finalzadi 0x0cf5 /* deprecated */ ++#define XKB_KEY_hebrew_zade 0x0cf6 /* U+05E6 HEBREW LETTER TSADI */ ++#define XKB_KEY_hebrew_zadi 0x0cf6 /* deprecated */ ++#define XKB_KEY_hebrew_qoph 0x0cf7 /* U+05E7 HEBREW LETTER QOF */ ++#define XKB_KEY_hebrew_kuf 0x0cf7 /* deprecated */ ++#define XKB_KEY_hebrew_resh 0x0cf8 /* U+05E8 HEBREW LETTER RESH */ ++#define XKB_KEY_hebrew_shin 0x0cf9 /* U+05E9 HEBREW LETTER SHIN */ ++#define XKB_KEY_hebrew_taw 0x0cfa /* U+05EA HEBREW LETTER TAV */ ++#define XKB_KEY_hebrew_taf 0x0cfa /* deprecated */ ++#define XKB_KEY_Hebrew_switch 0xff7e /* Alias for mode_switch */ ++ ++/* ++ * Thai ++ * Byte 3 = 0x0d ++ */ ++ ++#define XKB_KEY_Thai_kokai 0x0da1 /* U+0E01 THAI CHARACTER KO KAI */ ++#define XKB_KEY_Thai_khokhai 0x0da2 /* U+0E02 THAI CHARACTER KHO KHAI */ ++#define XKB_KEY_Thai_khokhuat 0x0da3 /* U+0E03 THAI CHARACTER KHO KHUAT */ ++#define XKB_KEY_Thai_khokhwai 0x0da4 /* U+0E04 THAI CHARACTER KHO KHWAI */ ++#define XKB_KEY_Thai_khokhon 0x0da5 /* U+0E05 THAI CHARACTER KHO KHON */ ++#define XKB_KEY_Thai_khorakhang 0x0da6 /* U+0E06 THAI CHARACTER KHO RAKHANG */ ++#define XKB_KEY_Thai_ngongu 0x0da7 /* U+0E07 THAI CHARACTER NGO NGU */ ++#define XKB_KEY_Thai_chochan 0x0da8 /* U+0E08 THAI CHARACTER CHO CHAN */ ++#define XKB_KEY_Thai_choching 0x0da9 /* U+0E09 THAI CHARACTER CHO CHING */ ++#define XKB_KEY_Thai_chochang 0x0daa /* U+0E0A THAI CHARACTER CHO CHANG */ ++#define XKB_KEY_Thai_soso 0x0dab /* U+0E0B THAI CHARACTER SO SO */ ++#define XKB_KEY_Thai_chochoe 0x0dac /* U+0E0C THAI CHARACTER CHO CHOE */ ++#define XKB_KEY_Thai_yoying 0x0dad /* U+0E0D THAI CHARACTER YO YING */ ++#define XKB_KEY_Thai_dochada 0x0dae /* U+0E0E THAI CHARACTER DO CHADA */ ++#define XKB_KEY_Thai_topatak 0x0daf /* U+0E0F THAI CHARACTER TO PATAK */ ++#define XKB_KEY_Thai_thothan 0x0db0 /* U+0E10 THAI CHARACTER THO THAN */ ++#define XKB_KEY_Thai_thonangmontho 0x0db1 /* U+0E11 THAI CHARACTER THO NANGMONTHO */ ++#define XKB_KEY_Thai_thophuthao 0x0db2 /* U+0E12 THAI CHARACTER THO PHUTHAO */ ++#define XKB_KEY_Thai_nonen 0x0db3 /* U+0E13 THAI CHARACTER NO NEN */ ++#define XKB_KEY_Thai_dodek 0x0db4 /* U+0E14 THAI CHARACTER DO DEK */ ++#define XKB_KEY_Thai_totao 0x0db5 /* U+0E15 THAI CHARACTER TO TAO */ ++#define XKB_KEY_Thai_thothung 0x0db6 /* U+0E16 THAI CHARACTER THO THUNG */ ++#define XKB_KEY_Thai_thothahan 0x0db7 /* U+0E17 THAI CHARACTER THO THAHAN */ ++#define XKB_KEY_Thai_thothong 0x0db8 /* U+0E18 THAI CHARACTER THO THONG */ ++#define XKB_KEY_Thai_nonu 0x0db9 /* U+0E19 THAI CHARACTER NO NU */ ++#define XKB_KEY_Thai_bobaimai 0x0dba /* U+0E1A THAI CHARACTER BO BAIMAI */ ++#define XKB_KEY_Thai_popla 0x0dbb /* U+0E1B THAI CHARACTER PO PLA */ ++#define XKB_KEY_Thai_phophung 0x0dbc /* U+0E1C THAI CHARACTER PHO PHUNG */ ++#define XKB_KEY_Thai_fofa 0x0dbd /* U+0E1D THAI CHARACTER FO FA */ ++#define XKB_KEY_Thai_phophan 0x0dbe /* U+0E1E THAI CHARACTER PHO PHAN */ ++#define XKB_KEY_Thai_fofan 0x0dbf /* U+0E1F THAI CHARACTER FO FAN */ ++#define XKB_KEY_Thai_phosamphao 0x0dc0 /* U+0E20 THAI CHARACTER PHO SAMPHAO */ ++#define XKB_KEY_Thai_moma 0x0dc1 /* U+0E21 THAI CHARACTER MO MA */ ++#define XKB_KEY_Thai_yoyak 0x0dc2 /* U+0E22 THAI CHARACTER YO YAK */ ++#define XKB_KEY_Thai_rorua 0x0dc3 /* U+0E23 THAI CHARACTER RO RUA */ ++#define XKB_KEY_Thai_ru 0x0dc4 /* U+0E24 THAI CHARACTER RU */ ++#define XKB_KEY_Thai_loling 0x0dc5 /* U+0E25 THAI CHARACTER LO LING */ ++#define XKB_KEY_Thai_lu 0x0dc6 /* U+0E26 THAI CHARACTER LU */ ++#define XKB_KEY_Thai_wowaen 0x0dc7 /* U+0E27 THAI CHARACTER WO WAEN */ ++#define XKB_KEY_Thai_sosala 0x0dc8 /* U+0E28 THAI CHARACTER SO SALA */ ++#define XKB_KEY_Thai_sorusi 0x0dc9 /* U+0E29 THAI CHARACTER SO RUSI */ ++#define XKB_KEY_Thai_sosua 0x0dca /* U+0E2A THAI CHARACTER SO SUA */ ++#define XKB_KEY_Thai_hohip 0x0dcb /* U+0E2B THAI CHARACTER HO HIP */ ++#define XKB_KEY_Thai_lochula 0x0dcc /* U+0E2C THAI CHARACTER LO CHULA */ ++#define XKB_KEY_Thai_oang 0x0dcd /* U+0E2D THAI CHARACTER O ANG */ ++#define XKB_KEY_Thai_honokhuk 0x0dce /* U+0E2E THAI CHARACTER HO NOKHUK */ ++#define XKB_KEY_Thai_paiyannoi 0x0dcf /* U+0E2F THAI CHARACTER PAIYANNOI */ ++#define XKB_KEY_Thai_saraa 0x0dd0 /* U+0E30 THAI CHARACTER SARA A */ ++#define XKB_KEY_Thai_maihanakat 0x0dd1 /* U+0E31 THAI CHARACTER MAI HAN-AKAT */ ++#define XKB_KEY_Thai_saraaa 0x0dd2 /* U+0E32 THAI CHARACTER SARA AA */ ++#define XKB_KEY_Thai_saraam 0x0dd3 /* U+0E33 THAI CHARACTER SARA AM */ ++#define XKB_KEY_Thai_sarai 0x0dd4 /* U+0E34 THAI CHARACTER SARA I */ ++#define XKB_KEY_Thai_saraii 0x0dd5 /* U+0E35 THAI CHARACTER SARA II */ ++#define XKB_KEY_Thai_saraue 0x0dd6 /* U+0E36 THAI CHARACTER SARA UE */ ++#define XKB_KEY_Thai_sarauee 0x0dd7 /* U+0E37 THAI CHARACTER SARA UEE */ ++#define XKB_KEY_Thai_sarau 0x0dd8 /* U+0E38 THAI CHARACTER SARA U */ ++#define XKB_KEY_Thai_sarauu 0x0dd9 /* U+0E39 THAI CHARACTER SARA UU */ ++#define XKB_KEY_Thai_phinthu 0x0dda /* U+0E3A THAI CHARACTER PHINTHU */ ++#define XKB_KEY_Thai_maihanakat_maitho 0x0dde ++#define XKB_KEY_Thai_baht 0x0ddf /* U+0E3F THAI CURRENCY SYMBOL BAHT */ ++#define XKB_KEY_Thai_sarae 0x0de0 /* U+0E40 THAI CHARACTER SARA E */ ++#define XKB_KEY_Thai_saraae 0x0de1 /* U+0E41 THAI CHARACTER SARA AE */ ++#define XKB_KEY_Thai_sarao 0x0de2 /* U+0E42 THAI CHARACTER SARA O */ ++#define XKB_KEY_Thai_saraaimaimuan 0x0de3 /* U+0E43 THAI CHARACTER SARA AI MAIMUAN */ ++#define XKB_KEY_Thai_saraaimaimalai 0x0de4 /* U+0E44 THAI CHARACTER SARA AI MAIMALAI */ ++#define XKB_KEY_Thai_lakkhangyao 0x0de5 /* U+0E45 THAI CHARACTER LAKKHANGYAO */ ++#define XKB_KEY_Thai_maiyamok 0x0de6 /* U+0E46 THAI CHARACTER MAIYAMOK */ ++#define XKB_KEY_Thai_maitaikhu 0x0de7 /* U+0E47 THAI CHARACTER MAITAIKHU */ ++#define XKB_KEY_Thai_maiek 0x0de8 /* U+0E48 THAI CHARACTER MAI EK */ ++#define XKB_KEY_Thai_maitho 0x0de9 /* U+0E49 THAI CHARACTER MAI THO */ ++#define XKB_KEY_Thai_maitri 0x0dea /* U+0E4A THAI CHARACTER MAI TRI */ ++#define XKB_KEY_Thai_maichattawa 0x0deb /* U+0E4B THAI CHARACTER MAI CHATTAWA */ ++#define XKB_KEY_Thai_thanthakhat 0x0dec /* U+0E4C THAI CHARACTER THANTHAKHAT */ ++#define XKB_KEY_Thai_nikhahit 0x0ded /* U+0E4D THAI CHARACTER NIKHAHIT */ ++#define XKB_KEY_Thai_leksun 0x0df0 /* U+0E50 THAI DIGIT ZERO */ ++#define XKB_KEY_Thai_leknung 0x0df1 /* U+0E51 THAI DIGIT ONE */ ++#define XKB_KEY_Thai_leksong 0x0df2 /* U+0E52 THAI DIGIT TWO */ ++#define XKB_KEY_Thai_leksam 0x0df3 /* U+0E53 THAI DIGIT THREE */ ++#define XKB_KEY_Thai_leksi 0x0df4 /* U+0E54 THAI DIGIT FOUR */ ++#define XKB_KEY_Thai_lekha 0x0df5 /* U+0E55 THAI DIGIT FIVE */ ++#define XKB_KEY_Thai_lekhok 0x0df6 /* U+0E56 THAI DIGIT SIX */ ++#define XKB_KEY_Thai_lekchet 0x0df7 /* U+0E57 THAI DIGIT SEVEN */ ++#define XKB_KEY_Thai_lekpaet 0x0df8 /* U+0E58 THAI DIGIT EIGHT */ ++#define XKB_KEY_Thai_lekkao 0x0df9 /* U+0E59 THAI DIGIT NINE */ ++ ++/* ++ * Korean ++ * Byte 3 = 0x0e ++ */ ++ ++ ++#define XKB_KEY_Hangul 0xff31 /* Hangul start/stop(toggle) */ ++#define XKB_KEY_Hangul_Start 0xff32 /* Hangul start */ ++#define XKB_KEY_Hangul_End 0xff33 /* Hangul end, English start */ ++#define XKB_KEY_Hangul_Hanja 0xff34 /* Start Hangul->Hanja Conversion */ ++#define XKB_KEY_Hangul_Jamo 0xff35 /* Hangul Jamo mode */ ++#define XKB_KEY_Hangul_Romaja 0xff36 /* Hangul Romaja mode */ ++#define XKB_KEY_Hangul_Codeinput 0xff37 /* Hangul code input mode */ ++#define XKB_KEY_Hangul_Jeonja 0xff38 /* Jeonja mode */ ++#define XKB_KEY_Hangul_Banja 0xff39 /* Banja mode */ ++#define XKB_KEY_Hangul_PreHanja 0xff3a /* Pre Hanja conversion */ ++#define XKB_KEY_Hangul_PostHanja 0xff3b /* Post Hanja conversion */ ++#define XKB_KEY_Hangul_SingleCandidate 0xff3c /* Single candidate */ ++#define XKB_KEY_Hangul_MultipleCandidate 0xff3d /* Multiple candidate */ ++#define XKB_KEY_Hangul_PreviousCandidate 0xff3e /* Previous candidate */ ++#define XKB_KEY_Hangul_Special 0xff3f /* Special symbols */ ++#define XKB_KEY_Hangul_switch 0xff7e /* Alias for mode_switch */ ++ ++/* Hangul Consonant Characters */ ++#define XKB_KEY_Hangul_Kiyeog 0x0ea1 ++#define XKB_KEY_Hangul_SsangKiyeog 0x0ea2 ++#define XKB_KEY_Hangul_KiyeogSios 0x0ea3 ++#define XKB_KEY_Hangul_Nieun 0x0ea4 ++#define XKB_KEY_Hangul_NieunJieuj 0x0ea5 ++#define XKB_KEY_Hangul_NieunHieuh 0x0ea6 ++#define XKB_KEY_Hangul_Dikeud 0x0ea7 ++#define XKB_KEY_Hangul_SsangDikeud 0x0ea8 ++#define XKB_KEY_Hangul_Rieul 0x0ea9 ++#define XKB_KEY_Hangul_RieulKiyeog 0x0eaa ++#define XKB_KEY_Hangul_RieulMieum 0x0eab ++#define XKB_KEY_Hangul_RieulPieub 0x0eac ++#define XKB_KEY_Hangul_RieulSios 0x0ead ++#define XKB_KEY_Hangul_RieulTieut 0x0eae ++#define XKB_KEY_Hangul_RieulPhieuf 0x0eaf ++#define XKB_KEY_Hangul_RieulHieuh 0x0eb0 ++#define XKB_KEY_Hangul_Mieum 0x0eb1 ++#define XKB_KEY_Hangul_Pieub 0x0eb2 ++#define XKB_KEY_Hangul_SsangPieub 0x0eb3 ++#define XKB_KEY_Hangul_PieubSios 0x0eb4 ++#define XKB_KEY_Hangul_Sios 0x0eb5 ++#define XKB_KEY_Hangul_SsangSios 0x0eb6 ++#define XKB_KEY_Hangul_Ieung 0x0eb7 ++#define XKB_KEY_Hangul_Jieuj 0x0eb8 ++#define XKB_KEY_Hangul_SsangJieuj 0x0eb9 ++#define XKB_KEY_Hangul_Cieuc 0x0eba ++#define XKB_KEY_Hangul_Khieuq 0x0ebb ++#define XKB_KEY_Hangul_Tieut 0x0ebc ++#define XKB_KEY_Hangul_Phieuf 0x0ebd ++#define XKB_KEY_Hangul_Hieuh 0x0ebe ++ ++/* Hangul Vowel Characters */ ++#define XKB_KEY_Hangul_A 0x0ebf ++#define XKB_KEY_Hangul_AE 0x0ec0 ++#define XKB_KEY_Hangul_YA 0x0ec1 ++#define XKB_KEY_Hangul_YAE 0x0ec2 ++#define XKB_KEY_Hangul_EO 0x0ec3 ++#define XKB_KEY_Hangul_E 0x0ec4 ++#define XKB_KEY_Hangul_YEO 0x0ec5 ++#define XKB_KEY_Hangul_YE 0x0ec6 ++#define XKB_KEY_Hangul_O 0x0ec7 ++#define XKB_KEY_Hangul_WA 0x0ec8 ++#define XKB_KEY_Hangul_WAE 0x0ec9 ++#define XKB_KEY_Hangul_OE 0x0eca ++#define XKB_KEY_Hangul_YO 0x0ecb ++#define XKB_KEY_Hangul_U 0x0ecc ++#define XKB_KEY_Hangul_WEO 0x0ecd ++#define XKB_KEY_Hangul_WE 0x0ece ++#define XKB_KEY_Hangul_WI 0x0ecf ++#define XKB_KEY_Hangul_YU 0x0ed0 ++#define XKB_KEY_Hangul_EU 0x0ed1 ++#define XKB_KEY_Hangul_YI 0x0ed2 ++#define XKB_KEY_Hangul_I 0x0ed3 ++ ++/* Hangul syllable-final (JongSeong) Characters */ ++#define XKB_KEY_Hangul_J_Kiyeog 0x0ed4 ++#define XKB_KEY_Hangul_J_SsangKiyeog 0x0ed5 ++#define XKB_KEY_Hangul_J_KiyeogSios 0x0ed6 ++#define XKB_KEY_Hangul_J_Nieun 0x0ed7 ++#define XKB_KEY_Hangul_J_NieunJieuj 0x0ed8 ++#define XKB_KEY_Hangul_J_NieunHieuh 0x0ed9 ++#define XKB_KEY_Hangul_J_Dikeud 0x0eda ++#define XKB_KEY_Hangul_J_Rieul 0x0edb ++#define XKB_KEY_Hangul_J_RieulKiyeog 0x0edc ++#define XKB_KEY_Hangul_J_RieulMieum 0x0edd ++#define XKB_KEY_Hangul_J_RieulPieub 0x0ede ++#define XKB_KEY_Hangul_J_RieulSios 0x0edf ++#define XKB_KEY_Hangul_J_RieulTieut 0x0ee0 ++#define XKB_KEY_Hangul_J_RieulPhieuf 0x0ee1 ++#define XKB_KEY_Hangul_J_RieulHieuh 0x0ee2 ++#define XKB_KEY_Hangul_J_Mieum 0x0ee3 ++#define XKB_KEY_Hangul_J_Pieub 0x0ee4 ++#define XKB_KEY_Hangul_J_PieubSios 0x0ee5 ++#define XKB_KEY_Hangul_J_Sios 0x0ee6 ++#define XKB_KEY_Hangul_J_SsangSios 0x0ee7 ++#define XKB_KEY_Hangul_J_Ieung 0x0ee8 ++#define XKB_KEY_Hangul_J_Jieuj 0x0ee9 ++#define XKB_KEY_Hangul_J_Cieuc 0x0eea ++#define XKB_KEY_Hangul_J_Khieuq 0x0eeb ++#define XKB_KEY_Hangul_J_Tieut 0x0eec ++#define XKB_KEY_Hangul_J_Phieuf 0x0eed ++#define XKB_KEY_Hangul_J_Hieuh 0x0eee ++ ++/* Ancient Hangul Consonant Characters */ ++#define XKB_KEY_Hangul_RieulYeorinHieuh 0x0eef ++#define XKB_KEY_Hangul_SunkyeongeumMieum 0x0ef0 ++#define XKB_KEY_Hangul_SunkyeongeumPieub 0x0ef1 ++#define XKB_KEY_Hangul_PanSios 0x0ef2 ++#define XKB_KEY_Hangul_KkogjiDalrinIeung 0x0ef3 ++#define XKB_KEY_Hangul_SunkyeongeumPhieuf 0x0ef4 ++#define XKB_KEY_Hangul_YeorinHieuh 0x0ef5 ++ ++/* Ancient Hangul Vowel Characters */ ++#define XKB_KEY_Hangul_AraeA 0x0ef6 ++#define XKB_KEY_Hangul_AraeAE 0x0ef7 ++ ++/* Ancient Hangul syllable-final (JongSeong) Characters */ ++#define XKB_KEY_Hangul_J_PanSios 0x0ef8 ++#define XKB_KEY_Hangul_J_KkogjiDalrinIeung 0x0ef9 ++#define XKB_KEY_Hangul_J_YeorinHieuh 0x0efa ++ ++/* Korean currency symbol */ ++#define XKB_KEY_Korean_Won 0x0eff /*(U+20A9 WON SIGN)*/ ++ ++ ++/* ++ * Armenian ++ */ ++ ++#define XKB_KEY_Armenian_ligature_ew 0x1000587 /* U+0587 ARMENIAN SMALL LIGATURE ECH YIWN */ ++#define XKB_KEY_Armenian_full_stop 0x1000589 /* U+0589 ARMENIAN FULL STOP */ ++#define XKB_KEY_Armenian_verjaket 0x1000589 /* U+0589 ARMENIAN FULL STOP */ ++#define XKB_KEY_Armenian_separation_mark 0x100055d /* U+055D ARMENIAN COMMA */ ++#define XKB_KEY_Armenian_but 0x100055d /* U+055D ARMENIAN COMMA */ ++#define XKB_KEY_Armenian_hyphen 0x100058a /* U+058A ARMENIAN HYPHEN */ ++#define XKB_KEY_Armenian_yentamna 0x100058a /* U+058A ARMENIAN HYPHEN */ ++#define XKB_KEY_Armenian_exclam 0x100055c /* U+055C ARMENIAN EXCLAMATION MARK */ ++#define XKB_KEY_Armenian_amanak 0x100055c /* U+055C ARMENIAN EXCLAMATION MARK */ ++#define XKB_KEY_Armenian_accent 0x100055b /* U+055B ARMENIAN EMPHASIS MARK */ ++#define XKB_KEY_Armenian_shesht 0x100055b /* U+055B ARMENIAN EMPHASIS MARK */ ++#define XKB_KEY_Armenian_question 0x100055e /* U+055E ARMENIAN QUESTION MARK */ ++#define XKB_KEY_Armenian_paruyk 0x100055e /* U+055E ARMENIAN QUESTION MARK */ ++#define XKB_KEY_Armenian_AYB 0x1000531 /* U+0531 ARMENIAN CAPITAL LETTER AYB */ ++#define XKB_KEY_Armenian_ayb 0x1000561 /* U+0561 ARMENIAN SMALL LETTER AYB */ ++#define XKB_KEY_Armenian_BEN 0x1000532 /* U+0532 ARMENIAN CAPITAL LETTER BEN */ ++#define XKB_KEY_Armenian_ben 0x1000562 /* U+0562 ARMENIAN SMALL LETTER BEN */ ++#define XKB_KEY_Armenian_GIM 0x1000533 /* U+0533 ARMENIAN CAPITAL LETTER GIM */ ++#define XKB_KEY_Armenian_gim 0x1000563 /* U+0563 ARMENIAN SMALL LETTER GIM */ ++#define XKB_KEY_Armenian_DA 0x1000534 /* U+0534 ARMENIAN CAPITAL LETTER DA */ ++#define XKB_KEY_Armenian_da 0x1000564 /* U+0564 ARMENIAN SMALL LETTER DA */ ++#define XKB_KEY_Armenian_YECH 0x1000535 /* U+0535 ARMENIAN CAPITAL LETTER ECH */ ++#define XKB_KEY_Armenian_yech 0x1000565 /* U+0565 ARMENIAN SMALL LETTER ECH */ ++#define XKB_KEY_Armenian_ZA 0x1000536 /* U+0536 ARMENIAN CAPITAL LETTER ZA */ ++#define XKB_KEY_Armenian_za 0x1000566 /* U+0566 ARMENIAN SMALL LETTER ZA */ ++#define XKB_KEY_Armenian_E 0x1000537 /* U+0537 ARMENIAN CAPITAL LETTER EH */ ++#define XKB_KEY_Armenian_e 0x1000567 /* U+0567 ARMENIAN SMALL LETTER EH */ ++#define XKB_KEY_Armenian_AT 0x1000538 /* U+0538 ARMENIAN CAPITAL LETTER ET */ ++#define XKB_KEY_Armenian_at 0x1000568 /* U+0568 ARMENIAN SMALL LETTER ET */ ++#define XKB_KEY_Armenian_TO 0x1000539 /* U+0539 ARMENIAN CAPITAL LETTER TO */ ++#define XKB_KEY_Armenian_to 0x1000569 /* U+0569 ARMENIAN SMALL LETTER TO */ ++#define XKB_KEY_Armenian_ZHE 0x100053a /* U+053A ARMENIAN CAPITAL LETTER ZHE */ ++#define XKB_KEY_Armenian_zhe 0x100056a /* U+056A ARMENIAN SMALL LETTER ZHE */ ++#define XKB_KEY_Armenian_INI 0x100053b /* U+053B ARMENIAN CAPITAL LETTER INI */ ++#define XKB_KEY_Armenian_ini 0x100056b /* U+056B ARMENIAN SMALL LETTER INI */ ++#define XKB_KEY_Armenian_LYUN 0x100053c /* U+053C ARMENIAN CAPITAL LETTER LIWN */ ++#define XKB_KEY_Armenian_lyun 0x100056c /* U+056C ARMENIAN SMALL LETTER LIWN */ ++#define XKB_KEY_Armenian_KHE 0x100053d /* U+053D ARMENIAN CAPITAL LETTER XEH */ ++#define XKB_KEY_Armenian_khe 0x100056d /* U+056D ARMENIAN SMALL LETTER XEH */ ++#define XKB_KEY_Armenian_TSA 0x100053e /* U+053E ARMENIAN CAPITAL LETTER CA */ ++#define XKB_KEY_Armenian_tsa 0x100056e /* U+056E ARMENIAN SMALL LETTER CA */ ++#define XKB_KEY_Armenian_KEN 0x100053f /* U+053F ARMENIAN CAPITAL LETTER KEN */ ++#define XKB_KEY_Armenian_ken 0x100056f /* U+056F ARMENIAN SMALL LETTER KEN */ ++#define XKB_KEY_Armenian_HO 0x1000540 /* U+0540 ARMENIAN CAPITAL LETTER HO */ ++#define XKB_KEY_Armenian_ho 0x1000570 /* U+0570 ARMENIAN SMALL LETTER HO */ ++#define XKB_KEY_Armenian_DZA 0x1000541 /* U+0541 ARMENIAN CAPITAL LETTER JA */ ++#define XKB_KEY_Armenian_dza 0x1000571 /* U+0571 ARMENIAN SMALL LETTER JA */ ++#define XKB_KEY_Armenian_GHAT 0x1000542 /* U+0542 ARMENIAN CAPITAL LETTER GHAD */ ++#define XKB_KEY_Armenian_ghat 0x1000572 /* U+0572 ARMENIAN SMALL LETTER GHAD */ ++#define XKB_KEY_Armenian_TCHE 0x1000543 /* U+0543 ARMENIAN CAPITAL LETTER CHEH */ ++#define XKB_KEY_Armenian_tche 0x1000573 /* U+0573 ARMENIAN SMALL LETTER CHEH */ ++#define XKB_KEY_Armenian_MEN 0x1000544 /* U+0544 ARMENIAN CAPITAL LETTER MEN */ ++#define XKB_KEY_Armenian_men 0x1000574 /* U+0574 ARMENIAN SMALL LETTER MEN */ ++#define XKB_KEY_Armenian_HI 0x1000545 /* U+0545 ARMENIAN CAPITAL LETTER YI */ ++#define XKB_KEY_Armenian_hi 0x1000575 /* U+0575 ARMENIAN SMALL LETTER YI */ ++#define XKB_KEY_Armenian_NU 0x1000546 /* U+0546 ARMENIAN CAPITAL LETTER NOW */ ++#define XKB_KEY_Armenian_nu 0x1000576 /* U+0576 ARMENIAN SMALL LETTER NOW */ ++#define XKB_KEY_Armenian_SHA 0x1000547 /* U+0547 ARMENIAN CAPITAL LETTER SHA */ ++#define XKB_KEY_Armenian_sha 0x1000577 /* U+0577 ARMENIAN SMALL LETTER SHA */ ++#define XKB_KEY_Armenian_VO 0x1000548 /* U+0548 ARMENIAN CAPITAL LETTER VO */ ++#define XKB_KEY_Armenian_vo 0x1000578 /* U+0578 ARMENIAN SMALL LETTER VO */ ++#define XKB_KEY_Armenian_CHA 0x1000549 /* U+0549 ARMENIAN CAPITAL LETTER CHA */ ++#define XKB_KEY_Armenian_cha 0x1000579 /* U+0579 ARMENIAN SMALL LETTER CHA */ ++#define XKB_KEY_Armenian_PE 0x100054a /* U+054A ARMENIAN CAPITAL LETTER PEH */ ++#define XKB_KEY_Armenian_pe 0x100057a /* U+057A ARMENIAN SMALL LETTER PEH */ ++#define XKB_KEY_Armenian_JE 0x100054b /* U+054B ARMENIAN CAPITAL LETTER JHEH */ ++#define XKB_KEY_Armenian_je 0x100057b /* U+057B ARMENIAN SMALL LETTER JHEH */ ++#define XKB_KEY_Armenian_RA 0x100054c /* U+054C ARMENIAN CAPITAL LETTER RA */ ++#define XKB_KEY_Armenian_ra 0x100057c /* U+057C ARMENIAN SMALL LETTER RA */ ++#define XKB_KEY_Armenian_SE 0x100054d /* U+054D ARMENIAN CAPITAL LETTER SEH */ ++#define XKB_KEY_Armenian_se 0x100057d /* U+057D ARMENIAN SMALL LETTER SEH */ ++#define XKB_KEY_Armenian_VEV 0x100054e /* U+054E ARMENIAN CAPITAL LETTER VEW */ ++#define XKB_KEY_Armenian_vev 0x100057e /* U+057E ARMENIAN SMALL LETTER VEW */ ++#define XKB_KEY_Armenian_TYUN 0x100054f /* U+054F ARMENIAN CAPITAL LETTER TIWN */ ++#define XKB_KEY_Armenian_tyun 0x100057f /* U+057F ARMENIAN SMALL LETTER TIWN */ ++#define XKB_KEY_Armenian_RE 0x1000550 /* U+0550 ARMENIAN CAPITAL LETTER REH */ ++#define XKB_KEY_Armenian_re 0x1000580 /* U+0580 ARMENIAN SMALL LETTER REH */ ++#define XKB_KEY_Armenian_TSO 0x1000551 /* U+0551 ARMENIAN CAPITAL LETTER CO */ ++#define XKB_KEY_Armenian_tso 0x1000581 /* U+0581 ARMENIAN SMALL LETTER CO */ ++#define XKB_KEY_Armenian_VYUN 0x1000552 /* U+0552 ARMENIAN CAPITAL LETTER YIWN */ ++#define XKB_KEY_Armenian_vyun 0x1000582 /* U+0582 ARMENIAN SMALL LETTER YIWN */ ++#define XKB_KEY_Armenian_PYUR 0x1000553 /* U+0553 ARMENIAN CAPITAL LETTER PIWR */ ++#define XKB_KEY_Armenian_pyur 0x1000583 /* U+0583 ARMENIAN SMALL LETTER PIWR */ ++#define XKB_KEY_Armenian_KE 0x1000554 /* U+0554 ARMENIAN CAPITAL LETTER KEH */ ++#define XKB_KEY_Armenian_ke 0x1000584 /* U+0584 ARMENIAN SMALL LETTER KEH */ ++#define XKB_KEY_Armenian_O 0x1000555 /* U+0555 ARMENIAN CAPITAL LETTER OH */ ++#define XKB_KEY_Armenian_o 0x1000585 /* U+0585 ARMENIAN SMALL LETTER OH */ ++#define XKB_KEY_Armenian_FE 0x1000556 /* U+0556 ARMENIAN CAPITAL LETTER FEH */ ++#define XKB_KEY_Armenian_fe 0x1000586 /* U+0586 ARMENIAN SMALL LETTER FEH */ ++#define XKB_KEY_Armenian_apostrophe 0x100055a /* U+055A ARMENIAN APOSTROPHE */ ++ ++/* ++ * Georgian ++ */ ++ ++#define XKB_KEY_Georgian_an 0x10010d0 /* U+10D0 GEORGIAN LETTER AN */ ++#define XKB_KEY_Georgian_ban 0x10010d1 /* U+10D1 GEORGIAN LETTER BAN */ ++#define XKB_KEY_Georgian_gan 0x10010d2 /* U+10D2 GEORGIAN LETTER GAN */ ++#define XKB_KEY_Georgian_don 0x10010d3 /* U+10D3 GEORGIAN LETTER DON */ ++#define XKB_KEY_Georgian_en 0x10010d4 /* U+10D4 GEORGIAN LETTER EN */ ++#define XKB_KEY_Georgian_vin 0x10010d5 /* U+10D5 GEORGIAN LETTER VIN */ ++#define XKB_KEY_Georgian_zen 0x10010d6 /* U+10D6 GEORGIAN LETTER ZEN */ ++#define XKB_KEY_Georgian_tan 0x10010d7 /* U+10D7 GEORGIAN LETTER TAN */ ++#define XKB_KEY_Georgian_in 0x10010d8 /* U+10D8 GEORGIAN LETTER IN */ ++#define XKB_KEY_Georgian_kan 0x10010d9 /* U+10D9 GEORGIAN LETTER KAN */ ++#define XKB_KEY_Georgian_las 0x10010da /* U+10DA GEORGIAN LETTER LAS */ ++#define XKB_KEY_Georgian_man 0x10010db /* U+10DB GEORGIAN LETTER MAN */ ++#define XKB_KEY_Georgian_nar 0x10010dc /* U+10DC GEORGIAN LETTER NAR */ ++#define XKB_KEY_Georgian_on 0x10010dd /* U+10DD GEORGIAN LETTER ON */ ++#define XKB_KEY_Georgian_par 0x10010de /* U+10DE GEORGIAN LETTER PAR */ ++#define XKB_KEY_Georgian_zhar 0x10010df /* U+10DF GEORGIAN LETTER ZHAR */ ++#define XKB_KEY_Georgian_rae 0x10010e0 /* U+10E0 GEORGIAN LETTER RAE */ ++#define XKB_KEY_Georgian_san 0x10010e1 /* U+10E1 GEORGIAN LETTER SAN */ ++#define XKB_KEY_Georgian_tar 0x10010e2 /* U+10E2 GEORGIAN LETTER TAR */ ++#define XKB_KEY_Georgian_un 0x10010e3 /* U+10E3 GEORGIAN LETTER UN */ ++#define XKB_KEY_Georgian_phar 0x10010e4 /* U+10E4 GEORGIAN LETTER PHAR */ ++#define XKB_KEY_Georgian_khar 0x10010e5 /* U+10E5 GEORGIAN LETTER KHAR */ ++#define XKB_KEY_Georgian_ghan 0x10010e6 /* U+10E6 GEORGIAN LETTER GHAN */ ++#define XKB_KEY_Georgian_qar 0x10010e7 /* U+10E7 GEORGIAN LETTER QAR */ ++#define XKB_KEY_Georgian_shin 0x10010e8 /* U+10E8 GEORGIAN LETTER SHIN */ ++#define XKB_KEY_Georgian_chin 0x10010e9 /* U+10E9 GEORGIAN LETTER CHIN */ ++#define XKB_KEY_Georgian_can 0x10010ea /* U+10EA GEORGIAN LETTER CAN */ ++#define XKB_KEY_Georgian_jil 0x10010eb /* U+10EB GEORGIAN LETTER JIL */ ++#define XKB_KEY_Georgian_cil 0x10010ec /* U+10EC GEORGIAN LETTER CIL */ ++#define XKB_KEY_Georgian_char 0x10010ed /* U+10ED GEORGIAN LETTER CHAR */ ++#define XKB_KEY_Georgian_xan 0x10010ee /* U+10EE GEORGIAN LETTER XAN */ ++#define XKB_KEY_Georgian_jhan 0x10010ef /* U+10EF GEORGIAN LETTER JHAN */ ++#define XKB_KEY_Georgian_hae 0x10010f0 /* U+10F0 GEORGIAN LETTER HAE */ ++#define XKB_KEY_Georgian_he 0x10010f1 /* U+10F1 GEORGIAN LETTER HE */ ++#define XKB_KEY_Georgian_hie 0x10010f2 /* U+10F2 GEORGIAN LETTER HIE */ ++#define XKB_KEY_Georgian_we 0x10010f3 /* U+10F3 GEORGIAN LETTER WE */ ++#define XKB_KEY_Georgian_har 0x10010f4 /* U+10F4 GEORGIAN LETTER HAR */ ++#define XKB_KEY_Georgian_hoe 0x10010f5 /* U+10F5 GEORGIAN LETTER HOE */ ++#define XKB_KEY_Georgian_fi 0x10010f6 /* U+10F6 GEORGIAN LETTER FI */ ++ ++/* ++ * Azeri (and other Turkic or Caucasian languages) ++ */ ++ ++/* latin */ ++#define XKB_KEY_Xabovedot 0x1001e8a /* U+1E8A LATIN CAPITAL LETTER X WITH DOT ABOVE */ ++#define XKB_KEY_Ibreve 0x100012c /* U+012C LATIN CAPITAL LETTER I WITH BREVE */ ++#define XKB_KEY_Zstroke 0x10001b5 /* U+01B5 LATIN CAPITAL LETTER Z WITH STROKE */ ++#define XKB_KEY_Gcaron 0x10001e6 /* U+01E6 LATIN CAPITAL LETTER G WITH CARON */ ++#define XKB_KEY_Ocaron 0x10001d1 /* U+01D2 LATIN CAPITAL LETTER O WITH CARON */ ++#define XKB_KEY_Obarred 0x100019f /* U+019F LATIN CAPITAL LETTER O WITH MIDDLE TILDE */ ++#define XKB_KEY_xabovedot 0x1001e8b /* U+1E8B LATIN SMALL LETTER X WITH DOT ABOVE */ ++#define XKB_KEY_ibreve 0x100012d /* U+012D LATIN SMALL LETTER I WITH BREVE */ ++#define XKB_KEY_zstroke 0x10001b6 /* U+01B6 LATIN SMALL LETTER Z WITH STROKE */ ++#define XKB_KEY_gcaron 0x10001e7 /* U+01E7 LATIN SMALL LETTER G WITH CARON */ ++#define XKB_KEY_ocaron 0x10001d2 /* U+01D2 LATIN SMALL LETTER O WITH CARON */ ++#define XKB_KEY_obarred 0x1000275 /* U+0275 LATIN SMALL LETTER BARRED O */ ++#define XKB_KEY_SCHWA 0x100018f /* U+018F LATIN CAPITAL LETTER SCHWA */ ++#define XKB_KEY_schwa 0x1000259 /* U+0259 LATIN SMALL LETTER SCHWA */ ++#define XKB_KEY_EZH 0x10001b7 /* U+01B7 LATIN CAPITAL LETTER EZH */ ++#define XKB_KEY_ezh 0x1000292 /* U+0292 LATIN SMALL LETTER EZH */ ++/* those are not really Caucasus */ ++/* For Inupiak */ ++#define XKB_KEY_Lbelowdot 0x1001e36 /* U+1E36 LATIN CAPITAL LETTER L WITH DOT BELOW */ ++#define XKB_KEY_lbelowdot 0x1001e37 /* U+1E37 LATIN SMALL LETTER L WITH DOT BELOW */ ++ ++/* ++ * Vietnamese ++ */ ++ ++#define XKB_KEY_Abelowdot 0x1001ea0 /* U+1EA0 LATIN CAPITAL LETTER A WITH DOT BELOW */ ++#define XKB_KEY_abelowdot 0x1001ea1 /* U+1EA1 LATIN SMALL LETTER A WITH DOT BELOW */ ++#define XKB_KEY_Ahook 0x1001ea2 /* U+1EA2 LATIN CAPITAL LETTER A WITH HOOK ABOVE */ ++#define XKB_KEY_ahook 0x1001ea3 /* U+1EA3 LATIN SMALL LETTER A WITH HOOK ABOVE */ ++#define XKB_KEY_Acircumflexacute 0x1001ea4 /* U+1EA4 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE */ ++#define XKB_KEY_acircumflexacute 0x1001ea5 /* U+1EA5 LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE */ ++#define XKB_KEY_Acircumflexgrave 0x1001ea6 /* U+1EA6 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE */ ++#define XKB_KEY_acircumflexgrave 0x1001ea7 /* U+1EA7 LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE */ ++#define XKB_KEY_Acircumflexhook 0x1001ea8 /* U+1EA8 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE */ ++#define XKB_KEY_acircumflexhook 0x1001ea9 /* U+1EA9 LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE */ ++#define XKB_KEY_Acircumflextilde 0x1001eaa /* U+1EAA LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE */ ++#define XKB_KEY_acircumflextilde 0x1001eab /* U+1EAB LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE */ ++#define XKB_KEY_Acircumflexbelowdot 0x1001eac /* U+1EAC LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW */ ++#define XKB_KEY_acircumflexbelowdot 0x1001ead /* U+1EAD LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW */ ++#define XKB_KEY_Abreveacute 0x1001eae /* U+1EAE LATIN CAPITAL LETTER A WITH BREVE AND ACUTE */ ++#define XKB_KEY_abreveacute 0x1001eaf /* U+1EAF LATIN SMALL LETTER A WITH BREVE AND ACUTE */ ++#define XKB_KEY_Abrevegrave 0x1001eb0 /* U+1EB0 LATIN CAPITAL LETTER A WITH BREVE AND GRAVE */ ++#define XKB_KEY_abrevegrave 0x1001eb1 /* U+1EB1 LATIN SMALL LETTER A WITH BREVE AND GRAVE */ ++#define XKB_KEY_Abrevehook 0x1001eb2 /* U+1EB2 LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE */ ++#define XKB_KEY_abrevehook 0x1001eb3 /* U+1EB3 LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE */ ++#define XKB_KEY_Abrevetilde 0x1001eb4 /* U+1EB4 LATIN CAPITAL LETTER A WITH BREVE AND TILDE */ ++#define XKB_KEY_abrevetilde 0x1001eb5 /* U+1EB5 LATIN SMALL LETTER A WITH BREVE AND TILDE */ ++#define XKB_KEY_Abrevebelowdot 0x1001eb6 /* U+1EB6 LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW */ ++#define XKB_KEY_abrevebelowdot 0x1001eb7 /* U+1EB7 LATIN SMALL LETTER A WITH BREVE AND DOT BELOW */ ++#define XKB_KEY_Ebelowdot 0x1001eb8 /* U+1EB8 LATIN CAPITAL LETTER E WITH DOT BELOW */ ++#define XKB_KEY_ebelowdot 0x1001eb9 /* U+1EB9 LATIN SMALL LETTER E WITH DOT BELOW */ ++#define XKB_KEY_Ehook 0x1001eba /* U+1EBA LATIN CAPITAL LETTER E WITH HOOK ABOVE */ ++#define XKB_KEY_ehook 0x1001ebb /* U+1EBB LATIN SMALL LETTER E WITH HOOK ABOVE */ ++#define XKB_KEY_Etilde 0x1001ebc /* U+1EBC LATIN CAPITAL LETTER E WITH TILDE */ ++#define XKB_KEY_etilde 0x1001ebd /* U+1EBD LATIN SMALL LETTER E WITH TILDE */ ++#define XKB_KEY_Ecircumflexacute 0x1001ebe /* U+1EBE LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE */ ++#define XKB_KEY_ecircumflexacute 0x1001ebf /* U+1EBF LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE */ ++#define XKB_KEY_Ecircumflexgrave 0x1001ec0 /* U+1EC0 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE */ ++#define XKB_KEY_ecircumflexgrave 0x1001ec1 /* U+1EC1 LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE */ ++#define XKB_KEY_Ecircumflexhook 0x1001ec2 /* U+1EC2 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE */ ++#define XKB_KEY_ecircumflexhook 0x1001ec3 /* U+1EC3 LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE */ ++#define XKB_KEY_Ecircumflextilde 0x1001ec4 /* U+1EC4 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE */ ++#define XKB_KEY_ecircumflextilde 0x1001ec5 /* U+1EC5 LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE */ ++#define XKB_KEY_Ecircumflexbelowdot 0x1001ec6 /* U+1EC6 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW */ ++#define XKB_KEY_ecircumflexbelowdot 0x1001ec7 /* U+1EC7 LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW */ ++#define XKB_KEY_Ihook 0x1001ec8 /* U+1EC8 LATIN CAPITAL LETTER I WITH HOOK ABOVE */ ++#define XKB_KEY_ihook 0x1001ec9 /* U+1EC9 LATIN SMALL LETTER I WITH HOOK ABOVE */ ++#define XKB_KEY_Ibelowdot 0x1001eca /* U+1ECA LATIN CAPITAL LETTER I WITH DOT BELOW */ ++#define XKB_KEY_ibelowdot 0x1001ecb /* U+1ECB LATIN SMALL LETTER I WITH DOT BELOW */ ++#define XKB_KEY_Obelowdot 0x1001ecc /* U+1ECC LATIN CAPITAL LETTER O WITH DOT BELOW */ ++#define XKB_KEY_obelowdot 0x1001ecd /* U+1ECD LATIN SMALL LETTER O WITH DOT BELOW */ ++#define XKB_KEY_Ohook 0x1001ece /* U+1ECE LATIN CAPITAL LETTER O WITH HOOK ABOVE */ ++#define XKB_KEY_ohook 0x1001ecf /* U+1ECF LATIN SMALL LETTER O WITH HOOK ABOVE */ ++#define XKB_KEY_Ocircumflexacute 0x1001ed0 /* U+1ED0 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE */ ++#define XKB_KEY_ocircumflexacute 0x1001ed1 /* U+1ED1 LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE */ ++#define XKB_KEY_Ocircumflexgrave 0x1001ed2 /* U+1ED2 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE */ ++#define XKB_KEY_ocircumflexgrave 0x1001ed3 /* U+1ED3 LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE */ ++#define XKB_KEY_Ocircumflexhook 0x1001ed4 /* U+1ED4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE */ ++#define XKB_KEY_ocircumflexhook 0x1001ed5 /* U+1ED5 LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE */ ++#define XKB_KEY_Ocircumflextilde 0x1001ed6 /* U+1ED6 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE */ ++#define XKB_KEY_ocircumflextilde 0x1001ed7 /* U+1ED7 LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE */ ++#define XKB_KEY_Ocircumflexbelowdot 0x1001ed8 /* U+1ED8 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW */ ++#define XKB_KEY_ocircumflexbelowdot 0x1001ed9 /* U+1ED9 LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW */ ++#define XKB_KEY_Ohornacute 0x1001eda /* U+1EDA LATIN CAPITAL LETTER O WITH HORN AND ACUTE */ ++#define XKB_KEY_ohornacute 0x1001edb /* U+1EDB LATIN SMALL LETTER O WITH HORN AND ACUTE */ ++#define XKB_KEY_Ohorngrave 0x1001edc /* U+1EDC LATIN CAPITAL LETTER O WITH HORN AND GRAVE */ ++#define XKB_KEY_ohorngrave 0x1001edd /* U+1EDD LATIN SMALL LETTER O WITH HORN AND GRAVE */ ++#define XKB_KEY_Ohornhook 0x1001ede /* U+1EDE LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE */ ++#define XKB_KEY_ohornhook 0x1001edf /* U+1EDF LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE */ ++#define XKB_KEY_Ohorntilde 0x1001ee0 /* U+1EE0 LATIN CAPITAL LETTER O WITH HORN AND TILDE */ ++#define XKB_KEY_ohorntilde 0x1001ee1 /* U+1EE1 LATIN SMALL LETTER O WITH HORN AND TILDE */ ++#define XKB_KEY_Ohornbelowdot 0x1001ee2 /* U+1EE2 LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW */ ++#define XKB_KEY_ohornbelowdot 0x1001ee3 /* U+1EE3 LATIN SMALL LETTER O WITH HORN AND DOT BELOW */ ++#define XKB_KEY_Ubelowdot 0x1001ee4 /* U+1EE4 LATIN CAPITAL LETTER U WITH DOT BELOW */ ++#define XKB_KEY_ubelowdot 0x1001ee5 /* U+1EE5 LATIN SMALL LETTER U WITH DOT BELOW */ ++#define XKB_KEY_Uhook 0x1001ee6 /* U+1EE6 LATIN CAPITAL LETTER U WITH HOOK ABOVE */ ++#define XKB_KEY_uhook 0x1001ee7 /* U+1EE7 LATIN SMALL LETTER U WITH HOOK ABOVE */ ++#define XKB_KEY_Uhornacute 0x1001ee8 /* U+1EE8 LATIN CAPITAL LETTER U WITH HORN AND ACUTE */ ++#define XKB_KEY_uhornacute 0x1001ee9 /* U+1EE9 LATIN SMALL LETTER U WITH HORN AND ACUTE */ ++#define XKB_KEY_Uhorngrave 0x1001eea /* U+1EEA LATIN CAPITAL LETTER U WITH HORN AND GRAVE */ ++#define XKB_KEY_uhorngrave 0x1001eeb /* U+1EEB LATIN SMALL LETTER U WITH HORN AND GRAVE */ ++#define XKB_KEY_Uhornhook 0x1001eec /* U+1EEC LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE */ ++#define XKB_KEY_uhornhook 0x1001eed /* U+1EED LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE */ ++#define XKB_KEY_Uhorntilde 0x1001eee /* U+1EEE LATIN CAPITAL LETTER U WITH HORN AND TILDE */ ++#define XKB_KEY_uhorntilde 0x1001eef /* U+1EEF LATIN SMALL LETTER U WITH HORN AND TILDE */ ++#define XKB_KEY_Uhornbelowdot 0x1001ef0 /* U+1EF0 LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW */ ++#define XKB_KEY_uhornbelowdot 0x1001ef1 /* U+1EF1 LATIN SMALL LETTER U WITH HORN AND DOT BELOW */ ++#define XKB_KEY_Ybelowdot 0x1001ef4 /* U+1EF4 LATIN CAPITAL LETTER Y WITH DOT BELOW */ ++#define XKB_KEY_ybelowdot 0x1001ef5 /* U+1EF5 LATIN SMALL LETTER Y WITH DOT BELOW */ ++#define XKB_KEY_Yhook 0x1001ef6 /* U+1EF6 LATIN CAPITAL LETTER Y WITH HOOK ABOVE */ ++#define XKB_KEY_yhook 0x1001ef7 /* U+1EF7 LATIN SMALL LETTER Y WITH HOOK ABOVE */ ++#define XKB_KEY_Ytilde 0x1001ef8 /* U+1EF8 LATIN CAPITAL LETTER Y WITH TILDE */ ++#define XKB_KEY_ytilde 0x1001ef9 /* U+1EF9 LATIN SMALL LETTER Y WITH TILDE */ ++#define XKB_KEY_Ohorn 0x10001a0 /* U+01A0 LATIN CAPITAL LETTER O WITH HORN */ ++#define XKB_KEY_ohorn 0x10001a1 /* U+01A1 LATIN SMALL LETTER O WITH HORN */ ++#define XKB_KEY_Uhorn 0x10001af /* U+01AF LATIN CAPITAL LETTER U WITH HORN */ ++#define XKB_KEY_uhorn 0x10001b0 /* U+01B0 LATIN SMALL LETTER U WITH HORN */ ++ ++ ++#define XKB_KEY_EcuSign 0x10020a0 /* U+20A0 EURO-CURRENCY SIGN */ ++#define XKB_KEY_ColonSign 0x10020a1 /* U+20A1 COLON SIGN */ ++#define XKB_KEY_CruzeiroSign 0x10020a2 /* U+20A2 CRUZEIRO SIGN */ ++#define XKB_KEY_FFrancSign 0x10020a3 /* U+20A3 FRENCH FRANC SIGN */ ++#define XKB_KEY_LiraSign 0x10020a4 /* U+20A4 LIRA SIGN */ ++#define XKB_KEY_MillSign 0x10020a5 /* U+20A5 MILL SIGN */ ++#define XKB_KEY_NairaSign 0x10020a6 /* U+20A6 NAIRA SIGN */ ++#define XKB_KEY_PesetaSign 0x10020a7 /* U+20A7 PESETA SIGN */ ++#define XKB_KEY_RupeeSign 0x10020a8 /* U+20A8 RUPEE SIGN */ ++#define XKB_KEY_WonSign 0x10020a9 /* U+20A9 WON SIGN */ ++#define XKB_KEY_NewSheqelSign 0x10020aa /* U+20AA NEW SHEQEL SIGN */ ++#define XKB_KEY_DongSign 0x10020ab /* U+20AB DONG SIGN */ ++#define XKB_KEY_EuroSign 0x20ac /* U+20AC EURO SIGN */ ++ ++/* one, two and three are defined above. */ ++#define XKB_KEY_zerosuperior 0x1002070 /* U+2070 SUPERSCRIPT ZERO */ ++#define XKB_KEY_foursuperior 0x1002074 /* U+2074 SUPERSCRIPT FOUR */ ++#define XKB_KEY_fivesuperior 0x1002075 /* U+2075 SUPERSCRIPT FIVE */ ++#define XKB_KEY_sixsuperior 0x1002076 /* U+2076 SUPERSCRIPT SIX */ ++#define XKB_KEY_sevensuperior 0x1002077 /* U+2077 SUPERSCRIPT SEVEN */ ++#define XKB_KEY_eightsuperior 0x1002078 /* U+2078 SUPERSCRIPT EIGHT */ ++#define XKB_KEY_ninesuperior 0x1002079 /* U+2079 SUPERSCRIPT NINE */ ++#define XKB_KEY_zerosubscript 0x1002080 /* U+2080 SUBSCRIPT ZERO */ ++#define XKB_KEY_onesubscript 0x1002081 /* U+2081 SUBSCRIPT ONE */ ++#define XKB_KEY_twosubscript 0x1002082 /* U+2082 SUBSCRIPT TWO */ ++#define XKB_KEY_threesubscript 0x1002083 /* U+2083 SUBSCRIPT THREE */ ++#define XKB_KEY_foursubscript 0x1002084 /* U+2084 SUBSCRIPT FOUR */ ++#define XKB_KEY_fivesubscript 0x1002085 /* U+2085 SUBSCRIPT FIVE */ ++#define XKB_KEY_sixsubscript 0x1002086 /* U+2086 SUBSCRIPT SIX */ ++#define XKB_KEY_sevensubscript 0x1002087 /* U+2087 SUBSCRIPT SEVEN */ ++#define XKB_KEY_eightsubscript 0x1002088 /* U+2088 SUBSCRIPT EIGHT */ ++#define XKB_KEY_ninesubscript 0x1002089 /* U+2089 SUBSCRIPT NINE */ ++#define XKB_KEY_partdifferential 0x1002202 /* U+2202 PARTIAL DIFFERENTIAL */ ++#define XKB_KEY_emptyset 0x1002205 /* U+2205 NULL SET */ ++#define XKB_KEY_elementof 0x1002208 /* U+2208 ELEMENT OF */ ++#define XKB_KEY_notelementof 0x1002209 /* U+2209 NOT AN ELEMENT OF */ ++#define XKB_KEY_containsas 0x100220B /* U+220B CONTAINS AS MEMBER */ ++#define XKB_KEY_squareroot 0x100221A /* U+221A SQUARE ROOT */ ++#define XKB_KEY_cuberoot 0x100221B /* U+221B CUBE ROOT */ ++#define XKB_KEY_fourthroot 0x100221C /* U+221C FOURTH ROOT */ ++#define XKB_KEY_dintegral 0x100222C /* U+222C DOUBLE INTEGRAL */ ++#define XKB_KEY_tintegral 0x100222D /* U+222D TRIPLE INTEGRAL */ ++#define XKB_KEY_because 0x1002235 /* U+2235 BECAUSE */ ++#define XKB_KEY_approxeq 0x1002248 /* U+2245 ALMOST EQUAL TO */ ++#define XKB_KEY_notapproxeq 0x1002247 /* U+2247 NOT ALMOST EQUAL TO */ ++#define XKB_KEY_notidentical 0x1002262 /* U+2262 NOT IDENTICAL TO */ ++#define XKB_KEY_stricteq 0x1002263 /* U+2263 STRICTLY EQUIVALENT TO */ ++ ++#define XKB_KEY_braille_dot_1 0xfff1 ++#define XKB_KEY_braille_dot_2 0xfff2 ++#define XKB_KEY_braille_dot_3 0xfff3 ++#define XKB_KEY_braille_dot_4 0xfff4 ++#define XKB_KEY_braille_dot_5 0xfff5 ++#define XKB_KEY_braille_dot_6 0xfff6 ++#define XKB_KEY_braille_dot_7 0xfff7 ++#define XKB_KEY_braille_dot_8 0xfff8 ++#define XKB_KEY_braille_dot_9 0xfff9 ++#define XKB_KEY_braille_dot_10 0xfffa ++#define XKB_KEY_braille_blank 0x1002800 /* U+2800 BRAILLE PATTERN BLANK */ ++#define XKB_KEY_braille_dots_1 0x1002801 /* U+2801 BRAILLE PATTERN DOTS-1 */ ++#define XKB_KEY_braille_dots_2 0x1002802 /* U+2802 BRAILLE PATTERN DOTS-2 */ ++#define XKB_KEY_braille_dots_12 0x1002803 /* U+2803 BRAILLE PATTERN DOTS-12 */ ++#define XKB_KEY_braille_dots_3 0x1002804 /* U+2804 BRAILLE PATTERN DOTS-3 */ ++#define XKB_KEY_braille_dots_13 0x1002805 /* U+2805 BRAILLE PATTERN DOTS-13 */ ++#define XKB_KEY_braille_dots_23 0x1002806 /* U+2806 BRAILLE PATTERN DOTS-23 */ ++#define XKB_KEY_braille_dots_123 0x1002807 /* U+2807 BRAILLE PATTERN DOTS-123 */ ++#define XKB_KEY_braille_dots_4 0x1002808 /* U+2808 BRAILLE PATTERN DOTS-4 */ ++#define XKB_KEY_braille_dots_14 0x1002809 /* U+2809 BRAILLE PATTERN DOTS-14 */ ++#define XKB_KEY_braille_dots_24 0x100280a /* U+280a BRAILLE PATTERN DOTS-24 */ ++#define XKB_KEY_braille_dots_124 0x100280b /* U+280b BRAILLE PATTERN DOTS-124 */ ++#define XKB_KEY_braille_dots_34 0x100280c /* U+280c BRAILLE PATTERN DOTS-34 */ ++#define XKB_KEY_braille_dots_134 0x100280d /* U+280d BRAILLE PATTERN DOTS-134 */ ++#define XKB_KEY_braille_dots_234 0x100280e /* U+280e BRAILLE PATTERN DOTS-234 */ ++#define XKB_KEY_braille_dots_1234 0x100280f /* U+280f BRAILLE PATTERN DOTS-1234 */ ++#define XKB_KEY_braille_dots_5 0x1002810 /* U+2810 BRAILLE PATTERN DOTS-5 */ ++#define XKB_KEY_braille_dots_15 0x1002811 /* U+2811 BRAILLE PATTERN DOTS-15 */ ++#define XKB_KEY_braille_dots_25 0x1002812 /* U+2812 BRAILLE PATTERN DOTS-25 */ ++#define XKB_KEY_braille_dots_125 0x1002813 /* U+2813 BRAILLE PATTERN DOTS-125 */ ++#define XKB_KEY_braille_dots_35 0x1002814 /* U+2814 BRAILLE PATTERN DOTS-35 */ ++#define XKB_KEY_braille_dots_135 0x1002815 /* U+2815 BRAILLE PATTERN DOTS-135 */ ++#define XKB_KEY_braille_dots_235 0x1002816 /* U+2816 BRAILLE PATTERN DOTS-235 */ ++#define XKB_KEY_braille_dots_1235 0x1002817 /* U+2817 BRAILLE PATTERN DOTS-1235 */ ++#define XKB_KEY_braille_dots_45 0x1002818 /* U+2818 BRAILLE PATTERN DOTS-45 */ ++#define XKB_KEY_braille_dots_145 0x1002819 /* U+2819 BRAILLE PATTERN DOTS-145 */ ++#define XKB_KEY_braille_dots_245 0x100281a /* U+281a BRAILLE PATTERN DOTS-245 */ ++#define XKB_KEY_braille_dots_1245 0x100281b /* U+281b BRAILLE PATTERN DOTS-1245 */ ++#define XKB_KEY_braille_dots_345 0x100281c /* U+281c BRAILLE PATTERN DOTS-345 */ ++#define XKB_KEY_braille_dots_1345 0x100281d /* U+281d BRAILLE PATTERN DOTS-1345 */ ++#define XKB_KEY_braille_dots_2345 0x100281e /* U+281e BRAILLE PATTERN DOTS-2345 */ ++#define XKB_KEY_braille_dots_12345 0x100281f /* U+281f BRAILLE PATTERN DOTS-12345 */ ++#define XKB_KEY_braille_dots_6 0x1002820 /* U+2820 BRAILLE PATTERN DOTS-6 */ ++#define XKB_KEY_braille_dots_16 0x1002821 /* U+2821 BRAILLE PATTERN DOTS-16 */ ++#define XKB_KEY_braille_dots_26 0x1002822 /* U+2822 BRAILLE PATTERN DOTS-26 */ ++#define XKB_KEY_braille_dots_126 0x1002823 /* U+2823 BRAILLE PATTERN DOTS-126 */ ++#define XKB_KEY_braille_dots_36 0x1002824 /* U+2824 BRAILLE PATTERN DOTS-36 */ ++#define XKB_KEY_braille_dots_136 0x1002825 /* U+2825 BRAILLE PATTERN DOTS-136 */ ++#define XKB_KEY_braille_dots_236 0x1002826 /* U+2826 BRAILLE PATTERN DOTS-236 */ ++#define XKB_KEY_braille_dots_1236 0x1002827 /* U+2827 BRAILLE PATTERN DOTS-1236 */ ++#define XKB_KEY_braille_dots_46 0x1002828 /* U+2828 BRAILLE PATTERN DOTS-46 */ ++#define XKB_KEY_braille_dots_146 0x1002829 /* U+2829 BRAILLE PATTERN DOTS-146 */ ++#define XKB_KEY_braille_dots_246 0x100282a /* U+282a BRAILLE PATTERN DOTS-246 */ ++#define XKB_KEY_braille_dots_1246 0x100282b /* U+282b BRAILLE PATTERN DOTS-1246 */ ++#define XKB_KEY_braille_dots_346 0x100282c /* U+282c BRAILLE PATTERN DOTS-346 */ ++#define XKB_KEY_braille_dots_1346 0x100282d /* U+282d BRAILLE PATTERN DOTS-1346 */ ++#define XKB_KEY_braille_dots_2346 0x100282e /* U+282e BRAILLE PATTERN DOTS-2346 */ ++#define XKB_KEY_braille_dots_12346 0x100282f /* U+282f BRAILLE PATTERN DOTS-12346 */ ++#define XKB_KEY_braille_dots_56 0x1002830 /* U+2830 BRAILLE PATTERN DOTS-56 */ ++#define XKB_KEY_braille_dots_156 0x1002831 /* U+2831 BRAILLE PATTERN DOTS-156 */ ++#define XKB_KEY_braille_dots_256 0x1002832 /* U+2832 BRAILLE PATTERN DOTS-256 */ ++#define XKB_KEY_braille_dots_1256 0x1002833 /* U+2833 BRAILLE PATTERN DOTS-1256 */ ++#define XKB_KEY_braille_dots_356 0x1002834 /* U+2834 BRAILLE PATTERN DOTS-356 */ ++#define XKB_KEY_braille_dots_1356 0x1002835 /* U+2835 BRAILLE PATTERN DOTS-1356 */ ++#define XKB_KEY_braille_dots_2356 0x1002836 /* U+2836 BRAILLE PATTERN DOTS-2356 */ ++#define XKB_KEY_braille_dots_12356 0x1002837 /* U+2837 BRAILLE PATTERN DOTS-12356 */ ++#define XKB_KEY_braille_dots_456 0x1002838 /* U+2838 BRAILLE PATTERN DOTS-456 */ ++#define XKB_KEY_braille_dots_1456 0x1002839 /* U+2839 BRAILLE PATTERN DOTS-1456 */ ++#define XKB_KEY_braille_dots_2456 0x100283a /* U+283a BRAILLE PATTERN DOTS-2456 */ ++#define XKB_KEY_braille_dots_12456 0x100283b /* U+283b BRAILLE PATTERN DOTS-12456 */ ++#define XKB_KEY_braille_dots_3456 0x100283c /* U+283c BRAILLE PATTERN DOTS-3456 */ ++#define XKB_KEY_braille_dots_13456 0x100283d /* U+283d BRAILLE PATTERN DOTS-13456 */ ++#define XKB_KEY_braille_dots_23456 0x100283e /* U+283e BRAILLE PATTERN DOTS-23456 */ ++#define XKB_KEY_braille_dots_123456 0x100283f /* U+283f BRAILLE PATTERN DOTS-123456 */ ++#define XKB_KEY_braille_dots_7 0x1002840 /* U+2840 BRAILLE PATTERN DOTS-7 */ ++#define XKB_KEY_braille_dots_17 0x1002841 /* U+2841 BRAILLE PATTERN DOTS-17 */ ++#define XKB_KEY_braille_dots_27 0x1002842 /* U+2842 BRAILLE PATTERN DOTS-27 */ ++#define XKB_KEY_braille_dots_127 0x1002843 /* U+2843 BRAILLE PATTERN DOTS-127 */ ++#define XKB_KEY_braille_dots_37 0x1002844 /* U+2844 BRAILLE PATTERN DOTS-37 */ ++#define XKB_KEY_braille_dots_137 0x1002845 /* U+2845 BRAILLE PATTERN DOTS-137 */ ++#define XKB_KEY_braille_dots_237 0x1002846 /* U+2846 BRAILLE PATTERN DOTS-237 */ ++#define XKB_KEY_braille_dots_1237 0x1002847 /* U+2847 BRAILLE PATTERN DOTS-1237 */ ++#define XKB_KEY_braille_dots_47 0x1002848 /* U+2848 BRAILLE PATTERN DOTS-47 */ ++#define XKB_KEY_braille_dots_147 0x1002849 /* U+2849 BRAILLE PATTERN DOTS-147 */ ++#define XKB_KEY_braille_dots_247 0x100284a /* U+284a BRAILLE PATTERN DOTS-247 */ ++#define XKB_KEY_braille_dots_1247 0x100284b /* U+284b BRAILLE PATTERN DOTS-1247 */ ++#define XKB_KEY_braille_dots_347 0x100284c /* U+284c BRAILLE PATTERN DOTS-347 */ ++#define XKB_KEY_braille_dots_1347 0x100284d /* U+284d BRAILLE PATTERN DOTS-1347 */ ++#define XKB_KEY_braille_dots_2347 0x100284e /* U+284e BRAILLE PATTERN DOTS-2347 */ ++#define XKB_KEY_braille_dots_12347 0x100284f /* U+284f BRAILLE PATTERN DOTS-12347 */ ++#define XKB_KEY_braille_dots_57 0x1002850 /* U+2850 BRAILLE PATTERN DOTS-57 */ ++#define XKB_KEY_braille_dots_157 0x1002851 /* U+2851 BRAILLE PATTERN DOTS-157 */ ++#define XKB_KEY_braille_dots_257 0x1002852 /* U+2852 BRAILLE PATTERN DOTS-257 */ ++#define XKB_KEY_braille_dots_1257 0x1002853 /* U+2853 BRAILLE PATTERN DOTS-1257 */ ++#define XKB_KEY_braille_dots_357 0x1002854 /* U+2854 BRAILLE PATTERN DOTS-357 */ ++#define XKB_KEY_braille_dots_1357 0x1002855 /* U+2855 BRAILLE PATTERN DOTS-1357 */ ++#define XKB_KEY_braille_dots_2357 0x1002856 /* U+2856 BRAILLE PATTERN DOTS-2357 */ ++#define XKB_KEY_braille_dots_12357 0x1002857 /* U+2857 BRAILLE PATTERN DOTS-12357 */ ++#define XKB_KEY_braille_dots_457 0x1002858 /* U+2858 BRAILLE PATTERN DOTS-457 */ ++#define XKB_KEY_braille_dots_1457 0x1002859 /* U+2859 BRAILLE PATTERN DOTS-1457 */ ++#define XKB_KEY_braille_dots_2457 0x100285a /* U+285a BRAILLE PATTERN DOTS-2457 */ ++#define XKB_KEY_braille_dots_12457 0x100285b /* U+285b BRAILLE PATTERN DOTS-12457 */ ++#define XKB_KEY_braille_dots_3457 0x100285c /* U+285c BRAILLE PATTERN DOTS-3457 */ ++#define XKB_KEY_braille_dots_13457 0x100285d /* U+285d BRAILLE PATTERN DOTS-13457 */ ++#define XKB_KEY_braille_dots_23457 0x100285e /* U+285e BRAILLE PATTERN DOTS-23457 */ ++#define XKB_KEY_braille_dots_123457 0x100285f /* U+285f BRAILLE PATTERN DOTS-123457 */ ++#define XKB_KEY_braille_dots_67 0x1002860 /* U+2860 BRAILLE PATTERN DOTS-67 */ ++#define XKB_KEY_braille_dots_167 0x1002861 /* U+2861 BRAILLE PATTERN DOTS-167 */ ++#define XKB_KEY_braille_dots_267 0x1002862 /* U+2862 BRAILLE PATTERN DOTS-267 */ ++#define XKB_KEY_braille_dots_1267 0x1002863 /* U+2863 BRAILLE PATTERN DOTS-1267 */ ++#define XKB_KEY_braille_dots_367 0x1002864 /* U+2864 BRAILLE PATTERN DOTS-367 */ ++#define XKB_KEY_braille_dots_1367 0x1002865 /* U+2865 BRAILLE PATTERN DOTS-1367 */ ++#define XKB_KEY_braille_dots_2367 0x1002866 /* U+2866 BRAILLE PATTERN DOTS-2367 */ ++#define XKB_KEY_braille_dots_12367 0x1002867 /* U+2867 BRAILLE PATTERN DOTS-12367 */ ++#define XKB_KEY_braille_dots_467 0x1002868 /* U+2868 BRAILLE PATTERN DOTS-467 */ ++#define XKB_KEY_braille_dots_1467 0x1002869 /* U+2869 BRAILLE PATTERN DOTS-1467 */ ++#define XKB_KEY_braille_dots_2467 0x100286a /* U+286a BRAILLE PATTERN DOTS-2467 */ ++#define XKB_KEY_braille_dots_12467 0x100286b /* U+286b BRAILLE PATTERN DOTS-12467 */ ++#define XKB_KEY_braille_dots_3467 0x100286c /* U+286c BRAILLE PATTERN DOTS-3467 */ ++#define XKB_KEY_braille_dots_13467 0x100286d /* U+286d BRAILLE PATTERN DOTS-13467 */ ++#define XKB_KEY_braille_dots_23467 0x100286e /* U+286e BRAILLE PATTERN DOTS-23467 */ ++#define XKB_KEY_braille_dots_123467 0x100286f /* U+286f BRAILLE PATTERN DOTS-123467 */ ++#define XKB_KEY_braille_dots_567 0x1002870 /* U+2870 BRAILLE PATTERN DOTS-567 */ ++#define XKB_KEY_braille_dots_1567 0x1002871 /* U+2871 BRAILLE PATTERN DOTS-1567 */ ++#define XKB_KEY_braille_dots_2567 0x1002872 /* U+2872 BRAILLE PATTERN DOTS-2567 */ ++#define XKB_KEY_braille_dots_12567 0x1002873 /* U+2873 BRAILLE PATTERN DOTS-12567 */ ++#define XKB_KEY_braille_dots_3567 0x1002874 /* U+2874 BRAILLE PATTERN DOTS-3567 */ ++#define XKB_KEY_braille_dots_13567 0x1002875 /* U+2875 BRAILLE PATTERN DOTS-13567 */ ++#define XKB_KEY_braille_dots_23567 0x1002876 /* U+2876 BRAILLE PATTERN DOTS-23567 */ ++#define XKB_KEY_braille_dots_123567 0x1002877 /* U+2877 BRAILLE PATTERN DOTS-123567 */ ++#define XKB_KEY_braille_dots_4567 0x1002878 /* U+2878 BRAILLE PATTERN DOTS-4567 */ ++#define XKB_KEY_braille_dots_14567 0x1002879 /* U+2879 BRAILLE PATTERN DOTS-14567 */ ++#define XKB_KEY_braille_dots_24567 0x100287a /* U+287a BRAILLE PATTERN DOTS-24567 */ ++#define XKB_KEY_braille_dots_124567 0x100287b /* U+287b BRAILLE PATTERN DOTS-124567 */ ++#define XKB_KEY_braille_dots_34567 0x100287c /* U+287c BRAILLE PATTERN DOTS-34567 */ ++#define XKB_KEY_braille_dots_134567 0x100287d /* U+287d BRAILLE PATTERN DOTS-134567 */ ++#define XKB_KEY_braille_dots_234567 0x100287e /* U+287e BRAILLE PATTERN DOTS-234567 */ ++#define XKB_KEY_braille_dots_1234567 0x100287f /* U+287f BRAILLE PATTERN DOTS-1234567 */ ++#define XKB_KEY_braille_dots_8 0x1002880 /* U+2880 BRAILLE PATTERN DOTS-8 */ ++#define XKB_KEY_braille_dots_18 0x1002881 /* U+2881 BRAILLE PATTERN DOTS-18 */ ++#define XKB_KEY_braille_dots_28 0x1002882 /* U+2882 BRAILLE PATTERN DOTS-28 */ ++#define XKB_KEY_braille_dots_128 0x1002883 /* U+2883 BRAILLE PATTERN DOTS-128 */ ++#define XKB_KEY_braille_dots_38 0x1002884 /* U+2884 BRAILLE PATTERN DOTS-38 */ ++#define XKB_KEY_braille_dots_138 0x1002885 /* U+2885 BRAILLE PATTERN DOTS-138 */ ++#define XKB_KEY_braille_dots_238 0x1002886 /* U+2886 BRAILLE PATTERN DOTS-238 */ ++#define XKB_KEY_braille_dots_1238 0x1002887 /* U+2887 BRAILLE PATTERN DOTS-1238 */ ++#define XKB_KEY_braille_dots_48 0x1002888 /* U+2888 BRAILLE PATTERN DOTS-48 */ ++#define XKB_KEY_braille_dots_148 0x1002889 /* U+2889 BRAILLE PATTERN DOTS-148 */ ++#define XKB_KEY_braille_dots_248 0x100288a /* U+288a BRAILLE PATTERN DOTS-248 */ ++#define XKB_KEY_braille_dots_1248 0x100288b /* U+288b BRAILLE PATTERN DOTS-1248 */ ++#define XKB_KEY_braille_dots_348 0x100288c /* U+288c BRAILLE PATTERN DOTS-348 */ ++#define XKB_KEY_braille_dots_1348 0x100288d /* U+288d BRAILLE PATTERN DOTS-1348 */ ++#define XKB_KEY_braille_dots_2348 0x100288e /* U+288e BRAILLE PATTERN DOTS-2348 */ ++#define XKB_KEY_braille_dots_12348 0x100288f /* U+288f BRAILLE PATTERN DOTS-12348 */ ++#define XKB_KEY_braille_dots_58 0x1002890 /* U+2890 BRAILLE PATTERN DOTS-58 */ ++#define XKB_KEY_braille_dots_158 0x1002891 /* U+2891 BRAILLE PATTERN DOTS-158 */ ++#define XKB_KEY_braille_dots_258 0x1002892 /* U+2892 BRAILLE PATTERN DOTS-258 */ ++#define XKB_KEY_braille_dots_1258 0x1002893 /* U+2893 BRAILLE PATTERN DOTS-1258 */ ++#define XKB_KEY_braille_dots_358 0x1002894 /* U+2894 BRAILLE PATTERN DOTS-358 */ ++#define XKB_KEY_braille_dots_1358 0x1002895 /* U+2895 BRAILLE PATTERN DOTS-1358 */ ++#define XKB_KEY_braille_dots_2358 0x1002896 /* U+2896 BRAILLE PATTERN DOTS-2358 */ ++#define XKB_KEY_braille_dots_12358 0x1002897 /* U+2897 BRAILLE PATTERN DOTS-12358 */ ++#define XKB_KEY_braille_dots_458 0x1002898 /* U+2898 BRAILLE PATTERN DOTS-458 */ ++#define XKB_KEY_braille_dots_1458 0x1002899 /* U+2899 BRAILLE PATTERN DOTS-1458 */ ++#define XKB_KEY_braille_dots_2458 0x100289a /* U+289a BRAILLE PATTERN DOTS-2458 */ ++#define XKB_KEY_braille_dots_12458 0x100289b /* U+289b BRAILLE PATTERN DOTS-12458 */ ++#define XKB_KEY_braille_dots_3458 0x100289c /* U+289c BRAILLE PATTERN DOTS-3458 */ ++#define XKB_KEY_braille_dots_13458 0x100289d /* U+289d BRAILLE PATTERN DOTS-13458 */ ++#define XKB_KEY_braille_dots_23458 0x100289e /* U+289e BRAILLE PATTERN DOTS-23458 */ ++#define XKB_KEY_braille_dots_123458 0x100289f /* U+289f BRAILLE PATTERN DOTS-123458 */ ++#define XKB_KEY_braille_dots_68 0x10028a0 /* U+28a0 BRAILLE PATTERN DOTS-68 */ ++#define XKB_KEY_braille_dots_168 0x10028a1 /* U+28a1 BRAILLE PATTERN DOTS-168 */ ++#define XKB_KEY_braille_dots_268 0x10028a2 /* U+28a2 BRAILLE PATTERN DOTS-268 */ ++#define XKB_KEY_braille_dots_1268 0x10028a3 /* U+28a3 BRAILLE PATTERN DOTS-1268 */ ++#define XKB_KEY_braille_dots_368 0x10028a4 /* U+28a4 BRAILLE PATTERN DOTS-368 */ ++#define XKB_KEY_braille_dots_1368 0x10028a5 /* U+28a5 BRAILLE PATTERN DOTS-1368 */ ++#define XKB_KEY_braille_dots_2368 0x10028a6 /* U+28a6 BRAILLE PATTERN DOTS-2368 */ ++#define XKB_KEY_braille_dots_12368 0x10028a7 /* U+28a7 BRAILLE PATTERN DOTS-12368 */ ++#define XKB_KEY_braille_dots_468 0x10028a8 /* U+28a8 BRAILLE PATTERN DOTS-468 */ ++#define XKB_KEY_braille_dots_1468 0x10028a9 /* U+28a9 BRAILLE PATTERN DOTS-1468 */ ++#define XKB_KEY_braille_dots_2468 0x10028aa /* U+28aa BRAILLE PATTERN DOTS-2468 */ ++#define XKB_KEY_braille_dots_12468 0x10028ab /* U+28ab BRAILLE PATTERN DOTS-12468 */ ++#define XKB_KEY_braille_dots_3468 0x10028ac /* U+28ac BRAILLE PATTERN DOTS-3468 */ ++#define XKB_KEY_braille_dots_13468 0x10028ad /* U+28ad BRAILLE PATTERN DOTS-13468 */ ++#define XKB_KEY_braille_dots_23468 0x10028ae /* U+28ae BRAILLE PATTERN DOTS-23468 */ ++#define XKB_KEY_braille_dots_123468 0x10028af /* U+28af BRAILLE PATTERN DOTS-123468 */ ++#define XKB_KEY_braille_dots_568 0x10028b0 /* U+28b0 BRAILLE PATTERN DOTS-568 */ ++#define XKB_KEY_braille_dots_1568 0x10028b1 /* U+28b1 BRAILLE PATTERN DOTS-1568 */ ++#define XKB_KEY_braille_dots_2568 0x10028b2 /* U+28b2 BRAILLE PATTERN DOTS-2568 */ ++#define XKB_KEY_braille_dots_12568 0x10028b3 /* U+28b3 BRAILLE PATTERN DOTS-12568 */ ++#define XKB_KEY_braille_dots_3568 0x10028b4 /* U+28b4 BRAILLE PATTERN DOTS-3568 */ ++#define XKB_KEY_braille_dots_13568 0x10028b5 /* U+28b5 BRAILLE PATTERN DOTS-13568 */ ++#define XKB_KEY_braille_dots_23568 0x10028b6 /* U+28b6 BRAILLE PATTERN DOTS-23568 */ ++#define XKB_KEY_braille_dots_123568 0x10028b7 /* U+28b7 BRAILLE PATTERN DOTS-123568 */ ++#define XKB_KEY_braille_dots_4568 0x10028b8 /* U+28b8 BRAILLE PATTERN DOTS-4568 */ ++#define XKB_KEY_braille_dots_14568 0x10028b9 /* U+28b9 BRAILLE PATTERN DOTS-14568 */ ++#define XKB_KEY_braille_dots_24568 0x10028ba /* U+28ba BRAILLE PATTERN DOTS-24568 */ ++#define XKB_KEY_braille_dots_124568 0x10028bb /* U+28bb BRAILLE PATTERN DOTS-124568 */ ++#define XKB_KEY_braille_dots_34568 0x10028bc /* U+28bc BRAILLE PATTERN DOTS-34568 */ ++#define XKB_KEY_braille_dots_134568 0x10028bd /* U+28bd BRAILLE PATTERN DOTS-134568 */ ++#define XKB_KEY_braille_dots_234568 0x10028be /* U+28be BRAILLE PATTERN DOTS-234568 */ ++#define XKB_KEY_braille_dots_1234568 0x10028bf /* U+28bf BRAILLE PATTERN DOTS-1234568 */ ++#define XKB_KEY_braille_dots_78 0x10028c0 /* U+28c0 BRAILLE PATTERN DOTS-78 */ ++#define XKB_KEY_braille_dots_178 0x10028c1 /* U+28c1 BRAILLE PATTERN DOTS-178 */ ++#define XKB_KEY_braille_dots_278 0x10028c2 /* U+28c2 BRAILLE PATTERN DOTS-278 */ ++#define XKB_KEY_braille_dots_1278 0x10028c3 /* U+28c3 BRAILLE PATTERN DOTS-1278 */ ++#define XKB_KEY_braille_dots_378 0x10028c4 /* U+28c4 BRAILLE PATTERN DOTS-378 */ ++#define XKB_KEY_braille_dots_1378 0x10028c5 /* U+28c5 BRAILLE PATTERN DOTS-1378 */ ++#define XKB_KEY_braille_dots_2378 0x10028c6 /* U+28c6 BRAILLE PATTERN DOTS-2378 */ ++#define XKB_KEY_braille_dots_12378 0x10028c7 /* U+28c7 BRAILLE PATTERN DOTS-12378 */ ++#define XKB_KEY_braille_dots_478 0x10028c8 /* U+28c8 BRAILLE PATTERN DOTS-478 */ ++#define XKB_KEY_braille_dots_1478 0x10028c9 /* U+28c9 BRAILLE PATTERN DOTS-1478 */ ++#define XKB_KEY_braille_dots_2478 0x10028ca /* U+28ca BRAILLE PATTERN DOTS-2478 */ ++#define XKB_KEY_braille_dots_12478 0x10028cb /* U+28cb BRAILLE PATTERN DOTS-12478 */ ++#define XKB_KEY_braille_dots_3478 0x10028cc /* U+28cc BRAILLE PATTERN DOTS-3478 */ ++#define XKB_KEY_braille_dots_13478 0x10028cd /* U+28cd BRAILLE PATTERN DOTS-13478 */ ++#define XKB_KEY_braille_dots_23478 0x10028ce /* U+28ce BRAILLE PATTERN DOTS-23478 */ ++#define XKB_KEY_braille_dots_123478 0x10028cf /* U+28cf BRAILLE PATTERN DOTS-123478 */ ++#define XKB_KEY_braille_dots_578 0x10028d0 /* U+28d0 BRAILLE PATTERN DOTS-578 */ ++#define XKB_KEY_braille_dots_1578 0x10028d1 /* U+28d1 BRAILLE PATTERN DOTS-1578 */ ++#define XKB_KEY_braille_dots_2578 0x10028d2 /* U+28d2 BRAILLE PATTERN DOTS-2578 */ ++#define XKB_KEY_braille_dots_12578 0x10028d3 /* U+28d3 BRAILLE PATTERN DOTS-12578 */ ++#define XKB_KEY_braille_dots_3578 0x10028d4 /* U+28d4 BRAILLE PATTERN DOTS-3578 */ ++#define XKB_KEY_braille_dots_13578 0x10028d5 /* U+28d5 BRAILLE PATTERN DOTS-13578 */ ++#define XKB_KEY_braille_dots_23578 0x10028d6 /* U+28d6 BRAILLE PATTERN DOTS-23578 */ ++#define XKB_KEY_braille_dots_123578 0x10028d7 /* U+28d7 BRAILLE PATTERN DOTS-123578 */ ++#define XKB_KEY_braille_dots_4578 0x10028d8 /* U+28d8 BRAILLE PATTERN DOTS-4578 */ ++#define XKB_KEY_braille_dots_14578 0x10028d9 /* U+28d9 BRAILLE PATTERN DOTS-14578 */ ++#define XKB_KEY_braille_dots_24578 0x10028da /* U+28da BRAILLE PATTERN DOTS-24578 */ ++#define XKB_KEY_braille_dots_124578 0x10028db /* U+28db BRAILLE PATTERN DOTS-124578 */ ++#define XKB_KEY_braille_dots_34578 0x10028dc /* U+28dc BRAILLE PATTERN DOTS-34578 */ ++#define XKB_KEY_braille_dots_134578 0x10028dd /* U+28dd BRAILLE PATTERN DOTS-134578 */ ++#define XKB_KEY_braille_dots_234578 0x10028de /* U+28de BRAILLE PATTERN DOTS-234578 */ ++#define XKB_KEY_braille_dots_1234578 0x10028df /* U+28df BRAILLE PATTERN DOTS-1234578 */ ++#define XKB_KEY_braille_dots_678 0x10028e0 /* U+28e0 BRAILLE PATTERN DOTS-678 */ ++#define XKB_KEY_braille_dots_1678 0x10028e1 /* U+28e1 BRAILLE PATTERN DOTS-1678 */ ++#define XKB_KEY_braille_dots_2678 0x10028e2 /* U+28e2 BRAILLE PATTERN DOTS-2678 */ ++#define XKB_KEY_braille_dots_12678 0x10028e3 /* U+28e3 BRAILLE PATTERN DOTS-12678 */ ++#define XKB_KEY_braille_dots_3678 0x10028e4 /* U+28e4 BRAILLE PATTERN DOTS-3678 */ ++#define XKB_KEY_braille_dots_13678 0x10028e5 /* U+28e5 BRAILLE PATTERN DOTS-13678 */ ++#define XKB_KEY_braille_dots_23678 0x10028e6 /* U+28e6 BRAILLE PATTERN DOTS-23678 */ ++#define XKB_KEY_braille_dots_123678 0x10028e7 /* U+28e7 BRAILLE PATTERN DOTS-123678 */ ++#define XKB_KEY_braille_dots_4678 0x10028e8 /* U+28e8 BRAILLE PATTERN DOTS-4678 */ ++#define XKB_KEY_braille_dots_14678 0x10028e9 /* U+28e9 BRAILLE PATTERN DOTS-14678 */ ++#define XKB_KEY_braille_dots_24678 0x10028ea /* U+28ea BRAILLE PATTERN DOTS-24678 */ ++#define XKB_KEY_braille_dots_124678 0x10028eb /* U+28eb BRAILLE PATTERN DOTS-124678 */ ++#define XKB_KEY_braille_dots_34678 0x10028ec /* U+28ec BRAILLE PATTERN DOTS-34678 */ ++#define XKB_KEY_braille_dots_134678 0x10028ed /* U+28ed BRAILLE PATTERN DOTS-134678 */ ++#define XKB_KEY_braille_dots_234678 0x10028ee /* U+28ee BRAILLE PATTERN DOTS-234678 */ ++#define XKB_KEY_braille_dots_1234678 0x10028ef /* U+28ef BRAILLE PATTERN DOTS-1234678 */ ++#define XKB_KEY_braille_dots_5678 0x10028f0 /* U+28f0 BRAILLE PATTERN DOTS-5678 */ ++#define XKB_KEY_braille_dots_15678 0x10028f1 /* U+28f1 BRAILLE PATTERN DOTS-15678 */ ++#define XKB_KEY_braille_dots_25678 0x10028f2 /* U+28f2 BRAILLE PATTERN DOTS-25678 */ ++#define XKB_KEY_braille_dots_125678 0x10028f3 /* U+28f3 BRAILLE PATTERN DOTS-125678 */ ++#define XKB_KEY_braille_dots_35678 0x10028f4 /* U+28f4 BRAILLE PATTERN DOTS-35678 */ ++#define XKB_KEY_braille_dots_135678 0x10028f5 /* U+28f5 BRAILLE PATTERN DOTS-135678 */ ++#define XKB_KEY_braille_dots_235678 0x10028f6 /* U+28f6 BRAILLE PATTERN DOTS-235678 */ ++#define XKB_KEY_braille_dots_1235678 0x10028f7 /* U+28f7 BRAILLE PATTERN DOTS-1235678 */ ++#define XKB_KEY_braille_dots_45678 0x10028f8 /* U+28f8 BRAILLE PATTERN DOTS-45678 */ ++#define XKB_KEY_braille_dots_145678 0x10028f9 /* U+28f9 BRAILLE PATTERN DOTS-145678 */ ++#define XKB_KEY_braille_dots_245678 0x10028fa /* U+28fa BRAILLE PATTERN DOTS-245678 */ ++#define XKB_KEY_braille_dots_1245678 0x10028fb /* U+28fb BRAILLE PATTERN DOTS-1245678 */ ++#define XKB_KEY_braille_dots_345678 0x10028fc /* U+28fc BRAILLE PATTERN DOTS-345678 */ ++#define XKB_KEY_braille_dots_1345678 0x10028fd /* U+28fd BRAILLE PATTERN DOTS-1345678 */ ++#define XKB_KEY_braille_dots_2345678 0x10028fe /* U+28fe BRAILLE PATTERN DOTS-2345678 */ ++#define XKB_KEY_braille_dots_12345678 0x10028ff /* U+28ff BRAILLE PATTERN DOTS-12345678 */ ++ ++/* ++ * Sinhala (http://unicode.org/charts/PDF/U0D80.pdf) ++ * http://www.nongnu.org/sinhala/doc/transliteration/sinhala-transliteration_6.html ++ */ ++ ++#define XKB_KEY_Sinh_ng 0x1000d82 /* U+0D82 SINHALA ANUSVARAYA */ ++#define XKB_KEY_Sinh_h2 0x1000d83 /* U+0D83 SINHALA VISARGAYA */ ++#define XKB_KEY_Sinh_a 0x1000d85 /* U+0D85 SINHALA AYANNA */ ++#define XKB_KEY_Sinh_aa 0x1000d86 /* U+0D86 SINHALA AAYANNA */ ++#define XKB_KEY_Sinh_ae 0x1000d87 /* U+0D87 SINHALA AEYANNA */ ++#define XKB_KEY_Sinh_aee 0x1000d88 /* U+0D88 SINHALA AEEYANNA */ ++#define XKB_KEY_Sinh_i 0x1000d89 /* U+0D89 SINHALA IYANNA */ ++#define XKB_KEY_Sinh_ii 0x1000d8a /* U+0D8A SINHALA IIYANNA */ ++#define XKB_KEY_Sinh_u 0x1000d8b /* U+0D8B SINHALA UYANNA */ ++#define XKB_KEY_Sinh_uu 0x1000d8c /* U+0D8C SINHALA UUYANNA */ ++#define XKB_KEY_Sinh_ri 0x1000d8d /* U+0D8D SINHALA IRUYANNA */ ++#define XKB_KEY_Sinh_rii 0x1000d8e /* U+0D8E SINHALA IRUUYANNA */ ++#define XKB_KEY_Sinh_lu 0x1000d8f /* U+0D8F SINHALA ILUYANNA */ ++#define XKB_KEY_Sinh_luu 0x1000d90 /* U+0D90 SINHALA ILUUYANNA */ ++#define XKB_KEY_Sinh_e 0x1000d91 /* U+0D91 SINHALA EYANNA */ ++#define XKB_KEY_Sinh_ee 0x1000d92 /* U+0D92 SINHALA EEYANNA */ ++#define XKB_KEY_Sinh_ai 0x1000d93 /* U+0D93 SINHALA AIYANNA */ ++#define XKB_KEY_Sinh_o 0x1000d94 /* U+0D94 SINHALA OYANNA */ ++#define XKB_KEY_Sinh_oo 0x1000d95 /* U+0D95 SINHALA OOYANNA */ ++#define XKB_KEY_Sinh_au 0x1000d96 /* U+0D96 SINHALA AUYANNA */ ++#define XKB_KEY_Sinh_ka 0x1000d9a /* U+0D9A SINHALA KAYANNA */ ++#define XKB_KEY_Sinh_kha 0x1000d9b /* U+0D9B SINHALA MAHA. KAYANNA */ ++#define XKB_KEY_Sinh_ga 0x1000d9c /* U+0D9C SINHALA GAYANNA */ ++#define XKB_KEY_Sinh_gha 0x1000d9d /* U+0D9D SINHALA MAHA. GAYANNA */ ++#define XKB_KEY_Sinh_ng2 0x1000d9e /* U+0D9E SINHALA KANTAJA NAASIKYAYA */ ++#define XKB_KEY_Sinh_nga 0x1000d9f /* U+0D9F SINHALA SANYAKA GAYANNA */ ++#define XKB_KEY_Sinh_ca 0x1000da0 /* U+0DA0 SINHALA CAYANNA */ ++#define XKB_KEY_Sinh_cha 0x1000da1 /* U+0DA1 SINHALA MAHA. CAYANNA */ ++#define XKB_KEY_Sinh_ja 0x1000da2 /* U+0DA2 SINHALA JAYANNA */ ++#define XKB_KEY_Sinh_jha 0x1000da3 /* U+0DA3 SINHALA MAHA. JAYANNA */ ++#define XKB_KEY_Sinh_nya 0x1000da4 /* U+0DA4 SINHALA TAALUJA NAASIKYAYA */ ++#define XKB_KEY_Sinh_jnya 0x1000da5 /* U+0DA5 SINHALA TAALUJA SANYOOGA NAASIKYAYA */ ++#define XKB_KEY_Sinh_nja 0x1000da6 /* U+0DA6 SINHALA SANYAKA JAYANNA */ ++#define XKB_KEY_Sinh_tta 0x1000da7 /* U+0DA7 SINHALA TTAYANNA */ ++#define XKB_KEY_Sinh_ttha 0x1000da8 /* U+0DA8 SINHALA MAHA. TTAYANNA */ ++#define XKB_KEY_Sinh_dda 0x1000da9 /* U+0DA9 SINHALA DDAYANNA */ ++#define XKB_KEY_Sinh_ddha 0x1000daa /* U+0DAA SINHALA MAHA. DDAYANNA */ ++#define XKB_KEY_Sinh_nna 0x1000dab /* U+0DAB SINHALA MUURDHAJA NAYANNA */ ++#define XKB_KEY_Sinh_ndda 0x1000dac /* U+0DAC SINHALA SANYAKA DDAYANNA */ ++#define XKB_KEY_Sinh_tha 0x1000dad /* U+0DAD SINHALA TAYANNA */ ++#define XKB_KEY_Sinh_thha 0x1000dae /* U+0DAE SINHALA MAHA. TAYANNA */ ++#define XKB_KEY_Sinh_dha 0x1000daf /* U+0DAF SINHALA DAYANNA */ ++#define XKB_KEY_Sinh_dhha 0x1000db0 /* U+0DB0 SINHALA MAHA. DAYANNA */ ++#define XKB_KEY_Sinh_na 0x1000db1 /* U+0DB1 SINHALA DANTAJA NAYANNA */ ++#define XKB_KEY_Sinh_ndha 0x1000db3 /* U+0DB3 SINHALA SANYAKA DAYANNA */ ++#define XKB_KEY_Sinh_pa 0x1000db4 /* U+0DB4 SINHALA PAYANNA */ ++#define XKB_KEY_Sinh_pha 0x1000db5 /* U+0DB5 SINHALA MAHA. PAYANNA */ ++#define XKB_KEY_Sinh_ba 0x1000db6 /* U+0DB6 SINHALA BAYANNA */ ++#define XKB_KEY_Sinh_bha 0x1000db7 /* U+0DB7 SINHALA MAHA. BAYANNA */ ++#define XKB_KEY_Sinh_ma 0x1000db8 /* U+0DB8 SINHALA MAYANNA */ ++#define XKB_KEY_Sinh_mba 0x1000db9 /* U+0DB9 SINHALA AMBA BAYANNA */ ++#define XKB_KEY_Sinh_ya 0x1000dba /* U+0DBA SINHALA YAYANNA */ ++#define XKB_KEY_Sinh_ra 0x1000dbb /* U+0DBB SINHALA RAYANNA */ ++#define XKB_KEY_Sinh_la 0x1000dbd /* U+0DBD SINHALA DANTAJA LAYANNA */ ++#define XKB_KEY_Sinh_va 0x1000dc0 /* U+0DC0 SINHALA VAYANNA */ ++#define XKB_KEY_Sinh_sha 0x1000dc1 /* U+0DC1 SINHALA TAALUJA SAYANNA */ ++#define XKB_KEY_Sinh_ssha 0x1000dc2 /* U+0DC2 SINHALA MUURDHAJA SAYANNA */ ++#define XKB_KEY_Sinh_sa 0x1000dc3 /* U+0DC3 SINHALA DANTAJA SAYANNA */ ++#define XKB_KEY_Sinh_ha 0x1000dc4 /* U+0DC4 SINHALA HAYANNA */ ++#define XKB_KEY_Sinh_lla 0x1000dc5 /* U+0DC5 SINHALA MUURDHAJA LAYANNA */ ++#define XKB_KEY_Sinh_fa 0x1000dc6 /* U+0DC6 SINHALA FAYANNA */ ++#define XKB_KEY_Sinh_al 0x1000dca /* U+0DCA SINHALA AL-LAKUNA */ ++#define XKB_KEY_Sinh_aa2 0x1000dcf /* U+0DCF SINHALA AELA-PILLA */ ++#define XKB_KEY_Sinh_ae2 0x1000dd0 /* U+0DD0 SINHALA AEDA-PILLA */ ++#define XKB_KEY_Sinh_aee2 0x1000dd1 /* U+0DD1 SINHALA DIGA AEDA-PILLA */ ++#define XKB_KEY_Sinh_i2 0x1000dd2 /* U+0DD2 SINHALA IS-PILLA */ ++#define XKB_KEY_Sinh_ii2 0x1000dd3 /* U+0DD3 SINHALA DIGA IS-PILLA */ ++#define XKB_KEY_Sinh_u2 0x1000dd4 /* U+0DD4 SINHALA PAA-PILLA */ ++#define XKB_KEY_Sinh_uu2 0x1000dd6 /* U+0DD6 SINHALA DIGA PAA-PILLA */ ++#define XKB_KEY_Sinh_ru2 0x1000dd8 /* U+0DD8 SINHALA GAETTA-PILLA */ ++#define XKB_KEY_Sinh_e2 0x1000dd9 /* U+0DD9 SINHALA KOMBUVA */ ++#define XKB_KEY_Sinh_ee2 0x1000dda /* U+0DDA SINHALA DIGA KOMBUVA */ ++#define XKB_KEY_Sinh_ai2 0x1000ddb /* U+0DDB SINHALA KOMBU DEKA */ ++#define XKB_KEY_Sinh_o2 0x1000ddc /* U+0DDC SINHALA KOMBUVA HAA AELA-PILLA*/ ++#define XKB_KEY_Sinh_oo2 0x1000ddd /* U+0DDD SINHALA KOMBUVA HAA DIGA AELA-PILLA*/ ++#define XKB_KEY_Sinh_au2 0x1000dde /* U+0DDE SINHALA KOMBUVA HAA GAYANUKITTA */ ++#define XKB_KEY_Sinh_lu2 0x1000ddf /* U+0DDF SINHALA GAYANUKITTA */ ++#define XKB_KEY_Sinh_ruu2 0x1000df2 /* U+0DF2 SINHALA DIGA GAETTA-PILLA */ ++#define XKB_KEY_Sinh_luu2 0x1000df3 /* U+0DF3 SINHALA DIGA GAYANUKITTA */ ++#define XKB_KEY_Sinh_kunddaliya 0x1000df4 /* U+0DF4 SINHALA KUNDDALIYA */ ++/* ++ * XFree86 vendor specific keysyms. ++ * ++ * The XFree86 keysym range is 0x10080001 - 0x1008FFFF. ++ * ++ * When adding new entries, the xc/lib/XKeysymDB file should also be ++ * updated to make the new entries visible to Xlib. ++ */ ++ ++/* ++ * ModeLock ++ * ++ * This one is old, and not really used any more since XKB offers this ++ * functionality. ++ */ ++ ++#define XKB_KEY_XF86ModeLock 0x1008FF01 /* Mode Switch Lock */ ++ ++/* ++ * Note, 0x1008FF07 - 0x1008FF0F are free and should be used for misc new ++ * keysyms that don't fit into any of the groups below. ++ * ++ * 0x1008FF64, 0x1008FF6F, 0x1008FF71, 0x1008FF83 are no longer used, ++ * and should be used first for new keysyms. ++ * ++ * Check in keysymdef.h for generic symbols before adding new XFree86-specific ++ * symbols here. ++ * ++ * X.Org will not be adding to the XF86 set of keysyms, though they have ++ * been adopted and are considered a "standard" part of X keysym definitions. ++ * XFree86 never properly commented these keysyms, so we have done our ++ * best to explain the semantic meaning of these keys. ++ * ++ * XFree86 has removed their mail archives of the period, that might have ++ * shed more light on some of these definitions. Until/unless we resurrect ++ * these archives, these are from memory and usage. ++ */ ++ ++ ++/* Backlight controls. */ ++#define XKB_KEY_XF86MonBrightnessUp 0x1008FF02 /* Monitor/panel brightness */ ++#define XKB_KEY_XF86MonBrightnessDown 0x1008FF03 /* Monitor/panel brightness */ ++#define XKB_KEY_XF86KbdLightOnOff 0x1008FF04 /* Keyboards may be lit */ ++#define XKB_KEY_XF86KbdBrightnessUp 0x1008FF05 /* Keyboards may be lit */ ++#define XKB_KEY_XF86KbdBrightnessDown 0x1008FF06 /* Keyboards may be lit */ ++ ++/* ++ * Keys found on some "Internet" keyboards. ++ */ ++#define XKB_KEY_XF86Standby 0x1008FF10 /* System into standby mode */ ++#define XKB_KEY_XF86AudioLowerVolume 0x1008FF11 /* Volume control down */ ++#define XKB_KEY_XF86AudioMute 0x1008FF12 /* Mute sound from the system */ ++#define XKB_KEY_XF86AudioRaiseVolume 0x1008FF13 /* Volume control up */ ++#define XKB_KEY_XF86AudioPlay 0x1008FF14 /* Start playing of audio > */ ++#define XKB_KEY_XF86AudioStop 0x1008FF15 /* Stop playing audio */ ++#define XKB_KEY_XF86AudioPrev 0x1008FF16 /* Previous track */ ++#define XKB_KEY_XF86AudioNext 0x1008FF17 /* Next track */ ++#define XKB_KEY_XF86HomePage 0x1008FF18 /* Display user's home page */ ++#define XKB_KEY_XF86Mail 0x1008FF19 /* Invoke user's mail program */ ++#define XKB_KEY_XF86Start 0x1008FF1A /* Start application */ ++#define XKB_KEY_XF86Search 0x1008FF1B /* Search */ ++#define XKB_KEY_XF86AudioRecord 0x1008FF1C /* Record audio application */ ++ ++/* These are sometimes found on PDA's (e.g. Palm, PocketPC or elsewhere) */ ++#define XKB_KEY_XF86Calculator 0x1008FF1D /* Invoke calculator program */ ++#define XKB_KEY_XF86Memo 0x1008FF1E /* Invoke Memo taking program */ ++#define XKB_KEY_XF86ToDoList 0x1008FF1F /* Invoke To Do List program */ ++#define XKB_KEY_XF86Calendar 0x1008FF20 /* Invoke Calendar program */ ++#define XKB_KEY_XF86PowerDown 0x1008FF21 /* Deep sleep the system */ ++#define XKB_KEY_XF86ContrastAdjust 0x1008FF22 /* Adjust screen contrast */ ++#define XKB_KEY_XF86RockerUp 0x1008FF23 /* Rocker switches exist up */ ++#define XKB_KEY_XF86RockerDown 0x1008FF24 /* and down */ ++#define XKB_KEY_XF86RockerEnter 0x1008FF25 /* and let you press them */ ++ ++/* Some more "Internet" keyboard symbols */ ++#define XKB_KEY_XF86Back 0x1008FF26 /* Like back on a browser */ ++#define XKB_KEY_XF86Forward 0x1008FF27 /* Like forward on a browser */ ++#define XKB_KEY_XF86Stop 0x1008FF28 /* Stop current operation */ ++#define XKB_KEY_XF86Refresh 0x1008FF29 /* Refresh the page */ ++#define XKB_KEY_XF86PowerOff 0x1008FF2A /* Power off system entirely */ ++#define XKB_KEY_XF86WakeUp 0x1008FF2B /* Wake up system from sleep */ ++#define XKB_KEY_XF86Eject 0x1008FF2C /* Eject device (e.g. DVD) */ ++#define XKB_KEY_XF86ScreenSaver 0x1008FF2D /* Invoke screensaver */ ++#define XKB_KEY_XF86WWW 0x1008FF2E /* Invoke web browser */ ++#define XKB_KEY_XF86Sleep 0x1008FF2F /* Put system to sleep */ ++#define XKB_KEY_XF86Favorites 0x1008FF30 /* Show favorite locations */ ++#define XKB_KEY_XF86AudioPause 0x1008FF31 /* Pause audio playing */ ++#define XKB_KEY_XF86AudioMedia 0x1008FF32 /* Launch media collection app */ ++#define XKB_KEY_XF86MyComputer 0x1008FF33 /* Display "My Computer" window */ ++#define XKB_KEY_XF86VendorHome 0x1008FF34 /* Display vendor home web site */ ++#define XKB_KEY_XF86LightBulb 0x1008FF35 /* Light bulb keys exist */ ++#define XKB_KEY_XF86Shop 0x1008FF36 /* Display shopping web site */ ++#define XKB_KEY_XF86History 0x1008FF37 /* Show history of web surfing */ ++#define XKB_KEY_XF86OpenURL 0x1008FF38 /* Open selected URL */ ++#define XKB_KEY_XF86AddFavorite 0x1008FF39 /* Add URL to favorites list */ ++#define XKB_KEY_XF86HotLinks 0x1008FF3A /* Show "hot" links */ ++#define XKB_KEY_XF86BrightnessAdjust 0x1008FF3B /* Invoke brightness adj. UI */ ++#define XKB_KEY_XF86Finance 0x1008FF3C /* Display financial site */ ++#define XKB_KEY_XF86Community 0x1008FF3D /* Display user's community */ ++#define XKB_KEY_XF86AudioRewind 0x1008FF3E /* "rewind" audio track */ ++#define XKB_KEY_XF86BackForward 0x1008FF3F /* ??? */ ++#define XKB_KEY_XF86Launch0 0x1008FF40 /* Launch Application */ ++#define XKB_KEY_XF86Launch1 0x1008FF41 /* Launch Application */ ++#define XKB_KEY_XF86Launch2 0x1008FF42 /* Launch Application */ ++#define XKB_KEY_XF86Launch3 0x1008FF43 /* Launch Application */ ++#define XKB_KEY_XF86Launch4 0x1008FF44 /* Launch Application */ ++#define XKB_KEY_XF86Launch5 0x1008FF45 /* Launch Application */ ++#define XKB_KEY_XF86Launch6 0x1008FF46 /* Launch Application */ ++#define XKB_KEY_XF86Launch7 0x1008FF47 /* Launch Application */ ++#define XKB_KEY_XF86Launch8 0x1008FF48 /* Launch Application */ ++#define XKB_KEY_XF86Launch9 0x1008FF49 /* Launch Application */ ++#define XKB_KEY_XF86LaunchA 0x1008FF4A /* Launch Application */ ++#define XKB_KEY_XF86LaunchB 0x1008FF4B /* Launch Application */ ++#define XKB_KEY_XF86LaunchC 0x1008FF4C /* Launch Application */ ++#define XKB_KEY_XF86LaunchD 0x1008FF4D /* Launch Application */ ++#define XKB_KEY_XF86LaunchE 0x1008FF4E /* Launch Application */ ++#define XKB_KEY_XF86LaunchF 0x1008FF4F /* Launch Application */ ++ ++#define XKB_KEY_XF86ApplicationLeft 0x1008FF50 /* switch to application, left */ ++#define XKB_KEY_XF86ApplicationRight 0x1008FF51 /* switch to application, right*/ ++#define XKB_KEY_XF86Book 0x1008FF52 /* Launch bookreader */ ++#define XKB_KEY_XF86CD 0x1008FF53 /* Launch CD/DVD player */ ++#define XKB_KEY_XF86Calculater 0x1008FF54 /* Launch Calculater */ ++#define XKB_KEY_XF86Clear 0x1008FF55 /* Clear window, screen */ ++#define XKB_KEY_XF86Close 0x1008FF56 /* Close window */ ++#define XKB_KEY_XF86Copy 0x1008FF57 /* Copy selection */ ++#define XKB_KEY_XF86Cut 0x1008FF58 /* Cut selection */ ++#define XKB_KEY_XF86Display 0x1008FF59 /* Output switch key */ ++#define XKB_KEY_XF86DOS 0x1008FF5A /* Launch DOS (emulation) */ ++#define XKB_KEY_XF86Documents 0x1008FF5B /* Open documents window */ ++#define XKB_KEY_XF86Excel 0x1008FF5C /* Launch spread sheet */ ++#define XKB_KEY_XF86Explorer 0x1008FF5D /* Launch file explorer */ ++#define XKB_KEY_XF86Game 0x1008FF5E /* Launch game */ ++#define XKB_KEY_XF86Go 0x1008FF5F /* Go to URL */ ++#define XKB_KEY_XF86iTouch 0x1008FF60 /* Logitch iTouch- don't use */ ++#define XKB_KEY_XF86LogOff 0x1008FF61 /* Log off system */ ++#define XKB_KEY_XF86Market 0x1008FF62 /* ?? */ ++#define XKB_KEY_XF86Meeting 0x1008FF63 /* enter meeting in calendar */ ++#define XKB_KEY_XF86MenuKB 0x1008FF65 /* distingush keyboard from PB */ ++#define XKB_KEY_XF86MenuPB 0x1008FF66 /* distinuish PB from keyboard */ ++#define XKB_KEY_XF86MySites 0x1008FF67 /* Favourites */ ++#define XKB_KEY_XF86New 0x1008FF68 /* New (folder, document... */ ++#define XKB_KEY_XF86News 0x1008FF69 /* News */ ++#define XKB_KEY_XF86OfficeHome 0x1008FF6A /* Office home (old Staroffice)*/ ++#define XKB_KEY_XF86Open 0x1008FF6B /* Open */ ++#define XKB_KEY_XF86Option 0x1008FF6C /* ?? */ ++#define XKB_KEY_XF86Paste 0x1008FF6D /* Paste */ ++#define XKB_KEY_XF86Phone 0x1008FF6E /* Launch phone; dial number */ ++#define XKB_KEY_XF86Q 0x1008FF70 /* Compaq's Q - don't use */ ++#define XKB_KEY_XF86Reply 0x1008FF72 /* Reply e.g., mail */ ++#define XKB_KEY_XF86Reload 0x1008FF73 /* Reload web page, file, etc. */ ++#define XKB_KEY_XF86RotateWindows 0x1008FF74 /* Rotate windows e.g. xrandr */ ++#define XKB_KEY_XF86RotationPB 0x1008FF75 /* don't use */ ++#define XKB_KEY_XF86RotationKB 0x1008FF76 /* don't use */ ++#define XKB_KEY_XF86Save 0x1008FF77 /* Save (file, document, state */ ++#define XKB_KEY_XF86ScrollUp 0x1008FF78 /* Scroll window/contents up */ ++#define XKB_KEY_XF86ScrollDown 0x1008FF79 /* Scrool window/contentd down */ ++#define XKB_KEY_XF86ScrollClick 0x1008FF7A /* Use XKB mousekeys instead */ ++#define XKB_KEY_XF86Send 0x1008FF7B /* Send mail, file, object */ ++#define XKB_KEY_XF86Spell 0x1008FF7C /* Spell checker */ ++#define XKB_KEY_XF86SplitScreen 0x1008FF7D /* Split window or screen */ ++#define XKB_KEY_XF86Support 0x1008FF7E /* Get support (??) */ ++#define XKB_KEY_XF86TaskPane 0x1008FF7F /* Show tasks */ ++#define XKB_KEY_XF86Terminal 0x1008FF80 /* Launch terminal emulator */ ++#define XKB_KEY_XF86Tools 0x1008FF81 /* toolbox of desktop/app. */ ++#define XKB_KEY_XF86Travel 0x1008FF82 /* ?? */ ++#define XKB_KEY_XF86UserPB 0x1008FF84 /* ?? */ ++#define XKB_KEY_XF86User1KB 0x1008FF85 /* ?? */ ++#define XKB_KEY_XF86User2KB 0x1008FF86 /* ?? */ ++#define XKB_KEY_XF86Video 0x1008FF87 /* Launch video player */ ++#define XKB_KEY_XF86WheelButton 0x1008FF88 /* button from a mouse wheel */ ++#define XKB_KEY_XF86Word 0x1008FF89 /* Launch word processor */ ++#define XKB_KEY_XF86Xfer 0x1008FF8A ++#define XKB_KEY_XF86ZoomIn 0x1008FF8B /* zoom in view, map, etc. */ ++#define XKB_KEY_XF86ZoomOut 0x1008FF8C /* zoom out view, map, etc. */ ++ ++#define XKB_KEY_XF86Away 0x1008FF8D /* mark yourself as away */ ++#define XKB_KEY_XF86Messenger 0x1008FF8E /* as in instant messaging */ ++#define XKB_KEY_XF86WebCam 0x1008FF8F /* Launch web camera app. */ ++#define XKB_KEY_XF86MailForward 0x1008FF90 /* Forward in mail */ ++#define XKB_KEY_XF86Pictures 0x1008FF91 /* Show pictures */ ++#define XKB_KEY_XF86Music 0x1008FF92 /* Launch music application */ ++ ++#define XKB_KEY_XF86Battery 0x1008FF93 /* Display battery information */ ++#define XKB_KEY_XF86Bluetooth 0x1008FF94 /* Enable/disable Bluetooth */ ++#define XKB_KEY_XF86WLAN 0x1008FF95 /* Enable/disable WLAN */ ++#define XKB_KEY_XF86UWB 0x1008FF96 /* Enable/disable UWB */ ++ ++#define XKB_KEY_XF86AudioForward 0x1008FF97 /* fast-forward audio track */ ++#define XKB_KEY_XF86AudioRepeat 0x1008FF98 /* toggle repeat mode */ ++#define XKB_KEY_XF86AudioRandomPlay 0x1008FF99 /* toggle shuffle mode */ ++#define XKB_KEY_XF86Subtitle 0x1008FF9A /* cycle through subtitle */ ++#define XKB_KEY_XF86AudioCycleTrack 0x1008FF9B /* cycle through audio tracks */ ++#define XKB_KEY_XF86CycleAngle 0x1008FF9C /* cycle through angles */ ++#define XKB_KEY_XF86FrameBack 0x1008FF9D /* video: go one frame back */ ++#define XKB_KEY_XF86FrameForward 0x1008FF9E /* video: go one frame forward */ ++#define XKB_KEY_XF86Time 0x1008FF9F /* display, or shows an entry for time seeking */ ++#define XKB_KEY_XF86Select 0x1008FFA0 /* Select button on joypads and remotes */ ++#define XKB_KEY_XF86View 0x1008FFA1 /* Show a view options/properties */ ++#define XKB_KEY_XF86TopMenu 0x1008FFA2 /* Go to a top-level menu in a video */ ++ ++#define XKB_KEY_XF86Red 0x1008FFA3 /* Red button */ ++#define XKB_KEY_XF86Green 0x1008FFA4 /* Green button */ ++#define XKB_KEY_XF86Yellow 0x1008FFA5 /* Yellow button */ ++#define XKB_KEY_XF86Blue 0x1008FFA6 /* Blue button */ ++ ++#define XKB_KEY_XF86Suspend 0x1008FFA7 /* Sleep to RAM */ ++#define XKB_KEY_XF86Hibernate 0x1008FFA8 /* Sleep to disk */ ++#define XKB_KEY_XF86TouchpadToggle 0x1008FFA9 /* Toggle between touchpad/trackstick */ ++#define XKB_KEY_XF86TouchpadOn 0x1008FFB0 /* The touchpad got switched on */ ++#define XKB_KEY_XF86TouchpadOff 0x1008FFB1 /* The touchpad got switched off */ ++ ++#define XKB_KEY_XF86AudioMicMute 0x1008FFB2 /* Mute the Mic from the system */ ++ ++/* Keys for special action keys (hot keys) */ ++/* Virtual terminals on some operating systems */ ++#define XKB_KEY_XF86Switch_VT_1 0x1008FE01 ++#define XKB_KEY_XF86Switch_VT_2 0x1008FE02 ++#define XKB_KEY_XF86Switch_VT_3 0x1008FE03 ++#define XKB_KEY_XF86Switch_VT_4 0x1008FE04 ++#define XKB_KEY_XF86Switch_VT_5 0x1008FE05 ++#define XKB_KEY_XF86Switch_VT_6 0x1008FE06 ++#define XKB_KEY_XF86Switch_VT_7 0x1008FE07 ++#define XKB_KEY_XF86Switch_VT_8 0x1008FE08 ++#define XKB_KEY_XF86Switch_VT_9 0x1008FE09 ++#define XKB_KEY_XF86Switch_VT_10 0x1008FE0A ++#define XKB_KEY_XF86Switch_VT_11 0x1008FE0B ++#define XKB_KEY_XF86Switch_VT_12 0x1008FE0C ++ ++#define XKB_KEY_XF86Ungrab 0x1008FE20 /* force ungrab */ ++#define XKB_KEY_XF86ClearGrab 0x1008FE21 /* kill application with grab */ ++#define XKB_KEY_XF86Next_VMode 0x1008FE22 /* next video mode available */ ++#define XKB_KEY_XF86Prev_VMode 0x1008FE23 /* prev. video mode available */ ++#define XKB_KEY_XF86LogWindowTree 0x1008FE24 /* print window tree to log */ ++#define XKB_KEY_XF86LogGrabInfo 0x1008FE25 /* print all active grabs to log */ ++/* ++ * Copyright (c) 1991, Oracle and/or its affiliates. All rights reserved. ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining a ++ * copy of this software and associated documentation files (the "Software"), ++ * to deal in the Software without restriction, including without limitation ++ * the rights to use, copy, modify, merge, publish, distribute, sublicense, ++ * and/or sell copies of the Software, and to permit persons to whom the ++ * Software is furnished to do so, subject to the following conditions: ++ * ++ * The above copyright notice and this permission notice (including the next ++ * paragraph) shall be included in all copies or substantial portions of the ++ * Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ++ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++ * DEALINGS IN THE SOFTWARE. ++ */ ++/************************************************************ ++ ++Copyright 1991, 1998 The Open Group ++ ++Permission to use, copy, modify, distribute, and sell this software and its ++documentation for any purpose is hereby granted without fee, provided that ++the above copyright notice appear in all copies and that both that ++copyright notice and this permission notice appear in supporting ++documentation. ++ ++The above copyright notice and this permission notice shall be included in ++all copies or substantial portions of the Software. ++ ++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN ++AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN ++CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ++ ++Except as contained in this notice, the name of The Open Group shall not be ++used in advertising or otherwise to promote the sale, use or other dealings ++in this Software without prior written authorization from The Open Group. ++ ++***********************************************************/ ++ ++/* ++ * Floating Accent ++ */ ++ ++#define XKB_KEY_SunFA_Grave 0x1005FF00 ++#define XKB_KEY_SunFA_Circum 0x1005FF01 ++#define XKB_KEY_SunFA_Tilde 0x1005FF02 ++#define XKB_KEY_SunFA_Acute 0x1005FF03 ++#define XKB_KEY_SunFA_Diaeresis 0x1005FF04 ++#define XKB_KEY_SunFA_Cedilla 0x1005FF05 ++ ++/* ++ * Miscellaneous Functions ++ */ ++ ++#define XKB_KEY_SunF36 0x1005FF10 /* Labeled F11 */ ++#define XKB_KEY_SunF37 0x1005FF11 /* Labeled F12 */ ++ ++#define XKB_KEY_SunSys_Req 0x1005FF60 ++#define XKB_KEY_SunPrint_Screen 0x0000FF61 /* Same as XK_Print */ ++ ++/* ++ * International & Multi-Key Character Composition ++ */ ++ ++#define XKB_KEY_SunCompose 0x0000FF20 /* Same as XK_Multi_key */ ++#define XKB_KEY_SunAltGraph 0x0000FF7E /* Same as XK_Mode_switch */ ++ ++/* ++ * Cursor Control ++ */ ++ ++#define XKB_KEY_SunPageUp 0x0000FF55 /* Same as XK_Prior */ ++#define XKB_KEY_SunPageDown 0x0000FF56 /* Same as XK_Next */ ++ ++/* ++ * Open Look Functions ++ */ ++ ++#define XKB_KEY_SunUndo 0x0000FF65 /* Same as XK_Undo */ ++#define XKB_KEY_SunAgain 0x0000FF66 /* Same as XK_Redo */ ++#define XKB_KEY_SunFind 0x0000FF68 /* Same as XK_Find */ ++#define XKB_KEY_SunStop 0x0000FF69 /* Same as XK_Cancel */ ++#define XKB_KEY_SunProps 0x1005FF70 ++#define XKB_KEY_SunFront 0x1005FF71 ++#define XKB_KEY_SunCopy 0x1005FF72 ++#define XKB_KEY_SunOpen 0x1005FF73 ++#define XKB_KEY_SunPaste 0x1005FF74 ++#define XKB_KEY_SunCut 0x1005FF75 ++ ++#define XKB_KEY_SunPowerSwitch 0x1005FF76 ++#define XKB_KEY_SunAudioLowerVolume 0x1005FF77 ++#define XKB_KEY_SunAudioMute 0x1005FF78 ++#define XKB_KEY_SunAudioRaiseVolume 0x1005FF79 ++#define XKB_KEY_SunVideoDegauss 0x1005FF7A ++#define XKB_KEY_SunVideoLowerBrightness 0x1005FF7B ++#define XKB_KEY_SunVideoRaiseBrightness 0x1005FF7C ++#define XKB_KEY_SunPowerSwitchShift 0x1005FF7D ++/*********************************************************** ++ ++Copyright 1988, 1998 The Open Group ++ ++Permission to use, copy, modify, distribute, and sell this software and its ++documentation for any purpose is hereby granted without fee, provided that ++the above copyright notice appear in all copies and that both that ++copyright notice and this permission notice appear in supporting ++documentation. ++ ++The above copyright notice and this permission notice shall be included in ++all copies or substantial portions of the Software. ++ ++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN ++AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN ++CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ++ ++Except as contained in this notice, the name of The Open Group shall not be ++used in advertising or otherwise to promote the sale, use or other dealings ++in this Software without prior written authorization from The Open Group. ++ ++ ++Copyright 1988 by Digital Equipment Corporation, Maynard, Massachusetts. ++ ++ All Rights Reserved ++ ++Permission to use, copy, modify, and distribute this software and its ++documentation for any purpose and without fee is hereby granted, ++provided that the above copyright notice appear in all copies and that ++both that copyright notice and this permission notice appear in ++supporting documentation, and that the name of Digital not be ++used in advertising or publicity pertaining to distribution of the ++software without specific, written prior permission. ++ ++DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ++ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL ++DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ++ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, ++WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ++ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS ++SOFTWARE. ++ ++******************************************************************/ ++ ++/* ++ * DEC private keysyms ++ * (29th bit set) ++ */ ++ ++/* two-key compose sequence initiators, chosen to map to Latin1 characters */ ++ ++#define XKB_KEY_Dring_accent 0x1000FEB0 ++#define XKB_KEY_Dcircumflex_accent 0x1000FE5E ++#define XKB_KEY_Dcedilla_accent 0x1000FE2C ++#define XKB_KEY_Dacute_accent 0x1000FE27 ++#define XKB_KEY_Dgrave_accent 0x1000FE60 ++#define XKB_KEY_Dtilde 0x1000FE7E ++#define XKB_KEY_Ddiaeresis 0x1000FE22 ++ ++/* special keysym for LK2** "Remove" key on editing keypad */ ++ ++#define XKB_KEY_DRemove 0x1000FF00 /* Remove */ ++/* ++ ++Copyright 1987, 1998 The Open Group ++ ++Permission to use, copy, modify, distribute, and sell this software and its ++documentation for any purpose is hereby granted without fee, provided that ++the above copyright notice appear in all copies and that both that ++copyright notice and this permission notice appear in supporting ++documentation. ++ ++The above copyright notice and this permission notice shall be included ++in all copies or substantial portions of the Software. ++ ++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ++OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR ++OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++OTHER DEALINGS IN THE SOFTWARE. ++ ++Except as contained in this notice, the name of The Open Group shall ++not be used in advertising or otherwise to promote the sale, use or ++other dealings in this Software without prior written authorization ++from The Open Group. ++ ++Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts, ++ ++ All Rights Reserved ++ ++Permission to use, copy, modify, and distribute this software and its ++documentation for any purpose and without fee is hereby granted, ++provided that the above copyright notice appear in all copies and that ++both that copyright notice and this permission notice appear in ++supporting documentation, and that the names of Hewlett Packard ++or Digital not be ++used in advertising or publicity pertaining to distribution of the ++software without specific, written prior permission. ++ ++DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ++ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL ++DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ++ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, ++WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ++ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS ++SOFTWARE. ++ ++HEWLETT-PACKARD MAKES NO WARRANTY OF ANY KIND WITH REGARD ++TO THIS SOFWARE, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED ++WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ++PURPOSE. Hewlett-Packard shall not be liable for errors ++contained herein or direct, indirect, special, incidental or ++consequential damages in connection with the furnishing, ++performance, or use of this material. ++ ++*/ ++ ++ ++ ++#define XKB_KEY_hpClearLine 0x1000FF6F ++#define XKB_KEY_hpInsertLine 0x1000FF70 ++#define XKB_KEY_hpDeleteLine 0x1000FF71 ++#define XKB_KEY_hpInsertChar 0x1000FF72 ++#define XKB_KEY_hpDeleteChar 0x1000FF73 ++#define XKB_KEY_hpBackTab 0x1000FF74 ++#define XKB_KEY_hpKP_BackTab 0x1000FF75 ++#define XKB_KEY_hpModelock1 0x1000FF48 ++#define XKB_KEY_hpModelock2 0x1000FF49 ++#define XKB_KEY_hpReset 0x1000FF6C ++#define XKB_KEY_hpSystem 0x1000FF6D ++#define XKB_KEY_hpUser 0x1000FF6E ++#define XKB_KEY_hpmute_acute 0x100000A8 ++#define XKB_KEY_hpmute_grave 0x100000A9 ++#define XKB_KEY_hpmute_asciicircum 0x100000AA ++#define XKB_KEY_hpmute_diaeresis 0x100000AB ++#define XKB_KEY_hpmute_asciitilde 0x100000AC ++#define XKB_KEY_hplira 0x100000AF ++#define XKB_KEY_hpguilder 0x100000BE ++#define XKB_KEY_hpYdiaeresis 0x100000EE ++#define XKB_KEY_hpIO 0x100000EE ++#define XKB_KEY_hplongminus 0x100000F6 ++#define XKB_KEY_hpblock 0x100000FC ++ ++ ++ ++#define XKB_KEY_osfCopy 0x1004FF02 ++#define XKB_KEY_osfCut 0x1004FF03 ++#define XKB_KEY_osfPaste 0x1004FF04 ++#define XKB_KEY_osfBackTab 0x1004FF07 ++#define XKB_KEY_osfBackSpace 0x1004FF08 ++#define XKB_KEY_osfClear 0x1004FF0B ++#define XKB_KEY_osfEscape 0x1004FF1B ++#define XKB_KEY_osfAddMode 0x1004FF31 ++#define XKB_KEY_osfPrimaryPaste 0x1004FF32 ++#define XKB_KEY_osfQuickPaste 0x1004FF33 ++#define XKB_KEY_osfPageLeft 0x1004FF40 ++#define XKB_KEY_osfPageUp 0x1004FF41 ++#define XKB_KEY_osfPageDown 0x1004FF42 ++#define XKB_KEY_osfPageRight 0x1004FF43 ++#define XKB_KEY_osfActivate 0x1004FF44 ++#define XKB_KEY_osfMenuBar 0x1004FF45 ++#define XKB_KEY_osfLeft 0x1004FF51 ++#define XKB_KEY_osfUp 0x1004FF52 ++#define XKB_KEY_osfRight 0x1004FF53 ++#define XKB_KEY_osfDown 0x1004FF54 ++#define XKB_KEY_osfEndLine 0x1004FF57 ++#define XKB_KEY_osfBeginLine 0x1004FF58 ++#define XKB_KEY_osfEndData 0x1004FF59 ++#define XKB_KEY_osfBeginData 0x1004FF5A ++#define XKB_KEY_osfPrevMenu 0x1004FF5B ++#define XKB_KEY_osfNextMenu 0x1004FF5C ++#define XKB_KEY_osfPrevField 0x1004FF5D ++#define XKB_KEY_osfNextField 0x1004FF5E ++#define XKB_KEY_osfSelect 0x1004FF60 ++#define XKB_KEY_osfInsert 0x1004FF63 ++#define XKB_KEY_osfUndo 0x1004FF65 ++#define XKB_KEY_osfMenu 0x1004FF67 ++#define XKB_KEY_osfCancel 0x1004FF69 ++#define XKB_KEY_osfHelp 0x1004FF6A ++#define XKB_KEY_osfSelectAll 0x1004FF71 ++#define XKB_KEY_osfDeselectAll 0x1004FF72 ++#define XKB_KEY_osfReselect 0x1004FF73 ++#define XKB_KEY_osfExtend 0x1004FF74 ++#define XKB_KEY_osfRestore 0x1004FF78 ++#define XKB_KEY_osfDelete 0x1004FFFF ++ ++ ++ ++/************************************************************** ++ * The use of the following macros is deprecated. ++ * They are listed below only for backwards compatibility. ++ */ ++#define XKB_KEY_Reset 0x1000FF6C ++#define XKB_KEY_System 0x1000FF6D ++#define XKB_KEY_User 0x1000FF6E ++#define XKB_KEY_ClearLine 0x1000FF6F ++#define XKB_KEY_InsertLine 0x1000FF70 ++#define XKB_KEY_DeleteLine 0x1000FF71 ++#define XKB_KEY_InsertChar 0x1000FF72 ++#define XKB_KEY_DeleteChar 0x1000FF73 ++#define XKB_KEY_BackTab 0x1000FF74 ++#define XKB_KEY_KP_BackTab 0x1000FF75 ++#define XKB_KEY_Ext16bit_L 0x1000FF76 ++#define XKB_KEY_Ext16bit_R 0x1000FF77 ++#define XKB_KEY_mute_acute 0x100000a8 ++#define XKB_KEY_mute_grave 0x100000a9 ++#define XKB_KEY_mute_asciicircum 0x100000aa ++#define XKB_KEY_mute_diaeresis 0x100000ab ++#define XKB_KEY_mute_asciitilde 0x100000ac ++#define XKB_KEY_lira 0x100000af ++#define XKB_KEY_guilder 0x100000be ++#define XKB_KEY_IO 0x100000ee ++#define XKB_KEY_longminus 0x100000f6 ++#define XKB_KEY_block 0x100000fc ++ ++ ++ ++#endif +diff --git a/src/plugins/platforminputcontexts/fcitx/xkbcommon/xkbcommon-names.h b/src/plugins/platforminputcontexts/fcitx/xkbcommon/xkbcommon-names.h +new file mode 100644 +index 0000000..ecb551f +--- /dev/null ++++ b/src/plugins/platforminputcontexts/fcitx/xkbcommon/xkbcommon-names.h +@@ -0,0 +1,45 @@ ++/* ++ * Copyright © 2012 Intel Corporation ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining a ++ * copy of this software and associated documentation files (the "Software"), ++ * to deal in the Software without restriction, including without limitation ++ * the rights to use, copy, modify, merge, publish, distribute, sublicense, ++ * and/or sell copies of the Software, and to permit persons to whom the ++ * Software is furnished to do so, subject to the following conditions: ++ * ++ * The above copyright notice and this permission notice (including the next ++ * paragraph) shall be included in all copies or substantial portions of the ++ * Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ++ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++ * DEALINGS IN THE SOFTWARE. ++ * ++ * Author: Daniel Stone ++ */ ++ ++#ifndef _XKBCOMMON_NAMES_H ++#define _XKBCOMMON_NAMES_H ++ ++/** ++ * @file ++ * @brief Predefined names for common modifiers and LEDs. ++ */ ++ ++#define XKB_MOD_NAME_SHIFT "Shift" ++#define XKB_MOD_NAME_CAPS "Lock" ++#define XKB_MOD_NAME_CTRL "Control" ++#define XKB_MOD_NAME_ALT "Mod1" ++#define XKB_MOD_NAME_NUM "Mod2" ++#define XKB_MOD_NAME_LOGO "Mod4" ++ ++#define XKB_LED_NAME_CAPS "Caps Lock" ++#define XKB_LED_NAME_NUM "Num Lock" ++#define XKB_LED_NAME_SCROLL "Scroll Lock" ++ ++#endif +diff --git a/src/plugins/platforminputcontexts/fcitx/xkbcommon/xkbcommon-x11.h b/src/plugins/platforminputcontexts/fcitx/xkbcommon/xkbcommon-x11.h +new file mode 100644 +index 0000000..0158315 +--- /dev/null ++++ b/src/plugins/platforminputcontexts/fcitx/xkbcommon/xkbcommon-x11.h +@@ -0,0 +1,244 @@ ++/* ++ * Copyright © 2013 Ran Benita ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining a ++ * copy of this software and associated documentation files (the "Software"), ++ * to deal in the Software without restriction, including without limitation ++ * the rights to use, copy, modify, merge, publish, distribute, sublicense, ++ * and/or sell copies of the Software, and to permit persons to whom the ++ * Software is furnished to do so, subject to the following conditions: ++ * ++ * The above copyright notice and this permission notice (including the next ++ * paragraph) shall be included in all copies or substantial portions of the ++ * Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ++ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++ * DEALINGS IN THE SOFTWARE. ++ */ ++ ++#ifndef _XKBCOMMON_X11_H ++#define _XKBCOMMON_X11_H ++ ++#include ++#include ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++/** ++ * @file ++ * libxkbcommon-x11 API - Additional X11 support for xkbcommon. ++ */ ++ ++/** ++ * @defgroup x11 X11 support ++ * Additional X11 support for xkbcommon. ++ * @since 0.4.0 ++ * ++ * @{ ++ */ ++ ++/** ++ * @page x11-overview Overview ++ * @parblock ++ * ++ * The xkbcommon-x11 module provides a means for creating an xkb_keymap ++ * corresponding to the currently active keymap on the X server. To do ++ * so, it queries the XKB X11 extension using the xcb-xkb library. It ++ * can be used as a replacement for Xlib's keyboard handling. ++ * ++ * Following is an example workflow using xkbcommon-x11. A complete ++ * example may be found in the test/interactive-x11.c file in the ++ * xkbcommon source repository. On startup: ++ * ++ * 1. Connect to the X server using xcb_connect(). ++ * 2. Setup the XKB X11 extension. You can do this either by using the ++ * xcb_xkb_use_extension() request directly, or by using the ++ * xkb_x11_setup_xkb_extension() helper function. ++ * ++ * The XKB extension supports using separate keymaps and states for ++ * different keyboard devices. The devices are identified by an integer ++ * device ID and are managed by another X11 extension, XInput (or its ++ * successor, XInput2). The original X11 protocol only had one keyboard ++ * device, called the "core keyboard", which is still supported as a ++ * "virtual device". ++ * ++ * 3. We will use the core keyboard as an example. To get its device ID, ++ * use either the xcb_xkb_get_device_info() request directly, or the ++ * xkb_x11_get_core_keyboard_device_id() helper function. ++ * 4. Create an initial xkb_keymap for this device, using the ++ * xkb_x11_keymap_new_from_device() function. ++ * 5. Create an initial xkb_state for this device, using the ++ * xkb_x11_state_new_from_device() function. ++ * ++ * @note At this point, you may consider setting various XKB controls and ++ * XKB per-client flags. For example, enabling detectable autorepeat: \n ++ * http://www.x.org/releases/current/doc/kbproto/xkbproto.html#Detectable_Autorepeat ++ * ++ * Next, you need to react to state changes (e.g. a modifier was pressed, ++ * the layout was changed) and to keymap changes (e.g. a tool like xkbcomp, ++ * setxkbmap or xmodmap was used): ++ * ++ * 6. Select to listen to at least the following XKB events: ++ * NewKeyboardNotify, MapNotify, StateNotify; using the ++ * xcb_xkb_select_events_aux() request. ++ * 7. When NewKeyboardNotify or MapNotify are received, recreate the ++ * xkb_keymap and xkb_state as described above. ++ * 8. When StateNotify is received, update the xkb_state accordingly ++ * using the xkb_state_update_mask() function. ++ * ++ * @note It is also possible to use the KeyPress/KeyRelease @p state ++ * field to find the effective modifier and layout state, instead of ++ * using XkbStateNotify: \n ++ * http://www.x.org/releases/current/doc/kbproto/xkbproto.html#Computing_A_State_Field_from_an_XKB_State ++ * \n However, XkbStateNotify is more accurate. ++ * ++ * @note There is no need to call xkb_state_update_key(); the state is ++ * already synchronized. ++ * ++ * Finally, when a key event is received, you can use ordinary xkbcommon ++ * functions, like xkb_state_key_get_one_sym() and xkb_state_key_get_utf8(), ++ * as you normally would. ++ * ++ * @endparblock ++ */ ++ ++/** ++ * The minimal compatible major version of the XKB X11 extension which ++ * this library can use. ++ */ ++#define XKB_X11_MIN_MAJOR_XKB_VERSION 1 ++/** ++ * The minimal compatible minor version of the XKB X11 extension which ++ * this library can use (for the minimal major version). ++ */ ++#define XKB_X11_MIN_MINOR_XKB_VERSION 0 ++ ++/** Flags for the xkb_x11_setup_xkb_extension() function. */ ++enum xkb_x11_setup_xkb_extension_flags { ++ /** Do not apply any flags. */ ++ XKB_X11_SETUP_XKB_EXTENSION_NO_FLAGS = 0 ++}; ++ ++/** ++ * Setup the XKB X11 extension for this X client. ++ * ++ * The xkbcommon-x11 library uses various XKB requests. Before doing so, ++ * an X client must notify the server that it will be using the extension. ++ * This function (or an XCB equivalent) must be called before any other ++ * function in this library is used. ++ * ++ * Some X servers may not support or disable the XKB extension. If you ++ * want to support such servers, you need to use a different fallback. ++ * ++ * You may call this function several times; it is idempotent. ++ * ++ * @param connection ++ * An XCB connection to the X server. ++ * @param major_xkb_version ++ * See @p minor_xkb_version. ++ * @param minor_xkb_version ++ * The XKB extension version to request. To operate correctly, you ++ * must have (major_xkb_version, minor_xkb_version) >= ++ * (XKB_X11_MIN_MAJOR_XKB_VERSION, XKB_X11_MIN_MINOR_XKB_VERSION), ++ * though this is not enforced. ++ * @param flags ++ * Optional flags, or 0. ++ * @param[out] major_xkb_version_out ++ * See @p minor_xkb_version_out. ++ * @param[out] minor_xkb_version_out ++ * Backfilled with the compatible XKB extension version numbers picked ++ * by the server. Can be NULL. ++ * @param[out] base_event_out ++ * Backfilled with the XKB base (also known as first) event code, needed ++ * to distinguish XKB events. Can be NULL. ++ * @param[out] base_error_out ++ * Backfilled with the XKB base (also known as first) error code, needed ++ * to distinguish XKB errors. Can be NULL. ++ * ++ * @returns 1 on success, or 0 on failure. ++ */ ++int ++xkb_x11_setup_xkb_extension(xcb_connection_t *connection, ++ uint16_t major_xkb_version, ++ uint16_t minor_xkb_version, ++ enum xkb_x11_setup_xkb_extension_flags flags, ++ uint16_t *major_xkb_version_out, ++ uint16_t *minor_xkb_version_out, ++ uint8_t *base_event_out, ++ uint8_t *base_error_out); ++ ++/** ++ * Get the keyboard device ID of the core X11 keyboard. ++ * ++ * @param connection An XCB connection to the X server. ++ * ++ * @returns A device ID which may be used with other xkb_x11_* functions, ++ * or -1 on failure. ++ */ ++int32_t ++xkb_x11_get_core_keyboard_device_id(xcb_connection_t *connection); ++ ++/** ++ * Create a keymap from an X11 keyboard device. ++ * ++ * This function queries the X server with various requests, fetches the ++ * details of the active keymap on a keyboard device, and creates an ++ * xkb_keymap from these details. ++ * ++ * @param context ++ * The context in which to create the keymap. ++ * @param connection ++ * An XCB connection to the X server. ++ * @param device_id ++ * An XInput 1 device ID (in the range 0-255) with input class KEY. ++ * Passing values outside of this range is an error. ++ * @param flags ++ * Optional flags for the keymap, or 0. ++ * ++ * @returns A keymap retrieved from the X server, or NULL on failure. ++ * ++ * @memberof xkb_keymap ++ */ ++struct xkb_keymap * ++xkb_x11_keymap_new_from_device(struct xkb_context *context, ++ xcb_connection_t *connection, ++ int32_t device_id, ++ enum xkb_keymap_compile_flags flags); ++ ++/** ++ * Create a new keyboard state object from an X11 keyboard device. ++ * ++ * This function is the same as xkb_state_new(), only pre-initialized ++ * with the state of the device at the time this function is called. ++ * ++ * @param keymap ++ * The keymap for which to create the state. ++ * @param connection ++ * An XCB connection to the X server. ++ * @param device_id ++ * An XInput 1 device ID (in the range 0-255) with input class KEY. ++ * Passing values outside of this range is an error. ++ * ++ * @returns A new keyboard state object, or NULL on failure. ++ * ++ * @memberof xkb_state ++ */ ++struct xkb_state * ++xkb_x11_state_new_from_device(struct xkb_keymap *keymap, ++ xcb_connection_t *connection, ++ int32_t device_id); ++ ++/** @} */ ++ ++#ifdef __cplusplus ++} /* extern "C" */ ++#endif ++ ++#endif /* _XKBCOMMON_X11_H */ +diff --git a/src/plugins/platforminputcontexts/fcitx/xkbcommon/xkbcommon.h b/src/plugins/platforminputcontexts/fcitx/xkbcommon/xkbcommon.h +new file mode 100644 +index 0000000..f0c9202 +--- /dev/null ++++ b/src/plugins/platforminputcontexts/fcitx/xkbcommon/xkbcommon.h +@@ -0,0 +1,1723 @@ ++/* ++ * Copyright 1985, 1987, 1990, 1998 The Open Group ++ * Copyright 2008 Dan Nicholson ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining a ++ * copy of this software and associated documentation files (the "Software"), ++ * to deal in the Software without restriction, including without limitation ++ * the rights to use, copy, modify, merge, publish, distribute, sublicense, ++ * and/or sell copies of the Software, and to permit persons to whom the ++ * Software is furnished to do so, subject to the following conditions: ++ * ++ * The above copyright notice and this permission notice shall be included in ++ * all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++ * AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ++ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN ++ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ++ * ++ * Except as contained in this notice, the names of the authors or their ++ * institutions shall not be used in advertising or otherwise to promote the ++ * sale, use or other dealings in this Software without prior written ++ * authorization from the authors. ++ */ ++ ++/************************************************************ ++ * Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc. ++ * ++ * Permission to use, copy, modify, and distribute this ++ * software and its documentation for any purpose and without ++ * fee is hereby granted, provided that the above copyright ++ * notice appear in all copies and that both that copyright ++ * notice and this permission notice appear in supporting ++ * documentation, and that the name of Silicon Graphics not be ++ * used in advertising or publicity pertaining to distribution ++ * of the software without specific prior written permission. ++ * Silicon Graphics makes no representation about the suitability ++ * of this software for any purpose. It is provided "as is" ++ * without any express or implied warranty. ++ * ++ * SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS ++ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ++ * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON ++ * GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL ++ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, ++ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ++ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH ++ * THE USE OR PERFORMANCE OF THIS SOFTWARE. ++ * ++ ********************************************************/ ++ ++/* ++ * Copyright © 2009-2012 Daniel Stone ++ * Copyright © 2012 Intel Corporation ++ * Copyright © 2012 Ran Benita ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining a ++ * copy of this software and associated documentation files (the "Software"), ++ * to deal in the Software without restriction, including without limitation ++ * the rights to use, copy, modify, merge, publish, distribute, sublicense, ++ * and/or sell copies of the Software, and to permit persons to whom the ++ * Software is furnished to do so, subject to the following conditions: ++ * ++ * The above copyright notice and this permission notice (including the next ++ * paragraph) shall be included in all copies or substantial portions of the ++ * Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ++ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++ * DEALINGS IN THE SOFTWARE. ++ * ++ * Author: Daniel Stone ++ */ ++ ++#ifndef _XKBCOMMON_H_ ++#define _XKBCOMMON_H_ ++ ++#include ++#include ++#include ++ ++#include ++#include ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++/** ++ * @file ++ * Main libxkbcommon API. ++ */ ++ ++/** ++ * @struct xkb_context ++ * Opaque top level library context object. ++ * ++ * The context contains various general library data and state, like ++ * logging level and include paths. ++ * ++ * Objects are created in a specific context, and multiple contexts may ++ * coexist simultaneously. Objects from different contexts are completely ++ * separated and do not share any memory or state. ++ */ ++struct xkb_context; ++ ++/** ++ * @struct xkb_keymap ++ * Opaque compiled keymap object. ++ * ++ * The keymap object holds all of the static keyboard information obtained ++ * from compiling XKB files. ++ * ++ * A keymap is immutable after it is created (besides reference counts, etc.); ++ * if you need to change it, you must create a new one. ++ */ ++struct xkb_keymap; ++ ++/** ++ * @struct xkb_state ++ * Opaque keyboard state object. ++ * ++ * State objects contain the active state of a keyboard (or keyboards), such ++ * as the currently effective layout and the active modifiers. It acts as a ++ * simple state machine, wherein key presses and releases are the input, and ++ * key symbols (keysyms) are the output. ++ */ ++struct xkb_state; ++ ++/** ++ * A number used to represent a physical key on a keyboard. ++ * ++ * A standard PC-compatible keyboard might have 102 keys. An appropriate ++ * keymap would assign each of them a keycode, by which the user should ++ * refer to the key throughout the library. ++ * ++ * Historically, the X11 protocol, and consequentially the XKB protocol, ++ * assign only 8 bits for keycodes. This limits the number of different ++ * keys that can be used simultaneously in a single keymap to 256 ++ * (disregarding other limitations). This library does not share this limit; ++ * keycodes beyond 255 ('extended keycodes') are not treated specially. ++ * Keymaps and applications which are compatible with X11 should not use ++ * these keycodes. ++ * ++ * The values of specific keycodes are determined by the keymap and the ++ * underlying input system. For example, with an X11-compatible keymap ++ * and Linux evdev scan codes (see linux/input.h), a fixed offset is used: ++ * ++ * @code ++ * xkb_keycode_t keycode_A = KEY_A + 8; ++ * @endcode ++ * ++ * @sa xkb_keycode_is_legal_ext() xkb_keycode_is_legal_x11() ++ */ ++typedef uint32_t xkb_keycode_t; ++ ++/** ++ * A number used to represent the symbols generated from a key on a keyboard. ++ * ++ * A key, represented by a keycode, may generate different symbols according ++ * to keyboard state. For example, on a QWERTY keyboard, pressing the key ++ * labled \ generates the symbol 'a'. If the Shift key is held, it ++ * generates the symbol 'A'. If a different layout is used, say Greek, ++ * it generates the symbol 'α'. And so on. ++ * ++ * Each such symbol is represented by a keysym. Note that keysyms are ++ * somewhat more general, in that they can also represent some "function", ++ * such as "Left" or "Right" for the arrow keys. For more information, ++ * see: ++ * http://www.x.org/releases/X11R7.7/doc/xproto/x11protocol.html#keysym_encoding ++ * ++ * Specifically named keysyms can be found in the ++ * xkbcommon/xkbcommon-keysyms.h header file. Their name does not include ++ * the XKB_KEY_ prefix. ++ * ++ * Besides those, any Unicode/ISO 10646 character in the range U0100 to ++ * U10FFFF can be represented by a keysym value in the range 0x01000100 to ++ * 0x0110FFFF. The name of Unicode keysyms is "U", e.g. "UA1B2". ++ * ++ * The name of other unnamed keysyms is the hexadecimal representation of ++ * their value, e.g. "0xabcd1234". ++ * ++ * Keysym names are case-sensitive. ++ */ ++typedef uint32_t xkb_keysym_t; ++ ++/** ++ * Index of a keyboard layout. ++ * ++ * The layout index is a state component which detemines which keyboard ++ * layout is active. These may be different alphabets, different key ++ * arrangements, etc. ++ * ++ * Layout indices are consecutive. The first layout has index 0. ++ * ++ * Each layout is not required to have a name, and the names are not ++ * guaranteed to be unique (though they are usually provided and unique). ++ * Therefore, it is not safe to use the name as a unique identifier for a ++ * layout. Layout names are case-sensitive. ++ * ++ * Layouts are also called "groups" by XKB. ++ * ++ * @sa xkb_keymap_num_layouts() xkb_keymap_num_layouts_for_key() ++ */ ++typedef uint32_t xkb_layout_index_t; ++/** A mask of layout indices. */ ++typedef uint32_t xkb_layout_mask_t; ++ ++/** ++ * Index of a shift level. ++ * ++ * Any key, in any layout, can have several shift levels. Each ++ * shift level can assign different keysyms to the key. The shift level ++ * to use is chosen according to the current keyboard state; for example, ++ * if no keys are pressed, the first level may be used; if the Left Shift ++ * key is pressed, the second; if Num Lock is pressed, the third; and ++ * many such combinations are possible (see xkb_mod_index_t). ++ * ++ * Level indices are consecutive. The first level has index 0. ++ */ ++typedef uint32_t xkb_level_index_t; ++ ++/** ++ * Index of a modifier. ++ * ++ * A @e modifier is a state component which changes the way keys are ++ * interpreted. A keymap defines a set of modifiers, such as Alt, Shift, ++ * Num Lock or Meta, and specifies which keys may @e activate which ++ * modifiers (in a many-to-many relationship, i.e. a key can activate ++ * several modifiers, and a modifier may be activated by several keys. ++ * Different keymaps do this differently). ++ * ++ * When retrieving the keysyms for a key, the active modifier set is ++ * consulted; this detemines the correct shift level to use within the ++ * currently active layout (see xkb_level_index_t). ++ * ++ * Modifier indices are consecutive. The first modifier has index 0. ++ * ++ * Each modifier must have a name, and the names are unique. Therefore, it ++ * is safe to use the name as a unique identifier for a modifier. The names ++ * of some common modifiers are provided in the xkbcommon/xkbcommon-names.h ++ * header file. Modifier names are case-sensitive. ++ * ++ * @sa xkb_keymap_num_mods() ++ */ ++typedef uint32_t xkb_mod_index_t; ++/** A mask of modifier indices. */ ++typedef uint32_t xkb_mod_mask_t; ++ ++/** ++ * Index of a keyboard LED. ++ * ++ * LEDs are logical objects which may be @e active or @e inactive. They ++ * typically correspond to the lights on the keyboard. Their state is ++ * determined by the current keyboard state. ++ * ++ * LED indices are non-consecutive. The first LED has index 0. ++ * ++ * Each LED must have a name, and the names are unique. Therefore, ++ * it is safe to use the name as a unique identifier for a LED. The names ++ * of some common LEDs are provided in the xkbcommon/xkbcommon-names.h ++ * header file. LED names are case-sensitive. ++ * ++ * @warning A given keymap may specify an exact index for a given LED. ++ * Therefore, LED indexing is not necessarily sequential, as opposed to ++ * modifiers and layouts. This means that when iterating over the LEDs ++ * in a keymap using e.g. xkb_keymap_num_leds(), some indices might be ++ * invalid. Given such an index, functions like xkb_keymap_led_get_name() ++ * will return NULL, and xkb_state_led_index_is_active() will return -1. ++ * ++ * LEDs are also called "indicators" by XKB. ++ * ++ * @sa xkb_keymap_num_leds() ++ */ ++typedef uint32_t xkb_led_index_t; ++/** A mask of LED indices. */ ++typedef uint32_t xkb_led_mask_t; ++ ++#define XKB_KEYCODE_INVALID (0xffffffff) ++#define XKB_LAYOUT_INVALID (0xffffffff) ++#define XKB_LEVEL_INVALID (0xffffffff) ++#define XKB_MOD_INVALID (0xffffffff) ++#define XKB_LED_INVALID (0xffffffff) ++ ++#define XKB_KEYCODE_MAX (0xffffffff - 1) ++ ++/** ++ * Test whether a value is a valid extended keycode. ++ * @sa xkb_keycode_t ++ **/ ++#define xkb_keycode_is_legal_ext(key) (key <= XKB_KEYCODE_MAX) ++ ++/** ++ * Test whether a value is a valid X11 keycode. ++ * @sa xkb_keycode_t ++ */ ++#define xkb_keycode_is_legal_x11(key) (key >= 8 && key <= 255) ++ ++/** ++ * Names to compile a keymap with, also known as RMLVO. ++ * ++ * The names are the common configuration values by which a user picks ++ * a keymap. ++ * ++ * If the entire struct is NULL, then each field is taken to be NULL. ++ * You should prefer passing NULL instead of choosing your own defaults. ++ */ ++struct xkb_rule_names { ++ /** ++ * The rules file to use. The rules file describes how to interpret ++ * the values of the model, layout, variant and options fields. ++ * ++ * If NULL or the empty string "", a default value is used. ++ * If the XKB_DEFAULT_RULES environment variable is set, it is used ++ * as the default. Otherwise the system default is used. ++ */ ++ const char *rules; ++ /** ++ * The keyboard model by which to interpret keycodes and LEDs. ++ * ++ * If NULL or the empty string "", a default value is used. ++ * If the XKB_DEFAULT_MODEL environment variable is set, it is used ++ * as the default. Otherwise the system default is used. ++ */ ++ const char *model; ++ /** ++ * A comma separated list of layouts (languages) to include in the ++ * keymap. ++ * ++ * If NULL or the empty string "", a default value is used. ++ * If the XKB_DEFAULT_LAYOUT environment variable is set, it is used ++ * as the default. Otherwise the system default is used. ++ */ ++ const char *layout; ++ /** ++ * A comma separated list of variants, one per layout, which may ++ * modify or augment the respective layout in various ways. ++ * ++ * If NULL or the empty string "", and a default value is also used ++ * for the layout, a default value is used. Otherwise no variant is ++ * used. ++ * If the XKB_DEFAULT_VARIANT environment variable is set, it is used ++ * as the default. Otherwise the system default is used. ++ */ ++ const char *variant; ++ /** ++ * A comma separated list of options, through which the user specifies ++ * non-layout related preferences, like which key combinations are used ++ * for switching layouts, or which key is the Compose key. ++ * ++ * If NULL, a default value is used. If the empty string "", no ++ * options are used. ++ * If the XKB_DEFAULT_OPTIONS environment variable is set, it is used ++ * as the default. Otherwise the system default is used. ++ */ ++ const char *options; ++}; ++ ++/** ++ * @defgroup keysyms Keysyms ++ * Utility functions related to keysyms. ++ * ++ * @{ ++ */ ++ ++/** ++ * @page keysym-transformations Keysym Transformations ++ * ++ * Keysym translation is subject to several "keysym transformations", ++ * as described in the XKB specification. These are: ++ * ++ * - Capitalization transformation. If the Caps Lock modifier is ++ * active and was not consumed by the translation process, a single ++ * keysym is transformed to its upper-case form (if applicable). ++ * Similarly, the UTF-8/UTF-32 string produced is capitalized. ++ * ++ * This is described in: ++ * http://www.x.org/releases/current/doc/kbproto/xkbproto.html#Interpreting_the_Lock_Modifier ++ * ++ * - Control transformation. If the Control modifier is active and ++ * was not consumed by the translation process, the string produced ++ * is transformed to its matching ASCII control character (if ++ * applicable). Keysyms are not affected. ++ * ++ * This is described in: ++ * http://www.x.org/releases/current/doc/kbproto/xkbproto.html#Interpreting_the_Control_Modifier ++ * ++ * Each relevant function discusses which transformations it performs. ++ * ++ * These transformations are not applicable when a key produces multiple ++ * keysyms. ++ */ ++ ++ ++/** ++ * Get the name of a keysym. ++ * ++ * For a description of how keysyms are named, see @ref xkb_keysym_t. ++ * ++ * @param[in] keysym The keysym. ++ * @param[out] buffer A string buffer to write the name into. ++ * @param[in] size Size of the buffer. ++ * ++ * @warning If the buffer passed is too small, the string is truncated ++ * (though still NUL-terminated); a size of at least 64 bytes is recommended. ++ * ++ * @returns The number of bytes in the name, excluding the NUL byte. If ++ * the keysym is invalid, returns -1. ++ * ++ * You may check if truncation has occurred by comparing the return value ++ * with the length of buffer, similarly to the snprintf(3) function. ++ * ++ * @sa xkb_keysym_t ++ */ ++int ++xkb_keysym_get_name(xkb_keysym_t keysym, char *buffer, size_t size); ++ ++/** Flags for xkb_keysym_from_name(). */ ++enum xkb_keysym_flags { ++ /** Do not apply any flags. */ ++ XKB_KEYSYM_NO_FLAGS = 0, ++ /** Find keysym by case-insensitive search. */ ++ XKB_KEYSYM_CASE_INSENSITIVE = (1 << 0) ++}; ++ ++/** ++ * Get a keysym from its name. ++ * ++ * @param name The name of a keysym. See remarks in xkb_keysym_get_name(); ++ * this function will accept any name returned by that function. ++ * @param flags A set of flags controlling how the search is done. If ++ * invalid flags are passed, this will fail with XKB_KEY_NoSymbol. ++ * ++ * If you use the XKB_KEYSYM_CASE_INSENSITIVE flag and two keysym names ++ * differ only by case, then the lower-case keysym is returned. For ++ * instance, for KEY_a and KEY_A, this function would return KEY_a for the ++ * case-insensitive search. If this functionality is needed, it is ++ * recommended to first call this function without this flag; and if that ++ * fails, only then to try with this flag, while possibly warning the user ++ * he had misspelled the name, and might get wrong results. ++ * ++ * @returns The keysym. If the name is invalid, returns XKB_KEY_NoSymbol. ++ * ++ * @sa xkb_keysym_t ++ */ ++xkb_keysym_t ++xkb_keysym_from_name(const char *name, enum xkb_keysym_flags flags); ++ ++/** ++ * Get the Unicode/UTF-8 representation of a keysym. ++ * ++ * @param[in] keysym The keysym. ++ * @param[out] buffer A buffer to write the UTF-8 string into. ++ * @param[in] size The size of buffer. Must be at least 7. ++ * ++ * @returns The number of bytes written to the buffer (including the ++ * terminating byte). If the keysym does not have a Unicode ++ * representation, returns 0. If the buffer is too small, returns -1. ++ * ++ * This function does not perform any @ref keysym-transformations. ++ * Therefore, prefer to use xkb_state_key_get_utf8() if possible. ++ * ++ * @sa xkb_state_key_get_utf8() ++ */ ++int ++xkb_keysym_to_utf8(xkb_keysym_t keysym, char *buffer, size_t size); ++ ++/** ++ * Get the Unicode/UTF-32 representation of a keysym. ++ * ++ * @returns The Unicode/UTF-32 representation of keysym, which is also ++ * compatible with UCS-4. If the keysym does not have a Unicode ++ * representation, returns 0. ++ * ++ * This function does not perform any @ref keysym-transformations. ++ * Therefore, prefer to use xkb_state_key_get_utf32() if possible. ++ * ++ * @sa xkb_state_key_get_utf32() ++ */ ++uint32_t ++xkb_keysym_to_utf32(xkb_keysym_t keysym); ++ ++/** @} */ ++ ++/** ++ * @defgroup context Library Context ++ * Creating, destroying and using library contexts. ++ * ++ * Every keymap compilation request must have a context associated with ++ * it. The context keeps around state such as the include path. ++ * ++ * @{ ++ */ ++ ++/** Flags for context creation. */ ++enum xkb_context_flags { ++ /** Do not apply any context flags. */ ++ XKB_CONTEXT_NO_FLAGS = 0, ++ /** Create this context with an empty include path. */ ++ XKB_CONTEXT_NO_DEFAULT_INCLUDES = (1 << 0), ++ /** ++ * Don't take RMLVO names from the environment. ++ * @since 0.3.0 ++ */ ++ XKB_CONTEXT_NO_ENVIRONMENT_NAMES = (1 << 1) ++}; ++ ++/** ++ * Create a new context. ++ * ++ * @param flags Optional flags for the context, or 0. ++ * ++ * @returns A new context, or NULL on failure. ++ * ++ * The user may set some environment variables to affect default values in ++ * the context. See e.g. xkb_context_set_log_level() and ++ * xkb_context_set_log_verbosity(). ++ * ++ * @memberof xkb_context ++ */ ++struct xkb_context * ++xkb_context_new(enum xkb_context_flags flags); ++ ++/** ++ * Take a new reference on a context. ++ * ++ * @returns The passed in context. ++ * ++ * @memberof xkb_context ++ */ ++struct xkb_context * ++xkb_context_ref(struct xkb_context *context); ++ ++/** ++ * Release a reference on a context, and possibly free it. ++ * ++ * @param context The context. If it is NULL, this function does nothing. ++ * ++ * @memberof xkb_context ++ */ ++void ++xkb_context_unref(struct xkb_context *context); ++ ++/** ++ * Store custom user data in the context. ++ * ++ * This may be useful in conjunction with xkb_context_set_log_fn() or other ++ * callbacks. ++ * ++ * @memberof xkb_context ++ */ ++void ++xkb_context_set_user_data(struct xkb_context *context, void *user_data); ++ ++/** ++ * Retrieves stored user data from the context. ++ * ++ * @returns The stored user data. If the user data wasn't set, or the ++ * passed in context is NULL, returns NULL. ++ * ++ * This may be useful to access private user data from callbacks like a ++ * custom logging function. ++ * ++ * @memberof xkb_context ++ **/ ++void * ++xkb_context_get_user_data(struct xkb_context *context); ++ ++/** @} */ ++ ++/** ++ * @defgroup include-path Include Paths ++ * Manipulating the include paths in a context. ++ * ++ * The include paths are the file-system paths that are searched when an ++ * include statement is encountered during keymap compilation. ++ * In most cases, the default include paths are sufficient. ++ * ++ * @{ ++ */ ++ ++/** ++ * Append a new entry to the context's include path. ++ * ++ * @returns 1 on success, or 0 if the include path could not be added or is ++ * inaccessible. ++ * ++ * @memberof xkb_context ++ */ ++int ++xkb_context_include_path_append(struct xkb_context *context, const char *path); ++ ++/** ++ * Append the default include paths to the context's include path. ++ * ++ * @returns 1 on success, or 0 if the primary include path could not be added. ++ * ++ * @memberof xkb_context ++ */ ++int ++xkb_context_include_path_append_default(struct xkb_context *context); ++ ++/** ++ * Reset the context's include path to the default. ++ * ++ * Removes all entries from the context's include path, and inserts the ++ * default paths. ++ * ++ * @returns 1 on success, or 0 if the primary include path could not be added. ++ * ++ * @memberof xkb_context ++ */ ++int ++xkb_context_include_path_reset_defaults(struct xkb_context *context); ++ ++/** ++ * Remove all entries from the context's include path. ++ * ++ * @memberof xkb_context ++ */ ++void ++xkb_context_include_path_clear(struct xkb_context *context); ++ ++/** ++ * Get the number of paths in the context's include path. ++ * ++ * @memberof xkb_context ++ */ ++unsigned int ++xkb_context_num_include_paths(struct xkb_context *context); ++ ++/** ++ * Get a specific include path from the context's include path. ++ * ++ * @returns The include path at the specified index. If the index is ++ * invalid, returns NULL. ++ * ++ * @memberof xkb_context ++ */ ++const char * ++xkb_context_include_path_get(struct xkb_context *context, unsigned int index); ++ ++/** @} */ ++ ++/** ++ * @defgroup logging Logging Handling ++ * Manipulating how logging from this library is handled. ++ * ++ * @{ ++ */ ++ ++/** Specifies a logging level. */ ++enum xkb_log_level { ++ XKB_LOG_LEVEL_CRITICAL = 10, /**< Log critical internal errors only. */ ++ XKB_LOG_LEVEL_ERROR = 20, /**< Log all errors. */ ++ XKB_LOG_LEVEL_WARNING = 30, /**< Log warnings and errors. */ ++ XKB_LOG_LEVEL_INFO = 40, /**< Log information, warnings, and errors. */ ++ XKB_LOG_LEVEL_DEBUG = 50 /**< Log everything. */ ++}; ++ ++/** ++ * Set the current logging level. ++ * ++ * @param context The context in which to set the logging level. ++ * @param level The logging level to use. Only messages from this level ++ * and below will be logged. ++ * ++ * The default level is XKB_LOG_LEVEL_ERROR. The environment variable ++ * XKB_LOG_LEVEL, if set in the time the context was created, overrides the ++ * default value. It may be specified as a level number or name. ++ * ++ * @memberof xkb_context ++ */ ++void ++xkb_context_set_log_level(struct xkb_context *context, ++ enum xkb_log_level level); ++ ++/** ++ * Get the current logging level. ++ * ++ * @memberof xkb_context ++ */ ++enum xkb_log_level ++xkb_context_get_log_level(struct xkb_context *context); ++ ++/** ++ * Sets the current logging verbosity. ++ * ++ * The library can generate a number of warnings which are not helpful to ++ * ordinary users of the library. The verbosity may be increased if more ++ * information is desired (e.g. when developing a new keymap). ++ * ++ * The default verbosity is 0. The environment variable XKB_LOG_VERBOSITY, ++ * if set in the time the context was created, overrides the default value. ++ * ++ * @param context The context in which to use the set verbosity. ++ * @param verbosity The verbosity to use. Currently used values are ++ * 1 to 10, higher values being more verbose. 0 would result in no verbose ++ * messages being logged. ++ * ++ * Most verbose messages are of level XKB_LOG_LEVEL_WARNING or lower. ++ * ++ * @memberof xkb_context ++ */ ++void ++xkb_context_set_log_verbosity(struct xkb_context *context, int verbosity); ++ ++/** ++ * Get the current logging verbosity of the context. ++ * ++ * @memberof xkb_context ++ */ ++int ++xkb_context_get_log_verbosity(struct xkb_context *context); ++ ++/** ++ * Set a custom function to handle logging messages. ++ * ++ * @param context The context in which to use the set logging function. ++ * @param log_fn The function that will be called for logging messages. ++ * Passing NULL restores the default function, which logs to stderr. ++ * ++ * By default, log messages from this library are printed to stderr. This ++ * function allows you to replace the default behavior with a custom ++ * handler. The handler is only called with messages which match the ++ * current logging level and verbosity settings for the context. ++ * level is the logging level of the message. @a format and @a args are ++ * the same as in the vprintf(3) function. ++ * ++ * You may use xkb_context_set_user_data() on the context, and then call ++ * xkb_context_get_user_data() from within the logging function to provide ++ * it with additional private context. ++ * ++ * @memberof xkb_context ++ */ ++void ++xkb_context_set_log_fn(struct xkb_context *context, ++ void (*log_fn)(struct xkb_context *context, ++ enum xkb_log_level level, ++ const char *format, va_list args)); ++ ++/** @} */ ++ ++/** ++ * @defgroup keymap Keymap Creation ++ * Creating and destroying keymaps. ++ * ++ * @{ ++ */ ++ ++/** Flags for keymap compilation. */ ++enum xkb_keymap_compile_flags { ++ /** Do not apply any flags. */ ++ XKB_KEYMAP_COMPILE_NO_FLAGS = 0 ++}; ++ ++/** ++ * Create a keymap from RMLVO names. ++ * ++ * The primary keymap entry point: creates a new XKB keymap from a set of ++ * RMLVO (Rules + Model + Layouts + Variants + Options) names. ++ * ++ * @param context The context in which to create the keymap. ++ * @param names The RMLVO names to use. See xkb_rule_names. ++ * @param flags Optional flags for the keymap, or 0. ++ * ++ * @returns A keymap compiled according to the RMLVO names, or NULL if ++ * the compilation failed. ++ * ++ * @sa xkb_rule_names ++ * @memberof xkb_keymap ++ */ ++struct xkb_keymap * ++xkb_keymap_new_from_names(struct xkb_context *context, ++ const struct xkb_rule_names *names, ++ enum xkb_keymap_compile_flags flags); ++ ++/** The possible keymap formats. */ ++enum xkb_keymap_format { ++ /** The current/classic XKB text format, as generated by xkbcomp -xkb. */ ++ XKB_KEYMAP_FORMAT_TEXT_V1 = 1 ++}; ++ ++/** ++ * Create a keymap from a keymap file. ++ * ++ * @param context The context in which to create the keymap. ++ * @param file The keymap file to compile. ++ * @param format The text format of the keymap file to compile. ++ * @param flags Optional flags for the keymap, or 0. ++ * ++ * @returns A keymap compiled from the given XKB keymap file, or NULL if ++ * the compilation failed. ++ * ++ * The file must contain a complete keymap. For example, in the ++ * XKB_KEYMAP_FORMAT_TEXT_V1 format, this means the file must contain one ++ * top level '%xkb_keymap' section, which in turn contains other required ++ * sections. ++ * ++ * @memberof xkb_keymap ++ */ ++struct xkb_keymap * ++xkb_keymap_new_from_file(struct xkb_context *context, FILE *file, ++ enum xkb_keymap_format format, ++ enum xkb_keymap_compile_flags flags); ++ ++/** ++ * Create a keymap from a keymap string. ++ * ++ * This is just like xkb_keymap_new_from_file(), but instead of a file, gets ++ * the keymap as one enormous string. ++ * ++ * @see xkb_keymap_new_from_file() ++ * @memberof xkb_keymap ++ */ ++struct xkb_keymap * ++xkb_keymap_new_from_string(struct xkb_context *context, const char *string, ++ enum xkb_keymap_format format, ++ enum xkb_keymap_compile_flags flags); ++ ++/** ++ * Create a keymap from a memory buffer. ++ * ++ * This is just like xkb_keymap_new_from_string(), but takes a length argument ++ * so the input string does not have to be zero-terminated. ++ * ++ * @see xkb_keymap_new_from_string() ++ * @memberof xkb_keymap ++ * @since 0.3.0 ++ */ ++struct xkb_keymap * ++xkb_keymap_new_from_buffer(struct xkb_context *context, const char *buffer, ++ size_t length, enum xkb_keymap_format format, ++ enum xkb_keymap_compile_flags flags); ++ ++/** ++ * Take a new reference on a keymap. ++ * ++ * @returns The passed in keymap. ++ * ++ * @memberof xkb_keymap ++ */ ++struct xkb_keymap * ++xkb_keymap_ref(struct xkb_keymap *keymap); ++ ++/** ++ * Release a reference on a keymap, and possibly free it. ++ * ++ * @param keymap The keymap. If it is NULL, this function does nothing. ++ * ++ * @memberof xkb_keymap ++ */ ++void ++xkb_keymap_unref(struct xkb_keymap *keymap); ++ ++/** ++ * Get the keymap as a string in the format from which it was created. ++ * @sa xkb_keymap_get_as_string() ++ **/ ++#define XKB_KEYMAP_USE_ORIGINAL_FORMAT ((enum xkb_keymap_format) -1) ++ ++/** ++ * Get the compiled keymap as a string. ++ * ++ * @param keymap The keymap to get as a string. ++ * @param format The keymap format to use for the string. You can pass ++ * in the special value XKB_KEYMAP_USE_ORIGINAL_FORMAT to use the format ++ * from which the keymap was originally created. ++ * ++ * @returns The keymap as a NUL-terminated string, or NULL if unsuccessful. ++ * ++ * The returned string may be fed back into xkb_map_new_from_string() to get ++ * the exact same keymap (possibly in another process, etc.). ++ * ++ * The returned string is dynamically allocated and should be freed by the ++ * caller. ++ * ++ * @memberof xkb_keymap ++ */ ++char * ++xkb_keymap_get_as_string(struct xkb_keymap *keymap, ++ enum xkb_keymap_format format); ++ ++/** @} */ ++ ++/** ++ * @defgroup components Keymap Components ++ * Enumeration of state components in a keymap. ++ * ++ * @{ ++ */ ++ ++/** ++ * Get the minimum keycode in the keymap. ++ * ++ * @sa xkb_keycode_t ++ * @memberof xkb_keymap ++ * @since 0.3.1 ++ */ ++xkb_keycode_t ++xkb_keymap_min_keycode(struct xkb_keymap *keymap); ++ ++/** ++ * Get the maximum keycode in the keymap. ++ * ++ * @sa xkb_keycode_t ++ * @memberof xkb_keymap ++ * @since 0.3.1 ++ */ ++xkb_keycode_t ++xkb_keymap_max_keycode(struct xkb_keymap *keymap); ++ ++/** ++ * The iterator used by xkb_keymap_key_for_each(). ++ * ++ * @sa xkb_keymap_key_for_each ++ * @memberof xkb_keymap ++ * @since 0.3.1 ++ */ ++typedef void ++(*xkb_keymap_key_iter_t)(struct xkb_keymap *keymap, xkb_keycode_t key, ++ void *data); ++ ++/** ++ * Run a specified function for every valid keycode in the keymap. If a ++ * keymap is sparse, this function may be called fewer than ++ * (max_keycode - min_keycode + 1) times. ++ * ++ * @sa xkb_keymap_min_keycode() xkb_keymap_max_keycode() xkb_keycode_t ++ * @memberof xkb_keymap ++ * @since 0.3.1 ++ */ ++void ++xkb_keymap_key_for_each(struct xkb_keymap *keymap, xkb_keymap_key_iter_t iter, ++ void *data); ++ ++/** ++ * Get the number of modifiers in the keymap. ++ * ++ * @sa xkb_mod_index_t ++ * @memberof xkb_keymap ++ */ ++xkb_mod_index_t ++xkb_keymap_num_mods(struct xkb_keymap *keymap); ++ ++/** ++ * Get the name of a modifier by index. ++ * ++ * @returns The name. If the index is invalid, returns NULL. ++ * ++ * @sa xkb_mod_index_t ++ * @memberof xkb_keymap ++ */ ++const char * ++xkb_keymap_mod_get_name(struct xkb_keymap *keymap, xkb_mod_index_t idx); ++ ++/** ++ * Get the index of a modifier by name. ++ * ++ * @returns The index. If no modifier with this name exists, returns ++ * XKB_MOD_INVALID. ++ * ++ * @sa xkb_mod_index_t ++ * @memberof xkb_keymap ++ */ ++xkb_mod_index_t ++xkb_keymap_mod_get_index(struct xkb_keymap *keymap, const char *name); ++ ++/** ++ * Get the number of layouts in the keymap. ++ * ++ * @sa xkb_layout_index_t xkb_rule_names xkb_keymap_num_layouts_for_key() ++ * @memberof xkb_keymap ++ */ ++xkb_layout_index_t ++xkb_keymap_num_layouts(struct xkb_keymap *keymap); ++ ++/** ++ * Get the name of a layout by index. ++ * ++ * @returns The name. If the index is invalid, or the layout does not have ++ * a name, returns NULL. ++ * ++ * @sa xkb_layout_index_t ++ * @memberof xkb_keymap ++ */ ++const char * ++xkb_keymap_layout_get_name(struct xkb_keymap *keymap, xkb_layout_index_t idx); ++ ++/** ++ * Get the index of a layout by name. ++ * ++ * @returns The index. If no layout exists with this name, returns ++ * XKB_LAYOUT_INVALID. If more than one layout in the keymap has this name, ++ * returns the lowest index among them. ++ * ++ * @memberof xkb_keymap ++ */ ++xkb_layout_index_t ++xkb_keymap_layout_get_index(struct xkb_keymap *keymap, const char *name); ++ ++/** ++ * Get the number of LEDs in the keymap. ++ * ++ * @warning The range [ 0...xkb_keymap_num_leds() ) includes all of the LEDs ++ * in the keymap, but may also contain inactive LEDs. When iterating over ++ * this range, you need the handle this case when calling functions such as ++ * xkb_keymap_led_get_name() or xkb_state_led_index_is_active(). ++ * ++ * @sa xkb_led_index_t ++ * @memberof xkb_keymap ++ */ ++xkb_led_index_t ++xkb_keymap_num_leds(struct xkb_keymap *keymap); ++ ++/** ++ * Get the name of a LED by index. ++ * ++ * @returns The name. If the index is invalid, returns NULL. ++ * ++ * @memberof xkb_keymap ++ */ ++const char * ++xkb_keymap_led_get_name(struct xkb_keymap *keymap, xkb_led_index_t idx); ++ ++/** ++ * Get the index of a LED by name. ++ * ++ * @returns The index. If no LED with this name exists, returns ++ * XKB_LED_INVALID. ++ * ++ * @memberof xkb_keymap ++ */ ++xkb_led_index_t ++xkb_keymap_led_get_index(struct xkb_keymap *keymap, const char *name); ++ ++/** ++ * Get the number of layouts for a specific key. ++ * ++ * This number can be different from xkb_keymap_num_layouts(), but is always ++ * smaller. It is the appropriate value to use when iterating over the ++ * layouts of a key. ++ * ++ * @sa xkb_layout_index_t ++ * @memberof xkb_keymap ++ */ ++xkb_layout_index_t ++xkb_keymap_num_layouts_for_key(struct xkb_keymap *keymap, xkb_keycode_t key); ++ ++/** ++ * Get the number of shift levels for a specific key and layout. ++ * ++ * If @c layout is out of range for this key (that is, larger or equal to ++ * the value returned by xkb_keymap_num_layouts_for_key()), it is brought ++ * back into range in a manner consistent with xkb_state_key_get_layout(). ++ * ++ * @sa xkb_level_index_t ++ * @memberof xkb_keymap ++ */ ++xkb_level_index_t ++xkb_keymap_num_levels_for_key(struct xkb_keymap *keymap, xkb_keycode_t key, ++ xkb_layout_index_t layout); ++ ++/** ++ * Get the keysyms obtained from pressing a key in a given layout and ++ * shift level. ++ * ++ * This function is like xkb_state_key_get_syms(), only the layout and ++ * shift level are not derived from the keyboard state but are instead ++ * specified explicitly. ++ * ++ * @param[in] keymap The keymap. ++ * @param[in] key The keycode of the key. ++ * @param[in] layout The layout for which to get the keysyms. ++ * @param[in] level The shift level in the layout for which to get the ++ * keysyms. This must be smaller than: ++ * @code xkb_keymap_num_levels_for_key(keymap, key) @endcode ++ * @param[out] syms_out An immutable array of keysyms corresponding to the ++ * key in the given layout and shift level. ++ * ++ * If @c layout is out of range for this key (that is, larger or equal to ++ * the value returned by xkb_keymap_num_layouts_for_key()), it is brought ++ * back into range in a manner consistent with xkb_state_key_get_layout(). ++ * ++ * @returns The number of keysyms in the syms_out array. If no keysyms ++ * are produced by the key in the given layout and shift level, returns 0 ++ * and sets syms_out to NULL. ++ * ++ * @sa xkb_state_key_get_syms() ++ * @memberof xkb_keymap ++ */ ++int ++xkb_keymap_key_get_syms_by_level(struct xkb_keymap *keymap, ++ xkb_keycode_t key, ++ xkb_layout_index_t layout, ++ xkb_level_index_t level, ++ const xkb_keysym_t **syms_out); ++ ++/** ++ * Determine whether a key should repeat or not. ++ * ++ * A keymap may specify different repeat behaviors for different keys. ++ * Most keys should generally exhibit repeat behavior; for example, holding ++ * the 'a' key down in a text editor should normally insert a single 'a' ++ * character every few milliseconds, until the key is released. However, ++ * there are keys which should not or do not need to be repeated. For ++ * example, repeating modifier keys such as Left/Right Shift or Caps Lock ++ * is not generally useful or desired. ++ * ++ * @returns 1 if the key should repeat, 0 otherwise. ++ * ++ * @memberof xkb_keymap ++ */ ++int ++xkb_keymap_key_repeats(struct xkb_keymap *keymap, xkb_keycode_t key); ++ ++/** @} */ ++ ++/** ++ * @defgroup state Keyboard State ++ * Creating, destroying and manipulating keyboard state objects. ++ * ++ * @{ ++ */ ++ ++/** ++ * Create a new keyboard state object. ++ * ++ * @param keymap The keymap which the state will use. ++ * ++ * @returns A new keyboard state object, or NULL on failure. ++ * ++ * @memberof xkb_state ++ */ ++struct xkb_state * ++xkb_state_new(struct xkb_keymap *keymap); ++ ++/** ++ * Take a new reference on a keyboard state object. ++ * ++ * @returns The passed in object. ++ * ++ * @memberof xkb_state ++ */ ++struct xkb_state * ++xkb_state_ref(struct xkb_state *state); ++ ++/** ++ * Release a reference on a keybaord state object, and possibly free it. ++ * ++ * @param state The state. If it is NULL, this function does nothing. ++ * ++ * @memberof xkb_state ++ */ ++void ++xkb_state_unref(struct xkb_state *state); ++ ++/** ++ * Get the keymap which a keyboard state object is using. ++ * ++ * @returns The keymap which was passed to xkb_state_new() when creating ++ * this state object. ++ * ++ * This function does not take a new reference on the keymap; you must ++ * explicitly reference it yourself if you plan to use it beyond the ++ * lifetime of the state. ++ * ++ * @memberof xkb_state ++ */ ++struct xkb_keymap * ++xkb_state_get_keymap(struct xkb_state *state); ++ ++/** Specifies the direction of the key (press / release). */ ++enum xkb_key_direction { ++ XKB_KEY_UP, /**< The key was released. */ ++ XKB_KEY_DOWN /**< The key was pressed. */ ++}; ++ ++/** ++ * Modifier and layout types for state objects. This enum is bitmaskable, ++ * e.g. (XKB_STATE_MODS_DEPRESSED | XKB_STATE_MODS_LATCHED) is valid to ++ * exclude locked modifiers. ++ * ++ * In XKB, the DEPRESSED components are also known as 'base'. ++ */ ++enum xkb_state_component { ++ /** Depressed modifiers, i.e. a key is physically holding them. */ ++ XKB_STATE_MODS_DEPRESSED = (1 << 0), ++ /** Latched modifiers, i.e. will be unset after the next non-modifier ++ * key press. */ ++ XKB_STATE_MODS_LATCHED = (1 << 1), ++ /** Locked modifiers, i.e. will be unset after the key provoking the ++ * lock has been pressed again. */ ++ XKB_STATE_MODS_LOCKED = (1 << 2), ++ /** Effective modifiers, i.e. currently active and affect key ++ * processing (derived from the other state components). ++ * Use this unless you explictly care how the state came about. */ ++ XKB_STATE_MODS_EFFECTIVE = (1 << 3), ++ /** Depressed layout, i.e. a key is physically holding it. */ ++ XKB_STATE_LAYOUT_DEPRESSED = (1 << 4), ++ /** Latched layout, i.e. will be unset after the next non-modifier ++ * key press. */ ++ XKB_STATE_LAYOUT_LATCHED = (1 << 5), ++ /** Locked layout, i.e. will be unset after the key provoking the lock ++ * has been pressed again. */ ++ XKB_STATE_LAYOUT_LOCKED = (1 << 6), ++ /** Effective layout, i.e. currently active and affects key processing ++ * (derived from the other state components). ++ * Use this unless you explictly care how the state came about. */ ++ XKB_STATE_LAYOUT_EFFECTIVE = (1 << 7), ++ /** LEDs (derived from the other state components). */ ++ XKB_STATE_LEDS = (1 << 8) ++}; ++ ++/** ++ * Update the keyboard state to reflect a given key being pressed or ++ * released. ++ * ++ * This entry point is intended for programs which track the keyboard state ++ * explictly (like an evdev client). If the state is serialized to you by ++ * a master process (like a Wayland compositor) using functions like ++ * xkb_state_serialize_mods(), you should use xkb_state_update_mask() instead. ++ * The two functins should not generally be used together. ++ * ++ * A series of calls to this function should be consistent; that is, a call ++ * with XKB_KEY_DOWN for a key should be matched by an XKB_KEY_UP; if a key ++ * is pressed twice, it should be released twice; etc. Otherwise (e.g. due ++ * to missed input events), situations like "stuck modifiers" may occur. ++ * ++ * This function is often used in conjunction with the function ++ * xkb_state_key_get_syms() (or xkb_state_key_get_one_sym()), for example, ++ * when handling a key event. In this case, you should prefer to get the ++ * keysyms *before* updating the key, such that the keysyms reported for ++ * the key event are not affected by the event itself. This is the ++ * conventional behavior. ++ * ++ * @returns A mask of state components that have changed as a result of ++ * the update. If nothing in the state has changed, returns 0. ++ * ++ * @memberof xkb_state ++ * ++ * @sa xkb_state_update_mask() ++ */ ++enum xkb_state_component ++xkb_state_update_key(struct xkb_state *state, xkb_keycode_t key, ++ enum xkb_key_direction direction); ++ ++/** ++ * Update a keyboard state from a set of explicit masks. ++ * ++ * This entry point is intended for window systems and the like, where a ++ * master process holds an xkb_state, then serializes it over a wire ++ * protocol, and clients then use the serialization to feed in to their own ++ * xkb_state. ++ * ++ * All parameters must always be passed, or the resulting state may be ++ * incoherent. ++ * ++ * The serialization is lossy and will not survive round trips; it must only ++ * be used to feed slave state objects, and must not be used to update the ++ * master state. ++ * ++ * If you do not fit the description above, you should use ++ * xkb_state_update_key() instead. The two functions should not generally be ++ * used together. ++ * ++ * @returns A mask of state components that have changed as a result of ++ * the update. If nothing in the state has changed, returns 0. ++ * ++ * @memberof xkb_state ++ * ++ * @sa xkb_state_component ++ * @sa xkb_state_update_key ++ */ ++enum xkb_state_component ++xkb_state_update_mask(struct xkb_state *state, ++ xkb_mod_mask_t depressed_mods, ++ xkb_mod_mask_t latched_mods, ++ xkb_mod_mask_t locked_mods, ++ xkb_layout_index_t depressed_layout, ++ xkb_layout_index_t latched_layout, ++ xkb_layout_index_t locked_layout); ++ ++/** ++ * Get the keysyms obtained from pressing a particular key in a given ++ * keyboard state. ++ * ++ * Get the keysyms for a key according to the current active layout, ++ * modifiers and shift level for the key, as determined by a keyboard ++ * state. ++ * ++ * @param[in] state The keyboard state object. ++ * @param[in] key The keycode of the key. ++ * @param[out] syms_out An immutable array of keysyms corresponding the ++ * key in the given keyboard state. ++ * ++ * As an extension to XKB, this function can return more than one keysym. ++ * If you do not want to handle this case, you can use ++ * xkb_state_key_get_one_sym() for a simpler interface. ++ * ++ * This function does not perform any @ref keysym-transformations. ++ * (This might change). ++ * ++ * @returns The number of keysyms in the syms_out array. If no keysyms ++ * are produced by the key in the given keyboard state, returns 0 and sets ++ * syms_out to NULL. ++ * ++ * @memberof xkb_state ++ */ ++int ++xkb_state_key_get_syms(struct xkb_state *state, xkb_keycode_t key, ++ const xkb_keysym_t **syms_out); ++ ++/** ++ * Get the Unicode/UTF-8 string obtained from pressing a particular key ++ * in a given keyboard state. ++ * ++ * @param[in] state The keyboard state object. ++ * @param[in] key The keycode of the key. ++ * @param[out] buffer A buffer to write the string into. ++ * @param[in] size Size of the buffer. ++ * ++ * @warning If the buffer passed is too small, the string is truncated ++ * (though still NUL-terminated). ++ * ++ * @returns The number of bytes required for the string, excluding the ++ * NUL byte. If there is nothing to write, returns 0. ++ * ++ * You may check if truncation has occurred by comparing the return value ++ * with the size of @p buffer, similarly to the snprintf(3) function. ++ * You may safely pass NULL and 0 to @p buffer and @p size to find the ++ * required size (without the NUL-byte). ++ * ++ * This function performs Capitalization and Control @ref ++ * keysym-transformations. ++ * ++ * @memberof xkb_state ++ * @since 0.4.1 ++ */ ++int ++xkb_state_key_get_utf8(struct xkb_state *state, xkb_keycode_t key, ++ char *buffer, size_t size); ++ ++/** ++ * Get the Unicode/UTF-32 codepoint obtained from pressing a particular ++ * key in a a given keyboard state. ++ * ++ * @returns The UTF-32 representation for the key, if it consists of only ++ * a single codepoint. Otherwise, returns 0. ++ * ++ * This function performs Capitalization and Control @ref ++ * keysym-transformations. ++ * ++ * @memberof xkb_state ++ * @since 0.4.1 ++ */ ++uint32_t ++xkb_state_key_get_utf32(struct xkb_state *state, xkb_keycode_t key); ++ ++/** ++ * Get the single keysym obtained from pressing a particular key in a ++ * given keyboard state. ++ * ++ * This function is similar to xkb_state_key_get_syms(), but intended ++ * for users which cannot or do not want to handle the case where ++ * multiple keysyms are returned (in which case this function is ++ * preferred). ++ * ++ * @returns The keysym. If the key does not have exactly one keysym, ++ * returns XKB_KEY_NoSymbol ++ * ++ * This function performs Capitalization @ref keysym-transformations. ++ * ++ * @sa xkb_state_key_get_syms() ++ * @memberof xkb_state ++ */ ++xkb_keysym_t ++xkb_state_key_get_one_sym(struct xkb_state *state, xkb_keycode_t key); ++ ++/** ++ * Get the effective layout index for a key in a given keyboard state. ++ * ++ * @returns The layout index for the key in the given keyboard state. If ++ * the given keycode is invalid, or if the key is not included in any ++ * layout at all, returns XKB_LAYOUT_INVALID. ++ * ++ * @invariant If the returned layout is valid, the following always holds: ++ * @code ++ * xkb_state_key_get_layout(state, key) < xkb_keymap_num_layouts_for_key(keymap, key) ++ * @endcode ++ * ++ * @memberof xkb_state ++ */ ++xkb_layout_index_t ++xkb_state_key_get_layout(struct xkb_state *state, xkb_keycode_t key); ++ ++/** ++ * Get the effective shift level for a key in a given keyboard state and ++ * layout. ++ * ++ * @param state The keyboard state. ++ * @param key The keycode of the key. ++ * @param layout The layout for which to get the shift level. This must be ++ * smaller than: ++ * @code xkb_keymap_num_layouts_for_key(keymap, key) @endcode ++ * usually it would be: ++ * @code xkb_state_key_get_layout(state, key) @endcode ++ * ++ * @return The shift level index. If the key or layout are invalid, ++ * returns XKB_LEVEL_INVALID. ++ * ++ * @invariant If the returned level is valid, the following always holds: ++ * @code ++ * xkb_state_key_get_level(state, key, layout) < xkb_keymap_num_levels_for_key(keymap, key, layout) ++ * @endcode ++ * ++ * @memberof xkb_state ++ */ ++xkb_level_index_t ++xkb_state_key_get_level(struct xkb_state *state, xkb_keycode_t key, ++ xkb_layout_index_t layout); ++ ++/** ++ * Match flags for xkb_state_mod_indices_are_active() and ++ * xkb_state_mod_names_are_active(), specifying the conditions for a ++ * successful match. XKB_STATE_MATCH_NON_EXCLUSIVE is bitmaskable with ++ * the other modes. ++ */ ++enum xkb_state_match { ++ /** Returns true if any of the modifiers are active. */ ++ XKB_STATE_MATCH_ANY = (1 << 0), ++ /** Returns true if all of the modifiers are active. */ ++ XKB_STATE_MATCH_ALL = (1 << 1), ++ /** Makes matching non-exclusive, i.e. will not return false if a ++ * modifier not specified in the arguments is active. */ ++ XKB_STATE_MATCH_NON_EXCLUSIVE = (1 << 16) ++}; ++ ++/** ++ * The counterpart to xkb_state_update_mask for modifiers, to be used on ++ * the server side of serialization. ++ * ++ * @param state The keyboard state. ++ * @param components A mask of the modifier state components to serialize. ++ * State components other than XKB_STATE_MODS_* are ignored. ++ * If XKB_STATE_MODS_EFFECTIVE is included, all other state components are ++ * ignored. ++ * ++ * @returns A xkb_mod_mask_t representing the given components of the ++ * modifier state. ++ * ++ * This function should not be used in regular clients; please use the ++ * xkb_state_mod_*_is_active API instead. ++ * ++ * @memberof xkb_state ++ */ ++xkb_mod_mask_t ++xkb_state_serialize_mods(struct xkb_state *state, ++ enum xkb_state_component components); ++ ++/** ++ * The counterpart to xkb_state_update_mask for layouts, to be used on ++ * the server side of serialization. ++ * ++ * @param state The keyboard state. ++ * @param components A mask of the layout state components to serialize. ++ * State components other than XKB_STATE_LAYOUT_* are ignored. ++ * If XKB_STATE_LAYOUT_EFFECTIVE is included, all other state components are ++ * ignored. ++ * ++ * @returns A layout index representing the given components of the ++ * layout state. ++ * ++ * This function should not be used in regular clients; please use the ++ * xkb_state_layout_*_is_active API instead. ++ * ++ * @memberof xkb_state ++ */ ++xkb_layout_index_t ++xkb_state_serialize_layout(struct xkb_state *state, ++ enum xkb_state_component components); ++ ++/** ++ * Test whether a modifier is active in a given keyboard state by name. ++ * ++ * @returns 1 if the modifier is active, 0 if it is not. If the modifier ++ * name does not exist in the keymap, returns -1. ++ * ++ * @memberof xkb_state ++ */ ++int ++xkb_state_mod_name_is_active(struct xkb_state *state, const char *name, ++ enum xkb_state_component type); ++ ++/** ++ * Test whether a set of modifiers are active in a given keyboard state by ++ * name. ++ * ++ * @param state The keyboard state. ++ * @param type The component of the state against which to match the ++ * given modifiers. ++ * @param match The manner by which to match the state against the ++ * given modifiers. ++ * @param ... The set of of modifier names to test, terminated by a NULL ++ * argument (sentinel). ++ * ++ * @returns 1 if the modifiers are active, 0 if they are not. If any of ++ * the modifier names do not exist in the keymap, returns -1. ++ * ++ * @memberof xkb_state ++ */ ++int ++xkb_state_mod_names_are_active(struct xkb_state *state, ++ enum xkb_state_component type, ++ enum xkb_state_match match, ++ ...); ++ ++/** ++ * Test whether a modifier is active in a given keyboard state by index. ++ * ++ * @returns 1 if the modifier is active, 0 if it is not. If the modifier ++ * index is invalid in the keymap, returns -1. ++ * ++ * @memberof xkb_state ++ */ ++int ++xkb_state_mod_index_is_active(struct xkb_state *state, xkb_mod_index_t idx, ++ enum xkb_state_component type); ++ ++/** ++ * Test whether a set of modifiers are active in a given keyboard state by ++ * index. ++ * ++ * @param state The keyboard state. ++ * @param type The component of the state against which to match the ++ * given modifiers. ++ * @param match The manner by which to match the state against the ++ * given modifiers. ++ * @param ... The set of of modifier indices to test, terminated by a ++ * XKB_MOD_INVALID argument (sentinel). ++ * ++ * @returns 1 if the modifiers are active, 0 if they are not. If any of ++ * the modifier indices are invalid in the keymap, returns -1. ++ * ++ * @memberof xkb_state ++ */ ++int ++xkb_state_mod_indices_are_active(struct xkb_state *state, ++ enum xkb_state_component type, ++ enum xkb_state_match match, ++ ...); ++ ++/** ++ * @page consumed-modifiers Consumed Modifiers ++ * @parblock ++ * ++ * Some functions, like xkb_state_key_get_syms(), look at the state of ++ * the modifiers in the keymap and derive from it the correct shift level ++ * to use for the key. For example, in a US layout, pressing the key ++ * labeled \ while the Shift modifier is active, generates the keysym ++ * 'A'. In this case, the Shift modifier is said to be "consumed". ++ * However, the Num Lock modifier does not affect this translation at all, ++ * even if it is active, so it is not consumed by this translation. ++ * ++ * It may be desirable for some application to not reuse consumed modifiers ++ * for further processing, e.g. for hotkeys or keyboard shortcuts. To ++ * understand why, consider some requirements from a standard shortcut ++ * mechanism, and how they are implemented: ++ * ++ * 1. The shortcut's modifiers must match exactly to the state. For ++ * example, it is possible to bind separate actions to \\ ++ * and to \\\. Further, if only \\ is ++ * bound to an action, pressing \\\ should not ++ * trigger the shortcut. ++ * Effectively, this means that the modifiers are compared using the ++ * equality operator (==). ++ * ++ * 2. Only relevant modifiers are considered for the matching. For example, ++ * Caps Lock and Num Lock should not generally affect the matching, e.g. ++ * when matching \\ against the state, it does not matter ++ * whether Num Lock is active or not. These relevant, or "significant", ++ * modifiers usually include Alt, Control, Shift, Super and similar. ++ * Effectively, this means that non-significant modifiers are masked out, ++ * before doing the comparison as described above. ++ * ++ * 3. The matching must be independent of the layout/keymap. For example, ++ * the \ (+) symbol is found on the first level on some layouts, ++ * but requires holding Shift on others. If you simply bind the action ++ * to the \ keysym, it would work for the unshifted kind, but ++ * not for the others, because the match against Shift would fail. If ++ * you bind the action to \\, only the shifted kind would ++ * work. So what is needed is to recognize that Shift is used up in the ++ * translation of the keysym itself, and therefore should not be included ++ * in the matching. ++ * Effectively, this means that consumed modifiers (Shift in this example) ++ * are masked out as well, before doing the comparison. ++ * ++ * In summary, this is how the matching would be performed: ++ * @code ++ * (keysym == shortcut_keysym) && ++ * ((state_mods & ~consumed_mods & significant_mods) == shortcut_mods) ++ * @endcode ++ * ++ * @c state_mods are the modifiers reported by ++ * xkb_state_mod_index_is_active() and similar functions. ++ * @c consumed_mods are the modifiers reported by ++ * xkb_state_mod_index_is_consumed() and similar functions. ++ * @c significant_mods are decided upon by the application/toolkit/user; ++ * it is up to them to decide whether these are configurable or hard-coded. ++ * ++ * @endparblock ++ */ ++ ++/** ++ * Test whether a modifier is consumed by keyboard state translation for ++ * a key. ++ * ++ * @returns 1 if the modifier is consumed, 0 if it is not. If the modifier ++ * index is not valid in the keymap, returns -1. ++ * ++ * @sa xkb_state_mod_mask_remove_consumed() ++ * @sa xkb_state_key_get_consumed_mods() ++ * @memberof xkb_state ++ */ ++int ++xkb_state_mod_index_is_consumed(struct xkb_state *state, xkb_keycode_t key, ++ xkb_mod_index_t idx); ++ ++/** ++ * Remove consumed modifiers from a modifier mask for a key. ++ * ++ * Takes the given modifier mask, and removes all modifiers which are ++ * consumed for that particular key (as in xkb_state_mod_index_is_consumed()). ++ * ++ * @sa xkb_state_mod_index_is_consumed() ++ * @memberof xkb_state ++ */ ++xkb_mod_mask_t ++xkb_state_mod_mask_remove_consumed(struct xkb_state *state, xkb_keycode_t key, ++ xkb_mod_mask_t mask); ++ ++/** ++ * Get the mask of modifiers consumed by translating a given key. ++ * ++ * @returns a mask of the consumed modifiers. ++ * ++ * @sa xkb_state_mod_index_is_consumed() ++ * @memberof xkb_state ++ * @since 0.4.1 ++ */ ++xkb_mod_mask_t ++xkb_state_key_get_consumed_mods(struct xkb_state *state, xkb_keycode_t key); ++ ++/** ++ * Test whether a layout is active in a given keyboard state by name. ++ * ++ * @returns 1 if the layout is active, 0 if it is not. If no layout with ++ * this name exists in the keymap, return -1. ++ * ++ * If multiple layouts in the keymap have this name, the one with the lowest ++ * index is tested. ++ * ++ * @sa xkb_layout_index_t ++ * @memberof xkb_state ++ */ ++int ++xkb_state_layout_name_is_active(struct xkb_state *state, const char *name, ++ enum xkb_state_component type); ++ ++/** ++ * Test whether a layout is active in a given keyboard state by index. ++ * ++ * @returns 1 if the layout is active, 0 if it is not. If the layout index ++ * is not valid in the keymap, returns -1. ++ * ++ * @sa xkb_layout_index_t ++ * @memberof xkb_state ++ */ ++int ++xkb_state_layout_index_is_active(struct xkb_state *state, ++ xkb_layout_index_t idx, ++ enum xkb_state_component type); ++ ++/** ++ * Test whether a LED is active in a given keyboard state by name. ++ * ++ * @returns 1 if the LED is active, 0 if it not. If no LED with this name ++ * exists in the keymap, returns -1. ++ * ++ * @sa xkb_led_index_t ++ * @memberof xkb_state ++ */ ++int ++xkb_state_led_name_is_active(struct xkb_state *state, const char *name); ++ ++/** ++ * Test whether a LED is active in a given keyboard state by index. ++ * ++ * @returns 1 if the LED is active, 0 if it not. If the LED index is not ++ * valid in the keymap, returns -1. ++ * ++ * @sa xkb_led_index_t ++ * @memberof xkb_state ++ */ ++int ++xkb_state_led_index_is_active(struct xkb_state *state, xkb_led_index_t idx); ++ ++/** @} */ ++ ++/* Leave this include last, so it can pick up our types, etc. */ ++#include ++ ++#ifdef __cplusplus ++} /* extern "C" */ ++#endif ++ ++#endif /* _XKBCOMMON_H_ */ +diff --git a/src/plugins/platforminputcontexts/platforminputcontexts.pro b/src/plugins/platforminputcontexts/platforminputcontexts.pro +index faea54b..e31be7c 100644 +--- a/src/plugins/platforminputcontexts/platforminputcontexts.pro ++++ b/src/plugins/platforminputcontexts/platforminputcontexts.pro +@@ -1,7 +1,8 @@ + TEMPLATE = subdirs + + qtHaveModule(dbus) { +-!mac:!win32:SUBDIRS += ibus ++# Patch: Adding fcitx input context plugin to our static build. ++!mac:!win32:SUBDIRS += ibus fcitx + } + + contains(QT_CONFIG, xcb-plugin): SUBDIRS += compose +diff --git a/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm b/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm +index caa8884..9dc3bc1 100644 +--- a/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm ++++ b/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm +@@ -210,7 +210,8 @@ QT_END_NAMESPACE + if (reflectionDelegate) { + if ([reflectionDelegate respondsToSelector:@selector(applicationShouldTerminate:)]) + return [reflectionDelegate applicationShouldTerminate:sender]; +- return NSTerminateNow; ++ // Patch: Don't terminate if reflectionDelegate does not respond to that selector, just use the default. ++ //return NSTerminateNow; + } + + if ([self canQuit]) { +@@ -287,11 +288,15 @@ QT_END_NAMESPACE + + - (void)applicationDidFinishLaunching:(NSNotification *)aNotification + { ++ // Patch: We need to catch that notification in delegate. ++ if (reflectionDelegate ++ && [reflectionDelegate respondsToSelector:@selector(applicationDidFinishLaunching:)]) ++ [reflectionDelegate applicationDidFinishLaunching:aNotification]; ++ + Q_UNUSED(aNotification); + inLaunch = false; + // qt_release_apple_event_handler(); + +- + // Insert code here to initialize your application + } + +diff --git a/src/plugins/platforms/cocoa/qcocoabackingstore.h b/src/plugins/platforms/cocoa/qcocoabackingstore.h +index 934f68a..3ece698 100644 +--- a/src/plugins/platforms/cocoa/qcocoabackingstore.h ++++ b/src/plugins/platforms/cocoa/qcocoabackingstore.h +@@ -64,6 +64,9 @@ public: + private: + QImage m_qImage; + QSize m_requestedSize; ++ ++ // Patch: Optimize redraw - don't clear image if it will be fully redrawn. ++ bool m_qImageNeedsClear; + }; + + QT_END_NAMESPACE +diff --git a/src/plugins/platforms/cocoa/qcocoabackingstore.mm b/src/plugins/platforms/cocoa/qcocoabackingstore.mm +index ca92103..f27ea15 100644 +--- a/src/plugins/platforms/cocoa/qcocoabackingstore.mm ++++ b/src/plugins/platforms/cocoa/qcocoabackingstore.mm +@@ -38,7 +38,8 @@ + QT_BEGIN_NAMESPACE + + QCocoaBackingStore::QCocoaBackingStore(QWindow *window) +- : QPlatformBackingStore(window) ++ // Patch: Optimize redraw - don't clear image if it will be fully redrawn. ++ : QPlatformBackingStore(window), m_qImageNeedsClear(false) + { + } + +@@ -59,9 +60,12 @@ QPaintDevice *QCocoaBackingStore::paintDevice() + if (m_qImage.size() != effectiveBufferSize) { + QImage::Format format = (window()->format().hasAlpha() || cocoaWindow->m_drawContentBorderGradient) + ? QImage::Format_ARGB32_Premultiplied : QImage::Format_RGB32; ++ ++ // Patch: Optimize redraw - don't clear image if it will be fully redrawn. ++ m_qImageNeedsClear = window()->requestedFormat().hasAlpha() || cocoaWindow->m_drawContentBorderGradient; + m_qImage = QImage(effectiveBufferSize, format); + m_qImage.setDevicePixelRatio(windowDevicePixelRatio); +- if (format == QImage::Format_ARGB32_Premultiplied) ++ if (m_qImageNeedsClear) + m_qImage.fill(Qt::transparent); + } + return &m_qImage; +@@ -100,7 +104,8 @@ bool QCocoaBackingStore::scroll(const QRegion &area, int dx, int dy) + + void QCocoaBackingStore::beginPaint(const QRegion ®ion) + { +- if (m_qImage.hasAlphaChannel()) { ++ // Patch: Optimize redraw - don't clear image if it will be fully redrawn. ++ if (m_qImageNeedsClear && m_qImage.hasAlphaChannel()) { + QPainter p(&m_qImage); + p.setCompositionMode(QPainter::CompositionMode_Source); + const QVector rects = region.rects(); +diff --git a/src/plugins/platforms/cocoa/qcocoakeymapper.mm b/src/plugins/platforms/cocoa/qcocoakeymapper.mm +index c2d206f..9b97398 100644 +--- a/src/plugins/platforms/cocoa/qcocoakeymapper.mm ++++ b/src/plugins/platforms/cocoa/qcocoakeymapper.mm +@@ -384,6 +384,12 @@ bool QCocoaKeyMapper::updateKeyboard() + keyboardInputLocale = QLocale::c(); + keyboardInputDirection = Qt::LeftToRight; + } ++ ++ // Patch: Fix layout-independent global shortcuts. ++ const auto newMode = keyboard_mode; ++ deleteLayouts(); ++ keyboard_mode = newMode; ++ + return true; + } + +@@ -466,7 +472,8 @@ QList QCocoaKeyMapper::possibleKeys(const QKeyEvent *event) const + Qt::KeyboardModifiers neededMods = ModsTbl[i]; + int key = kbItem->qtKey[i]; + if (key && key != baseKey && ((keyMods & neededMods) == neededMods)) { +- ret << int(key + (keyMods & ~neededMods)); ++ // Patch: Fix layout-independent global shortcuts. ++ ret << int(key + neededMods); + } + } + return ret; +diff --git a/src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm b/src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm +index 8152c57..5ddd7b3 100644 +--- a/src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm ++++ b/src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm +@@ -94,6 +94,8 @@ QT_USE_NAMESPACE + QCocoaSystemTrayIcon *systray; + NSStatusItem *item; + QCocoaMenu *menu; ++ // Patch: Create a rich os x tray icon (pixel-perfect, theme switching). ++ bool menuVisible, iconSelected; + QIcon icon; + QT_MANGLE_NAMESPACE(QNSImageView) *imageCell; + } +@@ -197,7 +199,9 @@ void QCocoaSystemTrayIcon::updateIcon(const QIcon &icon) + // (device independent pixels). The menu height on past and + // current OS X versions is 22 points. Provide some future-proofing + // by deriving the icon height from the menu height. +- const int padding = 4; ++ ++ // Patch: Create a rich os x tray icon (pixel-perfect, theme switching). ++ const int padding = 0; + const int menuHeight = [[NSStatusBar systemStatusBar] thickness]; + const int maxImageHeight = menuHeight - padding; + +@@ -207,8 +211,11 @@ void QCocoaSystemTrayIcon::updateIcon(const QIcon &icon) + // devicePixelRatio for the "best" screen on the system. + qreal devicePixelRatio = qApp->devicePixelRatio(); + const int maxPixmapHeight = maxImageHeight * devicePixelRatio; ++ ++ // Patch: Create a rich os x tray icon (pixel-perfect, theme switching). ++ const QIcon::Mode mode = m_sys->item->iconSelected ? QIcon::Selected : QIcon::Normal; + QSize selectedSize; +- Q_FOREACH (const QSize& size, sortByHeight(icon.availableSizes())) { ++ Q_FOREACH (const QSize& size, sortByHeight(icon.availableSizes(mode))) { + // Select a pixmap based on the height. We want the largest pixmap + // with a height smaller or equal to maxPixmapHeight. The pixmap + // may rectangular; assume it has a reasonable size. If there is +@@ -224,9 +231,9 @@ void QCocoaSystemTrayIcon::updateIcon(const QIcon &icon) + + // Handle SVG icons, which do not return anything for availableSizes(). + if (!selectedSize.isValid()) +- selectedSize = icon.actualSize(QSize(maxPixmapHeight, maxPixmapHeight)); ++ selectedSize = icon.actualSize(QSize(maxPixmapHeight, maxPixmapHeight), mode); + +- QPixmap pixmap = icon.pixmap(selectedSize); ++ QPixmap pixmap = icon.pixmap(selectedSize, mode); + + // Draw a low-resolution icon if there is not enough pixels for a retina + // icon. This prevents showing a small icon on retina displays. +@@ -374,6 +381,11 @@ QT_END_NAMESPACE + Q_UNUSED(notification); + down = NO; + ++ // Patch: Create a rich os x tray icon (pixel-perfect, theme switching). ++ parent->iconSelected = false; ++ parent->systray->updateIcon(parent->icon); ++ parent->menuVisible = false; ++ + [self setNeedsDisplay:YES]; + } + +@@ -383,6 +395,10 @@ QT_END_NAMESPACE + int clickCount = [mouseEvent clickCount]; + [self setNeedsDisplay:YES]; + ++ // Patch: Create a rich os x tray icon (pixel-perfect, theme switching). ++ parent->iconSelected = (clickCount != 2) && parent->menu; ++ parent->systray->updateIcon(parent->icon); ++ + if (clickCount == 2) { + [self menuTrackingDone:nil]; + [parent doubleClickSelector:self]; +@@ -399,6 +415,11 @@ QT_END_NAMESPACE + -(void)mouseUp:(NSEvent *)mouseEvent + { + Q_UNUSED(mouseEvent); ++ ++ // Patch: Create a rich os x tray icon (pixel-perfect, theme switching). ++ parent->iconSelected = false; ++ parent->systray->updateIcon(parent->icon); ++ + [self menuTrackingDone:nil]; + } + +@@ -410,6 +431,11 @@ QT_END_NAMESPACE + -(void)rightMouseUp:(NSEvent *)mouseEvent + { + Q_UNUSED(mouseEvent); ++ ++ // Patch: Create a rich os x tray icon (pixel-perfect, theme switching). ++ parent->iconSelected = false; ++ parent->systray->updateIcon(parent->icon); ++ + [self menuTrackingDone:nil]; + } + +@@ -425,7 +451,8 @@ QT_END_NAMESPACE + } + + -(void)drawRect:(NSRect)rect { +- [[parent item] drawStatusBarBackgroundInRect:rect withHighlight:down]; ++ // Patch: Create a rich os x tray icon (pixel-perfect, theme switching). ++ [[parent item] drawStatusBarBackgroundInRect:rect withHighlight:parent->menu ? down : NO]; + [super drawRect:rect]; + } + @end +@@ -438,6 +465,10 @@ QT_END_NAMESPACE + if (self) { + item = [[[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength] retain]; + menu = 0; ++ ++ // Patch: Create a rich os x tray icon (pixel-perfect, theme switching). ++ menuVisible = false; ++ + systray = sys; + imageCell = [[QNSImageView alloc] initWithParent:self]; + [item setView: imageCell]; +@@ -482,6 +513,10 @@ QT_END_NAMESPACE + selector:@selector(menuTrackingDone:) + name:NSMenuDidEndTrackingNotification + object:m]; ++ ++ // Patch: Create a rich os x tray icon (pixel-perfect, theme switching). ++ menuVisible = true; ++ + [item popUpStatusItemMenu: m]; + } + } +diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm +index c0d5904..2991fca 100644 +--- a/src/plugins/platforms/cocoa/qcocoawindow.mm ++++ b/src/plugins/platforms/cocoa/qcocoawindow.mm +@@ -141,7 +141,8 @@ static bool isMouseEvent(NSEvent *ev) + if (!self.window.delegate) + return; // Already detached, pending NSAppKitDefined event + +- if (pw && pw->frameStrutEventsEnabled() && isMouseEvent(theEvent)) { ++ // Patch: Fix restore after minimize or close by window buttons. ++ if (pw && pw->frameStrutEventsEnabled() && pw->m_synchedWindowState != Qt::WindowMinimized && pw->m_isExposed && isMouseEvent(theEvent)) { + NSPoint loc = [theEvent locationInWindow]; + NSRect windowFrame = [self.window convertRectFromScreen:[self.window frame]]; + NSRect contentFrame = [[self.window contentView] frame]; +@@ -943,6 +944,19 @@ void QCocoaWindow::setWindowFilePath(const QString &filePath) + [m_nsWindow setRepresentedFilename: fi.exists() ? QCFString::toNSString(filePath) : @""]; + } + ++// Patch: Create a good os x window icon (pixel-perfect). ++namespace { ++ ++qreal getDevicePixelRatio() { ++ qreal result = 1.0; ++ foreach (QScreen *screen, QGuiApplication::screens()) { ++ result = qMax(result, screen->devicePixelRatio()); ++ } ++ return result; ++} ++ ++} // namespace ++ + void QCocoaWindow::setWindowIcon(const QIcon &icon) + { + QMacAutoReleasePool pool; +@@ -958,7 +972,9 @@ void QCocoaWindow::setWindowIcon(const QIcon &icon) + if (icon.isNull()) { + [iconButton setImage:nil]; + } else { +- QPixmap pixmap = icon.pixmap(QSize(22, 22)); ++ // Patch: Create a good os x window icon (pixel-perfect). ++ CGFloat hgt = 16. * getDevicePixelRatio(); ++ QPixmap pixmap = icon.pixmap(QSize(hgt, hgt)); + NSImage *image = static_cast(qt_mac_create_nsimage(pixmap)); + [iconButton setImage:image]; + [image release]; +diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm +index c67bcfd..4498a17 100644 +--- a/src/plugins/platforms/cocoa/qnsview.mm ++++ b/src/plugins/platforms/cocoa/qnsview.mm +@@ -1431,7 +1431,9 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent) + #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_8 + if (QSysInfo::QSysInfo::MacintoshVersion >= QSysInfo::MV_10_8) { + // On 10.8 and above, MayBegin is likely to happen. We treat it the same as an actual begin. +- if (phase == NSEventPhaseMayBegin) { ++ ++ // Patch: Fix actual begin handle of swipe on trackpad. ++ if (phase == NSEventPhaseMayBegin || phase == NSEventPhaseBegan) { + m_scrolling = true; + ph = Qt::ScrollBegin; + } +@@ -1496,14 +1498,14 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent) + quint32 nativeVirtualKey = [nsevent keyCode]; + + QChar ch = QChar::ReplacementCharacter; +- int keyCode = Qt::Key_unknown; +- if ([characters length] != 0) { +- if (((modifiers & Qt::MetaModifier) || (modifiers & Qt::AltModifier)) && ([charactersIgnoringModifiers length] != 0)) +- ch = QChar([charactersIgnoringModifiers characterAtIndex:0]); +- else +- ch = QChar([characters characterAtIndex:0]); +- keyCode = [self convertKeyCode:ch]; +- } ++ ++ // Patch: Fix Alt+.. shortcuts in OS X. See https://bugreports.qt.io/browse/QTBUG-42584 at the end. ++ if ([characters length] != 0) ++ ch = QChar([characters characterAtIndex:0]); ++ else if ([charactersIgnoringModifiers length] != 0 && ((modifiers & Qt::MetaModifier) || (modifiers & Qt::AltModifier))) ++ ch = QChar([charactersIgnoringModifiers characterAtIndex:0]); ++ ++ int keyCode = [self convertKeyCode:ch]; + + // we will send a key event unless the input method sets m_sendKeyEvent to false + m_sendKeyEvent = true; +@@ -1569,6 +1571,23 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent) + [self handleKeyEvent:nsevent eventType:int(QEvent::KeyRelease)]; + } + ++// Patch: Enable Ctrl+Tab and Ctrl+Shift+Tab / Ctrl+Backtab handle in-app. ++- (BOOL)performKeyEquivalent:(NSEvent *)nsevent ++{ ++ NSString *chars = [nsevent charactersIgnoringModifiers]; ++ ++ if ([nsevent type] == NSKeyDown && [chars length] > 0) { ++ QChar ch = [chars characterAtIndex:0]; ++ Qt::Key qtKey = qt_mac_cocoaKey2QtKey(ch); ++ if ([nsevent modifierFlags] & NSControlKeyMask ++ && (qtKey == Qt::Key_Tab || qtKey == Qt::Key_Backtab)) { ++ [self handleKeyEvent:nsevent eventType:int(QEvent::KeyPress)]; ++ return YES; ++ } ++ } ++ return [super performKeyEquivalent:nsevent]; ++} ++ + - (void)cancelOperation:(id)sender + { + Q_UNUSED(sender); +diff --git a/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp b/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp +index 94bb71e..16ab51e 100644 +--- a/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp ++++ b/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp +@@ -716,12 +716,20 @@ public: + void setSelectedFiles(const QList &); + QString selectedFile() const; + ++ // Patch: Adding select-by-url for Windows file dialog. ++ void setSelectedRemoteContent(const QByteArray &); ++ QByteArray selectedRemoteContent() const; ++ + private: + class Data : public QSharedData { + public: + QUrl directory; + QString selectedNameFilter; + QList selectedFiles; ++ ++ // Patch: Adding select-by-url for Windows file dialog. ++ QByteArray selectedRemoteContent; ++ + QMutex mutex; + }; + QExplicitlySharedDataPointer m_data; +@@ -775,6 +783,21 @@ inline void QWindowsFileDialogSharedData::setSelectedFiles(const QList &ur + m_data->selectedFiles = urls; + } + ++// Patch: Adding select-by-url for Windows file dialog. ++inline QByteArray QWindowsFileDialogSharedData::selectedRemoteContent() const ++{ ++ m_data->mutex.lock(); ++ const QByteArray result = m_data->selectedRemoteContent; ++ m_data->mutex.unlock(); ++ return result; ++} ++ ++inline void QWindowsFileDialogSharedData::setSelectedRemoteContent(const QByteArray &c) ++{ ++ QMutexLocker(&m_data->mutex); ++ m_data->selectedRemoteContent = c; ++} ++ + inline void QWindowsFileDialogSharedData::fromOptions(const QSharedPointer &o) + { + QMutexLocker locker(&m_data->mutex); +@@ -899,6 +922,9 @@ public: + // example by appended default suffixes, etc. + virtual QList dialogResult() const = 0; + ++ // Patch: Adding select-by-url for Windows file dialog. ++ virtual QByteArray dialogRemoteContent() const { return QByteArray(); } ++ + inline void onFolderChange(IShellItem *); + inline void onSelectionChange(); + inline void onTypeChange(); +@@ -1338,7 +1364,14 @@ void QWindowsNativeFileDialogBase::selectFile(const QString &fileName) const + // Hack to prevent CLSIDs from being set as file name due to + // QFileDialogPrivate::initialSelection() being QString-based. + if (!isClsid(fileName)) +- m_fileDialog->SetFileName((wchar_t*)fileName.utf16()); ++ // Patch: Fix handle of full fileName. ++ { ++ QString file = QDir::toNativeSeparators(fileName); ++ int lastBackSlash = file.lastIndexOf(QChar::fromLatin1('\\')); ++ if (lastBackSlash >= 0) ++ file = file.mid(lastBackSlash + 1); ++ m_fileDialog->SetFileName((wchar_t*)file.utf16());; ++ } + } + + // Return the index of the selected filter, accounting for QFileDialog +@@ -1408,6 +1441,10 @@ bool QWindowsNativeFileDialogBase::onFileOk() + { + // Store selected files as GetResults() returns invalid data after the dialog closes. + m_data.setSelectedFiles(dialogResult()); ++ ++ // Patch: Adding select-by-url for Windows file dialog. ++ m_data.setSelectedRemoteContent(dialogRemoteContent()); ++ + return true; + } + +@@ -1542,6 +1579,9 @@ public: + QList selectedFiles() const Q_DECL_OVERRIDE; + QList dialogResult() const Q_DECL_OVERRIDE; + ++ // Patch: Adding select-by-url for Windows file dialog. ++ QByteArray dialogRemoteContent() const Q_DECL_OVERRIDE; ++ + private: + inline IFileOpenDialog *openFileDialog() const + { return static_cast(fileDialog()); } +@@ -1556,6 +1596,62 @@ QList QWindowsNativeOpenFileDialog::dialogResult() const + return result; + } + ++// Patch: Adding select-by-url for Windows file dialog. ++QByteArray QWindowsNativeOpenFileDialog::dialogRemoteContent() const ++{ ++ QByteArray result; ++ IShellItemArray *items = 0; ++ if (FAILED(openFileDialog()->GetResults(&items)) || !items) ++ return result; ++ DWORD itemCount = 0; ++ if (FAILED(items->GetCount(&itemCount)) || !itemCount) ++ return result; ++ for (DWORD i = 0; i < itemCount; ++i) ++ { ++ IShellItem *item = 0; ++ if (SUCCEEDED(items->GetItemAt(i, &item))) { ++ SFGAOF attributes = 0; ++ // Check whether it has a file system representation? ++ if (FAILED(item->GetAttributes(SFGAO_FILESYSTEM, &attributes)) || (attributes & SFGAO_FILESYSTEM)) ++ { ++ LPWSTR name = 0; ++ if (SUCCEEDED(item->GetDisplayName(SIGDN_FILESYSPATH, &name))) ++ { ++ CoTaskMemFree(name); ++ continue; ++ } ++ } ++ if (FAILED(item->GetAttributes(SFGAO_STREAM, &attributes)) || !(attributes & SFGAO_STREAM)) ++ continue; ++ ++ IBindCtx *bind = 0; ++ if (FAILED(CreateBindCtx(0, &bind))) ++ continue; ++ ++ IStream *stream = 0; ++ if (FAILED(item->BindToHandler(bind, BHID_Stream, IID_IStream, reinterpret_cast(&stream)))) ++ continue; ++ ++ STATSTG stat = { 0 }; ++ if (FAILED(stream->Stat(&stat, STATFLAG_NONAME)) || !stat.cbSize.QuadPart) ++ continue; ++ ++ quint64 fullSize = stat.cbSize.QuadPart; ++ if (fullSize <= 64 * 1024 * 1024) ++ { ++ result.resize(fullSize); ++ ULONG read = 0; ++ HRESULT r = stream->Read(result.data(), fullSize, &read); ++ if (r == S_FALSE || r == S_OK) ++ return result; ++ ++ result.clear(); ++ } ++ } ++ } ++ return result; ++} ++ + QList QWindowsNativeOpenFileDialog::selectedFiles() const + { + QList result; +@@ -1614,6 +1710,10 @@ public: + virtual QUrl directory() const Q_DECL_OVERRIDE; + virtual void selectFile(const QUrl &filename) Q_DECL_OVERRIDE; + virtual QList selectedFiles() const Q_DECL_OVERRIDE; ++ ++ // Patch: Adding select-by-url for Windows file dialog. ++ virtual QByteArray selectedRemoteContent() const Q_DECL_OVERRIDE; ++ + virtual void setFilter() Q_DECL_OVERRIDE; + virtual void selectNameFilter(const QString &filter) Q_DECL_OVERRIDE; + virtual QString selectedNameFilter() const Q_DECL_OVERRIDE; +@@ -1707,6 +1807,12 @@ QList QWindowsFileDialogHelper::selectedFiles() const + return m_data.selectedFiles(); + } + ++// Patch: Adding select-by-url for Windows file dialog. ++QByteArray QWindowsFileDialogHelper::selectedRemoteContent() const ++{ ++ return m_data.selectedRemoteContent(); ++} ++ + void QWindowsFileDialogHelper::setFilter() + { + qCDebug(lcQpaDialogs) << __FUNCTION__; +@@ -1996,6 +2102,10 @@ public: + QUrl directory() const Q_DECL_OVERRIDE; + void selectFile(const QUrl &url) Q_DECL_OVERRIDE; + QList selectedFiles() const Q_DECL_OVERRIDE; ++ ++ // Patch: Adding select-by-url for Windows file dialog. ++ QByteArray selectedRemoteContent() const Q_DECL_OVERRIDE; ++ + void setFilter() Q_DECL_OVERRIDE {} + void selectNameFilter(const QString &) Q_DECL_OVERRIDE; + QString selectedNameFilter() const Q_DECL_OVERRIDE; +@@ -2039,6 +2149,12 @@ QList QWindowsXpFileDialogHelper::selectedFiles() const + return m_data.selectedFiles(); + } + ++// Patch: Adding select-by-url for Windows file dialog. ++QByteArray QWindowsXpFileDialogHelper::selectedRemoteContent() const ++{ ++ return m_data.selectedRemoteContent(); ++} ++ + void QWindowsXpFileDialogHelper::selectNameFilter(const QString &f) + { + m_data.setSelectedNameFilter(f); // Dialog cannot be updated at run-time. +diff --git a/src/plugins/platforms/windows/qwindowskeymapper.cpp b/src/plugins/platforms/windows/qwindowskeymapper.cpp +index 1e58b9b..1741c21 100644 +--- a/src/plugins/platforms/windows/qwindowskeymapper.cpp ++++ b/src/plugins/platforms/windows/qwindowskeymapper.cpp +@@ -1268,6 +1268,10 @@ QList QWindowsKeyMapper::possibleKeys(const QKeyEvent *e) const + if (nativeVirtualKey > 255) + return result; + ++ // Patch: This must not happen, but there are crash reports on the next line. ++ if (e->nativeVirtualKey() > 0xFF) ++ return result; ++ + const KeyboardLayoutItem &kbItem = keyLayout[nativeVirtualKey]; + if (!kbItem.exists) + return result; +diff --git a/src/plugins/platforms/windows/qwindowsservices.cpp b/src/plugins/platforms/windows/qwindowsservices.cpp +index 1d23a9d..640cd42 100644 +--- a/src/plugins/platforms/windows/qwindowsservices.cpp ++++ b/src/plugins/platforms/windows/qwindowsservices.cpp +@@ -127,6 +127,10 @@ static inline bool launchMail(const QUrl &url) + command.prepend(doubleQuote); + } + } ++ ++ // Patch: Fix mail launch if no param is expected in this command. ++ if (command.indexOf(QStringLiteral("%1")) < 0) return false; ++ + // Pass the url as the parameter. Should use QProcess::startDetached(), + // but that cannot handle a Windows command line [yet]. + command.replace(QStringLiteral("%1"), url.toString(QUrl::FullyEncoded)); +diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp +index b38d7c2..34f19c4 100644 +--- a/src/plugins/platforms/windows/qwindowswindow.cpp ++++ b/src/plugins/platforms/windows/qwindowswindow.cpp +@@ -1020,7 +1020,8 @@ void QWindowsWindow::destroyWindow() + // Clear any transient child relationships as Windows will otherwise destroy them (QTBUG-35499, QTBUG-36666) + if (QWindow *transientChild = findTransientChild(window())) + if (QWindowsWindow *tw = QWindowsWindow::baseWindowOf(transientChild)) +- tw->updateTransientParent(); ++ // Patch: Fix possibility of add / remove taskbar icon of the window. ++ tw->clearTransientParent(); + QWindowsContext *context = QWindowsContext::instance(); + if (context->windowUnderMouse() == window()) + context->clearWindowUnderMouse(); +@@ -1235,6 +1236,21 @@ void QWindowsWindow::updateTransientParent() const + if (const QWindowsWindow *tw = QWindowsWindow::baseWindowOf(tp)) + if (!tw->testFlag(WithinDestroy)) // Prevent destruction by parent window (QTBUG-35499, QTBUG-36666) + newTransientParent = tw->handle(); ++ // Patch: Fix possibility of add / remove taskbar icon of the window. ++ if (newTransientParent && newTransientParent != oldTransientParent) ++ SetWindowLongPtr(m_data.hwnd, GWL_HWNDPARENT, (LONG_PTR)newTransientParent); ++#endif // !Q_OS_WINCE ++} ++ ++// Patch: Fix possibility of add / remove taskbar icon of the window. ++void QWindowsWindow::clearTransientParent() const ++{ ++#ifndef Q_OS_WINCE ++ if (window()->type() == Qt::Popup) ++ return; // QTBUG-34503, // a popup stays on top, no parent, see also WindowCreationData::fromWindow(). ++ // Update transient parent. ++ const HWND oldTransientParent = transientParentHwnd(m_data.hwnd); ++ HWND newTransientParent = 0; + if (newTransientParent != oldTransientParent) + SetWindowLongPtr(m_data.hwnd, GWL_HWNDPARENT, (LONG_PTR)newTransientParent); + #endif // !Q_OS_WINCE +@@ -1448,10 +1464,14 @@ void QWindowsWindow::handleResized(int wParam) + handleGeometryChange(); + break; + case SIZE_RESTORED: +- if (isFullScreen_sys()) +- handleWindowStateChange(Qt::WindowFullScreen); +- else if (m_windowState != Qt::WindowNoState && !testFlag(MaximizeToFullScreen)) ++ // Patch: When resolution is changed for a frameless fullscreen widget ++ // handleWindowStateChange call prevents correct geometry get in handleGeometryChange(). ++ if (isFullScreen_sys()) { ++ if (m_windowState != Qt::WindowFullScreen) ++ handleWindowStateChange(Qt::WindowFullScreen); ++ } else if (m_windowState != Qt::WindowNoState && !testFlag(MaximizeToFullScreen)) { + handleWindowStateChange(Qt::WindowNoState); ++ } + handleGeometryChange(); + break; + } +diff --git a/src/plugins/platforms/windows/qwindowswindow.h b/src/plugins/platforms/windows/qwindowswindow.h +index 6fffa1e..cb1c9c1 100644 +--- a/src/plugins/platforms/windows/qwindowswindow.h ++++ b/src/plugins/platforms/windows/qwindowswindow.h +@@ -265,6 +265,10 @@ private: + inline void setWindowState_sys(Qt::WindowState newState); + inline void setParent_sys(const QPlatformWindow *parent); + inline void updateTransientParent() const; ++ ++ // Patch: Fix possibility of add / remove taskbar icon of the window. ++ inline void clearTransientParent() const; ++ + void destroyWindow(); + inline bool isDropSiteEnabled() const { return m_dropTarget != 0; } + void setDropSiteEnabled(bool enabled); +diff --git a/src/widgets/dialogs/qfiledialog.cpp b/src/widgets/dialogs/qfiledialog.cpp +index bc2de89..aa8f8df 100644 +--- a/src/widgets/dialogs/qfiledialog.cpp ++++ b/src/widgets/dialogs/qfiledialog.cpp +@@ -1200,6 +1200,15 @@ QList QFileDialogPrivate::userSelectedFiles() const + return files; + } + ++// Patch: Adding select-by-url for Windows file dialog. ++QByteArray QFileDialogPrivate::userSelectedRemoteContent() const ++{ ++ if (nativeDialogInUse) ++ return selectedRemoteContent_sys(); ++ ++ return QByteArray(); ++} ++ + QStringList QFileDialogPrivate::addDefaultSuffixToFiles(const QStringList &filesToFix) const + { + QStringList files; +@@ -1267,6 +1276,14 @@ QStringList QFileDialog::selectedFiles() const + return files; + } + ++// Patch: Adding select-by-url for Windows file dialog. ++QByteArray QFileDialog::selectedRemoteContent() const ++{ ++ Q_D(const QFileDialog); ++ ++ return d->userSelectedRemoteContent(); ++} ++ + /*! + Returns a list of urls containing the selected files in the dialog. + If no files are selected, or the mode is not ExistingFiles or +diff --git a/src/widgets/dialogs/qfiledialog.h b/src/widgets/dialogs/qfiledialog.h +index ffe49a2..42dc563 100644 +--- a/src/widgets/dialogs/qfiledialog.h ++++ b/src/widgets/dialogs/qfiledialog.h +@@ -108,6 +108,9 @@ public: + void selectFile(const QString &filename); + QStringList selectedFiles() const; + ++ // Patch: Adding select-by-url for Windows file dialog. ++ QByteArray selectedRemoteContent() const; ++ + void selectUrl(const QUrl &url); + QList selectedUrls() const; + +diff --git a/src/widgets/dialogs/qfiledialog_p.h b/src/widgets/dialogs/qfiledialog_p.h +index f610e46..547a646 100644 +--- a/src/widgets/dialogs/qfiledialog_p.h ++++ b/src/widgets/dialogs/qfiledialog_p.h +@@ -123,6 +123,10 @@ public: + static QString initialSelection(const QUrl &path); + QStringList typedFiles() const; + QList userSelectedFiles() const; ++ ++ // Patch: Adding select-by-url for Windows file dialog. ++ QByteArray userSelectedRemoteContent() const; ++ + QStringList addDefaultSuffixToFiles(const QStringList &filesToFix) const; + QList addDefaultSuffixToUrls(const QList &urlsToFix) const; + bool removeDirectory(const QString &path); +@@ -256,6 +260,10 @@ public: + QUrl directory_sys() const; + void selectFile_sys(const QUrl &filename); + QList selectedFiles_sys() const; ++ ++ // Patch: Adding select-by-url for Windows file dialog. ++ QByteArray selectedRemoteContent_sys() const; ++ + void setFilter_sys(); + void selectNameFilter_sys(const QString &filter); + QString selectedNameFilter_sys() const; +@@ -393,6 +401,14 @@ inline QList QFileDialogPrivate::selectedFiles_sys() const + return QList(); + } + ++// Patch: Adding select-by-url for Windows file dialog. ++inline QByteArray QFileDialogPrivate::selectedRemoteContent_sys() const ++{ ++ if (QPlatformFileDialogHelper *helper = platformFileDialogHelper()) ++ return helper->selectedRemoteContent(); ++ return QByteArray(); ++} ++ + inline void QFileDialogPrivate::setFilter_sys() + { + if (QPlatformFileDialogHelper *helper = platformFileDialogHelper()) +diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp +index b1d80d7..4133ed3 100644 +--- a/src/widgets/kernel/qwidget.cpp ++++ b/src/widgets/kernel/qwidget.cpp +@@ -8769,7 +8769,8 @@ bool QWidget::event(QEvent *event) + case QEvent::KeyPress: { + QKeyEvent *k = (QKeyEvent *)event; + bool res = false; +- if (!(k->modifiers() & (Qt::ControlModifier | Qt::AltModifier))) { //### Add MetaModifier? ++ // Patch: Enable Ctrl+Tab and Ctrl+Shift+Tab / Ctrl+Backtab handle in-app. ++ if (!(k->modifiers() & (Qt::ControlModifier | Qt::AltModifier | Qt::MetaModifier))) { //### Add MetaModifier? + if (k->key() == Qt::Key_Backtab + || (k->key() == Qt::Key_Tab && (k->modifiers() & Qt::ShiftModifier))) + res = focusNextPrevChild(false); +diff --git a/src/widgets/util/qsystemtrayicon.cpp b/src/widgets/util/qsystemtrayicon.cpp +index 704142f..7c4340e 100644 +--- a/src/widgets/util/qsystemtrayicon.cpp ++++ b/src/widgets/util/qsystemtrayicon.cpp +@@ -709,6 +709,10 @@ void QSystemTrayIconPrivate::updateMenu_sys_qpa() + if (menu) { + addPlatformMenu(menu); + qpa_sys->updateMenu(menu->platformMenu()); ++ ++ // Patch: Create a rich os x tray icon (pixel-perfect, theme switching). ++ } else { ++ qpa_sys->updateMenu(nullptr); + } + } + +diff --git a/src/widgets/widgets/qabstractscrollarea.cpp b/src/widgets/widgets/qabstractscrollarea.cpp +index 2e2a042..472e377 100644 +--- a/src/widgets/widgets/qabstractscrollarea.cpp ++++ b/src/widgets/widgets/qabstractscrollarea.cpp +@@ -640,15 +640,22 @@ scrolling range. + QSize QAbstractScrollArea::maximumViewportSize() const + { + Q_D(const QAbstractScrollArea); +- int hsbExt = d->hbar->sizeHint().height(); +- int vsbExt = d->vbar->sizeHint().width(); ++ // Patch: Count the sizeHint of the bar only if it is displayed. ++ //int hsbExt = d->hbar->sizeHint().height(); ++ //int vsbExt = d->vbar->sizeHint().width(); + + int f = 2 * d->frameWidth; + QSize max = size() - QSize(f + d->left + d->right, f + d->top + d->bottom); +- if (d->vbarpolicy == Qt::ScrollBarAlwaysOn) ++ ++ // Patch: Count the sizeHint of the bar only if it is displayed. ++ if (d->vbarpolicy == Qt::ScrollBarAlwaysOn) { ++ int vsbExt = d->vbar->sizeHint().width(); + max.rwidth() -= vsbExt; +- if (d->hbarpolicy == Qt::ScrollBarAlwaysOn) ++ } ++ if (d->hbarpolicy == Qt::ScrollBarAlwaysOn) { ++ int hsbExt = d->hbar->sizeHint().height(); + max.rheight() -= hsbExt; ++ } + return max; + } + +diff --git a/src/widgets/widgets/qwidgetlinecontrol.cpp b/src/widgets/widgets/qwidgetlinecontrol.cpp +index daf9f00..57499dc 100644 +--- a/src/widgets/widgets/qwidgetlinecontrol.cpp ++++ b/src/widgets/widgets/qwidgetlinecontrol.cpp +@@ -40,6 +40,11 @@ + #include + #include + #include ++ ++// Patch: Enable Ctrl+key and Ctrl+Shift+key in all locales except German. ++// See https://github.com/telegramdesktop/tdesktop/pull/1185. ++#include ++ + #ifndef QT_NO_ACCESSIBILITY + #include "qaccessible.h" + #endif +@@ -1882,11 +1887,21 @@ void QWidgetLineControl::processKeyEvent(QKeyEvent* event) + } + + // QTBUG-35734: ignore Ctrl/Ctrl+Shift; accept only AltGr (Alt+Ctrl) on German keyboards +- if (unknown && !isReadOnly() +- && event->modifiers() != Qt::ControlModifier +- && event->modifiers() != (Qt::ControlModifier | Qt::ShiftModifier)) { ++ ++ // Patch: Enable Ctrl+key and Ctrl+Shift+key in all locales except German. ++ // See https://github.com/telegramdesktop/tdesktop/pull/1185. ++ bool skipCtrlAndCtrlShift = false; ++ if (QGuiApplication::inputMethod()->locale().language() == QLocale::German) { ++ if (event->modifiers() == Qt::ControlModifier ++ || event->modifiers() == (Qt::ControlModifier | Qt::ShiftModifier)) { ++ skipCtrlAndCtrlShift = true; ++ } ++ } ++ if (unknown && !isReadOnly() && !skipCtrlAndCtrlShift) { + QString t = event->text(); +- if (!t.isEmpty() && t.at(0).isPrint()) { ++ ++ // Patch: Enable ZWJ and ZWNJ characters to be in text input. ++ if (!t.isEmpty() && (t.at(0).isPrint() || t.at(0).unicode() == 0x200C || t.at(0).unicode() == 0x200D)) { + insert(t); + #ifndef QT_NO_COMPLETER + complete(event->key()); +diff --git a/src/widgets/widgets/qwidgettextcontrol.cpp b/src/widgets/widgets/qwidgettextcontrol.cpp +index deca002..8a2023f 100644 +--- a/src/widgets/widgets/qwidgettextcontrol.cpp ++++ b/src/widgets/widgets/qwidgettextcontrol.cpp +@@ -71,6 +71,11 @@ + #include + #include + #include ++ ++// Patch: Enable Ctrl+key and Ctrl+Shift+key in all locales except German. ++// See https://github.com/telegramdesktop/tdesktop/pull/1185. ++#include ++ + #include + #include + #include +@@ -1343,13 +1348,24 @@ void QWidgetTextControlPrivate::keyPressEvent(QKeyEvent *e) + process: + { + // QTBUG-35734: ignore Ctrl/Ctrl+Shift; accept only AltGr (Alt+Ctrl) on German keyboards +- if (e->modifiers() == Qt::ControlModifier +- || e->modifiers() == (Qt::ShiftModifier | Qt::ControlModifier)) { ++ ++ // Patch: Enable Ctrl+key and Ctrl+Shift+key in all locales except German. ++ // See https://github.com/telegramdesktop/tdesktop/pull/1185. ++ bool skipCtrlAndCtrlShift = false; ++ if (QGuiApplication::inputMethod()->locale().language() == QLocale::German) { ++ if (e->modifiers() == Qt::ControlModifier ++ || e->modifiers() == (Qt::ControlModifier | Qt::ShiftModifier)) { ++ skipCtrlAndCtrlShift = true; ++ } ++ } ++ if (skipCtrlAndCtrlShift) { + e->ignore(); + return; + } + QString text = e->text(); +- if (!text.isEmpty() && (text.at(0).isPrint() || text.at(0) == QLatin1Char('\t'))) { ++ ++ // Patch: Enable ZWJ and ZWNJ characters to be in text input. ++ if (!text.isEmpty() && (text.at(0).isPrint() || text.at(0) == QLatin1Char('\t') || text.at(0).unicode() == 0x200C || text.at(0).unicode() == 0x200D)) { + if (overwriteMode + // no need to call deleteChar() if we have a selection, insertText + // does it already diff --git a/Telegram/gyp/qt.gypi b/Telegram/gyp/qt.gypi index dc24345714..c59b56e155 100644 --- a/Telegram/gyp/qt.gypi +++ b/Telegram/gyp/qt.gypi @@ -35,7 +35,7 @@ [ 'build_macold', { 'qt_version%': '5.3.2', }, { - 'qt_version%': '5.6.0', + 'qt_version%': '5.6.2', }] ], },