qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH] Experimental Cocoa Video Driver


From: Mike Kronenberg
Subject: [Qemu-devel] [PATCH] Experimental Cocoa Video Driver
Date: Sun, 10 Apr 2005 04:21:26 +0200
User-agent: Mozilla Thunderbird 1.0.2 (Macintosh/20050317)

Provides improved Mousesupport and grab/ungrab
- to grab: click into qemu window
- to ungrab: ctrl+alt or switch window (incl. alt-tab)

Tested: (on Win95b)
- leftclick, leftdrag, leftdoubleclick
- rightclick, rightdrag

Not tested:
- scrollwheel

Known Bug:
- can't grab when switching from other app by clicking qemu-window (first grabs, then ungrabs)
-> workaround: alt-tab to qemu, then click on qemu-window

have fun
Mike
Index: cocoa.m
===================================================================
RCS file: /cvsroot/qemu/qemu/cocoa.m,v
retrieving revision 1.4
diff -u -r1.4 cocoa.m
--- cocoa.m     7 Apr 2005 20:36:50 -0000       1.4
+++ cocoa.m     10 Apr 2005 01:01:29 -0000
@@ -27,7 +27,7 @@
               x  center the window
               -  save window position
               -  handle keyboard event
-              -  handle mouse event
+              /  handle mouse event
               -  non 32 bpp support
               -  full screen
               -  mouse focus
@@ -47,6 +47,8 @@
 char **gArgv;
 DisplayState current_ds;
 
+bool grab = false;
+
 /* main defined in qemu/vl.c */
 int qemu_main(int argc, char **argv);
 
