Deskflow 1.22.0.197
Keyboard and mouse sharing utility
Loading...
Searching...
No Matches
XWindowsKeyState.h
Go to the documentation of this file.
1/*
2 * Deskflow -- mouse and keyboard sharing utility
3 * SPDX-FileCopyrightText: (C) 2012 - 2016 Symless Ltd.
4 * SPDX-FileCopyrightText: (C) 2003 Chris Schoeneman
5 * SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
6 */
7
8#pragma once
9
10#include "deskflow/KeyState.h"
11
12#include <map>
13#include <vector>
14
15#include <X11/Xlib.h>
16#if HAVE_X11_EXTENSIONS_XTEST_H
17#include <X11/extensions/XTest.h>
18#else
19#error The XTest extension is required to build deskflow
20#endif
21#if HAVE_XKB_EXTENSION
22#include <X11/extensions/XKBstr.h>
23#endif
24
25class IEventQueue;
26
28
32{
33public:
34 using KeycodeList = std::vector<int>;
35 inline static const auto s_groupPoll = -1;
36 inline static const auto s_groupPollAndSet = -2;
37
38 XWindowsKeyState(Display *, bool useXKB, IEventQueue *events);
39 XWindowsKeyState(Display *, bool useXKB, IEventQueue *events, deskflow::KeyMap &keyMap);
40 ~XWindowsKeyState() override;
41
43
44
46
53 void setActiveGroup(int32_t group);
54
56
59 void setAutoRepeat(const XKeyboardState &);
60
62
64
66
70 KeyModifierMask mapModifiersFromX(unsigned int state) const;
71
73
78 bool mapModifiersToX(KeyModifierMask, unsigned int &) const;
79
81
85 void mapKeyToKeycodes(KeyID key, KeycodeList &keycodes) const;
86
88
89 // IKeyState overrides
90 bool fakeCtrlAltDel() override;
91 KeyModifierMask pollActiveModifiers() const override;
92 int32_t pollActiveGroup() const final;
93 void pollPressedKeys(KeyButtonSet &pressedKeys) const override;
94
95protected:
96 // KeyState overrides
97 void getKeyMap(deskflow::KeyMap &keyMap) override;
98 void fakeKey(const Keystroke &keystroke) override;
99
100private:
101 void init(const Display *display, bool useXKB);
102 void updateKeysymMap(deskflow::KeyMap &);
103 void updateKeysymMapXKB(deskflow::KeyMap &);
104 bool hasModifiersXKB() const;
105 int getEffectiveGroup(KeyCode, int group) const;
106 uint32_t getGroupFromState(unsigned int state) const;
107
109
112 bool setCurrentLanguageWithDBus(int32_t group) const;
113
114 static void remapKeyModifiers(KeyID, int32_t, deskflow::KeyMap::KeyItem &, void *);
115
116private:
117 struct XKBModifierInfo
118 {
119 public:
120 unsigned char m_level;
121 uint32_t m_mask;
122 bool m_lock;
123 };
124
125 using KeyModifierMaskList = std::vector<KeyModifierMask>;
126
127private:
128 using KeyModifierToXMask = std::map<KeyModifierMask, unsigned int>;
129 using KeyToKeyCodeMap = std::multimap<KeyID, KeyCode>;
130 using NonXKBModifierMap = std::map<KeyCode, unsigned int>;
131 using XKBModifierMap = std::map<uint32_t, XKBModifierInfo>;
132
133 Display *m_display;
134#if HAVE_XKB_EXTENSION
135 XkbDescPtr m_xkb;
136#endif
137 int32_t m_group;
138 XKBModifierMap m_lastGoodXKBModifiers;
139 NonXKBModifierMap m_lastGoodNonXKBModifiers;
140
141 // X modifier (bit number) to deskflow modifier (mask) mapping
142 KeyModifierMaskList m_modifierFromX = {};
143
144 // deskflow modifier (mask) to X modifier (mask)
145 KeyModifierToXMask m_modifierToX;
146
147 // map KeyID to all keycodes that can synthesize that KeyID
148 KeyToKeyCodeMap m_keyCodeFromKey;
149
150 // autorepeat state
151 XKeyboardState m_keyboardState;
152};
int key
Definition KeySequence.cpp:15
uint32_t KeyID
Key ID.
Definition KeyTypes.h:22
uint32_t KeyModifierMask
Modifier key mask.
Definition KeyTypes.h:45
Event queue interface.
Definition IEventQueue.h:32
std::set< KeyButton > KeyButtonSet
Definition IKeyState.h:52
KeyState(IEventQueue *events, std::vector< std::string > layouts, bool isLangSyncEnabled)
Definition KeyState.cpp:645
deskflow::KeyMap::Keystroke Keystroke
Definition KeyState.h:81
void pollPressedKeys(KeyButtonSet &pressedKeys) const override
Get the keys currently pressed from OS.
Definition XWindowsKeyState.cpp:189
static const auto s_groupPollAndSet
Definition XWindowsKeyState.h:36
KeyModifierMask mapModifiersFromX(unsigned int state) const
Convert X modifier mask to deskflow mask.
Definition XWindowsKeyState.cpp:97
KeyModifierMask pollActiveModifiers() const override
Get the active modifiers from OS.
Definition XWindowsKeyState.cpp:153
bool fakeCtrlAltDel() override
Fake ctrl+alt+del.
Definition XWindowsKeyState.cpp:147
std::vector< int > KeycodeList
Definition XWindowsKeyState.h:34
bool mapModifiersToX(KeyModifierMask, unsigned int &) const
Convert deskflow modifier mask to X mask.
Definition XWindowsKeyState.cpp:119
void getKeyMap(deskflow::KeyMap &keyMap) override
Get the keyboard map.
Definition XWindowsKeyState.cpp:202
~XWindowsKeyState() override
Definition XWindowsKeyState.cpp:55
int32_t pollActiveGroup() const final
Get the active keyboard layout from OS.
Definition XWindowsKeyState.cpp:168
XWindowsKeyState(Display *, bool useXKB, IEventQueue *events)
Definition XWindowsKeyState.cpp:37
void setAutoRepeat(const XKeyboardState &)
Set the auto-repeat state.
Definition XWindowsKeyState.cpp:92
void fakeKey(const Keystroke &keystroke) override
Fake a key event.
Definition XWindowsKeyState.cpp:265
void mapKeyToKeycodes(KeyID key, KeycodeList &keycodes) const
Convert deskflow key to all corresponding X keycodes.
Definition XWindowsKeyState.cpp:138
static const auto s_groupPoll
Definition XWindowsKeyState.h:35
void setActiveGroup(int32_t group)
Set active group.
Definition XWindowsKeyState.cpp:77
Key map.
Definition KeyMap.h:24
Definition EventTypes.h:11