qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] Experimental Cocoa Video Driver - Mousesupport and Keymap


From: Mike Kronenberg
Subject: [Qemu-devel] Experimental Cocoa Video Driver - Mousesupport and Keymap
Date: Wed, 06 Apr 2005 21:34:02 +0200
User-agent: Mozilla Thunderbird 1.0.2 (Macintosh/20050317)

Hello

this patch provides initial Mouse- and better Keyboard support.
There are still alot of things to do.

known Bugs and Workarounds:

-  still no modifiers (help is apreciated)
-> no grab and ungrab (use alt-tab to switch)

- Mouseevents are only correcty passed, if the Cursor is within the qemu-Window, when it's activated (else the Mousedown/Mouseup are passed to the window, that was under the Cursor, when the qemu-Window is activated)

G Mike
--- /Users/mike/Documents/qemu/devel/qemu-snapshot-2005-04-05_23/cocoa.m        
Wed Mar  2 23:22:43 2005
+++ /Users/mike/Documents/qemu/devel/qemu-snapshot-2005-04-05_23_kberg/cocoa.m  
Wed Apr  6 20:57:56 2005
@@ -173,55 +173,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
 */
 };
 
@@ -235,6 +309,9 @@
     return keymap[keycode];
 }
 
+
+static uint8_t modifiers_state[256]; //Mike
+
 /*
  ------------------------------------------------------
     cocoa_refresh
@@ -253,16 +330,26 @@
     
     if (is_active_console(vga_console)) 
         vga_update_display();
+    
+//    [NSCursor hide];
+//    CGAssociateMouseAndMouseCursorPosition ( FALSE );
+    
     do {
         event = [ NSApp nextEventMatchingMask:NSAnyEventMask 
untilDate:distantPast
                         inMode: NSDefaultRunLoopMode dequeue:YES ];
         if (event != nil) {
-            switch ([event type]) {
+               /*
+               //workaround to force Mouse inside Window
+               CGPoint cGPoint1;
+               cGPoint1.x = 400;
+               cGPoint1.y = 400;
+               CGWarpMouseCursorPosition (cGPoint1);
+               */
+               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);
@@ -272,28 +359,74 @@
                     if(grab)
                     {
                         int keycode = cocoa_keycode_to_qemu([event keyCode]);
-
                         if (keycode & 0x80)
                             kbd_put_keycode(0xe0);
                         kbd_put_keycode(keycode | 0x80);
                     }
                     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);
+                       }
+                       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];
             }
         }
@@ -324,6 +457,9 @@
     ds->dpy_refresh = cocoa_refresh;
     
     cocoa_resize(ds, 640, 400);
+    
+    [NSCursor hide];
+    CGAssociateMouseAndMouseCursorPosition ( FALSE );
     
     atexit(cocoa_cleanup);
 }

reply via email to

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