Deskflow 1.24.0.365
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 "Config.h"
11#include "deskflow/KeyState.h"
12
13#include <map>
14#include <vector>
15
16#include <X11/Xlib.h>
17#if HAVE_X11_EXTENSIONS_XTEST_H
18#include <X11/extensions/XTest.h>
19#else
20#error The XTest extension is required to build deskflow
21#endif
22#if HAVE_XKB_EXTENSION
23#include <X11/extensions/XKBstr.h>
24#endif
25
26class IEventQueue;
27
29
33{
34public:
35 using KeycodeList = std::vector<int>;
36 inline static const auto s_groupPoll = -1;
37 inline static const auto s_groupPollAndSet = -2;
38
39 XWindowsKeyState(Display *, bool useXKB, IEventQueue *events);
40 XWindowsKeyState(Display *, bool useXKB, IEventQueue *events, deskflow::KeyMap &keyMap);
41 ~XWindowsKeyState() override;
42
44
45
47
54 void setActiveGroup(int32_t group);
55
57
60 void setAutoRepeat(const XKeyboardState &);
61
63
65
67
71 KeyModifierMask mapModifiersFromX(unsigned int state) const;
72
74
79 bool mapModifiersToX(KeyModifierMask, unsigned int &) const;
80
82
86 void mapKeyToKeycodes(KeyID key, KeycodeList &keycodes) const;
87
89
90 // IKeyState overrides
91 bool fakeCtrlAltDel() override;
92 KeyModifierMask pollActiveModifiers() const override;
93 int32_t pollActiveGroup() const final;
94 void pollPressedKeys(KeyButtonSet &pressedKeys) const override;
95
96protected:
97 // KeyState overrides
98 void getKeyMap(deskflow::KeyMap &keyMap) override;
99 void fakeKey(const Keystroke &keystroke) override;
100
101private:
102 void init(bool useXKB);
103 void updateKeysymMap(deskflow::KeyMap &);
104 void updateKeysymMapXKB(deskflow::KeyMap &);
105 bool hasModifiersXKB() const;
106 int getEffectiveGroup(KeyCode, int group) const;
107 uint32_t getGroupFromState(unsigned int state) const;
108
110
113 bool setCurrentLanguageWithDBus(int32_t group) const;
114
115 static void remapKeyModifiers(KeyID, int32_t, deskflow::KeyMap::KeyItem &, void *);
116
117private:
118 struct XKBModifierInfo
119 {
120 public:
121 unsigned char m_level;
122 uint32_t m_mask;
123 bool m_lock;
124 };
125
126 using KeyModifierMaskList = std::vector<KeyModifierMask>;
127
128private:
129 using KeyModifierToXMask = std::map<KeyModifierMask, unsigned int>;
130 using KeyToKeyCodeMap = std::multimap<KeyID, KeyCode>;
131 using NonXKBModifierMap = std::map<KeyCode, unsigned int>;
132 using XKBModifierMap = std::map<uint32_t, XKBModifierInfo>;
133
134 Display *m_display;
135#if HAVE_XKB_EXTENSION
136 XkbDescPtr m_xkb;
137#endif
138 int32_t m_group;
139 XKBModifierMap m_lastGoodXKBModifiers;
140 NonXKBModifierMap m_lastGoodNonXKBModifiers;
141
142 // X modifier (bit number) to deskflow modifier (mask) mapping
143 KeyModifierMaskList m_modifierFromX = {};
144
145 // deskflow modifier (mask) to X modifier (mask)
146 KeyModifierToXMask m_modifierToX;
147
148 // map KeyID to all keycodes that can synthesize that KeyID
149 KeyToKeyCodeMap m_keyCodeFromKey;
150
151 // autorepeat state
152 XKeyboardState m_keyboardState;
153};
int key
Definition KeySequence.cpp:15
uint32_t KeyID
Key ID.
Definition KeyTypes.h:21
uint32_t KeyModifierMask
Modifier key mask.
Definition KeyTypes.h:44
Event queue interface.
Definition IEventQueue.h:29
std::set< KeyButton > KeyButtonSet
Definition IKeyState.h:52
KeyState(IEventQueue *events, std::vector< std::string > layouts, bool isLangSyncEnabled)
Definition KeyState.cpp:643
deskflow::KeyMap::Keystroke Keystroke
Definition KeyState.h:81
void pollPressedKeys(KeyButtonSet &pressedKeys) const override
Get the keys currently pressed from OS.
Definition XWindowsKeyState.cpp:192
static const auto s_groupPollAndSet
Definition XWindowsKeyState.h:37
KeyModifierMask mapModifiersFromX(unsigned int state) const
Convert X modifier mask to deskflow mask.
Definition XWindowsKeyState.cpp:100
KeyModifierMask pollActiveModifiers() const override
Get the active modifiers from OS.
Definition XWindowsKeyState.cpp:156
bool fakeCtrlAltDel() override
Fake ctrl+alt+del.
Definition XWindowsKeyState.cpp:150
std::vector< int > KeycodeList
Definition XWindowsKeyState.h:35
bool mapModifiersToX(KeyModifierMask, unsigned int &) const
Convert deskflow modifier mask to X mask.
Definition XWindowsKeyState.cpp:122
void getKeyMap(deskflow::KeyMap &keyMap) override
Get the keyboard map.
Definition XWindowsKeyState.cpp:205
~XWindowsKeyState() override
Definition XWindowsKeyState.cpp:58
int32_t pollActiveGroup() const final
Get the active keyboard layout from OS.
Definition XWindowsKeyState.cpp:171
XWindowsKeyState(Display *, bool useXKB, IEventQueue *events)
Definition XWindowsKeyState.cpp:37
void setAutoRepeat(const XKeyboardState &)
Set the auto-repeat state.
Definition XWindowsKeyState.cpp:95
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:141
static const auto s_groupPoll
Definition XWindowsKeyState.h:36
void setActiveGroup(int32_t group)
Set active group.
Definition XWindowsKeyState.cpp:80
Key map.
Definition KeyMap.h:24
Definition EventTypes.h:11