Skip to content

Commit ef4f36d

Browse files
committed
Added special multimedia keycodes + restructured code
1 parent a1048b9 commit ef4f36d

File tree

2 files changed

+143
-134
lines changed

2 files changed

+143
-134
lines changed

src/keycode.h

+66-3
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ extern "C"
1515
#include <ApplicationServices/ApplicationServices.h>
1616

1717
enum _MMKeyCode {
18+
K_NOT_A_KEY = -1,
1819
K_BACKSPACE = kVK_Delete,
1920
K_DELETE = kVK_ForwardDelete,
2021
K_RETURN = kVK_Return,
@@ -45,16 +46,38 @@ enum _MMKeyCode {
4546
K_CONTROL = kVK_Control,
4647
K_SHIFT = kVK_Shift,
4748
K_CAPSLOCK = kVK_CapsLock,
48-
K_SPACE = kVK_Space
49+
K_SPACE = kVK_Space,
50+
K_PRINTSCREEN = K_NOT_A_KEY,
51+
52+
K_AUDIO_VOLUME_MUTE = kVK_Mute,
53+
K_AUDIO_VOLUME_DOWN = kVK_VolumeDown,
54+
K_AUDIO_VOLUME_UP = kVK_VolumeUp,
55+
K_AUDIO_PLAY = K_NOT_A_KEY,
56+
K_AUDIO_STOP = K_NOT_A_KEY,
57+
K_AUDIO_PAUSE = K_NOT_A_KEY,
58+
K_AUDIO_PREV = K_NOT_A_KEY,
59+
K_AUDIO_NEXT = K_NOT_A_KEY,
60+
K_AUDIO_REWIND = K_NOT_A_KEY,
61+
K_AUDIO_FORWARD = K_NOT_A_KEY,
62+
K_AUDIO_REPEAT = K_NOT_A_KEY,
63+
K_AUDIO_RANDOM = K_NOT_A_KEY,
64+
65+
K_LIGHTS_MON_UP = K_NOT_A_KEY,
66+
K_LIGHTS_MON_DOWN = K_NOT_A_KEY,
67+
K_LIGHTS_KBD_TOGGLE = K_NOT_A_KEY,
68+
K_LIGHTS_KBD_UP = K_NOT_A_KEY,
69+
K_LIGHTS_KBD_DOWN = K_NOT_A_KEY
4970
};
5071

5172
typedef CGKeyCode MMKeyCode;
5273

5374
#elif defined(USE_X11)
5475

5576
#include <X11/Xutil.h>
77+
#include <X11/XF86keysym.h>
5678

5779
enum _MMKeyCode {
80+
K_NOT_A_KEY = -1,
5881
K_BACKSPACE = XK_BackSpace,
5982
K_DELETE = XK_Delete,
6083
K_RETURN = XK_Return,
@@ -85,14 +108,35 @@ enum _MMKeyCode {
85108
K_CONTROL = XK_Control_L,
86109
K_SHIFT = XK_Shift_L,
87110
K_CAPSLOCK = XK_Shift_Lock,
88-
K_SPACE = XK_space
111+
K_SPACE = XK_space,
112+
K_PRINTSCREEN = XK_Print,
113+
114+
K_AUDIO_VOLUME_MUTE = XF86XK_AudioMute,
115+
K_AUDIO_VOLUME_DOWN = XF86XK_AudioLowerVolume,
116+
K_AUDIO_VOLUME_UP = XF86XK_AudioRaiseVolume,
117+
K_AUDIO_PLAY = XF86XK_AudioPlay,
118+
K_AUDIO_STOP = XF86XK_AudioStop,
119+
K_AUDIO_PAUSE = XF86XK_AudioPause,
120+
K_AUDIO_PREV = XF86XK_AudioPrev,
121+
K_AUDIO_NEXT = XF86XK_AudioNext,
122+
K_AUDIO_REWIND = XF86XK_AudioRewind,
123+
K_AUDIO_FORWARD = XF86XK_AudioForward,
124+
K_AUDIO_REPEAT = XF86XK_AudioRepeat,
125+
K_AUDIO_RANDOM = XF86XK_AudioRandomPlay,
126+
127+
K_LIGHTS_MON_UP = XF86XK_MonBrightnessUp,
128+
K_LIGHTS_MON_DOWN = XF86XK_MonBrightnessDown,
129+
K_LIGHTS_KBD_TOGGLE = XF86XK_KbdLightOnOff,
130+
K_LIGHTS_KBD_UP = XF86XK_KbdBrightnessUp,
131+
K_LIGHTS_KBD_DOWN = XF86XK_KbdBrightnessDown
89132
};
90133

91134
typedef KeySym MMKeyCode;
92135

93136
#elif defined(IS_WINDOWS)
94137

95138
enum _MMKeyCode {
139+
K_NOT_A_KEY = -1,
96140
K_BACKSPACE = VK_BACK,
97141
K_DELETE = VK_DELETE,
98142
K_RETURN = VK_RETURN,
@@ -124,7 +168,26 @@ enum _MMKeyCode {
124168
K_ALT = VK_MENU,
125169
K_CAPSLOCK = VK_CAPITAL,
126170
K_SPACE = VK_SPACE,
127-
K_PRINTSCREEN = VK_SNAPSHOT
171+
K_PRINTSCREEN = VK_SNAPSHOT,
172+
173+
K_AUDIO_VOLUME_MUTE = VK_VOLUME_MUTE,
174+
K_AUDIO_VOLUME_DOWN = VK_VOLUME_DOWN,
175+
K_AUDIO_VOLUME_UP = VK_VOLUME_UP,
176+
K_AUDIO_PLAY = VK_MEDIA_PLAY_PAUSE,
177+
K_AUDIO_STOP = VK_MEDIA_STOP,
178+
K_AUDIO_PAUSE = VK_MEDIA_PLAY_PAUSE,
179+
K_AUDIO_PREV = VK_MEDIA_PREV_TRACK,
180+
K_AUDIO_NEXT = VK_MEDIA_NEXT_TRACK,
181+
K_AUDIO_REWIND = K_NOT_A_KEY,
182+
K_AUDIO_FORWARD = K_NOT_A_KEY,
183+
K_AUDIO_REPEAT = K_NOT_A_KEY,
184+
K_AUDIO_RANDOM = K_NOT_A_KEY,
185+
186+
K_LIGHTS_MON_UP = K_NOT_A_KEY,
187+
K_LIGHTS_MON_DOWN = K_NOT_A_KEY,
188+
K_LIGHTS_KBD_TOGGLE = K_NOT_A_KEY,
189+
K_LIGHTS_KBD_UP = K_NOT_A_KEY,
190+
K_LIGHTS_KBD_DOWN = K_NOT_A_KEY
128191
};
129192

130193
typedef int MMKeyCode;

src/robotjs.cc

+77-131
Original file line numberDiff line numberDiff line change
@@ -243,145 +243,91 @@ NAN_METHOD(scrollMouse)
243243
|_|\_\___|\__, |_.__/ \___/ \__,_|_| \__,_|
244244
|___/
245245
*/
246+
struct KeyNames {
247+
const char* name;
248+
MMKeyCode key;
249+
};
250+
251+
static KeyNames key_names[] =
252+
{
253+
{ "backspace", K_BACKSPACE },
254+
{ "delete", K_DELETE },
255+
{ "enter", K_RETURN },
256+
{ "tab", K_TAB },
257+
{ "escape", K_ESCAPE },
258+
{ "up", K_UP },
259+
{ "down", K_DOWN },
260+
{ "right", K_RIGHT },
261+
{ "left", K_LEFT },
262+
{ "home", K_HOME },
263+
{ "end", K_END },
264+
{ "page_up", K_PAGEUP },
265+
{ "page_down", K_PAGEDOWN },
266+
{ "f1", K_F1 },
267+
{ "f2", K_F2 },
268+
{ "f3", K_F3 },
269+
{ "f4", K_F4 },
270+
{ "f5", K_F5 },
271+
{ "f6", K_F6 },
272+
{ "f7", K_F7 },
273+
{ "f8", K_F8 },
274+
{ "f9", K_F9 },
275+
{ "f10", K_F10 },
276+
{ "f11", K_F11 },
277+
{ "f12", K_F12 },
278+
{ "command", K_META },
279+
{ "alt", K_ALT },
280+
{ "control", K_CONTROL },
281+
{ "shift", K_SHIFT },
282+
{ "caps", K_CAPSLOCK },
283+
{ "space", K_SPACE },
284+
{ "printscreen", K_PRINTSCREEN },
285+
286+
{ "audio_mute", K_AUDIO_VOLUME_MUTE },
287+
{ "audio_vol_down", K_AUDIO_VOLUME_DOWN },
288+
{ "audio_vol_up", K_AUDIO_VOLUME_UP },
289+
{ "audio_play", K_AUDIO_PLAY },
290+
{ "audio_stop", K_AUDIO_STOP },
291+
{ "audio_pause", K_AUDIO_PAUSE },
292+
{ "audio_prev", K_AUDIO_PREV },
293+
{ "audio_next", K_AUDIO_NEXT },
294+
{ "audio_rewind", K_AUDIO_REWIND },
295+
{ "audio_forward", K_AUDIO_FORWARD },
296+
{ "audio_repeat", K_AUDIO_REPEAT },
297+
{ "audio_random", K_AUDIO_RANDOM },
298+
299+
{ "lights_mon_up", K_LIGHTS_MON_UP },
300+
{ "lights_mon_down", K_LIGHTS_MON_DOWN },
301+
{ "lights_kbd_toggle",K_LIGHTS_KBD_TOGGLE },
302+
{ "lights_kbd_up", K_LIGHTS_KBD_UP },
303+
{ "lights_kbd_down", K_LIGHTS_KBD_DOWN },
304+
305+
{ NULL, K_NOT_A_KEY } /* end marker */
306+
};
246307

247308
int CheckKeyCodes(char* k, MMKeyCode *key)
248309
{
249310
if (!key) return -1;
250311

251-
if (strcmp(k, "alt") == 0)
252-
{
253-
*key = K_ALT;
254-
}
255-
else if (strcmp(k, "command") == 0)
256-
{
257-
*key = K_META;
258-
}
259-
else if (strcmp(k, "control") == 0)
260-
{
261-
*key = K_CONTROL;
262-
}
263-
else if (strcmp(k, "shift") == 0)
264-
{
265-
*key = K_SHIFT;
266-
}
267-
else if (strcmp(k, "backspace") == 0)
268-
{
269-
*key = K_BACKSPACE;
270-
}
271-
else if (strcmp(k, "enter") == 0)
272-
{
273-
*key = K_RETURN;
274-
}
275-
else if (strcmp(k, "tab") == 0)
276-
{
277-
*key = K_TAB;
278-
}
279-
else if (strcmp(k, "up") == 0)
280-
{
281-
*key = K_UP;
282-
}
283-
else if (strcmp(k, "down") == 0)
284-
{
285-
*key = K_DOWN;
286-
}
287-
else if (strcmp(k, "left") == 0)
288-
{
289-
*key = K_LEFT;
290-
}
291-
else if (strcmp(k, "right") == 0)
292-
{
293-
*key = K_RIGHT;
294-
}
295-
else if (strcmp(k, "escape") == 0)
296-
{
297-
*key = K_ESCAPE;
298-
}
299-
else if (strcmp(k, "delete") == 0)
300-
{
301-
*key = K_DELETE;
302-
}
303-
else if (strcmp(k, "home") == 0)
304-
{
305-
*key = K_HOME;
306-
}
307-
else if (strcmp(k, "end") == 0)
308-
{
309-
*key = K_END;
310-
}
311-
else if (strcmp(k, "pageup") == 0)
312-
{
313-
*key = K_PAGEUP;
314-
}
315-
else if (strcmp(k, "pagedown") == 0)
316-
{
317-
*key = K_PAGEDOWN;
318-
}
319-
else if (strcmp(k, "space") == 0)
320-
{
321-
*key = K_SPACE;
322-
}
323-
else if (strcmp(k, "f1") == 0)
324-
{
325-
*key = K_F1;
326-
}
327-
else if (strcmp(k, "f2") == 0)
328-
{
329-
*key = K_F2;
330-
}
331-
else if (strcmp(k, "f3") == 0)
332-
{
333-
*key = K_F3;
334-
}
335-
else if (strcmp(k, "f4") == 0)
336-
{
337-
*key = K_F4;
338-
}
339-
else if (strcmp(k, "f5") == 0)
340-
{
341-
*key = K_F5;
342-
}
343-
else if (strcmp(k, "f6") == 0)
344-
{
345-
*key = K_F6;
346-
}
347-
else if (strcmp(k, "f7") == 0)
348-
{
349-
*key = K_F7;
350-
}
351-
else if (strcmp(k, "f8") == 0)
352-
{
353-
*key = K_F8;
354-
}
355-
else if (strcmp(k, "f9") == 0)
356-
{
357-
*key = K_F9;
358-
}
359-
else if (strcmp(k, "f10") == 0)
360-
{
361-
*key = K_F10;
362-
}
363-
else if (strcmp(k, "f11") == 0)
364-
{
365-
*key = K_F11;
366-
}
367-
else if (strcmp(k, "f12") == 0)
368-
{
369-
*key = K_F12;
370-
}
371-
else if (strcmp(k, "printscreen") == 0)
372-
{
373-
#if defined(IS_WINDOWS)
374-
*key = K_PRINTSCREEN;
375-
#else
376-
Nan::ThrowError("printscreen is only supported on Windows.");
377-
#endif
378-
}
379-
else if (strlen(k) == 1)
312+
if (strlen(k) == 1)
380313
{
381314
*key = keyCodeForChar(*k);
315+
return 0;
382316
}
383-
else
384-
{
317+
318+
*key = K_NOT_A_KEY;
319+
320+
KeyNames* kn = key_names;
321+
while (kn->name) {
322+
if (strcmp(k, kn->name) == 0)
323+
{
324+
*key = kn->key;
325+
break;
326+
}
327+
kn++;
328+
}
329+
330+
if (*key == K_NOT_A_KEY) {
385331
return -2;
386332
}
387333

0 commit comments

Comments
 (0)