From 8c13db0086f81eb3ec92a0b3c920b1c8bb6f424a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Thu, 30 Aug 2012 23:08:04 +0200 Subject: [PATCH spice-gtk] Fix X11 backend The X11 backend allocates the "image" with X11 and needs the widget to be realized before calling spicex_image_create(). https://bugs.freedesktop.org/show_bug.cgi?id=54310 --- gtk/spice-widget-cairo.c | 3 ++- gtk/spice-widget-x11.c | 4 ++++ gtk/spice-widget.c | 20 +++++++++++++++++++- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/gtk/spice-widget-cairo.c b/gtk/spice-widget-cairo.c index 069410a..27915ec 100644 --- a/gtk/spice-widget-cairo.c +++ b/gtk/spice-widget-cairo.c @@ -37,7 +37,8 @@ int spicex_image_create(SpiceDisplay *display) { SpiceDisplayPrivate *d = SPICE_DISPLAY_GET_PRIVATE(display); - g_return_val_if_fail(d->ximage == NULL, 1); + if (d->ximage != NULL) + return 0; if (d->format == SPICE_SURFACE_FMT_16_555 || d->format == SPICE_SURFACE_FMT_16_565) { diff --git a/gtk/spice-widget-x11.c b/gtk/spice-widget-x11.c index 178dc98..05b8d56 100644 --- a/gtk/spice-widget-x11.c +++ b/gtk/spice-widget-x11.c @@ -122,6 +122,10 @@ G_GNUC_INTERNAL int spicex_image_create(SpiceDisplay *display) { SpiceDisplayPrivate *d = SPICE_DISPLAY_GET_PRIVATE(display); + + if (d->ximage != NULL) + return 0; + GdkDrawable *window = gtk_widget_get_window(GTK_WIDGET(display)); GdkDisplay *gtkdpy = gdk_drawable_get_display(window); void *old_handler = NULL; diff --git a/gtk/spice-widget.c b/gtk/spice-widget.c index 528eb84..47afa40 100644 --- a/gtk/spice-widget.c +++ b/gtk/spice-widget.c @@ -1503,6 +1503,21 @@ static gboolean configure_event(GtkWidget *widget, GdkEventConfigure *conf) return true; } +static void realize(GtkWidget *widget) +{ + GTK_WIDGET_CLASS(spice_display_parent_class)->realize(widget); + + spicex_image_create(SPICE_DISPLAY(widget)); +} + +static void unrealize(GtkWidget *widget) +{ + spicex_image_destroy(SPICE_DISPLAY(widget)); + + GTK_WIDGET_CLASS(spice_display_parent_class)->unrealize(widget); +} + + /* ---------------------------------------------------------------- */ static void spice_display_class_init(SpiceDisplayClass *klass) @@ -1526,6 +1541,8 @@ static void spice_display_class_init(SpiceDisplayClass *klass) gtkwidget_class->button_release_event = button_event; gtkwidget_class->configure_event = configure_event; gtkwidget_class->scroll_event = scroll_event; + gtkwidget_class->realize = realize; + gtkwidget_class->unrealize = unrealize; gobject_class->constructor = spice_display_constructor; gobject_class->dispose = spice_display_dispose; @@ -1838,7 +1855,8 @@ static void update_area(SpiceDisplay *display, spicex_image_destroy(display); d->area = area; - spicex_image_create(display); + if (gtk_widget_get_realized(GTK_WIDGET(display))) + spicex_image_create(display); update_size_request(display); set_monitor_ready(display, true); -- 1.7.11.4