~indicator-applet-developers/indicator-appmenu/trunk.13.04

« back to all changes in this revision

Viewing changes to src/window-menu-dbusmenu.c

  • Committer: Ted Gould
  • Date: 2012-03-21 14:46:04 UTC
  • mfrom: (166.3.59 gmenumodel-menus)
  • Revision ID: ted@gould.cx-20120321144604-r4limdyast215291
Adding GMenuModel support for menus

Show diffs side-by-side

added added

removed removed

Lines of Context:
29
29
#include <glib.h>
30
30
#include <gio/gio.h>
31
31
 
32
 
#include "window-menus.h"
 
32
#include "window-menu-dbusmenu.h"
33
33
#include "indicator-appmenu-marshal.h"
34
34
 
35
35
/* Private parts */
36
36
 
37
 
typedef struct _WindowMenusPrivate WindowMenusPrivate;
38
 
struct _WindowMenusPrivate {
 
37
typedef struct _WindowMenuDbusmenuPrivate WindowMenuDbusmenuPrivate;
 
38
struct _WindowMenuDbusmenuPrivate {
39
39
        guint windowid;
40
40
        DbusmenuGtkClient * client;
41
41
        DbusmenuMenuitem * root;
52
52
        gboolean disabled;
53
53
        gboolean hidden;
54
54
        DbusmenuMenuitem * mi;
55
 
        WindowMenus * wm;
56
 
};
57
 
 
58
 
#define WINDOW_MENUS_GET_PRIVATE(o) \
59
 
(G_TYPE_INSTANCE_GET_PRIVATE ((o), WINDOW_MENUS_TYPE, WindowMenusPrivate))
60
 
 
61
 
/* Signals */
62
 
 
63
 
enum {
64
 
        ENTRY_ADDED,
65
 
        ENTRY_REMOVED,
66
 
        ERROR_STATE,
67
 
        STATUS_CHANGED,
68
 
        SHOW_MENU,
69
 
        A11Y_UPDATE,
70
 
        LAST_SIGNAL
71
 
};
72
 
 
73
 
static guint signals[LAST_SIGNAL] = { 0 };
 
55
        WindowMenuDbusmenu * wm;
 
56
};
 
57
 
 
58
#define WINDOW_MENU_DBUSMENU_GET_PRIVATE(o) \
 
59
(G_TYPE_INSTANCE_GET_PRIVATE ((o), WINDOW_MENU_DBUSMENU_TYPE, WindowMenuDbusmenuPrivate))
74
60
 
75
61
/* Prototypes */
76
62
 
77
 
static void window_menus_dispose    (GObject *object);
 
63
static void window_menu_dbusmenu_dispose    (GObject *object);
78
64
static void root_changed            (DbusmenuClient * client, DbusmenuMenuitem * new_root, gpointer user_data);
79
65
static void event_status            (DbusmenuClient * client, DbusmenuMenuitem * mi, gchar * event, GVariant * evdata, guint timestamp, GError * error, gpointer user_data);
80
66
static void item_activate           (DbusmenuClient * client, DbusmenuMenuitem * item, guint timestamp, gpointer user_data);
86
72
static void menu_prop_changed       (DbusmenuMenuitem * item, const gchar * property, GVariant * value, gpointer user_data);
87
73
static void menu_child_realized     (DbusmenuMenuitem * child, gpointer user_data);
88
74
static void props_cb (GObject * object, GAsyncResult * res, gpointer user_data);
 
75
static GList *          get_entries      (WindowMenu * wm);
 
76
static guint            get_location     (WindowMenu * wm, IndicatorObjectEntry * entry);
 
77
static guint            get_xid          (WindowMenu * wm);
 
78
static gboolean         get_error_state  (WindowMenu * wm);
 
79
static WindowMenuStatus get_status       (WindowMenu * wm);
 
80
static void             entry_restore    (WindowMenu * wm, IndicatorObjectEntry * entry);
 
81
static void             entry_activate   (WindowMenu * wm, IndicatorObjectEntry * entry, guint timestamp);
89
82
 
90
 
G_DEFINE_TYPE (WindowMenus, window_menus, G_TYPE_OBJECT);
 
