11921 lines
		
	
	
	
		
			581 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			11921 lines
		
	
	
	
		
			581 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
diff --git a/mkspecs/common/msvc-desktop.conf b/mkspecs/common/msvc-desktop.conf
 | 
						||
index 369f95b..656fe77 100644
 | 
						||
--- a/mkspecs/common/msvc-desktop.conf
 | 
						||
+++ b/mkspecs/common/msvc-desktop.conf
 | 
						||
@@ -28,9 +28,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
 | 
						||
+# 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 73dce81..dc26d0e 100644
 | 
						||
--- a/src/corelib/tools/qunicodetables.cpp
 | 
						||
+++ b/src/corelib/tools/qunicodetables.cpp
 | 
						||
@@ -5839,7 +5839,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 },
 | 
						||
+	// 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/qplatformdialoghelper.h b/src/gui/kernel/qplatformdialoghelper.h
 | 
						||
index 8b2b988..9de806d 100644
 | 
						||
--- a/src/gui/kernel/qplatformdialoghelper.h
 | 
						||
+++ b/src/gui/kernel/qplatformdialoghelper.h
 | 
						||
@@ -363,6 +363,8 @@ public:
 | 
						||
     virtual QUrl directory() const = 0;
 | 
						||
     virtual void selectFile(const QUrl &filename) = 0;
 | 
						||
     virtual QList<QUrl> selectedFiles() const = 0;
 | 
						||
+	// 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 b54e85a..49ccec6 100644
 | 
						||
--- a/src/gui/kernel/qwindow.cpp
 | 
						||
+++ b/src/gui/kernel/qwindow.cpp
 | 
						||
