1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
#include <gtk/gtk.h>
#include <libindicator/indicator-object.h>
#define ENTRY_DATA_NAME "indicator-custom-entry-data"
static void
entry_added (IndicatorObject * io, IndicatorObjectEntry * entry, gpointer user_data)
{
g_debug("Signal: Entry Added");
GtkWidget * menuitem = gtk_menu_item_new();
GtkWidget * hbox = gtk_hbox_new(FALSE, 3);
if (entry->image != NULL) {
gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(entry->image), FALSE, FALSE, 0);
}
if (entry->label != NULL) {
gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(entry->label), FALSE, FALSE, 0);
}
gtk_container_add(GTK_CONTAINER(menuitem), hbox);
gtk_widget_show(hbox);
if (entry->menu != NULL) {
gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), GTK_WIDGET(entry->menu));
}
gtk_menu_shell_append(GTK_MENU_SHELL(user_data), menuitem);
gtk_widget_show(menuitem);
g_object_set_data(G_OBJECT(menuitem), ENTRY_DATA_NAME, entry);
return;
}
static void
entry_removed_cb (GtkWidget * widget, gpointer userdata)
{
gpointer data = g_object_get_data(G_OBJECT(widget), ENTRY_DATA_NAME);
if (data != userdata) {
return;
}
gtk_widget_destroy(widget);
return;
}
static void
entry_removed (IndicatorObject * io, IndicatorObjectEntry * entry, gpointer user_data)
{
g_debug("Signal: Entry Removed");
gtk_container_foreach(GTK_CONTAINER(user_data), entry_removed_cb, entry);
return;
}
static gboolean
load_module (const gchar * name, GtkWidget * menu)
{
g_debug("Looking at Module: %s", name);
g_return_val_if_fail(name != NULL, FALSE);
if (!g_str_has_suffix(name, G_MODULE_SUFFIX)) {
return FALSE;
}
g_debug("Loading Module: %s", name);
/* Build the object for the module */
IndicatorObject * io = indicator_object_new_from_file(name);
/* Connect to it's signals */
g_signal_connect(G_OBJECT(io), INDICATOR_OBJECT_SIGNAL_ENTRY_ADDED, G_CALLBACK(entry_added), menu);
g_signal_connect(G_OBJECT(io), INDICATOR_OBJECT_SIGNAL_ENTRY_REMOVED, G_CALLBACK(entry_removed), menu);
/* Work on the entries */
GList * entries = indicator_object_get_entries(io);
GList * entry = NULL;
for (entry = entries; entry != NULL; entry = g_list_next(entry)) {
IndicatorObjectEntry * entrydata = (IndicatorObjectEntry *)entry->data;
entry_added(io, entrydata, menu);
}
g_list_free(entries);
return TRUE;
}
static void
destroy (gpointer data)
{
gtk_main_quit();
return;
}
int
main (int argc, char ** argv)
{
gtk_init(&argc, &argv);
if (argc != 2) {
g_error("Need filename");
return 1;
}
GtkWidget * menubar = gtk_menu_bar_new();
if (!load_module(argv[1], menubar)) {
g_error("Unable to load module");
return 1;
}
GtkWidget * window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(destroy), NULL);
gtk_container_add(GTK_CONTAINER(window), menubar);
gtk_widget_show(menubar);
gtk_widget_show(window);
gtk_main();
return 0;
}
|