diff options
author | Viktor Semykin <thesame.ml@gmail.com> | 2010-05-26 03:42:59 +0300 |
---|---|---|
committer | Viktor Semykin <thesame.ml@gmail.com> | 2010-05-26 03:42:59 +0300 |
commit | a6800830237690618eb454ab331ca6e4bdbd4100 (patch) | |
tree | ca1b2069f87c37f13f210bb053533fa730c2f2da | |
parent | 8c012917f5530d947c1a31adfc6aba4b0cf3853c (diff) |
New plugins' actions system
-rw-r--r-- | deadbeef.h | 52 | ||||
-rw-r--r-- | plugins/cdda/cdda.c | 24 | ||||
-rw-r--r-- | plugins/gtkui/Makefile.am | 3 | ||||
-rw-r--r-- | plugins/gtkui/actions.c | 122 | ||||
-rw-r--r-- | plugins/gtkui/actions.h | 29 | ||||
-rw-r--r-- | plugins/gtkui/callbacks.h | 4 | ||||
-rw-r--r-- | plugins/gtkui/deadbeef.glade | 69 | ||||
-rw-r--r-- | plugins/gtkui/gtkui.c | 12 | ||||
-rw-r--r-- | plugins/gtkui/interface.c | 321 | ||||
-rw-r--r-- | plugins/gtkui/plcommon.c | 82 | ||||
-rw-r--r-- | plugins/lastfm/lastfm.c | 34 | ||||
-rw-r--r-- | plugins/shellexec/shellexec.c | 63 |
12 files changed, 495 insertions, 320 deletions
@@ -513,6 +513,37 @@ typedef struct { int (*is_local_file) (const char *fname); // returns 1 for local filename, 0 otherwise } DB_functions_t; +enum { + /* Action in main menu (or whereever ui prefers) */ + DB_ACTION_COMMON = 1 << 0, + + /* Action allowed for single track */ + DB_ACTION_SINGLE_TRACK = 1 << 1, + + /* Action allowed for multiple tracks at once */ + DB_ACTION_ALLOW_MULTIPLE_TRACKS = 1 << 2, + + /* Action can (and prefer) traverse multiple tracks by itself */ + DB_ACTION_CAN_MULTIPLE_TRACKS = 1 << 3 +}; + +typedef struct DB_plugin_action_s { + const char *title; + unsigned int flags; + /* + Function called when user activates menu item + @it - pointer to selected playitem for single-track action, + to first playitem for multiple-track action, + or NULL for common action + @data - opaque pointer + */ + int (*callback) (DB_playItem_t *it, void *data); + void *data; + + //we have linked list here + struct DB_plugin_action_s *next; +} DB_plugin_action_t; + // base plugin interface typedef struct DB_plugin_s { // type must be one of DB_PLUGIN_ types @@ -549,6 +580,13 @@ typedef struct DB_plugin_s { // plugin configuration dialog is constructed from this data // can be NULL const char *configdialog; + + // actions + /* by get_actions function plugin is queried for implemented actions + @action is linked list (initially null), function must add its actions to list + @returns nonzero on success, 0 on fail + */ + int (*get_actions) (DB_plugin_action_t **actions); } DB_plugin_t; typedef struct DB_fileinfo_s { @@ -646,26 +684,12 @@ typedef struct DB_dsp_s { int (*enabled) (void); } DB_dsp_t; -typedef struct -{ - const char *title; - int (*callback) (DB_playItem_t *it, void *data); - void *data; -} DB_single_action_t; - // misc plugin // purpose is to provide extra services // e.g. scrobbling, converting, tagging, custom gui, etc. // misc plugins should be mostly event driven, so no special entry points in them typedef struct { DB_plugin_t plugin; - /* Returns actions available for this track - it - track - actions - array of actions - size - on input, size of array in pointers; on output - count of actions - returns 0 on error, nonzero on success - */ - int (*get_single_actions) (DB_playItem_t *it, DB_single_action_t *actions[], int *size); } DB_misc_t; // vfs plugin diff --git a/plugins/cdda/cdda.c b/plugins/cdda/cdda.c index ffe77cc7..8e01458e 100644 --- a/plugins/cdda/cdda.c +++ b/plugins/cdda/cdda.c @@ -532,6 +532,29 @@ cda_stop (void) { return 0; } +static int +cda_action_add_cd (DB_playItem_t *unused, void *data) +{ + deadbeef->pl_add_file ("all.cda", NULL, NULL); + //Wtf? + //playlist_refresh (); +} + +static DB_plugin_action_t add_cd_action = { + .title = "File/Add Audio CD", + .flags = DB_ACTION_COMMON, + .callback = cda_action_add_cd, + .next = NULL +}; + +static int +cda_get_actions (DB_plugin_action_t **actions) +{ + add_cd_action.next = *actions; + *actions = &add_cd_action; + return 1; +} + static const char *exts[] = { "cda", "nrg", NULL }; static const char *filetypes[] = { "cdda", NULL }; @@ -558,6 +581,7 @@ static DB_decoder_t plugin = { .plugin.start = cda_start, .plugin.stop = cda_stop, .plugin.configdialog = settings_dlg, + .plugin.get_actions = cda_get_actions, .open = cda_open, .init = cda_init, .free = cda_free, diff --git a/plugins/gtkui/Makefile.am b/plugins/gtkui/Makefile.am index 8212e1f2..ad48aca7 100644 --- a/plugins/gtkui/Makefile.am +++ b/plugins/gtkui/Makefile.am @@ -31,7 +31,8 @@ gtkui_la_SOURCES = $(gtkui_VALABUILTSOURCES)\ coverart.c coverart.h\ plcommon.c plcommon.h\ prefwin.c\ - eq.c eq.h + eq.c eq.h\ + actions.c actions.h gtkui_la_LDFLAGS = -module diff --git a/plugins/gtkui/actions.c b/plugins/gtkui/actions.c new file mode 100644 index 00000000..83f88151 --- /dev/null +++ b/plugins/gtkui/actions.c @@ -0,0 +1,122 @@ +/* + DeaDBeeF - ultimate music player for GNU/Linux systems with X11 + Copyright (C) 2009-2010 Alexey Yakovenko <waker@users.sourceforge.net>, + Viktor Semykin <thesame.ml@gmail.com> + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ +#include <stdio.h> +#include <string.h> + +#include "gtkui.h" +#include "../../deadbeef.h" + +#define trace(...) { fprintf(stderr, __VA_ARGS__); } +//#define trace(fmt,...) + +DB_plugin_action_t *plugins_actions = NULL; + +void +gather_actions () +{ + trace ("gathering actions\n"); + DB_plugin_t **plugins = deadbeef->plug_get_list(); + int i; + + for (i = 0; plugins[i]; i++) + { + if (plugins[i]->get_actions) + plugins[i]->get_actions (&plugins_actions); + } +} + +static void +on_actionitem_activate (GtkMenuItem *menuitem, + DB_plugin_action_t *action) +{ + action->callback (NULL, action->data); +} + +void +add_mainmenu_actions (GtkWidget *mainwin) +{ + DB_plugin_action_t *action; + for (action = plugins_actions; action; action = action->next) + { + if (0 == (action->flags & DB_ACTION_COMMON)) + continue; + + //We won't add item directly to main menu + if (!strchr (action->title, '/')) + continue; + + char *tmp; + char *ptr = tmp = strdup (action->title); + char *prev_title = NULL; + + GtkWidget *current = mainwin; + GtkWidget *previous; + + while (1) + { + char *slash = strchr (ptr, '/'); + if (!slash) + { + GtkWidget *actionitem; + actionitem = gtk_image_menu_item_new_with_mnemonic (ptr); + gtk_widget_show (actionitem); + + /* Here we have special cases for different submenus */ + if (0 == strcmp ("File", prev_title)) + gtk_menu_shell_insert (GTK_MENU_SHELL (current), actionitem, 5); + else if (0 == strcmp ("Edit", prev_title)) + gtk_menu_shell_insert (GTK_MENU_SHELL (current), actionitem, 7); + else + gtk_container_add (GTK_CONTAINER (current), actionitem); + + g_signal_connect ((gpointer) actionitem, "activate", + G_CALLBACK (on_actionitem_activate), + action); + break; + } + *slash = 0; + char menuname [1024]; + + snprintf (menuname, sizeof (menuname), "%s_menu", ptr); + + previous = current; + current = lookup_widget (current, menuname); + if (!current) + { + GtkWidget *newitem; + + newitem = gtk_menu_item_new_with_mnemonic (ptr); + gtk_widget_show (newitem); + + //If we add new submenu in main bar, add it before 'Help' + if (NULL == prev_title) + gtk_menu_shell_insert (GTK_MENU_SHELL (previous), newitem, 4); + else + gtk_container_add (GTK_CONTAINER (previous), newitem); + + current = gtk_menu_new (); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (newitem), current); + } + prev_title = ptr; + ptr = slash + 1; + } + } +} + diff --git a/plugins/gtkui/actions.h b/plugins/gtkui/actions.h new file mode 100644 index 00000000..2f8eb827 --- /dev/null +++ b/plugins/gtkui/actions.h @@ -0,0 +1,29 @@ +/* + DeaDBeeF - ultimate music player for GNU/Linux systems with X11 + Copyright (C) 2009-2010 Alexey Yakovenko <waker@users.sourceforge.net>, + Viktor Semykin <thesame.ml@gmail.com> + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#ifndef __ACTIONS_H +#define __ACTIONS_H + +extern DB_plugin_action_t *plugins_actions; + +void gather_actions (); +void add_mainmenu_actions (GtkWidget *mainwin); + +#endif diff --git a/plugins/gtkui/callbacks.h b/plugins/gtkui/callbacks.h index 29fa5f73..67251101 100644 --- a/plugins/gtkui/callbacks.h +++ b/plugins/gtkui/callbacks.h @@ -367,10 +367,6 @@ on_helpwindow_key_press_event (GtkWidget *widget, gpointer user_data); void -on_add_audio_cd_activate (GtkMenuItem *menuitem, - gpointer user_data); - -void on_preferences_activate (GtkMenuItem *menuitem, gpointer user_data); diff --git a/plugins/gtkui/deadbeef.glade b/plugins/gtkui/deadbeef.glade index 4e43799b..11e0bafa 100644 --- a/plugins/gtkui/deadbeef.glade +++ b/plugins/gtkui/deadbeef.glade @@ -45,13 +45,13 @@ <property name="child_pack_direction">GTK_PACK_DIRECTION_LTR</property> <child> - <widget class="GtkMenuItem" id="menuitem1"> + <widget class="GtkMenuItem" id="File"> <property name="visible">True</property> <property name="label" translatable="yes">_File</property> <property name="use_underline">True</property> <child> - <widget class="GtkMenu" id="menuitem1_menu"> + <widget class="GtkMenu" id="File_menu"> <child> <widget class="GtkImageMenuItem" id="open"> @@ -62,7 +62,7 @@ <accelerator key="O" modifiers="GDK_CONTROL_MASK" signal="activate"/> <child internal-child="image"> - <widget class="GtkImage" id="image376"> + <widget class="GtkImage" id="image423"> <property name="visible">True</property> <property name="stock">gtk-open</property> <property name="icon_size">1</property> @@ -89,7 +89,7 @@ <signal name="activate" handler="on_add_files_activate" last_modification_time="Sat, 04 Jul 2009 13:04:01 GMT"/> <child internal-child="image"> - <widget class="GtkImage" id="image377"> + <widget class="GtkImage" id="image424"> <property name="visible">True</property> <property name="stock">gtk-add</property> <property name="icon_size">1</property> @@ -110,28 +110,7 @@ <signal name="activate" handler="on_add_folders_activate" last_modification_time="Sun, 06 Sep 2009 17:51:40 GMT"/> <child internal-child="image"> - <widget class="GtkImage" id="image378"> - <property name="visible">True</property> - <property name="stock">gtk-add</property> - <property name="icon_size">1</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - </child> - </widget> - </child> - - <child> - <widget class="GtkImageMenuItem" id="add_audio_cd"> - <property name="visible">True</property> - <property name="label" translatable="yes">Add Audio CD</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_add_audio_cd_activate" last_modification_time="Sat, 10 Oct 2009 15:29:22 GMT"/> - - <child internal-child="image"> - <widget class="GtkImage" id="image379"> + <widget class="GtkImage" id="image425"> <property name="visible">True</property> <property name="stock">gtk-add</property> <property name="icon_size">1</property> @@ -211,7 +190,7 @@ <accelerator key="Q" modifiers="GDK_CONTROL_MASK" signal="activate"/> <child internal-child="image"> - <widget class="GtkImage" id="image380"> + <widget class="GtkImage" id="image426"> <property name="visible">True</property> <property name="stock">gtk-quit</property> <property name="icon_size">1</property> @@ -229,13 +208,13 @@ </child> <child> - <widget class="GtkMenuItem" id="edit1"> + <widget class="GtkMenuItem" id="Edit"> <property name="visible">True</property> <property name="label" translatable="yes">_Edit</property> <property name="use_underline">True</property> <child> - <widget class="GtkMenu" id="edit1_menu"> + <widget class="GtkMenu" id="Edit_menu"> <child> <widget class="GtkImageMenuItem" id="clear1"> @@ -245,7 +224,7 @@ <signal name="activate" handler="on_clear1_activate" last_modification_time="Sun, 06 Sep 2009 18:30:03 GMT"/> <child internal-child="image"> - <widget class="GtkImage" id="image381"> + <widget class="GtkImage" id="image427"> <property name="visible">True</property> <property name="stock">gtk-clear</property> <property name="icon_size">1</property> @@ -288,13 +267,13 @@ </child> <child> - <widget class="GtkMenuItem" id="selection1"> + <widget class="GtkMenuItem" id="Selection"> <property name="visible">True</property> <property name="label" translatable="yes">Selection</property> <property name="use_underline">True</property> <child> - <widget class="GtkMenu" id="selection1_menu"> + <widget class="GtkMenu" id="Selection_menu"> <child> <widget class="GtkImageMenuItem" id="remove1"> @@ -304,7 +283,7 @@ <signal name="activate" handler="on_remove1_activate" last_modification_time="Sun, 06 Sep 2009 18:30:03 GMT"/> <child internal-child="image"> - <widget class="GtkImage" id="image382"> + <widget class="GtkImage" id="image428"> <property name="visible">True</property> <property name="stock">gtk-remove</property> <property name="icon_size">1</property> @@ -360,13 +339,13 @@ </child> <child> - <widget class="GtkMenuItem" id="view1"> + <widget class="GtkMenuItem" id="View"> <property name="visible">True</property> <property name="label" translatable="yes">_View</property> <property name="use_underline">True</property> <child> - <widget class="GtkMenu" id="view1_menu"> + <widget class="GtkMenu" id="View_menu"> <child> <widget class="GtkCheckMenuItem" id="view_status_bar"> @@ -413,22 +392,22 @@ </child> <child> - <widget class="GtkMenuItem" id="playback1"> + <widget class="GtkMenuItem" id="Playback"> <property name="visible">True</property> <property name="label" translatable="yes">_Playback</property> <property name="use_underline">True</property> <child> - <widget class="GtkMenu" id="playback1_menu"> + <widget class="GtkMenu" id="Playback_menu"> <child> - <widget class="GtkMenuItem" id="order1"> + <widget class="GtkMenuItem" id="Order"> <property name="visible">True</property> <property name="label" translatable="yes">Order</property> <property name="use_underline">True</property> <child> - <widget class="GtkMenu" id="order1_menu"> + <widget class="GtkMenu" id="Order_menu"> <child> <widget class="GtkRadioMenuItem" id="order_linear"> @@ -467,13 +446,13 @@ </child> <child> - <widget class="GtkMenuItem" id="looping1"> + <widget class="GtkMenuItem" id="Looping"> <property name="visible">True</property> <property name="label" translatable="yes">Looping</property> <property name="use_underline">True</property> <child> - <widget class="GtkMenu" id="looping1_menu"> + <widget class="GtkMenu" id="Looping_menu"> <child> <widget class="GtkRadioMenuItem" id="loop_all"> @@ -547,13 +526,13 @@ </child> <child> - <widget class="GtkMenuItem" id="menuitem4"> + <widget class="GtkMenuItem" id="Help"> <property name="visible">True</property> <property name="label" translatable="yes">_Help</property> <property name="use_underline">True</property> <child> - <widget class="GtkMenu" id="menuitem4_menu"> + <widget class="GtkMenu" id="Help_menu"> <child> <widget class="GtkImageMenuItem" id="help1"> @@ -563,7 +542,7 @@ <signal name="activate" handler="on_help1_activate" last_modification_time="Tue, 08 Sep 2009 17:32:06 GMT"/> <child internal-child="image"> - <widget class="GtkImage" id="image383"> + <widget class="GtkImage" id="image429"> <property name="visible">True</property> <property name="stock">gtk-help</property> <property name="icon_size">1</property> @@ -623,7 +602,7 @@ <signal name="activate" handler="on_about1_activate" last_modification_time="Sat, 04 Jul 2009 12:57:58 GMT"/> <child internal-child="image"> - <widget class="GtkImage" id="image384"> + <widget class="GtkImage" id="image430"> <property name="visible">True</property> <property name="stock">gtk-about</property> <property name="icon_size">1</property> diff --git a/plugins/gtkui/gtkui.c b/plugins/gtkui/gtkui.c index 81464e13..9cacdf57 100644 --- a/plugins/gtkui/gtkui.c +++ b/plugins/gtkui/gtkui.c @@ -42,6 +42,7 @@ #include "plcommon.h" #include "ddbtabstrip.h" #include "eq.h" +#include "actions.h" //#define trace(...) { fprintf(stderr, __VA_ARGS__); } #define trace(fmt,...) @@ -625,13 +626,6 @@ on_playlist_load_activate (GtkMenuItem *menuitem, gtk_widget_destroy (dlg); } } -void -on_add_audio_cd_activate (GtkMenuItem *menuitem, - gpointer user_data) -{ - deadbeef->pl_add_file ("all.cda", NULL, NULL); - playlist_refresh (); -} void on_add_location_activate (GtkMenuItem *menuitem, @@ -891,6 +885,8 @@ gtkui_thread (void *ctx) { progress_init (); cover_art_init (); + add_mainmenu_actions (lookup_widget (mainwin, "menubar1")); + gtk_widget_show (mainwin); deadbeef->ev_subscribe (DB_PLUGIN (&plugin), DB_EV_ACTIVATE, DB_CALLBACK (gtkui_on_activate), 0); @@ -930,6 +926,8 @@ gtkui_start (void) { } } + gather_actions (); + // gtk must be running in separate thread gtk_initialized = 0; gtk_tid = deadbeef->thread_start (gtkui_thread, NULL); diff --git a/plugins/gtkui/interface.c b/plugins/gtkui/interface.c index ce410de5..bc4f9186 100644 --- a/plugins/gtkui/interface.c +++ b/plugins/gtkui/interface.c @@ -32,17 +32,15 @@ create_mainwin (void) GtkWidget *mainwin; GtkWidget *vbox1; GtkWidget *menubar1; - GtkWidget *menuitem1; - GtkWidget *menuitem1_menu; + GtkWidget *File; + GtkWidget *File_menu; GtkWidget *open; - GtkWidget *image376; + GtkWidget *image423; GtkWidget *separator2; GtkWidget *add_files; - GtkWidget *image377; + GtkWidget *image424; GtkWidget *add_folders; - GtkWidget *image378; - GtkWidget *add_audio_cd; - GtkWidget *image379; + GtkWidget *image425; GtkWidget *add_location1; GtkWidget *separatormenuitem1; GtkWidget *new_playlist1; @@ -51,38 +49,38 @@ create_mainwin (void) GtkWidget *playlist_save_as; GtkWidget *separator8; GtkWidget *quit; - GtkWidget *image380; - GtkWidget *edit1; - GtkWidget *edit1_menu; + GtkWidget *image426; + GtkWidget *Edit; + GtkWidget *Edit_menu; GtkWidget *clear1; - GtkWidget *image381; + GtkWidget *image427; GtkWidget *select_all1; GtkWidget *deselect_all1; GtkWidget *invert_selection1; - GtkWidget *selection1; - GtkWidget *selection1_menu; + GtkWidget *Selection; + GtkWidget *Selection_menu; GtkWidget *remove1; - GtkWidget *image382; + GtkWidget *image428; GtkWidget *crop1; GtkWidget *find1; GtkWidget *separator5; GtkWidget *preferences; - GtkWidget *view1; - GtkWidget *view1_menu; + GtkWidget *View; + GtkWidget *View_menu; GtkWidget *view_status_bar; GtkWidget *view_headers; GtkWidget *view_tabs; GtkWidget *view_eq; - GtkWidget *playback1; - GtkWidget *playback1_menu; - GtkWidget *order1; - GtkWidget *order1_menu; + GtkWidget *Playback; + GtkWidget *Playback_menu; + GtkWidget *Order; + GtkWidget *Order_menu; GSList *order_linear_group = NULL; GtkWidget *order_linear; GtkWidget *order_shuffle; GtkWidget *order_random; - GtkWidget *looping1; - GtkWidget *looping1_menu; + GtkWidget *Looping; + GtkWidget *Looping_menu; GSList *loop_all_group = NULL; GtkWidget *loop_all; GtkWidget *loop_single; @@ -90,17 +88,17 @@ create_mainwin (void) GtkWidget *scroll_follows_playback; GtkWidget *cursor_follows_playback; GtkWidget *stop_after_current; - GtkWidget *menuitem4; - GtkWidget *menuitem4_menu; + GtkWidget *Help; + GtkWidget *Help_menu; GtkWidget *help1; - GtkWidget *image383; + GtkWidget *image429; GtkWidget *changelog1; GtkWidget *separator10; GtkWidget *gpl1; GtkWidget *lgpl1; GtkWidget *separator9; GtkWidget *about1; - GtkWidget *image384; + GtkWidget *image430; GtkWidget *hbox2; GtkWidget *hbox3; GtkWidget *stopbtn; @@ -137,305 +135,297 @@ create_mainwin (void) gtk_widget_show (menubar1); gtk_box_pack_start (GTK_BOX (vbox1), menubar1, FALSE, FALSE, 0); - menuitem1 = gtk_menu_item_new_with_mnemonic ("_File"); - gtk_widget_show (menuitem1); - gtk_container_add (GTK_CONTAINER (menubar1), menuitem1); + File = gtk_menu_item_new_with_mnemonic ("_File"); + gtk_widget_show (File); + gtk_container_add (GTK_CONTAINER (menubar1), File); - menuitem1_menu = gtk_menu_new (); - gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem1), menuitem1_menu); + File_menu = gtk_menu_new (); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (File), File_menu); open = gtk_image_menu_item_new_with_mnemonic ("_Open file(s)"); gtk_widget_show (open); - gtk_container_add (GTK_CONTAINER (menuitem1_menu), open); + gtk_container_add (GTK_CONTAINER (File_menu), open); gtk_widget_add_accelerator (open, "activate", accel_group, GDK_O, (GdkModifierType) GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); - image376 = gtk_image_new_from_stock ("gtk-open", GTK_ICON_SIZE_MENU); - gtk_widget_show (image376); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (open), image376); + image423 = gtk_image_new_from_stock ("gtk-open", GTK_ICON_SIZE_MENU); + gtk_widget_show (image423); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (open), image423); separator2 = gtk_separator_menu_item_new (); gtk_widget_show (separator2); - gtk_container_add (GTK_CONTAINER (menuitem1_menu), separator2); + gtk_container_add (GTK_CONTAINER (File_menu), separator2); gtk_widget_set_sensitive (separator2, FALSE); add_files = gtk_image_menu_item_new_with_mnemonic ("Add file(s)"); gtk_widget_show (add_files); - gtk_container_add (GTK_CONTAINER (menuitem1_menu), add_files); + gtk_container_add (GTK_CONTAINER (File_menu), add_files); - image377 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU); - gtk_widget_show (image377); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (add_files), image377); + image424 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU); + gtk_widget_show (image424); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (add_files), image424); add_folders = gtk_image_menu_item_new_with_mnemonic ("Add folder(s)"); gtk_widget_show (add_folders); - gtk_container_add (GTK_CONTAINER (menuitem1_menu), add_folders); + gtk_container_add (GTK_CONTAINER (File_menu), add_folders); - image378 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU); - gtk_widget_show (image378); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (add_folders), image378); - - add_audio_cd = gtk_image_menu_item_new_with_mnemonic ("Add Audio CD"); - gtk_widget_show (add_audio_cd); - gtk_container_add (GTK_CONTAINER (menuitem1_menu), add_audio_cd); - - image379 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU); - gtk_widget_show (image379); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (add_audio_cd), image379); + image425 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU); + gtk_widget_show (image425); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (add_folders), image425); add_location1 = gtk_menu_item_new_with_mnemonic ("Add location"); gtk_widget_show (add_location1); - gtk_container_add (GTK_CONTAINER (menuitem1_menu), add_location1); + gtk_container_add (GTK_CONTAINER (File_menu), add_location1); separatormenuitem1 = gtk_separator_menu_item_new (); gtk_widget_show (separatormenuitem1); - gtk_container_add (GTK_CONTAINER (menuitem1_menu), separatormenuitem1); + gtk_container_add (GTK_CONTAINER (File_menu), separatormenuitem1); gtk_widget_set_sensitive (separatormenuitem1, FALSE); new_playlist1 = gtk_menu_item_new_with_mnemonic ("New playlist"); gtk_widget_show (new_playlist1); - gtk_container_add (GTK_CONTAINER (menuitem1_menu), new_playlist1); + gtk_container_add (GTK_CONTAINER (File_menu), new_playlist1); gtk_widget_add_accelerator (new_playlist1, "activate", accel_group, GDK_n, (GdkModifierType) GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); playlist_load = gtk_menu_item_new_with_mnemonic ("Load playlist"); gtk_widget_show (playlist_load); - gtk_container_add (GTK_CONTAINER (menuitem1_menu), playlist_load); + gtk_container_add (GTK_CONTAINER (File_menu), playlist_load); playlist_save = gtk_menu_item_new_with_mnemonic ("Save playlist"); gtk_widget_show (playlist_save); - gtk_container_add (GTK_CONTAINER (menuitem1_menu), playlist_save); + gtk_container_add (GTK_CONTAINER (File_menu), playlist_save); playlist_save_as = gtk_menu_item_new_with_mnemonic ("Save playlist as"); gtk_widget_show (playlist_save_as); - gtk_container_add (GTK_CONTAINER (menuitem1_menu), playlist_save_as); + gtk_container_add (GTK_CONTAINER (File_menu), playlist_save_as); separator8 = gtk_separator_menu_item_new (); gtk_widget_show (separator8); - gtk_container_add (GTK_CONTAINER (menuitem1_menu), separator8); + gtk_container_add (GTK_CONTAINER (File_menu), separator8); gtk_widget_set_sensitive (separator8, FALSE); quit = gtk_image_menu_item_new_with_mnemonic ("_Quit"); gtk_widget_show (quit); - gtk_container_add (GTK_CONTAINER (menuitem1_menu), quit); + gtk_container_add (GTK_CONTAINER (File_menu), quit); gtk_widget_add_accelerator (quit, "activate", accel_group, GDK_Q, (GdkModifierType) GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); - image380 = gtk_image_new_from_stock ("gtk-quit", GTK_ICON_SIZE_MENU); - gtk_widget_show (image380); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (quit), image380); + image426 = gtk_image_new_from_stock ("gtk-quit", GTK_ICON_SIZE_MENU); + gtk_widget_show (image426); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (quit), image426); - edit1 = gtk_menu_item_new_with_mnemonic ("_Edit"); - gtk_widget_show (edit1); - gtk_container_add (GTK_CONTAINER (menubar1), edit1); + Edit = gtk_menu_item_new_with_mnemonic ("_Edit"); + gtk_widget_show (Edit); + gtk_container_add (GTK_CONTAINER (menubar1), Edit); - edit1_menu = gtk_menu_new (); - gtk_menu_item_set_submenu (GTK_MENU_ITEM (edit1), edit1_menu); + Edit_menu = gtk_menu_new (); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (Edit), Edit_menu); clear1 = gtk_image_menu_item_new_with_mnemonic ("_Clear"); gtk_widget_show (clear1); - gtk_container_add (GTK_CONTAINER (edit1_menu), clear1); + gtk_container_add (GTK_CONTAINER (Edit_menu), clear1); - image381 = gtk_image_new_from_stock ("gtk-clear", GTK_ICON_SIZE_MENU); - gtk_widget_show (image381); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (clear1), image381); + image427 = gtk_image_new_from_stock ("gtk-clear", GTK_ICON_SIZE_MENU); + gtk_widget_show (image427); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (clear1), image427); select_all1 = gtk_menu_item_new_with_mnemonic ("Select all"); gtk_widget_show (select_all1); - gtk_container_add (GTK_CONTAINER (edit1_menu), select_all1); + gtk_container_add (GTK_CONTAINER (Edit_menu), select_all1); gtk_widget_add_accelerator (select_all1, "activate", accel_group, GDK_A, (GdkModifierType) GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); deselect_all1 = gtk_menu_item_new_with_mnemonic ("Deselect all"); gtk_widget_show (deselect_all1); - gtk_container_add (GTK_CONTAINER (edit1_menu), deselect_all1); + gtk_container_add (GTK_CONTAINER (Edit_menu), deselect_all1); gtk_widget_add_accelerator (deselect_all1, "activate", accel_group, GDK_Escape, (GdkModifierType) 0, GTK_ACCEL_VISIBLE); invert_selection1 = gtk_menu_item_new_with_mnemonic ("Invert selection"); gtk_widget_show (invert_selection1); - gtk_container_add (GTK_CONTAINER (edit1_menu), invert_selection1); + gtk_container_add (GTK_CONTAINER (Edit_menu), invert_selection1); - selection1 = gtk_menu_item_new_with_mnemonic ("Selection"); - gtk_widget_show (selection1); - gtk_container_add (GTK_CONTAINER (edit1_menu), selection1); + Selection = gtk_menu_item_new_with_mnemonic ("Selection"); + gtk_widget_show (Selection); + gtk_container_add (GTK_CONTAINER (Edit_menu), Selection); - selection1_menu = gtk_menu_new (); - gtk_menu_item_set_submenu (GTK_MENU_ITEM (selection1), selection1_menu); + Selection_menu = gtk_menu_new (); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (Selection), Selection_menu); remove1 = gtk_image_menu_item_new_with_mnemonic ("Remove"); gtk_widget_show (remove1); - gtk_container_add (GTK_CONTAINER (selection1_menu), remove1); + gtk_container_add (GTK_CONTAINER (Selection_menu), remove1); - image382 = gtk_image_new_from_stock ("gtk-remove", GTK_ICON_SIZE_MENU); - gtk_widget_show (image382); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (remove1), image382); + image428 = gtk_image_new_from_stock ("gtk-remove", GTK_ICON_SIZE_MENU); + gtk_widget_show (image428); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (remove1), image428); crop1 = gtk_menu_item_new_with_mnemonic ("Crop"); gtk_widget_show (crop1); - gtk_container_add (GTK_CONTAINER (selection1_menu), crop1); + gtk_container_add (GTK_CONTAINER (Selection_menu), crop1); find1 = gtk_menu_item_new_with_mnemonic ("_Find"); gtk_widget_show (find1); - gtk_container_add (GTK_CONTAINER (edit1_menu), find1); + gtk_container_add (GTK_CONTAINER (Edit_menu), find1); gtk_widget_add_accelerator (find1, "activate", accel_group, GDK_F, (GdkModifierType) GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); separator5 = gtk_separator_menu_item_new (); gtk_widget_show (separator5); - gtk_container_add (GTK_CONTAINER (edit1_menu), separator5); + gtk_container_add (GTK_CONTAINER (Edit_menu), separator5); gtk_widget_set_sensitive (separator5, FALSE); preferences = gtk_menu_item_new_with_mnemonic ("Preferences"); gtk_widget_show (preferences); - gtk_container_add (GTK_CONTAINER (edit1_menu), preferences); + gtk_container_add (GTK_CONTAINER (Edit_menu), preferences); - view1 = gtk_menu_item_new_with_mnemonic ("_View"); - gtk_widget_show (view1); - gtk_container_add (GTK_CONTAINER (menubar1), view1); + View = gtk_menu_item_new_with_mnemonic ("_View"); + gtk_widget_show (View); + gtk_container_add (GTK_CONTAINER (menubar1), View); - view1_menu = gtk_menu_new (); - gtk_menu_item_set_submenu (GTK_MENU_ITEM (view1), view1_menu); + View_menu = gtk_menu_new (); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (View), View_menu); view_status_bar = gtk_check_menu_item_new_with_mnemonic ("Status bar"); gtk_widget_show (view_status_bar); - gtk_container_add (GTK_CONTAINER (view1_menu), view_status_bar); + gtk_container_add (GTK_CONTAINER (View_menu), view_status_bar); view_headers = gtk_check_menu_item_new_with_mnemonic ("Column headers"); gtk_widget_show (view_headers); - gtk_container_add (GTK_CONTAINER (view1_menu), view_headers); + gtk_container_add (GTK_CONTAINER (View_menu), view_headers); view_tabs = gtk_check_menu_item_new_with_mnemonic ("Tabs"); gtk_widget_show (view_tabs); - gtk_container_add (GTK_CONTAINER (view1_menu), view_tabs); + gtk_container_add (GTK_CONTAINER (View_menu), view_tabs); view_eq = gtk_check_menu_item_new_with_mnemonic ("Equalizer"); gtk_widget_show (view_eq); - gtk_container_add (GTK_CONTAINER (view1_menu), view_eq); + gtk_container_add (GTK_CONTAINER (View_menu), view_eq); - playback1 = gtk_menu_item_new_with_mnemonic ("_Playback"); - gtk_widget_show (playback1); - gtk_container_add (GTK_CONTAINER (menubar1), playback1); + Playback = gtk_menu_item_new_with_mnemonic ("_Playback"); + gtk_widget_show (Playback); + gtk_container_add (GTK_CONTAINER (menubar1), Playback); - playback1_menu = gtk_menu_new (); - gtk_menu_item_set_submenu (GTK_MENU_ITEM (playback1), playback1_menu); + Playback_menu = gtk_menu_new (); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (Playback), Playback_menu); - order1 = gtk_menu_item_new_with_mnemonic ("Order"); - gtk_widget_show (order1); - gtk_container_add (GTK_CONTAINER (playback1_menu), order1); + Order = gtk_menu_item_new_with_mnemonic ("Order"); + gtk_widget_show (Order); + gtk_container_add (GTK_CONTAINER (Playback_menu), Order); - order1_menu = gtk_menu_new (); - gtk_menu_item_set_submenu (GTK_MENU_ITEM (order1), order1_menu); + Order_menu = gtk_menu_new (); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (Order), Order_menu); order_linear = gtk_radio_menu_item_new_with_mnemonic (order_linear_group, "Linear"); order_linear_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (order_linear)); gtk_widget_show (order_linear); - gtk_container_add (GTK_CONTAINER (order1_menu), order_linear); + gtk_container_add (GTK_CONTAINER (Order_menu), order_linear); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (order_linear), TRUE); order_shuffle = gtk_radio_menu_item_new_with_mnemonic (order_linear_group, "Shuffle"); order_linear_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (order_shuffle)); gtk_widget_show (order_shuffle); - gtk_container_add (GTK_CONTAINER (order1_menu), order_shuffle); + gtk_container_add (GTK_CONTAINER (Order_menu), order_shuffle); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (order_shuffle), TRUE); order_random = gtk_radio_menu_item_new_with_mnemonic (order_linear_group, "Random"); order_linear_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (order_random)); gtk_widget_show (order_random); - gtk_container_add (GTK_CONTAINER (order1_menu), order_random); + gtk_container_add (GTK_CONTAINER (Order_menu), order_random); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (order_random), TRUE); - looping1 = gtk_menu_item_new_with_mnemonic ("Looping"); - gtk_widget_show (looping1); - gtk_container_add (GTK_CONTAINER (playback1_menu), looping1); + Looping = gtk_menu_item_new_with_mnemonic ("Looping"); + gtk_widget_show (Looping); + gtk_container_add (GTK_CONTAINER (Playback_menu), Looping); - looping1_menu = gtk_menu_new (); - gtk_menu_item_set_submenu (GTK_MENU_ITEM (looping1), looping1_menu); + Looping_menu = gtk_menu_new (); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (Looping), Looping_menu); loop_all = gtk_radio_menu_item_new_with_mnemonic (loop_all_group, "Loop All"); loop_all_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (loop_all)); gtk_widget_show (loop_all); - gtk_container_add (GTK_CONTAINER (looping1_menu), loop_all); + gtk_container_add (GTK_CONTAINER (Looping_menu), loop_all); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (loop_all), TRUE); loop_single = gtk_radio_menu_item_new_with_mnemonic (loop_all_group, "Loop Single Song"); loop_all_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (loop_single)); gtk_widget_show (loop_single); - gtk_container_add (GTK_CONTAINER (looping1_menu), loop_single); + gtk_container_add (GTK_CONTAINER (Looping_menu), loop_single); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (loop_single), TRUE); loop_disable = gtk_radio_menu_item_new_with_mnemonic (loop_all_group, "Don't Loop"); loop_all_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (loop_disable)); gtk_widget_show (loop_disable); - gtk_container_add (GTK_CONTAINER (looping1_menu), loop_disable); + gtk_container_add (GTK_CONTAINER (Looping_menu), loop_disable); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (loop_disable), TRUE); scroll_follows_playback = gtk_check_menu_item_new_with_mnemonic ("Scroll follows playback"); gtk_widget_show (scroll_follows_playback); - gtk_container_add (GTK_CONTAINER (playback1_menu), scroll_follows_playback); + gtk_container_add (GTK_CONTAINER (Playback_menu), scroll_follows_playback); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (scroll_follows_playback), TRUE); cursor_follows_playback = gtk_check_menu_item_new_with_mnemonic ("Cursor follows playback"); gtk_widget_show (cursor_follows_playback); - gtk_container_add (GTK_CONTAINER (playback1_menu), cursor_follows_playback); + gtk_container_add (GTK_CONTAINER (Playback_menu), cursor_follows_playback); stop_after_current = gtk_check_menu_item_new_with_mnemonic ("Stop after current"); gtk_widget_show (stop_after_current); - gtk_container_add (GTK_CONTAINER (playback1_menu), stop_after_current); + gtk_container_add (GTK_CONTAINER (Playback_menu), stop_after_current); gtk_widget_add_accelerator (stop_after_current, "activate", accel_group, GDK_M, (GdkModifierType) GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); - menuitem4 = gtk_menu_item_new_with_mnemonic ("_Help"); - gtk_widget_show (menuitem4); - gtk_container_add (GTK_CONTAINER (menubar1), menuitem4); + Help = gtk_menu_item_new_with_mnemonic ("_Help"); + gtk_widget_show (Help); + gtk_container_add (GTK_CONTAINER (menubar1), Help); - menuitem4_menu = gtk_menu_new (); - gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem4), menuitem4_menu); + Help_menu = gtk_menu_new (); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (Help), Help_menu); help1 = gtk_image_menu_item_new_with_mnemonic ("_Help"); gtk_widget_show (help1); - gtk_container_add (GTK_CONTAINER (menuitem4_menu), help1); + gtk_container_add (GTK_CONTAINER (Help_menu), help1); - image383 = gtk_image_new_from_stock ("gtk-help", GTK_ICON_SIZE_MENU); - gtk_widget_show (image383); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (help1), image383); + image429 = gtk_image_new_from_stock ("gtk-help", GTK_ICON_SIZE_MENU); + gtk_widget_show (image429); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (help1), image429); changelog1 = gtk_menu_item_new_with_mnemonic ("_ChangeLog"); gtk_widget_show (changelog1); - gtk_container_add (GTK_CONTAINER (menuitem4_menu), changelog1); + gtk_container_add (GTK_CONTAINER (Help_menu), changelog1); separator10 = gtk_separator_menu_item_new (); gtk_widget_show (separator10); - gtk_container_add (GTK_CONTAINER (menuitem4_menu), separator10); + gtk_container_add (GTK_CONTAINER (Help_menu), separator10); gtk_widget_set_sensitive (separator10, FALSE); gpl1 = gtk_menu_item_new_with_mnemonic ("_GPLv2"); gtk_widget_show (gpl1); - gtk_container_add (GTK_CONTAINER (menuitem4_menu), gpl1); + gtk_container_add (GTK_CONTAINER (Help_menu), gpl1); lgpl1 = gtk_menu_item_new_with_mnemonic ("_LGPLv2.1"); gtk_widget_show (lgpl1); - gtk_container_add (GTK_CONTAINER (menuitem4_menu), lgpl1); + gtk_container_add (GTK_CONTAINER (Help_menu), lgpl1); separator9 = gtk_separator_menu_item_new (); gtk_widget_show (separator9); - gtk_container_add (GTK_CONTAINER (menuitem4_menu), separator9); + gtk_container_add (GTK_CONTAINER (Help_menu), separator9); gtk_widget_set_sensitive (separator9, FALSE); about1 = gtk_image_menu_item_new_with_mnemonic ("_About"); gtk_widget_show (about1); - gtk_container_add (GTK_CONTAINER (menuitem4_menu), about1); + gtk_container_add (GTK_CONTAINER (Help_menu), about1); - image384 = gtk_image_new_from_stock ("gtk-about", GTK_ICON_SIZE_MENU); - gtk_widget_show (image384); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (about1), image384); + image430 = gtk_image_new_from_stock ("gtk-about", GTK_ICON_SIZE_MENU); + gtk_widget_show (image430); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (about1), image430); hbox2 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox2); @@ -591,9 +581,6 @@ create_mainwin (void) g_signal_connect ((gpointer) add_folders, "activate", G_CALLBACK (on_add_folders_activate), NULL); - g_signal_connect ((gpointer) add_audio_cd, "activate", - G_CALLBACK (on_add_audio_cd_activate), - NULL); g_signal_connect ((gpointer) add_location1, "activate", G_CALLBACK (on_add_location_activate), NULL); @@ -710,17 +697,15 @@ create_mainwin (void) GLADE_HOOKUP_OBJECT_NO_REF (mainwin, mainwin, "mainwin"); GLADE_HOOKUP_OBJECT (mainwin, vbox1, "vbox1"); GLADE_HOOKUP_OBJECT (mainwin, menubar1, "menubar1"); - GLADE_HOOKUP_OBJECT (mainwin, menuitem1, "menuitem1"); - GLADE_HOOKUP_OBJECT (mainwin, menuitem1_menu, "menuitem1_menu"); + GLADE_HOOKUP_OBJECT (mainwin, File, "File"); + GLADE_HOOKUP_OBJECT (mainwin, File_menu, "File_menu"); GLADE_HOOKUP_OBJECT (mainwin, open, "open"); - GLADE_HOOKUP_OBJECT (mainwin, image376, "image376"); + GLADE_HOOKUP_OBJECT (mainwin, image423, "image423"); GLADE_HOOKUP_OBJECT (mainwin, separator2, "separator2"); GLADE_HOOKUP_OBJECT (mainwin, add_files, "add_files"); - GLADE_HOOKUP_OBJECT (mainwin, image377, "image377"); + GLADE_HOOKUP_OBJECT (mainwin, image424, "image424"); GLADE_HOOKUP_OBJECT (mainwin, add_folders, "add_folders"); - GLADE_HOOKUP_OBJECT (mainwin, image378, "image378"); - GLADE_HOOKUP_OBJECT (mainwin, add_audio_cd, "add_audio_cd"); - GLADE_HOOKUP_OBJECT (mainwin, image379, "image379"); + GLADE_HOOKUP_OBJECT (mainwin, image425, "image425"); GLADE_HOOKUP_OBJECT (mainwin, add_location1, "add_location1"); GLADE_HOOKUP_OBJECT (mainwin, separatormenuitem1, "separatormenuitem1"); GLADE_HOOKUP_OBJECT (mainwin, new_playlist1, "new_playlist1"); @@ -729,54 +714,54 @@ create_mainwin (void) GLADE_HOOKUP_OBJECT (mainwin, playlist_save_as, "playlist_save_as"); GLADE_HOOKUP_OBJECT (mainwin, separator8, "separator8"); GLADE_HOOKUP_OBJECT (mainwin, quit, "quit"); - GLADE_HOOKUP_OBJECT (mainwin, image380, "image380"); - GLADE_HOOKUP_OBJECT (mainwin, edit1, "edit1"); - GLADE_HOOKUP_OBJECT (mainwin, edit1_menu, "edit1_menu"); + GLADE_HOOKUP_OBJECT (mainwin, image426, "image426"); + GLADE_HOOKUP_OBJECT (mainwin, Edit, "Edit"); + GLADE_HOOKUP_OBJECT (mainwin, Edit_menu, "Edit_menu"); GLADE_HOOKUP_OBJECT (mainwin, clear1, "clear1"); - GLADE_HOOKUP_OBJECT (mainwin, image381, "image381"); + GLADE_HOOKUP_OBJECT (mainwin, image427, "image427"); GLADE_HOOKUP_OBJECT (mainwin, select_all1, "select_all1"); GLADE_HOOKUP_OBJECT (mainwin, deselect_all1, "deselect_all1"); GLADE_HOOKUP_OBJECT (mainwin, invert_selection1, "invert_selection1"); - GLADE_HOOKUP_OBJECT (mainwin, selection1, "selection1"); - GLADE_HOOKUP_OBJECT (mainwin, selection1_menu, "selection1_menu"); + GLADE_HOOKUP_OBJECT (mainwin, Selection, "Selection"); + GLADE_HOOKUP_OBJECT (mainwin, Selection_menu, "Selection_menu"); GLADE_HOOKUP_OBJECT (mainwin, remove1, "remove1"); - GLADE_HOOKUP_OBJECT (mainwin, image382, "image382"); + GLADE_HOOKUP_OBJECT (mainwin, image428, "image428"); GLADE_HOOKUP_OBJECT (mainwin, crop1, "crop1"); GLADE_HOOKUP_OBJECT (mainwin, find1, "find1"); GLADE_HOOKUP_OBJECT (mainwin, separator5, "separator5"); GLADE_HOOKUP_OBJECT (mainwin, preferences, "preferences"); - GLADE_HOOKUP_OBJECT (mainwin, view1, "view1"); - GLADE_HOOKUP_OBJECT (mainwin, view1_menu, "view1_menu"); + GLADE_HOOKUP_OBJECT (mainwin, View, "View"); + GLADE_HOOKUP_OBJECT (mainwin, View_menu, "View_menu"); GLADE_HOOKUP_OBJECT (mainwin, view_status_bar, "view_status_bar"); GLADE_HOOKUP_OBJECT (mainwin, view_headers, "view_headers"); GLADE_HOOKUP_OBJECT (mainwin, view_tabs, "view_tabs"); GLADE_HOOKUP_OBJECT (mainwin, view_eq, "view_eq"); - GLADE_HOOKUP_OBJECT (mainwin, playback1, "playback1"); - GLADE_HOOKUP_OBJECT (mainwin, playback1_menu, "playback1_menu"); - GLADE_HOOKUP_OBJECT (mainwin, order1, "order1"); - GLADE_HOOKUP_OBJECT (mainwin, order1_menu, "order1_menu"); + GLADE_HOOKUP_OBJECT (mainwin, Playback, "Playback"); + GLADE_HOOKUP_OBJECT (mainwin, Playback_menu, "Playback_menu"); + GLADE_HOOKUP_OBJECT (mainwin, Order, "Order"); + GLADE_HOOKUP_OBJECT (mainwin, Order_menu, "Order_menu"); GLADE_HOOKUP_OBJECT (mainwin, order_linear, "order_linear"); GLADE_HOOKUP_OBJECT (mainwin, order_shuffle, "order_shuffle"); GLADE_HOOKUP_OBJECT (mainwin, order_random, "order_random"); - GLADE_HOOKUP_OBJECT (mainwin, looping1, "looping1"); - GLADE_HOOKUP_OBJECT (mainwin, looping1_menu, "looping1_menu"); + GLADE_HOOKUP_OBJECT (mainwin, Looping, "Looping"); + GLADE_HOOKUP_OBJECT (mainwin, Looping_menu, "Looping_menu"); GLADE_HOOKUP_OBJECT (mainwin, loop_all, "loop_all"); GLADE_HOOKUP_OBJECT (mainwin, loop_single, "loop_single"); GLADE_HOOKUP_OBJECT (mainwin, loop_disable, "loop_disable"); GLADE_HOOKUP_OBJECT (mainwin, scroll_follows_playback, "scroll_follows_playback"); GLADE_HOOKUP_OBJECT (mainwin, cursor_follows_playback, "cursor_follows_playback"); GLADE_HOOKUP_OBJECT (mainwin, stop_after_current, "stop_after_current"); - GLADE_HOOKUP_OBJECT (mainwin, menuitem4, "menuitem4"); - GLADE_HOOKUP_OBJECT (mainwin, menuitem4_menu, "menuitem4_menu"); + GLADE_HOOKUP_OBJECT (mainwin, Help, "Help"); + GLADE_HOOKUP_OBJECT (mainwin, Help_menu, "Help_menu"); GLADE_HOOKUP_OBJECT (mainwin, help1, "help1"); - GLADE_HOOKUP_OBJECT (mainwin, image383, "image383"); + GLADE_HOOKUP_OBJECT (mainwin, image429, "image429"); GLADE_HOOKUP_OBJECT (mainwin, changelog1, "changelog1"); GLADE_HOOKUP_OBJECT (mainwin, separator10, "separator10"); GLADE_HOOKUP_OBJECT (mainwin, gpl1, "gpl1"); GLADE_HOOKUP_OBJECT (mainwin, lgpl1, "lgpl1"); GLADE_HOOKUP_OBJECT (mainwin, separator9, "separator9"); GLADE_HOOKUP_OBJECT (mainwin, about1, "about1"); - GLADE_HOOKUP_OBJECT (mainwin, image384, "image384"); + GLADE_HOOKUP_OBJECT (mainwin, image430, "image430"); GLADE_HOOKUP_OBJECT (mainwin, hbox2, "hbox2"); GLADE_HOOKUP_OBJECT (mainwin, hbox3, "hbox3"); GLADE_HOOKUP_OBJECT (mainwin, stopbtn, "stopbtn"); diff --git a/plugins/gtkui/plcommon.c b/plugins/gtkui/plcommon.c index 3b72b901..5b0eef0f 100644 --- a/plugins/gtkui/plcommon.c +++ b/plugins/gtkui/plcommon.c @@ -28,6 +28,7 @@ #include "support.h" #include "interface.h" #include "parser.h" +#include "actions.h" #define min(x,y) ((x)<(y)?(x):(y)) //#define trace(...) { fprintf(stderr, __VA_ARGS__); } @@ -347,10 +348,35 @@ on_remove_from_disk_activate (GtkMenuItem *menuitem, void actionitem_activate (GtkMenuItem *menuitem, - DB_single_action_t *action) + DB_plugin_action_t *action) { - DB_playItem_t *it = deadbeef->pl_get_for_idx_and_iter (clicked_idx, PL_MAIN); - action->callback (it, action->data); + DB_playItem_t *it = deadbeef->pl_get_first (PL_MAIN); + + // Plugin can handle all tracks by itself + if (action->flags & DB_ACTION_CAN_MULTIPLE_TRACKS) + { + action->callback (it, action->data); + deadbeef->pl_item_unref (it); + return; + } + + // For single-track actions just invoke it with first selected track + if (0 == action->flags & DB_ACTION_ALLOW_MULTIPLE_TRACKS) + { + DB_playItem_t *it = deadbeef->pl_get_for_idx_and_iter (clicked_idx, PL_MAIN); + action->callback (it, action->data); + deadbeef->pl_item_unref (it); + return; + } + + //We end up here if plugin won't traverse tracks and we have to do it for him + while (it) { + if (deadbeef->pl_is_selected (it)) + action->callback (it, action->data); + DB_playItem_t *next = deadbeef->pl_get_next (it, PL_MAIN); + deadbeef->pl_item_unref (it); + it = next; + } } void @@ -407,45 +433,47 @@ list_context_menu (DdbListview *listview, DdbListviewIter it, int idx) { gtk_container_add (GTK_CONTAINER (playlist_menu), separator8); gtk_widget_set_sensitive (separator8, FALSE); - /// - int count; - int i, j; - GtkWidget *actionitem; - DB_single_action_t *actions[4]; - DB_plugin_t **plugins = deadbeef->plug_get_list(); - for (i = 0; plugins[i]; i++) - { - if (plugins[i]->type != DB_PLUGIN_MISC) - continue; - - DB_misc_t *misc = (DB_misc_t*)plugins[i]; - if (!misc->get_single_actions) - continue; - - count = 4; - if (!misc->get_single_actions (it, actions, &count)) - continue; - if (count == 0) - continue; + if (plugins_actions) + { + int selected_count = 0; + DB_playItem_t *it = deadbeef->pl_get_first (PL_MAIN); + while (it) { + if (deadbeef->pl_is_selected (it)) + selected_count++; + DB_playItem_t *next = deadbeef->pl_get_next (it, PL_MAIN); + deadbeef->pl_item_unref (it); + it = next; + } - for (j = 0; j < count; j++) + DB_plugin_action_t *action; + for (action = plugins_actions; action; action = action->next) { - actionitem = gtk_menu_item_new_with_mnemonic (actions[j]->title); + if (action->flags & DB_ACTION_COMMON) + continue; + + GtkWidget *actionitem; + actionitem = gtk_menu_item_new_with_mnemonic (action->title); gtk_widget_show (actionitem); gtk_container_add (GTK_CONTAINER (playlist_menu), actionitem); g_object_set_data (G_OBJECT (actionitem), "ps", listview); g_signal_connect ((gpointer) actionitem, "activate", G_CALLBACK (actionitem_activate), - actions[j]); + action); + if (!( + ((selected_count == 1) && (action->flags & DB_ACTION_SINGLE_TRACK)) || + ((selected_count > 1) && (action->flags & DB_ACTION_ALLOW_MULTIPLE_TRACKS)) + )) + { + gtk_widget_set_sensitive (GTK_WIDGET (actionitem), FALSE); + } } separator8 = gtk_separator_menu_item_new (); gtk_widget_show (separator8); gtk_container_add (GTK_CONTAINER (playlist_menu), separator8); gtk_widget_set_sensitive (separator8, FALSE); } - /// properties1 = gtk_menu_item_new_with_mnemonic ("Properties"); gtk_widget_show (properties1); diff --git a/plugins/lastfm/lastfm.c b/plugins/lastfm/lastfm.c index 02dff618..d8ddf5f6 100644 --- a/plugins/lastfm/lastfm.c +++ b/plugins/lastfm/lastfm.c @@ -849,22 +849,32 @@ lfm_action_lookup (DB_playItem_t *it, void *data) free (command); } -static DB_single_action_t lookup_action = { +static int +lfm_action_love (DB_playItem_t *it, void *data) +{ + printf ("Love starts here\n"); +} + +static DB_plugin_action_t love_action = { + .title = "Love at Last.fm", + .flags = DB_ACTION_SINGLE_TRACK, + .callback = lfm_action_love, + .next = NULL +}; + +static DB_plugin_action_t lookup_action = { .title = "Lookup at Last.fm", - .callback = lfm_action_lookup + .flags = DB_ACTION_SINGLE_TRACK, + .callback = lfm_action_lookup, + .next = &love_action }; static int -lfm_get_single_actions (DB_playItem_t *it, DB_single_action_t *actions[], int *size) +lfm_get_actions (DB_plugin_action_t **actions) { - if (deadbeef->pl_find_meta (it, "artist") && - deadbeef->pl_find_meta (it, "title")) - { - actions[0] = &lookup_action; - *size = 1; - } - else - *size = 0; + // Just prepend our action + love_action.next = *actions; + *actions = &lookup_action; return 1; } @@ -890,5 +900,5 @@ static DB_misc_t plugin = { .plugin.start = lastfm_start, .plugin.stop = lastfm_stop, .plugin.configdialog = settings_dlg, - .get_single_actions = lfm_get_single_actions + .plugin.get_actions = lfm_get_actions }; diff --git a/plugins/shellexec/shellexec.c b/plugins/shellexec/shellexec.c index 39e7f4da..ec7fdcad 100644 --- a/plugins/shellexec/shellexec.c +++ b/plugins/shellexec/shellexec.c @@ -17,38 +17,31 @@ */ #include <stdio.h> #include <string.h> +#include <stdlib.h> #include "../../deadbeef.h" -#define MAX_COMMANDS 128 - #define trace(...) { fprintf(stderr, __VA_ARGS__); } //#define trace(fmt,...) static DB_misc_t plugin; static DB_functions_t *deadbeef; -DB_single_action_t shx_actions [MAX_COMMANDS]; -static int single_action_count; - DB_plugin_t * shellexec_load (DB_functions_t *api) { deadbeef = api; return DB_PLUGIN (&plugin); } -static int -shx_get_single_actions (DB_playItem_t *it, DB_single_action_t *actions[], int *size) +static char* +trim (char* s) { - if (*size < single_action_count) - return 0; - - int i; - *size = single_action_count; - trace ("Shellexec: %d actions\n", single_action_count); - for (i=0; i < single_action_count; i++) - actions[i] = &shx_actions[i]; - return 1; + char *h, *t; + + for (h = s; *h == ' ' || *h == '\t'; h++); + for (t = s + strlen (s); *t == ' ' || *t == '\t'; t--); + * (t+1) = 0; + return h; } static int @@ -60,30 +53,12 @@ shx_callback (DB_playItem_t *it, void *data) return 0; } -static char* -trim (char* s) -{ - char *h, *t; - - for (h = s; *h == ' ' || *h == '\t'; h++); - for (t = s + strlen (s); *t == ' ' || *t == '\t'; t--); - * (t+1) = 0; - return h; -} - static int -shellexec_start (void) +shx_get_actions (DB_plugin_action_t **actions) { - trace ("Starting shellexec\n"); - single_action_count = 0; DB_conf_item_t *item = deadbeef->conf_find ("shellexec.", NULL); while (item) { - if (single_action_count == MAX_COMMANDS) - { - fprintf (stdout, "Shellexec: max number of commands (%d) exceeded\n", MAX_COMMANDS); - break; - } size_t l = strlen (item->value) + 1; char tmp[l]; strcpy (tmp, item->value); @@ -98,13 +73,19 @@ shellexec_start (void) *semicolon = 0; - shx_actions[single_action_count].title = strdup (trim (semicolon + 1)); - shx_actions[single_action_count].callback = shx_callback; - shx_actions[single_action_count].data = strdup (trim (tmp)); + DB_plugin_action_t *action = calloc (sizeof (DB_plugin_action_t), 1); + + action->title = strdup (trim (semicolon + 1)); + action->callback = shx_callback; + action->data = strdup (trim (tmp)); + action->flags = DB_ACTION_SINGLE_TRACK | DB_ACTION_ALLOW_MULTIPLE_TRACKS; + + action->next = *actions; + *actions = action; item = deadbeef->conf_find ("shellexec.", item); - single_action_count++; } + return 1; } // define plugin interface @@ -118,8 +99,6 @@ static DB_misc_t plugin = { .plugin.author = "Viktor Semykin", .plugin.email = "thesame.ml@gmail.com", .plugin.website = "http://deadbeef.sf.net", - .plugin.start = shellexec_start, - - .get_single_actions = shx_get_single_actions + .plugin.get_actions = shx_get_actions }; |