@@ -2460,7 +2460,7 @@ void QWindowPrivate::setCursor(const QCursor *newCursor)
 | 
						||
 void QWindowPrivate::applyCursor()
 | 
						||
 {
 | 
						||
     Q_Q(QWindow);
 | 
						||
-    if (platformWindow) {
 | 
						||
+    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 c58662e..432f2cd 100644
 | 
						||
--- a/src/gui/painting/qpaintengine_p.h
 | 
						||
+++ b/src/gui/painting/qpaintengine_p.h
 | 
						||
@@ -79,9 +79,19 @@ public:
 | 
						||
         if (hasSystemTransform) {
 | 
						||
             if (systemTransform.type() <= QTransform::TxTranslate)
 | 
						||
                 systemClip.translate(qRound(systemTransform.dx()), qRound(systemTransform.dy()));
 | 
						||
-            else
 | 
						||
-                systemClip = systemTransform.map(systemClip);
 | 
						||
-        }
 | 
						||
+			else {
 | 
						||
+// 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
 | 
						||
+#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.
 | 
						||
         if (hasSystemViewport) {
 | 
						||
diff --git a/src/gui/text/qtextlayout.cpp b/src/gui/text/qtextlayout.cpp
 | 
						||
index 013cd8a..1a40867 100644
 | 
						||
--- a/src/gui/text/qtextlayout.cpp
 | 
						||
+++ b/src/gui/text/qtextlayout.cpp
 | 
						||
@@ -643,7 +643,10 @@ int QTextLayout::nextCursorPosition(int oldPos, CursorMode mode) const
 | 
						||
         while (oldPos < len && !attributes[oldPos].graphemeBoundary)
 | 
						||
             oldPos++;
 | 
						||
     } else {
 | 
						||
-        if (oldPos < len && d->atWordSeparator(oldPos)) {
 | 
						||
+		// 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))
 | 
						||
                 oldPos++;
 | 
						||
@@ -651,8 +654,6 @@ 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++;
 | 
						||
     }
 | 
						||
 
 | 
						||
     return oldPos;
 | 
						||
diff --git a/src/gui/text/qtextlayout.h b/src/gui/text/qtextlayout.h
 | 
						||
index 47dcd38..afe60f1 100644
 | 
						||
--- a/src/gui/text/qtextlayout.h
 | 
						||
+++ b/src/gui/text/qtextlayout.h
 | 
						||
@@ -186,6 +186,9 @@ private:
 | 
						||
                                QRectF *brect, int tabstops, int* tabarray, int tabarraylen,
 | 
						||
                                QPainter *painter);
 | 
						||
     QTextEngine *d;
 | 
						||
+
 | 
						||
+	// 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 708be2d..5cd58a2 100644
 | 
						||
--- a/src/network/socket/qnativesocketengine_win.cpp
 | 
						||
+++ b/src/network/socket/qnativesocketengine_win.cpp
 | 
						||
@@ -685,7 +685,14 @@ bool QNativeSocketEnginePrivate::nativeConnect(const QHostAddress &address, quin
 | 
						||
                             errorDetected = true;
 | 
						||
                             break;
 | 
						||
                         }
 | 
						||
-                        if (value == WSAEADDRNOTAVAIL) {
 | 
						||
+						// handle network unreachable error as well
 | 
						||
+						if (value == WSAENETUNREACH) {
 | 
						||
+							setError(QAbstractSocket::NetworkError, NetworkUnreachableErrorString);
 | 
						||
+							socketState = QAbstractSocket::UnconnectedState;
 | 
						||
+							errorDetected = true;
 | 
						||
+							break;
 | 
						||
+						}
 | 
						||
+						if (value == WSAEADDRNOTAVAIL) {
 | 
						||
                             setError(QAbstractSocket::NetworkError, AddressNotAvailableErrorString);
 | 
						||
                             socketState = QAbstractSocket::UnconnectedState;
 | 
						||
                             errorDetected = true;
 | 
						||
diff --git a/src/platformsupport/fontdatabases/basic/qbasicfontdatabase.cpp b/src/platformsupport/fontdatabases/basic/qbasicfontdatabase.cpp
 | 
						||
index c41061a..fcb9c40 100644
 | 
						||
--- a/src/platformsupport/fontdatabases/basic/qbasicfontdatabase.cpp
 | 
						||
+++ b/src/platformsupport/fontdatabases/basic/qbasicfontdatabase.cpp
 | 
						||
@@ -190,6 +190,79 @@ void QBasicFontDatabase::releaseHandle(void *handle)
 | 
						||
 
 | 
						||
 extern FT_Library qt_getFreetype();
 | 
						||
 
 | 
						||
+// enable Open Sans Semibold 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();
 | 
						||
@@ -201,9 +274,9 @@ 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);
 | 
						||
+			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);
 | 
						||
+            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 112bb8e..45be6c6 100644
 | 
						||
--- a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp
 | 
						||
+++ b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp
 | 
						||
@@ -374,6 +374,17 @@ static void populateFromPattern(FcPattern *pattern)
 | 
						||
 
 | 
						||
     familyName = QString::fromUtf8((const char *)value);
 | 
						||
 
 | 
						||
+	// enable Open Sans Semibold reading
 | 
						||
+	if (familyName == QLatin1String("Open Sans")) {
 | 
						||
+		FcChar8 *styl = 0;
 | 
						||
+		if (FcPatternGetString(pattern, FC_STYLE, 0, &styl) == FcResultMatch) {
 | 
						||
+			QString style = QString::fromUtf8(reinterpret_cast<const char *>(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;
 | 
						||
@@ -717,6 +728,18 @@ QStringList QFontconfigDatabase::fallbacksForFamily(const QString &family, QFont
 | 
						||
                 continue;
 | 
						||
             //         capitalize(value);
 | 
						||
             QString familyName = QString::fromUtf8((const char *)value);
 | 
						||
+
 | 
						||
+			// enable Open Sans Semibold reading
 | 
						||
+			if (familyName == QLatin1String("Open Sans")) {
 | 
						||
+				FcChar8 *styl = 0;
 | 
						||
+				if (FcPatternGetString(fontSet->fonts[i], FC_STYLE, 0, &styl) == FcResultMatch) {
 | 
						||
+					QString style = QString::fromUtf8(reinterpret_cast<const char *>(styl));
 | 
						||
+					if (style == QLatin1String("Semibold")) {
 | 
						||
+						familyName.append(QChar(QChar::Space)).append(style);
 | 
						||
+					}
 | 
						||
+				}
 | 
						||
+			}
 | 
						||
+
 | 
						||
             if (!fallbackFamilies.contains(familyName,Qt::CaseInsensitive) &&
 | 
						||
                 familyName.compare(family, Qt::CaseInsensitive)) {
 | 
						||
                 fallbackFamilies << familyName;
 | 
						||
@@ -781,7 +804,19 @@ QStringList QFontconfigDatabase::addApplicationFont(const QByteArray &fontData,
 | 
						||
         FcChar8 *fam = 0;
 | 
						||
         if (FcPatternGetString(pattern, FC_FAMILY, 0, &fam) == FcResultMatch) {
 | 
						||
             QString family = QString::fromUtf8(reinterpret_cast<const char *>(fam));
 | 
						||
-            families << family;
 | 
						||
+
 | 
						||
+			// enable Open Sans Semibold reading
 | 
						||
+			if (family == QLatin1String("Open Sans")) {
 | 
						||
+				FcChar8 *styl = 0;
 | 
						||
+				if (FcPatternGetString(pattern, FC_STYLE, 0, &styl) == FcResultMatch) {
 | 
						||
+					QString style = QString::fromUtf8(reinterpret_cast<const char *>(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 be70092..9330322 100644
 | 
						||
--- a/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm
 | 
						||
+++ b/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm
 | 
						||
@@ -263,6 +263,13 @@ static void getFontDescription(CTFontDescriptorRef font, FontDescription *fd)
 | 
						||
 
 | 
						||
     fd->foundryName = QStringLiteral("CoreText");
 | 
						||
     fd->familyName = (CFStringRef) CTFontDescriptorCopyAttribute(font, kCTFontFamilyNameAttribute);
 | 
						||
+
 | 
						||
+    // enable Open Sans Semibold 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 a9da36c..fa9b5b7 100644
 | 
						||
--- a/src/plugins/platforminputcontexts/compose/compose.pro
 | 
						||
+++ b/src/plugins/platforminputcontexts/compose/compose.pro
 | 
						||
@@ -20,7 +20,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)
 | 
						||
+# add 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/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 <QDBusConnection>
 | 
						||
+#include <QDBusServiceWatcher>
 | 
						||
+#include <QDBusReply>
 | 
						||
+#include <QDBusConnectionInterface>
 | 
						||
+#include <QDebug>
 | 
						||
+#include <QFile>
 | 
						||
+#include <QTimer>
 | 
						||
+#include <QDir>
 | 
						||
+
 | 
						||
+#include <signal.h>
 | 
						||
+#include <errno.h>
 | 
						||
+
 | 
						||
+// 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<bool> 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 <QtCore/QObject>
 | 
						||
+
 | 
						||
+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 <QtCore/QWeakPointer>
 | 
						||
+#include <QtCore/QFileSystemWatcher>
 | 
						||
+
 | 
						||
+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 <QDBusMetaType>
 | 
						||
+
 | 
						||
+#include "fcitxqtformattedpreedit.h"
 | 
						||
+
 | 
						||
+void FcitxQtFormattedPreedit::registerMetaType()
 | 
						||
+{
 | 
						||
+    qRegisterMetaType<FcitxQtFormattedPreedit>("FcitxQtFormattedPreedit");
 | 
						||
+    qDBusRegisterMetaType<FcitxQtFormattedPreedit>();
 | 
						||
+    qRegisterMetaType<FcitxQtFormattedPreeditList>("FcitxQtFormattedPreeditList");
 | 
						||
+    qDBusRegisterMetaType<FcitxQtFormattedPreeditList>();
 | 
						||
+}
 | 
						||
+
 | 
						||
+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 <QtCore/QMetaType>
 | 
						||
+#include <QtDBus/QDBusArgument>
 | 
						||
+
 | 
						||
+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<FcitxQtFormattedPreedit> 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..b47d332
 | 
						||
--- /dev/null
 | 
						||
+++ b/src/plugins/platforminputcontexts/fcitx/fcitxqtinputcontextproxy.cpp
 | 
						||
@@ -0,0 +1,26 @@
 | 
						||
+/*
 | 
						||
+ * 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 <QtCore/QObject>
 | 
						||
+#include <QtCore/QByteArray>
 | 
						||
+#include <QtCore/QList>
 | 
						||
+#include <QtCore/QMap>
 | 
						||
+#include <QtCore/QString>
 | 
						||
+#include <QtCore/QStringList>
 | 
						||
+#include <QtCore/QVariant>
 | 
						||
+#include <QtDBus/QtDBus>
 | 
						||
+#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<QVariant> argumentList;
 | 
						||
+        return asyncCallWithArgumentList(QLatin1String("CloseIC"), argumentList);
 | 
						||
+    }
 | 
						||
+
 | 
						||
+    inline QDBusPendingReply<> DestroyIC()
 | 
						||
+    {
 | 
						||
+        QList<QVariant> argumentList;
 | 
						||
+        return asyncCallWithArgumentList(QLatin1String("DestroyIC"), argumentList);
 | 
						||
+    }
 | 
						||
+
 | 
						||
+    inline QDBusPendingReply<> EnableIC()
 | 
						||
+    {
 | 
						||
+        QList<QVariant> argumentList;
 | 
						||
+        return asyncCallWithArgumentList(QLatin1String("EnableIC"), argumentList);
 | 
						||
+    }
 | 
						||
+
 | 
						||
+    inline QDBusPendingReply<> FocusIn()
 | 
						||
+    {
 | 
						||
+        QList<QVariant> argumentList;
 | 
						||
+        return asyncCallWithArgumentList(QLatin1String("FocusIn"), argumentList);
 | 
						||
+    }
 | 
						||
+
 | 
						||
+    inline QDBusPendingReply<> FocusOut()
 | 
						||
+    {
 | 
						||
+        QList<QVariant> argumentList;
 | 
						||
+        return asyncCallWithArgumentList(QLatin1String("FocusOut"), argumentList);
 | 
						||
+    }
 | 
						||
+
 | 
						||
+    inline QDBusPendingReply<> MouseEvent(int x)
 | 
						||
+    {
 | 
						||
+        QList<QVariant> argumentList;
 | 
						||
+        argumentList << QVariant::fromValue(x);
 | 
						||
+        return asyncCallWithArgumentList(QLatin1String("MouseEvent"), argumentList);
 | 
						||
+    }
 | 
						||
+
 | 
						||
+    inline QDBusPendingReply<int> ProcessKeyEvent(uint keyval, uint keycode, uint state, int type, uint time)
 | 
						||
+    {
 | 
						||
+        QList<QVariant> 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<QVariant> argumentList;
 | 
						||
+        return asyncCallWithArgumentList(QLatin1String("Reset"), argumentList);
 | 
						||
+    }
 | 
						||
+
 | 
						||
+    inline QDBusPendingReply<> SetCapacity(uint caps)
 | 
						||
+    {
 | 
						||
+        QList<QVariant> argumentList;
 | 
						||
+        argumentList << QVariant::fromValue(caps);
 | 
						||
+        return asyncCallWithArgumentList(QLatin1String("SetCapacity"), argumentList);
 | 
						||
+    }
 | 
						||
+
 | 
						||
+    inline QDBusPendingReply<> SetCursorLocation(int x, int y)
 | 
						||
+    {
 | 
						||
+        QList<QVariant> 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<QVariant> 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<QVariant> argumentList;
 | 
						||
+        argumentList << QVariant::fromValue(text) << QVariant::fromValue(cursor) << QVariant::fromValue(anchor);
 | 
						||
+        return asyncCallWithArgumentList(QLatin1String("SetSurroundingText"), argumentList);
 | 
						||
+    }
 | 
						||
+
 | 
						||
+    inline QDBusPendingReply<> SetSurroundingTextPosition(uint cursor, uint anchor)
 | 
						||
+    {
 | 
						||
+        QList<QVariant> 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 <QDBusArgument>
 | 
						||
+#include <QDBusMetaType>
 | 
						||
+
 | 
						||
+// 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>("FcitxQtInputMethodItem");
 | 
						||
+    qDBusRegisterMetaType<FcitxQtInputMethodItem>();
 | 
						||
+    qRegisterMetaType<FcitxQtInputMethodItemList>("FcitxQtInputMethodItemList");
 | 
						||
+    qDBusRegisterMetaType<FcitxQtInputMethodItemList>();
 | 
						||
+}
 | 
						||
+
 | 
						||
+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 <QtCore/QString>
 | 
						||
+#include <QtCore/QMetaType>
 | 
						||
+#include <QtDBus/QDBusArgument>
 | 
						||
+
 | 
						||
+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<FcitxQtInputMethodItem> 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..068f4c2
 | 
						||
--- /dev/null
 | 
						||
+++ b/src/plugins/platforminputcontexts/fcitx/fcitxqtinputmethodproxy.cpp
 | 
						||
@@ -0,0 +1,26 @@
 | 
						||
+/*
 | 
						||
+ * 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 <QtCore/QObject>
 | 
						||
+#include <QtCore/QByteArray>
 | 
						||
+#include <QtCore/QList>
 | 
						||
+#include <QtCore/QMap>
 | 
						||
+#include <QtCore/QString>
 | 
						||
+#include <QtCore/QStringList>
 | 
						||
+#include <QtCore/QVariant>
 | 
						||
+#include <QtDBus/QtDBus>
 | 
						||
+#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<QVariant> argumentList;
 | 
						||
+        return asyncCallWithArgumentList(QLatin1String("ActivateIM"), argumentList);
 | 
						||
+    }
 | 
						||
+
 | 
						||
+    inline QDBusPendingReply<> Configure()
 | 
						||
+    {
 | 
						||
+        QList<QVariant> argumentList;
 | 
						||
+        return asyncCallWithArgumentList(QLatin1String("Configure"), argumentList);
 | 
						||
+    }
 | 
						||
+
 | 
						||
+    inline QDBusPendingReply<> ConfigureAddon(const QString &addon)
 | 
						||
+    {
 | 
						||
+        QList<QVariant> argumentList;
 | 
						||
+        argumentList << QVariant::fromValue(addon);
 | 
						||
+        return asyncCallWithArgumentList(QLatin1String("ConfigureAddon"), argumentList);
 | 
						||
+    }
 | 
						||
+
 | 
						||
+    inline QDBusPendingReply<> ConfigureIM(const QString &im)
 | 
						||
+    {
 | 
						||
+        QList<QVariant> argumentList;
 | 
						||
+        argumentList << QVariant::fromValue(im);
 | 
						||
+        return asyncCallWithArgumentList(QLatin1String("ConfigureIM"), argumentList);
 | 
						||
+    }
 | 
						||
+
 | 
						||
+    inline QDBusPendingReply<int, uint, uint, uint, uint> CreateIC()
 | 
						||
+    {
 | 
						||
+        QList<QVariant> argumentList;
 | 
						||
+        return asyncCallWithArgumentList(QLatin1String("CreateIC"), argumentList);
 | 
						||
+    }
 | 
						||
+    inline QDBusReply<int> CreateIC(uint &keyval1, uint &state1, uint &keyval2, uint &state2)
 | 
						||
+    {
 | 
						||
+        QList<QVariant> argumentList;
 | 
						||
+        QDBusMessage reply = callWithArgumentList(QDBus::Block, QLatin1String("CreateIC"), argumentList);
 | 
						||
+        if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 5) {
 | 
						||
+            keyval1 = qdbus_cast<uint>(reply.arguments().at(1));
 | 
						||
+            state1 = qdbus_cast<uint>(reply.arguments().at(2));
 | 
						||
+            keyval2 = qdbus_cast<uint>(reply.arguments().at(3));
 | 
						||
+            state2 = qdbus_cast<uint>(reply.arguments().at(4));
 | 
						||
+        }
 | 
						||
+        return reply;
 | 
						||
+    }
 | 
						||
+
 | 
						||
+    inline QDBusPendingReply<int, bool, uint, uint, uint, uint> CreateICv2(const QString &appname)
 | 
						||
+    {
 | 
						||
+        QList<QVariant> argumentList;
 | 
						||
+        argumentList << QVariant::fromValue(appname);
 | 
						||
+        return asyncCallWithArgumentList(QLatin1String("CreateICv2"), argumentList);
 | 
						||
+    }
 | 
						||
+    inline QDBusReply<int> CreateICv2(const QString &appname, bool &enable, uint &keyval1, uint &state1, uint &keyval2, uint &state2)
 | 
						||
+    {
 | 
						||
+        QList<QVariant> 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<bool>(reply.arguments().at(1));
 | 
						||
+            keyval1 = qdbus_cast<uint>(reply.arguments().at(2));
 | 
						||
+            state1 = qdbus_cast<uint>(reply.arguments().at(3));
 | 
						||
+            keyval2 = qdbus_cast<uint>(reply.arguments().at(4));
 | 
						||
+            state2 = qdbus_cast<uint>(reply.arguments().at(5));
 | 
						||
+        }
 | 
						||
+        return reply;
 | 
						||
+    }
 | 
						||
+
 | 
						||
+    inline QDBusPendingReply<int, bool, uint, uint, uint, uint> CreateICv3(const QString &appname, int pid)
 | 
						||
+    {
 | 
						||
+        QList<QVariant> argumentList;
 | 
						||
+        argumentList << QVariant::fromValue(appname) << QVariant::fromValue(pid);
 | 
						||
+        return asyncCallWithArgumentList(QLatin1String("CreateICv3"), argumentList);
 | 
						||
+    }
 | 
						||
+    inline QDBusReply<int> CreateICv3(const QString &appname, int pid, bool &enable, uint &keyval1, uint &state1, uint &keyval2, uint &state2)
 | 
						||
+    {
 | 
						||
+        QList<QVariant> 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<bool>(reply.arguments().at(1));
 | 
						||
+            keyval1 = qdbus_cast<uint>(reply.arguments().at(2));
 | 
						||
+            state1 = qdbus_cast<uint>(reply.arguments().at(3));
 | 
						||
+            keyval2 = qdbus_cast<uint>(reply.arguments().at(4));
 | 
						||
+            state2 = qdbus_cast<uint>(reply.arguments().at(5));
 | 
						||
+        }
 | 
						||
+        return reply;
 | 
						||
+    }
 | 
						||
+
 | 
						||
+    inline QDBusPendingReply<> Exit()
 | 
						||
+    {
 | 
						||
+        QList<QVariant> argumentList;
 | 
						||
+        return asyncCallWithArgumentList(QLatin1String("Exit"), argumentList);
 | 
						||
+    }
 | 
						||
+
 | 
						||
+    inline QDBusPendingReply<QString> GetCurrentIM()
 | 
						||
+    {
 | 
						||
+        QList<QVariant> argumentList;
 | 
						||
+        return asyncCallWithArgumentList(QLatin1String("GetCurrentIM"), argumentList);
 | 
						||
+    }
 | 
						||
+
 | 
						||
+    inline QDBusPendingReply<int> GetCurrentState()
 | 
						||
+    {
 | 
						||
+        QList<QVariant> argumentList;
 | 
						||
+        return asyncCallWithArgumentList(QLatin1String("GetCurrentState"), argumentList);
 | 
						||
+    }
 | 
						||
+
 | 
						||
+    inline QDBusPendingReply<QString> GetCurrentUI()
 | 
						||
+    {
 | 
						||
+        QList<QVariant> argumentList;
 | 
						||
+        return asyncCallWithArgumentList(QLatin1String("GetCurrentUI"), argumentList);
 | 
						||
+    }
 | 
						||
+
 | 
						||
+    inline QDBusPendingReply<QString> GetIMAddon(const QString &im)
 | 
						||
+    {
 | 
						||
+        QList<QVariant> argumentList;
 | 
						||
+        argumentList << QVariant::fromValue(im);
 | 
						||
+        return asyncCallWithArgumentList(QLatin1String("GetIMAddon"), argumentList);
 | 
						||
+    }
 | 
						||
+
 | 
						||
+    inline QDBusPendingReply<> InactivateIM()
 | 
						||
+    {
 | 
						||
+        QList<QVariant> argumentList;
 | 
						||
+        return asyncCallWithArgumentList(QLatin1String("InactivateIM"), argumentList);
 | 
						||
+    }
 | 
						||
+
 | 
						||
+    inline QDBusPendingReply<> ReloadAddonConfig(const QString &addon)
 | 
						||
+    {
 | 
						||
+        QList<QVariant> argumentList;
 | 
						||
+        argumentList << QVariant::fromValue(addon);
 | 
						||
+        return asyncCallWithArgumentList(QLatin1String("ReloadAddonConfig"), argumentList);
 | 
						||
+    }
 | 
						||
+
 | 
						||
+    inline QDBusPendingReply<> ReloadConfig()
 | 
						||
+    {
 | 
						||
+        QList<QVariant> argumentList;
 | 
						||
+        return asyncCallWithArgumentList(QLatin1String("ReloadConfig"), argumentList);
 | 
						||
+    }
 | 
						||
+
 | 
						||
+    inline QDBusPendingReply<> ResetIMList()
 | 
						||
+    {
 | 
						||
+        QList<QVariant> argumentList;
 | 
						||
+        return asyncCallWithArgumentList(QLatin1String("ResetIMList"), argumentList);
 | 
						||
+    }
 | 
						||
+
 | 
						||
+    inline QDBusPendingReply<> Restart()
 | 
						||
+    {
 | 
						||
+        QList<QVariant> argumentList;
 | 
						||
+        return asyncCallWithArgumentList(QLatin1String("Restart"), argumentList);
 | 
						||
+    }
 | 
						||
+
 | 
						||
+    inline QDBusPendingReply<> SetCurrentIM(const QString &im)
 | 
						||
+    {
 | 
						||
+        QList<QVariant> argumentList;
 | 
						||
+        argumentList << QVariant::fromValue(im);
 | 
						||
+        return asyncCallWithArgumentList(QLatin1String("SetCurrentIM"), argumentList);
 | 
						||
+    }
 | 
						||
+
 | 
						||
+    inline QDBusPendingReply<> ToggleIM()
 | 
						||
+    {
 | 
						||
+        QList<QVariant> 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 <QDBusArgument>
 | 
						||
+#include <QDBusMetaType>
 | 
						||
+
 | 
						||
+// 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>("FcitxQtKeyboardLayout");
 | 
						||
+    qDBusRegisterMetaType<FcitxQtKeyboardLayout>();
 | 
						||
+    qRegisterMetaType<FcitxQtKeyboardLayoutList>("FcitxQtKeyboardLayoutList");
 | 
						||
+    qDBusRegisterMetaType<FcitxQtKeyboardLayoutList>();
 | 
						||
+}
 | 
						||
+
 | 
						||
+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 <QtCore/QString>
 | 
						||
+#include <QtCore/QMetaType>
 | 
						||
+#include <QtDBus/QDBusArgument>
 | 
						||
+
 | 
						||
+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<FcitxQtKeyboardLayout> 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..7523a92
 | 
						||
--- /dev/null
 | 
						||
+++ b/src/plugins/platforminputcontexts/fcitx/fcitxqtkeyboardproxy.cpp
 | 
						||
@@ -0,0 +1,26 @@
 | 
						||
+/*
 | 
						||
+ * 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 <QtCore/QObject>
 | 
						||
+#include <QtCore/QByteArray>
 | 
						||
+#include <QtCore/QList>
 | 
						||
+#include <QtCore/QMap>
 | 
						||
+#include <QtCore/QString>
 | 
						||
+#include <QtCore/QStringList>
 | 
						||
+#include <QtCore/QVariant>
 | 
						||
+#include <QtDBus/QtDBus>
 | 
						||
+#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<QString, QString> GetLayoutForIM(const QString &im)
 | 
						||
+    {
 | 
						||
+        QList<QVariant> argumentList;
 | 
						||
+        argumentList << QVariant::fromValue(im);
 | 
						||
+        return asyncCallWithArgumentList(QLatin1String("GetLayoutForIM"), argumentList);
 | 
						||
+    }
 | 
						||
+    inline QDBusReply<QString> GetLayoutForIM(const QString &im, QString &variant)
 | 
						||
+    {
 | 
						||
+        QList<QVariant> 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<QString>(reply.arguments().at(1));
 | 
						||
+        }
 | 
						||
+        return reply;
 | 
						||
+    }
 | 
						||
+
 | 
						||
+    inline QDBusPendingReply<FcitxQtKeyboardLayoutList> GetLayouts()
 | 
						||
+    {
 | 
						||
+        QList<QVariant> argumentList;
 | 
						||
+        return asyncCallWithArgumentList(QLatin1String("GetLayouts"), argumentList);
 | 
						||
+    }
 | 
						||
+
 | 
						||
+    inline QDBusPendingReply<> SetLayoutForIM(const QString &im, const QString &layout, const QString &variant)
 | 
						||
+    {
 | 
						||
+        QList<QVariant> 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 @@
 | 
						||
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
 | 
						||
+"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
 | 
						||
+<node>
 | 
						||
+  <interface name="org.fcitx.Fcitx.InputContext">
 | 
						||
+    <method name="EnableIC">
 | 
						||
+    </method>
 | 
						||
+    <method name="CloseIC">
 | 
						||
+    </method>
 | 
						||
+    <method name="FocusIn">
 | 
						||
+    </method>
 | 
						||
+    <method name="FocusOut">
 | 
						||
+    </method>
 | 
						||
+    <method name="Reset">
 | 
						||
+    </method>
 | 
						||
+    <method name="MouseEvent">
 | 
						||
+      <arg name="x" direction="in" type="i" />
 | 
						||
+    </method>
 | 
						||
+    <method name="SetCursorLocation">
 | 
						||
+      <arg name="x" direction="in" type="i"/>
 | 
						||
+      <arg name="y" direction="in" type="i"/>
 | 
						||
+    </method>
 | 
						||
+    <method name="SetCursorRect">
 | 
						||
+      <arg name="x" direction="in" type="i"/>
 | 
						||
+      <arg name="y" direction="in" type="i"/>
 | 
						||
+      <arg name="w" direction="in" type="i"/>
 | 
						||
+      <arg name="h" direction="in" type="i"/>
 | 
						||
+    </method>
 | 
						||
+    <method name="SetCapacity">
 | 
						||
+       <arg name="caps" direction="in" type="u"/>
 | 
						||
+    </method>
 | 
						||
+    <method name="SetSurroundingText">
 | 
						||
+      <arg name="text" direction="in" type="s"/>
 | 
						||
+      <arg name="cursor" direction="in" type="u"/>
 | 
						||
+      <arg name="anchor" direction="in" type="u"/>
 | 
						||
+    </method>
 | 
						||
+    <method name="SetSurroundingTextPosition">
 | 
						||
+      <arg name="cursor" direction="in" type="u"/>
 | 
						||
+      <arg name="anchor" direction="in" type="u"/>
 | 
						||
+    </method>
 | 
						||
+    <method name="DestroyIC">
 | 
						||
+    </method>
 | 
						||
+    <method name="ProcessKeyEvent">
 | 
						||
+      <arg name="keyval" direction="in" type="u"/>
 | 
						||
+      <arg name="keycode" direction="in" type="u"/>
 | 
						||
+      <arg name="state" direction="in" type="u"/>
 | 
						||
+      <arg name="type" direction="in" type="i"/>
 | 
						||
+      <arg name="time" direction="in" type="u"/>
 | 
						||
+      <arg name="ret" direction="out" type="i"/>
 | 
						||
+    </method>
 | 
						||
+    <signal name="EnableIM">
 | 
						||
+    </signal>
 | 
						||
+    <signal name="CloseIM">
 | 
						||
+    </signal>
 | 
						||
+    <signal name="CommitString">
 | 
						||
+      <arg name="str" type="s"/>
 | 
						||
+    </signal>
 | 
						||
+    <signal name="UpdateFormattedPreedit">
 | 
						||
+      <arg name="str" type="a(si)" />
 | 
						||
+      <arg name="cursorpos" type="i"/>
 | 
						||
+      <annotation name="com.trolltech.QtDBus.QtTypeName.In0" value="FcitxQtFormattedPreeditList" />
 | 
						||
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="FcitxQtFormattedPreeditList" />
 | 
						||
+    </signal>
 | 
						||
+    <signal name="UpdateClientSideUI">
 | 
						||
+      <arg name="auxup" type="s"/>
 | 
						||
+      <arg name="auxdown" type="s"/>
 | 
						||
+      <arg name="preedit" type="s"/>
 | 
						||
+      <arg name="candidateword" type="s"/>
 | 
						||
+      <arg name="imname" type="s"/>
 | 
						||
+      <arg name="cursorpos" type="i"/>
 | 
						||
+    </signal>
 | 
						||
+    <signal name="ForwardKey">
 | 
						||
+      <arg name="keyval" type="u"/>
 | 
						||
+      <arg name="state" type="u"/>
 | 
						||
+      <arg name="type" type="i"/>
 | 
						||
+    </signal>
 | 
						||
+    <signal name="DeleteSurroundingText">
 | 
						||
+      <arg name="offset" type="i"/>
 | 
						||
+      <arg name="nchar" type="u"/>
 | 
						||
+    </signal>
 | 
						||
+  </interface>
 | 
						||
+</node>
 | 
						||
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 @@
 | 
						||
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
 | 
						||
+"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
 | 
						||
+<node>
 | 
						||
+  <interface name="org.fcitx.Fcitx.InputMethod">
 | 
						||
+    <method name="CreateIC">
 | 
						||
+      <arg name="icid" direction="out" type="i"/>
 | 
						||
+      <arg name="keyval1" direction="out" type="u"/>
 | 
						||
+      <arg name="state1" direction="out" type="u"/>
 | 
						||
+      <arg name="keyval2" direction="out" type="u"/>
 | 
						||
+      <arg name="state2" direction="out" type="u"/>
 | 
						||
+    </method>
 | 
						||
+    <method name="CreateICv2">
 | 
						||
+      <arg name="appname" direction="in" type="s"/>
 | 
						||
+      <arg name="icid" direction="out" type="i"/>
 | 
						||
+      <arg name="enable" direction="out" type="b"/>
 | 
						||
+      <arg name="keyval1" direction="out" type="u"/>
 | 
						||
+      <arg name="state1" direction="out" type="u"/>
 | 
						||
+      <arg name="keyval2" direction="out" type="u"/>
 | 
						||
+      <arg name="state2" direction="out" type="u"/>
 | 
						||
+    </method>
 | 
						||
+    <method name="CreateICv3">
 | 
						||
+      <arg name="appname" direction="in" type="s"/>
 | 
						||
+      <arg name="pid" direction="in" type="i"/>
 | 
						||
+      <arg name="icid" direction="out" type="i"/>
 | 
						||
+      <arg name="enable" direction="out" type="b"/>
 | 
						||
+      <arg name="keyval1" direction="out" type="u"/>
 | 
						||
+      <arg name="state1" direction="out" type="u"/>
 | 
						||
+      <arg name="keyval2" direction="out" type="u"/>
 | 
						||
+      <arg name="state2" direction="out" type="u"/>
 | 
						||
+    </method>
 | 
						||
+    <method name="Exit">
 | 
						||
+    </method>
 | 
						||
+    <method name="GetCurrentIM">
 | 
						||
+      <arg name="im" direction="out" type="s"/>
 | 
						||
+    </method>
 | 
						||
+    <method name="SetCurrentIM">
 | 
						||
+      <arg name="im" direction="in" type="s"/>
 | 
						||
+    </method>
 | 
						||
+    <method name="ReloadConfig">
 | 
						||
+    </method>
 | 
						||
+    <method name="ReloadAddonConfig">
 | 
						||
+      <arg name="addon" direction="in" type="s"/>
 | 
						||
+    </method>
 | 
						||
+    <method name="Restart">
 | 
						||
+    </method>
 | 
						||
+    <method name="Configure">
 | 
						||
+    </method>
 | 
						||
+    <method name="ConfigureAddon">
 | 
						||
+      <arg name="addon" direction="in" type="s"/>
 | 
						||
+    </method>
 | 
						||
+    <method name="ConfigureIM">
 | 
						||
+      <arg name="im" direction="in" type="s"/>
 | 
						||
+    </method>
 | 
						||
+    <method name="GetCurrentUI">
 | 
						||
+      <arg name="addon" direction="out" type="s"/>
 | 
						||
+    </method>
 | 
						||
+    <method name="GetIMAddon">
 | 
						||
+      <arg name="im" direction="in" type="s"/>
 | 
						||
+      <arg name="addon" direction="out" type="s"/>
 | 
						||
+    </method>
 | 
						||
+    <method name="ActivateIM">
 | 
						||
+    </method>
 | 
						||
+    <method name="InactivateIM">
 | 
						||
+    </method>
 | 
						||
+    <method name="ToggleIM">
 | 
						||
+    </method>
 | 
						||
+    <method name="ResetIMList">
 | 
						||
+    </method>
 | 
						||
+    <method name="GetCurrentState">
 | 
						||
+      <arg name="state" direction="out" type="i"/>
 | 
						||
+    </method>
 | 
						||
+    <property access="readwrite" type="a(sssb)" name="IMList">
 | 
						||
+      <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="true"/>
 | 
						||
+      <annotation name="com.trolltech.QtDBus.QtTypeName" value="FcitxQtInputMethodItemList" />
 | 
						||
+      <annotation name="org.qtproject.QtDBus.QtTypeName" value="FcitxQtInputMethodItemList" />
 | 
						||
+    </property>
 | 
						||
+    <property access="readwrite" type="s" name="CurrentIM">
 | 
						||
+    <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="true"/>
 | 
						||
+    </property>
 | 
						||
+  </interface>
 | 
						||
+</node>
 | 
						||
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 @@
 | 
						||
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
 | 
						||
+<node>
 | 
						||
+    <interface name="org.fcitx.Fcitx.Keyboard">
 | 
						||
+        <method name="GetLayouts">
 | 
						||
+            <arg name="layouts" direction="out" type="a(ssss)"/>
 | 
						||
+            <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="FcitxQtKeyboardLayoutList" />
 | 
						||
+            <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="FcitxQtKeyboardLayoutList" />
 | 
						||
+        </method>
 | 
						||
+        <method name="GetLayoutForIM">
 | 
						||
+            <arg name="im" direction="in" type="s"/>
 | 
						||
+            <arg name="layout" direction="out" type="s"/>
 | 
						||
+            <arg name="variant" direction="out" type="s"/>
 | 
						||
+        </method>
 | 
						||
+        <method name="SetLayoutForIM">
 | 
						||
+            <arg name="im" direction="in" type="s"/>
 | 
						||
+            <arg name="layout" direction="in" type="s"/>
 | 
						||
+            <arg name="variant" direction="in" type="s"/>
 | 
						||
+        </method>
 | 
						||
+    </interface>
 | 
						||
+</node>
 | 
						||
\ 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 <ellis@kde.org>
 | 
						||
+
 | 
						||
+    Win32 port:
 | 
						||
+    Copyright (C) 2004 Jaroslaw Staniek <js@iidea.pl>
 | 
						||
+
 | 
						||
+    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 <X11/keysym.h>
 | 
						||
+
 | 
						||
+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 <qstring.h>
 | 
						||
+
 | 
						||
+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 <stdint.h>
 | 
						||
+#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 <qglobal.h>
 | 
						||
+
 | 
						||
+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 <qpa/qplatforminputcontextplugin_p.h>
 | 
						||
+#include <QtCore/QStringList>
 | 
						||
+
 | 
						||
+#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 <QKeyEvent>
 | 
						||
+#include <QDBusConnection>
 | 
						||
+#include <QGuiApplication>
 | 
						||
+#include <QInputMethod>
 | 
						||
+#include <QTextCharFormat>
 | 
						||
+#include <QPalette>
 | 
						||
+#include <QWindow>
 | 
						||
+#include <qpa/qplatformscreen.h>
 | 
						||
+#include <qpa/qplatformcursor.h>
 | 
						||
+#include <qpa/qwindowsysteminterface.h>
 | 
						||
+
 | 
						||
+#include <unistd.h>
 | 
						||
+#include <errno.h>
 | 
						||
+#include <signal.h>
 | 
						||
+
 | 
						||
+#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<WId, FcitxQtICData *>::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<int>(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<FcitxCapacityFlags> 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<QInputMethodEvent::Attribute> 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<const QKeyEvent*>(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<ProcessKeyWatcher*>(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 <qpa/qplatforminputcontext.h>
 | 
						||
+#include <QWindow>
 | 
						||
+#include <QKeyEvent>
 | 
						||
+#include <QDBusConnection>
 | 
						||
+#include <QDBusServiceWatcher>
 | 
						||
+#include <QPointer>
 | 
						||
+#include <QFileSystemWatcher>
 | 
						||
+#include <QRect>
 | 
						||
+#include <xkbcommon/xkbcommon-compose.h>
 | 
						||
+#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<FcitxCapacityFlags> capacity;
 | 
						||
+    QPointer<FcitxQtInputContextProxy> 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<QWindow> 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<FcitxCapacityFlags> 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<FcitxCapacityFlags> 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<WId, FcitxQtICData*> m_icMap;
 | 
						||
+    QHash<QObject*, WId> m_windowToWidMap;
 | 
						||
+    WId m_lastWId;
 | 
						||
+    bool m_destroy;
 | 
						||
+    QScopedPointer<struct xkb_context, XkbContextDeleter> m_xkbContext;
 | 
						||
+    QScopedPointer<struct xkb_compose_table, XkbComposeTableDeleter>  m_xkbComposeTable;
 | 
						||
+    QScopedPointer<struct xkb_compose_state, XkbComposeStateDeleter> 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 <stdint.h>
 | 
						||
+
 | 
						||
+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 <daniel@fooishbar.org>
 | 
						||
+ */
 | 
						||
+
 | 
						||
+#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 <xkbcommon/xkbcommon.h>
 | 
						||
+
 | 
						||
+#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:
 | 
						||
+ *
 | 
						||
+ *     <dead_acute> <a>         : "á"   aacute # LATIN SMALL LETTER A WITH ACUTE
 | 
						||
+ *     <Multi_key> <A> <T>      : "@"   at     # COMMERCIAL AT
 | 
						||
+ *
 | 
						||
+ * When the user presses a key which produces the `<dead_acute>` keysym,
 | 
						||
+ * nothing initially happens (thus the key is dubbed a "dead-key").  But
 | 
						||
+ * when the user enters `<a>`, "á" is "composed", in place of "a".  If
 | 
						||
+ * instead the user had entered a keysym which does not follow
 | 
						||
+ * `<dead_acute>` 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
 | 
						||
+ * `<dead_acute> <b>`.  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, `<b>` is produced.
 | 
						||
+ * 3. Replay the entire sequence; that is, `<dead_acute> <b>` is produced.
 | 
						||
+ *    This is the approach taken by Microsoft Windows (approximately;
 | 
						||
+ *    instead of `<dead_acute>`, 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 <daniel@fooishbar.org>
 | 
						||
+ */
 | 
						||
+
 | 
						||
+#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 <xcb/xcb.h>
 | 
						||
+#include <xkbcommon/xkbcommon.h>
 | 
						||
+
 | 
						||
+#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 <daniel@fooishbar.org>
 | 
						||
+ */
 | 
						||
+
 | 
						||
+#ifndef _XKBCOMMON_H_
 | 
						||
+#define _XKBCOMMON_H_
 | 
						||
+
 | 
						||
+#include <stdint.h>
 | 
						||
+#include <stdio.h>
 | 
						||
+#include <stdarg.h>
 | 
						||
+
 | 
						||
+#include <xkbcommon/xkbcommon-names.h>
 | 
						||
+#include <xkbcommon/xkbcommon-keysyms.h>
 | 
						||
+
 | 
						||
+#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 \<A\> 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<codepoint>", 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 <em>keyboard
 | 
						||
+ * layout</em> 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 <em>shift levels</em>.  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 \<A\> 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 \<Alt\>\<Tab\>
 | 
						||
+ *    and to \<Alt\>\<Shift\>\<Tab\>.  Further, if only \<Alt\>\<Tab\> is
 | 
						||
+ *    bound to an action, pressing \<Alt\>\<Shift\>\<Tab\> 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 \<Alt\>\<Tab\> 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 \<Plus\> (+) symbol is found on the first level on some layouts,
 | 
						||
+ *    but requires holding Shift on others.  If you simply bind the action
 | 
						||
+ *    to the \<Plus\> 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 \<Shift\>\<Plus\>, 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 <xkbcommon/xkbcommon-compat.h>
 | 
						||
+
 | 
						||
+#ifdef __cplusplus
 | 
						||
+} /* extern "C" */
 | 
						||
+#endif
 | 
						||
+
 | 
						||
+#endif /* _XKBCOMMON_H_ */
 | 
						||
diff --git a/src/plugins/platforminputcontexts/platforminputcontexts.pro b/src/plugins/platforminputcontexts/platforminputcontexts.pro
 | 
						||
index faea54b..78afa43 100644
 | 
						||
--- a/src/plugins/platforminputcontexts/platforminputcontexts.pro
 | 
						||
+++ b/src/plugins/platforminputcontexts/platforminputcontexts.pro
 | 
						||
@@ -1,6 +1,8 @@
 | 
						||
 TEMPLATE = subdirs
 | 
						||
 
 | 
						||
 qtHaveModule(dbus) {
 | 
						||
+# add fcitx input context plugin to our static build
 | 
						||
+!mac:!win32:SUBDIRS += fcitx
 | 
						||
 !mac:!win32:SUBDIRS += ibus
 | 
						||
 }
 | 
						||
 
 | 
						||
diff --git a/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm b/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm
 | 
						||
index 6c673a4..e90b3ba 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;
 | 
						||
+        // don't terminate if reflectionDelegate does not respond to that selector, just use the default
 | 
						||
+        //return NSTerminateNow;
 | 
						||
     }
 | 
						||
 
 | 
						||
     if ([self canQuit]) {
 | 
						||
diff --git a/src/plugins/platforms/cocoa/qcocoabackingstore.h b/src/plugins/platforms/cocoa/qcocoabackingstore.h
 | 
						||
index 3737584..1f015e9 100644
 | 
						||
--- a/src/plugins/platforms/cocoa/qcocoabackingstore.h
 | 
						||
+++ b/src/plugins/platforms/cocoa/qcocoabackingstore.h
 | 
						||
@@ -60,6 +60,8 @@ public:
 | 
						||
 private:
 | 
						||
     QImage m_qImage;
 | 
						||
     QSize m_requestedSize;
 | 
						||
+	// 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..f681b08 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)
 | 
						||
+    // optimize redraw - don't clear image if it will be fully redrawn
 | 
						||
+    : QPlatformBackingStore(window), m_qImageNeedsClear(false)
 | 
						||
 {
 | 
						||
 }
 | 
						||
 
 | 
						||
@@ -59,9 +60,11 @@ QPaintDevice *QCocoaBackingStore::paintDevice()
 | 
						||
     if (m_qImage.size() != effectiveBufferSize) {
 | 
						||
         QImage::Format format = (window()->format().hasAlpha() || cocoaWindow->m_drawContentBorderGradient)
 | 
						||
                 ? QImage::Format_ARGB32_Premultiplied : QImage::Format_RGB32;
 | 
						||
+        // 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 +103,8 @@ bool QCocoaBackingStore::scroll(const QRegion &area, int dx, int dy)
 | 
						||
 
 | 
						||
 void QCocoaBackingStore::beginPaint(const QRegion ®ion)
 | 
						||
 {
 | 
						||
-    if (m_qImage.hasAlphaChannel()) {
 | 
						||
+    // 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<QRect> rects = region.rects();
 | 
						||
diff --git a/src/plugins/platforms/cocoa/qcocoakeymapper.mm b/src/plugins/platforms/cocoa/qcocoakeymapper.mm
 | 
						||
index c2d206f..0d4d7ab 100644
 | 
						||
--- a/src/plugins/platforms/cocoa/qcocoakeymapper.mm
 | 
						||
+++ b/src/plugins/platforms/cocoa/qcocoakeymapper.mm
 | 
						||
@@ -384,6 +384,11 @@ bool QCocoaKeyMapper::updateKeyboard()
 | 
						||
         keyboardInputLocale = QLocale::c();
 | 
						||
         keyboardInputDirection = Qt::LeftToRight;
 | 
						||
     }
 | 
						||
+
 | 
						||
+    const auto newMode = keyboard_mode;
 | 
						||
+    deleteLayouts();
 | 
						||
+    keyboard_mode = newMode;
 | 
						||
+
 | 
						||
     return true;
 | 
						||
 }
 | 
						||
 
 | 
						||
@@ -466,7 +471,7 @@ QList<int> 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));
 | 
						||
+            ret << int(key + neededMods);
 | 
						||
         }
 | 
						||
     }
 | 
						||
     return ret;
 | 
						||
diff --git a/src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm b/src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm
 | 
						||
index 713758c..9b23ca2 100755
 | 
						||
--- 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;
 | 
						||
+    // create a good os x tray icon
 | 
						||
+    bool menuVisible, iconSelected;
 | 
						||
     QIcon icon;
 | 
						||
     QT_MANGLE_NAMESPACE(QNSImageView) *imageCell;
 | 
						||
 }
 | 
						||
@@ -197,8 +199,12 @@ 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;
 | 
						||
-    const int menuHeight = [[[NSApplication sharedApplication] mainMenu] menuBarHeight];
 | 
						||
+    // create a good os x tray icon
 | 
						||
+    const int padding = 0;
 | 
						||
+    int menuHeight = [[[NSApplication sharedApplication] mainMenu] menuBarHeight];
 | 
						||
+    if (menuHeight <= 0) {
 | 
						||
+        menuHeight = 22;
 | 
						||
+    }
 | 
						||
     const int maxImageHeight = menuHeight - padding;
 | 
						||
 
 | 
						||
     // Select pixmap based on the device pixel height. Ideally we would use
 | 
						||
@@ -207,8 +213,11 @@ void QCocoaSystemTrayIcon::updateIcon(const QIcon &icon)
 | 
						||
     // devicePixelRatio for the "best" screen on the system.
 | 
						||
     qreal devicePixelRatio = qApp->devicePixelRatio();
 | 
						||
     const int maxPixmapHeight = maxImageHeight * devicePixelRatio;
 | 
						||
+    // create a good os x tray icon
 | 
						||
+    const QIcon::Mode mode = m_sys->item->iconSelected ? QIcon::Selected : QIcon::Normal;
 | 
						||
     QSize selectedSize;
 | 
						||
-    Q_FOREACH (const QSize& size, sortByHeight(icon.availableSizes())) {
 | 
						||
+    // create a good os x tray icon
 | 
						||
+    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 +233,11 @@ 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));
 | 
						||
+        // create a good os x tray icon
 | 
						||
+        selectedSize = icon.actualSize(QSize(maxPixmapHeight, maxPixmapHeight), mode);
 | 
						||
 
 | 
						||
-    QPixmap pixmap = icon.pixmap(selectedSize);
 | 
						||
+    // create a good os x tray icon
 | 
						||
+    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.
 | 
						||
@@ -373,6 +384,11 @@ QT_END_NAMESPACE
 | 
						||
     Q_UNUSED(notification);
 | 
						||
     down = NO;
 | 
						||
 
 | 
						||
+    // create a good os x tray icon
 | 
						||
+    parent->iconSelected = false;
 | 
						||
+    parent->systray->updateIcon(parent->icon);
 | 
						||
+    parent->menuVisible = false;
 | 
						||
+
 | 
						||
     [self setNeedsDisplay:YES];
 | 
						||
 }
 | 
						||
 
 | 
						||
@@ -382,6 +398,10 @@ QT_END_NAMESPACE
 | 
						||
     int clickCount = [mouseEvent clickCount];
 | 
						||
     [self setNeedsDisplay:YES];
 | 
						||
 
 | 
						||
+    // create a good os x tray icon
 | 
						||
+    parent->iconSelected = (clickCount != 2) && parent->menu;
 | 
						||
+    parent->systray->updateIcon(parent->icon);
 | 
						||
+
 | 
						||
     if (clickCount == 2) {
 | 
						||
         [self menuTrackingDone:nil];
 | 
						||
         [parent doubleClickSelector:self];
 | 
						||
@@ -398,6 +418,11 @@ QT_END_NAMESPACE
 | 
						||
 -(void)mouseUp:(NSEvent *)mouseEvent
 | 
						||
 {
 | 
						||
     Q_UNUSED(mouseEvent);
 | 
						||
+
 | 
						||
+    // create a good os x tray icon
 | 
						||
+    parent->iconSelected = false;
 | 
						||
+    parent->systray->updateIcon(parent->icon);
 | 
						||
+
 | 
						||
     [self menuTrackingDone:nil];
 | 
						||
 }
 | 
						||
 
 | 
						||
@@ -409,6 +434,11 @@ QT_END_NAMESPACE
 | 
						||
 -(void)rightMouseUp:(NSEvent *)mouseEvent
 | 
						||
 {
 | 
						||
     Q_UNUSED(mouseEvent);
 | 
						||
+
 | 
						||
+    // create a good os x tray icon
 | 
						||
+    parent->iconSelected = false;
 | 
						||
+    parent->systray->updateIcon(parent->icon);
 | 
						||
+
 | 
						||
     [self menuTrackingDone:nil];
 | 
						||
 }
 | 
						||
 
 | 
						||
@@ -424,7 +454,8 @@ QT_END_NAMESPACE
 | 
						||
 }
 | 
						||
 
 | 
						||
 -(void)drawRect:(NSRect)rect {
 | 
						||
-    [[parent item] drawStatusBarBackgroundInRect:rect withHighlight:down];
 | 
						||
+    // create a good os x tray icon
 | 
						||
+    [[parent item] drawStatusBarBackgroundInRect:rect withHighlight:parent->menu ? down : NO];
 | 
						||
     [super drawRect:rect];
 | 
						||
 }
 | 
						||
 @end
 | 
						||
@@ -436,7 +467,9 @@ QT_END_NAMESPACE
 | 
						||
     self = [super init];
 | 
						||
     if (self) {
 | 
						||
         item = [[[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength] retain];
 | 
						||
+        // create a good os x tray icon
 | 
						||
         menu = 0;
 | 
						||
+        menuVisible = false;
 | 
						||
         systray = sys;
 | 
						||
         imageCell = [[QNSImageView alloc] initWithParent:self];
 | 
						||
         [item setView: imageCell];
 | 
						||
@@ -481,6 +514,8 @@ QT_END_NAMESPACE
 | 
						||
          selector:@selector(menuTrackingDone:)
 | 
						||
              name:NSMenuDidEndTrackingNotification
 | 
						||
                  object:m];
 | 
						||
+        // create a good os x tray icon
 | 
						||
+        menuVisible = true;
 | 
						||
         [item popUpStatusItemMenu: m];
 | 
						||
     }
 | 
						||
 }
 | 
						||
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm
 | 
						||
index 3188463..cbee264 100644
 | 
						||
--- a/src/plugins/platforms/cocoa/qcocoawindow.mm
 | 
						||
+++ b/src/plugins/platforms/cocoa/qcocoawindow.mm
 | 
						||
@@ -142,7 +142,8 @@ static bool isMouseEvent(NSEvent *ev)
 | 
						||
     if (!self.window.delegate)
 | 
						||
         return; // Already detached, pending NSAppKitDefined event
 | 
						||
 
 | 
						||
-    if (pw && pw->frameStrutEventsEnabled() && isMouseEvent(theEvent)) {
 | 
						||
+    // 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];
 | 
						||
@@ -924,6 +925,15 @@ void QCocoaWindow::setWindowFilePath(const QString &filePath)
 | 
						||
     [m_nsWindow setRepresentedFilename: fi.exists() ? QCFString::toNSString(filePath) : @""];
 | 
						||
 }
 | 
						||
 
 | 
						||
+// create a good os x window icon
 | 
						||
+qreal _win_devicePixelRatio() {
 | 
						||
+    qreal result = 1.0;
 | 
						||
+    foreach (QScreen *screen, QGuiApplication::screens()) {
 | 
						||
+        result = qMax(result, screen->devicePixelRatio());
 | 
						||
+    }
 | 
						||
+    return result;
 | 
						||
+}
 | 
						||
+
 | 
						||
 void QCocoaWindow::setWindowIcon(const QIcon &icon)
 | 
						||
 {
 | 
						||
     QCocoaAutoReleasePool pool;
 | 
						||
@@ -939,7 +949,9 @@ void QCocoaWindow::setWindowIcon(const QIcon &icon)
 | 
						||
     if (icon.isNull()) {
 | 
						||
         [iconButton setImage:nil];
 | 
						||
     } else {
 | 
						||
-        QPixmap pixmap = icon.pixmap(QSize(22, 22));
 | 
						||
+        // create a good os x window icon
 | 
						||
+        CGFloat hgt = 16. * _win_devicePixelRatio();
 | 
						||
+        QPixmap pixmap = icon.pixmap(QSize(hgt, hgt));
 | 
						||
         NSImage *image = static_cast<NSImage *>(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 1ec33df..45d436c 100644
 | 
						||
--- a/src/plugins/platforms/cocoa/qnsview.mm
 | 
						||
+++ b/src/plugins/platforms/cocoa/qnsview.mm
 | 
						||
@@ -1357,7 +1357,8 @@ 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) {
 | 
						||
+        // fix actual begin handle of swipe on trackpad
 | 
						||
+        if (phase == NSEventPhaseMayBegin || phase == NSEventPhaseBegan) {
 | 
						||
             m_scrolling = true;
 | 
						||
             ph = Qt::ScrollBegin;
 | 
						||
         }
 | 
						||
@@ -1418,14 +1419,20 @@ 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];
 | 
						||
-    }
 | 
						||
+    if ([characters length] != 0) // https://bugreports.qt.io/browse/QTBUG-42584
 | 
						||
+        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];
 | 
						||
+    //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];
 | 
						||
+    //}
 | 
						||
 
 | 
						||
     // we will send a key event unless the input method sets m_sendKeyEvent to false
 | 
						||
     m_sendKeyEvent = true;
 | 
						||
@@ -1502,6 +1509,11 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent)
 | 
						||
                 && qtKey == Qt::Key_Period) {
 | 
						||
             [self handleKeyEvent:nsevent eventType:int(QEvent::KeyPress)];
 | 
						||
             return YES;
 | 
						||
+        // enable Ctrl+Tab and Ctrl+Shift+Tab / Ctrl+Backtab handle in-app
 | 
						||
+        } else 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];
 | 
						||
diff --git a/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp b/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp
 | 
						||
index da0ba27..3f6388c 100644
 | 
						||
--- a/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp
 | 
						||
+++ b/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp
 | 
						||
@@ -713,6 +713,9 @@ public:
 | 
						||
     QList<QUrl> selectedFiles() const;
 | 
						||
     void setSelectedFiles(const QList<QUrl> &);
 | 
						||
     QString selectedFile() const;
 | 
						||
+	// adding select-by-url for Windows file dialog
 | 
						||
+	void setSelectedRemoteContent(const QByteArray &);
 | 
						||
+	QByteArray selectedRemoteContent() const;
 | 
						||
 
 | 
						||
 private:
 | 
						||
     class Data : public QSharedData {
 | 
						||
@@ -720,6 +723,8 @@ private:
 | 
						||
         QUrl directory;
 | 
						||
         QString selectedNameFilter;
 | 
						||
         QList<QUrl> selectedFiles;
 | 
						||
+		// adding select-by-url for Windows file dialog
 | 
						||
+		QByteArray selectedRemoteContent;
 | 
						||
         QMutex mutex;
 | 
						||
     };
 | 
						||
     QExplicitlySharedDataPointer<Data> m_data;
 | 
						||
@@ -773,6 +778,21 @@ inline void QWindowsFileDialogSharedData::setSelectedFiles(const QList<QUrl> &ur
 | 
						||
     m_data->selectedFiles = urls;
 | 
						||
 }
 | 
						||
 
 | 
						||
+// 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<QFileDialogOptions> &o)
 | 
						||
 {
 | 
						||
     QMutexLocker (&m_data->mutex);
 | 
						||
@@ -896,6 +916,8 @@ public:
 | 
						||
     // Return the result for tracking in OnFileOk(). Differs from selection for
 | 
						||
     // example by appended default suffixes, etc.
 | 
						||
     virtual QList<QUrl> dialogResult() const = 0;
 | 
						||
+	// adding select-by-url for Windows file dialog
 | 
						||
+	virtual QByteArray dialogRemoteContent() const { return QByteArray(); }
 | 
						||
 
 | 
						||
     inline void onFolderChange(IShellItem *);
 | 
						||
     inline void onSelectionChange();
 | 
						||
@@ -1332,8 +1354,16 @@ 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());
 | 
						||
+	// fix handle of full fileName
 | 
						||
+	if (!isClsid(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
 | 
						||
@@ -1403,6 +1433,8 @@ bool QWindowsNativeFileDialogBase::onFileOk()
 | 
						||
 {
 | 
						||
     // Store selected files as GetResults() returns invalid data after the dialog closes.
 | 
						||
     m_data.setSelectedFiles(dialogResult());
 | 
						||
+	// adding select-by-url for Windows file dialog
 | 
						||
+	m_data.setSelectedRemoteContent(dialogRemoteContent());
 | 
						||
     return true;
 | 
						||
 }
 | 
						||
 
 | 
						||
@@ -1531,6 +1563,8 @@ public:
 | 
						||
         QWindowsNativeFileDialogBase(data) {}
 | 
						||
     virtual QList<QUrl> selectedFiles() const;
 | 
						||
     virtual QList<QUrl> dialogResult() const;
 | 
						||
+	// adding select-by-url for Windows file dialog
 | 
						||
+	virtual QByteArray dialogRemoteContent() const;
 | 
						||
 
 | 
						||
 private:
 | 
						||
     inline IFileOpenDialog *openFileDialog() const
 | 
						||
@@ -1546,6 +1580,57 @@ QList<QUrl> QWindowsNativeOpenFileDialog::dialogResult() const
 | 
						||
     return result;
 | 
						||
 }
 | 
						||
 
 | 
						||
+// 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<void **>(&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<QUrl> QWindowsNativeOpenFileDialog::selectedFiles() const
 | 
						||
 {
 | 
						||
     QList<QUrl> result;
 | 
						||
@@ -1609,6 +1694,8 @@ public:
 | 
						||
     virtual QUrl directory() const Q_DECL_OVERRIDE;
 | 
						||
     virtual void selectFile(const QUrl &filename) Q_DECL_OVERRIDE;
 | 
						||
     virtual QList<QUrl> selectedFiles() const Q_DECL_OVERRIDE;
 | 
						||
+	// 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;
 | 
						||
@@ -1702,6 +1789,12 @@ QList<QUrl> QWindowsFileDialogHelper::selectedFiles() const
 | 
						||
     return m_data.selectedFiles();
 | 
						||
 }
 | 
						||
 
 | 
						||
+// adding select-by-url for Windows file dialog
 | 
						||
+QByteArray QWindowsFileDialogHelper::selectedRemoteContent() const
 | 
						||
+{
 | 
						||
+	return m_data.selectedRemoteContent();
 | 
						||
+}
 | 
						||
+
 | 
						||
 void QWindowsFileDialogHelper::setFilter()
 | 
						||
 {
 | 
						||
     qCDebug(lcQpaDialogs) << __FUNCTION__;
 | 
						||
@@ -1992,6 +2085,8 @@ public:
 | 
						||
     virtual QUrl directory() const Q_DECL_OVERRIDE;
 | 
						||
     virtual void selectFile(const QUrl &url) Q_DECL_OVERRIDE;
 | 
						||
     virtual QList<QUrl> selectedFiles() const Q_DECL_OVERRIDE;
 | 
						||
+	// 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 &) Q_DECL_OVERRIDE;
 | 
						||
     virtual QString selectedNameFilter() const Q_DECL_OVERRIDE;
 | 
						||
@@ -2035,6 +2130,12 @@ QList<QUrl> QWindowsXpFileDialogHelper::selectedFiles() const
 | 
						||
     return m_data.selectedFiles();
 | 
						||
 }
 | 
						||
 
 | 
						||
+// 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/qwindowsservices.cpp b/src/plugins/platforms/windows/qwindowsservices.cpp
 | 
						||
index cc697ba..e1d9bce 100644
 | 
						||
--- a/src/plugins/platforms/windows/qwindowsservices.cpp
 | 
						||
+++ b/src/plugins/platforms/windows/qwindowsservices.cpp
 | 
						||
@@ -123,6 +123,8 @@ static inline bool launchMail(const QUrl &url)
 | 
						||
             command.prepend(doubleQuote);
 | 
						||
         }
 | 
						||
     }
 | 
						||
+	// fix mail launch if no param is expected here
 | 
						||
+	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 288f73c..c859833 100644
 | 
						||
--- a/src/plugins/platforms/windows/qwindowswindow.cpp
 | 
						||
+++ b/src/plugins/platforms/windows/qwindowswindow.cpp
 | 
						||
@@ -973,7 +973,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();
 | 
						||
+				// fix possibility of add / remove taskbar icon of the window
 | 
						||
+				tw->clearTransientParent();
 | 
						||
         QWindowsContext *context = QWindowsContext::instance();
 | 
						||
         if (context->windowUnderMouse() == window())
 | 
						||
             context->clearWindowUnderMouse();
 | 
						||
@@ -1178,11 +1179,26 @@ 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();
 | 
						||
-    if (newTransientParent != oldTransientParent)
 | 
						||
+	// 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
 | 
						||
 }
 | 
						||
 
 | 
						||
+// 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
 | 
						||
+}
 | 
						||
+
 | 
						||
 static inline bool testShowWithoutActivating(const QWindow *window)
 | 
						||
 {
 | 
						||
     // QWidget-attribute Qt::WA_ShowWithoutActivating .
 | 
						||
@@ -1626,7 +1642,7 @@ void QWindowsWindow::setWindowState(Qt::WindowState state)
 | 
						||
 
 | 
						||
 bool QWindowsWindow::isFullScreen_sys() const
 | 
						||
 {
 | 
						||
-    return window()->isTopLevel()
 | 
						||
+    return window()->isTopLevel() && window()->screen()
 | 
						||
         && geometry_sys() == QWindowsScaling::mapToNative(window()->screen()->geometry());
 | 
						||
 }
 | 
						||
 
 | 
						||
diff --git a/src/plugins/platforms/windows/qwindowswindow.h b/src/plugins/platforms/windows/qwindowswindow.h
 | 
						||
index fff90b4..47375a7 100644
 | 
						||
--- a/src/plugins/platforms/windows/qwindowswindow.h
 | 
						||
+++ b/src/plugins/platforms/windows/qwindowswindow.h
 | 
						||
@@ -273,6 +273,8 @@ private:
 | 
						||
     inline void setWindowState_sys(Qt::WindowState newState);
 | 
						||
     inline void setParent_sys(const QPlatformWindow *parent);
 | 
						||
     inline void updateTransientParent() const;
 | 
						||
+	// 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 c9e6a19..d150ac8 100644
 | 
						||
--- a/src/widgets/dialogs/qfiledialog.cpp
 | 
						||
+++ b/src/widgets/dialogs/qfiledialog.cpp
 | 
						||
@@ -1201,6 +1201,15 @@ QList<QUrl> QFileDialogPrivate::userSelectedFiles() const
 | 
						||
     return files;
 | 
						||
 }
 | 
						||
 
 | 
						||
+// 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;
 | 
						||
@@ -1264,6 +1273,14 @@ QStringList QFileDialog::selectedFiles() const
 | 
						||
     return files;
 | 
						||
 }
 | 
						||
 
 | 
						||
