diff options
author | waker <wakeroid@gmail.com> | 2012-04-09 16:29:23 +0200 |
---|---|---|
committer | waker <wakeroid@gmail.com> | 2012-04-09 16:29:23 +0200 |
commit | 516f25073a726709abb83c3b73bd1e53404514c9 (patch) | |
tree | 68113731910c0df756717191a9cfaf55be514130 /plugins/gtkui/ddbtabstrip.c | |
parent | 6502057510696ea575a1cf0143dec02acb7cf01c (diff) | |
parent | 1ed51a80ec0979bc0be453f75548c59965fbd6f5 (diff) |
Merge branch 'master' into devel
Conflicts:
plugins/gtkui/callbacks.c
plugins/gtkui/callbacks.h
plugins/gtkui/gtkui.h
Diffstat (limited to 'plugins/gtkui/ddbtabstrip.c')
-rw-r--r-- | plugins/gtkui/ddbtabstrip.c | 138 |
1 files changed, 137 insertions, 1 deletions
diff --git a/plugins/gtkui/ddbtabstrip.c b/plugins/gtkui/ddbtabstrip.c index 8b260cf8..18151ff4 100644 --- a/plugins/gtkui/ddbtabstrip.c +++ b/plugins/gtkui/ddbtabstrip.c @@ -1,6 +1,6 @@ /* DeaDBeeF - ultimate music player for GNU/Linux systems with X11 - Copyright (C) 2009-2011 Alexey Yakovenko <waker@users.sourceforge.net> + Copyright (C) 2009-2012 Alexey Yakovenko <waker@users.sourceforge.net> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -20,6 +20,7 @@ #include <string.h> #include <assert.h> #include <glib.h> +#include <stdlib.h> #include "ddbtabstrip.h" #include "drawing.h" #include "gtkui.h" @@ -795,6 +796,139 @@ on_add_new_playlist1_activate (GtkMenuItem *menuitem, } } +static void +on_actionitem_activate (GtkMenuItem *menuitem, + DB_plugin_action_t *action) +{ + ddb_playlist_t *plt = NULL; + if (tab_clicked != -1) { + plt = deadbeef->plt_get_for_idx (tab_clicked); + } + action->callback (action, plt); + deadbeef->plt_unref (plt); +} + +static GtkWidget* +find_popup (GtkWidget *widget, + const gchar *widget_name) +{ + GtkWidget *parent, *found_widget; + + for (;;) + { + if (GTK_IS_MENU (widget)) + parent = gtk_menu_get_attach_widget (GTK_MENU (widget)); + else + parent = gtk_widget_get_parent (widget); + if (!parent) + parent = (GtkWidget*) g_object_get_data (G_OBJECT (widget), "GladeParentKey"); + if (parent == NULL) + break; + widget = parent; + } + + found_widget = (GtkWidget*) g_object_get_data (G_OBJECT (widget), + widget_name); + return found_widget; +} + +void +add_tab_actions (GtkWidget *menu) { + DB_plugin_t **plugins = deadbeef->plug_get_list(); + int i; + + int added_entries = 0; + for (i = 0; plugins[i]; i++) + { + if (!plugins[i]->get_actions) + continue; + + DB_plugin_action_t *actions = plugins[i]->get_actions (NULL); + DB_plugin_action_t *action; + + int count = 0; + for (action = actions; action; action = action->next) + { + char *tmp = NULL; + if (!(action->flags & DB_ACTION_PLAYLIST)) + continue; + + // create submenus (separated with '/') + const char *prev = action->title; + while (*prev && *prev == '/') { + prev++; + } + + GtkWidget *popup = NULL; + + for (;;) { + const char *slash = strchr (prev, '/'); + if (slash && *(slash-1) != '\\') { + char name[slash-prev+1]; + // replace \/ with / + const char *p = prev; + char *t = name; + while (*p && p < slash) { + if (*p == '\\' && *(p+1) == '/') { + *t++ = '/'; + p += 2; + } + else { + *t++ = *p++; + } + } + *t = 0; + + // add popup + GtkWidget *prev_menu = popup ? popup : menu; + + popup = find_popup (prev_menu, name); + if (!popup) { + GtkWidget *item = gtk_image_menu_item_new_with_mnemonic (_(name)); + gtk_widget_show (item); + gtk_container_add (GTK_CONTAINER (prev_menu), item); + popup = gtk_menu_new (); + //HOOKUP_OBJECT (prev_menu, popup, name); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), popup); + } + } + else { + break; + } + prev = slash+1; + } + + + count++; + added_entries++; + GtkWidget *actionitem; + + // replace \/ with / + const char *p = popup ? prev : action->title; + char title[strlen (p)+1]; + char *t = title; + while (*p) { + if (*p == '\\' && *(p+1) == '/') { + *t++ = '/'; + p += 2; + } + else { + *t++ = *p++; + } + } + *t = 0; + + actionitem = gtk_menu_item_new_with_mnemonic (_(title)); + gtk_widget_show (actionitem); + gtk_container_add (popup ? GTK_CONTAINER (popup) : GTK_CONTAINER (menu), actionitem); + + g_signal_connect ((gpointer) actionitem, "activate", + G_CALLBACK (on_actionitem_activate), + action); + } + } +} + GtkWidget* create_plmenu (void) { @@ -843,6 +977,8 @@ create_plmenu (void) GLADE_HOOKUP_OBJECT (plmenu, remove_playlist1, "remove_playlist1"); GLADE_HOOKUP_OBJECT (plmenu, add_new_playlist1, "add_new_playlist1"); + add_tab_actions (plmenu); + return plmenu; } |