[Spice-devel] [PATCH spice-gtk 4/4] widget: display a message about required EGL support
marcandre.lureau at redhat.com
marcandre.lureau at redhat.com
Thu Jan 3 17:13:26 UTC 2019
From: Marc-André Lureau <marcandre.lureau at redhat.com>
Add a new "label" stack page. When EGL is unsupported and a GL scanout
message is received, switch to that page with an appropriate message
hint.
At this point, no further switch back to 2d drawing is implemented,
although it is theorically possible for a server to switch between GL
and 2D, I don't think we need to bother with this corner case.
Alternative implementation also considered:
- a dialog: problematic, the widget may not have an associated
GtkWindow parent, not very user friendly (one time dialog).
- an info-bar: does not fit well inside display widget, may not be
well integrated with client application. Can usually be discarded.
- an error signal: would need to be implemented by various client, but
could give more flexibility on how to present various errors. Could
be added later, and replace the "label" page used here by
default (if a signal handler is detected).
- a property: may be more appropriate, since the error should
stick. Although it would more complicated to deal with multiple
errors in that case.
The current solution is not perfect, but should be a decent default,
not requiring client modification. It can be later refined by adding a
way for the client to override the presentation of the message via
signal handlers.
Fixes:
https://gitlab.freedesktop.org/spice/spice-gtk/issues/69
Signed-off-by: Marc-André Lureau <marcandre.lureau at redhat.com>
---
src/spice-widget-priv.h | 1 +
src/spice-widget.c | 21 +++++++++++++++++++--
2 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/src/spice-widget-priv.h b/src/spice-widget-priv.h
index 0264577..54fe177 100644
--- a/src/spice-widget-priv.h
+++ b/src/spice-widget-priv.h
@@ -61,6 +61,7 @@ struct _SpiceDisplayClass {
struct _SpiceDisplayPrivate {
GtkStack *stack;
+ GtkWidget *label;
gint channel_id;
gint monitor_id;
diff --git a/src/spice-widget.c b/src/spice-widget.c
index 3ff5be9..d35f457 100644
--- a/src/spice-widget.c
+++ b/src/spice-widget.c
@@ -20,6 +20,7 @@
#include <math.h>
#include <glib.h>
#include <gdk/gdk.h>
+#include <glib/gi18n-lib.h>
#ifdef HAVE_X11_XKBLIB_H
#include <X11/XKBlib.h>
@@ -251,7 +252,9 @@ static void update_ready(SpiceDisplay *display)
SpiceDisplayPrivate *d = display->priv;
gboolean ready = FALSE;
- if (d->monitor_ready) {
+ if (gtk_stack_get_visible_child(d->stack) == d->label) {
+ ready = true;
+ }if (d->monitor_ready) {
ready = egl_enabled(d) || d->mark != 0;
}
/* If the 'resize-guest' property is set, the application expects spice-gtk
@@ -661,6 +664,9 @@ static void spice_display_init(SpiceDisplay *display)
"signal::size-allocate", gst_size_allocate, display,
NULL);
#endif
+ d->label = gtk_label_new(NULL);
+ gtk_label_set_selectable(GTK_LABEL(d->label), true);
+ gtk_stack_add_named(d->stack, d->label, "label");
gtk_widget_show_all(widget);
@@ -2988,6 +2994,17 @@ static void gl_draw(SpiceDisplay *display,
spice_display_channel_gl_draw_done(d->display);
}
}
+#else
+static void spice_display_widget_gl_scanout(SpiceDisplay *display)
+{
+ SpiceDisplayPrivate *d = display->priv;
+
+ DISPLAY_DEBUG(display, "%s", __FUNCTION__);
+ gtk_label_set_label(GTK_LABEL(d->label), _("spice-gtk: The remote requires EGL support."));
+ gtk_stack_set_visible_child(d->stack, d->label);
+ update_ready(display);
+ spice_display_channel_gl_draw_done(d->display);
+}
#endif
static void channel_new(SpiceSession *s, SpiceChannel *channel, SpiceDisplay *display)
@@ -3028,10 +3045,10 @@ static void channel_new(SpiceSession *s, SpiceChannel *channel, SpiceDisplay *di
mark(display, primary.marked);
}
-#if HAVE_EGL
spice_g_signal_connect_object(channel, "notify::gl-scanout",
G_CALLBACK(spice_display_widget_gl_scanout),
display, G_CONNECT_SWAPPED);
+#if HAVE_EGL
spice_g_signal_connect_object(channel, "gl-draw",
G_CALLBACK(gl_draw), display, G_CONNECT_SWAPPED);
#endif
--
2.20.1.2.gb21ebb671b
More information about the Spice-devel
mailing list