+// 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 95209bc..e58ae5d 100644
 | 
						||
--- a/src/widgets/dialogs/qfiledialog.h
 | 
						||
+++ b/src/widgets/dialogs/qfiledialog.h
 | 
						||
@@ -106,6 +106,8 @@ public:
 | 
						||
 
 | 
						||
     void selectFile(const QString &filename);
 | 
						||
     QStringList selectedFiles() const;
 | 
						||
+	// adding select-by-url for Windows file dialog
 | 
						||
+	QByteArray selectedRemoteContent() const;
 | 
						||
 
 | 
						||
     void selectUrl(const QUrl &url);
 | 
						||
     QList<QUrl> selectedUrls() const;
 | 
						||
diff --git a/src/widgets/dialogs/qfiledialog_p.h b/src/widgets/dialogs/qfiledialog_p.h
 | 
						||
index f610e46..37d4b9d 100644
 | 
						||
--- a/src/widgets/dialogs/qfiledialog_p.h
 | 
						||
+++ b/src/widgets/dialogs/qfiledialog_p.h
 | 
						||
@@ -123,6 +123,8 @@ public:
 | 
						||
     static QString initialSelection(const QUrl &path);
 | 
						||
     QStringList typedFiles() const;
 | 
						||
     QList<QUrl> userSelectedFiles() const;
 | 
						||
