File: scan-mac.c

package info (click to toggle)
bucklespring 1.4.0-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, buster, sid, stretch, trixie
  • size: 5,628 kB
  • sloc: ansic: 641; makefile: 54
file content (219 lines) | stat: -rw-r--r-- 7,833 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219

#ifdef __APPLE__

#include <ApplicationServices/ApplicationServices.h>
#include "buckle.h"

/* 
 * From https://www.virtualbox.org/svn/vbox/trunk/src/VBox/Frontends/VirtualBox/src/platform/darwin/DarwinKeyboard.cpp 
 */

static const int mactoset1[] =
{
	/*  set-1                           SDL_QuartzKeys.h    */
	0x1e,            /* QZ_a            0x00 */
	0x1f,            /* QZ_s            0x01 */
	0x20,            /* QZ_d            0x02 */
	0x21,            /* QZ_f            0x03 */
	0x23,            /* QZ_h            0x04 */
	0x22,            /* QZ_g            0x05 */
	0x2c,            /* QZ_z            0x06 */
	0x2d,            /* QZ_x            0x07 */
	0x2e,            /* QZ_c            0x08 */
	0x2f,            /* QZ_v            0x09 */
	0x56,            /* between lshift and z. 'INT 1'? */
	0x30,            /* QZ_b            0x0B */
	0x10,            /* QZ_q            0x0C */
	0x11,            /* QZ_w            0x0D */
	0x12,            /* QZ_e            0x0E */
	0x13,            /* QZ_r            0x0F */
	0x15,            /* QZ_y            0x10 */
	0x14,            /* QZ_t            0x11 */
	0x02,            /* QZ_1            0x12 */
	0x03,            /* QZ_2            0x13 */
	0x04,            /* QZ_3            0x14 */
	0x05,            /* QZ_4            0x15 */
	0x07,            /* QZ_6            0x16 */
	0x06,            /* QZ_5            0x17 */
	0x0d,            /* QZ_EQUALS       0x18 */
	0x0a,            /* QZ_9            0x19 */
	0x08,            /* QZ_7            0x1A */
	0x0c,            /* QZ_MINUS        0x1B */
	0x09,            /* QZ_8            0x1C */
	0x0b,            /* QZ_0            0x1D */
	0x1b,            /* QZ_RIGHTBRACKET 0x1E */
	0x18,            /* QZ_o            0x1F */
	0x16,            /* QZ_u            0x20 */
	0x1a,            /* QZ_LEFTBRACKET  0x21 */
	0x17,            /* QZ_i            0x22 */
	0x19,            /* QZ_p            0x23 */
	0x1c,            /* QZ_RETURN       0x24 */
	0x26,            /* QZ_l            0x25 */
	0x24,            /* QZ_j            0x26 */
	0x28,            /* QZ_QUOTE        0x27 */
	0x25,            /* QZ_k            0x28 */
	0x27,            /* QZ_SEMICOLON    0x29 */
	0x2b,            /* QZ_BACKSLASH    0x2A */
	0x33,            /* QZ_COMMA        0x2B */
	0x35,            /* QZ_SLASH        0x2C */
	0x31,            /* QZ_n            0x2D */
	0x32,            /* QZ_m            0x2E */
	0x34,            /* QZ_PERIOD       0x2F */
	0x0f,            /* QZ_TAB          0x30 */
	0x39,            /* QZ_SPACE        0x31 */
	0x29,            /* QZ_BACKQUOTE    0x32 */
	0x0e,            /* QZ_BACKSPACE    0x33 */
	0x9c,            /* QZ_IBOOK_ENTER  0x34 */
	0x01,            /* QZ_ESCAPE       0x35 */
	0x5c,            /* QZ_RMETA        0x36 */
	0x5b,            /* QZ_LMETA        0x37 */
	0x2a,            /* QZ_LSHIFT       0x38 */
	0x3a,            /* QZ_CAPSLOCK     0x39 */
	0x38,            /* QZ_LALT         0x3A */
	0x1d,            /* QZ_LCTRL        0x3B */
	0x36,            /* QZ_RSHIFT       0x3C */
	0x38,            /* QZ_RALT         0x3D */
	0x1d,            /* QZ_RCTRL        0x3E */
	0,               /*                      */
	0,               /*                      */
	0x53,            /* QZ_KP_PERIOD    0x41 */
	0,               /*                      */
	0x37,            /* QZ_KP_MULTIPLY  0x43 */
	0,               /*                      */
	0x4e,            /* QZ_KP_PLUS      0x45 */
	0,               /*                      */
	0x45,            /* QZ_NUMLOCK      0x47 */
	0,               /*                      */
	0,               /*                      */
	0,               /*                      */
	0x35,            /* QZ_KP_DIVIDE    0x4B */
	0x1c,            /* QZ_KP_ENTER     0x4C */
	0,               /*                      */
	0x4a,            /* QZ_KP_MINUS     0x4E */
	0,               /*                      */
	0,               /*                      */
	0x0d/*?*/,       /* QZ_KP_EQUALS    0x51 */
	0x52,            /* QZ_KP0          0x52 */
	0x4f,            /* QZ_KP1          0x53 */
	0x50,            /* QZ_KP2          0x54 */
	0x51,            /* QZ_KP3          0x55 */
	0x4b,            /* QZ_KP4          0x56 */
	0x4c,            /* QZ_KP5          0x57 */
	0x4d,            /* QZ_KP6          0x58 */
	0x47,            /* QZ_KP7          0x59 */
	0,               /*                      */
	0x48,            /* QZ_KP8          0x5B */
	0x49,            /* QZ_KP9          0x5C */
	0x7d,            /* yen, | (JIS)    0x5D */
	0x73,            /* _, ro (JIS)     0x5E */
	0,               /*                      */
	0x3f,            /* QZ_F5           0x60 */
	0x40,            /* QZ_F6           0x61 */
	0x41,            /* QZ_F7           0x62 */
	0x3d,            /* QZ_F3           0x63 */
	0x42,            /* QZ_F8           0x64 */
	0x43,            /* QZ_F9           0x65 */
	0x29,            /* Zen/Han (JIS)   0x66 */
	0x57,            /* QZ_F11          0x67 */
	0x29,            /* Zen/Han (JIS)   0x68 */
	0x37,            /* QZ_PRINT / F13  0x69 */
	0x63,            /* QZ_F16          0x6A */
	0x46,            /* QZ_SCROLLOCK    0x6B */
	0,               /*                      */
	0x44,            /* QZ_F10          0x6D */
	0x5d,            /*                      */
	0x58,            /* QZ_F12          0x6F */
	0,               /*                      */
	0/* 0xe1,0x1d,0x45*/, /* QZ_PAUSE        0x71 */
	0x52,            /* QZ_INSERT / HELP 0x72 */
	0x47,            /* QZ_HOME         0x73 */
	0x49,            /* QZ_PAGEUP       0x74 */
	0x53,            /* QZ_DELETE       0x75 */
	0x3e,            /* QZ_F4           0x76 */
	0x4f,            /* QZ_END          0x77 */
	0x3c,            /* QZ_F2           0x78 */
	0x51,            /* QZ_PAGEDOWN     0x79 */
	0x3b,            /* QZ_F1           0x7A */
	0x4b,            /* QZ_LEFT         0x7B */
	0x4d,            /* QZ_RIGHT        0x7C */
	0x50,            /* QZ_DOWN         0x7D */
	0x48,            /* QZ_UP           0x7E */
	0,/*0x5e|K_EX*/  /* QZ_POWER        0x7F */ /* have different break key! */
	/* do NEVER deliver the Power
	 * scancode as e.g. Windows will
	 * handle it, @bugref{7692}. */
};