83
G_DEFINE_TYPE (WindowMenuDbusmenu, window_menu_dbusmenu, WINDOW_MENU_TYPE);
91
84
 
92
85
/* Build the one-time class */
93
86
static void
94
 
window_menus_class_init (WindowMenusClass *klass)
 
87
window_menu_dbusmenu_class_init (WindowMenuDbusmenuClass *klass)
95
88
{
96
89
        GObjectClass *object_class = G_OBJECT_CLASS (klass);
97
90
 
98
 
        g_type_class_add_private (klass, sizeof (WindowMenusPrivate));
99
 
 
100
 
        object_class->dispose = window_menus_dispose;
101
 
 
102
 
        /* Signals */
103
 
        signals[ENTRY_ADDED] =  g_signal_new(WINDOW_MENUS_SIGNAL_ENTRY_ADDED,
104
 
                                              G_TYPE_FROM_CLASS(klass),
105
 
                                              G_SIGNAL_RUN_LAST,
106
 
                                              G_STRUCT_OFFSET (WindowMenusClass, entry_added),
107
 
                                              NULL, NULL,
108
 
                                              g_cclosure_marshal_VOID__POINTER,
109
 
                                              G_TYPE_NONE, 1, G_TYPE_POINTER);
110
 
        signals[ENTRY_REMOVED] =  g_signal_new(WINDOW_MENUS_SIGNAL_ENTRY_REMOVED,
111
 
                                              G_TYPE_FROM_CLASS(klass),
112
 
                                              G_SIGNAL_RUN_LAST,
113
 
                                              G_STRUCT_OFFSET (WindowMenusClass, entry_removed),
114
 
                                              NULL, NULL,
115
 
                                              g_cclosure_marshal_VOID__POINTER,
116
 
                                              G_TYPE_NONE, 1, G_TYPE_POINTER);
117
 
        signals[ERROR_STATE] =   g_signal_new(WINDOW_MENUS_SIGNAL_ERROR_STATE,
118
 
                                              G_TYPE_FROM_CLASS(klass),
119
 
                                              G_SIGNAL_RUN_LAST,
120
 
                                              G_STRUCT_OFFSET (WindowMenusClass, error_state),
121
 
                                              NULL, NULL,
122
 
                                              g_cclosure_marshal_VOID__BOOLEAN,
123
 
                                              G_TYPE_NONE, 1, G_TYPE_BOOLEAN, G_TYPE_NONE);
124
 
        signals[STATUS_CHANGED] = g_signal_new(WINDOW_MENUS_SIGNAL_STATUS_CHANGED,
125
 
                                              G_TYPE_FROM_CLASS(klass),
126
 
                                              G_SIGNAL_RUN_LAST,
127
 
                                              G_STRUCT_OFFSET (WindowMenusClass, status_changed),
128
 
                                              NULL, NULL,
129
 
                                              g_cclosure_marshal_VOID__INT,
130
 
                                              G_TYPE_NONE, 1, G_TYPE_INT, G_TYPE_NONE);
131
 
        signals[SHOW_MENU] =     g_signal_new(WINDOW_MENUS_SIGNAL_SHOW_MENU,
132
 
                                              G_TYPE_FROM_CLASS(klass),
133
 
                                              G_SIGNAL_RUN_LAST,
134
 
                                              G_STRUCT_OFFSET (WindowMenusClass, show_menu),
135
 
                                              NULL, NULL,
136
 
                                              _indicator_appmenu_marshal_VOID__POINTER_UINT,
137
 
                                              G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_UINT, G_TYPE_NONE);
138
 
        signals[A11Y_UPDATE] =   g_signal_new(WINDOW_MENUS_SIGNAL_A11Y_UPDATE,
139
 
                                              G_TYPE_FROM_CLASS(klass),
140
 
                                              G_SIGNAL_RUN_LAST,
141
 
                                              G_STRUCT_OFFSET (WindowMenusClass, a11y_update),
142
 
                                              NULL, NULL,
143
 
                                              _indicator_appmenu_marshal_VOID__POINTER,
144
 
                                              G_TYPE_NONE, 1, G_TYPE_POINTER, G_TYPE_NONE);
 
91
        g_type_class_add_private (klass, sizeof (WindowMenuDbusmenuPrivate));
 
92
 
 
93
        object_class->dispose = window_menu_dbusmenu_dispose;
 
94
 
 
95
        WindowMenuClass * menu_class = WINDOW_MENU_CLASS(klass);
 
96
        menu_class->get_entries = get_entries;
 
97
        menu_class->get_location = get_location;
 
98
        menu_class->get_xid = get_xid;
 
99
        menu_class->get_error_state = get_error_state;
 
100
        menu_class->get_status = get_status;
 
101
        menu_class->entry_restore = entry_restore;
 
102
        menu_class->entry_activate = entry_activate;
145
103
 
146
104
        return;
147
105
}
148
106
 
