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