+	// adding select-by-url for Windows file dialog
 | 
						||
+	QByteArray userSelectedRemoteContent() const;
 | 
						||
     QStringList addDefaultSuffixToFiles(const QStringList &filesToFix) const;
 | 
						||
     QList<QUrl> addDefaultSuffixToUrls(const QList<QUrl> &urlsToFix) const;
 | 
						||
     bool removeDirectory(const QString &path);
 | 
						||
@@ -256,6 +258,8 @@ public:
 | 
						||
     QUrl directory_sys() const;
 | 
						||
     void selectFile_sys(const QUrl &filename);
 | 
						||
     QList<QUrl> selectedFiles_sys() const;
 | 
						||
+	// 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 +397,14 @@ inline QList<QUrl> QFileDialogPrivate::selectedFiles_sys() const
 | 
						||
     return QList<QUrl>();
 | 
						||
 }
 | 
						||
 
 | 
						||
+// 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 49da4d1..96a9846 100644
 | 
						||
--- a/src/widgets/kernel/qwidget.cpp
 | 
						||
+++ b/src/widgets/kernel/qwidget.cpp
 | 
						||
@@ -8696,7 +8696,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?
 | 
						||
+		// 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 358e4c3..1f0e978 100644
 | 
						||
--- a/src/widgets/util/qsystemtrayicon.cpp
 | 
						||
