Commit 87f48e6a1afbaf14bed8a5c253c874ec4f15edfb

Authored by bellard
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
... ... @@ -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 }
... ...