65
63
G_DEFINE_TYPE(BluetoothChooserCombo, bluetooth_chooser_combo, GTK_TYPE_VBOX);
65
#define BLUETOOTH_CHOOSER_COMBO_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), \
66
BLUETOOTH_TYPE_CHOOSER_COMBO, BluetoothChooserComboPrivate))
68
69
bluetooth_chooser_combo_set_device (BluetoothChooserCombo *combo,
69
70
const char *bdaddr)
71
if (bdaddr == NULL || combo->model == NULL) {
72
g_free (combo->bdaddr);
73
gtk_widget_set_sensitive (combo->drop_box, FALSE);
72
if (bdaddr == NULL || combo->priv->model == NULL) {
73
g_free (combo->priv->bdaddr);
74
gtk_widget_set_sensitive (combo->priv->drop_box, FALSE);
76
77
gboolean cont = FALSE;
78
gtk_widget_set_sensitive (combo->drop_box, TRUE);
79
gtk_widget_set_sensitive (combo->priv->drop_box, TRUE);
80
g_free (combo->bdaddr);
81
g_free (combo->priv->bdaddr);
81
82
if (g_strcmp0 (BLUETOOTH_CHOOSER_COMBO_FIRST_DEVICE, bdaddr) != 0)
82
combo->bdaddr = g_strdup (bdaddr);
83
combo->priv->bdaddr = g_strdup (bdaddr);
85
combo->priv->bdaddr = NULL;
86
cont = gtk_tree_model_iter_children (combo->model, &iter, NULL);
87
cont = gtk_tree_model_iter_children (combo->priv->model, &iter, NULL);
87
88
while (cont == TRUE) {
90
gtk_tree_model_get (GTK_TREE_MODEL (combo->model), &iter,
91
gtk_tree_model_get (GTK_TREE_MODEL (combo->priv->model), &iter,
91
92
BLUETOOTH_COLUMN_ADDRESS, &value, -1);
93
if (combo->bdaddr == NULL) {
94
gtk_tree_selection_select_iter (combo->selection, &iter);
95
combo->bdaddr = value;
94
if (combo->priv->bdaddr == NULL) {
95
gtk_tree_selection_select_iter (combo->priv->selection, &iter);
96
combo->priv->bdaddr = value;
99
100
if (g_ascii_strcasecmp(bdaddr, value) == 0) {
100
gtk_tree_selection_select_iter (combo->selection, &iter);
101
gtk_tree_selection_select_iter (combo->priv->selection, &iter);
105
cont = gtk_tree_model_iter_next (GTK_TREE_MODEL (combo->model), &iter);
106
cont = gtk_tree_model_iter_next (GTK_TREE_MODEL (combo->priv->model), &iter);
108
109
g_object_notify (G_OBJECT (combo), "device");
114
115
BluetoothChooserCombo *combo = BLUETOOTH_CHOOSER_COMBO (object);
116
if (combo->model_notify_id != 0) {
117
if (combo->priv->model_notify_id != 0) {
117
118
GtkWidget *treeview;
119
treeview = bluetooth_chooser_get_treeview (BLUETOOTH_CHOOSER (combo->chooser));
120
g_signal_handler_disconnect (treeview, combo->model_notify_id);
121
combo->model_notify_id = 0;
123
if (combo->model != NULL) {
124
g_object_unref (combo->model);
127
if (combo->chooser != NULL) {
128
g_object_unref (combo->chooser);
129
combo->chooser = NULL;
120
treeview = bluetooth_chooser_get_treeview (BLUETOOTH_CHOOSER (combo->priv->chooser));
121
g_signal_handler_disconnect (treeview, combo->priv->model_notify_id);
122
combo->priv->model_notify_id = 0;
124
if (combo->priv->model != NULL) {
125
g_object_unref (combo->priv->model);
126
combo->priv->model = NULL;
128
if (combo->priv->chooser != NULL) {
129
g_object_unref (combo->priv->chooser);
130
combo->priv->chooser = NULL;
132
133
G_OBJECT_CLASS (parent_class)->dispose (object);
226
229
GtkTreeModel *model;
228
231
g_object_get (gobject, "model", &model, NULL);
229
gtk_combo_box_set_model (GTK_COMBO_BOX (combo->drop), model);
230
if (combo->model != NULL) {
231
g_object_unref (combo->model);
232
gtk_combo_box_set_model (GTK_COMBO_BOX (combo->priv->drop), model);
233
if (combo->priv->model != NULL) {
234
g_object_unref (combo->priv->model);
235
combo->priv->model = NULL;
234
combo->model = model;
237
combo->priv->model = model;
242
245
GtkTreeIter iter;
243
246
char *value = NULL;
245
if (gtk_tree_selection_get_selected (combo->selection, NULL, &iter)) {
246
gtk_combo_box_set_active_iter (GTK_COMBO_BOX (combo->drop), &iter);
247
if (combo->model != NULL)
248
gtk_tree_model_get (GTK_TREE_MODEL (combo->model), &iter,
248
if (gtk_tree_selection_get_selected (combo->priv->selection, NULL, &iter)) {
249
gtk_combo_box_set_active_iter (GTK_COMBO_BOX (combo->priv->drop), &iter);
250
if (combo->priv->model != NULL)
251
gtk_tree_model_get (GTK_TREE_MODEL (combo->priv->model), &iter,
249
252
BLUETOOTH_COLUMN_ADDRESS, &value, -1);
251
if (combo->model != NULL)
252
gtk_combo_box_set_active (GTK_COMBO_BOX (combo->drop), -1);
254
if (combo->priv->model != NULL)
255
gtk_combo_box_set_active (GTK_COMBO_BOX (combo->priv->drop), -1);
255
if (g_strcmp0 (combo->bdaddr, value) != 0) {
256
g_free (combo->bdaddr);
257
combo->bdaddr = value;
258
if (g_strcmp0 (combo->priv->bdaddr, value) != 0) {
259
g_free (combo->priv->bdaddr);
260
combo->priv->bdaddr = value;
258
261
g_object_notify (G_OBJECT (combo), "device");
270
273
char *value = NULL;
272
275
if (gtk_combo_box_get_active_iter (widget, &iter)) {
273
gtk_tree_selection_select_iter (combo->selection, &iter);
274
if (combo->model != NULL)
275
gtk_tree_model_get (GTK_TREE_MODEL (combo->model), &iter,
276
gtk_tree_selection_select_iter (combo->priv->selection, &iter);
277
if (combo->priv->model != NULL)
278
gtk_tree_model_get (GTK_TREE_MODEL (combo->priv->model), &iter,
276
279
BLUETOOTH_COLUMN_ADDRESS, &value, -1);
278
if (combo->model != NULL)
279
gtk_tree_selection_unselect_all (combo->selection);
281
if (combo->priv->model != NULL)
282
gtk_tree_selection_unselect_all (combo->priv->selection);
282
if (g_strcmp0 (combo->bdaddr, value) != 0) {
283
g_free (combo->bdaddr);
284
combo->bdaddr = value;
285
if (g_strcmp0 (combo->priv->bdaddr, value) != 0) {
286
g_free (combo->priv->bdaddr);
287
combo->priv->bdaddr = value;
285
288
g_object_notify (G_OBJECT (combo), "device");
294
297
GtkWidget *treeview;
295
298
GtkCellRenderer *renderer;
297
combo->drop_box = gtk_hbox_new (TRUE, 0);
298
gtk_box_pack_start (GTK_BOX (combo), combo->drop_box,
300
combo->priv = BLUETOOTH_CHOOSER_COMBO_GET_PRIVATE (combo);
302
combo->priv->drop_box = gtk_hbox_new (TRUE, 0);
303
gtk_box_pack_start (GTK_BOX (combo), combo->priv->drop_box,
300
305
/* Setup the combo itself */
301
combo->drop = gtk_combo_box_new ();
302
gtk_box_pack_start (GTK_BOX (combo->drop_box), combo->drop,
306
combo->priv->drop = gtk_combo_box_new ();
307
gtk_box_pack_start (GTK_BOX (combo->priv->drop_box), combo->priv->drop,
304
309
renderer = gtk_cell_renderer_pixbuf_new ();
305
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo->drop),
310
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo->priv->drop),
308
gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo->drop),
313
gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo->priv->drop),
310
315
"icon-name", BLUETOOTH_COLUMN_ICON,
312
317
renderer = gtk_cell_renderer_text_new ();
313
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo->drop),
318
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo->priv->drop),
316
gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo->drop),
321
gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo->priv->drop),
318
323
"text", BLUETOOTH_COLUMN_ALIAS,
321
combo->chooser = bluetooth_chooser_new ("");
326
combo->priv->chooser = bluetooth_chooser_new ("");
323
treeview = bluetooth_chooser_get_treeview (BLUETOOTH_CHOOSER (combo->chooser));
324
combo->model_notify_id = g_signal_connect (G_OBJECT (treeview), "notify::model",
328
treeview = bluetooth_chooser_get_treeview (BLUETOOTH_CHOOSER (combo->priv->chooser));
329
combo->priv->model_notify_id = g_signal_connect (G_OBJECT (treeview), "notify::model",
325
330
G_CALLBACK (treeview_model_notify_cb), combo);
326
331
treeview_model_notify_cb (G_OBJECT (treeview), NULL, combo);
327
gtk_combo_box_set_active (GTK_COMBO_BOX (combo->drop), 0);
332
gtk_combo_box_set_active (GTK_COMBO_BOX (combo->priv->drop), 0);
329
combo->selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
330
g_signal_connect (G_OBJECT (combo->selection), "changed",
334
combo->priv->selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
335
g_signal_connect (G_OBJECT (combo->priv->selection), "changed",
331
336
G_CALLBACK (treeview_selection_changed_cb), combo);
332
g_signal_connect (G_OBJECT (combo->drop), "changed",
337
g_signal_connect (G_OBJECT (combo->priv->drop), "changed",
333
338
G_CALLBACK (drop_changed_cb), combo);
335
340
gtk_widget_show_all (GTK_WIDGET (combo));