[Top][All Lists]
[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);
}
- [Qemu-devel] [PATCH] Experimental Cocoa Video Driver,
Mike Kronenberg <=
- Re: [Qemu-devel] [PATCH] Experimental Cocoa Video Driver, René Korthaus, 2005/04/10
- Re: [Qemu-devel] [PATCH] Experimental Cocoa Video Driver, Mike Kronenberg, 2005/04/10
- Re: [Qemu-devel] [PATCH] Experimental Cocoa Video Driver, René Korthaus, 2005/04/10
- Re: [Qemu-devel] [PATCH] Experimental Cocoa Video Driver, Mike Kronenberg, 2005/04/10
- [Qemu-devel] Cocoa Video Driver & mouse grabbing (was: [PATCH] Experimental Cocoa Video Driver), René Korthaus, 2005/04/10
- Re: [Qemu-devel] Cocoa Video Driver & mouse grabbing, Mike Kronenberg, 2005/04/10
- Re: [Qemu-devel] Cocoa Video Driver & mouse grabbing, Herbert Poetzl, 2005/04/10
- Re: [Qemu-devel] Cocoa Video Driver & mouse grabbing, Jim C. Brown, 2005/04/10
- Re: [Qemu-devel] Cocoa Video Driver & mouse grabbing, John R. Hogerhuis, 2005/04/10
- Re: [Qemu-devel] Cocoa Video Driver & mouse grabbing, Thomas Steffen, 2005/04/10