From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1DKRe1-0004vK-Jy for qemu-devel@nongnu.org; Sat, 09 Apr 2005 21:53:49 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1DKRdu-0004rx-Kx for Qemu-devel@nongnu.org; Sat, 09 Apr 2005 21:53:45 -0400 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1DKRdu-0004rd-Bs for Qemu-devel@nongnu.org; Sat, 09 Apr 2005 21:53:42 -0400 Received: from [195.129.94.187] (helo=srv94-187.ip-tech.ch) by monty-python.gnu.org with esmtp (TLS-1.0:DHE_RSA_3DES_EDE_CBC_SHA:24) (Exim 4.34) id 1DKS66-0003JT-PK for Qemu-devel@nongnu.org; Sat, 09 Apr 2005 22:22:51 -0400 Message-ID: <42588DA6.4060106@kberg.ch> Date: Sun, 10 Apr 2005 04:21:26 +0200 From: Mike Kronenberg MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------070904030707060401010304" Subject: [Qemu-devel] [PATCH] Experimental Cocoa Video Driver Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Qemu-devel@nongnu.org This is a multi-part message in MIME format. --------------070904030707060401010304 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit 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 --------------070904030707060401010304 Content-Type: text/plain; x-mac-type="0"; x-mac-creator="0"; name="cocoa.m_20050410.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="cocoa.m_20050410.diff" 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, //'' - 0, //'' 0x34 - 0, //'' - 0, //'' + 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); } --------------070904030707060401010304--