[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 12/48] cocoa frontend changes
From: |
Andreas Färber |
Subject: |
Re: [Qemu-devel] [PATCH 12/48] cocoa frontend changes |
Date: |
Sat, 27 Mar 2010 14:28:26 +0100 |
Hello,
Am 26.03.2010 um 17:06 schrieb Riku Voipio:
> From: Juha Riihimäki <address@hidden>
>
> remove help menu, fix fullscreen mode mouse handling, add confirmation
> dialog to quit menu command, add support for undocumented alt-grab and
> ctrl-grab options, add qemu version printout in about panel.
> - fix build on os x versions prior to 10.6
> - cocoa window handling fixes
> - show shutting down status in window caption
> - add display close handler support
> - add support for multitouch in cocoa frontend
> - cocoa keymap changes
I would appreciate if you could untangle these for review by splitting this
patch up.
Last time I built on 10.5/ppc there were no build issues in Cocoa, for instance.
Further comment inline.
>
> Signed-Off-By: Riku Voipio <address@hidden>
> Signed-off-by: Juha Riihimäki <address@hidden>
> ---
> cocoa.m | 313 +++++++++++++++++++++++++++++++++++++++++++-------------------
> 1 files changed, 217 insertions(+), 96 deletions(-)
>
> diff --git a/cocoa.m b/cocoa.m
> index 56c789a..524617f 100644
> --- a/cocoa.m
> +++ b/cocoa.m
> @@ -47,10 +47,25 @@
> #define cgrect(nsrect) (*(CGRect *)&(nsrect))
> #define COCOA_MOUSE_EVENT \
Since this macro is growing large, could you consider turning it into a static
inline function please?
Regards,
Andreas
> if (isTabletEnabled) { \
> - kbd_mouse_event((int)(p.x * 0x7FFF / (screen.width - 1)),
> (int)((screen.height - p.y) * 0x7FFF / (screen.height - 1)), 0, buttons); \
> + if (isFullscreen) { \
> + NSSize fs = [[NSScreen mainScreen] frame].size; \
> + kbd_mouse_event((int)(p.x * 0x7FFF / (fs.width - 1)), \
> + (int)((fs.height - p.y) * 0x7FFF /
> (fs.height - 1)), \
> + 0, buttons); \
> + } else { \
> + kbd_mouse_event((int)(p.x * 0x7FFF / (screen.width - 1)), \
> + (int)((screen.height - p.y) * 0x7FFF /
> (screen.height - 1)), \
> + 0, buttons); \
> + } \
> } else if (isMouseGrabed) { \
> kbd_mouse_event((int)[event deltaX], (int)[event deltaY], 0,
> buttons); \
> } else { \
> + if (isFullscreen) { \
> + NSSize fs = [[NSScreen mainScreen] frame].size; \
> + kbd_mouse_event((int)(p.x * 0x7FFF / (fs.width - 1)), \
> + (int)((fs.height - p.y) * 0x7FFF /
> (fs.height - 1)), \
> + 0, buttons); \
> + } \
> [NSApp sendEvent:event]; \
> }
>
> @@ -65,6 +80,7 @@ int qemu_main(int argc, char **argv); // main defined in
> qemu/vl.c
> NSWindow *normalWindow;
> id cocoaView;
> static DisplayChangeListener *dcl;
> +static int last_vm_running;
>
> int gArgc;
> char **gArgv;
> @@ -83,7 +99,7 @@ int keymap[] =
> 45, // 7 0x07 0x2d X QZ_x
> 46, // 8 0x08 0x2e C QZ_c
> 47, // 9 0x09 0x2f V QZ_v
> - 0, // 10 0x0A Undefined
> + 0, // 10 0x0A Undefined (paragraph)
> 48, // 11 0x0B 0x30 B QZ_b
> 16, // 12 0x0C 0x10 Q QZ_q
> 17, // 13 0x0D 0x11 W QZ_w
> @@ -127,8 +143,8 @@ int keymap[] =
> 14, // 51 0x33 0x0e BKSP QZ_BACKSPACE
> 0, // 52 0x34 Undefined
> 1, // 53 0x35 0x01 ESC QZ_ESCAPE
> - 0, // 54 0x36 QZ_RMETA
> - 0, // 55 0x37 QZ_LMETA
> + 220,// 54 0xdc e0,5c R GUI QZ_RMETA
> + 219,// 55 0xdb e0,5b L GUI QZ_LMETA
> 42, // 56 0x38 0x2a L SHFT QZ_LSHIFT
> 58, // 57 0x39 0x3a CAPS QZ_CAPSLOCK
> 56, // 58 0x3A 0x38 L ALT QZ_LALT
> @@ -136,9 +152,9 @@ int keymap[] =
> 54, // 60 0x3C 0x36 R SHFT QZ_RSHIFT
> 184,// 61 0x3D 0xb8 E0,38 R ALT QZ_RALT
> 157,// 62 0x3E 0x9d E0,1D R CTRL QZ_RCTRL
> - 0, // 63 0x3F Undefined
> - 0, // 64 0x40 Undefined
> - 0, // 65 0x41 Undefined
> + 0, // 63 0x3F Undefined (fn)
> + 0, // 64 0x40 Undefined (f17)
> + 83, // 65 0x53 0x53 KP .
> 0, // 66 0x42 Undefined
> 55, // 67 0x43 0x37 KP * QZ_KP_MULTIPLY
> 0, // 68 0x44 Undefined
> @@ -152,9 +168,9 @@ int keymap[] =
> 152,// 76 0x4C 0x9c E0,1C KP EN QZ_KP_ENTER
> 0, // 77 0x4D undefined
> 74, // 78 0x4E 0x4a KP - QZ_KP_MINUS
> - 0, // 79 0x4F Undefined
> - 0, // 80 0x50 Undefined
> - 0, // 81 0x51 QZ_KP_EQUALS
> + 0, // 79 0x4F Undefined (f18)
> + 0, // 80 0x50 Undefined (f19)
> + 0, // 81 0x51 (kp =) QZ_KP_EQUALS
> 82, // 82 0x52 0x52 KP 0 QZ_KP0
> 79, // 83 0x53 0x4f KP 1 QZ_KP1
> 80, // 84 0x54 0x50 KP 2 QZ_KP2
> @@ -178,15 +194,15 @@ int keymap[] =
> 0, // 102 0x66 Undefined
> 87, // 103 0x67 0x57 F11 QZ_F11
> 0, // 104 0x68 Undefined
> - 183,// 105 0x69 0xb7 QZ_PRINT
> + 183,// 105 0x69 0xb7 (f13) QZ_PRINT
> 0, // 106 0x6A Undefined
> - 70, // 107 0x6B 0x46 SCROLL QZ_SCROLLOCK
> + 70, // 107 0x6B 0x46 SCROLL(f14) QZ_SCROLLOCK
> 0, // 108 0x6C Undefined
> 68, // 109 0x6D 0x44 F10 QZ_F10
> 0, // 110 0x6E Undefined
> 88, // 111 0x6F 0x58 F12 QZ_F12
> 0, // 112 0x70 Undefined
> - 110,// 113 0x71 0x0 QZ_PAUSE
> + 110,// 113 0x71 0x0 (f15) QZ_PAUSE
> 210,// 114 0x72 0xd2 E0,52 INSERT QZ_INSERT
> 199,// 115 0x73 0xc7 E0,47 HOME QZ_HOME
> 201,// 116 0x74 0xc9 E0,49 PG UP QZ_PAGEUP
> @@ -204,12 +220,9 @@ int keymap[] =
>
> /* Aditional 104 Key XP-Keyboard Scancodes from
> http://www.computer-engineering.org/ps2keyboard/scancodes1.html */
> /*
> - 219 // 0xdb e0,5b L GUI
> - 220 // 0xdc e0,5c R GUI
> 221 // 0xdd e0,5d APPS
> // E0,2A,E0,37 PRNT SCRN
> // E1,1D,45,E1,9D,C5 PAUSE
> - 83 // 0x53 0x53 KP .
> // ACPI Scan Codes
> 222 // 0xde E0, 5E Power
> 223 // 0xdf E0, 5F Sleep
> @@ -259,23 +272,29 @@ static int cocoa_keycode_to_qemu(int keycode)
> NSWindow *fullScreenWindow;
> float cx,cy,cw,ch,cdx,cdy;
> CGDataProviderRef dataProviderRef;
> + void *dataRawPtr;
> + int mouseX, mouseY;
> int modifiers_state[256];
> BOOL isMouseGrabed;
> BOOL isFullscreen;
> BOOL isAbsoluteEnabled;
> BOOL isTabletEnabled;
> + BOOL isShuttingDownGuest;
> }
> - (void) resizeContentToWidth:(int)w height:(int)h displayState:(DisplayState
> *)ds;
> - (void) grabMouse;
> - (void) ungrabMouse;
> - (void) toggleFullScreen:(id)sender;
> -- (void) handleEvent:(NSEvent *)event;
> +- (void) qemuHandleEvent:(NSEvent *)event;
> - (void) setAbsoluteEnabled:(BOOL)tIsAbsoluteEnabled;
> +- (void) setShuttingDownGuest;
> - (BOOL) isMouseGrabed;
> - (BOOL) isAbsoluteEnabled;
> - (float) cdx;
> - (float) cdy;
> - (QEMUScreen) gscreen;
> +- (void) updateCaption;
> +- (void) checkAndDisplayAltCursor;
> @end
>
> @implementation QemuCocoaView
> @@ -310,6 +329,34 @@ static int cocoa_keycode_to_qemu(int keycode)
> return YES;
> }
>
> +- (void) checkAndDisplayAltCursor
> +{
> + if (multitouch_enabled && !isMouseGrabed && !cursor_hide &&
> + dataRawPtr && modifiers_state[56]) {
> + unsigned char *p = (unsigned char *)dataRawPtr;
> + int altX = screen.width - mouseX;
> + int altY = mouseY;
> + int x, y;
> + int bytesperpixel = screen.bitsPerPixel / 8;
> + p += (altY * screen.width) * bytesperpixel;
> + for (y = 0; y < 8; y++) {
> + if (y + altY > 0 && y + altY < screen.height) {
> + unsigned char *q = p + altX * bytesperpixel;
> + for (x = 0; x < 8; x++) {
> + if (x + altX > 0 && x + altX < screen.width) {
> + int i;
> + for (i = 0; i < bytesperpixel; i++) {
> + q[i] ^= 0xff;
> + }
> + }
> + q += bytesperpixel;
> + }
> + }
> + p += screen.width * bytesperpixel;
> + }
> + }
> +}
> +
> - (void) drawRect:(NSRect) rect
> {
> COCOA_DEBUG("QemuCocoaView: drawRect\n");
> @@ -321,6 +368,7 @@ static int cocoa_keycode_to_qemu(int keycode)
>
> // draw screen bitmap directly to Core Graphics context
> if (dataProviderRef) {
> + [self checkAndDisplayAltCursor];
> CGImageRef imageRef = CGImageCreate(
> screen.width, //width
> screen.height, //height
> @@ -360,10 +408,10 @@ static int cocoa_keycode_to_qemu(int keycode)
>
> [self getRectsBeingDrawn:&rectList count:&rectCount];
> for (i = 0; i < rectCount; i++) {
> - clipRect.origin.x = rectList[i].origin.x / cdx;
> - clipRect.origin.y = (float)screen.height -
> (rectList[i].origin.y + rectList[i].size.height) / cdy;
> - clipRect.size.width = rectList[i].size.width / cdx;
> - clipRect.size.height = rectList[i].size.height / cdy;
> + clipRect.origin.x = floorf(rectList[i].origin.x / cdx);
> + clipRect.origin.y = floorf((float)screen.height -
> (rectList[i].origin.y + rectList[i].size.height) / cdy);
> + clipRect.size.width = ceilf(rectList[i].size.width / cdx);
> + clipRect.size.height = ceilf(rectList[i].size.height / cdy);
> clipImageRef = CGImageCreateWithImageInRect(
> imageRef,
> clipRect
> @@ -410,6 +458,7 @@ static int cocoa_keycode_to_qemu(int keycode)
> screen.bitsPerPixel = ds_get_bits_per_pixel(ds);
> screen.bitsPerComponent = ds_get_bytes_per_pixel(ds) * 2;
>
> + dataRawPtr = is_graphic_console() ? ds_get_data(ds) : 0;
> dataProviderRef = CGDataProviderCreateWithData(NULL, ds_get_data(ds), w *
> 4 * h, NULL);
>
> // update windows
> @@ -417,10 +466,9 @@ static int cocoa_keycode_to_qemu(int keycode)
> [[fullScreenWindow contentView] setFrame:[[NSScreen mainScreen]
> frame]];
> [normalWindow setFrame:NSMakeRect([normalWindow frame].origin.x,
> [normalWindow frame].origin.y - h + screen.height, w, h + [normalWindow
> frame].size.height - screen.height) display:NO animate:NO];
> } else {
> - if (qemu_name)
> - [normalWindow setTitle:[NSString stringWithFormat:@"QEMU %s",
> qemu_name]];
> [normalWindow setFrame:NSMakeRect([normalWindow frame].origin.x,
> [normalWindow frame].origin.y - h + screen.height, w, h + [normalWindow
> frame].size.height - screen.height) display:YES animate:NO];
> }
> + [self updateCaption];
> screen.width = w;
> screen.height = h;
> [normalWindow center];
> @@ -434,7 +482,7 @@ static int cocoa_keycode_to_qemu(int keycode)
>
> if (isFullscreen) { // switch from fullscreen to desktop
> isFullscreen = FALSE;
> - [self ungrabMouse];
> + if (isMouseGrabed) [self ungrabMouse];
> [self setContentDimensions];
> // test if host supports "exitFullScreenModeWithOptions" at compile time
> #if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5)
> @@ -444,29 +492,33 @@ static int cocoa_keycode_to_qemu(int keycode)
> #endif
> [fullScreenWindow close];
> [normalWindow setContentView: self];
> - [normalWindow makeKeyAndOrderFront: self];
> [NSMenu setMenuBarVisible:YES];
> #if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5)
> }
> #endif
> + [normalWindow makeKeyAndOrderFront:self];
> } else { // switch from desktop to fullscreen
> isFullscreen = TRUE;
> - [self grabMouse];
> + if (cursor_allow_grab) [self grabMouse];
> [self setContentDimensions];
> + [normalWindow orderOut:self];
> // test if host supports "enterFullScreenMode:withOptions" at compile time
> #if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5)
> if ([NSView
> respondsToSelector:@selector(enterFullScreenMode:withOptions:)]) { // test if
> "enterFullScreenMode:withOptions" is supported on host at runtime
> - [self enterFullScreenMode:[NSScreen mainScreen]
> withOptions:[NSDictionary dictionaryWithObjectsAndKeys:
> - [NSNumber numberWithBool:NO], NSFullScreenModeAllScreens,
> - [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber
> numberWithBool:NO], kCGDisplayModeIsStretched, nil], NSFullScreenModeSetting,
> - nil]];
> + [self enterFullScreenMode:[NSScreen mainScreen]
> + withOptions:[NSDictionary
> dictionaryWithObjectsAndKeys:
> + [NSNumber numberWithBool:NO],
> NSFullScreenModeAllScreens,
> + [NSDictionary
> dictionaryWithObjectsAndKeys:
> + [NSNumber numberWithBool:NO],
> kCGDisplayModeIsStretched,
> + nil], NSFullScreenModeSetting,
> + nil]];
> } else {
> #endif
> [NSMenu setMenuBarVisible:NO];
> fullScreenWindow = [[NSWindow alloc]
> initWithContentRect:[[NSScreen mainScreen] frame]
> - styleMask:NSBorderlessWindowMask
> - backing:NSBackingStoreBuffered
> - defer:NO];
> +
> styleMask:NSBorderlessWindowMask
> +
> backing:NSBackingStoreBuffered
> + defer:NO];
> [fullScreenWindow setHasShadow:NO];
> [fullScreenWindow setContentView:self];
> [fullScreenWindow makeKeyAndOrderFront:self];
> @@ -476,7 +528,7 @@ static int cocoa_keycode_to_qemu(int keycode)
> }
> }
>
> -- (void) handleEvent:(NSEvent *)event
> +- (void) qemuHandleEvent:(NSEvent *)event
> {
> COCOA_DEBUG("QemuCocoaView: handleEvent\n");
>
> @@ -505,8 +557,13 @@ static int cocoa_keycode_to_qemu(int keycode)
> }
>
> // release Mouse grab when pressing ctrl+alt
> - if (!isFullscreen && ([event modifierFlags] & NSControlKeyMask)
> && ([event modifierFlags] & NSAlternateKeyMask)) {
> - [self ungrabMouse];
> + if (!isFullscreen) {
> + if ((ctrl_grab && [event keyCode] == 0x3e)
> + || ((([event modifierFlags] & NSControlKeyMask) &&
> + ([event modifierFlags] & NSAlternateKeyMask))
> + && (!alt_grab || ([event modifierFlags] &
> NSShiftKeyMask)))) {
> + [self ungrabMouse];
> + }
> }
> break;
> case NSKeyDown:
> @@ -581,15 +638,17 @@ static int cocoa_keycode_to_qemu(int keycode)
> }
> break;
> case NSMouseMoved:
> + mouseX = p.x;
> + mouseY = p.y;
> if (isAbsoluteEnabled) {
> if (p.x < 0 || p.x > screen.width || p.y < 0 || p.y >
> screen.height || ![[self window] isKeyWindow]) {
> if (isTabletEnabled) { // if we leave the window,
> deactivate the tablet
> - [NSCursor unhide];
> + if (cursor_hide) [NSCursor unhide];
> isTabletEnabled = FALSE;
> }
> } else {
> if (!isTabletEnabled) { // if we enter the window,
> activate the tablet
> - [NSCursor hide];
> + if (cursor_hide) [NSCursor hide];
> isTabletEnabled = TRUE;
> }
> }
> @@ -602,6 +661,9 @@ static int cocoa_keycode_to_qemu(int keycode)
> } else {
> buttons |= MOUSE_EVENT_LBUTTON;
> }
> + if ([event modifierFlags] & NSAlternateKeyMask) {
> + buttons |= MOUSE_EVENT_MBUTTON << 1;
> + }
> COCOA_MOUSE_EVENT
> break;
> case NSRightMouseDown:
> @@ -613,11 +675,16 @@ static int cocoa_keycode_to_qemu(int keycode)
> COCOA_MOUSE_EVENT
> break;
> case NSLeftMouseDragged:
> + mouseX = p.x;
> + mouseY = p.y;
> if ([event modifierFlags] & NSCommandKeyMask) {
> buttons |= MOUSE_EVENT_RBUTTON;
> } else {
> buttons |= MOUSE_EVENT_LBUTTON;
> }
> + if ([event modifierFlags] & NSAlternateKeyMask) {
> + buttons |= MOUSE_EVENT_MBUTTON << 1;
> + }
> COCOA_MOUSE_EVENT
> break;
> case NSRightMouseDragged:
> @@ -633,7 +700,7 @@ static int cocoa_keycode_to_qemu(int keycode)
> COCOA_MOUSE_EVENT
> } else if (!isMouseGrabed) {
> if (p.x > -1 && p.x < screen.width && p.y > -1 && p.y <
> screen.height) {
> - [self grabMouse];
> + if (cursor_allow_grab) [self grabMouse];
> } else {
> [NSApp sendEvent:event];
> }
> @@ -654,6 +721,25 @@ static int cocoa_keycode_to_qemu(int keycode)
> [NSApp sendEvent:event];
> }
> break;
> + case NSAppKitDefined:
> + switch ([event subtype]) {
> + case NSApplicationActivatedEventType:
> + if (dcl) {
> + dcl->gui_timer_interval = 0;
> + dcl->idle = 0;
> + }
> + break;
> + case NSApplicationDeactivatedEventType:
> + if (dcl) {
> + dcl->gui_timer_interval = 500;
> + dcl->idle = 1;
> + }
> + break;
> + default:
> + break;
> + }
> + [NSApp sendEvent:event];
> + break;
> default:
> [NSApp sendEvent:event];
> }
> @@ -662,34 +748,48 @@ static int cocoa_keycode_to_qemu(int keycode)
> - (void) grabMouse
> {
> COCOA_DEBUG("QemuCocoaView: grabMouse\n");
> -
> - if (!isFullscreen) {
> - if (qemu_name)
> - [normalWindow setTitle:[NSString stringWithFormat:@"QEMU %s -
> (Press ctrl + alt to release Mouse)", qemu_name]];
> - else
> - [normalWindow setTitle:@"QEMU - (Press ctrl + alt to release
> Mouse)"];
> - }
> - [NSCursor hide];
> + if (cursor_hide) [NSCursor hide];
> CGAssociateMouseAndMouseCursorPosition(FALSE);
> isMouseGrabed = TRUE; // while isMouseGrabed = TRUE, QemuCocoaApp sends
> all events to [cocoaView handleEvent:]
> + [self updateCaption];
> }
>
> - (void) ungrabMouse
> {
> COCOA_DEBUG("QemuCocoaView: ungrabMouse\n");
>
> - if (!isFullscreen) {
> - if (qemu_name)
> - [normalWindow setTitle:[NSString stringWithFormat:@"QEMU %s",
> qemu_name]];
> - else
> - [normalWindow setTitle:@"QEMU"];
> - }
> - [NSCursor unhide];
> + if (cursor_hide) [NSCursor unhide];
> CGAssociateMouseAndMouseCursorPosition(TRUE);
> isMouseGrabed = FALSE;
> + [self updateCaption];
> +}
> +
> +- (void) updateCaption
> +{
> + NSMutableString *caption = [NSMutableString stringWithCapacity:10];
> + [caption appendFormat:@"QEMU"];
> + if (isShuttingDownGuest) {
> + [caption appendString:@" [Shutting down]"];
> + }
> + if (qemu_name) {
> + [caption appendFormat:@" (%s)", qemu_name];
> + }
> + if (!vm_running) {
> + [caption appendString:@" [Stopped]"];
> + } else if (isMouseGrabed) {
> + if (ctrl_grab) {
> + [caption appendString:@" - Press Right-Ctrl to release mouse"];
> + } else if (alt_grab) {
> + [caption appendString:@" - Press Ctrl-Alt-Shift to release
> mouse"];
> + } else {
> + [caption appendString:@" - Press Ctrl-Alt to release mouse"];
> + }
> + }
> + [normalWindow setTitle:caption];
> }
>
> - (void) setAbsoluteEnabled:(BOOL)tIsAbsoluteEnabled {isAbsoluteEnabled =
> tIsAbsoluteEnabled;}
> +- (void) setShuttingDownGuest { isShuttingDownGuest = YES; [self
> updateCaption]; }
> - (BOOL) isMouseGrabed {return isMouseGrabed;}
> - (BOOL) isAbsoluteEnabled {return isAbsoluteEnabled;}
> - (float) cdx {return cdx;}
> @@ -704,14 +804,16 @@ static int cocoa_keycode_to_qemu(int keycode)
> QemuCocoaAppController
> ------------------------------------------------------
> */
> +#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6)
> address@hidden QemuCocoaAppController : NSObject <NSWindowDelegate>
> +#else
> @interface QemuCocoaAppController : NSObject
> +#endif
> {
> }
> - (void)startEmulationWithArgc:(int)argc argv:(char**)argv;
> - (void)openPanelDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode
> contextInfo:(void *)contextInfo;
> - (void)toggleFullScreen:(id)sender;
> -- (void)showQEMUDoc:(id)sender;
> -- (void)showQEMUTec:(id)sender;
> @end
>
> @implementation QemuCocoaAppController
> @@ -743,7 +845,8 @@ static int cocoa_keycode_to_qemu(int keycode)
> [normalWindow useOptimizedDrawing:YES];
> [normalWindow makeKeyAndOrderFront:self];
> [normalWindow center];
> -
> + [normalWindow setDelegate:self];
> + [cocoaView updateCaption];
> }
> return self;
> }
> @@ -781,7 +884,6 @@ static int cocoa_keycode_to_qemu(int keycode)
> COCOA_DEBUG("QemuCocoaAppController: applicationWillTerminate\n");
>
> qemu_system_shutdown_request();
> - exit(0);
> }
>
> - (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication
> *)theApplication
> @@ -819,6 +921,7 @@ static int cocoa_keycode_to_qemu(int keycode)
> [self startEmulationWithArgc:3 argv:(char**)argv];
> }
> }
> +
> - (void)toggleFullScreen:(id)sender
> {
> COCOA_DEBUG("QemuCocoaAppController: toggleFullScreen\n");
> @@ -826,41 +929,57 @@ static int cocoa_keycode_to_qemu(int keycode)
> [cocoaView toggleFullScreen:sender];
> }
>
> -- (void)showQEMUDoc:(id)sender
> +- (BOOL)windowShouldClose:(id)sender
> {
> - COCOA_DEBUG("QemuCocoaAppController: showQEMUDoc\n");
> -
> - [[NSWorkspace sharedWorkspace] openFile:[NSString
> stringWithFormat:@"%@/../doc/qemu/qemu-doc.html",
> - [[NSBundle mainBundle] resourcePath]] withApplication:@"Help
> Viewer"];
> + if (!no_quit) {
> + if (qemu_run_display_close_handler()) {
> + return YES;
> + }
> + [cocoaView setShuttingDownGuest];
> + }
> + return NO;
> }
>
> -- (void)showQEMUTec:(id)sender
> +- (void)confirmQuit:(id)sender
> {
> - COCOA_DEBUG("QemuCocoaAppController: showQEMUTec\n");
> + NSAlert *alert = [NSAlert alertWithMessageText:@"Are you sure you want
> to quit QEMU?"
> + defaultButton:@"No"
> + alternateButton:@"Yes"
> + otherButton:@"Shutdown"
> + informativeTextWithFormat:@"If you quit QEMU
> without shutting down the emulated machine properly you risk losing data and
> possibly corrupting the virtual machine contents."];
> + [alert setAlertStyle:NSCriticalAlertStyle];
> + switch ([alert runModal]) {
> + case NSAlertDefaultReturn:
> + /* do nothing */
> + break;
> + case NSAlertAlternateReturn:
> + [NSApp terminate:sender];
> + break;
> + case NSAlertOtherReturn:
> + if (qemu_run_display_close_handler()) {
> + qemu_system_shutdown_request();
> + } else {
> + [cocoaView setShuttingDownGuest];
> + }
> + break;
> + default:
> + break;
> + }
> +}
>
> - [[NSWorkspace sharedWorkspace] openFile:[NSString
> stringWithFormat:@"%@/../doc/qemu/qemu-tech.html",
> - [[NSBundle mainBundle] resourcePath]] withApplication:@"Help
> Viewer"];
> +- (void)aboutQEMU:(id)sender
> +{
> + [NSApp orderFrontStandardAboutPanelWithOptions:[NSDictionary
> dictionaryWithObjectsAndKeys:
> + @ QEMU_VERSION
> QEMU_PKGVERSION, @"ApplicationVersion",
> + nil]];
> }
> @end
>
>
> -
> -// Dock Connection
> -typedef struct CPSProcessSerNum
> +int main (int argc, const char * argv[])
> {
> - UInt32 lo;
> - UInt32 hi;
> -} CPSProcessSerNum;
> -
> -extern OSErr CPSGetCurrentProcess( CPSProcessSerNum *psn);
> -extern OSErr CPSEnableForegroundOperation( CPSProcessSerNum *psn, UInt32
> _arg2, UInt32 _arg3, UInt32 _arg4, UInt32 _arg5);
> -extern OSErr CPSSetFrontProcess( CPSProcessSerNum *psn);
> -
> -int main (int argc, const char * argv[]) {
> -
> gArgc = argc;
> gArgv = (char **)argv;
> - CPSProcessSerNum PSN;
> int i;
>
> /* In case we don't need to display a window, let's not do that */
> @@ -875,10 +994,11 @@ int main (int argc, const char * argv[]) {
> NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
> [NSApplication sharedApplication];
>
> - if (!CPSGetCurrentProcess(&PSN))
> - if (!CPSEnableForegroundOperation(&PSN,0x03,0x3C,0x2C,0x1103))
> - if (!CPSSetFrontProcess(&PSN))
> - [NSApplication sharedApplication];
> + ProcessSerialNumber PSN;
> + if (!GetCurrentProcess(&PSN) &&
> + !TransformProcessType(&PSN,
> kProcessTransformToForegroundApplication) &&
> + !SetFrontProcess(&PSN))
> + [NSApplication sharedApplication];
>
> // Add menus
> NSMenu *menu;
> @@ -888,14 +1008,14 @@ int main (int argc, const char * argv[]) {
>
> // Application menu
> menu = [[NSMenu alloc] initWithTitle:@""];
> - [menu addItemWithTitle:@"About QEMU"
> action:@selector(orderFrontStandardAboutPanel:) keyEquivalent:@""]; // About
> QEMU
> + [menu addItemWithTitle:@"About QEMU" action:@selector(aboutQEMU:)
> keyEquivalent:@""]; // About QEMU
> [menu addItem:[NSMenuItem separatorItem]]; //Separator
> [menu addItemWithTitle:@"Hide QEMU" action:@selector(hide:)
> keyEquivalent:@"h"]; //Hide QEMU
> menuItem = (NSMenuItem *)[menu addItemWithTitle:@"Hide Others"
> action:@selector(hideOtherApplications:) keyEquivalent:@"h"]; // Hide Others
> [menuItem
> setKeyEquivalentModifierMask:(NSAlternateKeyMask|NSCommandKeyMask)];
> [menu addItemWithTitle:@"Show All"
> action:@selector(unhideAllApplications:) keyEquivalent:@""]; // Show All
> [menu addItem:[NSMenuItem separatorItem]]; //Separator
> - [menu addItemWithTitle:@"Quit QEMU" action:@selector(terminate:)
> keyEquivalent:@"q"];
> + [menu addItemWithTitle:@"Quit QEMU" action:@selector(confirmQuit:)
> keyEquivalent:@"q"];
> menuItem = [[NSMenuItem alloc] initWithTitle:@"Apple" action:nil
> keyEquivalent:@""];
> [menuItem setSubmenu:menu];
> [[NSApp mainMenu] addItem:menuItem];
> @@ -916,14 +1036,6 @@ int main (int argc, const char * argv[]) {
> [[NSApp mainMenu] addItem:menuItem];
> [NSApp setWindowsMenu:menu];
>
> - // Help menu
> - menu = [[NSMenu alloc] initWithTitle:@"Help"];
> - [menu addItem: [[[NSMenuItem alloc] initWithTitle:@"QEMU Documentation"
> action:@selector(showQEMUDoc:) keyEquivalent:@"?"] autorelease]]; // QEMU Help
> - [menu addItem: [[[NSMenuItem alloc] initWithTitle:@"QEMU Technology"
> action:@selector(showQEMUTec:) keyEquivalent:@""] autorelease]]; // QEMU Help
> - menuItem = [[[NSMenuItem alloc] initWithTitle:@"Window" action:nil
> keyEquivalent:@""] autorelease];
> - [menuItem setSubmenu:menu];
> - [[NSApp mainMenu] addItem:menuItem];
> -
> // Create an Application controller
> QemuCocoaAppController *appController = [[QemuCocoaAppController alloc]
> init];
> [NSApp setDelegate:appController];
> @@ -968,6 +1080,11 @@ static void cocoa_refresh(DisplayState *ds)
> {
> COCOA_DEBUG("qemu_cocoa: cocoa_refresh\n");
>
> + if (last_vm_running != vm_running) {
> + last_vm_running = vm_running;
> + [cocoaView updateCaption];
> + }
> +
> if (kbd_mouse_is_absolute()) {
> if (![cocoaView isAbsoluteEnabled]) {
> if ([cocoaView isMouseGrabed]) {
> @@ -984,7 +1101,7 @@ static void cocoa_refresh(DisplayState *ds)
> event = [NSApp nextEventMatchingMask:NSAnyEventMask
> untilDate:distantPast
> inMode: NSDefaultRunLoopMode dequeue:YES];
> if (event != nil) {
> - [cocoaView handleEvent:event];
> + [cocoaView qemuHandleEvent:event];
> }
> } while(event != nil);
> vga_hw_update();
> @@ -1012,3 +1129,7 @@ void cocoa_display_init(DisplayState *ds, int
> full_screen)
> // register cleanup function
> atexit(cocoa_cleanup);
> }
> +
> +#ifdef CONFIG_GLHW
> +#include "hw/gl/opengl_host_cocoa.m"
> +#endif
> --
> 1.6.5
>
>
>
- [Qemu-devel] [PATCH 09/48] console change headers, (continued)
- [Qemu-devel] [PATCH 09/48] console change headers, Riku Voipio, 2010/03/26
- [Qemu-devel] [PATCH 48/48] usb: fix -usbdevice option handling with no parameters, Riku Voipio, 2010/03/26
- [Qemu-devel] [PATCH 46/48] target-arm: fix neon vrsqrts instruction, Riku Voipio, 2010/03/26
- [Qemu-devel] [PATCH 45/48] target-arm: fix neon vcvt fixed-point, Riku Voipio, 2010/03/26
- [Qemu-devel] [PATCH 43/48] target-arm: fix neon vq(r)dmulh.s16 instructions, Riku Voipio, 2010/03/26
- [Qemu-devel] [PATCH 42/48] target-arm: fix signed narrow 64->32 operation, Riku Voipio, 2010/03/26
- [Qemu-devel] [PATCH 41/48] target-arm: fix neon vld1 single element to all lanes, Riku Voipio, 2010/03/26
- [Qemu-devel] [PATCH 35/48] target-arm: fix neon vmon/vmvn with modified immediate, Riku Voipio, 2010/03/26
- [Qemu-devel] [PATCH 32/48] Add beagleboard and n900 machine definitions, Riku Voipio, 2010/03/26
- [Qemu-devel] [PATCH 12/48] cocoa frontend changes, Riku Voipio, 2010/03/26
- Re: [Qemu-devel] [PATCH 12/48] cocoa frontend changes,
Andreas Färber <=
- [Qemu-devel] [PATCH 22/48] License update, Riku Voipio, 2010/03/26
- [Qemu-devel] [PATCH 44/48] target-arm: fix neon v(q)(r)shrn instructions, Riku Voipio, 2010/03/26
- [Qemu-devel] [PATCH 21/48] NAND emulation overhaul, Riku Voipio, 2010/03/26
- [Qemu-devel] [PATCH 04/48] audio: fix integer overflow expression, Riku Voipio, 2010/03/26
- [Qemu-devel] [PATCH 33/48] Add OpenGL ES accelerator support, Riku Voipio, 2010/03/26
- [Qemu-devel] [PATCH 34/48] target-arm: add support for smc, Riku Voipio, 2010/03/26
- [Qemu-devel] [PATCH 30/48] savevm and reset support for soc_dma, Riku Voipio, 2010/03/26
- [Qemu-devel] [PATCH 29/48] Add triton2 (twl4030) driver, Riku Voipio, 2010/03/26
- [Qemu-devel] [PATCH 20/48] add reset support for musb, Riku Voipio, 2010/03/26