Patchwork cocoa: Fix VBE function Set Display Start

login
register
mail settings
Submitter Henry Harrington
Date Nov. 21, 2012, 7:08 p.m.
Message ID <1353524923-15419-1-git-send-email-henry.harrington@gmail.com>
Download mbox | patch
Permalink /patch/200842/
State New
Headers show

Comments

Henry Harrington - Nov. 21, 2012, 7:08 p.m.
Register a dpy_gfx_setdata callback so that the Cocoa code
is notified whenever the screen start address changes.

Signed-off-by: Henry Harrington <henry.harrington@gmail.com>
---
 ui/cocoa.m |   18 ++++++++++++++++++
 1 files changed, 18 insertions(+), 0 deletions(-)
Andreas Färber - Nov. 27, 2012, 5:03 a.m.
Am 21.11.2012 20:08, schrieb Henry Harrington:
> Register a dpy_gfx_setdata callback so that the Cocoa code
> is notified whenever the screen start address changes.
> 
> Signed-off-by: Henry Harrington <henry.harrington@gmail.com>
> ---
>  ui/cocoa.m |   18 ++++++++++++++++++
>  1 files changed, 18 insertions(+), 0 deletions(-)
> 
> diff --git a/ui/cocoa.m b/ui/cocoa.m
> index 87d2e44..97010bc 100644
> --- a/ui/cocoa.m
> +++ b/ui/cocoa.m
> @@ -265,6 +265,7 @@ static int cocoa_keycode_to_qemu(int keycode)
>      BOOL isTabletEnabled;
>  }
>  - (void) resizeContentToWidth:(int)w height:(int)h displayState:(DisplayState *)ds;
> +- (void) updateDataOffset:(DisplayState *)ds;
>  - (void) grabMouse;
>  - (void) ungrabMouse;
>  - (void) toggleFullScreen:(id)sender;
> @@ -429,6 +430,17 @@ QemuCocoaView *cocoaView;
>      [self setFrame:NSMakeRect(cx, cy, cw, ch)];
>  }
>  
> +- (void) updateDataOffset:(DisplayState *)ds
> +{
> +    COCOA_DEBUG("QemuCocoaView: UpdateDataOffset\n");
> +
> +    // update screenBuffer
> +    if (dataProviderRef)
> +        CGDataProviderRelease(dataProviderRef);

Please add braces for if.

> +
> +    dataProviderRef = CGDataProviderCreateWithData(NULL, ds_get_data(ds), ds_get_width(ds) * 4 * ds_get_height(ds), NULL);

This line seems overly long, please keep within 80 chars.

> +}
> +
>  - (void) toggleFullScreen:(id)sender
>  {
>      COCOA_DEBUG("QemuCocoaView: toggleFullScreen\n");
> @@ -1004,6 +1016,11 @@ static void cocoa_refresh(DisplayState *ds)
>      vga_hw_update();
>  }
>  
> +static void cocoa_setdata(DisplayState *ds)
> +{
> +  [cocoaView updateDataOffset:ds];

Please indent using 4 spaces.

> +}
> +
>  static void cocoa_cleanup(void)
>  {
>      COCOA_DEBUG("qemu_cocoa: cocoa_cleanup\n");
> @@ -1020,6 +1037,7 @@ void cocoa_display_init(DisplayState *ds, int full_screen)
>      dcl->dpy_gfx_update = cocoa_update;
>      dcl->dpy_gfx_resize = cocoa_resize;
>      dcl->dpy_refresh = cocoa_refresh;
> +    dcl->dpy_gfx_setdata = cocoa_setdata;
>  
>  	register_displaychangelistener(ds, dcl);
>  

Apart from the style issues above (you can use scripts/checkpatch.pl to
verify) this looks okay. Unfortunately I am not getting pixman built on
OSX so am still unable to test...

Am I understanding correctly that this is an optional hook and not a bug
fix for 1.3? How can it be verified?

Regards,
Andreas
Henry Harrington - Nov. 27, 2012, 6:54 p.m.
On Tue, Nov 27, 2012 at 5:03 AM, Andreas Färber <andreas.faerber@web.de> wrote:
> Am 21.11.2012 20:08, schrieb Henry Harrington:
> Apart from the style issues above (you can use scripts/checkpatch.pl to
> verify) this looks okay. Unfortunately I am not getting pixman built on
> OSX so am still unable to test...

Thanks, I'll fix the style issues and submit a new patch.

> Am I understanding correctly that this is an optional hook and not a bug
> fix for 1.3? How can it be verified?
>
> Regards,
> Andreas

The setdata callback is required, even though the Cocoa UI works reasonably
well without it. I've attached a simple testcase, which rapidly switches
between two virtual screens using VBE (one is blue/green, and the other
is green/red). Without the fix Qemu does not switch between screens.

There was a similar bug in the VNC UI which was fixed in commit 1d3323d.

Henry

Patch

diff --git a/ui/cocoa.m b/ui/cocoa.m
index 87d2e44..97010bc 100644
--- a/ui/cocoa.m
+++ b/ui/cocoa.m
@@ -265,6 +265,7 @@  static int cocoa_keycode_to_qemu(int keycode)
     BOOL isTabletEnabled;
 }
 - (void) resizeContentToWidth:(int)w height:(int)h displayState:(DisplayState *)ds;
+- (void) updateDataOffset:(DisplayState *)ds;
 - (void) grabMouse;
 - (void) ungrabMouse;
 - (void) toggleFullScreen:(id)sender;
@@ -429,6 +430,17 @@  QemuCocoaView *cocoaView;
     [self setFrame:NSMakeRect(cx, cy, cw, ch)];
 }
 
+- (void) updateDataOffset:(DisplayState *)ds
+{
+    COCOA_DEBUG("QemuCocoaView: UpdateDataOffset\n");
+
+    // update screenBuffer
+    if (dataProviderRef)
+        CGDataProviderRelease(dataProviderRef);
+
+    dataProviderRef = CGDataProviderCreateWithData(NULL, ds_get_data(ds), ds_get_width(ds) * 4 * ds_get_height(ds), NULL);
+}
+
 - (void) toggleFullScreen:(id)sender
 {
     COCOA_DEBUG("QemuCocoaView: toggleFullScreen\n");
@@ -1004,6 +1016,11 @@  static void cocoa_refresh(DisplayState *ds)
     vga_hw_update();
 }
 
+static void cocoa_setdata(DisplayState *ds)
+{
+  [cocoaView updateDataOffset:ds];
+}
+
 static void cocoa_cleanup(void)
 {
     COCOA_DEBUG("qemu_cocoa: cocoa_cleanup\n");
@@ -1020,6 +1037,7 @@  void cocoa_display_init(DisplayState *ds, int full_screen)
     dcl->dpy_gfx_update = cocoa_update;
     dcl->dpy_gfx_resize = cocoa_resize;
     dcl->dpy_refresh = cocoa_refresh;
+    dcl->dpy_gfx_setdata = cocoa_setdata;
 
 	register_displaychangelistener(ds, dcl);