[Spice-devel] [PATCH spice-gtk] Hide cursor when it is on a different screen in server mode

Hans de Goede hdegoede at redhat.com
Mon Mar 19 13:25:00 PDT 2012


Ack.

On 03/19/2012 07:53 PM, Marc-André Lureau wrote:
> When the cursor shape is changed, all the cursor channels are
> updated. The current code assumed that the "set" of the shape should
> show the cursor, but it should stay hidden instead.
>
> Also, when the cursor is hidden, we must invalidate its current
> region to redraw display.
>
> Fix: https://bugzilla.redhat.com/show_bug.cgi?id=804308
> ---
>   gtk/spice-widget-cairo.c |    3 ++-
>   gtk/spice-widget.c       |   30 +++++++++++++++---------------
>   2 files changed, 17 insertions(+), 16 deletions(-)
>
> diff --git a/gtk/spice-widget-cairo.c b/gtk/spice-widget-cairo.c
> index 3fc2a22..2f1ef75 100644
> --- a/gtk/spice-widget-cairo.c
> +++ b/gtk/spice-widget-cairo.c
> @@ -103,7 +103,8 @@ void spicex_draw_event(SpiceDisplay *display, cairo_t *cr)
>           }
>           cairo_paint(cr);
>
> -        if (d->mouse_mode == SPICE_MOUSE_MODE_SERVER) {
> +        if (d->mouse_mode == SPICE_MOUSE_MODE_SERVER&&
> +            !d->show_cursor) {
>               GdkPixbuf *image = d->mouse_pixbuf;
>               if (image != NULL) {
>                   gdk_cairo_set_source_pixbuf(cr, image,
> diff --git a/gtk/spice-widget.c b/gtk/spice-widget.c
> index 850fd5b..2e5ce41 100644
> --- a/gtk/spice-widget.c
> +++ b/gtk/spice-widget.c
> @@ -1594,19 +1594,10 @@ static void cursor_set(SpiceCursorChannel *channel,
>   {
>       SpiceDisplay *display = data;
>       SpiceDisplayPrivate *d = SPICE_DISPLAY_GET_PRIVATE(display);
> +    GdkCursor *cursor = NULL;
>
>       cursor_invalidate(display);
>
> -    if (d->show_cursor) {
> -        gdk_cursor_unref(d->show_cursor);
> -        d->show_cursor = NULL;
> -    }
> -
> -    if (d->mouse_cursor) {
> -        gdk_cursor_unref(d->mouse_cursor);
> -        d->mouse_cursor = NULL;
> -    }
> -
>       if (d->mouse_pixbuf) {
>           g_object_unref(d->mouse_pixbuf);
>           d->mouse_pixbuf = NULL;
> @@ -1622,15 +1613,23 @@ static void cursor_set(SpiceCursorChannel *channel,
>                                                      (GdkPixbufDestroyNotify)g_free, NULL);
>           d->mouse_hotspot.x = hot_x;
>           d->mouse_hotspot.y = hot_y;
> +        cursor = gdk_cursor_new_from_pixbuf(gtk_widget_get_display(GTK_WIDGET(display)),
> +                                            d->mouse_pixbuf, hot_x, hot_y);
> +    } else
> +        g_warn_if_reached();
>
> -        /* gdk_cursor_new_from_pixbuf() will copy pixbuf data on
> -           x11/win32/macos. No worries if rgba pointer is freed
> -           after. */
> -        d->mouse_cursor = gdk_cursor_new_from_pixbuf(gtk_widget_get_display(GTK_WIDGET(display)),
> -                                                     d->mouse_pixbuf, hot_x, hot_y);
> +    if (d->show_cursor) {
> +        /* keep hidden cursor */
> +        gdk_cursor_unref(d->show_cursor);
> +        d->show_cursor = cursor;
> +    } else {
> +        gdk_cursor_unref(d->mouse_cursor);
> +        d->mouse_cursor = cursor;
>       }
>
>       update_mouse_pointer(display);
> +
> +    cursor_invalidate(display);
>   }
>
>   static void cursor_hide(SpiceCursorChannel *channel, gpointer data)
> @@ -1641,6 +1640,7 @@ static void cursor_hide(SpiceCursorChannel *channel, gpointer data)
>       if (d->show_cursor != NULL) /* then we are already hidden */
>           return;
>
> +    cursor_invalidate(display);
>       d->show_cursor = d->mouse_cursor;
>       d->mouse_cursor = get_blank_cursor();
>       update_mouse_pointer(display);


More information about the Spice-devel mailing list