@@ -173,55 +175,129 @@
 
 static int keymap[] =
 {
-    30, //'a' 0x0
-    31,  //'s'
-    32,  //'d'
-    33,  //'f'
-    35,  //'h'
-    34,  //'g'
-    44,  //'z'
-    45,  //'x'
-    46,  //'c'
-    47,  //'v'
-    0,   // 0  0x0a
-    48,  //'b'
-    16,  //'q'
-    17,  //'w'
-    18,  //'e'
-    19,  //'r' 
-    21,  //'y' 0x10
-    20,  //'t'
-    2,  //'1'
-    3,  //'2'
-    4,  //'3'
-    5,  //'4'
-    7,  //'6'
-    6,  //'5'
-    0,  //'='
-    10,  //'9'
-    8,  //'7' 0x1A
-    0,  //'-' 
-    9,  //'8' 
-    11,  //'0' 
-    27,  //']' 
-    24,  //'o' 
-    22,  //'u' 0x20
-    26,  //'['
-    23,  //'i'
-    25,  //'p'
-    28,  //'\n'
-    38,  //'l'
-    36,  //'j'
-    40,  //'"'
-    37,  //'k'
-    39,  //';'
-    15,  //'\t' 0x30
-    0,  //' '
-    0,  //'`'
-    14,  //'<backspace>'
-    0,  //'' 0x34
-    0,  //'<esc>'
-    0,  //'<esc>'
+    30,        //      0x00    #define QZ_a    0x1e
+    31,        //      0x01    #define QZ_s    0x1f
+    32,        //      0x02    #define QZ_d    0x20
+    33,        //      0x03    #define QZ_f    0x21
+    35,        //      0x04    #define QZ_h    0x23
+    34,        //      0x05    #define QZ_g    0x22
+    44,        //      0x06    #define QZ_z    0x2c
+    45,        //      0x07    #define QZ_x    0x2d
+    46,        //      0x08    #define QZ_c    0x2e
+    47,        //      0x09    #define QZ_v    0x2f
+    0, //      0x0A    Undefined       
+    48,        //      0x0B    #define QZ_b    0x30
+    16,        //      0x0C    #define QZ_q    0x10
+    17,        //      0x0D    #define QZ_w    0x11
+    18,        //      0x0E    #define QZ_e    0x12
+    19,        //      0x0F    #define QZ_r    0x13
+    21,        //      0x10    #define QZ_y    0x15
+    20,        //      0x11    #define QZ_t    0x14
+    2, //      0x12    #define QZ_1    0x2
+    3, //      0x13    #define QZ_2    0x3
+    4, //      0x14    #define QZ_3    0x4
+    5, //      0x15    #define QZ_4    0x5
+    7, //      0x16    #define QZ_6    0x7
+    6, //      0x17    #define QZ_5    0x6
+    13,        //      0x18    #define QZ_EQUALS       0xd
+    10,        //      0x19    #define QZ_9    0xa
+    8, //      0x1A    #define QZ_7    0x8
+    12,        //      0x1B    #define QZ_MINUS        0xc
+    9, //      0x1C    #define QZ_8    0x9
+    11,        //      0x1D    #define QZ_0    0xb
+    27,        //      0x1E    #define QZ_RIGHTBRACKET 0x1b
+    24,        //      0x1F    #define QZ_o    0x18
+    22,        //      0x20    #define QZ_u    0x16
+    26,        //      0x21    #define QZ_LEFTBRACKET  0x1a
+    23,        //      0x22    #define QZ_i    0x17
+    25,        //      0x23    #define QZ_p    0x19
+    28,        //      0x24    #define QZ_RETURN       0x1c
+    38,        //      0x25    #define QZ_l    0x26
+    36,        //      0x26    #define QZ_j    0x24
+    40,        //      0x27    #define QZ_QUOTE        0x28
+    37,        //      0x28    #define QZ_k    0x25
+    39,        //      0x29    #define QZ_SEMICOLON    0x27
+    43,        //      0x2A    #define QZ_BACKSLASH    0x2b
+    51,        //      0x2B    #define QZ_COMMA        0x33
+    53,        //      0x2C    #define QZ_SLASH        0x35
+    49,        //      0x2D    #define QZ_n    0x31
+    50,        //      0x2E    #define QZ_m    0x32
+    52,        //      0x2F    #define QZ_PERIOD       0x34
+    15,        //      0x30    #define QZ_TAB  0xf
+    57,        //      0x31    #define QZ_SPACE        0x39
+    41,        //      0x32    #define QZ_BACKQUOTE    0x29
+    14,        //      0x33    #define QZ_BACKSPACE    0xe
+    0, //      0x34    Undefined       
+    1, //      0x35    #define QZ_ESCAPE       0x1
+    0, //      0x36    #define QZ_RMETA        
+    0, //      0x37    #define QZ_LMETA        
+    26,        //      0x38    #define QZ_LSHIFT       0x2a
+    58,        //      0x39    #define QZ_CAPSLOCK     0x3a
+    56,        //      0x3A    #define QZ_LALT 0x38
+    29,        //      0x3B    #define QZ_LCTRL        0x1d
+    54,        //      0x3C    #define QZ_RSHIFT       0x36
+    168,       //      0x3D    #define QZ_RALT 0xb8
+    157,       //      0x3E    #define QZ_RCTRL        0x9d
+    0, //      0x3F    Undefined       
+    0, //      0x40    Undefined       
+    0, //      0x41    Undefined       
+    0, //      0x42    Undefined       
+    55,        //      0x43    #define QZ_KP_MULTIPLY  0x37
+    78,        //      0x45    #define QZ_KP_PLUS      0x4e
+    69,        //      0x47    #define QZ_NUMLOCK      0x45
+    0, //      0x48    Undefined       
+    0, //      0x49    Undefined       
+    0, //      0x4A    Undefined       
+    21,        //      0x4B    #define QZ_KP_DIVIDE    0xb5
+    152,       //      0x4C    #define QZ_KP_ENTER     0x9c
+    74,        //      0x4E    #define QZ_KP_MINUS     0x4a
+    0, //      0x4F    Undefined       
+    0, //      0x50    Undefined       
+    0, //      0x51    #define QZ_KP_EQUALS    
+    82,        //      0x52    #define QZ_KP0  0x52
+    79,        //      0x53    #define QZ_KP1  0x4f
+    80,        //      0x54    #define QZ_KP2  0x50
+    81,        //      0x55    #define QZ_KP3  0x51
+    76,        //      0x56    #define QZ_KP4  0x4b
+    77,        //      0x57    #define QZ_KP5  0x4c
+    78,        //      0x58    #define QZ_KP6  0x4d
+    71,        //      0x59    #define QZ_KP7  0x47
+    0, //      0x5A    Undefined       
+    72,        //      0x5B    #define QZ_KP8  0x48
+    73,        //      0x5C    #define QZ_KP9  0x49
+    0, //      0x5D    Undefined       
+    0, //      0x5E    Undefined       
+    0, //      0x5F    Undefined       
+    63,        //      0x60    #define QZ_F5   0x3f
+    64,        //      0x61    #define QZ_F6   0x40
+    65,        //      0x62    #define QZ_F7   0x41
+    61,        //      0x63    #define QZ_F3   0x3d
+    66,        //      0x64    #define QZ_F8   0x42
+    67,        //      0x65    #define QZ_F9   0x43
+    0, //      0x66    Undefined       
+    87,        //      0x67    #define QZ_F11  0x57
+    0, //      0x68    Undefined       
+    23,        //      0x69    #define QZ_PRINT        0xb7
+    0, //      0x6A    Undefined       
+    70,        //      0x6B    #define QZ_SCROLLOCK    0x46
+    68,        //      0x6D    #define QZ_F10  0x44
+    0, //      0x6E    Undefined       
+    88,        //      0x6F    #define QZ_F12  0x58
+    0, //      0x70    Undefined       
+    110,       //      0x71    #define QZ_PAUSE        0x0
+    210,       //      0x72    #define QZ_INSERT       0xd2
+    199,       //      0x73    #define QZ_HOME 0xc7
+    201,       //      0x74    #define QZ_PAGEUP       0xc9
+    211,       //      0x75    #define QZ_DELETE       0xd3
+    62,        //      0x76    #define QZ_F4   0x3e
+    223,       //      0x77    #define QZ_END  0xcf
+    60,        //      0x78    #define QZ_F2   0x3c
+    209,       //      0x79    #define QZ_PAGEDOWN     0xd1
+    59,        //      0x7A    #define QZ_F1   0x3b
+    219,       //      0x7B    #define QZ_LEFT 0xcb
+    221,       //      0x7C    #define QZ_RIGHT        0xcd
+    208,       //      0x7D    #define QZ_DOWN 0xd0
+    200,       //      0x7E    #define QZ_UP   0xc8    
     /* 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
 */
 };
 
