X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=cocoa.m;h=c5764e9c76c8ba04a6f982f68875990291039661;hb=8448eb7c99a070118a7c43c455a780c7c6e89d83;hp=f5a968aa90689e38089015a8897f2c0ee7be2604;hpb=c1e1c98fd7c9662bb9a06f499b7ca3a3bae35a2f;p=qemu diff --git a/cocoa.m b/cocoa.m index f5a968a..c5764e9 100644 --- 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);