KWindowSystem

platforms/windows/kkeyserver.cpp
1 /*
2  SPDX-FileCopyrightText: 2008 Carlo Segato <[email protected]>
3 
4  SPDX-License-Identifier: LGPL-2.1-or-later
5 */
6 
7 #include "kkeyserver_win.h"
8 
9 #include <windows.h>
10 
11 #include <QDebug>
12 
13 namespace KKeyServer
14 {
15 struct TransKey {
16  uint keySymQt;
17  uint keySymWin;
18 };
19 
20 static const TransKey KeyTbl[] = {
21  {Qt::Key_Cancel, VK_CANCEL},
22  {Qt::Key_Backspace, VK_BACK},
23  {Qt::Key_Tab, VK_TAB},
24  {Qt::Key_Clear, VK_CLEAR},
25  {Qt::Key_Return, VK_RETURN},
26  {Qt::Key_Shift, VK_SHIFT},
27  {Qt::Key_Control, VK_CONTROL},
28  {Qt::Key_Alt, VK_MENU},
29  {Qt::Key_Pause, VK_PAUSE},
30  {Qt::Key_CapsLock, VK_CAPITAL},
31  {Qt::Key_Escape, VK_ESCAPE},
32 // FIXME: under wince VK_MODECHANGE is not defined
33 #ifndef _WIN32_WCE
34  {Qt::Key_Mode_switch, VK_MODECHANGE},
35 #endif
36  {Qt::Key_Space, VK_SPACE},
37  {Qt::Key_PageUp, VK_PRIOR},
38  {Qt::Key_PageDown, VK_NEXT},
39  {Qt::Key_End, VK_END},
40  {Qt::Key_Home, VK_HOME},
41  {Qt::Key_Left, VK_LEFT},
42  {Qt::Key_Up, VK_UP},
43  {Qt::Key_Right, VK_RIGHT},
44  {Qt::Key_Down, VK_DOWN},
45  {Qt::Key_Select, VK_SELECT},
46  {Qt::Key_Printer, VK_PRINT},
47  {Qt::Key_Execute, VK_EXECUTE},
48  {Qt::Key_Print, VK_SNAPSHOT},
49  {Qt::Key_Insert, VK_INSERT},
50  {Qt::Key_Delete, VK_DELETE},
51  {Qt::Key_Help, VK_HELP},
52  /* { 0, VK_0 },
53  { 0, VK_1 },
54  { 0, VK_2 },
55  { 0, VK_3 },
56  { 0, VK_4 },
57  { 0, VK_5 },
58  { 0, VK_6 },
59  { 0, VK_7 },
60  { 0, VK_8 },
61  { 0, VK_9 },
62  { 0, VK_A },
63  { 0, VK_B },
64  { 0, VK_C },
65  { 0, VK_D },
66  { 0, VK_E },
67  { 0, VK_F },
68  { 0, VK_G },
69  { 0, VK_H },
70  { 0, VK_I },
71  { 0, VK_J },
72  { 0, VK_K },
73  { 0, VK_L },
74  { 0, VK_M },
75  { 0, VK_N },
76  { 0, VK_O },
77  { 0, VK_P },
78  { 0, VK_Q },
79  { 0, VK_R },
80  { 0, VK_S },
81  { 0, VK_T },
82  { 0, VK_U },
83  { 0, VK_V },
84  { 0, VK_W },
85  { 0, VK_X },
86  { 0, VK_Y },
87  { 0, VK_Z },*/
88  {Qt::Key_Meta, VK_LWIN},
89  {Qt::Key_Meta, VK_RWIN},
90  {Qt::Key_Menu, VK_APPS},
91  {Qt::Key_Sleep, VK_SLEEP},
92  {Qt::Key_0, VK_NUMPAD0},
93  {Qt::Key_1, VK_NUMPAD1},
94  {Qt::Key_2, VK_NUMPAD2},
95  {Qt::Key_3, VK_NUMPAD3},
96  {Qt::Key_4, VK_NUMPAD4},
97  {Qt::Key_5, VK_NUMPAD5},
98  {Qt::Key_6, VK_NUMPAD6},
99  {Qt::Key_7, VK_NUMPAD7},
100  {Qt::Key_8, VK_NUMPAD8},
101  {Qt::Key_9, VK_NUMPAD9},
102  {Qt::Key_Asterisk, VK_MULTIPLY},
103  {Qt::Key_Plus, VK_ADD},
104  {Qt::Key_Comma, VK_SEPARATOR},
105  {Qt::Key_Minus, VK_SUBTRACT},
106  {Qt::Key_Period, VK_DECIMAL},
107  {Qt::Key_Slash, VK_DIVIDE},
108  {Qt::Key_F1, VK_F1},
109  {Qt::Key_F2, VK_F2},
110  {Qt::Key_F3, VK_F3},
111  {Qt::Key_F4, VK_F4},
112  {Qt::Key_F5, VK_F5},
113  {Qt::Key_F6, VK_F6},
114  {Qt::Key_F7, VK_F7},
115  {Qt::Key_F8, VK_F8},
116  {Qt::Key_F9, VK_F9},
117  {Qt::Key_F10, VK_F10},
118  {Qt::Key_F11, VK_F11},
119  {Qt::Key_F12, VK_F12},
120  {Qt::Key_F13, VK_F13},
121  {Qt::Key_F14, VK_F14},
122  {Qt::Key_F15, VK_F15},
123  {Qt::Key_F16, VK_F16},
124  {Qt::Key_F17, VK_F17},
125  {Qt::Key_F18, VK_F18},
126  {Qt::Key_F19, VK_F19},
127  {Qt::Key_F20, VK_F20},
128  {Qt::Key_F21, VK_F21},
129  {Qt::Key_F22, VK_F22},
130  {Qt::Key_F23, VK_F23},
131  {Qt::Key_F24, VK_F24},
132  {Qt::Key_NumLock, VK_NUMLOCK},
133  {Qt::Key_ScrollLock, VK_SCROLL},
134  // { 0, VK_OEM_FJ_JISHO },
135  // { Qt::Key_Massyo, VK_OEM_FJ_MASSHOU },
136  // { Qt::Key_Touroku, VK_OEM_FJ_TOUROKU },
137  // { 0, VK_OEM_FJ_LOYA },
138  // { 0, VK_OEM_FJ_ROYA },
139  {Qt::Key_Shift, VK_LSHIFT},
140  {Qt::Key_Shift, VK_RSHIFT},
141  {Qt::Key_Control, VK_LCONTROL},
142  {Qt::Key_Control, VK_RCONTROL},
143  {Qt::Key_Alt, VK_LMENU},
144  {Qt::Key_Alt, VK_RMENU},
145 
146 // winuser.h from psdk w2kserver2003R2 defines the following constants only for _WIN32_WINNT >= 0x0500
147 // and we should also do so - otherwise the constants may not be available
148 #if (_WIN32_WINNT >= 0x0500)
149  {Qt::Key_Back, VK_BROWSER_BACK},
150  {Qt::Key_Forward, VK_BROWSER_FORWARD},
151  {Qt::Key_Refresh, VK_BROWSER_REFRESH},
152  {Qt::Key_Stop, VK_BROWSER_STOP},
153  {Qt::Key_Search, VK_BROWSER_SEARCH},
154  {Qt::Key_Favorites, VK_BROWSER_FAVORITES},
155  {Qt::Key_HomePage, VK_BROWSER_HOME},
156  {Qt::Key_VolumeMute, VK_VOLUME_MUTE},
157  {Qt::Key_VolumeDown, VK_VOLUME_DOWN},
158  {Qt::Key_VolumeUp, VK_VOLUME_UP},
159  {Qt::Key_MediaNext, VK_MEDIA_NEXT_TRACK},
160  {Qt::Key_MediaPrevious, VK_MEDIA_PREV_TRACK},
161  {Qt::Key_MediaStop, VK_MEDIA_STOP},
162  {Qt::Key_MediaPlay, VK_MEDIA_PLAY_PAUSE},
163  {Qt::Key_LaunchMail, VK_LAUNCH_MAIL},
164  {Qt::Key_LaunchMedia, VK_LAUNCH_MEDIA_SELECT},
165  {Qt::Key_Launch0, VK_LAUNCH_APP1},
166  {Qt::Key_Launch1, VK_LAUNCH_APP2},
167 #endif
168  /* { 0, VK_OEM_1 },
169  { 0, VK_OEM_PLUS },
170  { 0, VK_OEM_COMMA },
171  { 0, VK_OEM_MINUS },
172  { 0, VK_OEM_PERIOD },
173  { 0, VK_OEM_2 },
174  { 0, VK_OEM_3 },
175  { 0, VK_OEM_4 },
176  { 0, VK_OEM_5 },
177  { 0, VK_OEM_6 },
178  { 0, VK_OEM_7 },
179  { 0, VK_OEM_8 },*/
180  {Qt::Key_Play, VK_PLAY},
181  {Qt::Key_Zoom, VK_ZOOM},
182  {Qt::Key_Clear, VK_OEM_CLEAR},
183  // { 0
184 };
185 
186 bool keyQtToModWin(int keyQt, uint *mod)
187 {
188  *mod = 0;
189  if (keyQt & Qt::ShiftModifier) {
190  *mod |= MOD_SHIFT;
191  }
192  if (keyQt & Qt::ControlModifier) {
193  *mod |= MOD_CONTROL;
194  }
195  if (keyQt & Qt::AltModifier) {
196  *mod |= MOD_ALT;
197  }
198  if (keyQt & Qt::MetaModifier) {
199  *mod |= MOD_WIN;
200  }
201 
202  return true;
203 }
204 
205 bool modWinToKeyQt(uint mod, int *keyQt)
206 {
207  *keyQt = 0;
208  if (mod & MOD_SHIFT) {
209  *keyQt |= Qt::ShiftModifier;
210  }
211  if (mod & MOD_CONTROL) {
212  *keyQt |= Qt::ControlModifier;
213  }
214  if (mod & MOD_ALT) {
215  *keyQt |= Qt::AltModifier;
216  }
217  if (mod & MOD_WIN) {
218  *keyQt |= Qt::MetaModifier;
219  }
220 
221  return true;
222 }
223 
224 bool keyQtToCodeWin(int keyQt, uint *sym)
225 {
226  int symQt = keyQt & ~Qt::KeyboardModifierMask;
227 
228  if (symQt >= Qt::Key_A && symQt <= Qt::Key_Z) {
229  *sym = symQt;
230  return true;
231  }
232 
233  for (uint i = 0; i < sizeof(KeyTbl); i++) {
234  if (KeyTbl[i].keySymQt == symQt) {
235  *sym = KeyTbl[i].keySymWin;
236  return true;
237  }
238  }
239 
240  *sym = 0;
241  if (symQt != Qt::Key_Shift && symQt != Qt::Key_Control && symQt != Qt::Key_Alt && symQt != Qt::Key_Meta && symQt != Qt::Key_Direction_L
242  && symQt != Qt::Key_Direction_R) {
243  // qDebug() << "Sym::initQt( " << QString::number(keyQt,16) << " ): failed to convert key.";
244  }
245  return false;
246 }
247 
248 bool codeWinToKeyQt(uint sym, int *keyQt)
249 {
250  if (sym >= Qt::Key_A && sym <= Qt::Key_Z) {
251  *keyQt = sym;
252  return true;
253  }
254 
255  for (uint i = 0; i < sizeof(KeyTbl); i++) {
256  if (KeyTbl[i].keySymWin == sym) {
257  *keyQt = KeyTbl[i].keySymQt;
258  return true;
259  }
260  }
261 
262  *keyQt = 0;
263  return false;
264 }
265 
266 }
ShiftModifier
bool keyQtToCodeWin(int keyQt, uint *sym)
Extracts the symbol from the given Qt key and converts it to a Windows symbol.
A collection of functions for the conversion of key presses and their modifiers from the window syste...
Definition: kkeyserver.cpp:14
bool keyQtToModWin(int keyQt, uint *mod)
Extracts the modifiers from the given Qt key and converts them in a mask of Windows modifiers...
Key_Cancel
This file is part of the KDE documentation.
Documentation copyright © 1996-2021 The KDE developers.
Generated on Thu Oct 21 2021 22:41:50 by doxygen 1.8.11 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.