[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH] Cocoa front-end
From: |
C . W . Betts |
Subject: |
[Qemu-devel] [PATCH] Cocoa front-end |
Date: |
Fri, 27 Feb 2009 22:08:03 -0700 |
The following patch makes the cocoa front-end work with the changes
that were made with the DisplayState. It also fixes a minor typo.
Credit goes to someone else for most of the patch (I don't want to
look through old mail to find out)
Index: cocoa.m
===================================================================
--- cocoa.m (revision 6645)
+++ cocoa.m (working copy)
@@ -57,7 +57,7 @@
int qemu_main(int argc, char **argv); // main defined in qemu/vl.c
NSWindow *normalWindow;
id cocoaView;
-static void *screenBuffer;
+static DisplayChangeListener *dcl;
int gArgc;
char **gArgv;
@@ -233,7 +233,7 @@
{
if((sizeof(keymap)/sizeof(int)) <= keycode)
{
- printf("(cocoa) warning unknow keycode 0x%x\n", keycode);
+ printf("(cocoa) warning unknown keycode 0x%x\n", keycode);
return 0;
}
return keymap[keycode];
@@ -292,9 +292,6 @@
{
COCOA_DEBUG("QemuCocoaView: dealloc\n");
- if (screenBuffer)
- free(screenBuffer);
-
if (dataProviderRef)
CGDataProviderRelease(dataProviderRef);
@@ -305,9 +302,6 @@
{
COCOA_DEBUG("QemuCocoaView: drawRect\n");
- if ((int)screenBuffer == -1)
- return;
-
// get CoreGraphic context
CGContextRef viewContextRef = [[NSGraphicsContext
currentContext] graphicsPort];
CGContextSetInterpolationQuality (viewContextRef,
kCGInterpolationNone);
@@ -320,10 +314,10 @@
screen.height, //height
screen.bitsPerComponent, //bitsPerComponent
screen.bitsPerPixel, //bitsPerPixel
- (screen.width * 4), //bytesPerRow
-#if __LITTLE_ENDIAN__
+ (screen.width * (screen.bitsPerComponent/2)), //bytesPerRow
+#ifdef __LITTLE_ENDIAN__
CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB), //
colorspace for OS X >= 10.4
- kCGImageAlphaNoneSkipLast,
+ kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipFirst,
#else
CGColorSpaceCreateDeviceRGB(), //colorspace for OS X <
10.4 (actually ppc)
kCGImageAlphaNoneSkipFirst, //bitmapInfo
@@ -334,12 +328,12 @@
kCGRenderingIntentDefault //intent
);
// test if host support "CGImageCreateWithImageInRect" at compiletime
-#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4)
+#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5)
if (CGImageCreateWithImageInRect == NULL) { // test if
"CGImageCreateWithImageInRect" is supported on host at runtime
#endif
// compatibility drawing code (draws everything) (OS X <
10.4)
CGContextDrawImage (viewContextRef, CGRectMake(0, 0,
[self bounds].size.width, [self bounds].size.height), imageRef);
-#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4)
+#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5)
} else {
// selective drawing code (draws only dirty rectangles)
(OS X >= 10.4)
const NSRect *rectList;
@@ -395,22 +389,12 @@
// update screenBuffer
if (dataProviderRef)
CGDataProviderRelease(dataProviderRef);
- if (screenBuffer)
- free(screenBuffer);
- screenBuffer = malloc( w * 4 * h );
- ds->data = screenBuffer;
- ds->linesize = (w * 4);
- ds->depth = 32;
- ds->width = w;
- ds->height = h;
-#ifdef __LITTLE_ENDIAN__
- ds->bgr = 1;
-#else
- ds->bgr = 0;
-#endif
+ //sync host window color space with guests
+ screen.bitsPerPixel = ds_get_bits_per_pixel(ds);
+ screen.bitsPerComponent = ds_get_bytes_per_pixel(ds) * 2;
- dataProviderRef = CGDataProviderCreateWithData(NULL,
screenBuffer, w * 4 * h, NULL);
+ dataProviderRef = CGDataProviderCreateWithData(NULL,
ds_get_data(ds), w * 4 * h, NULL);
// update windows
if (isFullscreen) {
@@ -423,6 +407,7 @@
}
screen.width = w;
screen.height = h;
+ [normalWindow center];
[self setContentDimensions];
[self setFrame:NSMakeRect(cx, cy, cw, ch)];
}
@@ -436,7 +421,7 @@
[self ungrabMouse];
[self setContentDimensions];
// test if host support "enterFullScreenMode:withOptions" at
compiletime
-#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4)
+#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5)
if ([NSView
respondsToSelector:@selector(exitFullScreenModeWithOptions:)]) { //
test if "exitFullScreenModeWithOptions" is supported on host at runtime
[self exitFullScreenModeWithOptions:nil];
} else {
@@ -445,7 +430,7 @@
[normalWindow setContentView: self];
[normalWindow makeKeyAndOrderFront: self];
[NSMenu setMenuBarVisible:YES];
-#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4)
+#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5)
}
#endif
} else { // switch from desktop to fullscreen
@@ -453,7 +438,7 @@
[self grabMouse];
[self setContentDimensions];
// test if host support "enterFullScreenMode:withOptions" at
compiletime
-#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4)
+#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,
@@ -469,7 +454,7 @@
[fullScreenWindow setHasShadow:NO];
[fullScreenWindow setContentView:self];
[fullScreenWindow makeKeyAndOrderFront:self];
-#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4)
+#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5)
}
#endif
}
@@ -740,6 +725,7 @@
[normalWindow setTitle:[NSString stringWithFormat:@"QEMU"]];
[normalWindow setContentView:cocoaView];
[normalWindow makeKeyAndOrderFront:self];
+ [normalWindow center];
}
return self;
@@ -939,11 +925,11 @@
[cocoaView displayRect:rect];
}
-static void cocoa_resize(DisplayState *ds, int w, int h)
+static void cocoa_resize(DisplayState *ds)
{
COCOA_DEBUG("qemu_cocoa: cocoa_resize\n");
- [cocoaView resizeContentToWidth:w height:h displayState:ds];
+ [cocoaView resizeContentToWidth:(int)(ds_get_width(ds)) height:
(int)(ds_get_height(ds)) displayState:ds];
}
static void cocoa_refresh(DisplayState *ds)
@@ -975,20 +961,21 @@
static void cocoa_cleanup(void)
{
COCOA_DEBUG("qemu_cocoa: cocoa_cleanup\n");
-
+ qemu_free(dcl);
}
void cocoa_display_init(DisplayState *ds, int full_screen)
{
COCOA_DEBUG("qemu_cocoa: cocoa_display_init\n");
- // register vga outpu callbacks
- ds->dpy_update = cocoa_update;
- ds->dpy_resize = cocoa_resize;
- ds->dpy_refresh = cocoa_refresh;
+ dcl = qemu_mallocz(sizeof(DisplayChangeListener));
+
+ // register vga output callbacks
+ dcl->dpy_update = cocoa_update;
+ dcl->dpy_resize = cocoa_resize;
+ dcl->dpy_refresh = cocoa_refresh;
- // give window a initial Size
- cocoa_resize(ds, 640, 400);
+ register_displaychangelistener(ds, dcl);
// register cleanup function
atexit(cocoa_cleanup);
cocoadiff.diff
Description: Binary data
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Qemu-devel] [PATCH] Cocoa front-end,
C . W . Betts <=