[Spice-devel] [PATCH spice-gtk 7/7] Make auto-usbredir a session setting rather then a per display setting

Hans de Goede hdegoede at redhat.com
Mon Oct 10 05:34:44 PDT 2011


Signed-off-by: Hans de Goede <hdegoede at redhat.com>
---
 gtk/spice-gtk-session.c |   55 ++++++++++++++++++++++++++++++++++++++++++++++-
 gtk/spice-widget-priv.h |    1 -
 gtk/spice-widget.c      |   43 ++++--------------------------------
 gtk/spicy.c             |    6 ++--
 4 files changed, 62 insertions(+), 43 deletions(-)

diff --git a/gtk/spice-gtk-session.c b/gtk/spice-gtk-session.c
index acc69f1..0c95e4f 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;
 };
 
 /**
@@ -85,6 +90,7 @@ enum {
     PROP_0,
     PROP_SESSION,
     PROP_AUTO_CLIPBOARD,
+    PROP_AUTO_USBREDIR,
 };
 
 static void spice_gtk_session_init(SpiceGtkSession *self)
@@ -202,6 +208,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;
@@ -223,6 +232,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,26 @@ 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.
+     *
+     * Since: 0.10
+     **/
+    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.",
+                              FALSE,
+                              G_PARAM_READWRITE |
+                              G_PARAM_CONSTRUCT |
+                              G_PARAM_STATIC_STRINGS));
+
     g_type_class_add_private(klass, sizeof(SpiceGtkSessionPrivate));
 }
 
@@ -727,6 +760,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 c38da84..da3f42c 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 */
@@ -84,7 +85,6 @@ enum {
     PROP_MOUSE_GRAB,
     PROP_RESIZE_GUEST,
     PROP_AUTO_CLIPBOARD,
-    PROP_AUTO_USBREDIR,
     PROP_SCALING,
 };
 
@@ -113,7 +113,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);
 
 /* ---------------------------------------------------------------- */
 
@@ -146,9 +145,6 @@ static void spice_display_get_property(GObject    *object,
         g_object_get(d->gtk_session, "auto-clipboard", &boolean, NULL);
         g_value_set_boolean(value, boolean);
         break;
-    case PROP_AUTO_USBREDIR:
-        g_value_set_boolean(value, d->auto_usbredir_enable);
-        break;
     case PROP_SCALING:
         g_value_set_boolean(value, d->allow_scaling);
 	break;
@@ -211,10 +207,6 @@ static void spice_display_set_property(GObject      *object,
         g_object_set(d->gtk_session, "auto-clipboard",
                      g_value_get_boolean(value), NULL);
         break;
-    case PROP_AUTO_USBREDIR:
-        d->auto_usbredir_enable = g_value_get_boolean(value);
-        update_auto_usbredir(display);
-        break;
     default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
         break;
@@ -616,22 +608,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)                                         \
@@ -917,7 +893,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);
@@ -941,7 +918,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;
 }
 
@@ -1232,17 +1210,6 @@ static void spice_display_class_init(SpiceDisplayClass *klass)
                               G_PARAM_STATIC_STRINGS));
 
     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_object_class_install_property
         (gobject_class, PROP_SCALING,
          g_param_spec_boolean("scaling", "Scaling",
                               "Whether we should use scaling",
diff --git a/gtk/spicy.c b/gtk/spicy.c
index 3034dbb..e837414 100644
--- a/gtk/spicy.c
+++ b/gtk/spicy.c
@@ -721,13 +721,13 @@ static const char *spice_display_properties[] = {
     "grab-mouse",
     "resize-guest",
     "scaling",
-#ifdef USE_USBREDIR
-    "auto-usbredir",
-#endif
 };
 
 static const char *spice_gtk_session_properties[] = {
     "auto-clipboard",
+#ifdef USE_USBREDIR
+    "auto-usbredir",
+#endif
 };
 
 static const GtkToggleActionEntry tentries[] = {
-- 
1.7.6.4



More information about the Spice-devel mailing list