--- src/virt-viewer-session-spice.c | 4 ++ src/virt-viewer-session.c | 89 +++++++++++++++++++++++++++++++++++--- src/virt-viewer-session.h | 3 + 3 files changed, 89 insertions(+), 7 deletions(-) diff --git a/src/virt-viewer-session-spice.c b/src/virt-viewer-session-spice.c index 0f1d387..e3b0dbc 100644 --- a/src/virt-viewer-session-spice.c +++ b/src/virt-viewer-session-spice.c @@ -171,6 +171,10 @@ create_spice_session(VirtViewerSessionSpice *self) if (manager) g_signal_connect(manager, "auto-connect-failed", G_CALLBACK(usb_auto_connect_failed), self); + + g_object_bind_property(self, "auto-usbredir", + self->priv->gtk_session, "auto-usbredir", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); } static void diff --git a/src/virt-viewer-session.c b/src/virt-viewer-session.c index c794c0b..1017d98 100644 --- a/src/virt-viewer-session.c +++ b/src/virt-viewer-session.c @@ -35,10 +35,18 @@ struct _VirtViewerSessionPrivate { GList *displays; + + gboolean auto_usbredir; }; G_DEFINE_ABSTRACT_TYPE(VirtViewerSession, virt_viewer_session, G_TYPE_OBJECT) +enum { + PROP_0, + + PROP_AUTO_USBREDIR, +}; + static void virt_viewer_session_finalize(GObject *obj) { @@ -55,12 +63,60 @@ virt_viewer_session_finalize(GObject *obj) } static void +virt_viewer_session_set_property(GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + VirtViewerSession *self = VIRT_VIEWER_SESSION(object); + + switch (prop_id) { + case PROP_AUTO_USBREDIR: + virt_viewer_session_set_auto_usbredir(self, g_value_get_boolean(value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); + break; + } +} + +static void +virt_viewer_session_get_property(GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + VirtViewerSession *self = VIRT_VIEWER_SESSION(object); + + switch (prop_id) { + case PROP_AUTO_USBREDIR: + g_value_set_boolean(value, virt_viewer_session_get_auto_usbredir(self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); + break; + } +} + +static void virt_viewer_session_class_init(VirtViewerSessionClass *class) { GObjectClass *object_class = G_OBJECT_CLASS(class); + object_class->set_property = virt_viewer_session_set_property; + object_class->get_property = virt_viewer_session_get_property; object_class->finalize = virt_viewer_session_finalize; + g_object_class_install_property(object_class, + PROP_AUTO_USBREDIR, + g_param_spec_boolean("auto-usbredir", + "USB redirection", + "USB redirection", + TRUE, + 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, @@ -241,24 +297,24 @@ gboolean virt_viewer_session_open_fd(VirtViewerSession *session, int fd) gboolean virt_viewer_session_open_host(VirtViewerSession *session, char *host, char *port) { - VirtViewerSessionClass *klass; + VirtViewerSessionClass *klass; g_return_val_if_fail(VIRT_VIEWER_IS_SESSION(session), FALSE); klass = VIRT_VIEWER_SESSION_GET_CLASS(session); - return klass->open_host(session, host, port); + return klass->open_host(session, host, port); } gboolean virt_viewer_session_open_uri(VirtViewerSession *session, gchar *uri) { - VirtViewerSessionClass *klass; + VirtViewerSessionClass *klass; - g_return_val_if_fail(VIRT_VIEWER_IS_SESSION(session), FALSE); + g_return_val_if_fail(VIRT_VIEWER_IS_SESSION(session), FALSE); - klass = VIRT_VIEWER_SESSION_GET_CLASS(session); - g_return_val_if_fail(klass->open_uri != NULL, FALSE); + klass = VIRT_VIEWER_SESSION_GET_CLASS(session); + g_return_val_if_fail(klass->open_uri != NULL, FALSE); - return klass->open_uri(session, uri); + return klass->open_uri(session, uri); } gboolean virt_viewer_session_channel_open_fd(VirtViewerSession *session, @@ -269,10 +325,29 @@ gboolean virt_viewer_session_channel_open_fd(VirtViewerSession *session, return VIRT_VIEWER_SESSION_GET_CLASS(session)->channel_open_fd(session, channel, fd); } +void virt_viewer_session_set_auto_usbredir(VirtViewerSession *self, gboolean auto_usbredir) +{ + g_return_if_fail(VIRT_VIEWER_IS_SESSION(self)); + + if (self->priv->auto_usbredir == auto_usbredir) + return; + + self->priv->auto_usbredir = auto_usbredir; + g_object_notify(G_OBJECT(self), "auto-usbredir"); +} + +gboolean virt_viewer_session_get_auto_usbredir(VirtViewerSession *self) +{ + g_return_val_if_fail(VIRT_VIEWER_IS_SESSION(self), FALSE); + + return self->priv->auto_usbredir; +} + /* * Local variables: * c-indent-level: 8 * c-basic-offset: 8 + * indent-tabs-mode: t * tab-width: 8 * End: */ diff --git a/src/virt-viewer-session.h b/src/virt-viewer-session.h index 2856b5c..2bfafe0 100644 --- a/src/virt-viewer-session.h +++ b/src/virt-viewer-session.h @@ -108,6 +108,9 @@ gboolean virt_viewer_session_channel_open_fd(VirtViewerSession* session, VirtViewerSessionChannel* channel, int fd); gboolean virt_viewer_session_open_uri(VirtViewerSession *session, gchar *uri); +void virt_viewer_session_set_auto_usbredir(VirtViewerSession* session, gboolean auto_usbredir); +gboolean virt_viewer_session_get_auto_usbredir(VirtViewerSession* session); + G_END_DECLS #endif /* _VIRT_VIEWER_SESSION_H */ -- 1.7.7.6