diff --git a/configure b/configure index ab5e7ecbb0..aa840cbd73 100755 --- a/configure +++ b/configure @@ -5290,9 +5290,11 @@ if [ "$CFG_XKBCOMMON" != "qt" ]; then if [ -n "$PKG_CONFIG" ] && $PKG_CONFIG --exists "xkbcommon >= 0.2.0" 2>/dev/null; then QMAKE_CFLAGS_XKBCOMMON="`$PKG_CONFIG --cflags xkbcommon 2>/dev/null`" QMAKE_LIBS_XKBCOMMON="`$PKG_CONFIG --libs xkbcommon 2>/dev/null`" + QMAKE_VERSION_XKBCOMMON="`$PKG_CONFIG --modversion xkbcommon 2>/dev/null`" QMakeVar set QMAKE_CFLAGS_XKBCOMMON "$QMAKE_CFLAGS_XKBCOMMON" QMakeVar set QMAKE_LIBS_XKBCOMMON "$QMAKE_LIBS_XKBCOMMON" + QMakeVar set QMAKE_VERSION_XKBCOMMON "$QMAKE_VERSION_XKBCOMMON" CFG_XKBCOMMON=yes else CFG_XKBCOMMON=no diff --git a/src/plugins/platforminputcontexts/compose/xkbcommon_workaround.h b/src/3rdparty/xkbcommon/xkbcommon/xkbcommon_workaround.h similarity index 100% rename from src/plugins/platforminputcontexts/compose/xkbcommon_workaround.h rename to src/3rdparty/xkbcommon/xkbcommon/xkbcommon_workaround.h diff --git a/src/plugins/platforminputcontexts/compose/compose.pro b/src/plugins/platforminputcontexts/compose/compose.pro index 1bfd46ebca..2490a4ffbe 100644 --- a/src/plugins/platforminputcontexts/compose/compose.pro +++ b/src/plugins/platforminputcontexts/compose/compose.pro @@ -15,7 +15,6 @@ SOURCES += $$PWD/main.cpp \ HEADERS += $$PWD/qcomposeplatforminputcontext.h \ $$PWD/generator/qtablegenerator.h \ - $$PWD/xkbcommon_workaround.h \ # libxkbcommon contains(QT_CONFIG, xkbcommon-qt): { @@ -23,6 +22,10 @@ contains(QT_CONFIG, xkbcommon-qt): { } else { LIBS += $$QMAKE_LIBS_XKBCOMMON QMAKE_CXXFLAGS += $$QMAKE_CFLAGS_XKBCOMMON + equals(QMAKE_VERSION_XKBCOMMON, "0.2.0") { + DEFINES += XKBCOMMON_0_2_0 + INCLUDEPATH += ../../../3rdparty/xkbcommon/xkbcommon/ + } } OTHER_FILES += $$PWD/compose.json diff --git a/src/plugins/platforminputcontexts/compose/generator/qtablegenerator.cpp b/src/plugins/platforminputcontexts/compose/generator/qtablegenerator.cpp index 400f7aece8..f746207cc0 100644 --- a/src/plugins/platforminputcontexts/compose/generator/qtablegenerator.cpp +++ b/src/plugins/platforminputcontexts/compose/generator/qtablegenerator.cpp @@ -49,7 +49,10 @@ #include #include + +#ifdef XKBCOMMON_0_2_0 #include +#endif //#define DEBUG_GENERATOR @@ -258,6 +261,7 @@ ushort TableGenerator::keysymToUtf8(quint32 sym) int bytes; chars.resize(8); +#ifdef XKBCOMMON_0_2_0 if (needWorkaround(sym)) { quint32 codepoint; if (sym == XKB_KEY_KP_Space) @@ -269,6 +273,9 @@ ushort TableGenerator::keysymToUtf8(quint32 sym) } else { bytes = xkb_keysym_to_utf8(sym, chars.data(), chars.size()); } +#else + bytes = xkb_keysym_to_utf8(sym, chars.data(), chars.size()); +#endif if (bytes == -1) qWarning("TableGenerator::keysymToUtf8 - buffer too small"); diff --git a/src/plugins/platforms/xcb/qxcbkeyboard.cpp b/src/plugins/platforms/xcb/qxcbkeyboard.cpp index f1b26853a1..18270d3cd5 100644 --- a/src/plugins/platforms/xcb/qxcbkeyboard.cpp +++ b/src/plugins/platforms/xcb/qxcbkeyboard.cpp @@ -53,6 +53,10 @@ #include #include +#ifdef XKBCOMMON_0_2_0 +#include +#endif + #ifndef XK_ISO_Left_Tab #define XK_ISO_Left_Tab 0xFE20 #endif @@ -1311,7 +1315,23 @@ QString QXcbKeyboard::keysymToUnicode(xcb_keysym_t sym) const int bytes; chars.resize(7); - if ((bytes = xkb_keysym_to_utf8(sym, chars.data(), chars.size())) == -1) +#ifdef XKBCOMMON_0_2_0 + if (needWorkaround(sym)) { + quint32 codepoint; + if (sym == XKB_KEY_KP_Space) + codepoint = XKB_KEY_space & 0x7f; + else + codepoint = sym & 0x7f; + + bytes = utf32_to_utf8(codepoint, chars.data()); + } else { + bytes = xkb_keysym_to_utf8(sym, chars.data(), chars.size()); + } +#else + bytes = xkb_keysym_to_utf8(sym, chars.data(), chars.size()); +#endif + + if (bytes == -1) qWarning("QXcbKeyboard::handleKeyEvent - buffer too small"); chars.resize(bytes-1); diff --git a/src/plugins/platforms/xcb/xcb-plugin.pro b/src/plugins/platforms/xcb/xcb-plugin.pro index e8d52ebf2f..f01fa90e2d 100644 --- a/src/plugins/platforms/xcb/xcb-plugin.pro +++ b/src/plugins/platforms/xcb/xcb-plugin.pro @@ -124,4 +124,8 @@ contains(QT_CONFIG, xkbcommon-qt): { } else { LIBS += $$QMAKE_LIBS_XKBCOMMON QMAKE_CXXFLAGS += $$QMAKE_CFLAGS_XKBCOMMON + equals(QMAKE_VERSION_XKBCOMMON, "0.2.0") { + DEFINES += XKBCOMMON_0_2_0 + INCLUDEPATH += ../../../3rdparty/xkbcommon/xkbcommon/ + } }