diff options
author | waker <wakeroid@gmail.com> | 2012-04-24 21:15:49 +0200 |
---|---|---|
committer | waker <wakeroid@gmail.com> | 2012-04-24 21:15:49 +0200 |
commit | 2bc3805d6b6d6fbcf3a8284f00ada82ce71fa909 (patch) | |
tree | 1049727bb8e8f56869ecbbe0afad117dc6406302 /plugins | |
parent | cb64b22d7206a534ebddbb961868b41449abe3bb (diff) |
gtkui: automatically reinit main menu on actions change
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/cdda/cdda.c | 1 | ||||
-rw-r--r-- | plugins/gtkui/actions.c | 37 | ||||
-rw-r--r-- | plugins/gtkui/actions.h | 2 | ||||
-rw-r--r-- | plugins/gtkui/gtkui.c | 5 |
4 files changed, 40 insertions, 5 deletions
diff --git a/plugins/cdda/cdda.c b/plugins/cdda/cdda.c index 44c04e7a..51d4b686 100644 --- a/plugins/cdda/cdda.c +++ b/plugins/cdda/cdda.c @@ -601,6 +601,7 @@ cda_action_add_cd (DB_plugin_action_t *act, DB_playItem_t *it) } static DB_plugin_action_t add_cd_action = { + .name = "cd_add", .title = "File/Add Audio CD", .flags = DB_ACTION_COMMON, .callback = DDB_ACTION_CALLBACK(cda_action_add_cd), diff --git a/plugins/gtkui/actions.c b/plugins/gtkui/actions.c index f96caee4..1cb67d49 100644 --- a/plugins/gtkui/actions.c +++ b/plugins/gtkui/actions.c @@ -40,8 +40,38 @@ on_actionitem_activate (GtkMenuItem *menuitem, } void -add_mainmenu_actions (GtkWidget *mainwin) +remove_actions (GtkWidget *widget, void *data) { + if (GTK_IS_MENU_ITEM (widget)) { + const char *name = gtk_menu_item_get_label (GTK_MENU_ITEM (widget)); + } + const char *name = g_object_get_data (G_OBJECT (widget), "plugaction"); + if (name) { + gtk_container_remove (GTK_CONTAINER (data), widget); + } + if (GTK_IS_MENU_ITEM (widget)) { + GtkWidget *menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (widget)); + if (menu) { + gtk_container_foreach (GTK_CONTAINER (menu), remove_actions, menu); + // if menu is empty -- remove parent menu item + GList *lst = gtk_container_get_children (GTK_CONTAINER (menu)); + if (lst) { + g_list_free (lst); + } + else { + gtk_container_remove (data, widget); + } + } + } +} + +void +add_mainmenu_actions (void) { + GtkWidget *menubar = lookup_widget (mainwin, "menubar1"); + // remove all plugaction_*** menu items and empty submenus + gtk_container_foreach (GTK_CONTAINER (menubar), remove_actions, menubar); + + // add new DB_plugin_t **plugins = deadbeef->plug_get_list(); int i; @@ -76,7 +106,7 @@ add_mainmenu_actions (GtkWidget *mainwin) char *prev_title = NULL; - GtkWidget *current = lookup_widget (mainwin, "menubar1"); + GtkWidget *current = menubar; GtkWidget *previous; while (1) @@ -106,6 +136,7 @@ add_mainmenu_actions (GtkWidget *mainwin) g_signal_connect ((gpointer) actionitem, "activate", G_CALLBACK (on_actionitem_activate), action); + g_object_set_data_full (G_OBJECT (actionitem), "plugaction", strdup (action->name), free); break; } *slash = 0; @@ -130,7 +161,7 @@ add_mainmenu_actions (GtkWidget *mainwin) current = gtk_menu_new (); gtk_menu_item_set_submenu (GTK_MENU_ITEM (newitem), current); - GLADE_HOOKUP_OBJECT (mainwin, current, "Plugins_menu"); + GLADE_HOOKUP_OBJECT (mainwin, current, menuname); } prev_title = ptr; ptr = slash + 1; diff --git a/plugins/gtkui/actions.h b/plugins/gtkui/actions.h index 56dc3425..cbcce711 100644 --- a/plugins/gtkui/actions.h +++ b/plugins/gtkui/actions.h @@ -21,6 +21,6 @@ #ifndef __ACTIONS_H #define __ACTIONS_H -void add_mainmenu_actions (GtkWidget *mainwin); +void add_mainmenu_actions (void); #endif diff --git a/plugins/gtkui/gtkui.c b/plugins/gtkui/gtkui.c index b067bd23..951928ff 100644 --- a/plugins/gtkui/gtkui.c +++ b/plugins/gtkui/gtkui.c @@ -1021,6 +1021,9 @@ gtkui_message (uint32_t id, uintptr_t ctx, uint32_t p1, uint32_t p2) { case DB_EV_PLAYLISTSWITCHED: g_idle_add (playlistswitch_cb, NULL); break; + case DB_EV_ACTIONSCHANGED: + add_mainmenu_actions (); + break; } return 0; } @@ -1292,7 +1295,7 @@ gtkui_connect_cb (void *none) { } } gtkui_playlist_changed (); - add_mainmenu_actions (mainwin); + add_mainmenu_actions (); return FALSE; } |