static void device_added_cb(SpiceUsbDeviceManager *manager, SpiceUsbDevice *device, gpointer user_data) { SpiceUsbDeviceWidget *self = SPICE_USB_DEVICE_WIDGET(user_data); SpiceUsbDeviceWidgetPrivate *priv = self->priv; GtkWidget *align, *check; gchar *desc; desc = spice_usb_device_get_description(device, priv->device_format_string); check = gtk_check_button_new_with_label(desc); g_free(desc); if (spice_usb_device_manager_is_device_connected(priv->manager, device)) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), TRUE); g_object_set_data_full( G_OBJECT(check), "usb-device", g_boxed_copy(spice_usb_device_get_type(), device), checkbox_usb_device_destroy_notify); g_signal_connect(G_OBJECT(check), "clicked", G_CALLBACK(checkbox_clicked_cb), self); align = gtk_alignment_new(0, 0, 0, 0); gtk_alignment_set_padding(GTK_ALIGNMENT(align), 0, 0, 12, 0); gtk_container_add(GTK_CONTAINER(align), check); gtk_box_pack_end(GTK_BOX(self), align, FALSE, FALSE, 0); spice_usb_device_widget_update_status(self); gtk_widget_show_all(align); }
static void connect_cb(GObject *gobject, GAsyncResult *res, gpointer user_data) { SpiceUsbDeviceManager *manager = SPICE_USB_DEVICE_MANAGER(gobject); connect_cb_data *data = user_data; SpiceUsbDeviceWidget *self = data->self; SpiceUsbDeviceWidgetPrivate *priv = self->priv; SpiceUsbDevice *device; GError *err = NULL; gchar *desc; spice_usb_device_manager_connect_device_finish(manager, res, &err); if (err) { device = g_object_get_data(G_OBJECT(data->check), "usb-device"); desc = spice_usb_device_get_description(device, priv->device_format_string); g_prefix_error(&err, "Could not redirect %s: ", desc); g_free(desc); SPICE_DEBUG("%s", err->message); g_signal_emit(self, signals[CONNECT_FAILED], 0, device, err); g_error_free(err); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->check), FALSE); spice_usb_device_widget_update_status(self); } g_object_unref(data->check); g_object_unref(data->self); g_free(data); }
static void device_error_cb(SpiceUsbDeviceManager *manager, SpiceUsbDevice *device, GError *err, gpointer user_data) { SpiceUsbDeviceWidget *self = SPICE_USB_DEVICE_WIDGET(user_data); gtk_container_foreach(GTK_CONTAINER(self), set_inactive_by_usb_device, device); spice_usb_device_widget_update_status(self); }
static void device_removed_cb(SpiceUsbDeviceManager *manager, SpiceUsbDevice *device, gpointer user_data) { SpiceUsbDeviceWidget *self = SPICE_USB_DEVICE_WIDGET(user_data); gtk_container_foreach(GTK_CONTAINER(self), destroy_widget_by_usb_device, device); spice_usb_device_widget_update_status(self); }
static void checkbox_clicked_cb(GtkWidget *check, gpointer user_data) { SpiceUsbDeviceWidget *self = SPICE_USB_DEVICE_WIDGET(user_data); SpiceUsbDeviceWidgetPrivate *priv = self->priv; SpiceUsbDevice *device; device = g_object_get_data(G_OBJECT(check), "usb-device"); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check))) { connect_cb_data *data = g_new(connect_cb_data, 1); data->check = g_object_ref(check); data->self = g_object_ref(self); spice_usb_device_manager_connect_device_async(priv->manager, device, NULL, connect_cb, data); } else { spice_usb_device_manager_disconnect_device(priv->manager, device); } spice_usb_device_widget_update_status(self); }
static GObject *spice_usb_device_widget_constructor( GType gtype, guint n_properties, GObjectConstructParam *properties) { GObject *obj; SpiceUsbDeviceWidget *self; SpiceUsbDeviceWidgetPrivate *priv; GPtrArray *devices = NULL; GError *err = NULL; GtkWidget *label; gchar *str; int i; { /* Always chain up to the parent constructor */ GObjectClass *parent_class; parent_class = G_OBJECT_CLASS(spice_usb_device_widget_parent_class); obj = parent_class->constructor(gtype, n_properties, properties); } self = SPICE_USB_DEVICE_WIDGET(obj); priv = self->priv; 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->manager = spice_usb_device_manager_get(priv->session, &err); if (err) { spice_usb_device_widget_show_info_bar(self, err->message, GTK_MESSAGE_WARNING, GTK_STOCK_DIALOG_WARNING); g_clear_error(&err); return obj; } g_signal_connect(priv->manager, "device-added", G_CALLBACK(device_added_cb), self); g_signal_connect(priv->manager, "device-removed", G_CALLBACK(device_removed_cb), self); g_signal_connect(priv->manager, "device-error", G_CALLBACK(device_error_cb), self); devices = spice_usb_device_manager_get_devices(priv->manager); if (!devices) goto end; for (i = 0; i < devices->len; i++) device_added_cb(NULL, g_ptr_array_index(devices, i), self); g_ptr_array_unref(devices); end: spice_usb_device_widget_update_status(self); return obj; }