diff options
Diffstat (limited to 'src/plugins/platforms/xcb/qxcbkeyboard.h')
-rw-r--r-- | src/plugins/platforms/xcb/qxcbkeyboard.h | 89 |
1 files changed, 68 insertions, 21 deletions
diff --git a/src/plugins/platforms/xcb/qxcbkeyboard.h b/src/plugins/platforms/xcb/qxcbkeyboard.h index 3c71daa57f..af6677c20f 100644 --- a/src/plugins/platforms/xcb/qxcbkeyboard.h +++ b/src/plugins/platforms/xcb/qxcbkeyboard.h @@ -44,7 +44,11 @@ #include "qxcbobject.h" -#include "xcb/xcb_keysyms.h" +#ifdef QT_NO_XKB +#include <xcb/xcb_keysyms.h> +#endif + +#include <xkbcommon/xkbcommon.h> #include <QEvent> @@ -56,37 +60,80 @@ 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 void *event); - Qt::KeyboardModifiers translateModifiers(int s); + Qt::KeyboardModifiers translateModifiers(int s) const; -private: + void updateKeymap(); + QList<int> possibleKeys(const QKeyEvent *e) const; + +#ifdef QT_NO_XKB + void updateXKBStateFromCore(quint16 state); + void updateXKBMods(); + quint32 xkbModMask(quint16 state); +#else + int coreDeviceId() { return core_device_id; } + void updateXKBState(xcb_xkb_state_notify_event_t *state); +#endif + +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; + QString keysymToUnicode(xcb_keysym_t sym) const; - xcb_key_symbols_t *m_key_symbols; + 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); + +#ifdef QT_NO_XKB + void updateModifiers(); +#else + void updateVModMapping(); + void updateVModToRModMapping(); +#endif + +private: + bool m_config; 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 rmod_masks; + +#ifdef QT_NO_XKB + xcb_key_symbols_t *m_key_symbols; + + struct _xkb_mods { + xkb_mod_index_t shift; + xkb_mod_index_t lock; + xkb_mod_index_t control; + xkb_mod_index_t mod1; + xkb_mod_index_t mod2; + xkb_mod_index_t mod3; + xkb_mod_index_t mod4; + xkb_mod_index_t mod5; + }; + + _xkb_mods xkb_mods; +#else + _mod_masks vmod_masks; + int core_device_id; +#endif }; QT_END_NAMESPACE |