[Spice-devel] [PATCH spice-gtk 3/3] Make auto-usbredir a session setting rather then a per display setting
Hans de Goede
hdegoede at redhat.com
Fri Oct 7 05:24:56 PDT 2011
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.
+ *
+ **/
g_object_class_install_property
(gobject_class, PROP_AUTO_USBREDIR,
g_param_spec_boolean("auto-usbredir",
--
1.7.6.4
More information about the Spice-devel
mailing list