[Spice-devel] [PATCH spice-gtk 4/4] Make auto-usbredir a session setting rather then a per display setting
Hans de Goede
hdegoede at redhat.com
Mon Oct 10 07:35:12 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 c7f9be7..7e958e5 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.8
+ **/
+ 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 15a2b61..afe030d 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;
}
@@ -1231,17 +1209,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