1 | // Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB). |
2 | // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only |
3 | |
4 | #include "keyboarddevice_p.h" |
5 | |
6 | #include <Qt3DInput/QKeyEvent> |
7 | #include <Qt3DCore/qnode.h> |
8 | |
9 | #include <Qt3DInput/private/inputhandler_p.h> |
10 | #include <Qt3DInput/private/inputmanagers_p.h> |
11 | |
12 | |
13 | QT_BEGIN_NAMESPACE |
14 | |
15 | namespace Qt3DInput { |
16 | namespace Input { |
17 | |
18 | namespace { |
19 | |
20 | QPair<int, int> getKeyPosition(int key) |
21 | { |
22 | QPair<int, int> position; |
23 | |
24 | switch (key) { |
25 | case Qt::Key_Escape: |
26 | return QPair<int, int>(0, 0); |
27 | case Qt::Key_Tab: |
28 | return QPair<int, int>(0, 1); |
29 | case Qt::Key_Backtab: |
30 | return QPair<int, int>(0, 2); |
31 | case Qt::Key_Backspace: |
32 | return QPair<int, int>(0, 3); |
33 | case Qt::Key_Return: |
34 | return QPair<int, int>(0, 4); |
35 | case Qt::Key_Enter: |
36 | return QPair<int, int>(0, 5); |
37 | case Qt::Key_Insert: |
38 | return QPair<int, int>(0, 6); |
39 | case Qt::Key_Delete: |
40 | return QPair<int, int>(0, 7); |
41 | case Qt::Key_Pause: |
42 | return QPair<int, int>(0, 8); |
43 | case Qt::Key_Print: |
44 | return QPair<int, int>(0, 9); |
45 | case Qt::Key_SysReq: |
46 | return QPair<int, int>(0, 10); |
47 | case Qt::Key_Clear: |
48 | return QPair<int, int>(0, 11); |
49 | case Qt::Key_Home: |
50 | return QPair<int, int>(0, 12); |
51 | case Qt::Key_End: |
52 | return QPair<int, int>(0, 13); |
53 | case Qt::Key_Left: |
54 | return QPair<int, int>(0, 14); |
55 | case Qt::Key_Right: |
56 | return QPair<int, int>(0, 16); |
57 | case Qt::Key_Up: |
58 | return QPair<int, int>(0, 15); |
59 | case Qt::Key_Down: |
60 | return QPair<int, int>(0, 17); |
61 | case Qt::Key_PageUp: |
62 | return QPair<int, int>(0, 18); |
63 | case Qt::Key_PageDown: |
64 | return QPair<int, int>(0, 19); |
65 | case Qt::Key_Shift: |
66 | return QPair<int, int>(0, 20); |
67 | case Qt::Key_Alt: |
68 | return QPair<int, int>(0, 23); |
69 | case Qt::Key_Control: |
70 | return QPair<int, int>(0, 21); |
71 | case Qt::Key_Meta: |
72 | return QPair<int, int>(0, 22); |
73 | case Qt::Key_CapsLock: |
74 | return QPair<int, int>(0, 24); |
75 | case Qt::Key_NumLock: |
76 | return QPair<int, int>(0, 25); |
77 | case Qt::Key_ScrollLock: |
78 | return QPair<int, int>(0, 26); |
79 | case Qt::Key_F1: |
80 | return QPair<int, int>(0, 27); |
81 | case Qt::Key_F2: |
82 | return QPair<int, int>(0, 28); |
83 | case Qt::Key_F3: |
84 | return QPair<int, int>(0, 29); |
85 | case Qt::Key_F4: |
86 | return QPair<int, int>(0, 30); |
87 | case Qt::Key_F5: |
88 | return QPair<int, int>(0, 31); |
89 | case Qt::Key_F6: |
90 | return QPair<int, int>(1, 0); |
91 | case Qt::Key_F7: |
92 | return QPair<int, int>(1, 1); |
93 | case Qt::Key_F8: |
94 | return QPair<int, int>(1, 2); |
95 | case Qt::Key_F9: |
96 | return QPair<int, int>(1, 3); |
97 | case Qt::Key_F10: |
98 | return QPair<int, int>(1, 4); |
99 | case Qt::Key_F11: |
100 | return QPair<int, int>(1, 5); |
101 | case Qt::Key_F12: |
102 | return QPair<int, int>(1, 6); |
103 | case Qt::Key_F13: |
104 | return QPair<int, int>(1, 7); |
105 | case Qt::Key_F14: |
106 | return QPair<int, int>(1, 8); |
107 | case Qt::Key_F15: |
108 | return QPair<int, int>(1, 9); |
109 | case Qt::Key_F16: |
110 | return QPair<int, int>(1, 10); |
111 | case Qt::Key_F17: |
112 | return QPair<int, int>(1, 11); |
113 | case Qt::Key_F18: |
114 | return QPair<int, int>(1, 12); |
115 | case Qt::Key_F19: |
116 | return QPair<int, int>(1, 13); |
117 | case Qt::Key_F20: |
118 | return QPair<int, int>(1, 14); |
119 | case Qt::Key_F21: |
120 | return QPair<int, int>(1, 15); |
121 | case Qt::Key_F22: |
122 | return QPair<int, int>(1, 16); |
123 | case Qt::Key_F23: |
124 | return QPair<int, int>(1, 17); |
125 | case Qt::Key_F24: |
126 | return QPair<int, int>(1, 18); |
127 | case Qt::Key_F25: |
128 | return QPair<int, int>(1, 19); |
129 | case Qt::Key_F26: |
130 | return QPair<int, int>(1, 20); |
131 | case Qt::Key_F27: |
132 | return QPair<int, int>(1, 21); |
133 | case Qt::Key_F28: |
134 | return QPair<int, int>(1, 22); |
135 | case Qt::Key_F29: |
136 | return QPair<int, int>(1, 23); |
137 | case Qt::Key_F30: |
138 | return QPair<int, int>(1, 24); |
139 | case Qt::Key_F31: |
140 | return QPair<int, int>(1, 25); |
141 | case Qt::Key_F32: |
142 | return QPair<int, int>(1, 26); |
143 | case Qt::Key_F33: |
144 | return QPair<int, int>(1, 27); |
145 | case Qt::Key_F34: |
146 | return QPair<int, int>(1, 28); |
147 | case Qt::Key_F35: |
148 | return QPair<int, int>(1, 29); |
149 | case Qt::Key_Super_L: |
150 | return QPair<int, int>(1, 30); |
151 | case Qt::Key_Super_R: |
152 | return QPair<int, int>(1, 31); |
153 | case Qt::Key_Menu: |
154 | return QPair<int, int>(2, 1); |
155 | case Qt::Key_Help: |
156 | return QPair<int, int>(2, 4); |
157 | case Qt::Key_Hyper_L: |
158 | return QPair<int, int>(2, 2); |
159 | case Qt::Key_Hyper_R: |
160 | return QPair<int, int>(2, 3); |
161 | case Qt::Key_Direction_L: |
162 | return QPair<int, int>(2, 5); |
163 | case Qt::Key_Direction_R: |
164 | return QPair<int, int>(2, 6); |
165 | case Qt::Key_Space: |
166 | return QPair<int, int>(2, 7); |
167 | case Qt::Key_Exclam: |
168 | return QPair<int, int>(2, 9); |
169 | case Qt::Key_QuoteDbl: |
170 | return QPair<int, int>(2, 10); |
171 | case Qt::Key_NumberSign: |
172 | return QPair<int, int>(2, 11); |
173 | case Qt::Key_Dollar: |
174 | return QPair<int, int>(2, 12); |
175 | case Qt::Key_Percent: |
176 | return QPair<int, int>(2, 13); |
177 | case Qt::Key_Ampersand: |
178 | return QPair<int, int>(2, 14); |
179 | case Qt::Key_Apostrophe: |
180 | return QPair<int, int>(2, 15); |
181 | case Qt::Key_ParenLeft: |
182 | return QPair<int, int>(2, 16); |
183 | case Qt::Key_ParenRight: |
184 | return QPair<int, int>(2, 17); |
185 | case Qt::Key_Asterisk: |
186 | return QPair<int, int>(2, 18); |
187 | case Qt::Key_Plus: |
188 | return QPair<int, int>(2, 19); |
189 | case Qt::Key_Comma: |
190 | return QPair<int, int>(2, 20); |
191 | case Qt::Key_Minus: |
192 | return QPair<int, int>(2, 21); |
193 | case Qt::Key_Period: |
194 | return QPair<int, int>(2, 22); |
195 | case Qt::Key_Slash: |
196 | return QPair<int, int>(2, 23); |
197 | case Qt::Key_0: |
198 | return QPair<int, int>(2, 24); |
199 | case Qt::Key_1: |
200 | return QPair<int, int>(2, 25); |
201 | case Qt::Key_2: |
202 | return QPair<int, int>(2, 26); |
203 | case Qt::Key_3: |
204 | return QPair<int, int>(2, 27); |
205 | case Qt::Key_4: |
206 | return QPair<int, int>(2, 28); |
207 | case Qt::Key_5: |
208 | return QPair<int, int>(2, 29); |
209 | case Qt::Key_6: |
210 | return QPair<int, int>(2, 30); |
211 | case Qt::Key_7: |
212 | return QPair<int, int>(2, 31); |
213 | case Qt::Key_8: |
214 | return QPair<int, int>(3, 0); |
215 | case Qt::Key_9: |
216 | return QPair<int, int>(3, 1); |
217 | case Qt::Key_Colon: |
218 | return QPair<int, int>(3, 2); |
219 | case Qt::Key_Semicolon: |
220 | return QPair<int, int>(3, 3); |
221 | case Qt::Key_Less: |
222 | return QPair<int, int>(3, 4); |
223 | case Qt::Key_Equal: |
224 | return QPair<int, int>(3, 5); |
225 | case Qt::Key_Greater: |
226 | return QPair<int, int>(3, 6); |
227 | case Qt::Key_Question: |
228 | return QPair<int, int>(3, 7); |
229 | case Qt::Key_At: |
230 | return QPair<int, int>(3, 8); |
231 | case Qt::Key_A: |
232 | return QPair<int, int>(3, 9); |
233 | case Qt::Key_B: |
234 | return QPair<int, int>(3, 10); |
235 | case Qt::Key_C: |
236 | return QPair<int, int>(3, 11); |
237 | case Qt::Key_D: |
238 | return QPair<int, int>(3, 12); |
239 | case Qt::Key_E: |
240 | return QPair<int, int>(3, 13); |
241 | case Qt::Key_F: |
242 | return QPair<int, int>(3, 14); |
243 | case Qt::Key_G: |
244 | return QPair<int, int>(3, 15); |
245 | case Qt::Key_H: |
246 | return QPair<int, int>(3, 16); |
247 | case Qt::Key_I: |
248 | return QPair<int, int>(3, 17); |
249 | case Qt::Key_J: |
250 | return QPair<int, int>(3, 18); |
251 | case Qt::Key_K: |
252 | return QPair<int, int>(3, 19); |
253 | case Qt::Key_L: |
254 | return QPair<int, int>(3, 20); |
255 | case Qt::Key_M: |
256 | return QPair<int, int>(3, 21); |
257 | case Qt::Key_N: |
258 | return QPair<int, int>(3, 22); |
259 | case Qt::Key_O: |
260 | return QPair<int, int>(3, 23); |
261 | case Qt::Key_P: |
262 | return QPair<int, int>(3, 24); |
263 | case Qt::Key_Q: |
264 | return QPair<int, int>(3, 25); |
265 | case Qt::Key_R: |
266 | return QPair<int, int>(3, 26); |
267 | case Qt::Key_S: |
268 | return QPair<int, int>(3, 27); |
269 | case Qt::Key_T: |
270 | return QPair<int, int>(3, 28); |
271 | case Qt::Key_U: |
272 | return QPair<int, int>(3, 29); |
273 | case Qt::Key_V: |
274 | return QPair<int, int>(3, 30); |
275 | case Qt::Key_W: |
276 | return QPair<int, int>(3, 31); |
277 | case Qt::Key_X: |
278 | return QPair<int, int>(4, 0); |
279 | case Qt::Key_Y: |
280 | return QPair<int, int>(4, 1); |
281 | case Qt::Key_Z: |
282 | return QPair<int, int>(4, 2); |
283 | case Qt::Key_BracketLeft: |
284 | return QPair<int, int>(4, 3); |
285 | case Qt::Key_Backslash: |
286 | return QPair<int, int>(4, 4); |
287 | case Qt::Key_BracketRight: |
288 | return QPair<int, int>(4, 5); |
289 | case Qt::Key_AsciiCircum: |
290 | return QPair<int, int>(4, 6); |
291 | case Qt::Key_Underscore: |
292 | return QPair<int, int>(4, 7); |
293 | case Qt::Key_QuoteLeft: |
294 | return QPair<int, int>(4, 8); |
295 | case Qt::Key_BraceLeft: |
296 | return QPair<int, int>(4, 9); |
297 | case Qt::Key_Bar: |
298 | return QPair<int, int>(4, 10); |
299 | case Qt::Key_BraceRight: |
300 | return QPair<int, int>(4, 11); |
301 | case Qt::Key_AsciiTilde: |
302 | return QPair<int, int>(4, 12); |
303 | case Qt::Key_plusminus: |
304 | return QPair<int, int>(4, 13); |
305 | case Qt::Key_onesuperior: |
306 | return QPair<int, int>(4, 14); |
307 | case Qt::Key_multiply: |
308 | return QPair<int, int>(4, 15); |
309 | case Qt::Key_division: |
310 | return QPair<int, int>(4, 16); |
311 | case Qt::Key_diaeresis: |
312 | return QPair<int, int>(4, 17); |
313 | default: |
314 | return QPair<int, int>(-1, -1); |
315 | } |
316 | return position; |
317 | } |
318 | |
319 | } // anonymous |
320 | |
321 | |
322 | // TO DO: Send change to frontend when activeInput changes |
323 | |
324 | KeyboardDevice::KeyboardDevice() |
325 | : QAbstractPhysicalDeviceBackendNode(QBackendNode::ReadOnly) |
326 | , m_inputHandler(nullptr) |
327 | { |
328 | m_keyStates.keys[0] = 0; |
329 | m_keyStates.keys[1] = 0; |
330 | m_keyStates.keys[2] = 0; |
331 | m_keyStates.keys[3] = 0; |
332 | m_keyStates.keys[4] = 0; |
333 | } |
334 | |
335 | void KeyboardDevice::cleanup() |
336 | { |
337 | QAbstractPhysicalDeviceBackendNode::cleanup(); |
338 | m_keyStates.keys[0] = 0; |
339 | m_keyStates.keys[1] = 0; |
340 | m_keyStates.keys[2] = 0; |
341 | m_keyStates.keys[3] = 0; |
342 | m_keyStates.keys[4] = 0; |
343 | } |
344 | |
345 | void KeyboardDevice::requestFocusForInput(Qt3DCore::QNodeId inputId) |
346 | { |
347 | // Saves the last inputId, this will then be used in an Aspect Job to determine which |
348 | // input will have the focus. This in turn will call KeyboardInput::setFocus which will |
349 | // decide if sending a notification to the frontend is necessary |
350 | m_lastRequester = inputId; |
351 | } |
352 | |
353 | void KeyboardDevice::setInputHandler(InputHandler *handler) |
354 | { |
355 | m_inputHandler = handler; |
356 | } |
357 | |
358 | void KeyboardDevice::setCurrentFocusItem(Qt3DCore::QNodeId input) |
359 | { |
360 | m_currentFocusItem = input; |
361 | } |
362 | |
363 | float KeyboardDevice::axisValue(int axisIdentifier) const |
364 | { |
365 | Q_UNUSED(axisIdentifier); |
366 | return 0.0f; |
367 | } |
368 | |
369 | bool KeyboardDevice::isButtonPressed(int buttonIdentifier) const |
370 | { |
371 | QPair<int, int> position = getKeyPosition(key: buttonIdentifier); |
372 | if (position.first != -1 && position.second != -1) |
373 | return m_keyStates.keys[position.first] & (1 << position.second); |
374 | return false; |
375 | } |
376 | |
377 | void KeyboardDevice::setButtonValue(int key, bool value) |
378 | { |
379 | QPair<int, int> position = getKeyPosition(key); |
380 | if (position.first != -1 && position.second != -1) { |
381 | if (value) |
382 | m_keyStates.keys[position.first] |= (1 << position.second); |
383 | else |
384 | m_keyStates.keys[position.first] &= ~(1 << position.second); |
385 | } |
386 | } |
387 | |
388 | void KeyboardDevice::updateKeyEvent(QT_PREPEND_NAMESPACE(QKeyEvent) *event) |
389 | { |
390 | setButtonValue(key: event->key(), value: event->type() == QT_PREPEND_NAMESPACE(QKeyEvent)::KeyPress ? true : false); |
391 | } |
392 | |
393 | KeyboardDeviceFunctor::KeyboardDeviceFunctor(QInputAspect *inputaspect, InputHandler *handler) |
394 | : m_inputAspect(inputaspect) |
395 | , m_handler(handler) |
396 | { |
397 | } |
398 | |
399 | Qt3DCore::QBackendNode *KeyboardDeviceFunctor::create(Qt3DCore::QNodeId id) const |
400 | { |
401 | KeyboardDevice *keyboardDevice = m_handler->keyboardDeviceManager()->getOrCreateResource(id); |
402 | keyboardDevice->setInputAspect(m_inputAspect); |
403 | keyboardDevice->setInputHandler(m_handler); |
404 | m_handler->appendKeyboardDevice(device: m_handler->keyboardDeviceManager()->lookupHandle(id)); |
405 | return keyboardDevice; |
406 | } |
407 | |
408 | Qt3DCore::QBackendNode *KeyboardDeviceFunctor::get(Qt3DCore::QNodeId id) const |
409 | { |
410 | return m_handler->keyboardDeviceManager()->lookupResource(id); |
411 | } |
412 | |
413 | void KeyboardDeviceFunctor::destroy(Qt3DCore::QNodeId id) const |
414 | { |
415 | m_handler->removeKeyboardDevice(device: m_handler->keyboardDeviceManager()->lookupHandle(id)); |
416 | m_handler->keyboardDeviceManager()->releaseResource(id); |
417 | } |
418 | |
419 | } // namespace Inputs |
420 | } // namespace Qt3DInput |
421 | |
422 | QT_END_NAMESPACE |
423 | |