@@ -246,23 +322,33 @@
     NSDate *distantPast;
     NSEvent *event;
     NSAutoreleasePool *pool;
-    int grab = 1;
     
     pool = [ [ NSAutoreleasePool alloc ] init ];
     distantPast = [ NSDate distantPast ];
     
+    /* release grab when switching windows or pressing ctrl+alt */
+    if ( 
+               (![window isKeyWindow]) ||
+               (([[NSApp currentEvent] modifierFlags] & NSControlKeyMask) && 
([[NSApp currentEvent] modifierFlags] & NSAlternateKeyMask))
+    ) {
+               grab = false;
+               [ window setTitle:@"Qemu" ];
+               [NSCursor unhide];
+               CGAssociateMouseAndMouseCursorPosition ( TRUE );
+    }
+    
     if (is_active_console(vga_console)) 
         vga_update_display();
     do {
         event = [ NSApp nextEventMatchingMask:NSAnyEventMask 
untilDate:distantPast
                         inMode: NSDefaultRunLoopMode dequeue:YES ];
         if (event != nil) {
+
             switch ([event type]) {
                 case NSKeyDown:
                     if(grab)
                     {
                         int keycode = cocoa_keycode_to_qemu([event keyCode]);
-                        
                         if (keycode & 0x80)
                             kbd_put_keycode(0xe0);
                         kbd_put_keycode(keycode & 0x7f);
@@ -279,21 +365,73 @@
                     }
                     break;
                 case NSScrollWheel:
-                
+                                       if(grab)
+                                       {
+                                               int dz = [event deltaZ];
+                                               kbd_mouse_event(0, 0, dz, 0);
+                                       }
+                                       break;
                 case NSLeftMouseDown:
+                                       if(grab)
+                                       {
+                                               int buttons = 0;
+                                               buttons |= MOUSE_EVENT_LBUTTON;
+                                               kbd_mouse_event(0, 0, 0, 
buttons);
+                                       } else {
+                                               grab = true;
+                                               [ window setTitle:@"Qemu - 
Press ctrl + alt to ungrab" ];
+                                   [NSCursor hide];
+                                               
CGAssociateMouseAndMouseCursorPosition ( FALSE );
+                                       }
+                                       break;
                 case NSLeftMouseUp:
-                
+                                       if(grab)
+                                       {
+                                               kbd_mouse_event(0, 0, 0, 0);
+                                       }
+                                       break;
                 case NSOtherMouseDown:
                 case NSRightMouseDown:
-                
+                                       if(grab)
+                                       {
+                                               int buttons = 0;
+                                               buttons |= MOUSE_EVENT_RBUTTON;
+                                               kbd_mouse_event(0, 0, 0, 
buttons);
+                                       }
+                                       break;
                 case NSOtherMouseUp:
                 case NSRightMouseUp:
+                                       if(grab)
+                                       {
+                                               kbd_mouse_event(0, 0, 0, 0);
+                                       }
+                                       break;
                 
                 case NSMouseMoved:
+                                       if(grab)
+                                       {
+                                               int dx, dy, dz, buttons;
+                                               dx = [event deltaX];
+                                               dy = [event deltaY];
+                                               dz = 0;
+                                               buttons = 0;
+                                               kbd_mouse_event(dx, dy, dz, 
buttons);
+                                       }
+                                       break;
                 case NSOtherMouseDragged:
                 case NSRightMouseDragged:
                 case NSLeftMouseDragged:
-                
+                                       if(grab)
+                                       {
+                                               int dx, dy, dz, buttons;
+                                               dx = [event deltaX];
+                                               dy = [event deltaY];
+                                               dz = 0;
+                                               buttons = 0;
+                                               buttons |= MOUSE_EVENT_LBUTTON;
+                                               kbd_mouse_event(dx, dy, dz, 
buttons);
+                                       }
+                                       break;
                 default: [NSApp sendEvent:event];
             }
         }
@@ -325,6 +463,7 @@
     
     cocoa_resize(ds, 640, 400);
     
+    
     atexit(cocoa_cleanup);
 }
 

reply via email to

[Prev in Thread] Current Thread [Next in Thread]