diff options
author | Gatis Paeglis <gatis.paeglis@digia.com> | 2013-03-25 14:44:48 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-05-07 22:43:14 +0200 |
commit | 05351b0cde3e80d2d0ae3a838e802ff6086e4b59 (patch) | |
tree | dbcbb18247aafe9485e7ccbbbc903c858bb1c75d /src/plugins/platforms/xcb/qxcbkeyboard.h | |
parent | 9c1d62cc95ed2579fa25d83901c7a1aa315aa2d3 (diff) |
Utilize libxkbcommon API for the keyboard backend on X11
libxkbcommon is a keymap compiler [1] which utilizes xkb
keyboard configuration database [2].
xkbcommon simplifies keyboard state handling by providing xkb_state
object which holds the current state of all modifiers, groups, LEDs,
etc, relating to the provided keymap.
Detecting modifier mapping should become simpler once it gets supported
in libxkbcommon. Also with xinput2 we could get rid of the XkbStateNotify
events, because xinput2 key press/release already include all the mod/group
info.
[1] http://xkbcommon.org/
[2] http://www.freedesktop.org/wiki/Software/XKeyboardConfig
This patch:
- Removes a dependency to -lxcb-keysyms
- Removes a dependency to XLib call - XLookupString
- Enables required functionality to fix QTBUG-27681
Task-number: QTBUG-27680
Change-Id: I10e10f873821ee02f6df72238e215a541150f38f
Reviewed-by: Samuel Rødal <samuel.rodal@digia.com>
Diffstat (limited to 'src/plugins/platforms/xcb/qxcbkeyboard.h')
-rw-r--r-- | src/plugins/platforms/xcb/qxcbkeyboard.h | 58 |
1 files changed, 36 insertions, 22 deletions
diff --git a/src/plugins/platforms/xcb/qxcbkeyboard.h b/src/plugins/platforms/xcb/qxcbkeyboard.h index 3c71daa57f..ff774197d2 100644 --- a/src/plugins/platforms/xcb/qxcbkeyboard.h +++ b/src/plugins/platforms/xcb/qxcbkeyboard.h @@ -44,7 +44,7 @@ #include "qxcbobject.h" -#include "xcb/xcb_keysyms.h" +#include <xkbcommon/xkbcommon.h> #include <QEvent> @@ -56,37 +56,51 @@ class QXcbKeyboard : public QXcbObject { public: QXcbKeyboard(QXcbConnection *connection); + ~QXcbKeyboard(); void handleKeyPressEvent(QXcbWindowEventListener *eventListener, const xcb_key_press_event_t *event); void handleKeyReleaseEvent(QXcbWindowEventListener *eventListener, const xcb_key_release_event_t *event); - void handleMappingNotifyEvent(const xcb_mapping_notify_event_t *event); + void handleMappingNotifyEvent(const xcb_xkb_map_notify_event_t *event); - Qt::KeyboardModifiers translateModifiers(int s); + Qt::KeyboardModifiers translateModifiers(int s) const; -private: + void updateKeymap(); + void updateXKBState(xcb_xkb_state_notify_event_t *state); + int coreDeviceId() { return core_device_id; } + +protected: void handleKeyEvent(QWindow *window, QEvent::Type type, xcb_keycode_t code, quint16 state, xcb_timestamp_t time); - int translateKeySym(uint key) const; - QString translateKeySym(xcb_keysym_t keysym, uint xmodifiers, - int &code, Qt::KeyboardModifiers &modifiers, - QByteArray &chars, int &count); - void setupModifiers(); - void setMask(uint sym, uint mask); - xcb_keysym_t lookupString(QWindow *window, uint state, xcb_keycode_t code, - QEvent::Type type, QByteArray *chars); - - uint m_alt_mask; - uint m_super_mask; - uint m_hyper_mask; - uint m_meta_mask; - uint m_mode_switch_mask; - uint m_num_lock_mask; - uint m_caps_lock_mask; - - xcb_key_symbols_t *m_key_symbols; + QString keysymToUnicode(xcb_keysym_t sym) const; + + int keysymToQtKey(xcb_keysym_t keysym) const; + int keysymToQtKey(xcb_keysym_t keysym, Qt::KeyboardModifiers &modifiers, QString text) const; + + void readXKBConfig(struct xkb_rule_names *names); + void updateVModMapping(); + void updateVModToRModMapping(); + +private: xcb_keycode_t m_autorepeat_code; + + struct xkb_context *xkb_context; + struct xkb_keymap *xkb_keymap; + struct xkb_state *xkb_state; + + struct _mod_masks { + uint alt; + uint altgr; + uint meta; + }; + + _mod_masks vmod_masks; + _mod_masks rmod_masks; + + int core_device_id; + + bool m_config; }; QT_END_NAMESPACE |