Revision 87f48e6a
b/cocoa.m | ||
---|---|---|
47 | 47 |
char **gArgv; |
48 | 48 |
DisplayState current_ds; |
49 | 49 |
|
50 |
int grab = 0; |
|
51 |
int modifiers_state[256]; |
|
52 |
|
|
50 | 53 |
/* main defined in qemu/vl.c */ |
51 | 54 |
int qemu_main(int argc, char **argv); |
52 | 55 |
|
... | ... | |
171 | 174 |
------------------------------------------------------ |
172 | 175 |
*/ |
173 | 176 |
|
174 |
static int keymap[] =
|
|
177 |
int keymap[] = |
|
175 | 178 |
{ |
176 |
30, //'a' 0x0 |
|
177 |
31, //'s' |
|
178 |
32, //'d' |
|
179 |
33, //'f' |
|
180 |
35, //'h' |
|
181 |
34, //'g' |
|
182 |
44, //'z' |
|
183 |
45, //'x' |
|
184 |
46, //'c' |
|
185 |
47, //'v' |
|
186 |
0, // 0 0x0a |
|
187 |
48, //'b' |
|
188 |
16, //'q' |
|
189 |
17, //'w' |
|
190 |
18, //'e' |
|
191 |
19, //'r' |
|
192 |
21, //'y' 0x10 |
|
193 |
20, //'t' |
|
194 |
2, //'1' |
|
195 |
3, //'2' |
|
196 |
4, //'3' |
|
197 |
5, //'4' |
|
198 |
7, //'6' |
|
199 |
6, //'5' |
|
200 |
0, //'=' |
|
201 |
10, //'9' |
|
202 |
8, //'7' 0x1A |
|
203 |
0, //'-' |
|
204 |
9, //'8' |
|
205 |
11, //'0' |
|
206 |
27, //']' |
|
207 |
24, //'o' |
|
208 |
22, //'u' 0x20 |
|
209 |
26, //'[' |
|
210 |
23, //'i' |
|
211 |
25, //'p' |
|
212 |
28, //'\n' |
|
213 |
38, //'l' |
|
214 |
36, //'j' |
|
215 |
40, //'"' |
|
216 |
37, //'k' |
|
217 |
39, //';' |
|
218 |
15, //'\t' 0x30 |
|
219 |
0, //' ' |
|
220 |
0, //'`' |
|
221 |
14, //'<backspace>' |
|
222 |
0, //'' 0x34 |
|
223 |
0, //'<esc>' |
|
224 |
0, //'<esc>' |
|
225 |
/* Not completed to finish see http://www.libsdl.org/cgi/cvsweb.cgi/SDL12/src/video/quartz/SDL_QuartzKeys.h?rev=1.6&content-type=text/x-cvsweb-markup */ |
|
179 |
// SdlI macI macH SdlH 104xtH 104xtC sdl |
|
180 |
30, // 0 0x00 0x1e A QZ_a |
|
181 |
31, // 1 0x01 0x1f S QZ_s |
|
182 |
32, // 2 0x02 0x20 D QZ_d |
|
183 |
33, // 3 0x03 0x21 F QZ_f |
|
184 |
35, // 4 0x04 0x23 H QZ_h |
|
185 |
34, // 5 0x05 0x22 G QZ_g |
|
186 |
44, // 6 0x06 0x2c Z QZ_z |
|
187 |
45, // 7 0x07 0x2d X QZ_x |
|
188 |
46, // 8 0x08 0x2e C QZ_c |
|
189 |
47, // 9 0x09 0x2f V QZ_v |
|
190 |
0, // 10 0x0A Undefined |
|
191 |
48, // 11 0x0B 0x30 B QZ_b |
|
192 |
16, // 12 0x0C 0x10 Q QZ_q |
|
193 |
17, // 13 0x0D 0x11 W QZ_w |
|
194 |
18, // 14 0x0E 0x12 E QZ_e |
|
195 |
19, // 15 0x0F 0x13 R QZ_r |
|
196 |
21, // 16 0x10 0x15 Y QZ_y |
|
197 |
20, // 17 0x11 0x14 T QZ_t |
|
198 |
2, // 18 0x12 0x02 1 QZ_1 |
|
199 |
3, // 19 0x13 0x03 2 QZ_2 |
|
200 |
4, // 20 0x14 0x04 3 QZ_3 |
|
201 |
5, // 21 0x15 0x05 4 QZ_4 |
|
202 |
7, // 22 0x16 0x07 6 QZ_6 |
|
203 |
6, // 23 0x17 0x06 5 QZ_5 |
|
204 |
13, // 24 0x18 0x0d = QZ_EQUALS |
|
205 |
10, // 25 0x19 0x0a 9 QZ_9 |
|
206 |
8, // 26 0x1A 0x08 7 QZ_7 |
|
207 |
12, // 27 0x1B 0x0c - QZ_MINUS |
|
208 |
9, // 28 0x1C 0x09 8 QZ_8 |
|
209 |
11, // 29 0x1D 0x0b 0 QZ_0 |
|
210 |
27, // 30 0x1E 0x1b ] QZ_RIGHTBRACKET |
|
211 |
24, // 31 0x1F 0x18 O QZ_o |
|
212 |
22, // 32 0x20 0x16 U QZ_u |
|
213 |
26, // 33 0x21 0x1a [ QZ_LEFTBRACKET |
|
214 |
23, // 34 0x22 0x17 I QZ_i |
|
215 |
25, // 35 0x23 0x19 P QZ_p |
|
216 |
28, // 36 0x24 0x1c ENTER QZ_RETURN |
|
217 |
38, // 37 0x25 0x26 L QZ_l |
|
218 |
36, // 38 0x26 0x24 J QZ_j |
|
219 |
40, // 39 0x27 0x28 ' QZ_QUOTE |
|
220 |
37, // 40 0x28 0x25 K QZ_k |
|
221 |
39, // 41 0x29 0x27 ; QZ_SEMICOLON |
|
222 |
43, // 42 0x2A 0x2b \ QZ_BACKSLASH |
|
223 |
51, // 43 0x2B 0x33 , QZ_COMMA |
|
224 |
53, // 44 0x2C 0x35 / QZ_SLASH |
|
225 |
49, // 45 0x2D 0x31 N QZ_n |
|
226 |
50, // 46 0x2E 0x32 M QZ_m |
|
227 |
52, // 47 0x2F 0x34 . QZ_PERIOD |
|
228 |
15, // 48 0x30 0x0f TAB QZ_TAB |
|
229 |
57, // 49 0x31 0x39 SPACE QZ_SPACE |
|
230 |
41, // 50 0x32 0x29 ` QZ_BACKQUOTE |
|
231 |
14, // 51 0x33 0x0e BKSP QZ_BACKSPACE |
|
232 |
0, // 52 0x34 Undefined |
|
233 |
1, // 53 0x35 0x01 ESC QZ_ESCAPE |
|
234 |
0, // 54 0x36 QZ_RMETA |
|
235 |
0, // 55 0x37 QZ_LMETA |
|
236 |
42, // 56 0x38 0x2a L SHFT QZ_LSHIFT |
|
237 |
58, // 57 0x39 0x3a CAPS QZ_CAPSLOCK |
|
238 |
56, // 58 0x3A 0x38 L ALT QZ_LALT |
|
239 |
29, // 59 0x3B 0x1d L CTRL QZ_LCTRL |
|
240 |
54, // 60 0x3C 0x36 R SHFT QZ_RSHIFT |
|
241 |
184,// 61 0x3D 0xb8 E0,38 R ALT QZ_RALT |
|
242 |
157,// 62 0x3E 0x9d E0,1D R CTRL QZ_RCTRL |
|
243 |
0, // 63 0x3F Undefined |
|
244 |
0, // 64 0x40 Undefined |
|
245 |
0, // 65 0x41 Undefined |
|
246 |
0, // 66 0x42 Undefined |
|
247 |
55, // 67 0x43 0x37 KP * QZ_KP_MULTIPLY |
|
248 |
0, // 68 0x44 Undefined |
|
249 |
78, // 69 0x45 0x4e KP + QZ_KP_PLUS |
|
250 |
0, // 70 0x46 Undefined |
|
251 |
69, // 71 0x47 0x45 NUM QZ_NUMLOCK |
|
252 |
0, // 72 0x48 Undefined |
|
253 |
0, // 73 0x49 Undefined |
|
254 |
0, // 74 0x4A Undefined |
|
255 |
181,// 75 0x4B 0xb5 E0,35 KP / QZ_KP_DIVIDE |
|
256 |
152,// 76 0x4C 0x9c E0,1C KP EN QZ_KP_ENTER |
|
257 |
0, // 77 0x4D undefined |
|
258 |
74, // 78 0x4E 0x4a KP - QZ_KP_MINUS |
|
259 |
0, // 79 0x4F Undefined |
|
260 |
0, // 80 0x50 Undefined |
|
261 |
0, // 81 0x51 QZ_KP_EQUALS |
|
262 |
82, // 82 0x52 0x52 KP 0 QZ_KP0 |
|
263 |
79, // 83 0x53 0x4f KP 1 QZ_KP1 |
|
264 |
80, // 84 0x54 0x50 KP 2 QZ_KP2 |
|
265 |
81, // 85 0x55 0x51 KP 3 QZ_KP3 |
|
266 |
75, // 86 0x56 0x4b KP 4 QZ_KP4 |
|
267 |
76, // 87 0x57 0x4c KP 5 QZ_KP5 |
|
268 |
77, // 88 0x58 0x4d KP 6 QZ_KP6 |
|
269 |
71, // 89 0x59 0x47 KP 7 QZ_KP7 |
|
270 |
0, // 90 0x5A Undefined |
|
271 |
72, // 91 0x5B 0x48 KP 8 QZ_KP8 |
|
272 |
73, // 92 0x5C 0x49 KP 9 QZ_KP9 |
|
273 |
0, // 93 0x5D Undefined |
|
274 |
0, // 94 0x5E Undefined |
|
275 |
0, // 95 0x5F Undefined |
|
276 |
63, // 96 0x60 0x3f F5 QZ_F5 |
|
277 |
64, // 97 0x61 0x40 F6 QZ_F6 |
|
278 |
65, // 98 0x62 0x41 F7 QZ_F7 |
|
279 |
61, // 99 0x63 0x3d F3 QZ_F3 |
|
280 |
66, // 100 0x64 0x42 F8 QZ_F8 |
|
281 |
67, // 101 0x65 0x43 F9 QZ_F9 |
|
282 |
0, // 102 0x66 Undefined |
|
283 |
87, // 103 0x67 0x57 F11 QZ_F11 |
|
284 |
0, // 104 0x68 Undefined |
|
285 |
183,// 105 0x69 0xb7 QZ_PRINT |
|
286 |
0, // 106 0x6A Undefined |
|
287 |
70, // 107 0x6B 0x46 SCROLL QZ_SCROLLOCK |
|
288 |
0, // 108 0x6C Undefined |
|
289 |
68, // 109 0x6D 0x44 F10 QZ_F10 |
|
290 |
0, // 110 0x6E Undefined |
|
291 |
88, // 111 0x6F 0x58 F12 QZ_F12 |
|
292 |
0, // 112 0x70 Undefined |
|
293 |
110,// 113 0x71 0x0 QZ_PAUSE |
|
294 |
210,// 114 0x72 0xd2 E0,52 INSERT QZ_INSERT |
|
295 |
199,// 115 0x73 0xc7 E0,47 HOME QZ_HOME |
|
296 |
201,// 116 0x74 0xc9 E0,49 PG UP QZ_PAGEUP |
|
297 |
211,// 117 0x75 0xd3 E0,53 DELETE QZ_DELETE |
|
298 |
62, // 118 0x76 0x3e F4 QZ_F4 |
|
299 |
207,// 119 0x77 0xcf E0,4f END QZ_END |
|
300 |
60, // 120 0x78 0x3c F2 QZ_F2 |
|
301 |
209,// 121 0x79 0xd1 E0,51 PG DN QZ_PAGEDOWN |
|
302 |
59, // 122 0x7A 0x3b F1 QZ_F1 |
|
303 |
203,// 123 0x7B 0xcb e0,4B L ARROW QZ_LEFT |
|
304 |
205,// 124 0x7C 0xcd e0,4D R ARROW QZ_RIGHT |
|
305 |
208,// 125 0x7D 0xd0 E0,50 D ARROW QZ_DOWN |
|
306 |
200,// 126 0x7E 0xc8 E0,48 U ARROW QZ_UP |
|
307 |
/* completed according to http://www.libsdl.org/cgi/cvsweb.cgi/SDL12/src/video/quartz/SDL_QuartzKeys.h?rev=1.6&content-type=text/x-cvsweb-markup */ |
|
308 |
|
|
309 |
/* Aditional 104 Key XP-Keyboard Scancodes from http://www.computer-engineering.org/ps2keyboard/scancodes1.html */ |
|
310 |
/* |
|
311 |
219 // 0xdb e0,5b L GUI |
|
312 |
220 // 0xdc e0,5c R GUI |
|
313 |
221 // 0xdd e0,5d APPS |
|
314 |
// E0,2A,E0,37 PRNT SCRN |
|
315 |
// E1,1D,45,E1,9D,C5 PAUSE |
|
316 |
83 // 0x53 0x53 KP . |
|
317 |
// ACPI Scan Codes |
|
318 |
222 // 0xde E0, 5E Power |
|
319 |
223 // 0xdf E0, 5F Sleep |
|
320 |
227 // 0xe3 E0, 63 Wake |
|
321 |
// Windows Multimedia Scan Codes |
|
322 |
153 // 0x99 E0, 19 Next Track |
|
323 |
144 // 0x90 E0, 10 Previous Track |
|
324 |
164 // 0xa4 E0, 24 Stop |
|
325 |
162 // 0xa2 E0, 22 Play/Pause |
|
326 |
160 // 0xa0 E0, 20 Mute |
|
327 |
176 // 0xb0 E0, 30 Volume Up |
|
328 |
174 // 0xae E0, 2E Volume Down |
|
329 |
237 // 0xed E0, 6D Media Select |
|
330 |
236 // 0xec E0, 6C E-Mail |
|
331 |
161 // 0xa1 E0, 21 Calculator |
|
332 |
235 // 0xeb E0, 6B My Computer |
|
333 |
229 // 0xe5 E0, 65 WWW Search |
|
334 |
178 // 0xb2 E0, 32 WWW Home |
|
335 |
234 // 0xea E0, 6A WWW Back |
|
336 |
233 // 0xe9 E0, 69 WWW Forward |
|
337 |
232 // 0xe8 E0, 68 WWW Stop |
|
338 |
231 // 0xe7 E0, 67 WWW Refresh |
|
339 |
230 // 0xe6 E0, 66 WWW Favorites |
|
340 |
*/ |
|
226 | 341 |
}; |
227 | 342 |
|
228 |
static int cocoa_keycode_to_qemu(int keycode)
|
|
343 |
int cocoa_keycode_to_qemu(int keycode) |
|
229 | 344 |
{ |
230 |
if(sizeof(keymap) <= keycode)
|
|
345 |
if((sizeof(keymap)/sizeof(int)) <= keycode)
|
|
231 | 346 |
{ |
232 | 347 |
printf("(cocoa) warning unknow keycode 0x%x\n", keycode); |
233 | 348 |
return 0; |
... | ... | |
246 | 361 |
NSDate *distantPast; |
247 | 362 |
NSEvent *event; |
248 | 363 |
NSAutoreleasePool *pool; |
249 |
int grab = 1; |
|
250 | 364 |
|
251 | 365 |
pool = [ [ NSAutoreleasePool alloc ] init ]; |
252 | 366 |
distantPast = [ NSDate distantPast ]; |
... | ... | |
258 | 372 |
inMode: NSDefaultRunLoopMode dequeue:YES ]; |
259 | 373 |
if (event != nil) { |
260 | 374 |
switch ([event type]) { |
261 |
case NSKeyDown: |
|
262 |
if(grab) |
|
375 |
case NSFlagsChanged: |
|
263 | 376 |
{ |
264 | 377 |
int keycode = cocoa_keycode_to_qemu([event keyCode]); |
378 |
modifiers_state[keycode] = (modifiers_state[keycode] == 0) ? 1 : 0; |
|
379 |
|
|
380 |
if ( modifiers_state[keycode] ) { /* Keydown */ |
|
381 |
if (keycode & 0x80) |
|
382 |
kbd_put_keycode(0xe0); |
|
383 |
kbd_put_keycode(keycode & 0x7f); |
|
384 |
} else { /* Keyup */ |
|
385 |
if (keycode & 0x80) |
|
386 |
kbd_put_keycode(0xe0); |
|
387 |
kbd_put_keycode(keycode | 0x80); |
|
388 |
} |
|
265 | 389 |
|
266 |
if (keycode & 0x80) |
|
267 |
kbd_put_keycode(0xe0); |
|
268 |
kbd_put_keycode(keycode & 0x7f); |
|
390 |
/* emulate caps lock and num lock keyup */ |
|
391 |
if ((keycode == 58) || (keycode == 69)) |
|
392 |
{ |
|
393 |
modifiers_state[keycode] = 0; |
|
394 |
if (keycode & 0x80) |
|
395 |
kbd_put_keycode(0xe0); |
|
396 |
kbd_put_keycode(keycode | 0x80); |
|
397 |
} |
|
398 |
|
|
399 |
/* release Mouse grab when pressing ctrl+alt */ |
|
400 |
if (([event modifierFlags] & NSControlKeyMask) && ([event modifierFlags] & NSAlternateKeyMask)) |
|
401 |
[window setTitle: @"QEMU"]; |
|
402 |
[NSCursor unhide]; |
|
403 |
CGAssociateMouseAndMouseCursorPosition ( TRUE ); |
|
404 |
grab = 0; |
|
269 | 405 |
} |
270 | 406 |
break; |
407 |
|
|
408 |
case NSKeyDown: |
|
409 |
{ |
|
410 |
int keycode = cocoa_keycode_to_qemu([event keyCode]); |
|
411 |
|
|
412 |
/* handle command Key Combos */ |
|
413 |
if ([event modifierFlags] & NSCommandKeyMask) { |
|
414 |
switch ([event keyCode]) { |
|
415 |
/* quit */ |
|
416 |
case 12: /* q key */ |
|
417 |
/* switch to windowed View */ |
|
418 |
exit(0); |
|
419 |
return; |
|
420 |
} |
|
421 |
} |
|
422 |
|
|
423 |
/* handle control + alt Key Combos */ |
|
424 |
if (([event modifierFlags] & NSControlKeyMask) && ([event modifierFlags] & NSAlternateKeyMask)) { |
|
425 |
switch (keycode) { |
|
426 |
/* toggle Monitor */ |
|
427 |
case 0x02 ... 0x0a: /* '1' to '9' keys */ |
|
428 |
console_select(keycode - 0x02); |
|
429 |
if (is_active_console(vga_console)) { |
|
430 |
/* tell the vga console to redisplay itself */ |
|
431 |
vga_invalidate_display(); |
|
432 |
break; |
|
433 |
} |
|
434 |
} |
|
435 |
} else { |
|
436 |
/* handle standard key events */ |
|
437 |
if (is_active_console(vga_console)) { |
|
438 |
if (keycode & 0x80) //check bit for e0 in front |
|
439 |
kbd_put_keycode(0xe0); |
|
440 |
kbd_put_keycode(keycode & 0x7f); //remove e0 bit in front |
|
441 |
/* handle monitor key events */ |
|
442 |
} else { |
|
443 |
switch([event keyCode]) { |
|
444 |
case 123: |
|
445 |
kbd_put_keysym(QEMU_KEY_LEFT); |
|
446 |
break; |
|
447 |
case 124: |
|
448 |
kbd_put_keysym(QEMU_KEY_RIGHT); |
|
449 |
break; |
|
450 |
case 125: |
|
451 |
kbd_put_keysym(QEMU_KEY_DOWN); |
|
452 |
break; |
|
453 |
case 126: |
|
454 |
kbd_put_keysym(QEMU_KEY_UP); |
|
455 |
break; |
|
456 |
default: |
|
457 |
kbd_put_keysym([[event characters] characterAtIndex:0]); |
|
458 |
break; |
|
459 |
} |
|
460 |
} |
|
461 |
} |
|
462 |
} |
|
463 |
break; |
|
464 |
|
|
271 | 465 |
case NSKeyUp: |
272 |
if(grab) |
|
273 | 466 |
{ |
274 |
int keycode = cocoa_keycode_to_qemu([event keyCode]); |
|
275 |
|
|
276 |
if (keycode & 0x80) |
|
277 |
kbd_put_keycode(0xe0); |
|
278 |
kbd_put_keycode(keycode | 0x80); |
|
467 |
int keycode = cocoa_keycode_to_qemu([event keyCode]); |
|
468 |
if (is_active_console(vga_console)) { |
|
469 |
if (keycode & 0x80) |
|
470 |
kbd_put_keycode(0xe0); |
|
471 |
kbd_put_keycode(keycode | 0x80); //add 128 to signal release of key |
|
472 |
} |
|
279 | 473 |
} |
280 | 474 |
break; |
281 |
case NSScrollWheel: |
|
282 |
|
|
475 |
|
|
476 |
case NSMouseMoved: |
|
477 |
if (grab) { |
|
478 |
int dx = [event deltaX]; |
|
479 |
int dy = [event deltaY]; |
|
480 |
int dz = [event deltaZ]; |
|
481 |
int buttons = 0; |
|
482 |
kbd_mouse_event(dx, dy, dz, buttons); |
|
483 |
} |
|
484 |
break; |
|
485 |
|
|
283 | 486 |
case NSLeftMouseDown: |
487 |
if (grab) { |
|
488 |
int buttons = 0; |
|
489 |
|
|
490 |
/* leftclick+command simulates rightclick */ |
|
491 |
if ([event modifierFlags] & NSCommandKeyMask) { |
|
492 |
buttons |= MOUSE_EVENT_RBUTTON; |
|
493 |
} else { |
|
494 |
buttons |= MOUSE_EVENT_LBUTTON; |
|
495 |
} |
|
496 |
kbd_mouse_event(0, 0, 0, buttons); |
|
497 |
} else { |
|
498 |
[NSApp sendEvent: event]; |
|
499 |
} |
|
500 |
break; |
|
501 |
|
|
502 |
case NSLeftMouseDragged: |
|
503 |
if (grab) { |
|
504 |
int dx = [event deltaX]; |
|
505 |
int dy = [event deltaY]; |
|
506 |
int dz = [event deltaZ]; |
|
507 |
int buttons = 0; |
|
508 |
if ([[NSApp currentEvent] modifierFlags] & NSCommandKeyMask) { //leftclick+command simulates rightclick |
|
509 |
buttons |= MOUSE_EVENT_RBUTTON; |
|
510 |
} else { |
|
511 |
buttons |= MOUSE_EVENT_LBUTTON; |
|
512 |
} |
|
513 |
kbd_mouse_event(dx, dy, dz, buttons); |
|
514 |
} |
|
515 |
break; |
|
516 |
|
|
284 | 517 |
case NSLeftMouseUp: |
285 |
|
|
286 |
case NSOtherMouseDown: |
|
518 |
if (grab) { |
|
519 |
kbd_mouse_event(0, 0, 0, 0); |
|
520 |
} else { |
|
521 |
[window setTitle: @"QEMU (Press ctrl + alt to release Mouse)"]; |
|
522 |
[NSCursor hide]; |
|
523 |
CGAssociateMouseAndMouseCursorPosition ( FALSE ); |
|
524 |
grab = 1; |
|
525 |
//[NSApp sendEvent: event]; |
|
526 |
} |
|
527 |
break; |
|
528 |
|
|
287 | 529 |
case NSRightMouseDown: |
288 |
|
|
289 |
case NSOtherMouseUp: |
|
530 |
if (grab) { |
|
531 |
int buttons = 0; |
|
532 |
|
|
533 |
buttons |= MOUSE_EVENT_RBUTTON; |
|
534 |
kbd_mouse_event(0, 0, 0, buttons); |
|
535 |
} else { |
|
536 |
[NSApp sendEvent: event]; |
|
537 |
} |
|
538 |
break; |
|
539 |
|
|
540 |
case NSRightMouseDragged: |
|
541 |
if (grab) { |
|
542 |
int dx = [event deltaX]; |
|
543 |
int dy = [event deltaY]; |
|
544 |
int dz = [event deltaZ]; |
|
545 |
int buttons = 0; |
|
546 |
buttons |= MOUSE_EVENT_RBUTTON; |
|
547 |
kbd_mouse_event(dx, dy, dz, buttons); |
|
548 |
} |
|
549 |
break; |
|
550 |
|
|
290 | 551 |
case NSRightMouseUp: |
291 |
|
|
292 |
case NSMouseMoved: |
|
552 |
if (grab) { |
|
553 |
kbd_mouse_event(0, 0, 0, 0); |
|
554 |
} else { |
|
555 |
[NSApp sendEvent: event]; |
|
556 |
} |
|
557 |
break; |
|
558 |
|
|
293 | 559 |
case NSOtherMouseDragged: |
294 |
case NSRightMouseDragged: |
|
295 |
case NSLeftMouseDragged: |
|
560 |
if (grab) { |
|
561 |
int dx = [event deltaX]; |
|
562 |
int dy = [event deltaY]; |
|
563 |
int dz = [event deltaZ]; |
|
564 |
int buttons = 0; |
|
565 |
buttons |= MOUSE_EVENT_MBUTTON; |
|
566 |
kbd_mouse_event(dx, dy, dz, buttons); |
|
567 |
} |
|
568 |
break; |
|
569 |
|
|
570 |
case NSOtherMouseDown: |
|
571 |
if (grab) { |
|
572 |
int buttons = 0; |
|
573 |
buttons |= MOUSE_EVENT_MBUTTON; |
|
574 |
kbd_mouse_event(0, 0, 0, buttons); |
|
575 |
} else { |
|
576 |
[NSApp sendEvent:event]; |
|
577 |
} |
|
578 |
break; |
|
579 |
|
|
580 |
case NSOtherMouseUp: |
|
581 |
if (grab) { |
|
582 |
kbd_mouse_event(0, 0, 0, 0); |
|
583 |
} else { |
|
584 |
[NSApp sendEvent: event]; |
|
585 |
} |
|
586 |
break; |
|
587 |
|
|
588 |
case NSScrollWheel: |
|
589 |
if (grab) { |
|
590 |
int dz = [event deltaY]; |
|
591 |
kbd_mouse_event(0, 0, -dz, 0); |
|
592 |
} |
|
593 |
break; |
|
296 | 594 |
|
297 | 595 |
default: [NSApp sendEvent:event]; |
298 | 596 |
} |
Also available in: Unified diff