149
107
/* Initialize the per-instance data */
150
108
static void
151
 
window_menus_init (WindowMenus *self)
 
109
window_menu_dbusmenu_init (WindowMenuDbusmenu *self)
152
110
{
153
 
        WindowMenusPrivate * priv = WINDOW_MENUS_GET_PRIVATE(self);
 
111
        WindowMenuDbusmenuPrivate * priv = WINDOW_MENU_DBUSMENU_GET_PRIVATE(self);
154
112
 
155
113
        priv->client = NULL;
156
114
        priv->props_cancel = NULL;
198
156
static void
199
157
free_entries(GObject *object, gboolean should_signal)
200
158
{
201
 
        g_return_if_fail(IS_WINDOW_MENUS(object));
 
159
        g_return_if_fail(IS_WINDOW_MENU_DBUSMENU(object));
202
160
 
203
 
        WindowMenusPrivate * priv = WINDOW_MENUS_GET_PRIVATE(object);
 
161
        WindowMenuDbusmenuPrivate * priv = WINDOW_MENU_DBUSMENU_GET_PRIVATE(object);
204
162
 
205
163
        if (priv->entries != NULL) {
206
164
                while (priv->entries->len > 0) {
208
166
                        entry = g_array_index(priv->entries, IndicatorObjectEntry *, 0);
209
167
                        g_array_remove_index(priv->entries, 0);
210
168
                        if (should_signal) {                    
211
 
                                g_signal_emit(object, signals[ENTRY_REMOVED], 0, entry, TRUE);
 
169
                                g_signal_emit_by_name(object, WINDOW_MENU_SIGNAL_ENTRY_REMOVED, entry, TRUE);
212
170
                        }
213
171
                        entry_free(entry);
214
172
                }
217
175
 
218
176
/* Destroy objects */
219
177
static void
220
 
window_menus_dispose (GObject *object)
 
178
window_menu_dbusmenu_dispose (GObject *object)
221
179
{
222
 
        WindowMenusPrivate * priv = WINDOW_MENUS_GET_PRIVATE(object);
 
180
        WindowMenuDbusmenuPrivate * priv = WINDOW_MENU_DBUSMENU_GET_PRIVATE(object);
223
181
 
224
182
        free_entries(object, FALSE);
225
183
 
259
217
                priv->retry_timer = 0;
260
218
        }
261
219
 
262
 
        G_OBJECT_CLASS (window_menus_parent_class)->dispose (object);
 
220
        G_OBJECT_CLASS (window_menu_dbusmenu_parent_class)->dispose (object);
263
221
        return;
264
222
}
265
223
 
269
227
retry_event (gpointer user_data)
270
228
{
271
229
        g_debug("Retrying event");
272
 
        g_return_val_if_fail(IS_WINDOW_MENUS(user_data), FALSE);
273
 
        WindowMenusPrivate * priv = WINDOW_MENUS_GET_PRIVATE(user_data);
 
230
        g_return_val_if_fail(IS_WINDOW_MENU_DBUSMENU(user_data), FALSE);
 
231
        WindowMenuDbusmenuPrivate * priv = WINDOW_MENU_DBUSMENU_GET_PRIVATE(user_data);
274
232
 
275
233
        dbusmenu_menuitem_handle_event(dbusmenu_client_get_root(DBUSMENU_CLIENT(priv->client)),
276
234
                                       "x-appmenu-retry-ping",
286
244
static void
287
245
event_status (DbusmenuClient * client, DbusmenuMenuitem * mi, gchar * event, GVariant * evdata, guint timestamp, GError * error, gpointer user_data)
288
246
{
289
 
        g_return_if_fail(IS_WINDOW_MENUS(user_data));
290
 
        WindowMenusPrivate * priv = WINDOW_MENUS_GET_PRIVATE(user_data);
 
247
        g_return_if_fail(IS_WINDOW_MENU_DBUSMENU(user_data));
 
248
        WindowMenuDbusmenuPrivate * priv = WINDOW_MENU_DBUSMENU_GET_PRIVATE(user_data);
291
249
 
292
250
        /* We don't care about status where there are no errors
293
251
           when we're in a happy state, just let them go. */
300
258
        if (error == NULL) {
301
259
                g_debug("Error state repaired");
302
260
                priv->error_state = FALSE;
303
 
                g_signal_emit(G_OBJECT(user_data), signals[ERROR_STATE], 0, priv->error_state, TRUE);
 
261
                g_signal_emit_by_name(G_OBJECT(user_data), WINDOW_MENU_SIGNAL_ERROR_STATE, priv->error_state, TRUE);
304
262
 
305
263
                for (i = 0; i < priv->entries->len; i++) {
306
264
                        IndicatorObjectEntry * entry = g_array_index(priv->entries, IndicatorObjectEntry *, i);
307
 
                        window_menus_entry_restore(WINDOW_MENUS(user_data), entry);
 
265
                        entry_restore(WINDOW_MENU(user_data), entry);
308
266
                }
309
267
 
310
268
                if (priv->retry_timer != 0) {
318
276
        /* Uhg, means that events are breaking, now we need to
319
277
           try and handle that case. */
320
278
        priv->error_state = TRUE;
321
 
        g_signal_emit(G_OBJECT(user_data), signals[ERROR_STATE], 0, priv->error_state, TRUE);
 
279
        g_signal_emit_by_name(G_OBJECT(user_data), WINDOW_MENU_SIGNAL_ERROR_STATE, priv->error_state, TRUE);
322
280
 
323
281
        for (i = 0; i < priv->entries->len; i++) {
324
282
                IndicatorObjectEntry * entry = g_array_index(priv->entries, IndicatorObjectEntry *, i);
340
298
}
341
299
 
342
300
static IndicatorObjectEntry *
343
 
get_entry(WindowMenus *wm, DbusmenuMenuitem * item, guint *index)
 
301
get_entry(WindowMenuDbusmenu *wm, DbusmenuMenuitem * item, guint *index)
344
302
{
345
 
        WindowMenusPrivate * priv = WINDOW_MENUS_GET_PRIVATE(wm);
 
303
        WindowMenuDbusmenuPrivate * priv = WINDOW_MENU_DBUSMENU_GET_PRIVATE(wm);
346
304
 
347
305
        guint position = 0;
348
306
        for (position = 0; position < priv->entries->len; ++position) {
364
322
static void
365
323
item_activate (DbusmenuClient * client, DbusmenuMenuitem * item, guint timestamp, gpointer user_data)
366
324
{
367
 
        g_return_if_fail(IS_WINDOW_MENUS(user_data));
368
 
        WindowMenusPrivate * priv = WINDOW_MENUS_GET_PRIVATE(user_data);
 
325
        g_return_if_fail(IS_WINDOW_MENU_DBUSMENU(user_data));
 
326
        WindowMenuDbusmenuPrivate * priv = WINDOW_MENU_DBUSMENU_GET_PRIVATE(user_data);
369
327
 
370
328
        if (priv->root == NULL) {
371
329
                return;
372
330
        }
373
331
 
374
 
        IndicatorObjectEntry * entry = get_entry(WINDOW_MENUS(user_data), item, NULL);
 
332
        IndicatorObjectEntry * entry = get_entry(WINDOW_MENU_DBUSMENU(user_data), item, NULL);
375
333
        if (entry == NULL) {
376
334
                /* Not found */
377
335
                return;
378
336
        }
379
337
 
380
 
        g_signal_emit(G_OBJECT(user_data), signals[SHOW_MENU], 0, entry, timestamp, TRUE);
 
338
        g_signal_emit_by_name(G_OBJECT(user_data), WINDOW_MENU_SIGNAL_SHOW_MENU, entry, timestamp, TRUE);
381
339
 
382
340
        return;
383
341
}
387
345
static void
388
346
status_changed (DbusmenuClient * client, GParamSpec * pspec, gpointer user_data)
389
347
{
390
 
        g_signal_emit(G_OBJECT(user_data), signals[STATUS_CHANGED], 0, dbusmenu_client_get_status (client));
 
348
        g_signal_emit_by_name(G_OBJECT(user_data), WINDOW_MENU_SIGNAL_STATUS_CHANGED, dbusmenu_client_get_status (client));
391
349
}
392
350
 
393
 
DbusmenuStatus
394
 
window_menus_get_status (WindowMenus * wm)
 
351
WindowMenuStatus dbusmenu_status_table[] = {
 
352
        [DBUSMENU_STATUS_NORMAL] = WINDOW_MENU_STATUS_NORMAL,
 
353
        [DBUSMENU_STATUS_NOTICE] = WINDOW_MENU_STATUS_ACTIVE
 
354
};
 
355
 
 
356
static WindowMenuStatus
 
357
get_status (WindowMenu * wm)
395
358
{
396
 
        g_return_val_if_fail(IS_WINDOW_MENUS(wm), DBUSMENU_STATUS_NORMAL);
397
 
        WindowMenusPrivate * priv = WINDOW_MENUS_GET_PRIVATE(wm);
 
359
        g_return_val_if_fail(IS_WINDOW_MENU_DBUSMENU(wm), DBUSMENU_STATUS_NORMAL);
 
360
        WindowMenuDbusmenuPrivate * priv = WINDOW_MENU_DBUSMENU_GET_PRIVATE(wm);
398
361
 
399
 
        return dbusmenu_client_get_status (DBUSMENU_CLIENT (priv->client));
 
362
        return dbusmenu_status_table[dbusmenu_client_get_status (DBUSMENU_CLIENT (priv->client))];
400
363
}
401
364
 
402
365
/* Build a new window menus object and attach to the signals to build
403
366
   up the representative menu. */
404
 
WindowMenus *
405
 
window_menus_new (const guint windowid, const gchar * dbus_addr, const gchar * dbus_object)
 
367
WindowMenuDbusmenu *
 
368
window_menu_dbusmenu_new (const guint windowid, const gchar * dbus_addr, const gchar * dbus_object)
406
369
{
407
370
        g_debug("Creating new windows menu: %X, %s, %s", windowid, dbus_addr, dbus_object);
408
371
 
410
373
        g_return_val_if_fail(dbus_addr != NULL, NULL);
411
374
        g_return_val_if_fail(dbus_object != NULL, NULL);
412
375
 
413
 
        WindowMenus * newmenu = WINDOW_MENUS(g_object_new(WINDOW_MENUS_TYPE, NULL));
414
 
        WindowMenusPrivate * priv = WINDOW_MENUS_GET_PRIVATE(newmenu);
 
376
        WindowMenuDbusmenu * newmenu = WINDOW_MENU_DBUSMENU(g_object_new(WINDOW_MENU_DBUSMENU_TYPE, NULL));
 
377
        WindowMenuDbusmenuPrivate * priv = WINDOW_MENU_DBUSMENU_GET_PRIVATE(newmenu);
415
378
 
416
379
        priv->windowid = windowid;
417
380
 
459
422
                return; // Must exit before accessing freed memory
460
423
        }
461
424
 
462
 
        WindowMenus * self = WINDOW_MENUS(user_data);
 
425
        WindowMenuDbusmenu * self = WINDOW_MENU_DBUSMENU(user_data);
463
426
        g_return_if_fail(self != NULL);
464
427
 
465
 
        WindowMenusPrivate * priv = WINDOW_MENUS_GET_PRIVATE(self);
 
428
        WindowMenuDbusmenuPrivate * priv = WINDOW_MENU_DBUSMENU_GET_PRIVATE(self);
466
429
 
467
430
        if (priv->props_cancel != NULL) {
468
431
                g_object_unref(priv->props_cancel);
486
449
}
487
450
 
488
451
/* Get the location of this entry */
489
 
guint
490
 
window_menus_get_location (WindowMenus * wm, IndicatorObjectEntry * entry)
 
452
static guint
 
453
get_location (WindowMenu * wm, IndicatorObjectEntry * entry)
491
454
{
 
455
        g_return_val_if_fail(IS_WINDOW_MENU_DBUSMENU(wm), 0);
 
456
 
492
457
        if (entry == NULL) {
493
458
                return 0;
494
459
        }
495
460
 
496
461
        guint i;
497
 
        WindowMenusPrivate * priv = WINDOW_MENUS_GET_PRIVATE(wm);
 
462
        WindowMenuDbusmenuPrivate * priv = WINDOW_MENU_DBUSMENU_GET_PRIVATE(wm);
498
463
        for (i = 0; i < priv->entries->len; i++) {
499
464
                if (entry == g_array_index(priv->entries, IndicatorObjectEntry *, i)) {
500
465
                        break;
509
474
}
510
475
 
511
476
/* Get the entries that we have */
512
 
GList *
513
 
window_menus_get_entries (WindowMenus * wm)
 
477
static GList *
 
478
get_entries (WindowMenu * wm)
514
479
{
515
 
        g_return_val_if_fail(IS_WINDOW_MENUS(wm), NULL);
516
 
        WindowMenusPrivate * priv = WINDOW_MENUS_GET_PRIVATE(wm);
 
480
        g_return_val_if_fail(IS_WINDOW_MENU_DBUSMENU(wm), NULL);
 
481
        WindowMenuDbusmenuPrivate * priv = WINDOW_MENU_DBUSMENU_GET_PRIVATE(wm);
517
482
 
518
483
        int i;
519
484
        GList * output = NULL;
532
497
static void
533
498
new_root_helper (DbusmenuMenuitem * item, gpointer user_data)
534
499
{
535
 
        WindowMenusPrivate * priv = WINDOW_MENUS_GET_PRIVATE(user_data);
 
500
        WindowMenuDbusmenuPrivate * priv = WINDOW_MENU_DBUSMENU_GET_PRIVATE(user_data);
536
501
        menu_entry_added(dbusmenu_client_get_root(DBUSMENU_CLIENT(priv->client)), item, priv->entries->len, user_data);
537
502
        return;
538
503
}
554
519
static void
555
520
root_changed (DbusmenuClient * client, DbusmenuMenuitem * new_root, gpointer user_data)
556
521
{
557
 
        g_return_if_fail(IS_WINDOW_MENUS(user_data));
558
 
        WindowMenusPrivate * priv = WINDOW_MENUS_GET_PRIVATE(user_data);
 
522
        g_return_if_fail(IS_WINDOW_MENU_DBUSMENU(user_data));
 
523
        WindowMenuDbusmenuPrivate * priv = WINDOW_MENU_DBUSMENU_GET_PRIVATE(user_data);
559
524
 
560
525
        /* Remove the old entries */
561
526
        free_entries(G_OBJECT(user_data), TRUE);
596
561
static void
597
562
menu_entry_added (DbusmenuMenuitem * root, DbusmenuMenuitem * newentry, guint position, gpointer user_data)
598
563
{
599
 
        g_return_if_fail(IS_WINDOW_MENUS(user_data));
600
 
        WindowMenusPrivate * priv = WINDOW_MENUS_GET_PRIVATE(user_data);
 
564
        g_return_if_fail(IS_WINDOW_MENU_DBUSMENU(user_data));
 
565
        WindowMenuDbusmenuPrivate * priv = WINDOW_MENU_DBUSMENU_GET_PRIVATE(user_data);
601
566
 
602
567
        g_signal_connect(G_OBJECT(newentry), DBUSMENU_MENUITEM_SIGNAL_REALIZED, G_CALLBACK(menu_entry_realized), user_data);
603
568
 
638
603
static void
639
604
menu_entry_realized (DbusmenuMenuitem * newentry, gpointer user_data)
640
605
{
641
 
        g_return_if_fail(IS_WINDOW_MENUS(user_data));
642
 
        WindowMenusPrivate * priv = WINDOW_MENUS_GET_PRIVATE(user_data);
 
606
        g_return_if_fail(IS_WINDOW_MENU_DBUSMENU(user_data));
 
607
        WindowMenuDbusmenuPrivate * priv = WINDOW_MENU_DBUSMENU_GET_PRIVATE(user_data);
643
608
 
644
609
        GtkMenu * menu = dbusmenu_gtkclient_menuitem_get_submenu(priv->client, newentry);
645
610
 
696
661
                entry->accessible_desc = g_variant_get_string(value, NULL);
697
662
 
698
663
                if (wmentry->wm != NULL) {
699
 
                        g_signal_emit(G_OBJECT(wmentry->wm), A11Y_UPDATE, 0, entry, TRUE);
 
664
                        g_signal_emit_by_name(G_OBJECT(wmentry->wm), WINDOW_MENU_SIGNAL_A11Y_UPDATE, entry, TRUE);
700
665
                }
701
666
        }
702
667
 
709
674
{
710
675
        /* Grab our values out to stack variables */
711
676
        DbusmenuMenuitem * newentry = DBUSMENU_MENUITEM(((gpointer *)user_data)[1]);
712
 
        WindowMenus * wm = WINDOW_MENUS(((gpointer *)user_data)[0]);
 
677
        WindowMenuDbusmenu * wm = WINDOW_MENU_DBUSMENU(((gpointer *)user_data)[0]);
713
678
 
714
679
        g_return_if_fail(newentry != NULL);
715
680
        g_return_if_fail(wm != NULL);
725
690
                g_signal_handlers_disconnect_by_func(G_OBJECT(child), menu_child_realized, user_data);
726
691
        }
727
692
 
728
 
        WindowMenusPrivate * priv = WINDOW_MENUS_GET_PRIVATE(wm);
 
693
        WindowMenuDbusmenuPrivate * priv = WINDOW_MENU_DBUSMENU_GET_PRIVATE(wm);
729
694
        WMEntry * wmentry = g_new0(WMEntry, 1);
730
695
        wmentry->wm = wm;
731
696
        IndicatorObjectEntry * entry = &wmentry->ioentry;
770
735
 
771
736
        g_array_append_val(priv->entries, wmentry);
772
737
 
773
 
        g_signal_emit(G_OBJECT(wm), signals[ENTRY_ADDED], 0, entry, TRUE);
 
738
        g_signal_emit_by_name(G_OBJECT(wm), WINDOW_MENU_SIGNAL_ENTRY_ADDED, entry, TRUE);
774
739
 
775
740
        g_object_unref(newentry);
776
741
 
794
759
static void
795
760
menu_entry_removed (DbusmenuMenuitem * root, DbusmenuMenuitem * oldentry, gpointer user_data)
796
761
{
797
 
        g_return_if_fail(IS_WINDOW_MENUS(user_data));
 
762
        g_return_if_fail(IS_WINDOW_MENU_DBUSMENU(user_data));
798
763
        g_return_if_fail(DBUSMENU_IS_MENUITEM(oldentry));
799
 
        WindowMenusPrivate * priv = WINDOW_MENUS_GET_PRIVATE(user_data);
 
764
        WindowMenuDbusmenuPrivate * priv = WINDOW_MENU_DBUSMENU_GET_PRIVATE(user_data);
800
765
 
801
766
        if (priv->entries == NULL || priv->entries->len == 0) {
802
767
                return;
803
768
        }
804
769
 
805
770
        guint position;
806
 
        IndicatorObjectEntry * entry = get_entry(WINDOW_MENUS(user_data), oldentry, &position);
 
771
        IndicatorObjectEntry * entry = get_entry(WINDOW_MENU_DBUSMENU(user_data), oldentry, &position);
807
772
 
808
773
        if (entry != NULL) {
809
774
                g_array_remove_index(priv->entries, position);
810
 
                g_signal_emit(G_OBJECT(user_data), signals[ENTRY_REMOVED], 0, entry, TRUE);
 
775
                g_signal_emit_by_name(G_OBJECT(user_data), WINDOW_MENU_SIGNAL_ENTRY_REMOVED, entry, TRUE);
811
776
                entry_free(entry);
812
777
        } else {
813
778
                /* We've been called before menu_child_realized fired,
821
786
}
822
787
 
823
788
/* Get the XID of this window */
824
 
guint
825
 
window_menus_get_xid (WindowMenus * wm)
 
789
static guint
 
790
get_xid (WindowMenu * wm)
826
791
{
827
 
        WindowMenusPrivate * priv = WINDOW_MENUS_GET_PRIVATE(wm);
 
792
        g_return_val_if_fail(IS_WINDOW_MENU_DBUSMENU(wm), 0);
 
793
        WindowMenuDbusmenuPrivate * priv = WINDOW_MENU_DBUSMENU_GET_PRIVATE(wm);
828
794
        return priv->windowid;
829
795
}
830
796
 
831
797
/* Get the path for this object */
832
798
gchar *
833
 
window_menus_get_path (WindowMenus * wm)
 
799
window_menu_dbusmenu_get_path (WindowMenuDbusmenu * wm)
834
800
{
835
 
        WindowMenusPrivate * priv = WINDOW_MENUS_GET_PRIVATE(wm);
 
801
        g_return_val_if_fail(IS_WINDOW_MENU_DBUSMENU(wm), NULL);
 
802
        WindowMenuDbusmenuPrivate * priv = WINDOW_MENU_DBUSMENU_GET_PRIVATE(wm);
836
803
        GValue obj = {0};
837
804
        g_value_init(&obj, G_TYPE_STRING);
838
805
        g_object_get_property(G_OBJECT(priv->client), DBUSMENU_CLIENT_PROP_DBUS_OBJECT, &obj);
843
810
 
844
811
/* Get the address of this object */
845
812
gchar *
846
 
window_menus_get_address (WindowMenus * wm)
 
813
window_menu_dbusmenu_get_address (WindowMenuDbusmenu * wm)
847
814
{
848
 
        WindowMenusPrivate * priv = WINDOW_MENUS_GET_PRIVATE(wm);
 
815
        g_return_val_if_fail(IS_WINDOW_MENU_DBUSMENU(wm), NULL);
 
816
        WindowMenuDbusmenuPrivate * priv = WINDOW_MENU_DBUSMENU_GET_PRIVATE(wm);
849
817
        GValue obj = {0};
850
818
        g_value_init(&obj, G_TYPE_STRING);
851
819
        g_object_get_property(G_OBJECT(priv->client), DBUSMENU_CLIENT_PROP_DBUS_NAME, &obj);
855
823
}
856
824
 
857
825
/* Return whether we're in an error state or not */
858
 
gboolean
859
 
window_menus_get_error_state (WindowMenus * wm)
 
826
static gboolean
 
827
get_error_state (WindowMenu * wm)
860
828
{
861
 
        g_return_val_if_fail(IS_WINDOW_MENUS(wm), TRUE);
862
 
        WindowMenusPrivate * priv = WINDOW_MENUS_GET_PRIVATE(wm);
 
829
        g_return_val_if_fail(IS_WINDOW_MENU_DBUSMENU(wm), TRUE);
 
830
        WindowMenuDbusmenuPrivate * priv = WINDOW_MENU_DBUSMENU_GET_PRIVATE(wm);
863
831
        return priv->error_state;
864
832
}
865
833
 
866
834
/* Regain whether we're supposed to be hidden or disabled, we
867
835
   want to keep that if that's the case, otherwise bring back
868
836
   to the base state */
869
 
void
870
 
window_menus_entry_restore (WindowMenus * wm, IndicatorObjectEntry * entry)
 
837
static void
 
838
entry_restore (WindowMenu * wm, IndicatorObjectEntry * entry)
871
839
{
 
840
        g_return_if_fail(IS_WINDOW_MENU_DBUSMENU(wm));
872
841
        WMEntry * wmentry = (WMEntry *)entry;
873
842
 
874
843
        if (entry->label != NULL) {
894
863
 
895
864
/* Signaled when the menu item is activated on the panel so we
896
865
   can pass it down the stack. */
897
 
void
898
 
window_menus_entry_activate (WindowMenus * wm, IndicatorObjectEntry * entry, guint timestamp)
 
866
static void
 
867
entry_activate (WindowMenu * wm, IndicatorObjectEntry * entry, guint timestamp)
899
868
{
 
869
        g_return_if_fail(IS_WINDOW_MENU_DBUSMENU(wm));
900
870
        WMEntry * wme = (WMEntry *)entry;
901
871
        dbusmenu_menuitem_send_about_to_show(wme->mi, NULL, NULL);
902
872
        return;