Krita Source Code Documentation
Loading...
Searching...
No Matches
KisWaylandKeyboardWatcher::Keyboard Class Reference
+ Inheritance diagram for KisWaylandKeyboardWatcher::Keyboard:

Public Member Functions

bool hasKeyboardFocus () const
 
 Keyboard (::wl_keyboard *keyboard)
 
Qt::KeyboardModifiers modifiers () const
 
QList< Qt::Key > pressedKeys () const
 
 ~Keyboard ()
 

Private Member Functions

void keyboard_enter (uint32_t serial, wl_surface *surface, wl_array *keys) override
 
void keyboard_key (uint32_t serial, uint32_t time, uint32_t key, uint32_t state) override
 
void keyboard_keymap (uint32_t format, int32_t fd, uint32_t size) override
 
void keyboard_leave (uint32_t serial, wl_surface *surface) override
 
void keyboard_modifiers (uint32_t serial, uint32_t mods_depressed, uint32_t mods_latched, uint32_t mods_locked, uint32_t group) override
 

Private Attributes

bool m_focus = false
 
uint32_t mKeymapFormat = WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1
 
QList< uint32_t > mNativeKeys
 
uint32_t mNativeModifiers = 0
 
QXkbCommon::ScopedXKBKeymap mXkbKeymap
 
QXkbCommon::ScopedXKBState mXkbState
 

Detailed Description

Definition at line 53 of file KisWaylandKeyboardWatcher.cpp.

Constructor & Destructor Documentation

◆ Keyboard()

KisWaylandKeyboardWatcher::Keyboard::Keyboard ( ::wl_keyboard * keyboard)
inline

Definition at line 56 of file KisWaylandKeyboardWatcher.cpp.

57 : wl_keyboard(keyboard)
58 {
59 }

◆ ~Keyboard()

KisWaylandKeyboardWatcher::Keyboard::~Keyboard ( )
inline

Definition at line 61 of file KisWaylandKeyboardWatcher.cpp.

62 {
63 release();
64 }

Member Function Documentation

◆ hasKeyboardFocus()

bool KisWaylandKeyboardWatcher::Keyboard::hasKeyboardFocus ( ) const
inline

Definition at line 87 of file KisWaylandKeyboardWatcher.cpp.

References m_focus.

◆ keyboard_enter()

void KisWaylandKeyboardWatcher::Keyboard::keyboard_enter ( uint32_t serial,
wl_surface * surface,
wl_array * keys )
inlineoverrideprivate

Definition at line 159 of file KisWaylandKeyboardWatcher.cpp.

160 {
161 mNativeKeys.clear();
162 mNativeKeys.reserve(keys->size / sizeof(uint32_t));
163
164 for (const uint32_t *keyPtr = static_cast<const uint32_t *>(keys->data);
165 reinterpret_cast<const char *>(keyPtr) < static_cast<const char *>(keys->data) + keys->size;
166 keyPtr++) {
167 mNativeKeys.append(*keyPtr);
168 }
169
170 m_focus = true;
171 }

References m_focus, and mNativeKeys.

◆ keyboard_key()

void KisWaylandKeyboardWatcher::Keyboard::keyboard_key ( uint32_t serial,
uint32_t time,
uint32_t key,
uint32_t state )
inlineoverrideprivate

Definition at line 133 of file KisWaylandKeyboardWatcher.cpp.

134 {
135 const bool isDown = state != WL_KEYBOARD_KEY_STATE_RELEASED;
136 if (isDown) {
137 auto it = std::find(mNativeKeys.begin(), mNativeKeys.end(), key);
138 if (it != mNativeKeys.end()) {
139 qWarning().nospace() << "WARNING: got a key-down for a key (" << Qt::hex << Qt::showbase << key << ") which is reported to be pressed already!";
140 } else {
141 mNativeKeys.append(key);
142 }
143 } else {
144 auto it = std::find(mNativeKeys.begin(), mNativeKeys.end(), key);
145 if (it == mNativeKeys.end()) {
146 qWarning().nospace() << "WARNING: got a key-up for a key (" << Qt::hex << Qt::showbase << key << ") which is NOT reported to be pressed!";
147 } else {
148 mNativeKeys.erase(it);
149 }
150 }
151 }

References mNativeKeys.

◆ keyboard_keymap()

void KisWaylandKeyboardWatcher::Keyboard::keyboard_keymap ( uint32_t format,
int32_t fd,
uint32_t size )
inlineoverrideprivate

Definition at line 102 of file KisWaylandKeyboardWatcher.cpp.