+++ b/src/widgets/util/qsystemtrayicon.cpp
 | 
						||
@@ -711,7 +711,10 @@ void QSystemTrayIconPrivate::updateMenu_sys_qpa()
 | 
						||
     if (menu) {
 | 
						||
         addPlatformMenu(menu);
 | 
						||
         qpa_sys->updateMenu(menu->platformMenu());
 | 
						||
-    }
 | 
						||
+	// create a good os x tray icon
 | 
						||
+	} else {
 | 
						||
+		qpa_sys->updateMenu(0);
 | 
						||
+	}
 | 
						||
 }
 | 
						||
 
 | 
						||
 void QSystemTrayIconPrivate::updateToolTip_sys_qpa()
 | 
						||
diff --git a/src/widgets/widgets/qwidgetlinecontrol.cpp b/src/widgets/widgets/qwidgetlinecontrol.cpp
 | 
						||
index 759e41a..b4166f8 100644
 | 
						||
--- a/src/widgets/widgets/qwidgetlinecontrol.cpp
 | 
						||
+++ b/src/widgets/widgets/qwidgetlinecontrol.cpp
 | 
						||
@@ -40,6 +40,7 @@
 | 
						||
 #include <private/qguiapplication_p.h>
 | 
						||
 #include <qpa/qplatformtheme.h>
 | 
						||
 #include <qstylehints.h>
 | 
						||
