[virt-tools-list] [PATCH virt-viewer 2/4] spice: implement --fullscreen=auto-conf
Daniel P. Berrange
berrange at redhat.com
Mon Mar 19 10:38:46 UTC 2012
On Sun, Mar 18, 2012 at 07:59:15PM +0100, Marc-André Lureau wrote:
Could you add a commit message which describes what --fullscreen=auto-conf
actually does. Or indeed why we need an arg value, when there is only one
possible value allowed in this patch ?
> ---
> src/remote-viewer-main.c | 32 +++++++++++++++++--
> src/virt-viewer-app.c | 30 +++++++++++++++---
> src/virt-viewer-session-spice.c | 62 +++++++++++++++++++++++++++++++++++++-
> src/virt-viewer-session-spice.h | 2 +-
> src/virt-viewer-session.c | 30 ++++++++++++++++++-
> src/virt-viewer-session.h | 2 +
> src/virt-viewer-window.c | 18 ++++++-----
> 7 files changed, 155 insertions(+), 21 deletions(-)
>
> diff --git a/src/remote-viewer-main.c b/src/remote-viewer-main.c
> index 6d26605..d857e45 100644
> --- a/src/remote-viewer-main.c
> +++ b/src/remote-viewer-main.c
> @@ -43,6 +43,28 @@ remote_viewer_version(void)
> exit(EXIT_SUCCESS);
> }
>
> +gboolean fullscreen = FALSE;
> +gboolean fullscreen_auto_conf = FALSE;
> +
> +static gboolean
> +option_fullscreen(G_GNUC_UNUSED const gchar *option_name,
> + const gchar *value,
> + G_GNUC_UNUSED gpointer data, GError **error)
> +{
> + fullscreen = TRUE;
> +
> + if (value == NULL)
> + return TRUE;
> +
> + if (g_str_equal(value, "auto-conf")) {
> + fullscreen_auto_conf = TRUE;
> + return TRUE;
> + }
> +
> + g_set_error(error, G_OPTION_ERROR, G_OPTION_ERROR_FAILED, _("Invalid full-screen argument: %s"), value);
> + return FALSE;
> +}
> +
> int
> main(int argc, char **argv)
> {
> @@ -54,7 +76,6 @@ main(int argc, char **argv)
> gboolean verbose = FALSE;
> gboolean debug = FALSE;
> gboolean direct = FALSE;
> - gboolean fullscreen = FALSE;
> RemoteViewer *viewer = NULL;
> #if HAVE_SPICE_GTK
> gboolean controller = FALSE;
> @@ -72,8 +93,8 @@ main(int argc, char **argv)
> N_("Zoom level of window, in percentage"), "ZOOM" },
> { "debug", '\0', 0, G_OPTION_ARG_NONE, &debug,
> N_("Display debugging information"), NULL },
> - { "full-screen", 'f', 0, G_OPTION_ARG_NONE, &fullscreen,
> - N_("Open in full screen mode"), NULL },
> + { "full-screen", 'f', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_CALLBACK, option_fullscreen,
> + N_("Open in full screen mode (=<auto-conf>)"), NULL },
> #if HAVE_SPICE_GTK
> { "spice-controller", '\0', 0, G_OPTION_ARG_NONE, &controller,
> N_("Open connection using Spice controller communication"), NULL },
> @@ -144,7 +165,10 @@ main(int argc, char **argv)
> goto cleanup;
>
> app = VIRT_VIEWER_APP(viewer);
> - g_object_set(app, "fullscreen", fullscreen, NULL);
> + g_object_set(app,
> + "fullscreen", fullscreen,
> + "fullscreen-auto-conf", fullscreen_auto_conf,
> + NULL);
> virt_viewer_window_set_zoom_level(virt_viewer_app_get_main_window(app), zoom);
> virt_viewer_app_set_direct(app, direct);
>
> diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c
> index e30df85..9cffedb 100644
> --- a/src/virt-viewer-app.c
> +++ b/src/virt-viewer-app.c
> @@ -116,6 +116,7 @@ struct _VirtViewerAppPrivate {
> gboolean authretry;
> gboolean started;
> gboolean fullscreen;
> + gboolean fullscreen_auto_conf;
> gboolean attach;
> gboolean quiting;
>
> @@ -157,6 +158,7 @@ enum {
> PROP_TITLE,
> PROP_ENABLE_ACCEL,
> PROP_HAS_FOCUS,
> + PROP_FULLSCREEN_AUTO_CONF,
> };
>
> enum {
> @@ -684,7 +686,7 @@ virt_viewer_app_create_session(VirtViewerApp *self, const gchar *type)
> GtkWindow *window = virt_viewer_window_get_window(priv->main_window);
> virt_viewer_app_trace(self, "Guest %s has a %s display\n",
> priv->guest_name, type);
> - priv->session = virt_viewer_session_spice_new(window);
> + priv->session = virt_viewer_session_spice_new(self, window);
> } else
> #endif
> {
> @@ -1170,6 +1172,10 @@ virt_viewer_app_get_property (GObject *object, guint property_id,
> g_value_set_boolean(value, priv->focused > 0);
> break;
>
> + case PROP_FULLSCREEN_AUTO_CONF:
> + g_value_set_boolean(value, priv->fullscreen_auto_conf);
> + break;
> +
> default:
> G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
> }
> @@ -1218,6 +1224,10 @@ virt_viewer_app_set_property (GObject *object, guint property_id,
> priv->enable_accel = g_value_get_boolean(value);
> break;
>
> + case PROP_FULLSCREEN_AUTO_CONF:
> + priv->fullscreen_auto_conf = g_value_get_boolean(value);
> + break;
> +
> default:
> G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
> }
> @@ -1377,8 +1387,16 @@ virt_viewer_app_class_init (VirtViewerAppClass *klass)
> "Fullscreen",
> "Fullscreen",
> FALSE,
> - G_PARAM_READABLE |
> - G_PARAM_WRITABLE |
> + G_PARAM_READWRITE |
> + G_PARAM_STATIC_STRINGS));
> +
> + g_object_class_install_property(object_class,
> + PROP_FULLSCREEN_AUTO_CONF,
> + g_param_spec_boolean("fullscreen-auto-conf",
> + "auto conf",
> + "Automatic display configuration in full screen",
> + FALSE,
> + G_PARAM_READWRITE |
> G_PARAM_STATIC_STRINGS));
>
> g_object_class_install_property(object_class,
> @@ -1503,7 +1521,7 @@ static void fullscreen_cb(gpointer key,
>
> DEBUG_LOG("fullscreen display %d: %d", nth, options->fullscreen);
> if (options->fullscreen) {
> - GdkScreen *screen = gdk_screen_get_default ();
> + GdkScreen *screen = gdk_screen_get_default();
> GdkRectangle mon;
>
> if (nth >= gdk_screen_get_n_monitors(screen)) {
> @@ -1522,12 +1540,14 @@ virt_viewer_app_set_fullscreen(VirtViewerApp *self, gboolean fullscreen)
> VirtViewerAppPrivate *priv = self->priv;
> FullscreenOptions options = {
> .fullscreen = fullscreen,
> - .move = virt_viewer_app_get_n_windows_visible(self) > 1,
> + .move = virt_viewer_app_get_n_windows_visible(self) > 1 || self->priv->fullscreen_auto_conf,
> };
>
> /* we iterate unconditionnaly, even if it was set before to update new windows */
> priv->fullscreen = fullscreen;
> g_hash_table_foreach(priv->windows, fullscreen_cb, &options);
> +
> + g_object_notify(G_OBJECT(self), "fullscreen");
> }
>
> static void
> diff --git a/src/virt-viewer-session-spice.c b/src/virt-viewer-session-spice.c
> index a4b3a1f..7d14db4 100644
> --- a/src/virt-viewer-session-spice.c
> +++ b/src/virt-viewer-session-spice.c
> @@ -74,6 +74,7 @@ static void virt_viewer_session_spice_channel_destroy(SpiceSession *s,
> VirtViewerSession *session);
> static void virt_viewer_session_spice_smartcard_insert(VirtViewerSession *session);
> static void virt_viewer_session_spice_smartcard_remove(VirtViewerSession *session);
> +static gboolean virt_viewer_session_spice_fullscreen_auto_conf(VirtViewerSessionSpice *self);
>
> static void
> virt_viewer_session_spice_get_property(GObject *object, guint property_id,
> @@ -394,6 +395,15 @@ virt_viewer_session_spice_usb_device_selection(VirtViewerSession *session,
> }
>
> static void
> +agent_connected_changed(SpiceChannel *cmain,
> + GParamSpec *pspec G_GNUC_UNUSED,
> + VirtViewerSessionSpice *self)
> +{
> + if (virt_viewer_session_spice_fullscreen_auto_conf(self))
> + g_signal_handlers_disconnect_by_func(cmain, agent_connected_changed, self);
> +}
> +
> +static void
> virt_viewer_session_spice_channel_new(SpiceSession *s,
> SpiceChannel *channel,
> VirtViewerSession *session)
> @@ -416,6 +426,9 @@ virt_viewer_session_spice_channel_new(SpiceSession *s,
> g_signal_connect(channel, "channel-event",
> G_CALLBACK(virt_viewer_session_spice_main_channel_event), self);
> self->priv->main_channel = SPICE_MAIN_CHANNEL(channel);
> +
> + g_signal_connect(channel, "notify::agent-connected", G_CALLBACK(agent_connected_changed), self);
> + agent_connected_changed(channel, NULL, self);
> }
>
> if (SPICE_IS_DISPLAY_CHANNEL(channel)) {
> @@ -447,6 +460,41 @@ virt_viewer_session_spice_channel_new(SpiceSession *s,
> self->priv->channel_count++;
> }
>
> +static gboolean
> +virt_viewer_session_spice_fullscreen_auto_conf(VirtViewerSessionSpice *self)
> +{
> + GdkScreen *screen = gdk_screen_get_default();
> + SpiceMainChannel* cmain = virt_viewer_session_spice_get_main_channel(self);
> + VirtViewerApp *app = NULL;
> + GdkRectangle dest;
> + gboolean auto_conf, agent_connected;
> + gint i;
> +
> + app = virt_viewer_session_get_app(VIRT_VIEWER_SESSION(self));
> + g_return_val_if_fail(VIRT_VIEWER_IS_APP(app), TRUE);
> +
> + g_object_get(app, "fullscreen-auto-conf", &auto_conf, NULL);
> + if (!auto_conf)
> + return TRUE;
> +
> + if (cmain == NULL)
> + return FALSE;
> +
> + g_object_get(cmain, "agent-connected", &agent_connected, NULL);
> + if (!agent_connected)
> + return FALSE;
> +
> + spice_main_set_display_enabled(cmain, -1, FALSE);
> + for (i = 0; i < gdk_screen_get_n_monitors(screen); i++) {
> + gdk_screen_get_monitor_geometry(screen, i, &dest);
> + spice_main_set_display(cmain, i, dest.x, dest.y, dest.width, dest.height);
> + spice_main_set_display_enabled(cmain, i, TRUE);
> + }
> +
> + spice_main_send_monitor_config(cmain);
> + return TRUE;
> +}
> +
> static void
> virt_viewer_session_spice_channel_destroy(G_GNUC_UNUSED SpiceSession *s,
> SpiceChannel *channel,
> @@ -479,16 +527,26 @@ virt_viewer_session_spice_channel_destroy(G_GNUC_UNUSED SpiceSession *s,
> g_signal_emit_by_name(self, "session-disconnected");
> }
>
> +static void
> +fullscreen_changed(GObject *gobject G_GNUC_UNUSED,
> + GParamSpec *pspec G_GNUC_UNUSED,
> + VirtViewerSessionSpice *self)
> +{
> + virt_viewer_session_spice_fullscreen_auto_conf(self);
> +}
> +
> VirtViewerSession *
> -virt_viewer_session_spice_new(GtkWindow *main_window)
> +virt_viewer_session_spice_new(VirtViewerApp *app, GtkWindow *main_window)
> {
> VirtViewerSessionSpice *self;
>
> - self = g_object_new(VIRT_VIEWER_TYPE_SESSION_SPICE, NULL);
> + self = g_object_new(VIRT_VIEWER_TYPE_SESSION_SPICE, "app", app, NULL);
>
> create_spice_session(self);
> self->priv->main_window = g_object_ref(main_window);
>
> + g_signal_connect(app, "notify::fullscreen", G_CALLBACK(fullscreen_changed), self);
> +
> return VIRT_VIEWER_SESSION(self);
> }
>
> diff --git a/src/virt-viewer-session-spice.h b/src/virt-viewer-session-spice.h
> index f0d7e89..95bdcdf 100644
> --- a/src/virt-viewer-session-spice.h
> +++ b/src/virt-viewer-session-spice.h
> @@ -65,7 +65,7 @@ struct _VirtViewerSessionSpiceClass {
>
> GType virt_viewer_session_spice_get_type(void);
>
> -VirtViewerSession* virt_viewer_session_spice_new(GtkWindow *main_window);
> +VirtViewerSession* virt_viewer_session_spice_new(VirtViewerApp *app, GtkWindow *main_window);
> SpiceMainChannel* virt_viewer_session_spice_get_main_channel(VirtViewerSessionSpice *self);
>
> G_END_DECLS
> diff --git a/src/virt-viewer-session.c b/src/virt-viewer-session.c
> index c0d6e65..f139c48 100644
> --- a/src/virt-viewer-session.c
> +++ b/src/virt-viewer-session.c
> @@ -35,7 +35,7 @@
> struct _VirtViewerSessionPrivate
> {
> GList *displays;
> -
> + VirtViewerApp *app;
> gboolean auto_usbredir;
> };
>
> @@ -44,6 +44,7 @@ G_DEFINE_ABSTRACT_TYPE(VirtViewerSession, virt_viewer_session, G_TYPE_OBJECT)
> enum {
> PROP_0,
>
> + PROP_APP,
> PROP_AUTO_USBREDIR,
> };
>
> @@ -74,6 +75,11 @@ virt_viewer_session_set_property(GObject *object,
> case PROP_AUTO_USBREDIR:
> virt_viewer_session_set_auto_usbredir(self, g_value_get_boolean(value));
> break;
> +
> + case PROP_APP:
> + self->priv->app = g_value_get_object(value);
> + break;
> +
> default:
> G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
> break;
> @@ -92,6 +98,11 @@ virt_viewer_session_get_property(GObject *object,
> case PROP_AUTO_USBREDIR:
> g_value_set_boolean(value, virt_viewer_session_get_auto_usbredir(self));
> break;
> +
> + case PROP_APP:
> + g_value_set_object(value, self->priv->app);
> + break;
> +
> default:
> G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
> break;
> @@ -117,6 +128,16 @@ virt_viewer_session_class_init(VirtViewerSessionClass *class)
> G_PARAM_CONSTRUCT |
> G_PARAM_STATIC_STRINGS));
>
> + g_object_class_install_property(object_class,
> + PROP_APP,
> + g_param_spec_object("app",
> + "VirtViewerApp",
> + "VirtViewerApp",
> + VIRT_VIEWER_TYPE_APP,
> + G_PARAM_READWRITE |
> + G_PARAM_CONSTRUCT |
> + G_PARAM_STATIC_STRINGS));
> +
> g_signal_new("session-connected",
> G_OBJECT_CLASS_TYPE(object_class),
> G_SIGNAL_RUN_FIRST,
> @@ -408,6 +429,13 @@ void virt_viewer_session_smartcard_remove(VirtViewerSession *self)
> klass->smartcard_remove(self);
> }
>
> +VirtViewerApp* virt_viewer_session_get_app(VirtViewerSession *self)
> +{
> + g_return_val_if_fail(VIRT_VIEWER_IS_SESSION(self), NULL);
> +
> + return self->priv->app;
> +}
> +
> /*
> * Local variables:
> * c-indent-level: 4
> diff --git a/src/virt-viewer-session.h b/src/virt-viewer-session.h
> index c20f23d..c53c8b5 100644
> --- a/src/virt-viewer-session.h
> +++ b/src/virt-viewer-session.h
> @@ -26,6 +26,7 @@
>
> #include <gtk/gtk.h>
>
> +#include "virt-viewer-app.h"
> #include "virt-viewer-display.h"
>
> G_BEGIN_DECLS
> @@ -118,6 +119,7 @@ gboolean virt_viewer_session_has_usb(VirtViewerSession *self);
> void virt_viewer_session_usb_device_selection(VirtViewerSession *self, GtkWindow *parent);
> void virt_viewer_session_smartcard_insert(VirtViewerSession *self);
> void virt_viewer_session_smartcard_remove(VirtViewerSession *self);
> +VirtViewerApp* virt_viewer_session_get_app(VirtViewerSession *self);
>
> G_END_DECLS
>
> diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c
> index f539fb5..62b6052 100644
> --- a/src/virt-viewer-window.c
> +++ b/src/virt-viewer-window.c
> @@ -493,15 +493,17 @@ virt_viewer_window_enter_fullscreen(VirtViewerWindow *self, gboolean move, gint
> priv->before_saved = TRUE;
> }
>
> - if (!priv->fullscreen) {
> - gtk_check_menu_item_set_active(check, TRUE);
> - priv->fullscreen = TRUE;
> - gtk_widget_hide(menu);
> - gtk_widget_show(priv->toolbar);
> - ViewAutoDrawer_SetActive(VIEW_AUTODRAWER(priv->layout), TRUE);
> - ViewAutoDrawer_Close(VIEW_AUTODRAWER(priv->layout));
> - }
> + if (priv->fullscreen)
> + return;
> + priv->fullscreen = TRUE;
> +
> + gtk_check_menu_item_set_active(check, TRUE);
> + gtk_widget_hide(menu);
> + gtk_widget_show(priv->toolbar);
> + ViewAutoDrawer_SetActive(VIEW_AUTODRAWER(priv->layout), TRUE);
> + ViewAutoDrawer_Close(VIEW_AUTODRAWER(priv->layout));
>
> + /* g_debug("enter fullscreen move:%d %d+%d", move, x, y); */
> if (move)
> gtk_window_move(GTK_WINDOW(priv->window), x, y);
>
> --
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the virt-tools-list
mailing list