static char * get_name_and_type (const char *address, BluetoothType *ret_type) { BluetoothClient *client; GtkTreeModel *model; GtkTreeIter iter; gboolean cont; char *found_name; found_name = NULL; *ret_type = 0; client = bluetooth_client_new (); model = bluetooth_client_get_device_model (client); if (model == NULL) { g_object_unref (client); return NULL; } cont = gtk_tree_model_get_iter_first(model, &iter); while (cont != FALSE) { char *bdaddr, *name; BluetoothType type; gtk_tree_model_get(model, &iter, BLUETOOTH_COLUMN_ADDRESS, &bdaddr, BLUETOOTH_COLUMN_ALIAS, &name, BLUETOOTH_COLUMN_TYPE, &type, -1); if (g_strcmp0 (bdaddr, address) == 0) { g_free (bdaddr); found_name = name; *ret_type = type; break; } g_free (bdaddr); g_free (name); cont = gtk_tree_model_iter_next(model, &iter); } g_object_unref (model); g_object_unref (client); return found_name; }
static void default_adapter_changed (GObject *gobject, GParamSpec *arg1, gpointer data) { BluetoothChooser *self = BLUETOOTH_CHOOSER (data); BluetoothChooserPrivate *priv = BLUETOOTH_CHOOSER_GET_PRIVATE(self); char *adapter; g_object_get (gobject, "default-adapter", &adapter, NULL); if (adapter == NULL) { gtk_widget_set_sensitive (GTK_WIDGET (priv->treeview), FALSE); set_search_label (self, FALSE); gtk_tree_view_set_model (GTK_TREE_VIEW(priv->treeview), NULL); } if (priv->model) { g_object_unref (priv->model); priv->model = NULL; } if (adapter == NULL) return; g_free (adapter); priv->model = bluetooth_client_get_device_model (priv->client); if (priv->model) { priv->filter = gtk_tree_model_filter_new (priv->model, NULL); gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (priv->filter), filter_func, self, NULL); gtk_tree_view_set_model (GTK_TREE_VIEW(priv->treeview), priv->filter); g_signal_connect (priv->filter, "row-changed", G_CALLBACK (device_model_row_changed), self); g_object_unref (priv->filter); gtk_widget_set_sensitive (GTK_WIDGET (priv->treeview), TRUE); /* Start a discovery if it was requested before we * had an adapter available */ if (priv->disco_rq != FALSE) { bluetooth_chooser_start_discovery (self); set_search_label (self, TRUE); } } }
static void set_btdevname (BluetoothChooserButton *button, const char *bdaddr, const char *name, const char *icon) { char *found_name, *found_icon; found_name = NULL; found_icon = NULL; if (bdaddr != NULL && (name == NULL || icon == NULL)) { GtkTreeModel *model; GtkTreeIter iter; gboolean cont = FALSE; model = bluetooth_client_get_device_model (button->client, NULL); if (model != NULL) { cont = gtk_tree_model_iter_children (GTK_TREE_MODEL(model), &iter, NULL); } while (cont == TRUE) { char *value; gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, BLUETOOTH_COLUMN_ADDRESS, &value, -1); if (g_ascii_strcasecmp(bdaddr, value) == 0) { gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, BLUETOOTH_COLUMN_ALIAS, &found_name, BLUETOOTH_COLUMN_ICON, &found_icon, -1); g_free (value); break; } g_free (value); cont = gtk_tree_model_iter_next (GTK_TREE_MODEL(model), &iter); } if (model != NULL) g_object_unref (model); if (found_name == NULL) { found_name = g_strdup (bdaddr); g_strdelimit (found_name, ":", '-'); } if (found_icon == NULL) found_icon = g_strdup ("bluetooth"); } if (bdaddr != NULL) { /* Update the name */ if (name == NULL) gtk_button_set_label (GTK_BUTTON (button), found_name); else gtk_button_set_label (GTK_BUTTON (button), name); /* And the icon */ if (icon == NULL) gtk_image_set_from_icon_name (GTK_IMAGE (button->image), found_icon, GTK_ICON_SIZE_MENU); else gtk_image_set_from_icon_name (GTK_IMAGE (button->image), icon, GTK_ICON_SIZE_MENU); /* And our copy of the address, and notify if it's actually changed */ if (button->bdaddr == NULL || strcmp (bdaddr, button->bdaddr) != 0) { g_free (button->bdaddr); button->bdaddr = g_strdup (bdaddr); g_object_notify (G_OBJECT (button), "device"); } } else { gtk_button_set_label (GTK_BUTTON (button), _(DEFAULT_STR)); if (button->bdaddr != NULL) { g_free (button->bdaddr); button->bdaddr = NULL; gtk_image_clear (GTK_IMAGE (button->image)); g_object_notify (G_OBJECT (button), "device"); } } g_free (found_name); g_free (found_icon); }
static GtkWidget * create_treeview (BluetoothChooser *self) { BluetoothChooserPrivate *priv = BLUETOOTH_CHOOSER_GET_PRIVATE(self); GtkWidget *scrolled, *tree; GtkCellRenderer *renderer; GtkTreeViewColumn *column; /* Create the scrolled window */ scrolled = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_OUT); /* Create the tree view */ tree = gtk_tree_view_new (); gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(tree), TRUE); gtk_tree_view_set_rules_hint (GTK_TREE_VIEW(tree), TRUE); g_object_set (tree, "show-expanders", FALSE, NULL); g_signal_connect (G_OBJECT (tree), "row-activated", G_CALLBACK (row_activated_cb), self); column = gtk_tree_view_column_new (); gtk_tree_view_column_set_title (column, _("Device")); gtk_tree_view_column_set_expand (GTK_TREE_VIEW_COLUMN(column), TRUE); /* The type icon */ renderer = gtk_cell_renderer_pixbuf_new (); gtk_tree_view_column_set_spacing (column, 4); gtk_tree_view_column_pack_start (column, renderer, FALSE); gtk_tree_view_column_set_attributes (column, renderer, "icon-name", BLUETOOTH_COLUMN_ICON, NULL); /* The device name */ renderer = gtk_cell_renderer_text_new (); gtk_tree_view_column_pack_start (column, renderer, TRUE); g_object_set (G_OBJECT (renderer), "ellipsize", PANGO_ELLIPSIZE_END, NULL); gtk_tree_view_column_set_cell_data_func (column, renderer, alias_to_label, NULL, NULL); /* The connected icon */ priv->connected_cell = gtk_cell_renderer_pixbuf_new (); gtk_tree_view_column_pack_start (column, priv->connected_cell, FALSE); gtk_tree_view_column_set_cell_data_func (column, priv->connected_cell, connected_to_icon, NULL, NULL); g_object_set (G_OBJECT (priv->connected_cell), "visible", priv->show_connected, NULL); /* The bonded icon */ priv->bonded_cell = gtk_cell_renderer_pixbuf_new (); gtk_tree_view_column_pack_end (column, priv->bonded_cell, FALSE); gtk_tree_view_column_set_cell_data_func (column, priv->bonded_cell, bonded_to_icon, NULL, NULL); g_object_set (G_OBJECT (priv->bonded_cell), "visible", priv->show_paired, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW(tree), column); gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW(tree), -1, _("Type"), gtk_cell_renderer_text_new(), type_to_text, NULL, NULL); priv->selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(tree)); gtk_tree_selection_set_mode (priv->selection, GTK_SELECTION_SINGLE); g_signal_connect (G_OBJECT(priv->selection), "changed", G_CALLBACK(select_browse_device_callback), self); /* Set the model, and filter */ priv->model = bluetooth_client_get_device_model (priv->client); if (priv->model) { priv->filter = gtk_tree_model_filter_new (priv->model, NULL); gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (priv->filter), filter_func, self, NULL); gtk_tree_view_set_model (GTK_TREE_VIEW(tree), priv->filter); g_signal_connect (priv->filter, "row-changed", G_CALLBACK (device_model_row_changed), self); g_object_unref (priv->filter); } else { gtk_widget_set_sensitive (GTK_WIDGET (tree), FALSE); set_search_label (self, FALSE); } gtk_container_add (GTK_CONTAINER(scrolled), tree); priv->treeview = tree; return scrolled; }