Add a DISABLED display hint

This flag will help to track whether the display has been
removed/closed and whether it really has a valid display.

Ready in contrast, is used to "hide" temporarily the display (when
starting or redrawing the display, to avoid artifacts)
This commit is contained in:
Marc-André Lureau 2012-07-09 01:00:19 +02:00
parent 0897382b45
commit 2a085766f1
5 changed files with 56 additions and 5 deletions

View File

@ -622,15 +622,17 @@ display_show_hint(VirtViewerDisplay *display,
"show-hint", &hint,
NULL);
if (hint == 0) {
if (hint & VIRT_VIEWER_DISPLAY_SHOW_HINT_DISABLED) {
virt_viewer_window_hide(win);
} else if (hint & VIRT_VIEWER_DISPLAY_SHOW_HINT_READY) {
virt_viewer_notebook_show_display(nb);
virt_viewer_window_show(win);
gtk_window_present(virt_viewer_window_get_window(win));
} else {
if (win != self->priv->main_window &&
g_getenv("VIRT_VIEWER_HIDE"))
virt_viewer_window_hide(win);
virt_viewer_notebook_show_status(nb, _("Waiting for display %d..."), nth + 1);
} else {
virt_viewer_notebook_show_display(nb);
virt_viewer_window_show(win);
gtk_window_present(virt_viewer_window_get_window(win));
}
g_object_unref(self);

View File

@ -74,10 +74,27 @@ virt_viewer_display_spice_class_init(VirtViewerDisplaySpiceClass *klass)
g_type_class_add_private(klass, sizeof(VirtViewerDisplaySpicePrivate));
}
static void
show_hint_changed(VirtViewerDisplay *self)
{
SpiceMainChannel *main_channel = virt_viewer_session_spice_get_main_channel(
VIRT_VIEWER_SESSION_SPICE(virt_viewer_display_get_session(self)));
guint enabled = TRUE;
guint nth;
g_object_get(self, "nth-display", &nth, NULL);
if (virt_viewer_display_get_show_hint(self) & VIRT_VIEWER_DISPLAY_SHOW_HINT_DISABLED)
enabled = FALSE;
spice_main_set_display_enabled(main_channel, nth, enabled);
}
static void
virt_viewer_display_spice_init(VirtViewerDisplaySpice *self G_GNUC_UNUSED)
{
self->priv = VIRT_VIEWER_DISPLAY_SPICE_GET_PRIVATE(self);
g_signal_connect(self, "notify::show-hint", G_CALLBACK(show_hint_changed), NULL);
}
static void
@ -166,6 +183,9 @@ virt_viewer_display_spice_size_allocate(VirtViewerDisplaySpice *self,
if (virt_viewer_display_get_auto_resize(VIRT_VIEWER_DISPLAY(self)) == FALSE)
return;
if (virt_viewer_display_get_show_hint(VIRT_VIEWER_DISPLAY(self)) & VIRT_VIEWER_DISPLAY_SHOW_HINT_DISABLED)
return;
if (virt_viewer_display_get_zoom(VIRT_VIEWER_DISPLAY(self))) {
zoom = virt_viewer_display_get_zoom_level(VIRT_VIEWER_DISPLAY(self));

View File

@ -553,6 +553,21 @@ void virt_viewer_display_set_show_hint(VirtViewerDisplay *self, guint hint)
g_object_notify(G_OBJECT(self), "show-hint");
}
void virt_viewer_display_set_enabled(VirtViewerDisplay *self, gboolean enabled)
{
guint hint;
g_return_if_fail(VIRT_VIEWER_IS_DISPLAY(self));
hint = virt_viewer_display_get_show_hint(self);
if (enabled)
hint &= ~VIRT_VIEWER_DISPLAY_SHOW_HINT_DISABLED;
else
hint |= VIRT_VIEWER_DISPLAY_SHOW_HINT_DISABLED;
virt_viewer_display_set_show_hint(self, hint);
}
VirtViewerSession* virt_viewer_display_get_session(VirtViewerDisplay *self)
{
g_return_val_if_fail(VIRT_VIEWER_IS_DISPLAY(self), NULL);

View File

@ -57,6 +57,7 @@ typedef struct _VirtViewerDisplayChannel VirtViewerDisplayChannel;
typedef enum {
VIRT_VIEWER_DISPLAY_SHOW_HINT_READY = 1 << 0,
VIRT_VIEWER_DISPLAY_SHOW_HINT_DISABLED = 1 << 1,
} VirtViewerDisplayShowHintFlags;
/* perhaps this become an interface, and be pushed in gtkvnc and spice? */
@ -116,6 +117,7 @@ gboolean virt_viewer_display_get_auto_resize(VirtViewerDisplay *display);
void virt_viewer_display_release_cursor(VirtViewerDisplay *display);
void virt_viewer_display_close(VirtViewerDisplay *display);
void virt_viewer_display_set_enabled(VirtViewerDisplay *display, gboolean enabled);
G_END_DECLS

View File

@ -1062,6 +1062,9 @@ virt_viewer_window_show(VirtViewerWindow *self)
{
gtk_widget_show(self->priv->window);
if (self->priv->display)
virt_viewer_display_set_enabled(self->priv->display, TRUE);
if (self->priv->desktop_resize_pending) {
virt_viewer_window_resize(self);
self->priv->desktop_resize_pending = FALSE;
@ -1072,6 +1075,15 @@ void
virt_viewer_window_hide(VirtViewerWindow *self)
{
gtk_widget_hide(self->priv->window);
if (self->priv->display) {
VirtViewerDisplay *display = self->priv->display;
guint nth;
g_object_get(display, "nth-display", &nth, NULL);
if (nth != 0)
virt_viewer_display_set_enabled(display, FALSE);
}
}
void