summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.p.agocs@nokia.com>2011-06-01 11:00:58 +0200
committerLaszlo Agocs <laszlo.p.agocs@nokia.com>2011-06-01 11:01:32 +0200
commitead7c1c33c12a078638202b98be7081a4d008780 (patch)
tree41998b903cc31598ffc92c88d1b0a0788a30cc8a /src/plugins/platforms
parent646fcc1bd30ea9513b3d413f21677b2bbf947a4c (diff)
Start using libxkbcommon in the xcb plug-in.
Diffstat (limited to 'src/plugins/platforms')
-rw-r--r--src/plugins/platforms/xcb/qxcbkeyboard.cpp73
-rw-r--r--src/plugins/platforms/xcb/qxcbkeyboard.h5
-rw-r--r--src/plugins/platforms/xcb/xcb.pro4
3 files changed, 82 insertions, 0 deletions
diff --git a/src/plugins/platforms/xcb/qxcbkeyboard.cpp b/src/plugins/platforms/xcb/qxcbkeyboard.cpp
index 80f937769f..2b9f790b87 100644
--- a/src/plugins/platforms/xcb/qxcbkeyboard.cpp
+++ b/src/plugins/platforms/xcb/qxcbkeyboard.cpp
@@ -45,6 +45,11 @@
#include <X11/keysym.h>
+#ifndef QT_NO_XCB_XKB
+typedef unsigned char KeyCode;
+#include <X11/extensions/XKBcommon.h>
+#endif
+
#include <QtGui/QWindowSystemInterface>
#include <QtCore/QTextCodec>
@@ -904,6 +909,7 @@ QXcbKeyboard::QXcbKeyboard(QXcbConnection *connection)
, m_meta_mask(0)
{
m_key_symbols = xcb_key_symbols_alloc(xcb_connection());
+ initXkb();
}
QXcbKeyboard::~QXcbKeyboard()
@@ -911,6 +917,73 @@ QXcbKeyboard::~QXcbKeyboard()
xcb_key_symbols_free(m_key_symbols);
}
+void QXcbKeyboard::initXkb()
+{
+#ifndef QT_NO_XCB_XKB
+ struct xkb_rule_names names;
+ names.rules = "evdev";
+ names.model = "pc105";
+ names.layout = "us";
+ names.variant = "";
+ names.options = "";
+ m_xkb = xkb_compile_keymap_from_rules(&names);
+ for (int i = m_xkb->min_key_code; i < m_xkb->max_key_code; ++i) {
+ const uint mask = m_xkb->map->modmap ? m_xkb->map->modmap[i] : 0;
+ if (!mask)
+ continue;
+ for (int j = 0; j < XkbKeyGroupsWidth(m_xkb, i); ++j) {
+ uint32_t keySym = XkbKeySym(m_xkb, i, j);
+ if (keySym)
+ setMask(keySym, mask);
+ }
+ }
+#endif
+}
+
+void QXcbKeyboard::setMask(uint sym, uint mask)
+{
+ if (m_alt_mask == 0
+ && m_meta_mask != mask
+ && m_super_mask != mask
+ && m_hyper_mask != mask
+ && (sym == XK_Alt_L || sym == XK_Alt_R)) {
+ m_alt_mask = mask;
+ }
+ if (m_meta_mask == 0
+ && m_alt_mask != mask
+ && m_super_mask != mask
+ && m_hyper_mask != mask
+ && (sym == XK_Meta_L || sym == XK_Meta_R)) {
+ m_meta_mask = mask;
+ }
+ if (m_super_mask == 0
+ && m_alt_mask != mask
+ && m_meta_mask != mask
+ && m_hyper_mask != mask
+ && (sym == XK_Super_L || sym == XK_Super_R)) {
+ m_super_mask = mask;
+ }
+ if (m_hyper_mask == 0
+ && m_alt_mask != mask
+ && m_meta_mask != mask
+ && m_super_mask != mask
+ && (sym == XK_Hyper_L || sym == XK_Hyper_R)) {
+ m_hyper_mask = mask;
+ }
+ if (m_mode_switch_mask == 0
+ && m_alt_mask != mask
+ && m_meta_mask != mask
+ && m_super_mask != mask
+ && m_hyper_mask != mask
+ && sym == XK_Mode_switch) {
+ m_mode_switch_mask = mask;
+ }
+ if (m_num_lock_mask == 0
+ && sym == XK_Num_Lock) {
+ m_num_lock_mask = mask;
+ }
+}
+
// #define XCB_KEYBOARD_DEBUG
void QXcbKeyboard::handleKeyEvent(QWindow *window, QEvent::Type type, xcb_keycode_t code, quint16 state, xcb_timestamp_t time)
diff --git a/src/plugins/platforms/xcb/qxcbkeyboard.h b/src/plugins/platforms/xcb/qxcbkeyboard.h
index 98e8c90d68..dcdbf0176e 100644
--- a/src/plugins/platforms/xcb/qxcbkeyboard.h
+++ b/src/plugins/platforms/xcb/qxcbkeyboard.h
@@ -70,6 +70,8 @@ private:
QString translateKeySym(xcb_keysym_t keysym, uint xmodifiers,
int &code, Qt::KeyboardModifiers &modifiers,
QByteArray &chars, int &count);
+ void initXkb();
+ void setMask(uint sym, uint mask);
uint m_alt_mask;
uint m_super_mask;
@@ -79,6 +81,9 @@ private:
uint m_num_lock_mask;
xcb_key_symbols_t *m_key_symbols;
+#ifndef QT_NO_XCB_XKB
+ struct xkb_desc *m_xkb;
+#endif
};
#endif
diff --git a/src/plugins/platforms/xcb/xcb.pro b/src/plugins/platforms/xcb/xcb.pro
index 2091bb069d..04db369f48 100644
--- a/src/plugins/platforms/xcb/xcb.pro
+++ b/src/plugins/platforms/xcb/xcb.pro
@@ -72,6 +72,10 @@ contains(QT_CONFIG, opengl) {
LIBS += -lxcb -lxcb-image -lxcb-keysyms -lxcb-icccm -lxcb-sync
+DEFINES += $$QMAKE_DEFINES_XCB
+LIBS += $$QMAKE_LIBS_XCB
+QMAKE_CXXFLAGS += $$QMAKE_CFLAGS_XCB
+
include (../fontdatabases/genericunix/genericunix.pri)
include (../printersupport/genericunix/genericunix.pri)
include (../dnd/dnd.pri)