+#include <QtCore/QLocale>
 | 
						||
 #ifndef QT_NO_ACCESSIBILITY
 | 
						||
 #include "qaccessible.h"
 | 
						||
 #endif
 | 
						||
@@ -1880,11 +1881,19 @@ 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)) {
 | 
						||
+	// enable Ctrl+key and Ctrl+Shift+key in all locales except German
 | 
						||
+	// see https://github.com/telegramdesktop/tdesktop/pull/1185
 | 
						||
+	bool skip = false;
 | 
						||
+	if (QGuiApplication::inputMethod()->locale().language() == QLocale::German) {
 | 
						||
+		if (event->modifiers() == Qt::ControlModifier
 | 
						||
+			|| event->modifiers() == (Qt::ShiftModifier | Qt::ControlModifier)) {
 | 
						||
+			skip = true;
 | 
						||
+		}
 | 
						||
+	}
 | 
						||
+	if (unknown && !isReadOnly() && !skip) {
 | 
						||
         QString t = event->text();
 | 
						||
-        if (!t.isEmpty() && t.at(0).isPrint()) {
 | 
						||
+		// 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 72007ac..5846f60 100644
 | 
						||
--- a/src/widgets/widgets/qwidgettextcontrol.cpp
 | 
						||
+++ b/src/widgets/widgets/qwidgettextcontrol.cpp
 | 
						||
@@ -1342,13 +1342,22 @@ 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)) {
 | 
						||
+		// enable Ctrl+key and Ctrl+Shift+key in all locales except German
 | 
						||
+		// see https://github.com/telegramdesktop/tdesktop/pull/1185
 | 
						||
+		bool skip = false;
 | 
						||
+		if (QGuiApplication::inputMethod()->locale().language() == QLocale::German) {
 | 
						||
+			if (e->modifiers() == Qt::ControlModifier
 | 
						||
+				|| e->modifiers() == (Qt::ShiftModifier | Qt::ControlModifier)) {
 | 
						||
+				skip = true;
 | 
						||
+			}
 | 
						||
+		}
 | 
						||
+		if (skip) {
 | 
						||
             e->ignore();
 | 
						||
             return;
 | 
						||
         }
 | 
						||
         QString text = e->text();
 | 
						||
-        if (!text.isEmpty() && (text.at(0).isPrint() || text.at(0) == QLatin1Char('\t'))) {
 | 
						||
+		// 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
 |