On Fri, Jan 22, 2016 at 7:52 AM, Pavel Grunt <pgrunt@xxxxxxxxxx> wrote: > Hi, > > On Thu, 2016-01-21 at 22:35 +0100, Fabiano Fidêncio wrote: >> 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, a new property for SpiceUsbDeviceManager >> was introduced ("free-channels"). >> >> Related: rhbz#1298772 >> --- >> src/usb-device-manager.c | 28 ++++++++++++++++++++++++++++ >> src/usb-device-widget.c | 23 ++++++++++++++++++----- >> 2 files changed, 46 insertions(+), 5 deletions(-) >> >> diff --git a/src/usb-device-manager.c b/src/usb-device-manager.c >> index c62f56e..9e0e785 100644 >> --- a/src/usb-device-manager.c >> +++ b/src/usb-device-manager.c >> @@ -89,6 +89,7 @@ enum { >> PROP_AUTO_CONNECT, >> PROP_AUTO_CONNECT_FILTER, >> PROP_REDIRECT_ON_CONNECT, >> + PROP_FREE_CHANNELS, >> }; >> >> enum >> @@ -390,6 +391,19 @@ static void >> spice_usb_device_manager_get_property(GObject *gobject, >> case PROP_REDIRECT_ON_CONNECT: >> g_value_set_string(value, priv->redirect_on_connect); >> break; >> + case PROP_FREE_CHANNELS: { >> + int free_channels = 0; >> +#if USE_USBREDIR >> + for (int i = 0; i < priv->channels->len; i++) { > we don't use declarations in the for loop (although it is C99) > >> + SpiceUsbredirChannel *channel = g_ptr_array_index(priv- >> >channels, i); >> + >> + if (!spice_usbredir_channel_get_device(channel)) >> + free_channels++; >> + } >> +#endif >> + g_value_set_int(value, free_channels); >> + break; >> + } >> default: >> G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, pspec); >> break; >> @@ -550,6 +564,20 @@ static void >> spice_usb_device_manager_class_init(SpiceUsbDeviceManagerClass *klas >> pspec); >> >> /** >> + * SpiceUsbDeviceManager:n-free-channels: >> + * >> + * Get a list of avaialable channels for redirecting USB >> devices. >> + */ >> + pspec = g_param_spec_int("free-channels", "Free channels", >> + "The number of available channels for redirecting USB >> devices", >> + 0, >> + G_MAXINT, >> + 0, >> + G_PARAM_READABLE); >> + g_object_class_install_property(gobject_class, >> PROP_FREE_CHANNELS, >> + pspec); >> + >> + /** >> * SpiceUsbDeviceManager::device-added: >> * @manager: the #SpiceUsbDeviceManager that emitted the signal >> * @device: #SpiceUsbDevice boxed object corresponding to the >> added device >> diff --git a/src/usb-device-widget.c b/src/usb-device-widget.c >> index fe983c9..59273f9 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; >> }; >> @@ -181,7 +182,6 @@ static GObject >> *spice_usb_device_widget_constructor( >> SpiceUsbDeviceWidgetPrivate *priv; >> GPtrArray *devices = NULL; >> GError *err = NULL; >> - GtkWidget *label; >> gchar *str; >> int i; >> >> @@ -197,12 +197,12 @@ static GObject >> *spice_usb_device_widget_constructor( >> if (!priv->session) >> g_error("SpiceUsbDeviceWidget constructed without a >> session"); >> >> - label = gtk_label_new(NULL); >> + priv->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); >> + gtk_label_set_markup(GTK_LABEL (priv->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); >> + 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) { >> @@ -401,6 +401,19 @@ static gboolean >> spice_usb_device_widget_update_status(gpointer user_data) >> { >> SpiceUsbDeviceWidget *self = SPICE_USB_DEVICE_WIDGET(user_data); >> SpiceUsbDeviceWidgetPrivate *priv = self->priv; >> + gchar *str, *markup_str; >> + const gchar *free_channels_str; >> + int free_channels; >> + >> + g_object_get(priv->manager, "free-channels", &free_channels, >> NULL); >> + free_channels_str = ngettext(_("Select USB devices to redirect >> (%d free channel)"), >> + _("Select USB devices to redirect >> (%d free channels)"), >> + free_channels); >> + str = g_strdup_printf(free_channels_str, free_channels); >> + 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); >> >> priv->device_count = 0; >> gtk_container_foreach(GTK_CONTAINER(self), check_can_redirect, >> self); > > Acked-by: Pavel Grunt <pgrunt@xxxxxxxxxx> > > Pushed with the suggested change! _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel