~timchen119/ubuntu/trusty/gnome-bluetooth/lp1035431

« back to all changes in this revision

Viewing changes to lib/bluetooth-chooser-combo.c

  • Committer: Bazaar Package Importer
  • Author(s): Emilio Pozuelo Monfort
  • Date: 2011-02-27 15:45:22 UTC
  • mfrom: (1.3.2 upstream)
  • mto: (2.2.3 experimental) (1.5.1)
  • mto: This revision was merged to the branch mainline in revision 53.
  • Revision ID: james.westby@ubuntu.com-20110227154522-dnnoqasv5v3mv42a
Tags: upstream-2.91.5
ImportĀ upstreamĀ versionĀ 2.91.5

Show diffs side-by-side

added added

removed removed

Lines of Context:
31
31
#include "bluetooth-chooser-private.h"
32
32
#include "marshal.h"
33
33
 
34
 
struct _BluetoothChooserCombo {
35
 
        GtkVBox            parent;
36
 
 
 
34
struct _BluetoothChooserComboPrivate {
37
35
        GtkWidget         *chooser;
38
36
        GtkWidget         *drop_box;
39
37
        GtkWidget         *drop;
64
62
 
65
63
G_DEFINE_TYPE(BluetoothChooserCombo, bluetooth_chooser_combo, GTK_TYPE_VBOX);
66
64
 
 
65
#define BLUETOOTH_CHOOSER_COMBO_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), \
 
66
                                                                        BLUETOOTH_TYPE_CHOOSER_COMBO, BluetoothChooserComboPrivate))
 
67
 
67
68
static void
68
69
bluetooth_chooser_combo_set_device (BluetoothChooserCombo *combo,
69
70
                                    const char *bdaddr)
70
71
{
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);
74
75
        } else {
75
76
                GtkTreeIter iter;
76
77
                gboolean cont = FALSE;
77
78
 
78
 
                gtk_widget_set_sensitive (combo->drop_box, TRUE);
 
79
                gtk_widget_set_sensitive (combo->priv->drop_box, TRUE);
79
80
 
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);
83
84
                else
84
 
                        combo->bdaddr = NULL;
 
85
                        combo->priv->bdaddr = NULL;
85
86
 
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) {
88
89
                        char *value;
89
90
 
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);
92
93
 
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;
96
97
                                break;
97
98
                        }
98
99
 
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);
101
102
                                g_free (value);
102
103
                                break;
103
104
                        }
104
105
                        g_free (value);
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);
106
107
                }
107
108
        }
108
109
        g_object_notify (G_OBJECT (combo), "device");
113
114
{
114
115
        BluetoothChooserCombo *combo = BLUETOOTH_CHOOSER_COMBO (object);
115
116
 
116
 
        if (combo->model_notify_id != 0) {
 
117
        if (combo->priv->model_notify_id != 0) {
117
118
                GtkWidget *treeview;
118
119
 
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;
122
 
        }
123
 
        if (combo->model != NULL) {
124
 
                g_object_unref (combo->model);
125
 
                combo->model = NULL;
126
 
        }
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;
 
123
        }
 
124
        if (combo->priv->model != NULL) {
 
125
                g_object_unref (combo->priv->model);
 
126
                combo->priv->model = NULL;
 
127
        }
 
128
        if (combo->priv->chooser != NULL) {
 
129
                g_object_unref (combo->priv->chooser);
 
130
                combo->priv->chooser = NULL;
130
131
        }
131
132
 
132
133
        G_OBJECT_CLASS (parent_class)->dispose (object);
160
161
 
161
162
        switch (property_id) {
162
163
        case PROP_CHOOSER:
163
 
                g_value_set_object (value, combo->chooser);
 
164
                g_value_set_object (value, combo->priv->chooser);
164
165
                break;
165
166
        case PROP_DEVICE:
166
 
                g_value_set_string (value, combo->bdaddr);
 
167
                g_value_set_string (value, combo->priv->bdaddr);
167
168
                break;
168
169
        default:
169
170
                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
181
182
        object_class->set_property = bluetooth_chooser_combo_set_property;
182
183
        object_class->get_property = bluetooth_chooser_combo_get_property;
183
184
 
 
185
        g_type_class_add_private(klass, sizeof(BluetoothChooserComboPrivate));
 
186
 
184
187
        /**
185
188
         * BluetoothChooserCombo::chooser-created:
186
189
         * @self: a #BluetoothChooserCombo widget
226
229
        GtkTreeModel *model;
227
230
 
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
 
                combo->model = NULL;
 
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;
233
236
        }
234
 
        combo->model = model;
 
237
        combo->priv->model = model;
235
238
}
236
239
 
237
240
static void
242
245
        GtkTreeIter iter;
243
246
        char *value = NULL;
244
247
 
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);
250
253
        } else {
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);
253
256
        }
254
257
 
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");
259
262
        } else {
260
263
                g_free (value);
270
273
        char *value = NULL;
271
274
 
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);
277
280
        } else {
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);
280
283
        }
281
284
 
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");
286
289
        } else {
287
290
                g_free (value);
294
297
        GtkWidget *treeview;
295
298
        GtkCellRenderer *renderer;
296
299
 
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);
 
301
 
 
302
        combo->priv->drop_box = gtk_hbox_new (TRUE, 0);
 
303
        gtk_box_pack_start (GTK_BOX (combo), combo->priv->drop_box,
299
304
                            TRUE, FALSE, 0);
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,
303
308
                            TRUE, TRUE, 0);
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),
306
311
                                    renderer,
307
312
                                    FALSE);
308
 
        gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo->drop),
 
313
        gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo->priv->drop),
309
314
                                        renderer,
310
315
                                        "icon-name", BLUETOOTH_COLUMN_ICON,
311
316
                                        NULL);
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),
314
319
                                    renderer,
315
320
                                    TRUE);
316
 
        gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo->drop),
 
321
        gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo->priv->drop),
317
322
                                        renderer,
318
323
                                        "text", BLUETOOTH_COLUMN_ALIAS,
319
324
                                        NULL);
320
325
 
321
 
        combo->chooser = bluetooth_chooser_new ("");
 
326
        combo->priv->chooser = bluetooth_chooser_new ("");
322
327
 
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);
328
333
 
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);
334
339
 
335
340
        gtk_widget_show_all (GTK_WIDGET (combo));
338
343
/**
339
344
 * bluetooth_chooser_combo_new:
340
345
 *
341
 
 * Return value: a #BluetoothChooserCombo
 
346
 * Returns a new #BluetoothChooserCombo widget.
 
347
 *
 
348
 * Return value: a #BluetoothChooserCombo widget.
342
349
 **/
343
350
GtkWidget *
344
351
bluetooth_chooser_combo_new (void)