summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authorGravatar waker <wakeroid@gmail.com>2012-04-24 21:15:49 +0200
committerGravatar waker <wakeroid@gmail.com>2012-04-24 21:15:49 +0200
commit2bc3805d6b6d6fbcf3a8284f00ada82ce71fa909 (patch)
tree1049727bb8e8f56869ecbbe0afad117dc6406302 /plugins
parentcb64b22d7206a534ebddbb961868b41449abe3bb (diff)
gtkui: automatically reinit main menu on actions change
Diffstat (limited to 'plugins')
-rw-r--r--plugins/cdda/cdda.c1
-rw-r--r--plugins/gtkui/actions.c37
-rw-r--r--plugins/gtkui/actions.h2
-rw-r--r--plugins/gtkui/gtkui.c5
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;
}