[Spice-devel] [PATCH spice-gtk v2 3/3] widget: Set cursor during construction

Pavel Grunt pgrunt at redhat.com
Tue May 23 14:56:26 UTC 2017


In a multimonitor environment can easily happen that a cursor is set
before some of the SpiceDisplays are created. IOW the first created
SpiceDisplay has the cursor but others don't.

To avoid the issue set the initial cursor using the "cursor" property
of the SpiceCursorChannel.

Resolves:
https://bugzilla.redhat.com/show_bug.cgi?id=1411380
---
v2: changed to "early return"
---
 src/spice-widget.c | 36 +++++++++++++++++++-----------------
 1 file changed, 19 insertions(+), 17 deletions(-)

diff --git a/src/spice-widget.c b/src/spice-widget.c
index b1c8ab1..a117484 100644
--- a/src/spice-widget.c
+++ b/src/spice-widget.c
@@ -2646,23 +2646,24 @@ static void cursor_set(SpiceCursorChannel *channel,
     cursor_invalidate(display);
 
     g_object_get(G_OBJECT(channel), "cursor", &cursor_shape, NULL);
-    if (cursor_shape != NULL && cursor_shape->data != NULL) {
-        g_clear_object(&d->mouse_pixbuf);
-        d->mouse_pixbuf = gdk_pixbuf_new_from_data(cursor_shape->data,
-                                                   GDK_COLORSPACE_RGB,
-                                                   TRUE, 8,
-                                                   cursor_shape->width,
-                                                   cursor_shape->height,
-                                                   cursor_shape->width * 4,
-                                                   NULL, NULL);
-        d->mouse_hotspot.x = cursor_shape->hot_spot_x;
-        d->mouse_hotspot.y = cursor_shape->hot_spot_y;
-        cursor = gdk_cursor_new_from_pixbuf(gtk_widget_get_display(GTK_WIDGET(display)),
-                                            d->mouse_pixbuf,
-                                            d->mouse_hotspot.x,
-                                            d->mouse_hotspot.y);
-    } else
-        g_warn_if_reached();
+    if (G_UNLIKELY(cursor_shape == NULL || cursor_shape->data == NULL)) {
+        return;
+    }
+
+    g_clear_object(&d->mouse_pixbuf);
+    d->mouse_pixbuf = gdk_pixbuf_new_from_data(cursor_shape->data,
+                                               GDK_COLORSPACE_RGB,
+                                               TRUE, 8,
+                                               cursor_shape->width,
+                                               cursor_shape->height,
+                                               cursor_shape->width * 4,
+                                               NULL, NULL);
+    d->mouse_hotspot.x = cursor_shape->hot_spot_x;
+    d->mouse_hotspot.y = cursor_shape->hot_spot_y;
+    cursor = gdk_cursor_new_from_pixbuf(gtk_widget_get_display(GTK_WIDGET(display)),
+                                        d->mouse_pixbuf,
+                                        d->mouse_hotspot.x,
+                                        d->mouse_hotspot.y);
 s
 #if HAVE_EGL
     if (egl_enabled(d))
@@ -2970,6 +2971,7 @@ static void channel_new(SpiceSession *s, SpiceChannel *channel, gpointer data)
         spice_g_signal_connect_object(channel, "cursor-reset",
                                       G_CALLBACK(cursor_reset), display, 0);
         spice_channel_connect(channel);
+        cursor_set(d->cursor, NULL, display);
         return;
     }
 
-- 
2.13.0



More information about the Spice-devel mailing list