[Spice-devel] [PATCH spice-gtk 3/3] Make auto-usbredir a session setting rather then a per display setting
Marc-André Lureau
mlureau at redhat.com
Fri Oct 7 05:39:22 PDT 2011
----- Original Message -----
> Signed-off-by: Hans de Goede <hdegoede at redhat.com>
> ---
> gtk/spice-gtk-session.c | 54
> ++++++++++++++++++++++++++++++++++++++++++++++-
> gtk/spice-widget-priv.h | 1 -
> gtk/spice-widget.c | 40 +++++++++++++++-------------------
> 3 files changed, 71 insertions(+), 24 deletions(-)
>
> diff --git a/gtk/spice-gtk-session.c b/gtk/spice-gtk-session.c
> index d3cdd7d..35c01c8 100644
> --- a/gtk/spice-gtk-session.c
> +++ b/gtk/spice-gtk-session.c
> @@ -20,13 +20,15 @@
> #include <spice/vd_agent.h>
> #include "spice-common.h"
> #include "spice-gtk-session.h"
> +#include "spice-gtk-session-priv.h"
>
> #define CLIPBOARD_LAST (VD_AGENT_CLIPBOARD_SELECTION_SECONDARY + 1)
>
> struct _SpiceGtkSessionPrivate {
> SpiceSession *session;
> - SpiceMainChannel *main;
> + /* Clipboard related */
> gboolean auto_clipboard_enable;
> + SpiceMainChannel *main;
> GtkClipboard *clipboard;
> GtkClipboard *clipboard_primary;
> GtkTargetEntry *clip_targets[CLIPBOARD_LAST];
> @@ -35,6 +37,9 @@ struct _SpiceGtkSessionPrivate {
> gboolean clip_grabbed[CLIPBOARD_LAST];
> gboolean clipboard_by_guest[CLIPBOARD_LAST];
> gboolean
> clipboard_selfgrab_pending[CLIPBOARD_LAST];
> + /* auto-usbredir related */
> + gboolean auto_usbredir_enable;
> + gboolean keyboard_focus;
> };
>
> /**
> @@ -88,6 +93,7 @@ enum {
> PROP_0,
> PROP_SESSION,
> PROP_AUTO_CLIPBOARD,
> + PROP_AUTO_USBREDIR,
> };
>
> static void spice_gtk_session_init(SpiceGtkSession *self)
> @@ -205,6 +211,9 @@ static void
> spice_gtk_session_get_property(GObject *gobject,
> case PROP_AUTO_CLIPBOARD:
> g_value_set_boolean(value, s->auto_clipboard_enable);
> break;
> + case PROP_AUTO_USBREDIR:
> + g_value_set_boolean(value, s->auto_usbredir_enable);
> + break;
> default:
> G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, pspec);
> break;
> @@ -226,6 +235,10 @@ static void
> spice_gtk_session_set_property(GObject *gobject,
> case PROP_AUTO_CLIPBOARD:
> s->auto_clipboard_enable = g_value_get_boolean(value);
> break;
> + case PROP_AUTO_USBREDIR:
> + s->auto_usbredir_enable = g_value_get_boolean(value);
> + spice_gtk_session_update_keyboard_focus(self,
> s->keyboard_focus);
> + break;
> default:
> G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, pspec);
> break;
> @@ -275,6 +288,25 @@ static void
> spice_gtk_session_class_init(SpiceGtkSessionClass *klass)
> G_PARAM_CONSTRUCT |
> G_PARAM_STATIC_STRINGS));
>
> + /**
> + * SpiceGtkSession:auto-usbredir:
> + *
> + * Automatically redirect newly plugged in USB devices. Note the
> auto
> + * redirection only happens when a #SpiceDisplay associated with
> the
> + * session had keyboard focus.
> + *
> + **/
> + g_object_class_install_property
> + (gobject_class, PROP_AUTO_USBREDIR,
> + g_param_spec_boolean("auto-usbredir",
> + "Auto USB Redirection",
> + "Automatically redirect newly plugged
> in USB"
> + "Devices to the guest.",
> + TRUE,
> + G_PARAM_READWRITE |
> + G_PARAM_CONSTRUCT |
> + G_PARAM_STATIC_STRINGS));
> +
> g_type_class_add_private(klass, sizeof(SpiceGtkSessionPrivate));
> }
>
> @@ -727,6 +759,26 @@ static void channel_destroy(SpiceSession
> *session, SpiceChannel *channel,
> }
> }
>
> +/* ----------------------------------------------------------------
> */
> +/* private functions (usbredir related)
> */
> +void spice_gtk_session_update_keyboard_focus(SpiceGtkSession *self,
> + gboolean state)
> +{
> + SpiceGtkSessionPrivate *s = SPICE_GTK_SESSION_GET_PRIVATE(self);
> + SpiceUsbDeviceManager *manager;
> + gboolean auto_connect = FALSE;
> +
> + s->keyboard_focus = state;
> +
> + if (s->auto_usbredir_enable && s->keyboard_focus)
> + auto_connect = TRUE;
> +
> + manager = spice_usb_device_manager_get(s->session, NULL, NULL);
> + if (manager) {
> + g_object_set(manager, "auto-connect", auto_connect, NULL);
> + }
> +}
> +
> /*
> ------------------------------------------------------------------
> */
> /* public functions
> */
>
> diff --git a/gtk/spice-widget-priv.h b/gtk/spice-widget-priv.h
> index f94c8c6..a5791a4 100644
> --- a/gtk/spice-widget-priv.h
> +++ b/gtk/spice-widget-priv.h
> @@ -48,7 +48,6 @@ struct _SpiceDisplayPrivate {
> bool keyboard_grab_enable;
> bool mouse_grab_enable;
> bool resize_guest_enable;
> - bool auto_usbredir_enable;
>
> /* state */
> enum SpiceSurfaceFmt format;
> diff --git a/gtk/spice-widget.c b/gtk/spice-widget.c
> index 06e5113..e1483fd 100644
> --- a/gtk/spice-widget.c
> +++ b/gtk/spice-widget.c
> @@ -32,6 +32,7 @@
>
> #include "spice-widget.h"
> #include "spice-widget-priv.h"
> +#include "spice-gtk-session-priv.h"
> #include "vncdisplaykeymap.h"
>
> /* Some compatibility defines to let us build on both Gtk2 and Gtk3
> */
> @@ -118,7 +119,6 @@ static void disconnect_display(SpiceDisplay
> *display);
> static void channel_new(SpiceSession *s, SpiceChannel *channel,
> gpointer data);
> static void channel_destroy(SpiceSession *s, SpiceChannel *channel,
> gpointer data);
> static void sync_keyboard_lock_modifiers(SpiceDisplay *display);
> -static void update_auto_usbredir(SpiceDisplay *display);
>
> /* ----------------------------------------------------------------
> */
>
> @@ -152,7 +152,8 @@ static void spice_display_get_property(GObject
> *object,
> g_value_set_boolean(value, boolean);
> break;
> case PROP_AUTO_USBREDIR:
> - g_value_set_boolean(value, d->auto_usbredir_enable);
> + g_object_get(d->gtk_session, "auto-usbredir", &boolean,
> NULL);
> + g_value_set_boolean(value, boolean);
> break;
> case PROP_SCALING:
> g_value_set_boolean(value, d->allow_scaling);
> @@ -217,8 +218,8 @@ static void spice_display_set_property(GObject
> *object,
> g_value_get_boolean(value), NULL);
> break;
> case PROP_AUTO_USBREDIR:
> - d->auto_usbredir_enable = g_value_get_boolean(value);
> - update_auto_usbredir(display);
> + g_object_set(d->gtk_session, "auto-usbredir",
> + g_value_get_boolean(value), NULL);
> break;
> default:
> G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
> @@ -340,6 +341,8 @@ spice_display_constructor(GType
> gtype,
>
> g_signal_connect(d->gtk_session, "notify::auto-clipboard",
> G_CALLBACK(gtk_session_property_changed),
> display);
> + g_signal_connect(d->gtk_session, "notify::auto-usbredir",
> + G_CALLBACK(gtk_session_property_changed),
> display);
>
> return obj;
> }
> @@ -621,22 +624,6 @@ static void recalc_geometry(GtkWidget *widget,
> gboolean set_display)
> }
> }
>
> -static void update_auto_usbredir(SpiceDisplay *display)
> -{
> - SpiceDisplayPrivate *d = SPICE_DISPLAY_GET_PRIVATE(display);
> - SpiceUsbDeviceManager *manager;
> - gboolean auto_connect = FALSE;
> -
> - if (d->auto_usbredir_enable && d->keyboard_have_focus)
> - auto_connect = TRUE;
> -
> - /* FIXME: allow specifying a different GMainContext then the
> default */
> - manager = spice_usb_device_manager_get(d->session, NULL /* FIXME
> */, NULL);
> - if (manager) {
> - g_object_set(manager, "auto-connect", auto_connect, NULL);
> - }
> -}
> -
> /* ----------------------------------------------------------------
> */
>
> #define CONVERT_0565_TO_0888(s)
> \
> @@ -922,7 +909,8 @@ static gboolean focus_in_event(GtkWidget *widget,
> GdkEventFocus *focus G_GNUC_UN
> sync_keyboard_lock_modifiers(display);
> d->keyboard_have_focus = true;
> try_keyboard_grab(display);
> - update_auto_usbredir(display);
> + spice_gtk_session_update_keyboard_focus(d->gtk_session,
> + d->keyboard_have_focus);
> #ifdef WIN32
> focus_window = GDK_WINDOW_HWND(gtk_widget_get_window(widget));
> g_return_val_if_fail(focus_window != NULL, true);
> @@ -946,7 +934,8 @@ static gboolean focus_out_event(GtkWidget
> *widget, GdkEventFocus *focus G_GNUC_U
>
> release_keys(display);
> d->keyboard_have_focus = false;
> - update_auto_usbredir(display);
> + spice_gtk_session_update_keyboard_focus(d->gtk_session,
> + d->keyboard_have_focus);
> return true;
> }
>
> @@ -1234,6 +1223,13 @@ static void
> spice_display_class_init(SpiceDisplayClass *klass)
> G_PARAM_CONSTRUCT |
> G_PARAM_STATIC_STRINGS));
>
> + /**
> + * SpiceDisplay:auto-usbredir:
> + *
> + * Automatically redirect newly plugged in USB devices. Note the
> auto
> + * redirection only happens when the widget has keyboard focus.
> + *
> + **/
Can you also mark it as getting deprecated, and gtksession should be used instead?
ack otherwise
thanks
> g_object_class_install_property
> (gobject_class, PROP_AUTO_USBREDIR,
> g_param_spec_boolean("auto-usbredir",
> --
> 1.7.6.4
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
>
More information about the Spice-devel
mailing list