54
54
DbusmenuMenuitem * mi;
58
#define WINDOW_MENUS_GET_PRIVATE(o) \
59
(G_TYPE_INSTANCE_GET_PRIVATE ((o), WINDOW_MENUS_TYPE, WindowMenusPrivate))
73
static guint signals[LAST_SIGNAL] = { 0 };
55
WindowMenuDbusmenu * wm;
58
#define WINDOW_MENU_DBUSMENU_GET_PRIVATE(o) \
59
(G_TYPE_INSTANCE_GET_PRIVATE ((o), WINDOW_MENU_DBUSMENU_TYPE, WindowMenuDbusmenuPrivate))
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);
90
G_DEFINE_TYPE (WindowMenus, window_menus, G_TYPE_OBJECT);
83
G_DEFINE_TYPE (WindowMenuDbusmenu, window_menu_dbusmenu, WINDOW_MENU_TYPE);
92
85
/* Build the one-time class */
94
window_menus_class_init (WindowMenusClass *klass)
87
window_menu_dbusmenu_class_init (WindowMenuDbusmenuClass *klass)
96
89
GObjectClass *object_class = G_OBJECT_CLASS (klass);
98
g_type_class_add_private (klass, sizeof (WindowMenusPrivate));
100
object_class->dispose = window_menus_dispose;
103
signals[ENTRY_ADDED] = g_signal_new(WINDOW_MENUS_SIGNAL_ENTRY_ADDED,
104
G_TYPE_FROM_CLASS(klass),
106
G_STRUCT_OFFSET (WindowMenusClass, entry_added),
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),
113
G_STRUCT_OFFSET (WindowMenusClass, entry_removed),
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),
120
G_STRUCT_OFFSET (WindowMenusClass, error_state),
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),
127
G_STRUCT_OFFSET (WindowMenusClass, status_changed),
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),
134
G_STRUCT_OFFSET (WindowMenusClass, show_menu),
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),
141
G_STRUCT_OFFSET (WindowMenusClass, a11y_update),
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));
93
object_class->dispose = window_menu_dbusmenu_dispose;
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;
149
107
/* Initialize the per-instance data */
151
window_menus_init (WindowMenus *self)
109
window_menu_dbusmenu_init (WindowMenuDbusmenu *self)
153
WindowMenusPrivate * priv = WINDOW_MENUS_GET_PRIVATE(self);
111
WindowMenuDbusmenuPrivate * priv = WINDOW_MENU_DBUSMENU_GET_PRIVATE(self);
155
113
priv->client = NULL;
156
114
priv->props_cancel = NULL;
365
323
item_activate (DbusmenuClient * client, DbusmenuMenuitem * item, guint timestamp, gpointer user_data)
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);
370
328
if (priv->root == NULL) {
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) {
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);
388
346
status_changed (DbusmenuClient * client, GParamSpec * pspec, gpointer user_data)
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));
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
356
static WindowMenuStatus
357
get_status (WindowMenu * wm)
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);
399
return dbusmenu_client_get_status (DBUSMENU_CLIENT (priv->client));
362
return dbusmenu_status_table[dbusmenu_client_get_status (DBUSMENU_CLIENT (priv->client))];
402
365
/* Build a new window menus object and attach to the signals to build
403
366
up the representative menu. */
405
window_menus_new (const guint windowid, const gchar * dbus_addr, const gchar * dbus_object)
368
window_menu_dbusmenu_new (const guint windowid, const gchar * dbus_addr, const gchar * dbus_object)
407
370
g_debug("Creating new windows menu: %X, %s, %s", windowid, dbus_addr, dbus_object);
795
760
menu_entry_removed (DbusmenuMenuitem * root, DbusmenuMenuitem * oldentry, gpointer user_data)
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);
801
766
if (priv->entries == NULL || priv->entries->len == 0) {
806
IndicatorObjectEntry * entry = get_entry(WINDOW_MENUS(user_data), oldentry, &position);
771
IndicatorObjectEntry * entry = get_entry(WINDOW_MENU_DBUSMENU(user_data), oldentry, &position);
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);
813
778
/* We've been called before menu_child_realized fired,
823
788
/* Get the XID of this window */
825
window_menus_get_xid (WindowMenus * wm)
790
get_xid (WindowMenu * wm)
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;
831
797
/* Get the path for this object */
833
window_menus_get_path (WindowMenus * wm)
799
window_menu_dbusmenu_get_path (WindowMenuDbusmenu * wm)
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);
857
825
/* Return whether we're in an error state or not */
859
window_menus_get_error_state (WindowMenus * wm)
827
get_error_state (WindowMenu * wm)
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;
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 */
870
window_menus_entry_restore (WindowMenus * wm, IndicatorObjectEntry * entry)
838
entry_restore (WindowMenu * wm, IndicatorObjectEntry * entry)
840
g_return_if_fail(IS_WINDOW_MENU_DBUSMENU(wm));
872
841
WMEntry * wmentry = (WMEntry *)entry;
874
843
if (entry->label != NULL) {