Signed-off-by: Hans de Goede <[email protected]>
---
 configure.ac                    |    2 +-
 src/virt-viewer-app.c           |    9 +++++++++
 src/virt-viewer-app.h           |    3 +++
 src/virt-viewer-session-spice.c |   39 +++++++++++++++++++++++++++++++++++----
 src/virt-viewer-session.c       |   13 +++++++++++++
 src/virt-viewer-session.h       |    4 ++++
 src/virt-viewer-window.c        |    9 +++++++++
 src/virt-viewer.xml             |   10 ++++++++++
 8 files changed, 84 insertions(+), 5 deletions(-)

diff --git a/configure.ac b/configure.ac
index a54f41b..ca4ff4c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -16,7 +16,7 @@ LIBVIRT_REQUIRED="0.6.0"
 GTK2_REQUIRED="2.12.0"
 GTK3_REQUIRED="3.0"
 GTK_VNC_REQUIRED="0.4.3"
-SPICE_GTK_REQUIRED="0.8"
+SPICE_GTK_REQUIRED="0.9"
 
 AC_PROG_CC
 AM_PROG_CC_C_O
diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c
index 5cdc186..d97ffa2 100644
--- a/src/virt-viewer-app.c
+++ b/src/virt-viewer-app.c
@@ -1609,6 +1609,15 @@ virt_viewer_app_get_windows(VirtViewerApp *self)
        return self->priv->windows;
 }
 
+void virt_viewer_app_usb_device_selection(VirtViewerApp   *self,
+                                         GtkWindow       *parent)
+{
+       g_return_if_fail(VIRT_VIEWER_IS_APP(self));
+       g_return_if_fail(self->priv->session != NULL);
+
+       virt_viewer_session_usb_device_selection(self->priv->session, parent);
+}
+
 /*
  * Local variables:
  *  c-indent-level: 8
diff --git a/src/virt-viewer-app.h b/src/virt-viewer-app.h
index 7280873..3170dae 100644
--- a/src/virt-viewer-app.h
+++ b/src/virt-viewer-app.h
@@ -91,6 +91,9 @@ void virt_viewer_app_show_status(VirtViewerApp *self, const 
gchar *fmt, ...);
 void virt_viewer_app_show_display(VirtViewerApp *self);
 GHashTable* virt_viewer_app_get_windows(VirtViewerApp *self);
 
+void virt_viewer_app_usb_device_selection(VirtViewerApp   *self,
+                                         GtkWindow       *parent);
+
 G_END_DECLS
 
 #endif /* VIRT_VIEWER_APP_H */
diff --git a/src/virt-viewer-session-spice.c b/src/virt-viewer-session-spice.c
index dccfbbc..9832a4b 100644
--- a/src/virt-viewer-session-spice.c
+++ b/src/virt-viewer-session-spice.c
@@ -26,6 +26,7 @@
 #include <glib/gi18n.h>
 
 #include <spice-option.h>
+#include <usb-device-widget.h>
 #include "virt-viewer-util.h"
 #include "virt-viewer-session-spice.h"
 #include "virt-viewer-display-spice.h"
@@ -53,6 +54,7 @@ static gboolean 
virt_viewer_session_spice_open_fd(VirtViewerSession *session, in
 static gboolean virt_viewer_session_spice_open_host(VirtViewerSession 
*session, char *host, char *port);
 static gboolean virt_viewer_session_spice_open_uri(VirtViewerSession *session, 
char *uri);
 static gboolean virt_viewer_session_spice_channel_open_fd(VirtViewerSession 
*session, VirtViewerSessionChannel *channel, int fd);
+static void virt_viewer_session_spice_usb_device_selection(VirtViewerSession 
*session, GtkWindow *parent);
 static void virt_viewer_session_spice_channel_new(SpiceSession *s,
                                                  SpiceChannel *channel,
                                                  VirtViewerSession *session);
@@ -118,6 +120,7 @@ 
virt_viewer_session_spice_class_init(VirtViewerSessionSpiceClass *klass)
        dclass->open_host = virt_viewer_session_spice_open_host;
        dclass->open_uri = virt_viewer_session_spice_open_uri;
        dclass->channel_open_fd = virt_viewer_session_spice_channel_open_fd;
+       dclass->usb_device_selection = 
virt_viewer_session_spice_usb_device_selection;
 
        g_type_class_add_private(klass, sizeof(VirtViewerSessionSpicePrivate));
 
@@ -138,9 +141,9 @@ virt_viewer_session_spice_init(VirtViewerSessionSpice *self 
G_GNUC_UNUSED)
 }
 
 static void
