Commit 87f48e6a1afbaf14bed8a5c253c874ec4f15edfb
1 parent
b3ecf620
fixed/full keyboard input - full mouse support - support for qemu console (Mike Kronenberg)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1582 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
373 additions
and
75 deletions
cocoa.m
... | ... | @@ -47,6 +47,9 @@ int gArgc; |
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,63 +174,175 @@ static void cocoa_resize(DisplayState *ds, int w, int h) |
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,7 +361,6 @@ static void cocoa_refresh(DisplayState *ds) |
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,41 +372,225 @@ static void cocoa_refresh(DisplayState *ds) |
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 | } | ... | ... |