/* 
 * Adapted from https://danielbeard.wordpress.com/2010/10/29/listening-for-global-keypresses-in-osx/ 
 */

CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon)
{
	if ((type != kCGEventKeyDown) && (type != kCGEventKeyUp))
		return event;

	int mackeycode = (int)CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode);
	printd("Mac keycode: %d", mackeycode);

	if (mackeycode >= sizeof(mactoset1)/sizeof(mactoset1[0]))
		return event;

	int key = mactoset1[mackeycode];

	if (CGEventGetIntegerValueField(event, kCGKeyboardEventAutorepeat))
		return event;

	switch (type) {
		case kCGEventKeyDown:
			play(key, 1);
			break;
		case kCGEventKeyUp:
			play(key, 0);
			break;
		default:
			break;
	}

	return event;
}


int scan(void)
{
	CFMachPortRef      eventTap;
	CGEventMask        eventMask;
	CFRunLoopSourceRef runLoopSource;

	/* Create an event tap. We are interested in key presses. */

	eventMask = ((1 << kCGEventKeyDown) | (1 << kCGEventKeyUp));
	eventTap = CGEventTapCreate(kCGSessionEventTap, kCGHeadInsertEventTap, 0, eventMask, myCGEventCallback, NULL);
	if (!eventTap) {
		fprintf(stderr, "failed to create event tap\n");
		exit(1);
	}

	/* Create a run loop source. */
	runLoopSource = CFMachPortCreateRunLoopSource( kCFAllocatorDefault, eventTap, 0);

	/* Add to the current run loop. */
	CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopCommonModes);

	/* Enable the event tap. */
	CGEventTapEnable(eventTap, true);

	/* Set it all running. */
	CFRunLoopRun();

	return 0;
}


void open_console(void)
{
}

#endif