103 {
104 mKeymapFormat = format;
105
106 if (format != WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1) {
107 qDebug() << "unknown keymap format:" << format;
108 close(fd);
109 return;
110 }
111
112 char *map_str = static_cast<char *>(mmap(nullptr, size, PROT_READ, MAP_PRIVATE, fd, 0));
113 if (map_str == MAP_FAILED) {
114 close(fd);
115 return;
116 }
117
118 struct xkb_context *xkbContext = getGlobalXkbContextFromQt();
119 if (xkbContext) {
120 mXkbKeymap.reset(xkb_keymap_new_from_string(xkbContext, map_str, XKB_KEYMAP_FORMAT_TEXT_V1, XKB_KEYMAP_COMPILE_NO_FLAGS));
121 QXkbCommon::verifyHasLatinLayout(mXkbKeymap.get());
122 }
123
124 munmap(map_str, size);
125 close(fd);
126
127 if (mXkbKeymap)
128 mXkbState.reset(xkb_state_new(mXkbKeymap.get()));
129 else
130 mXkbState.reset(nullptr);
131 }
static struct xkb_context * getGlobalXkbContextFromQt()
QAction * close(const QObject *recvr, const char *slot, QObject *parent)

References getGlobalXkbContextFromQt(), mKeymapFormat, mXkbKeymap, and mXkbState.

◆ keyboard_leave()

void KisWaylandKeyboardWatcher::Keyboard::keyboard_leave ( uint32_t serial,
wl_surface * surface )
inlineoverrideprivate

Definition at line 172 of file KisWaylandKeyboardWatcher.cpp.

173 {
174 mNativeKeys.clear();
175 m_focus = false;
176 }

References m_focus, and mNativeKeys.

◆ keyboard_modifiers()

void KisWaylandKeyboardWatcher::Keyboard::keyboard_modifiers ( uint32_t serial,
uint32_t mods_depressed,
uint32_t mods_latched,
uint32_t mods_locked,
uint32_t group )
inlineoverrideprivate

Definition at line 152 of file KisWaylandKeyboardWatcher.cpp.

153 {
154 if (mXkbState)
155 xkb_state_update_mask(mXkbState.get(), mods_depressed, mods_latched, mods_locked, 0, 0, group);
156 mNativeModifiers = mods_depressed | mods_latched | mods_locked;
157 }

References mNativeModifiers, and mXkbState.

◆ modifiers()

Qt::KeyboardModifiers KisWaylandKeyboardWatcher::Keyboard::modifiers ( ) const
inline

Definition at line 92 of file KisWaylandKeyboardWatcher.cpp.

93 {
94 Qt::KeyboardModifiers ret = Qt::NoModifier;
95 if (!mXkbState)
96 return ret;
97 ret = QXkbCommon::modifiers(mXkbState.get());
98 return ret;
99 }

References mXkbState.

◆ pressedKeys()

QList< Qt::Key > KisWaylandKeyboardWatcher::Keyboard::pressedKeys ( ) const
inline

Definition at line 66 of file KisWaylandKeyboardWatcher.cpp.

67 {
68 QList<Qt::Key> keys;
69
70 if (mXkbState) {
71 for (uint32_t key : std::as_const(mNativeKeys)) {
72 auto code = key + 8; // map to wl_keyboard::keymap_format::keymap_format_xkb_v1
73
74 xkb_keysym_t sym = xkb_state_key_get_one_sym(mXkbState.get(), code);
75 Qt::KeyboardModifiers modifiers = QXkbCommon::modifiers(mXkbState.get(), sym);
76
77 Qt::Key qtKey = static_cast<Qt::Key>(QXkbCommon::keysymToQtKey(sym, modifiers, mXkbState.get(), code));
78
79 if (qtKey != Qt::Key_unknown)
80 keys.append(qtKey);
81 }
82 }
83
84 return keys;
85 }

References mNativeKeys, modifiers(), and mXkbState.

Member Data Documentation

◆ m_focus

bool KisWaylandKeyboardWatcher::Keyboard::m_focus = false
private

Definition at line 185 of file KisWaylandKeyboardWatcher.cpp.

◆ mKeymapFormat

uint32_t KisWaylandKeyboardWatcher::Keyboard::mKeymapFormat = WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1
private

Definition at line 181 of file KisWaylandKeyboardWatcher.cpp.

◆ mNativeKeys

QList<uint32_t> KisWaylandKeyboardWatcher::Keyboard::mNativeKeys
private

Definition at line 179 of file KisWaylandKeyboardWatcher.cpp.

◆ mNativeModifiers

uint32_t KisWaylandKeyboardWatcher::Keyboard::mNativeModifiers = 0
private

Definition at line 178 of file KisWaylandKeyboardWatcher.cpp.

◆ mXkbKeymap

QXkbCommon::ScopedXKBKeymap KisWaylandKeyboardWatcher::Keyboard::mXkbKeymap
private

Definition at line 182 of file KisWaylandKeyboardWatcher.cpp.

◆ mXkbState

QXkbCommon::ScopedXKBState KisWaylandKeyboardWatcher::Keyboard::mXkbState
private

Definition at line 183 of file KisWaylandKeyboardWatcher.cpp.


The documentation for this class was generated from the following file: