summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Viktor Semykin <thesame.ml@gmail.com>2010-05-26 03:42:59 +0300
committerGravatar Viktor Semykin <thesame.ml@gmail.com>2010-05-26 03:42:59 +0300
commita6800830237690618eb454ab331ca6e4bdbd4100 (patch)
treeca1b2069f87c37f13f210bb053533fa730c2f2da
parent8c012917f5530d947c1a31adfc6aba4b0cf3853c (diff)
New plugins' actions system
-rw-r--r--deadbeef.h52
-rw-r--r--plugins/cdda/cdda.c24
-rw-r--r--plugins/gtkui/Makefile.am3
-rw-r--r--plugins/gtkui/actions.c122
-rw-r--r--plugins/gtkui/actions.h29
-rw-r--r--plugins/gtkui/callbacks.h4
-rw-r--r--plugins/gtkui/deadbeef.glade69
-rw-r--r--plugins/gtkui/gtkui.c12
-rw-r--r--plugins/gtkui/interface.c321
-rw-r--r--plugins/gtkui/plcommon.c82
-rw-r--r--plugins/lastfm/lastfm.c34
-rw-r--r--plugins/shellexec/shellexec.c63
12 files changed, 495 insertions, 320 deletions
diff --git a/deadbeef.h b/deadbeef.h
index 0afd47f4..fd213156 100644
--- a/deadbeef.h
+++ b/deadbeef.h
@@ -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
};