Update [v2] cocoa.m to match new DisplayState code
authorJuha Riihimäki <juhriihi@esdhcp039222.research.nokia.com>
Tue, 24 Feb 2009 07:32:54 +0000 (09:32 +0200)
committerJuha Riihimäki <juhriihi@esdhcp039222.research.nokia.com>
Tue, 24 Feb 2009 07:32:54 +0000 (09:32 +0200)
Samuel Benson's patch from qemu-devel mailing list for updating Cocoa frontend to match new DisplayState code. Reportedly there are some issues with the patch under certain conditions but for the time being it's the best thing we have to get Cocoa frontend compiling and working.

cocoa.m

diff --git a/cocoa.m b/cocoa.m
index f5a968a..c5764e9 100644 (file)
--- a/cocoa.m
+++ b/cocoa.m
@@ -57,7 +57,7 @@ typedef struct {
 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;
@@ -292,9 +292,6 @@ static int cocoa_keycode_to_qemu(int keycode)
 {
     COCOA_DEBUG("QemuCocoaView: dealloc\n");
 
-    if (screenBuffer)
-        free(screenBuffer);
-
     if (dataProviderRef)
         CGDataProviderRelease(dataProviderRef);
 
@@ -310,9 +307,6 @@ static int cocoa_keycode_to_qemu(int keycode)
 {
     COCOA_DEBUG("QemuCocoaView: drawRect\n");
 
-    if ((int)screenBuffer == -1)
-        return;
-
     // get CoreGraphic context
     CGContextRef viewContextRef = [[NSGraphicsContext currentContext] graphicsPort];
     CGContextSetInterpolationQuality (viewContextRef, kCGInterpolationNone);
@@ -325,10 +319,10 @@ static int cocoa_keycode_to_qemu(int keycode)
             screen.height, //height
             screen.bitsPerComponent, //bitsPerComponent
             screen.bitsPerPixel, //bitsPerPixel
-            (screen.width * 4), //bytesPerRow
+            (screen.width * (screen.bitsPerComponent/2)), //bytesPerRow
 #if __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
@@ -398,22 +392,12 @@ static int cocoa_keycode_to_qemu(int keycode)
     // 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
 
-    dataProviderRef = CGDataProviderCreateWithData(NULL, screenBuffer, w * 4 * h, NULL);
+    //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, ds_get_data(ds), w * 4 * h, NULL);
 
     // update windows
     if (isFullscreen) {
@@ -426,6 +410,7 @@ static int cocoa_keycode_to_qemu(int keycode)
     }
     screen.width = w;
     screen.height = h;
+       [normalWindow center];
     [self setContentDimensions];
     [self setFrame:NSMakeRect(cx, cy, cw, ch)];
 }
@@ -743,6 +728,7 @@ static int cocoa_keycode_to_qemu(int keycode)
         [normalWindow setTitle:[NSString stringWithFormat:@"QEMU"]];
         [normalWindow setContentView:cocoaView];
         [normalWindow makeKeyAndOrderFront:self];
+               [normalWindow center];
 
     }
     return self;
@@ -941,11 +927,11 @@ static void cocoa_update(DisplayState *ds, int x, int y, int w, int h)
     [cocoaView setNeedsDisplayInRect: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)
@@ -977,20 +963,21 @@ static void cocoa_refresh(DisplayState *ds)
 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);