[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 3/9] move set_mouse + cursor_define callbacks
From: |
Stefano Stabellini |
Subject: |
Re: [Qemu-devel] [PATCH 3/9] move set_mouse + cursor_define callbacks |
Date: |
Tue, 18 Sep 2012 15:10:47 +0100 |
User-agent: |
Alpine 2.02 (DEB 1266 2009-07-14) |
On Tue, 18 Sep 2012, Gerd Hoffmann wrote:
> When adding DisplayChangeListeners the set_mouse and cursor_define
> callbacks have been left in DisplayState for some reason. Fix it.
>
> Signed-off-by: Gerd Hoffmann <address@hidden>
This patch is good.
The one thing I don't like is dpy_cursor_define_supported, because it
enforces the idea that we cannot register/deregister
DisplayChangeListeners at run time. Theoretically a new
DisplayChangeListener that support cursor_define could show up at any
time.
Is dpy_cursor_define_supported really necessary?
> console.c | 2 +-
> console.h | 39 +++++++++++++++++++++++++++++++++++----
> hw/jazz_led.c | 2 +-
> hw/qxl-render.c | 2 +-
> hw/vga.c | 10 +++++-----
> hw/vmware_vga.c | 11 ++++++-----
> ui/sdl.c | 8 ++++----
> ui/spice-display.c | 4 ++--
> ui/vnc.c | 8 ++++----
> 9 files changed, 59 insertions(+), 27 deletions(-)
>
> diff --git a/console.c b/console.c
> index a8bcc42..cc0479b 100644
> --- a/console.c
> +++ b/console.c
> @@ -1239,7 +1239,7 @@ static void text_console_update(void *opaque,
> console_ch_t *chardata)
> s->text_y[1] = 0;
> }
> if (s->cursor_invalidate) {
> - dpy_cursor(s->ds, s->x, s->y);
> + dpy_text_cursor(s->ds, s->x, s->y);
> s->cursor_invalidate = 0;
> }
> }
> diff --git a/console.h b/console.h
> index 48fef22..bef2d2d 100644
> --- a/console.h
> +++ b/console.h
> @@ -164,6 +164,9 @@ struct DisplayChangeListener {
> int w, int h, uint32_t c);
> void (*dpy_text_cursor)(struct DisplayState *s, int x, int y);
>
> + void (*dpy_mouse_set)(struct DisplayState *s, int x, int y, int on);
> + void (*dpy_cursor_define)(struct DisplayState *s, QEMUCursor *cursor);
> +
> QLIST_ENTRY(DisplayChangeListener) next;
> };
>
> @@ -181,9 +184,6 @@ struct DisplayState {
> struct DisplayAllocator* allocator;
> QLIST_HEAD(, DisplayChangeListener) listeners;
>
> - void (*mouse_set)(int x, int y, int on);
> - void (*cursor_define)(QEMUCursor *cursor);
> -
> struct DisplayState *next;
> };
>
> @@ -304,7 +304,7 @@ static inline void dpy_fill(struct DisplayState *s, int
> x, int y,
> }
> }
>
> -static inline void dpy_cursor(struct DisplayState *s, int x, int y)
> +static inline void dpy_text_cursor(struct DisplayState *s, int x, int y)
> {
> struct DisplayChangeListener *dcl;
> QLIST_FOREACH(dcl, &s->listeners, next) {
> @@ -314,6 +314,37 @@ static inline void dpy_cursor(struct DisplayState *s,
> int x, int y)
> }
> }
>
> +static inline void dpy_mouse_set(struct DisplayState *s, int x, int y, int
> on)
> +{
> + struct DisplayChangeListener *dcl;
> + QLIST_FOREACH(dcl, &s->listeners, next) {
> + if (dcl->dpy_mouse_set) {
> + dcl->dpy_mouse_set(s, x, y, on);
> + }
> + }
> +}
> +
> +static inline void dpy_cursor_define(struct DisplayState *s, QEMUCursor
> *cursor)
> +{
> + struct DisplayChangeListener *dcl;
> + QLIST_FOREACH(dcl, &s->listeners, next) {
> + if (dcl->dpy_cursor_define) {
> + dcl->dpy_cursor_define(s, cursor);
> + }
> + }
> +}
> +
> +static inline bool dpy_cursor_define_supported(struct DisplayState *s)
> +{
> + struct DisplayChangeListener *dcl;
> + QLIST_FOREACH(dcl, &s->listeners, next) {
> + if (dcl->dpy_cursor_define) {
> + return true;
> + }
> + }
> + return false;
> +}
> +
> static inline int ds_get_linesize(DisplayState *ds)
> {
> return ds->surface->linesize;
> diff --git a/hw/jazz_led.c b/hw/jazz_led.c
> index 6486523..c4d54e2 100644
> --- a/hw/jazz_led.c
> +++ b/hw/jazz_led.c
> @@ -210,7 +210,7 @@ static void jazz_led_text_update(void *opaque,
> console_ch_t *chardata)
> LedState *s = opaque;
> char buf[2];
>
> - dpy_cursor(s->ds, -1, -1);
> + dpy_text_cursor(s->ds, -1, -1);
> qemu_console_resize(s->ds, 2, 1);
>
> /* TODO: draw the segments */
> diff --git a/hw/qxl-render.c b/hw/qxl-render.c
> index e2e3fe2..085a090 100644
> --- a/hw/qxl-render.c
> +++ b/hw/qxl-render.c
> @@ -238,7 +238,7 @@ int qxl_render_cursor(PCIQXLDevice *qxl, QXLCommandExt
> *ext)
> return 1;
> }
>
> - if (!qxl->ssd.ds->mouse_set || !qxl->ssd.ds->cursor_define) {
> + if (!dpy_cursor_define_supported(qxl->ssd.ds)) {
> return 0;
> }
>
> diff --git a/hw/vga.c b/hw/vga.c
> index afaef0d..ec4f0c5 100644
> --- a/hw/vga.c
> +++ b/hw/vga.c
> @@ -2081,11 +2081,11 @@ static void vga_update_text(void *opaque,
> console_ch_t *chardata)
> s->cr[VGA_CRTC_CURSOR_END] != s->cursor_end || full_update) {
> cursor_visible = !(s->cr[VGA_CRTC_CURSOR_START] & 0x20);
> if (cursor_visible && cursor_offset < size && cursor_offset >= 0)
> - dpy_cursor(s->ds,
> - TEXTMODE_X(cursor_offset),
> - TEXTMODE_Y(cursor_offset));
> + dpy_text_cursor(s->ds,
> + TEXTMODE_X(cursor_offset),
> + TEXTMODE_Y(cursor_offset));
> else
> - dpy_cursor(s->ds, -1, -1);
> + dpy_text_cursor(s->ds, -1, -1);
> s->cursor_offset = cursor_offset;
> s->cursor_start = s->cr[VGA_CRTC_CURSOR_START];
> s->cursor_end = s->cr[VGA_CRTC_CURSOR_END];
> @@ -2146,7 +2146,7 @@ static void vga_update_text(void *opaque, console_ch_t
> *chardata)
> /* Display a message */
> s->last_width = 60;
> s->last_height = height = 3;
> - dpy_cursor(s->ds, -1, -1);
> + dpy_text_cursor(s->ds, -1, -1);
> s->ds->surface->width = s->last_width;
> s->ds->surface->height = height;
> dpy_resize(s->ds);
> diff --git a/hw/vmware_vga.c b/hw/vmware_vga.c
> index e815a04..e105b5a 100644
> --- a/hw/vmware_vga.c
> +++ b/hw/vmware_vga.c
> @@ -479,8 +479,7 @@ static inline void vmsvga_cursor_define(struct
> vmsvga_state_s *s,
> qc = cursor_builtin_left_ptr();
> }
>
> - if (s->vga.ds->cursor_define)
> - s->vga.ds->cursor_define(qc);
> + dpy_cursor_define(s->vga.ds, qc);
> cursor_put(qc);
> }
> #endif
> @@ -755,9 +754,10 @@ static uint32_t vmsvga_value_read(void *opaque, uint32_t
> address)
> caps |= SVGA_CAP_RECT_FILL;
> #endif
> #ifdef HW_MOUSE_ACCEL
> - if (s->vga.ds->mouse_set)
> + if (dpy_cursor_define_supported(s->vga.ds)) {
> caps |= SVGA_CAP_CURSOR | SVGA_CAP_CURSOR_BYPASS_2 |
> SVGA_CAP_CURSOR_BYPASS;
> + }
> #endif
> return caps;
>
> @@ -904,8 +904,9 @@ static void vmsvga_value_write(void *opaque, uint32_t
> address, uint32_t value)
> s->cursor.on |= (value == SVGA_CURSOR_ON_SHOW);
> s->cursor.on &= (value != SVGA_CURSOR_ON_HIDE);
> #ifdef HW_MOUSE_ACCEL
> - if (s->vga.ds->mouse_set && value <= SVGA_CURSOR_ON_SHOW)
> - s->vga.ds->mouse_set(s->cursor.x, s->cursor.y, s->cursor.on);
> + if (value <= SVGA_CURSOR_ON_SHOW) {
> + dpy_mouse_set(s->vga.ds, s->cursor.x, s->cursor.y, s->cursor.on);
> + }
> #endif
> break;
>
> diff --git a/ui/sdl.c b/ui/sdl.c
> index f6f711c..f8ead93 100644
> --- a/ui/sdl.c
> +++ b/ui/sdl.c
> @@ -905,7 +905,7 @@ static void sdl_fill(DisplayState *ds, int x, int y, int
> w, int h, uint32_t c)
> SDL_FillRect(real_screen, &dst, c);
> }
>
> -static void sdl_mouse_warp(int x, int y, int on)
> +static void sdl_mouse_warp(DisplayState *ds, int x, int y, int on)
> {
> if (on) {
> if (!guest_cursor)
> @@ -921,7 +921,7 @@ static void sdl_mouse_warp(int x, int y, int on)
> guest_x = x, guest_y = y;
> }
>
> -static void sdl_mouse_define(QEMUCursor *c)
> +static void sdl_mouse_define(DisplayState *ds, QEMUCursor *c)
> {
> uint8_t *image, *mask;
> int bpl;
> @@ -1025,8 +1025,8 @@ void sdl_display_init(DisplayState *ds, int
> full_screen, int no_frame)
> dcl->dpy_refresh = sdl_refresh;
> dcl->dpy_setdata = sdl_setdata;
> dcl->dpy_fill = sdl_fill;
> - ds->mouse_set = sdl_mouse_warp;
> - ds->cursor_define = sdl_mouse_define;
> + dcl->dpy_mouse_set = sdl_mouse_warp;
> + dcl->dpy_cursor_define = sdl_mouse_define;
> register_displaychangelistener(ds, dcl);
>
> da = g_malloc0(sizeof(DisplayAllocator));
> diff --git a/ui/spice-display.c b/ui/spice-display.c
> index 50fbefb..5180428 100644
> --- a/ui/spice-display.c
> +++ b/ui/spice-display.c
> @@ -441,12 +441,12 @@ void qemu_spice_display_resize(SimpleSpiceDisplay *ssd)
> void qemu_spice_cursor_refresh_unlocked(SimpleSpiceDisplay *ssd)
> {
> if (ssd->cursor) {
> - ssd->ds->cursor_define(ssd->cursor);
> + dpy_cursor_define(ssd->ds, ssd->cursor);
> cursor_put(ssd->cursor);
> ssd->cursor = NULL;
> }
> if (ssd->mouse_x != -1 && ssd->mouse_y != -1) {
> - ssd->ds->mouse_set(ssd->mouse_x, ssd->mouse_y, 1);
> + dpy_mouse_set(ssd->ds, ssd->mouse_x, ssd->mouse_y, 1);
> ssd->mouse_x = -1;
> ssd->mouse_y = -1;
> }
> diff --git a/ui/vnc.c b/ui/vnc.c
> index 385e345..f8f058d 100644
> --- a/ui/vnc.c
> +++ b/ui/vnc.c
> @@ -798,7 +798,7 @@ static void vnc_dpy_copy(DisplayState *ds, int src_x, int
> src_y, int dst_x, int
> }
> }
>
> -static void vnc_mouse_set(int x, int y, int visible)
> +static void vnc_mouse_set(DisplayState *ds, int x, int y, int visible)
> {
> /* can we ask the client(s) to move the pointer ??? */
> }
> @@ -825,7 +825,7 @@ static int vnc_cursor_define(VncState *vs)
> return -1;
> }
>
> -static void vnc_dpy_cursor_define(QEMUCursor *c)
> +static void vnc_dpy_cursor_define(DisplayState *ds, QEMUCursor *c)
> {
> VncDisplay *vd = vnc_display;
> VncState *vs;
> @@ -2751,9 +2751,9 @@ void vnc_display_init(DisplayState *ds)
> dcl->dpy_update = vnc_dpy_update;
> dcl->dpy_resize = vnc_dpy_resize;
> dcl->dpy_setdata = vnc_dpy_setdata;
> + dcl->dpy_mouse_set = vnc_mouse_set;
> + dcl->dpy_cursor_define = vnc_dpy_cursor_define;
> register_displaychangelistener(ds, dcl);
> - ds->mouse_set = vnc_mouse_set;
> - ds->cursor_define = vnc_dpy_cursor_define;
> }
>
>
> --
> 1.7.1
>
>
- [Qemu-devel] [PULL 0/9] linux framebuffer display driver, Gerd Hoffmann, 2012/09/18
- [Qemu-devel] [PATCH 1/9] QLIST-ify display change listeners., Gerd Hoffmann, 2012/09/18
- [Qemu-devel] [PATCH 2/9] add unregister_displaychangelistener, Gerd Hoffmann, 2012/09/18
- [Qemu-devel] [PATCH 5/9] fbdev: add monitor command to enable/disable, Gerd Hoffmann, 2012/09/18
- [Qemu-devel] [PATCH 6/9] fbdev: make configurable at compile time., Gerd Hoffmann, 2012/09/18
- [Qemu-devel] [PATCH 8/9] fbdev: add mouse pointer support, Gerd Hoffmann, 2012/09/18
- [Qemu-devel] [PATCH 9/9] fbdev: add display scaling support, Gerd Hoffmann, 2012/09/18