@@ -18,6 +18,7 @@ typedef struct {
18
18
19
19
typedef struct {
20
20
int menu_id ;
21
+ int parent_menu_id ;
21
22
char * title ;
22
23
char * tooltip ;
23
24
short disabled ;
@@ -27,8 +28,7 @@ typedef struct {
27
28
28
29
void registerSystray (void ) {
29
30
gtk_init (0 , NULL );
30
- global_app_indicator = app_indicator_new ("systray" , "" ,
31
- APP_INDICATOR_CATEGORY_APPLICATION_STATUS );
31
+ global_app_indicator = app_indicator_new ("systray" , "" , APP_INDICATOR_CATEGORY_APPLICATION_STATUS );
32
32
app_indicator_set_status (global_app_indicator , APP_INDICATOR_STATUS_ACTIVE );
33
33
global_tray_menu = gtk_menu_new ();
34
34
app_indicator_set_menu (global_app_indicator , GTK_MENU (global_tray_menu ));
@@ -86,6 +86,17 @@ void _systray_menu_item_selected(int *id) {
86
86
systray_menu_item_selected (* id );
87
87
}
88
88
89
+ GtkMenuItem * find_menu_by_id (int id ) {
90
+ GList * it ;
91
+ for (it = global_menu_items ; it != NULL ; it = it -> next ) {
92
+ MenuItemNode * item = (MenuItemNode * )(it -> data );
93
+ if (item -> menu_id == id ) {
94
+ return GTK_MENU_ITEM (item -> menu_item );
95
+ }
96
+ }
97
+ return NULL ;
98
+ }
99
+
89
100
// runs in main thread, should always return FALSE to prevent gtk to execute it again
90
101
gboolean do_add_or_update_menu_item (gpointer data ) {
91
102
MenuItemInfo * mii = (MenuItemInfo * )data ;
@@ -124,7 +135,19 @@ gboolean do_add_or_update_menu_item(gpointer data) {
124
135
id
125
136
);
126
137
127
- gtk_menu_shell_append (GTK_MENU_SHELL (global_tray_menu ), menu_item );
138
+ if (mii -> parent_menu_id == 0 ) {
139
+ gtk_menu_shell_append (GTK_MENU_SHELL (global_tray_menu ), menu_item );
140
+ } else {
141
+ GtkMenuItem * parentMenuItem = find_menu_by_id (mii -> parent_menu_id );
142
+ GtkWidget * parentMenu = gtk_menu_item_get_submenu (parentMenuItem );
143
+
144
+ if (parentMenu == NULL ) {
145
+ parentMenu = gtk_menu_new ();
146
+ gtk_menu_item_set_submenu (parentMenuItem , parentMenu );
147
+ }
148
+
149
+ gtk_menu_shell_append (GTK_MENU_SHELL (parentMenu ), menu_item );
150
+ }
128
151
129
152
MenuItemNode * new_item = malloc (sizeof (MenuItemNode ));
130
153
new_item -> menu_id = mii -> menu_id ;
@@ -139,8 +162,8 @@ gboolean do_add_or_update_menu_item(gpointer data) {
139
162
global_menu_items = new_node ;
140
163
it = new_node ;
141
164
}
142
- GtkWidget * menu_item = GTK_WIDGET (((MenuItemNode * )(it -> data ))-> menu_item );
143
- gtk_widget_set_sensitive (menu_item , mii -> disabled == 1 ? FALSE : TRUE );
165
+ GtkWidget * menu_item = GTK_WIDGET (((MenuItemNode * )(it -> data ))-> menu_item );
166
+ gtk_widget_set_sensitive (menu_item , mii -> disabled != 1 );
144
167
gtk_widget_show (menu_item );
145
168
146
169
free (mii -> title );
@@ -211,9 +234,9 @@ void setMenuItemIcon(const char* iconBytes, int length, int menuId, bool templat
211
234
}
212
235
213
236
void add_or_update_menu_item (int menu_id , int parent_menu_id , char * title , char * tooltip , short disabled , short checked , short isCheckable ) {
214
- // TODO: add support for sub-menus
215
237
MenuItemInfo * mii = malloc (sizeof (MenuItemInfo ));
216
238
mii -> menu_id = menu_id ;
239
+ mii -> parent_menu_id = parent_menu_id ;
217
240
mii -> title = title ;
218
241
mii -> tooltip = tooltip ;
219
242
mii -> disabled = disabled ;
0 commit comments