[Spice-devel] [PATCH 2/2] usb-device-widget: Add counter of free channels
Fabiano FidĂȘncio
fidencio at redhat.com
Tue Jan 19 13:36:38 PST 2016
As the message showed when the last usbredir channel is taken can be a
bit confusing, let's add a counter of free channels to the widget's
label.
In order to add the counter, two new helper functions got introduced
spice_usb_device_manager_get_{free,total}_channels().
Related: rhbz#1298772
---
src/map-file | 2 ++
src/spice-glib-sym-file | 2 ++
src/usb-device-manager.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++
src/usb-device-manager.h | 6 ++++++
src/usb-device-widget.c | 34 +++++++++++++++++++++++--------
5 files changed, 88 insertions(+), 8 deletions(-)
diff --git a/src/map-file b/src/map-file
index 62cdb51..babe0be 100644
--- a/src/map-file
+++ b/src/map-file
@@ -130,6 +130,8 @@ spice_usb_device_manager_disconnect_device;
spice_usb_device_manager_get;
spice_usb_device_manager_get_devices;
spice_usb_device_manager_get_devices_with_filter;
+spice_usb_device_manager_get_total_channels;
+spice_usb_device_manager_get_free_channels;
spice_usb_device_manager_get_type;
spice_usb_device_manager_is_device_connected;
spice_usb_device_widget_get_type;
diff --git a/src/spice-glib-sym-file b/src/spice-glib-sym-file
index ae365cd..784f50e 100644
--- a/src/spice-glib-sym-file
+++ b/src/spice-glib-sym-file
@@ -107,6 +107,8 @@ spice_usb_device_manager_disconnect_device
spice_usb_device_manager_get
spice_usb_device_manager_get_devices
spice_usb_device_manager_get_devices_with_filter
+spice_usb_device_manager_get_total_channels
+spice_usb_device_manager_get_free_channels
spice_usb_device_manager_get_type
spice_usb_device_manager_is_device_connected
spice_usbredir_channel_get_type
diff --git a/src/usb-device-manager.c b/src/usb-device-manager.c
index a22d926..21d3a25 100644
--- a/src/usb-device-manager.c
+++ b/src/usb-device-manager.c
@@ -1689,6 +1689,58 @@ spice_usb_device_manager_can_redirect_device(SpiceUsbDeviceManager *self,
}
/**
+ * spice_usb_device_manager_get_total_channels:
+ * @self: the #SpiceUsbDeviceManager manager
+ *
+ * Get the total number of redirecting channels.
+ *
+ * Returns: The total number of redirecting channels.
+ */
+int
+spice_usb_device_manager_get_total_channels(SpiceUsbDeviceManager *self)
+{
+#ifdef USE_USBREDIR
+ SpiceUsbDeviceManagerPrivate *priv = self->priv;
+
+ g_return_val_if_fail(SPICE_IS_USB_DEVICE_MANAGER(self), FALSE);
+
+ return priv->channels->len;
+#else
+ return 0;
+#endif
+}
+
+/**
+ * spice_usb_device_manager_get_total_channels:
+ * @self: the #SpiceUsbDeviceManager manager
+ *
+ * Get the number of redirecting channels that are available.
+ *
+ * Returns: The number of redirecting channels that are available.
+ */
+int
+spice_usb_device_manager_get_free_channels(SpiceUsbDeviceManager *self)
+{
+#ifdef USE_USBREDIR
+ SpiceUsbDeviceManagerPrivate *priv = self->priv;
+ int i, free_channels = 0;
+
+ g_return_val_if_fail(SPICE_IS_USB_DEVICE_MANAGER(self), FALSE);
+
+ for (i = 0; i < priv->channels->len; i++) {
+ SpiceUsbredirChannel *channel = g_ptr_array_index(priv->channels, i);
+
+ if (!spice_usbredir_channel_get_device(channel))
+ free_channels++;
+ }
+
+ return free_channels;
+#else
+ return 0;
+#endif
+}
+
+/**
* spice_usb_device_get_description:
* @device: #SpiceUsbDevice to get the description of
* @format: (allow-none): an optional printf() format string with
diff --git a/src/usb-device-manager.h b/src/usb-device-manager.h
index e05ebae..90fa413 100644
--- a/src/usb-device-manager.h
+++ b/src/usb-device-manager.h
@@ -127,6 +127,12 @@ spice_usb_device_manager_can_redirect_device(SpiceUsbDeviceManager *self,
SpiceUsbDevice *device,
GError **err);
+int
+spice_usb_device_manager_get_total_channels(SpiceUsbDeviceManager *self);
+
+int
+spice_usb_device_manager_get_free_channels(SpiceUsbDeviceManager *self);
+
G_END_DECLS
#endif /* __SPICE_USB_DEVICE_MANAGER_H__ */
diff --git a/src/usb-device-widget.c b/src/usb-device-widget.c
index 830bdce..fffee44 100644
--- a/src/usb-device-widget.c
+++ b/src/usb-device-widget.c
@@ -72,6 +72,7 @@ struct _SpiceUsbDeviceWidgetPrivate {
gchar *device_format_string;
SpiceUsbDeviceManager *manager;
GtkWidget *info_bar;
+ GtkWidget *label;
gchar *err_msg;
gsize device_count;
gboolean is_info_message;
@@ -182,8 +183,7 @@ static GObject *spice_usb_device_widget_constructor(
SpiceUsbDeviceWidgetPrivate *priv;
GPtrArray *devices = NULL;
GError *err = NULL;
- GtkWidget *label;
- gchar *str;
+ gchar *str, *markup_str;
int i;
{
@@ -198,12 +198,12 @@ static GObject *spice_usb_device_widget_constructor(
if (!priv->session)
g_error("SpiceUsbDeviceWidget constructed without a session");
- label = gtk_label_new(NULL);
- str = g_strdup_printf("<b>%s</b>", _("Select USB devices to redirect"));
- gtk_label_set_markup(GTK_LABEL (label), str);
- g_free(str);
- gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
- gtk_box_pack_start(GTK_BOX(self), label, FALSE, FALSE, 0);
+ priv->label = gtk_label_new(NULL);
+ markup_str = g_strdup_printf("<b>%s</b>", _("Select USB devices to redirect"));
+ gtk_label_set_markup(GTK_LABEL (priv->label), markup_str);
+ g_free(markup_str);
+ gtk_misc_set_alignment(GTK_MISC(priv->label), 0.0, 0.5);
+ gtk_box_pack_start(GTK_BOX(self), priv->label, FALSE, FALSE, 0);
priv->manager = spice_usb_device_manager_get(priv->session, &err);
if (err) {
@@ -214,6 +214,14 @@ static GObject *spice_usb_device_widget_constructor(
return obj;
}
+ str = g_strdup_printf(_("Select USB devices to redirect (%d of %d channels free)"),
+ spice_usb_device_manager_get_free_channels(priv->manager),
+ spice_usb_device_manager_get_total_channels(priv->manager));
+ markup_str = g_strdup_printf("<b>%s</b>", str);
+ gtk_label_set_markup(GTK_LABEL (priv->label), markup_str);
+ g_free(markup_str);
+ g_free(str);
+
g_signal_connect(priv->manager, "device-added",
G_CALLBACK(device_added_cb), self);
g_signal_connect(priv->manager, "device-removed",
@@ -469,6 +477,7 @@ static void checkbox_clicked_cb(GtkWidget *check, gpointer user_data)
SpiceUsbDeviceWidget *self = SPICE_USB_DEVICE_WIDGET(user_data);
SpiceUsbDeviceWidgetPrivate *priv = self->priv;
SpiceUsbDevice *device;
+ gchar *str, *markup_str;
device = g_object_get_data(G_OBJECT(check), "usb-device");
@@ -485,6 +494,15 @@ static void checkbox_clicked_cb(GtkWidget *check, gpointer user_data)
spice_usb_device_manager_disconnect_device(priv->manager,
device);
}
+
+ str = g_strdup_printf(_("Select USB devices to redirect (%d of %d channels free)"),
+ spice_usb_device_manager_get_free_channels(priv->manager),
+ spice_usb_device_manager_get_total_channels(priv->manager));
+ markup_str = g_strdup_printf("<b>%s</b>", str);
+ gtk_label_set_markup(GTK_LABEL (priv->label), markup_str);
+ g_free(markup_str);
+ g_free(str);
+
spice_usb_device_widget_update_status(self);
}
--
2.5.0
More information about the Spice-devel
mailing list