-usb_auto_connect_failed(SpiceUsbDeviceManager *manager G_GNUC_UNUSED,
-                       SpiceUsbDevice *device G_GNUC_UNUSED,
-                       GError *error, VirtViewerSessionSpice *self)
+usb_connect_failed(GObject *object G_GNUC_UNUSED,
+                  SpiceUsbDevice *device G_GNUC_UNUSED,
+                  GError *error, VirtViewerSessionSpice *self)
 {
        if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
                return;
@@ -170,7 +173,7 @@ create_spice_session(VirtViewerSessionSpice *self)
        manager = spice_usb_device_manager_get(self->priv->session, NULL);
        if (manager)
                g_signal_connect(manager, "auto-connect-failed",
-                                G_CALLBACK(usb_auto_connect_failed), self);
+                                G_CALLBACK(usb_connect_failed), self);
 
        g_object_bind_property(self, "auto-usbredir",
                               self->priv->gtk_session, "auto-usbredir",
@@ -307,6 +310,34 @@ virt_viewer_session_spice_main_channel_event(SpiceChannel 
*channel G_GNUC_UNUSED
        g_free(password);
 }
 
+static void
+virt_viewer_session_spice_usb_device_selection(VirtViewerSession *session,
+                                              GtkWindow *parent)
+{
+       VirtViewerSessionSpice *self = VIRT_VIEWER_SESSION_SPICE(session);
+       VirtViewerSessionSpicePrivate *priv = self->priv;
+       GtkWidget *dialog, *area, *usb_device_widget;
+
+       /* Create the widgets */
+       dialog = gtk_dialog_new_with_buttons(
+                   _("Select USB devices for redirection"), parent,
+                   GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+                   GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
+                   NULL);
+       gtk_dialog_set_default_response(GTK_DIALOG(dialog), 
GTK_RESPONSE_ACCEPT);
+       area = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
+
+       usb_device_widget = spice_usb_device_widget_new(priv->session,
+                                                       "%s %s");
+       g_signal_connect(usb_device_widget, "connect-failed",
+                        G_CALLBACK(usb_connect_failed), self);
+       gtk_box_pack_start(GTK_BOX(area), usb_device_widget, TRUE, TRUE, 5);
+
+       /* show and run */
+       gtk_widget_show_all(dialog);
+       gtk_dialog_run(GTK_DIALOG(dialog));
+       gtk_widget_destroy(dialog);
+}
 
 static void
 virt_viewer_session_spice_channel_new(SpiceSession *s,
diff --git a/src/virt-viewer-session.c b/src/virt-viewer-session.c
index e115fff..8fb4646 100644
--- a/src/virt-viewer-session.c
+++ b/src/virt-viewer-session.c
@@ -352,6 +352,19 @@ gboolean 
virt_viewer_session_get_auto_usbredir(VirtViewerSession *self)
        return self->priv->auto_usbredir;
 }
 
+void virt_viewer_session_usb_device_selection(VirtViewerSession   *self,
+                                             GtkWindow           *parent)
+{
+       VirtViewerSessionClass *klass;
+
+       g_return_if_fail(VIRT_VIEWER_IS_SESSION(self));
+
+       klass = VIRT_VIEWER_SESSION_GET_CLASS(self);
+       g_return_if_fail(klass->usb_device_selection != NULL);
+
+       klass->usb_device_selection(self, parent);
+}
+
 /*
  * Local variables:
  *  c-indent-level: 8
diff --git a/src/virt-viewer-session.h b/src/virt-viewer-session.h
index 80ef372..565ff31 100644
--- a/src/virt-viewer-session.h
+++ b/src/virt-viewer-session.h
@@ -70,6 +70,7 @@ struct _VirtViewerSessionClass {
        gboolean (* open_host) (VirtViewerSession* session, char *host, char 
*port);
        gboolean (* open_uri) (VirtViewerSession* session, char *uri);
        gboolean (* channel_open_fd) (VirtViewerSession* session, 
VirtViewerSessionChannel *channel, int fd);
+       void (* usb_device_selection) (VirtViewerSession* session, GtkWindow 
*parent);
 
        /* signals */
        void (*session_connected)(VirtViewerSession *session);
@@ -112,6 +113,9 @@ 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);
 
+void virt_viewer_session_usb_device_selection(VirtViewerSession   *self,
+                                             GtkWindow           *parent);
+
 G_END_DECLS
 
 #endif /* _VIRT_VIEWER_SESSION_H */
diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c
index d80b456..555bdae 100644
--- a/src/virt-viewer-window.c
+++ b/src/virt-viewer-window.c
@@ -51,6 +51,7 @@ void virt_viewer_window_menu_view_fullscreen(GtkWidget *menu, 
VirtViewerWindow *
 void virt_viewer_window_menu_view_resize(GtkWidget *menu, VirtViewerWindow 
*self);
 void virt_viewer_window_menu_send(GtkWidget *menu, VirtViewerWindow *self);
 void virt_viewer_window_menu_file_screenshot(GtkWidget *menu, VirtViewerWindow 
*self);
+void virt_viewer_window_menu_file_usb_device_selection(GtkWidget *menu, 
VirtViewerWindow *self);
 
 /* Internal methods */
 static void virt_viewer_window_enable_modifiers(VirtViewerWindow *self);
@@ -726,6 +727,14 @@ virt_viewer_window_menu_file_screenshot(GtkWidget *menu 
G_GNUC_UNUSED,
 }
 
 G_MODULE_EXPORT void
+virt_viewer_window_menu_file_usb_device_selection(GtkWidget *menu 
G_GNUC_UNUSED,
+                                                 VirtViewerWindow *self)
+{
+       virt_viewer_app_usb_device_selection(self->priv->app,
+                                            GTK_WINDOW(self->priv->window));
+}
+
+G_MODULE_EXPORT void
 virt_viewer_window_menu_help_about(GtkWidget *menu G_GNUC_UNUSED,
                                   VirtViewerWindow *self)
 {
diff --git a/src/virt-viewer.xml b/src/virt-viewer.xml
index b701c2c..d9c1334 100644
--- a/src/virt-viewer.xml
+++ b/src/virt-viewer.xml
@@ -36,6 +36,16 @@
                       </object>
                     </child>
                     <child>
+                      <object class="GtkMenuItem" 
id="menu-file-usb-device-selection">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="use_action_appearance">False</property>
+                        <property name="label" translatable="yes">USB device 
selection</property>
+                        <property name="use_underline">True</property>
+                        <signal name="activate" 
handler="virt_viewer_window_menu_file_usb_device_selection" swapped="no"/>
+                      </object>
+                    </child>
+                    <child>
                       <object class="GtkSeparatorMenuItem" 
id="separatormenuitem1">
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
-- 
1.7.7.6

_______________________________________________
virt-tools-list mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/virt-tools-list

Reply via email to