Only make the USB device selection sensitive when the vm is USB capable

This commit is contained in:
Hans de Goede 2012-02-06 12:30:27 +00:00 committed by Daniel P. Berrange
parent b272e08541
commit c67a8cfdbe
7 changed files with 62 additions and 0 deletions

View File

@ -449,6 +449,21 @@ virt_viewer_app_update_title(VirtViewerApp *self)
g_hash_table_foreach(self->priv->windows, update_title, NULL);
}
static void set_usb_options_sensitive(gpointer key G_GNUC_UNUSED,
gpointer value,
gpointer user_data)
{
virt_viewer_window_set_usb_options_sensitive(
VIRT_VIEWER_WINDOW(value), GPOINTER_TO_INT(user_data));
}
static void
virt_viewer_app_set_usb_options_sensitive(VirtViewerApp *self, gboolean sensitive)
{
g_hash_table_foreach(self->priv->windows, set_usb_options_sensitive,
GINT_TO_POINTER(sensitive));
}
static VirtViewerWindow *
virt_viewer_app_get_nth_window(VirtViewerApp *self, gint nth)
{
@ -981,7 +996,10 @@ static void
virt_viewer_app_initialized(VirtViewerSession *session G_GNUC_UNUSED,
VirtViewerApp *self)
{
gboolean has_usb = virt_viewer_session_has_usb(self->priv->session);
virt_viewer_app_update_title(self);
virt_viewer_app_set_usb_options_sensitive(self, has_usb);
}
static void
@ -995,6 +1013,7 @@ virt_viewer_app_disconnected(VirtViewerSession *session G_GNUC_UNUSED,
_("Unable to connect to the graphic server %s"),
priv->pretty_address);
}
virt_viewer_app_set_usb_options_sensitive(self, FALSE);
virt_viewer_app_deactivate(self);
}

View File

@ -54,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 gboolean virt_viewer_session_spice_has_usb(VirtViewerSession *session);
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,
@ -120,6 +121,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->has_usb = virt_viewer_session_spice_has_usb;
dclass->usb_device_selection = virt_viewer_session_spice_usb_device_selection;
g_type_class_add_private(klass, sizeof(VirtViewerSessionSpicePrivate));
@ -310,6 +312,17 @@ virt_viewer_session_spice_main_channel_event(SpiceChannel *channel G_GNUC_UNUSED
g_free(password);
}
static gboolean
virt_viewer_session_spice_has_usb(VirtViewerSession *session)
{
VirtViewerSessionSpice *self = VIRT_VIEWER_SESSION_SPICE(session);
VirtViewerSessionSpicePrivate *priv = self->priv;
return spice_usb_device_manager_get(priv->session, NULL) &&
spice_session_has_channel_type(priv->session,
SPICE_CHANNEL_USBREDIR);
}
static void
virt_viewer_session_spice_usb_device_selection(VirtViewerSession *session,
GtkWindow *parent)

View File

@ -352,6 +352,19 @@ gboolean virt_viewer_session_get_auto_usbredir(VirtViewerSession *self)
return self->priv->auto_usbredir;
}
gboolean virt_viewer_session_has_usb(VirtViewerSession *self)
{
VirtViewerSessionClass *klass;
g_return_val_if_fail(VIRT_VIEWER_IS_SESSION(self), FALSE);
klass = VIRT_VIEWER_SESSION_GET_CLASS(self);
if (klass->has_usb == NULL)
return FALSE;
return klass->has_usb(self);
}
void virt_viewer_session_usb_device_selection(VirtViewerSession *self,
GtkWindow *parent)
{

View File

@ -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);
gboolean (* has_usb) (VirtViewerSession* session);
void (* usb_device_selection) (VirtViewerSession* session, GtkWindow *parent);
/* signals */
@ -113,6 +114,7 @@ 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);
gboolean virt_viewer_session_has_usb(VirtViewerSession *self);
void virt_viewer_session_usb_device_selection(VirtViewerSession *self,
GtkWindow *parent);

View File

@ -866,6 +866,19 @@ virt_viewer_window_update_title(VirtViewerWindow *self)
g_free(title);
}
void
virt_viewer_window_set_usb_options_sensitive(VirtViewerWindow *self, gboolean sensitive)
{
VirtViewerWindowPrivate *priv;
GtkWidget *menu;
g_return_if_fail(VIRT_VIEWER_IS_WINDOW(self));
priv = self->priv;
menu = GTK_WIDGET(gtk_builder_get_object(priv->builder, "menu-file-usb-device-selection"));
gtk_widget_set_sensitive(menu, sensitive);
}
void
virt_viewer_window_set_display(VirtViewerWindow *self, VirtViewerDisplay *display)
{

View File

@ -63,6 +63,7 @@ GType virt_viewer_window_get_type (void);
GtkWindow* virt_viewer_window_get_window (VirtViewerWindow* window);
VirtViewerNotebook* virt_viewer_window_get_notebook (VirtViewerWindow* window);
void virt_viewer_window_set_display(VirtViewerWindow *self, VirtViewerDisplay *display);
void virt_viewer_window_set_usb_options_sensitive(VirtViewerWindow *self, gboolean sensitive);
void virt_viewer_window_update_title(VirtViewerWindow *self);
void virt_viewer_window_set_zoom_level(VirtViewerWindow *self, gint zoom_level);
gint virt_viewer_window_get_zoom_level(VirtViewerWindow *self);

View File

@ -38,6 +38,7 @@
<child>
<object class="GtkMenuItem" id="menu-file-usb-device-selection">
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">False</property>
<property name="use_action_appearance">False</property>
<property name="label" translatable="yes">USB device selection</property>