changeset 2245:6fb65026a8c7 trunk

[svn] - port playlist uimanager code to giacomo's ui_manager framework
author nenolod
date Wed, 03 Jan 2007 01:25:18 -0800
parents 1148bfa60fd5
children a04dcf29737d
files ChangeLog audacious/ui/mainwin.ui audacious/ui/playlist.ui audacious/ui_equalizer.c audacious/ui_main.c audacious/ui_manager.c audacious/ui_manager.h audacious/ui_playlist.c audacious/ui_playlist.h
diffstat 9 files changed, 460 insertions(+), 490 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Tue Jan 02 22:23:09 2007 -0800
+++ b/ChangeLog	Wed Jan 03 01:25:18 2007 -0800
@@ -1,3 +1,22 @@
+2007-01-03 06:23:09 +0000  William Pitcock <nenolod@nenolod.net>
+  revision [3493]
+  skinwin.[ch] -> ui_skinselector.[ch]
+  
+  trunk/audacious/Makefile          |    2 
+  trunk/audacious/genevent.c        |    1 
+  trunk/audacious/main.c            |    2 
+  trunk/audacious/playback.c        |    2 
+  trunk/audacious/skinwin.c         |  405 --------------------------------------
+  trunk/audacious/skinwin.h         |   43 ----
+  trunk/audacious/ui_fileinfo.c     |    1 
+  trunk/audacious/ui_main.c         |    2 
+  trunk/audacious/ui_preferences.c  |    5 
+  trunk/audacious/ui_skinselector.c |  405 ++++++++++++++++++++++++++++++++++++++
+  trunk/audacious/ui_skinselector.h |   43 ++++
+  trunk/audacious/widgets/skin.c    |    2 
+  12 files changed, 456 insertions(+), 457 deletions(-)
+
+
 2007-01-03 06:17:06 +0000  William Pitcock <nenolod@nenolod.net>
   revision [3491]
   - fix skin scripts
--- a/audacious/ui/mainwin.ui	Tue Jan 02 22:23:09 2007 -0800
+++ b/audacious/ui/mainwin.ui	Wed Jan 03 01:25:18 2007 -0800
@@ -93,9 +93,19 @@
 			</menu>
 			<menu action="playlist">
 				<menuitem action="playlist new" />
+				<separator />
 				<menuitem action="playlist select next" />
 				<menuitem action="playlist select previous" />
-				<menuitem action="playlist delete" />
+				<separator />
+				<menuitem action="playlist load" />
+				<menuitem action="playlist save" />
+				<menuitem action="playlist save default" />
+				<separator />
+				<menuitem action="playlist manager" />
+				<separator />
+				<menuitem action="playlist refresh" />
+				<separator />
+<!--				<menuitem action="playlist delete" /> -->
 			</menu>
 			<menu action="view">
 				<menuitem action="show player" />
--- a/audacious/ui/playlist.ui	Tue Jan 02 22:23:09 2007 -0800
+++ b/audacious/ui/playlist.ui	Wed Jan 03 01:25:18 2007 -0800
@@ -3,7 +3,7 @@
 <ui>
 	<menubar name="playlist-menus">
 		<menu action="dummy" name="playlist-rightclick-menu">
-			<menuitem action="view track info" />
+			<menuitem action="track info" />
 			<separator />
 			<menuitem action="remove selected" />
 			<menuitem action="remove unselected" />
@@ -67,15 +67,20 @@
 		</menu>
 
 		<menu action="dummy" name="playlist-menu">
-			<menuitem action="new list" />
+			<menuitem action="playlist new" />
+			<separator />
+			<menuitem action="playlist select next" />
+			<menuitem action="playlist select previous" />
 			<separator />
-			<menuitem action="load list" />
-			<menuitem action="save list" />
-			<menuitem action="save default list" />
+			<menuitem action="playlist load" />
+			<menuitem action="playlist save" />
+			<menuitem action="playlist save default" />
 			<separator />
-			<menuitem action="list manager" />
+			<menuitem action="playlist manager" />
 			<separator />
-			<menuitem action="refresh list" />
+			<menuitem action="playlist refresh" />
+			<separator />
+<!--			<menuitem action="playlist delete" /> -->
 		</menu>
 	</menubar>
 </ui>
--- a/audacious/ui_equalizer.c	Tue Jan 02 22:23:09 2007 -0800
+++ b/audacious/ui_equalizer.c	Wed Jan 03 01:25:18 2007 -0800
@@ -279,7 +279,7 @@
 equalizerwin_set_shade(gboolean shaded)
 {
     GtkAction *action = gtk_action_group_get_action(
-      mainwin_toggleaction_group_others , "roll up equalizer" );
+      toggleaction_group_others , "roll up equalizer" );
     gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(action) , shaded );
 }
 
@@ -1010,8 +1010,13 @@
 equalizerwin_show(gboolean show)
 {
     GtkAction *action = gtk_action_group_get_action(
-      mainwin_toggleaction_group_others , "show equalizer" );
+      toggleaction_group_others , "show equalizer" );
     gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(action) , show );
+
+    if (show)
+        equalizerwin_real_show();
+    else
+        equalizerwin_real_hide();
 }
 
 void
--- a/audacious/ui_main.c	Tue Jan 02 22:23:09 2007 -0800
+++ b/audacious/ui_main.c	Wed Jan 03 01:25:18 2007 -0800
@@ -231,7 +231,7 @@
 mainwin_set_always_on_top(gboolean always)
 {
     GtkAction *action = gtk_action_group_get_action(
-      mainwin_toggleaction_group_others , "view always on top" );
+      toggleaction_group_others , "view always on top" );
     gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(action) , always );
 }
 
@@ -253,7 +253,7 @@
 mainwin_set_shade(gboolean shaded)
 {
     GtkAction *action = gtk_action_group_get_action(
-      mainwin_toggleaction_group_others , "view roll up player" );
+      toggleaction_group_others , "view roll up player" );
     gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(action) , shaded );
 /*
     GtkWidget *widget = gtk_ui_manager_get_widget(ui_manager,
@@ -370,20 +370,20 @@
     {
         case VIS_ANALYZER:
             action = gtk_action_group_get_action(
-              mainwin_radioaction_group_vismode , "vismode analyzer" );
+              radioaction_group_vismode , "vismode analyzer" );
             break;
         case VIS_SCOPE:
             action = gtk_action_group_get_action(
-              mainwin_radioaction_group_vismode , "vismode scope" );
+              radioaction_group_vismode , "vismode scope" );
             break;
         case VIS_VOICEPRINT:
             action = gtk_action_group_get_action(
-              mainwin_radioaction_group_vismode , "vismode voiceprint" );
+              radioaction_group_vismode , "vismode voiceprint" );
             break;
         case VIS_OFF:
         default:
             action = gtk_action_group_get_action(
-              mainwin_radioaction_group_vismode , "vismode off" );
+              radioaction_group_vismode , "vismode off" );
             break;
     }
 
@@ -2198,13 +2198,13 @@
 void
 mainwin_shuffle_pushed(gboolean toggled)
 {
-    check_set( mainwin_toggleaction_group_others , "playback shuffle" , toggled );
+    check_set( toggleaction_group_others , "playback shuffle" , toggled );
 }
 
 void
 mainwin_repeat_pushed(gboolean toggled)
 {
-    check_set( mainwin_toggleaction_group_others , "playback repeat" , toggled );
+    check_set( toggleaction_group_others , "playback repeat" , toggled );
 }
 
 void
@@ -2451,7 +2451,7 @@
 {
     cfg.player_visible = TRUE;
 
-    check_set( mainwin_toggleaction_group_others , "show player" , TRUE );
+    check_set( toggleaction_group_others , "show player" , TRUE );
 
     if (cfg.player_shaded)
         vis_clear_data(active_vis);
@@ -2510,7 +2510,7 @@
     GdkGC *gc;
     GdkColor pattern;
 
-    check_set( mainwin_toggleaction_group_others , "show player", FALSE);
+    check_set( toggleaction_group_others , "show player", FALSE);
 
     if (cfg.player_shaded)
         svis_clear_data(mainwin_svis);
@@ -2540,7 +2540,7 @@
 mainwin_set_stopaftersong(gboolean stop)
 {
     cfg.stopaftersong = stop;
-    check_set(mainwin_toggleaction_group_others, "stop after current song", cfg.stopaftersong);
+    check_set(toggleaction_group_others, "stop after current song", cfg.stopaftersong);
 }
 
 
@@ -2755,7 +2755,7 @@
     case MENUROW_ALWAYS:
         gtk_toggle_action_set_active(
           GTK_TOGGLE_ACTION(gtk_action_group_get_action(
-          mainwin_toggleaction_group_others , "view always on top" )) ,
+          toggleaction_group_others , "view always on top" )) ,
           mainwin_menurow->mr_always_selected );
         break;
     case MENUROW_FILEINFOBOX:
@@ -2764,7 +2764,7 @@
     case MENUROW_DOUBLESIZE:
         gtk_toggle_action_set_active(
           GTK_TOGGLE_ACTION(gtk_action_group_get_action(
-          mainwin_toggleaction_group_others , "view doublesize" )) ,
+          toggleaction_group_others , "view doublesize" )) ,
           mainwin_menurow->mr_doublesize_selected );
         break;
     case MENUROW_VISUALIZATION:
@@ -3011,9 +3011,9 @@
 set_timer_mode(TimerMode mode)
 {
     if (mode == TIMER_ELAPSED)
-        check_set(mainwin_radioaction_group_viewtime, "view time elapsed", TRUE);
+        check_set(radioaction_group_viewtime, "view time elapsed", TRUE);
     else
-        check_set(mainwin_radioaction_group_viewtime, "view time remaining", TRUE);
+        check_set(radioaction_group_viewtime, "view time remaining", TRUE);
 }
 
 static void
@@ -3041,164 +3041,164 @@
 
     /* View menu */
 
-    check_set(mainwin_toggleaction_group_others, "view always on top", cfg.always_on_top);
-    check_set(mainwin_toggleaction_group_others, "view put on all workspaces", cfg.sticky);
-    check_set(mainwin_toggleaction_group_others, "roll up player", cfg.player_shaded);
-    check_set(mainwin_toggleaction_group_others, "roll up playlist editor", cfg.playlist_shaded);
-    check_set(mainwin_toggleaction_group_others, "roll up equalizer", cfg.equalizer_shaded);
-    check_set(mainwin_toggleaction_group_others, "view easy move", cfg.easy_move);
-    check_set(mainwin_toggleaction_group_others, "view doublesize", cfg.doublesize);
+    check_set(toggleaction_group_others, "view always on top", cfg.always_on_top);
+    check_set(toggleaction_group_others, "view put on all workspaces", cfg.sticky);
+    check_set(toggleaction_group_others, "roll up player", cfg.player_shaded);
+    check_set(toggleaction_group_others, "roll up playlist editor", cfg.playlist_shaded);
+    check_set(toggleaction_group_others, "roll up equalizer", cfg.equalizer_shaded);
+    check_set(toggleaction_group_others, "view easy move", cfg.easy_move);
+    check_set(toggleaction_group_others, "view doublesize", cfg.doublesize);
 
     /* Songname menu */
 
-    check_set(mainwin_toggleaction_group_others, "autoscroll songname", cfg.autoscroll);
-    check_set(mainwin_toggleaction_group_others, "stop after current song", cfg.stopaftersong);
+    check_set(toggleaction_group_others, "autoscroll songname", cfg.autoscroll);
+    check_set(toggleaction_group_others, "stop after current song", cfg.stopaftersong);
 
     /* Playback menu */
 
-    check_set(mainwin_toggleaction_group_others, "playback repeat", cfg.repeat);
-    check_set(mainwin_toggleaction_group_others, "playback shuffle", cfg.shuffle);
-    check_set(mainwin_toggleaction_group_others, "playback no playlist advance", cfg.no_playlist_advance);
+    check_set(toggleaction_group_others, "playback repeat", cfg.repeat);
+    check_set(toggleaction_group_others, "playback shuffle", cfg.shuffle);
+    check_set(toggleaction_group_others, "playback no playlist advance", cfg.no_playlist_advance);
 
     /* Visualization menu */
 
     switch ( cfg.vis_type )
     {
       case VIS_ANALYZER:
-        check_set(mainwin_radioaction_group_vismode, "vismode analyzer", TRUE);
+        check_set(radioaction_group_vismode, "vismode analyzer", TRUE);
         break;
       case VIS_SCOPE:
-        check_set(mainwin_radioaction_group_vismode, "vismode scope", TRUE);
+        check_set(radioaction_group_vismode, "vismode scope", TRUE);
         break;
       case VIS_VOICEPRINT:
-        check_set(mainwin_radioaction_group_vismode, "vismode voiceprint", TRUE);
+        check_set(radioaction_group_vismode, "vismode voiceprint", TRUE);
         break;
       case VIS_OFF:
       default:
-        check_set(mainwin_radioaction_group_vismode, "vismode off", TRUE);
+        check_set(radioaction_group_vismode, "vismode off", TRUE);
         break;
     }
 
     switch ( cfg.analyzer_mode )
     {
       case ANALYZER_FIRE:
-        check_set(mainwin_radioaction_group_anamode, "anamode fire", TRUE);
+        check_set(radioaction_group_anamode, "anamode fire", TRUE);
         break;
       case ANALYZER_VLINES:
-        check_set(mainwin_radioaction_group_anamode, "anamode vertical lines", TRUE);
+        check_set(radioaction_group_anamode, "anamode vertical lines", TRUE);
         break;
       case ANALYZER_NORMAL:
       default:
-        check_set(mainwin_radioaction_group_anamode, "anamode normal", TRUE);
+        check_set(radioaction_group_anamode, "anamode normal", TRUE);
         break;
     }
 
     switch ( cfg.analyzer_type )
     {
       case ANALYZER_BARS:
-        check_set(mainwin_radioaction_group_anatype, "anatype bars", TRUE);
+        check_set(radioaction_group_anatype, "anatype bars", TRUE);
         break;
       case ANALYZER_LINES:
       default:
-        check_set(mainwin_radioaction_group_anatype, "anatype lines", TRUE);
+        check_set(radioaction_group_anatype, "anatype lines", TRUE);
         break;
     }
 
-    check_set(mainwin_toggleaction_group_others, "anamode peaks", cfg.analyzer_peaks );
+    check_set(toggleaction_group_others, "anamode peaks", cfg.analyzer_peaks );
 
     switch ( cfg.scope_mode )
     {
       case SCOPE_LINE:
-        check_set(mainwin_radioaction_group_scomode, "scomode line", TRUE);
+        check_set(radioaction_group_scomode, "scomode line", TRUE);
         break;
       case SCOPE_SOLID:
-        check_set(mainwin_radioaction_group_scomode, "scomode solid", TRUE);
+        check_set(radioaction_group_scomode, "scomode solid", TRUE);
         break;
       case SCOPE_DOT:
       default:
-        check_set(mainwin_radioaction_group_scomode, "scomode dot", TRUE);
+        check_set(radioaction_group_scomode, "scomode dot", TRUE);
         break;
     }
 
     switch ( cfg.voiceprint_mode )
     {
       case VOICEPRINT_FIRE:
-        check_set(mainwin_radioaction_group_vprmode, "vprmode fire", TRUE);
+        check_set(radioaction_group_vprmode, "vprmode fire", TRUE);
         break;
       case VOICEPRINT_ICE:
-        check_set(mainwin_radioaction_group_vprmode, "vprmode ice", TRUE);
+        check_set(radioaction_group_vprmode, "vprmode ice", TRUE);
         break;
       case VOICEPRINT_NORMAL:
       default:
-        check_set(mainwin_radioaction_group_vprmode, "vprmode normal", TRUE);
+        check_set(radioaction_group_vprmode, "vprmode normal", TRUE);
         break;
     }
 
     switch ( cfg.vu_mode )
     {
       case VU_SMOOTH:
-        check_set(mainwin_radioaction_group_wshmode, "wshmode smooth", TRUE);
+        check_set(radioaction_group_wshmode, "wshmode smooth", TRUE);
         break;
       case VU_NORMAL:
       default:
-        check_set(mainwin_radioaction_group_wshmode, "wshmode normal", TRUE);
+        check_set(radioaction_group_wshmode, "wshmode normal", TRUE);
         break;
     }
 
     switch ( cfg.vis_refresh )
     {
       case REFRESH_HALF:
-        check_set(mainwin_radioaction_group_refrate, "refrate half", TRUE);
+        check_set(radioaction_group_refrate, "refrate half", TRUE);
         break;
       case REFRESH_QUARTER:
-        check_set(mainwin_radioaction_group_refrate, "refrate quarter", TRUE);
+        check_set(radioaction_group_refrate, "refrate quarter", TRUE);
         break;
       case REFRESH_EIGTH:
-        check_set(mainwin_radioaction_group_refrate, "refrate eighth", TRUE);
+        check_set(radioaction_group_refrate, "refrate eighth", TRUE);
         break;
       case REFRESH_FULL:
       default:
-        check_set(mainwin_radioaction_group_refrate, "refrate full", TRUE);
+        check_set(radioaction_group_refrate, "refrate full", TRUE);
         break;
     }
 
     switch ( cfg.analyzer_falloff )
     {
       case FALLOFF_SLOW:
-        check_set(mainwin_radioaction_group_anafoff, "anafoff slow", TRUE);
+        check_set(radioaction_group_anafoff, "anafoff slow", TRUE);
         break;
       case FALLOFF_MEDIUM:
-        check_set(mainwin_radioaction_group_anafoff, "anafoff medium", TRUE);
+        check_set(radioaction_group_anafoff, "anafoff medium", TRUE);
         break;
       case FALLOFF_FAST:
-        check_set(mainwin_radioaction_group_anafoff, "anafoff fast", TRUE);
+        check_set(radioaction_group_anafoff, "anafoff fast", TRUE);
         break;
       case FALLOFF_FASTEST:
-        check_set(mainwin_radioaction_group_anafoff, "anafoff fastest", TRUE);
+        check_set(radioaction_group_anafoff, "anafoff fastest", TRUE);
         break;
       case FALLOFF_SLOWEST:
       default:
-        check_set(mainwin_radioaction_group_anafoff, "anafoff slowest", TRUE);
+        check_set(radioaction_group_anafoff, "anafoff slowest", TRUE);
         break;
     }
 
     switch ( cfg.peaks_falloff )
     {
       case FALLOFF_SLOW:
-        check_set(mainwin_radioaction_group_peafoff, "peafoff slow", TRUE);
+        check_set(radioaction_group_peafoff, "peafoff slow", TRUE);
         break;
       case FALLOFF_MEDIUM:
-        check_set(mainwin_radioaction_group_peafoff, "peafoff medium", TRUE);
+        check_set(radioaction_group_peafoff, "peafoff medium", TRUE);
         break;
       case FALLOFF_FAST:
-        check_set(mainwin_radioaction_group_peafoff, "peafoff fast", TRUE);
+        check_set(radioaction_group_peafoff, "peafoff fast", TRUE);
         break;
       case FALLOFF_FASTEST:
-        check_set(mainwin_radioaction_group_peafoff, "peafoff fastest", TRUE);
+        check_set(radioaction_group_peafoff, "peafoff fastest", TRUE);
         break;
       case FALLOFF_SLOWEST:
       default:
-        check_set(mainwin_radioaction_group_peafoff, "peafoff slowest", TRUE);
+        check_set(radioaction_group_peafoff, "peafoff slowest", TRUE);
         break;
     }
 
--- a/audacious/ui_manager.c	Tue Jan 02 22:23:09 2007 -0800
+++ b/audacious/ui_manager.c	Wed Jan 03 01:25:18 2007 -0800
@@ -21,8 +21,10 @@
 
 #include "ui_manager.h"
 #include "actions-mainwin.h"
+#include "actions-playlist.h"
 
 #include "ui_main.h"
+#include "ui_playlist.h"
 #include "icons-stock.h"
 #include "widgets/widgetcore.h"
 
@@ -32,7 +34,7 @@
 
 /* toggle action entries */
 
-static GtkToggleActionEntry mainwin_toggleaction_entries_others[] = {
+static GtkToggleActionEntry toggleaction_entries_others[] = {
 
 	{ "autoscroll songname", NULL , N_("Autoscroll Songname"), NULL,
 	  N_("Autoscroll Songname"), G_CALLBACK(action_autoscroll_songname) , FALSE },
@@ -87,49 +89,49 @@
 
 /* radio action entries */
 
-static GtkRadioActionEntry mainwin_radioaction_entries_vismode[] = {
+static GtkRadioActionEntry radioaction_entries_vismode[] = {
 	{ "vismode analyzer", NULL , N_("Analyzer"), NULL, N_("Analyzer"), VIS_ANALYZER },
 	{ "vismode scope", NULL , N_("Scope"), NULL, N_("Scope"), VIS_SCOPE },
 	{ "vismode voiceprint", NULL , N_("Voiceprint"), NULL, N_("Voiceprint"), VIS_VOICEPRINT },
 	{ "vismode off", NULL , N_("Off"), NULL, N_("Off"), VIS_OFF }
 };
 
-static GtkRadioActionEntry mainwin_radioaction_entries_anamode[] = {
+static GtkRadioActionEntry radioaction_entries_anamode[] = {
 	{ "anamode normal", NULL , N_("Normal"), NULL, N_("Normal"), ANALYZER_NORMAL },
 	{ "anamode fire", NULL , N_("Fire"), NULL, N_("Fire"), ANALYZER_FIRE },
 	{ "anamode vertical lines", NULL , N_("Vertical Lines"), NULL, N_("Vertical Lines"), ANALYZER_VLINES }
 };
 
-static GtkRadioActionEntry mainwin_radioaction_entries_anatype[] = {
+static GtkRadioActionEntry radioaction_entries_anatype[] = {
 	{ "anatype lines", NULL , N_("Lines"), NULL, N_("Lines"), ANALYZER_LINES },
 	{ "anatype bars", NULL , N_("Bars"), NULL, N_("Bars"), ANALYZER_BARS }
 };
 
-static GtkRadioActionEntry mainwin_radioaction_entries_scomode[] = {
+static GtkRadioActionEntry radioaction_entries_scomode[] = {
 	{ "scomode dot", NULL , N_("Dot Scope"), NULL, N_("Dot Scope"), SCOPE_DOT },
 	{ "scomode line", NULL , N_("Line Scope"), NULL, N_("Line Scope"), SCOPE_LINE },
 	{ "scomode solid", NULL , N_("Solid Scope"), NULL, N_("Solid Scope"), SCOPE_SOLID }
 };
 
-static GtkRadioActionEntry mainwin_radioaction_entries_vprmode[] = {
+static GtkRadioActionEntry radioaction_entries_vprmode[] = {
 	{ "vprmode normal", NULL , N_("Normal"), NULL, N_("Normal"), VOICEPRINT_NORMAL },
 	{ "vprmode fire", NULL , N_("Fire"), NULL, N_("Fire"), VOICEPRINT_FIRE },
 	{ "vprmode ice", NULL , N_("Ice"), NULL, N_("Ice"), VOICEPRINT_ICE }
 };
 
-static GtkRadioActionEntry mainwin_radioaction_entries_wshmode[] = {
+static GtkRadioActionEntry radioaction_entries_wshmode[] = {
 	{ "wshmode normal", NULL , N_("Normal"), NULL, N_("Normal"), VU_NORMAL },
 	{ "wshmode smooth", NULL , N_("Smooth"), NULL, N_("Smooth"), VU_SMOOTH }
 };
 
-static GtkRadioActionEntry mainwin_radioaction_entries_refrate[] = {
+static GtkRadioActionEntry radioaction_entries_refrate[] = {
 	{ "refrate full", NULL , N_("Full (~50 fps)"), NULL, N_("Full (~50 fps)"), REFRESH_FULL },
 	{ "refrate half", NULL , N_("Half (~25 fps)"), NULL, N_("Half (~25 fps)"), REFRESH_HALF },
 	{ "refrate quarter", NULL , N_("Quarter (~13 fps)"), NULL, N_("Quarter (~13 fps)"), REFRESH_QUARTER },
 	{ "refrate eighth", NULL , N_("Eighth (~6 fps)"), NULL, N_("Eighth (~6 fps)"), REFRESH_EIGTH }
 };
 
-static GtkRadioActionEntry mainwin_radioaction_entries_anafoff[] = {
+static GtkRadioActionEntry radioaction_entries_anafoff[] = {
 	{ "anafoff slowest", NULL , N_("Slowest"), NULL, N_("Slowest"), FALLOFF_SLOWEST },
 	{ "anafoff slow", NULL , N_("Slow"), NULL, N_("Slow"), FALLOFF_SLOW },
 	{ "anafoff medium", NULL , N_("Medium"), NULL, N_("Medium"), FALLOFF_MEDIUM },
@@ -137,7 +139,7 @@
 	{ "anafoff fastest", NULL , N_("Fastest"), NULL, N_("Fastest"), FALLOFF_FASTEST }
 };
 
-static GtkRadioActionEntry mainwin_radioaction_entries_peafoff[] = {
+static GtkRadioActionEntry radioaction_entries_peafoff[] = {
 	{ "peafoff slowest", NULL , N_("Slowest"), NULL, N_("Slowest"), FALLOFF_SLOWEST },
 	{ "peafoff slow", NULL , N_("Slow"), NULL, N_("Slow"), FALLOFF_SLOW },
 	{ "peafoff medium", NULL , N_("Medium"), NULL, N_("Medium"), FALLOFF_MEDIUM },
@@ -145,7 +147,7 @@
 	{ "peafoff fastest", NULL , N_("Fastest"), NULL, N_("Fastest"), FALLOFF_FASTEST }
 };
 
-static GtkRadioActionEntry mainwin_radioaction_entries_viewtime[] = {
+static GtkRadioActionEntry radioaction_entries_viewtime[] = {
 	{ "view time elapsed", NULL , N_("Time Elapsed"), "<Ctrl>E", N_("Time Elapsed"), TIMER_ELAPSED },
 	{ "view time remaining", NULL , N_("Time Remaining"), "<Ctrl>R", N_("Time Remaining"), TIMER_REMAINING }
 };
@@ -154,7 +156,7 @@
 
 /* normal actions */
 
-static GtkActionEntry mainwin_action_entries_playback[] = {
+static GtkActionEntry action_entries_playback[] = {
 
 	{ "playback", NULL, "Playback" },
 
@@ -178,7 +180,7 @@
 };
 
 
-static GtkActionEntry mainwin_action_entries_visualization[] = {
+static GtkActionEntry action_entries_visualization[] = {
 
 	{ "visualization", NULL, "Visualization" },
 
@@ -199,30 +201,186 @@
 	{ "peafoff", NULL, "Peaks Falloff" }
 };
 
-static GtkActionEntry mainwin_action_entries_playlist[] = {
+static GtkActionEntry action_entries_playlist[] = {
 
 	{ "playlist", NULL, "Playlist" },
 
-	{ "playlist new", NULL , N_("New Playlist"), "<Shift>N",
+	{ "playlist new", GTK_STOCK_NEW , N_("New Playlist"), "<Shift>N",
 	  N_("New Playlist"), G_CALLBACK(action_playlist_new) },
 
-	{ "playlist select next", NULL , N_("Select Next Playlist"), "<Shift>P",
+	{ "playlist select next", GTK_STOCK_MEDIA_NEXT, N_("Select Next Playlist"), "<Shift>P",
 	  N_("Select Next Playlist"), G_CALLBACK(action_playlist_next) },
 
-	{ "playlist select previous", NULL , N_("Select Previous Playlist"), "<Shift><Ctrl>P",
-	  N_("Select Previous Playlist"), G_CALLBACK(action_playlist_prev) }
+	{ "playlist select previous", GTK_STOCK_MEDIA_PREVIOUS, N_("Select Previous Playlist"), "<Shift><Ctrl>P",
+	  N_("Select Previous Playlist"), G_CALLBACK(action_playlist_prev) },
+
+        { "playlist load", GTK_STOCK_OPEN, N_("Load List"), "O",
+          N_("Loads a playlist file into the selected playlist."), G_CALLBACK(action_load_list) },
+
+        { "playlist save", GTK_STOCK_SAVE, N_("Save List"), "<Shift>S",
+          N_("Saves the selected playlist."), G_CALLBACK(action_save_list) },
+
+        { "playlist save default", GTK_STOCK_SAVE, N_("Save Default List"), "<Alt>S",
+          N_("Saves the selected playlist to the default location."),
+          G_CALLBACK(action_save_default_list) },
+
+        { "playlist manager", AUD_STOCK_PLAYLIST , N_("List Manager"), "P",
+          N_("Opens the playlist manager."),
+          G_CALLBACK(action_open_list_manager) },
+
+        { "playlist refresh", GTK_STOCK_REFRESH, N_("Refresh List"), "F5",
+          N_("Refreshes metadata associated with a playlist entry."),
+          G_CALLBACK(action_refresh_list) },
 };
 
-static GtkActionEntry mainwin_action_entries_view[] = {
+static GtkActionEntry action_entries_view[] = {
 
 	{ "view", NULL, "View" }
 };
 
-static GtkActionEntry mainwin_action_entries_others[] = {
+static GtkActionEntry action_entries_add[] = {
+        { "add cd", GTK_STOCK_CDROM, N_("Add CD..."), "<Shift>C",
+          N_("Adds a CD to the playlist."),
+          G_CALLBACK(action_add_cd) },
+
+        { "add url", GTK_STOCK_NETWORK, N_("Add Internet Address..."), "<Ctrl>H",
+          N_("Adds a remote track to the playlist."),
+          G_CALLBACK(action_add_url) },
+
+        { "add files", GTK_STOCK_ADD, N_("Add Files..."), "F",
+          N_("Adds files to the playlist."),
+          G_CALLBACK(action_add_files) },
+};
+
+static GtkActionEntry action_entries_select[] = {
+        { "search and select", GTK_STOCK_FIND, N_("Search and Select"), "<Ctrl>F",
+          N_("Searches the playlist and selects playlist entries based on specific criteria."),
+          G_CALLBACK(action_search_and_select) },
+
+        { "invert selection", AUD_STOCK_SELECTINVERT , N_("Invert Selection"), NULL,
+          N_("Inverts the selected and unselected entries."),
+          G_CALLBACK(action_invert_selection) },
+
+        { "select all", AUD_STOCK_SELECTALL , N_("Select All"), "<Ctrl>A",
+          N_("Selects all of the playlist entries."),
+          G_CALLBACK(action_select_all) },
+
+        { "select none", AUD_STOCK_SELECTNONE , N_("Select None"), "<Shift><Ctrl>A",
+          N_("Deselects all of the playlist entries."),
+          G_CALLBACK(action_select_none) },
+};
+
+static GtkActionEntry action_entries_delete[] = {
+	{ "clear queue", GTK_STOCK_REMOVE, N_("Clear Queue"), "<Shift>Q",
+	  N_("Clears the queue associated with this playlist."),
+	  G_CALLBACK(action_clear_queue) },
+
+	{ "remove unavailable", AUD_STOCK_REMOVEUNAVAIL , N_("Remove Unavailable Files"), NULL,
+	  N_("Removes unavailable files from the playlist."),
+	  G_CALLBACK(action_remove_unavailable) },
+
+	{ "remove duplicates menu", AUD_STOCK_REMOVEDUPS , N_("Remove Duplicates") },
+
+	{ "remove by title", AUD_STOCK_REMOVEDUPS , N_("By Title"), NULL,
+	  N_("Removes duplicate entries from the playlist by title."),
+	  G_CALLBACK(action_remove_dupes_by_title) },
+
+	{ "remove by filename", AUD_STOCK_REMOVEDUPS , N_("By Filename"), NULL, 
+	  N_("Removes duplicate entries from the playlist by filename."),
+	  G_CALLBACK(action_remove_dupes_by_filename) },
+
+	{ "remove by full path", AUD_STOCK_REMOVEDUPS , N_("By Path + Filename"), NULL, 
+	  N_("Removes duplicate entries from the playlist by their full path."),
+	  G_CALLBACK(action_remove_dupes_by_full_path) },
+
+	{ "remove all", GTK_STOCK_CLEAR, N_("Remove All"), NULL, 
+	  N_("Removes all entries from the playlist."),
+	  G_CALLBACK(action_remove_all) },
+
+	{ "remove unselected", GTK_STOCK_REMOVE, N_("Remove Unselected"), NULL,
+	  N_("Remove unselected entries from the playlist."),
+	  G_CALLBACK(action_remove_unselected) },
+
+	{ "remove selected", GTK_STOCK_REMOVE, N_("Remove Selected"), "Delete", 
+	  N_("Remove selected entries from the playlist."),
+	  G_CALLBACK(action_remove_selected) },
+};
+
+static GtkActionEntry action_entries_sort[] = {
+	{ "randomize list", AUD_STOCK_RANDOMIZEPL , N_("Randomize List"), "<Ctrl><Shift>R",
+	  N_("Randomizes the playlist."),
+	  G_CALLBACK(action_randomize_list) },
+
+	{ "reverse list", AUD_STOCK_INVERTPL , N_("Reverse List"), NULL,
+	  N_("Reverses the playlist."),
+	  G_CALLBACK(action_reverse_list) },
+
+	{ "sort menu", AUD_STOCK_SORTBYTITLE , N_("Sort List") },
+
+	{ "sort by title", AUD_STOCK_SORTBYTITLE , N_("By Title"), NULL,
+	  N_("Sorts the list by title."),
+	  G_CALLBACK(action_sort_by_title) },
+
+	{ "sort by artist", AUD_STOCK_SORTBYARTIST , N_("By Artist"), NULL,
+	  N_("Sorts the list by artist."),
+	  G_CALLBACK(action_sort_by_artist) },
+
+	{ "sort by filename", AUD_STOCK_SORTBYFILENAME , N_("By Filename"), NULL,
+	  N_("Sorts the list by filename."),
+	  G_CALLBACK(action_sort_by_filename) },
+
+	{ "sort by full path", AUD_STOCK_SORTBYPATHFILE , N_("By Path + Filename"), NULL,
+	  N_("Sorts the list by full pathname."),
+	  G_CALLBACK(action_sort_by_full_path) },
+
+	{ "sort by date", AUD_STOCK_SORTBYARTIST , N_("By Date"), NULL,
+	  N_("Sorts the list by modification time."),
+	  G_CALLBACK(action_sort_by_date) },
+
+	{ "sort by track number", AUD_STOCK_SORTBYFILENAME , N_("By Track Number"), NULL,
+	  N_("Sorts the list by track number."),
+	  G_CALLBACK(action_sort_by_track_number) },
+
+	{ "sort by playlist entry", AUD_STOCK_SORTBYPATHFILE , N_("By Playlist Entry"), NULL,
+	  N_("Sorts the list by playlist entry."),
+	  G_CALLBACK(action_sort_by_playlist_entry) },
+
+	{ "sort selected menu", AUD_STOCK_SORTBYTITLE , N_("Sort Selected") },
+
+	{ "sort selected by title", AUD_STOCK_SORTBYTITLE , N_("By Title"), NULL,
+	  N_("Sorts the list by title."),
+	  G_CALLBACK(action_sort_selected_by_title) },
+
+	{ "sort selected by artist", AUD_STOCK_SORTBYARTIST, N_("By Artist"), NULL,
+	  N_("Sorts the list by artist."),
+	  G_CALLBACK(action_sort_selected_by_artist) },
+
+	{ "sort selected by filename", AUD_STOCK_SORTBYFILENAME , N_("By Filename"), NULL,
+	  N_("Sorts the list by filename."),
+	  G_CALLBACK(action_sort_selected_by_filename) },
+
+	{ "sort selected by full path", AUD_STOCK_SORTBYPATHFILE , N_("By Path + Filename"), NULL,
+	  N_("Sorts the list by full pathname."),
+	  G_CALLBACK(action_sort_selected_by_full_path) },
+
+	{ "sort selected by date", AUD_STOCK_SORTBYARTIST , N_("By Date"), NULL,
+	  N_("Sorts the list by modification time."),
+	  G_CALLBACK(action_sort_selected_by_date) },
+
+	{ "sort selected by track number", AUD_STOCK_SORTBYFILENAME , N_("By Track Number"), NULL,
+	  N_("Sorts the list by track number."),
+	  G_CALLBACK(action_sort_selected_by_track_number) },
+
+	{ "sort selected by playlist entry", AUD_STOCK_SORTBYPATHFILE, N_("By Playlist Entry"), NULL,
+	  N_("Sorts the list by playlist entry."),
+	  G_CALLBACK(action_sort_selected_by_playlist_entry) },
+};
+
+static GtkActionEntry action_entries_others[] = {
 
 	{ "dummy", NULL, "dummy" },
 
-	{ "track info", AUD_STOCK_INFO , N_("View Track Details"), NULL,
+	{ "track info", AUD_STOCK_INFO , N_("View Track Details"), "<Alt>I",
 	  N_("View track details"), G_CALLBACK(action_track_info) },
 
 	{ "about audacious", GTK_STOCK_DIALOG_INFO , N_("About Audacious"), NULL,
@@ -253,7 +411,11 @@
 	  N_("Jump to File"), G_CALLBACK(action_jump_to_file) },
 
 	{ "jump to time", GTK_STOCK_JUMP_TO , N_("Jump to Time"), "<Ctrl>J",
-	  N_("Jump to Time"), G_CALLBACK(action_jump_to_time) }
+	  N_("Jump to Time"), G_CALLBACK(action_jump_to_time) },
+
+	{ "queue toggle", AUD_STOCK_QUEUETOGGLE , N_("Queue Toggle"), "Q", 
+	  N_("Enables/disables the entry in the playlist's queue."),
+	  G_CALLBACK(action_queue_toggle) },
 };
 
 
@@ -264,106 +426,122 @@
 ui_manager_init ( void )
 {
   /* toggle actions */
-  mainwin_toggleaction_group_others = gtk_action_group_new("mainwin_toggleaction_others");
+  toggleaction_group_others = gtk_action_group_new("toggleaction_others");
   gtk_action_group_add_toggle_actions(
-    mainwin_toggleaction_group_others , mainwin_toggleaction_entries_others ,
-    G_N_ELEMENTS(mainwin_toggleaction_entries_others) , NULL );
+    toggleaction_group_others , toggleaction_entries_others ,
+    G_N_ELEMENTS(toggleaction_entries_others) , NULL );
 
   /* radio actions */
-  mainwin_radioaction_group_anamode = gtk_action_group_new("mainwin_radioaction_anamode");
+  radioaction_group_anamode = gtk_action_group_new("radioaction_anamode");
   gtk_action_group_add_radio_actions(
-    mainwin_radioaction_group_anamode , mainwin_radioaction_entries_anamode ,
-    G_N_ELEMENTS(mainwin_radioaction_entries_anamode) , 0 , G_CALLBACK(action_anamode) , NULL );
+    radioaction_group_anamode , radioaction_entries_anamode ,
+    G_N_ELEMENTS(radioaction_entries_anamode) , 0 , G_CALLBACK(action_anamode) , NULL );
 
-  mainwin_radioaction_group_anatype = gtk_action_group_new("mainwin_radioaction_anatype");
+  radioaction_group_anatype = gtk_action_group_new("radioaction_anatype");
   gtk_action_group_add_radio_actions(
-    mainwin_radioaction_group_anatype , mainwin_radioaction_entries_anatype ,
-    G_N_ELEMENTS(mainwin_radioaction_entries_anatype) , 0 , G_CALLBACK(action_anatype) , NULL );
+    radioaction_group_anatype , radioaction_entries_anatype ,
+    G_N_ELEMENTS(radioaction_entries_anatype) , 0 , G_CALLBACK(action_anatype) , NULL );
 
-  mainwin_radioaction_group_scomode = gtk_action_group_new("mainwin_radioaction_scomode");
+  radioaction_group_scomode = gtk_action_group_new("radioaction_scomode");
   gtk_action_group_add_radio_actions(
-    mainwin_radioaction_group_scomode , mainwin_radioaction_entries_scomode ,
-    G_N_ELEMENTS(mainwin_radioaction_entries_scomode) , 0 , G_CALLBACK(action_scomode) , NULL );
+    radioaction_group_scomode , radioaction_entries_scomode ,
+    G_N_ELEMENTS(radioaction_entries_scomode) , 0 , G_CALLBACK(action_scomode) , NULL );
 
-  mainwin_radioaction_group_vprmode = gtk_action_group_new("mainwin_radioaction_vprmode");
+  radioaction_group_vprmode = gtk_action_group_new("radioaction_vprmode");
   gtk_action_group_add_radio_actions(
-    mainwin_radioaction_group_vprmode , mainwin_radioaction_entries_vprmode ,
-    G_N_ELEMENTS(mainwin_radioaction_entries_vprmode) , 0 , G_CALLBACK(action_vprmode) , NULL );
+    radioaction_group_vprmode , radioaction_entries_vprmode ,
+    G_N_ELEMENTS(radioaction_entries_vprmode) , 0 , G_CALLBACK(action_vprmode) , NULL );
 
-  mainwin_radioaction_group_wshmode = gtk_action_group_new("mainwin_radioaction_wshmode");
+  radioaction_group_wshmode = gtk_action_group_new("radioaction_wshmode");
   gtk_action_group_add_radio_actions(
-    mainwin_radioaction_group_wshmode , mainwin_radioaction_entries_wshmode ,
-    G_N_ELEMENTS(mainwin_radioaction_entries_wshmode) , 0 , G_CALLBACK(action_wshmode) , NULL );
+    radioaction_group_wshmode , radioaction_entries_wshmode ,
+    G_N_ELEMENTS(radioaction_entries_wshmode) , 0 , G_CALLBACK(action_wshmode) , NULL );
 
-  mainwin_radioaction_group_refrate = gtk_action_group_new("mainwin_radioaction_refrate");
+  radioaction_group_refrate = gtk_action_group_new("radioaction_refrate");
   gtk_action_group_add_radio_actions(
-    mainwin_radioaction_group_refrate , mainwin_radioaction_entries_refrate ,
-    G_N_ELEMENTS(mainwin_radioaction_entries_refrate) , 0 , G_CALLBACK(action_refrate) , NULL );
+    radioaction_group_refrate , radioaction_entries_refrate ,
+    G_N_ELEMENTS(radioaction_entries_refrate) , 0 , G_CALLBACK(action_refrate) , NULL );
 
-  mainwin_radioaction_group_anafoff = gtk_action_group_new("mainwin_radioaction_anafoff");
+  radioaction_group_anafoff = gtk_action_group_new("radioaction_anafoff");
   gtk_action_group_add_radio_actions(
-    mainwin_radioaction_group_anafoff , mainwin_radioaction_entries_anafoff ,
-    G_N_ELEMENTS(mainwin_radioaction_entries_anafoff) , 0 , G_CALLBACK(action_anafoff) , NULL );
+    radioaction_group_anafoff , radioaction_entries_anafoff ,
+    G_N_ELEMENTS(radioaction_entries_anafoff) , 0 , G_CALLBACK(action_anafoff) , NULL );
 
-  mainwin_radioaction_group_peafoff = gtk_action_group_new("mainwin_radioaction_peafoff");
+  radioaction_group_peafoff = gtk_action_group_new("radioaction_peafoff");
   gtk_action_group_add_radio_actions(
-    mainwin_radioaction_group_peafoff , mainwin_radioaction_entries_peafoff ,
-    G_N_ELEMENTS(mainwin_radioaction_entries_peafoff) , 0 , G_CALLBACK(action_peafoff) , NULL );
+    radioaction_group_peafoff , radioaction_entries_peafoff ,
+    G_N_ELEMENTS(radioaction_entries_peafoff) , 0 , G_CALLBACK(action_peafoff) , NULL );
 
-  mainwin_radioaction_group_vismode = gtk_action_group_new("mainwin_radioaction_vismode");
+  radioaction_group_vismode = gtk_action_group_new("radioaction_vismode");
   gtk_action_group_add_radio_actions(
-    mainwin_radioaction_group_vismode , mainwin_radioaction_entries_vismode ,
-    G_N_ELEMENTS(mainwin_radioaction_entries_vismode) , 0 , G_CALLBACK(action_vismode) , NULL );
+    radioaction_group_vismode , radioaction_entries_vismode ,
+    G_N_ELEMENTS(radioaction_entries_vismode) , 0 , G_CALLBACK(action_vismode) , NULL );
 
-  mainwin_radioaction_group_viewtime = gtk_action_group_new("mainwin_radioaction_viewtime");
+  radioaction_group_viewtime = gtk_action_group_new("radioaction_viewtime");
   gtk_action_group_add_radio_actions(
-    mainwin_radioaction_group_viewtime , mainwin_radioaction_entries_viewtime ,
-    G_N_ELEMENTS(mainwin_radioaction_entries_viewtime) , 0 , G_CALLBACK(action_viewtime) , NULL );
+    radioaction_group_viewtime , radioaction_entries_viewtime ,
+    G_N_ELEMENTS(radioaction_entries_viewtime) , 0 , G_CALLBACK(action_viewtime) , NULL );
 
   /* normal actions */
-  mainwin_action_group_playback = gtk_action_group_new("mainwin_action_playback");
+  action_group_playback = gtk_action_group_new("action_playback");
     gtk_action_group_add_actions(
-    mainwin_action_group_playback , mainwin_action_entries_playback ,
-    G_N_ELEMENTS(mainwin_action_entries_playback) , NULL );
+    action_group_playback , action_entries_playback ,
+    G_N_ELEMENTS(action_entries_playback) , NULL );
 
-  mainwin_action_group_playlist = gtk_action_group_new("mainwin_action_playlist");
+  action_group_playlist = gtk_action_group_new("action_playlist");
     gtk_action_group_add_actions(
-    mainwin_action_group_playlist , mainwin_action_entries_playlist ,
-    G_N_ELEMENTS(mainwin_action_entries_playlist) , NULL );
+    action_group_playlist , action_entries_playlist ,
+    G_N_ELEMENTS(action_entries_playlist) , NULL );
 
-  mainwin_action_group_visualization = gtk_action_group_new("mainwin_action_visualization");
+  action_group_visualization = gtk_action_group_new("action_visualization");
+    gtk_action_group_add_actions(
+    action_group_visualization , action_entries_visualization ,
+    G_N_ELEMENTS(action_entries_visualization) , NULL );
+
+  action_group_view = gtk_action_group_new("action_view");
     gtk_action_group_add_actions(
-    mainwin_action_group_visualization , mainwin_action_entries_visualization ,
-    G_N_ELEMENTS(mainwin_action_entries_visualization) , NULL );
+    action_group_view , action_entries_view ,
+    G_N_ELEMENTS(action_entries_view) , NULL );
 
-  mainwin_action_group_view = gtk_action_group_new("mainwin_action_view");
+  action_group_others = gtk_action_group_new("action_others");
     gtk_action_group_add_actions(
-    mainwin_action_group_view , mainwin_action_entries_view ,
-    G_N_ELEMENTS(mainwin_action_entries_view) , NULL );
+    action_group_others , action_entries_others ,
+    G_N_ELEMENTS(action_entries_others) , NULL );
+
+  action_group_add = gtk_action_group_new("action_add");
+  gtk_action_group_add_actions(action_group_add, action_entries_add, G_N_ELEMENTS(action_entries_add), NULL );
 
-  mainwin_action_group_others = gtk_action_group_new("mainwin_action_others");
-    gtk_action_group_add_actions(
-    mainwin_action_group_others , mainwin_action_entries_others ,
-    G_N_ELEMENTS(mainwin_action_entries_others) , NULL );
+  action_group_select = gtk_action_group_new("action_select");
+  gtk_action_group_add_actions(action_group_select, action_entries_select, G_N_ELEMENTS(action_entries_select), NULL );
+
+  action_group_delete = gtk_action_group_new("action_delete");
+  gtk_action_group_add_actions(action_group_delete, action_entries_delete, G_N_ELEMENTS(action_entries_delete), NULL );
+
+  action_group_sort = gtk_action_group_new("action_sort");
+  gtk_action_group_add_actions(action_group_sort, action_entries_sort, G_N_ELEMENTS(action_entries_sort), NULL );
 
   /* ui */
   ui_manager = gtk_ui_manager_new();
-  gtk_ui_manager_insert_action_group( ui_manager , mainwin_toggleaction_group_others , 0 );
-  gtk_ui_manager_insert_action_group( ui_manager , mainwin_radioaction_group_anamode , 0 );
-  gtk_ui_manager_insert_action_group( ui_manager , mainwin_radioaction_group_anatype , 0 );
-  gtk_ui_manager_insert_action_group( ui_manager , mainwin_radioaction_group_scomode , 0 );
-  gtk_ui_manager_insert_action_group( ui_manager , mainwin_radioaction_group_vprmode , 0 );
-  gtk_ui_manager_insert_action_group( ui_manager , mainwin_radioaction_group_wshmode , 0 );
-  gtk_ui_manager_insert_action_group( ui_manager , mainwin_radioaction_group_refrate , 0 );
-  gtk_ui_manager_insert_action_group( ui_manager , mainwin_radioaction_group_anafoff , 0 );
-  gtk_ui_manager_insert_action_group( ui_manager , mainwin_radioaction_group_peafoff , 0 );
-  gtk_ui_manager_insert_action_group( ui_manager , mainwin_radioaction_group_vismode , 0 );
-  gtk_ui_manager_insert_action_group( ui_manager , mainwin_radioaction_group_viewtime , 0 );
-  gtk_ui_manager_insert_action_group( ui_manager , mainwin_action_group_playback , 0 );
-  gtk_ui_manager_insert_action_group( ui_manager , mainwin_action_group_playlist , 0 );
-  gtk_ui_manager_insert_action_group( ui_manager , mainwin_action_group_visualization , 0 );
-  gtk_ui_manager_insert_action_group( ui_manager , mainwin_action_group_view , 0 );
-  gtk_ui_manager_insert_action_group( ui_manager , mainwin_action_group_others , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , toggleaction_group_others , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , radioaction_group_anamode , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , radioaction_group_anatype , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , radioaction_group_scomode , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , radioaction_group_vprmode , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , radioaction_group_wshmode , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , radioaction_group_refrate , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , radioaction_group_anafoff , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , radioaction_group_peafoff , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , radioaction_group_vismode , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , radioaction_group_viewtime , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , action_group_playback , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , action_group_playlist , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , action_group_visualization , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , action_group_view , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , action_group_others , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , action_group_add , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , action_group_select , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , action_group_delete , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , action_group_sort , 0 );
 
   return;
 }
@@ -392,6 +570,23 @@
   mainwin_view_menu = ui_manager_get_popup_menu( ui_manager , "/mainwin-menus/main-menu/view" );
   mainwin_general_menu = ui_manager_get_popup_menu( ui_manager , "/mainwin-menus/main-menu" );
 
+  gtk_ui_manager_add_ui_from_file( ui_manager , DATA_DIR "/ui/playlist.ui" , &gerr );
+
+  if ( gerr != NULL )
+  {
+    g_critical( "Error creating UI<ui/playlist.ui>: %s" , gerr->message );
+    g_error_free( gerr );
+    return;
+  }
+
+  playlistwin_popup_menu = ui_manager_get_popup_menu(ui_manager, "/playlist-menus/playlist-rightclick-menu");
+
+  pladd_menu  = ui_manager_get_popup_menu(ui_manager, "/playlist-menus/add-menu");
+  pldel_menu  = ui_manager_get_popup_menu(ui_manager, "/playlist-menus/del-menu");
+  plsel_menu  = ui_manager_get_popup_menu(ui_manager, "/playlist-menus/select-menu");
+  plsort_menu = ui_manager_get_popup_menu(ui_manager, "/playlist-menus/misc-menu");
+  pllist_menu = ui_manager_get_popup_menu(ui_manager, "/playlist-menus/playlist-menu");
+
   return;
 }
 
--- a/audacious/ui_manager.h	Tue Jan 02 22:23:09 2007 -0800
+++ b/audacious/ui_manager.h	Wed Jan 03 01:25:18 2007 -0800
@@ -31,22 +31,26 @@
 GtkWidget *mainwin_playlist_menu;
 GtkWidget *mainwin_view_menu;
 
-GtkActionGroup *mainwin_toggleaction_group_others;
-GtkActionGroup *mainwin_radioaction_group_anamode; /* Analyzer mode */
-GtkActionGroup *mainwin_radioaction_group_anatype; /* Analyzer type */
-GtkActionGroup *mainwin_radioaction_group_scomode; /* Scope mode */
-GtkActionGroup *mainwin_radioaction_group_vprmode; /* Voiceprint mode */
-GtkActionGroup *mainwin_radioaction_group_wshmode; /* WindowShade VU mode */
-GtkActionGroup *mainwin_radioaction_group_refrate; /* Refresh rate */
-GtkActionGroup *mainwin_radioaction_group_anafoff; /* Analyzer Falloff */
-GtkActionGroup *mainwin_radioaction_group_peafoff; /* Peak Falloff */
-GtkActionGroup *mainwin_radioaction_group_vismode; /* Visualization mode */
-GtkActionGroup *mainwin_radioaction_group_viewtime; /* View time (remaining/elapsed) */
-GtkActionGroup *mainwin_action_group_playback;
-GtkActionGroup *mainwin_action_group_playlist;
-GtkActionGroup *mainwin_action_group_visualization;
-GtkActionGroup *mainwin_action_group_view;
-GtkActionGroup *mainwin_action_group_others;
+GtkActionGroup *toggleaction_group_others;
+GtkActionGroup *radioaction_group_anamode; /* Analyzer mode */
+GtkActionGroup *radioaction_group_anatype; /* Analyzer type */
+GtkActionGroup *radioaction_group_scomode; /* Scope mode */
+GtkActionGroup *radioaction_group_vprmode; /* Voiceprint mode */
+GtkActionGroup *radioaction_group_wshmode; /* WindowShade VU mode */
+GtkActionGroup *radioaction_group_refrate; /* Refresh rate */
+GtkActionGroup *radioaction_group_anafoff; /* Analyzer Falloff */
+GtkActionGroup *radioaction_group_peafoff; /* Peak Falloff */
+GtkActionGroup *radioaction_group_vismode; /* Visualization mode */
+GtkActionGroup *radioaction_group_viewtime; /* View time (remaining/elapsed) */
+GtkActionGroup *action_group_playback;
+GtkActionGroup *action_group_playlist;
+GtkActionGroup *action_group_visualization;
+GtkActionGroup *action_group_view;
+GtkActionGroup *action_group_others;
+GtkActionGroup *action_group_add;
+GtkActionGroup *action_group_select;
+GtkActionGroup *action_group_delete;
+GtkActionGroup *action_group_sort;
 
 
 void uimanager_init ( void );
--- a/audacious/ui_playlist.c	Tue Jan 02 22:23:09 2007 -0800
+++ b/audacious/ui_playlist.c	Wed Jan 03 01:25:18 2007 -0800
@@ -50,6 +50,7 @@
 #include "playlist_container.h"
 #include "playlist_manager.h"
 #include "util.h"
+#include "actions-playlist.h"
 
 #include "icons-stock.h"
 #include "images/audacious_playlist.xpm"
@@ -79,235 +80,13 @@
 
 static GList *playlistwin_wlist = NULL;
 
-static void playlistwin_select_search_cbt_cb( GtkWidget *called_cbt ,
+void playlistwin_select_search_cbt_cb( GtkWidget *called_cbt ,
                                               gpointer other_cbt );
 static gboolean playlistwin_select_search_kp_cb( GtkWidget *entry , GdkEventKey *event ,
                                                  gpointer searchdlg_win );
 
-static void action_new_list(void);
-static void action_load_list(void);
-static void action_save_list(void);
-static void action_save_default_list(void);
-static void action_open_list_manager(void);
-static void action_refresh_list(void);
-
-static void action_search_and_select(void);
-static void action_invert_selection(void);
-static void action_select_all(void);
-static void action_select_none(void);
-
-static void action_clear_queue(void);
-static void action_remove_unavailable(void);
-static void action_remove_dupes_by_title(void);
-static void action_remove_dupes_by_filename(void);
-static void action_remove_dupes_by_full_path(void);
-static void action_remove_all(void);
-static void action_remove_selected(void);
-static void action_remove_unselected(void);
-
-static void action_add_cd(void);
-static void action_add_url(void);
-static void action_add_files(void);
-
-static void action_randomize_list(void);
-static void action_reverse_list(void);
-
-static void action_sort_by_title(void);
-static void action_sort_by_artist(void);
-static void action_sort_by_filename(void);
-static void action_sort_by_full_path(void);
-static void action_sort_by_date(void);
-static void action_sort_by_track_number(void);
-static void action_sort_by_playlist_entry(void);
-
-static void action_sort_selected_by_title(void);
-static void action_sort_selected_by_artist(void);
-static void action_sort_selected_by_filename(void);
-static void action_sort_selected_by_full_path(void);
-static void action_sort_selected_by_date(void);
-static void action_sort_selected_by_track_number(void);
-static void action_sort_selected_by_playlist_entry(void);
-
-static void action_view_track_info(void);
-static void action_queue_toggle(void);
-
-static GtkActionEntry playlistwin_actions[] = {
-	{ "dummy", NULL, "dummy" },
-
-	/* **************** playlist menu **************** */
-
-	{ "new list", GTK_STOCK_NEW, N_("New List"), "<Shift>N",
-	  N_("Creates a new playlist."), G_CALLBACK(action_new_list) },
-
-	{ "load list", GTK_STOCK_OPEN, N_("Load List"), "O",
-	  N_("Loads a playlist file into the selected playlist."), G_CALLBACK(action_load_list) },
-
-	{ "save list", GTK_STOCK_SAVE, N_("Save List"), "<Shift>S",
-	  N_("Saves the selected playlist."), G_CALLBACK(action_save_list) },
-
-	{ "save default list", GTK_STOCK_SAVE, N_("Save Default List"), "<Alt>S",
-	  N_("Saves the selected playlist to the default location."),
-	  G_CALLBACK(action_save_default_list) },
-
-	{ "list manager", AUD_STOCK_PLAYLIST , N_("List Manager"), "P",
-	  N_("Opens the playlist manager."),
-	  G_CALLBACK(action_open_list_manager) },
-
-	{ "refresh list", GTK_STOCK_REFRESH, N_("Refresh List"), "F5",
-	  N_("Refreshes metadata associated with a playlist entry."),
-	  G_CALLBACK(action_refresh_list) },
-
-	/* **************** select menu **************** */
-
-	{ "search and select", GTK_STOCK_FIND, N_("Search and Select"), "<Ctrl>F",
-	  N_("Searches the playlist and selects playlist entries based on specific criteria."),
-	  G_CALLBACK(action_search_and_select) },
-
-	{ "invert selection", AUD_STOCK_SELECTINVERT , N_("Invert Selection"), NULL,
-	  N_("Inverts the selected and unselected entries."),
-	  G_CALLBACK(action_invert_selection) },
-
-	{ "select all", AUD_STOCK_SELECTALL , N_("Select All"), "<Ctrl>A",
-	  N_("Selects all of the playlist entries."),
-	  G_CALLBACK(action_select_all) },
-
-	{ "select none", AUD_STOCK_SELECTNONE , N_("Select None"), "<Shift><Ctrl>A",
-	  N_("Deselects all of the playlist entries."),
-	  G_CALLBACK(action_select_none) },
-
-	/* **************** delete menu **************** */
-
-	{ "clear queue", GTK_STOCK_REMOVE, N_("Clear Queue"), "<Shift>Q",
-	  N_("Clears the queue associated with this playlist."),
-	  G_CALLBACK(action_clear_queue) },
-
-	{ "remove unavailable", AUD_STOCK_REMOVEUNAVAIL , N_("Remove Unavailable Files"), NULL,
-	  N_("Removes unavailable files from the playlist."),
-	  G_CALLBACK(action_remove_unavailable) },
-
-	{ "remove duplicates menu", AUD_STOCK_REMOVEDUPS , N_("Remove Duplicates") },
-
-	{ "remove by title", AUD_STOCK_REMOVEDUPS , N_("By Title"), NULL,
-	  N_("Removes duplicate entries from the playlist by title."),
-	  G_CALLBACK(action_remove_dupes_by_title) },
-
-	{ "remove by filename", AUD_STOCK_REMOVEDUPS , N_("By Filename"), NULL, 
-	  N_("Removes duplicate entries from the playlist by filename."),
-	  G_CALLBACK(action_remove_dupes_by_filename) },
-
-	{ "remove by full path", AUD_STOCK_REMOVEDUPS , N_("By Path + Filename"), NULL, 
-	  N_("Removes duplicate entries from the playlist by their full path."),
-	  G_CALLBACK(action_remove_dupes_by_full_path) },
-
-	{ "remove all", GTK_STOCK_CLEAR, N_("Remove All"), NULL, 
-	  N_("Removes all entries from the playlist."),
-	  G_CALLBACK(action_remove_all) },
-
-	{ "remove unselected", GTK_STOCK_REMOVE, N_("Remove Unselected"), NULL,
-	  N_("Remove unselected entries from the playlist."),
-	  G_CALLBACK(action_remove_unselected) },
-
-	{ "remove selected", GTK_STOCK_REMOVE, N_("Remove Selected"), "Delete", 
-	  N_("Remove selected entries from the playlist."),
-	  G_CALLBACK(action_remove_selected) },
-
-	/* **************** add menu **************** */
-
-	{ "add cd", GTK_STOCK_CDROM, N_("Add CD..."), "<Shift>C",
-	  N_("Adds a CD to the playlist."),
-	  G_CALLBACK(action_add_cd) },
-
-	{ "add url", GTK_STOCK_NETWORK, N_("Add Internet Address..."), "<Ctrl>H",
-	  N_("Adds a remote track to the playlist."),
-	  G_CALLBACK(action_add_url) },
-
-	{ "add files", GTK_STOCK_ADD, N_("Add Files..."), "F",
-	  N_("Adds files to the playlist."),
-	  G_CALLBACK(action_add_files) },
-
-	/* **************** sort menu **************** */
-
-	{ "randomize list", AUD_STOCK_RANDOMIZEPL , N_("Randomize List"), "<Ctrl><Shift>R",
-	  N_("Randomizes the playlist."),
-	  G_CALLBACK(action_randomize_list) },
-
-	{ "reverse list", AUD_STOCK_INVERTPL , N_("Reverse List"), NULL,
-	  N_("Reverses the playlist."),
-	  G_CALLBACK(action_reverse_list) },
-
-	{ "sort menu", AUD_STOCK_SORTBYTITLE , N_("Sort List") },
-
-	{ "sort by title", AUD_STOCK_SORTBYTITLE , N_("By Title"), NULL,
-	  N_("Sorts the list by title."),
-	  G_CALLBACK(action_sort_by_title) },
-
-	{ "sort by artist", AUD_STOCK_SORTBYARTIST , N_("By Artist"), NULL,
-	  N_("Sorts the list by artist."),
-	  G_CALLBACK(action_sort_by_artist) },
-
-	{ "sort by filename", AUD_STOCK_SORTBYFILENAME , N_("By Filename"), NULL,
-	  N_("Sorts the list by filename."),
-	  G_CALLBACK(action_sort_by_filename) },
-
-	{ "sort by full path", AUD_STOCK_SORTBYPATHFILE , N_("By Path + Filename"), NULL,
-	  N_("Sorts the list by full pathname."),
-	  G_CALLBACK(action_sort_by_full_path) },
-
-	{ "sort by date", AUD_STOCK_SORTBYARTIST , N_("By Date"), NULL,
-	  N_("Sorts the list by modification time."),
-	  G_CALLBACK(action_sort_by_date) },
-
-	{ "sort by track number", AUD_STOCK_SORTBYFILENAME , N_("By Track Number"), NULL,
-	  N_("Sorts the list by track number."),
-	  G_CALLBACK(action_sort_by_track_number) },
-
-	{ "sort by playlist entry", AUD_STOCK_SORTBYPATHFILE , N_("By Playlist Entry"), NULL,
-	  N_("Sorts the list by playlist entry."),
-	  G_CALLBACK(action_sort_by_playlist_entry) },
-
-	{ "sort selected menu", AUD_STOCK_SORTBYTITLE , N_("Sort Selected") },
-
-	{ "sort selected by title", AUD_STOCK_SORTBYTITLE , N_("By Title"), NULL,
-	  N_("Sorts the list by title."),
-	  G_CALLBACK(action_sort_selected_by_title) },
-
-	{ "sort selected by artist", AUD_STOCK_SORTBYARTIST, N_("By Artist"), NULL,
-	  N_("Sorts the list by artist."),
-	  G_CALLBACK(action_sort_selected_by_artist) },
-
-	{ "sort selected by filename", AUD_STOCK_SORTBYFILENAME , N_("By Filename"), NULL,
-	  N_("Sorts the list by filename."),
-	  G_CALLBACK(action_sort_selected_by_filename) },
-
-	{ "sort selected by full path", AUD_STOCK_SORTBYPATHFILE , N_("By Path + Filename"), NULL,
-	  N_("Sorts the list by full pathname."),
-	  G_CALLBACK(action_sort_selected_by_full_path) },
-
-	{ "sort selected by date", AUD_STOCK_SORTBYARTIST , N_("By Date"), NULL,
-	  N_("Sorts the list by modification time."),
-	  G_CALLBACK(action_sort_selected_by_date) },
-
-	{ "sort selected by track number", AUD_STOCK_SORTBYFILENAME , N_("By Track Number"), NULL,
-	  N_("Sorts the list by track number."),
-	  G_CALLBACK(action_sort_selected_by_track_number) },
-
-	{ "sort selected by playlist entry", AUD_STOCK_SORTBYPATHFILE, N_("By Playlist Entry"), NULL,
-	  N_("Sorts the list by playlist entry."),
-	  G_CALLBACK(action_sort_selected_by_playlist_entry) },
-
-	/* stuff used in rightclick menu, but not yet covered */
-
-	{ "view track info", AUD_STOCK_INFO , N_("View Track Details"), "<Alt>I",
-	  N_("Displays track information."),
-	  G_CALLBACK(action_view_track_info) },
-
-	{ "queue toggle", AUD_STOCK_QUEUETOGGLE , N_("Queue Toggle"), "Q", 
-	  N_("Enables/disables the entry in the playlist's queue."),
-	  G_CALLBACK(action_queue_toggle) },
-};
-
-static GtkWidget *pladd_menu, *pldel_menu, *plsel_menu, *plsort_menu, *pllist_menu;
-static GtkWidget *playlistwin_popup_menu;
+GtkWidget *pladd_menu, *pldel_menu, *plsel_menu, *plsort_menu, *pllist_menu;
+GtkWidget *playlistwin_popup_menu;
 
 static void playlistwin_draw_frame(void);
 
@@ -622,7 +401,7 @@
 playlistwin_set_shade_menu(gboolean shaded)
 {
     GtkAction *action = gtk_action_group_get_action(
-      mainwin_toggleaction_group_others , "roll up playlist editor" );
+      toggleaction_group_others , "roll up playlist editor" );
     gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(action) , shaded );
 
     playlistwin_set_shade(shaded);
@@ -2023,61 +1802,11 @@
     playlistwin_set_mask();
 }
 
-static GtkWidget *
-ui_manager_get_popup(GtkUIManager * self, const gchar * path)
-{
-    GtkWidget *menu_item;
-
-    menu_item = gtk_ui_manager_get_widget(self, path);
-
-    if (GTK_IS_MENU_ITEM(menu_item))
-        return gtk_menu_item_get_submenu(GTK_MENU_ITEM(menu_item));
-    else
-        return NULL;
-}
-
-void
-playlistwin_create_popup_menus(void)
-{
-    GtkUIManager *ui_manager;
-    GtkActionGroup *action_group;
-    GError *error = NULL;
-
-    action_group = gtk_action_group_new("playlistwin");
-    gtk_action_group_set_translation_domain(action_group, PACKAGE_NAME);
-    gtk_action_group_add_actions(action_group, playlistwin_actions,
-				 G_N_ELEMENTS(playlistwin_actions), NULL);
-
-    ui_manager = gtk_ui_manager_new();
-    gtk_ui_manager_add_ui_from_file(ui_manager, DATA_DIR "/ui/playlist.ui", &error);
-
-    if (error)
-    {
-        g_critical("Error creating UI<ui/playlist.ui>: %s", error->message);
-	return;
-    }
-
-    gtk_ui_manager_insert_action_group(ui_manager, action_group, 0);
-
-    /* playlist window popup menu */
-    playlistwin_popup_menu = ui_manager_get_popup(ui_manager, "/playlist-menus/playlist-rightclick-menu");
-
-    pladd_menu  = ui_manager_get_popup(ui_manager, "/playlist-menus/add-menu");
-    pldel_menu  = ui_manager_get_popup(ui_manager, "/playlist-menus/del-menu");
-    plsel_menu  = ui_manager_get_popup(ui_manager, "/playlist-menus/select-menu");
-    plsort_menu = ui_manager_get_popup(ui_manager, "/playlist-menus/misc-menu");
-    pllist_menu = ui_manager_get_popup(ui_manager, "/playlist-menus/playlist-menu");
-
-    gtk_window_add_accel_group(GTK_WINDOW(playlistwin),
-			       gtk_ui_manager_get_accel_group(ui_manager));
-}
-
 void
 playlistwin_create(void)
 {
     Playlist *playlist;
     playlistwin_create_window();
-    playlistwin_create_popup_menus();
 
     /* create GC and back pixmap for custom widget to draw on */
     playlistwin_gc = gdk_gc_new(playlistwin->window);
@@ -2097,7 +1826,7 @@
 playlistwin_show(void)
 {
     GtkAction *action = gtk_action_group_get_action(
-      mainwin_toggleaction_group_others , "show playlist editor" );
+      toggleaction_group_others , "show playlist editor" );
     gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(action) , TRUE );
 
     tbutton_set_toggled(mainwin_pl, TRUE);
@@ -2113,7 +1842,7 @@
 playlistwin_hide(void)
 {
     GtkAction *action = gtk_action_group_get_action(
-      mainwin_toggleaction_group_others , "show playlist editor" );
+      toggleaction_group_others , "show playlist editor" );
     gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(action) , FALSE );
 
     gtk_widget_hide(playlistwin);
@@ -2124,17 +1853,17 @@
     gtk_widget_grab_focus(mainwin);
 }
 
-static void action_view_track_info(void)
+void action_view_track_info(void)
 {
     playlistwin_fileinfo();
 }
 
-static void action_queue_toggle(void)
+void action_queue_toggle(void)
 {
     playlist_queue(playlist_get_active());
 }
 
-static void action_sort_by_playlist_entry(void)
+void action_sort_by_playlist_entry(void)
 {
     Playlist *playlist = playlist_get_active();
 
@@ -2142,7 +1871,7 @@
     playlistwin_update_list(playlist);
 }
 
-static void action_sort_by_track_number(void)
+void action_sort_by_track_number(void)
 {
     Playlist *playlist = playlist_get_active();
 
@@ -2150,7 +1879,7 @@
     playlistwin_update_list(playlist);
 }
 
-static void action_sort_by_title(void)
+void action_sort_by_title(void)
 {
     Playlist *playlist = playlist_get_active();
 
@@ -2158,7 +1887,7 @@
     playlistwin_update_list(playlist);
 }
 
-static void action_sort_by_artist(void)
+void action_sort_by_artist(void)
 {
     Playlist *playlist = playlist_get_active();
 
@@ -2166,7 +1895,7 @@
     playlistwin_update_list(playlist);
 }
 
-static void action_sort_by_full_path(void)
+void action_sort_by_full_path(void)
 {
     Playlist *playlist = playlist_get_active();
 
@@ -2174,7 +1903,7 @@
     playlistwin_update_list(playlist);
 }
 
-static void action_sort_by_date(void)
+void action_sort_by_date(void)
 {
     Playlist *playlist = playlist_get_active();
 
@@ -2182,7 +1911,7 @@
     playlistwin_update_list(playlist);
 }
 
-static void action_sort_by_filename(void)
+void action_sort_by_filename(void)
 {
     Playlist *playlist = playlist_get_active();
 
@@ -2190,7 +1919,7 @@
     playlistwin_update_list(playlist);
 }
 
-static void action_sort_selected_by_playlist_entry(void)
+void action_sort_selected_by_playlist_entry(void)
 {
     Playlist *playlist = playlist_get_active();
 
@@ -2198,7 +1927,7 @@
     playlistwin_update_list(playlist);
 }
 
-static void action_sort_selected_by_track_number(void)
+void action_sort_selected_by_track_number(void)
 {
     Playlist *playlist = playlist_get_active();
 
@@ -2206,7 +1935,7 @@
     playlistwin_update_list(playlist);
 }
 
-static void action_sort_selected_by_title(void)
+void action_sort_selected_by_title(void)
 {
     Playlist *playlist = playlist_get_active();
 
@@ -2214,7 +1943,7 @@
     playlistwin_update_list(playlist);
 }
 
-static void action_sort_selected_by_artist(void)
+void action_sort_selected_by_artist(void)
 {
     Playlist *playlist = playlist_get_active();
 
@@ -2222,7 +1951,7 @@
     playlistwin_update_list(playlist);
 }
 
-static void action_sort_selected_by_full_path(void)
+void action_sort_selected_by_full_path(void)
 {
     Playlist *playlist = playlist_get_active();
 
@@ -2230,7 +1959,7 @@
     playlistwin_update_list(playlist);
 }
 
-static void action_sort_selected_by_date(void)
+void action_sort_selected_by_date(void)
 {
     Playlist *playlist = playlist_get_active();
 
@@ -2238,7 +1967,7 @@
     playlistwin_update_list(playlist);
 }
 
-static void action_sort_selected_by_filename(void)
+void action_sort_selected_by_filename(void)
 {
     Playlist *playlist = playlist_get_active();
 
@@ -2246,7 +1975,7 @@
     playlistwin_update_list(playlist);
 }
 
-static void action_randomize_list(void)
+void action_randomize_list(void)
 {
     Playlist *playlist = playlist_get_active();
 
@@ -2254,7 +1983,7 @@
     playlistwin_update_list(playlist);
 }
 
-static void action_reverse_list(void)
+void action_reverse_list(void)
 {
     Playlist *playlist = playlist_get_active();
 
@@ -2262,37 +1991,37 @@
     playlistwin_update_list(playlist);
 }
 
-static void
+void
 action_clear_queue(void)
 {
     playlist_clear_queue(playlist_get_active());
 }
 
-static void
+void
 action_remove_unavailable(void)
 {
     playlist_remove_dead_files(playlist_get_active());
 }
 
-static void
+void
 action_remove_dupes_by_title(void)
 {
     playlist_remove_duplicates(playlist_get_active(), PLAYLIST_DUPS_TITLE);
 }
 
-static void
+void
 action_remove_dupes_by_filename(void)
 {
     playlist_remove_duplicates(playlist_get_active(), PLAYLIST_DUPS_FILENAME);
 }
 
-static void
+void
 action_remove_dupes_by_full_path(void)
 {
     playlist_remove_duplicates(playlist_get_active(), PLAYLIST_DUPS_PATH);
 }
 
-static void
+void
 action_remove_all(void)
 {
     playlist_clear(playlist_get_active());
@@ -2302,19 +2031,19 @@
     mainwin_set_info_text();
 }
 
-static void
+void
 action_remove_selected(void)
 {
     playlist_delete(playlist_get_active(), FALSE);
 }
 
-static void
+void
 action_remove_unselected(void)
 {
     playlist_delete(playlist_get_active(), TRUE);
 }
 
-static void
+void
 action_add_files(void)
 {
     util_run_filebrowser(NO_PLAY_BUTTON);
@@ -2322,19 +2051,19 @@
 
 void add_medium(void); /* XXX */
 
-static void
+void
 action_add_cd(void)
 {
     add_medium();
 }
 
-static void
+void
 action_add_url(void)
 {
     mainwin_show_add_url_window();
 }
 
-static void
+void
 action_new_list(void)
 {
     Playlist *playlist = playlist_get_active();
@@ -2345,7 +2074,7 @@
     mainwin_set_info_text();
 }
 
-static void
+void
 action_save_list(void)
 {
     Playlist *playlist = playlist_get_active();
@@ -2353,7 +2082,7 @@
     playlistwin_select_playlist_to_save(playlist_get_current_name(playlist));
 }
 
-static void
+void
 action_save_default_list(void)
 {
     Playlist *playlist = playlist_get_active();
@@ -2361,7 +2090,7 @@
     playlist_save(playlist, bmp_paths[BMP_PATH_PLAYLIST_FILE]);
 }
 
-static void
+void
 action_load_list(void)
 {
     Playlist *playlist = playlist_get_active();
@@ -2369,7 +2098,7 @@
     playlistwin_select_playlist_to_load(playlist_get_current_name(playlist));
 }
 
-static void
+void
 action_refresh_list(void)
 {
     Playlist *playlist = playlist_get_active();
@@ -2378,31 +2107,31 @@
     playlistwin_update_list(playlist);
 }
 
-static void
+void
 action_open_list_manager(void)
 {
     playlist_manager_ui_show();
 }
 
-static void
+void
 action_search_and_select(void)
 {
     playlistwin_select_search();
 }
 
-static void
+void
 action_invert_selection(void)
 {
     playlistwin_inverse_selection();
 }
 
-static void
+void
 action_select_none(void)
 {
     playlistwin_select_none();
 }
 
-static void
+void
 action_select_all(void)
 {
     playlistwin_select_all();
@@ -2410,7 +2139,7 @@
 
 /* playlistwin_select_search callback functions
    placed here to avoid making the code messier :) */
-static void
+void
 playlistwin_select_search_cbt_cb( GtkWidget *called_cbt , gpointer other_cbt )
 {
     if ( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(called_cbt) ) == TRUE )
--- a/audacious/ui_playlist.h	Tue Jan 02 22:23:09 2007 -0800
+++ b/audacious/ui_playlist.h	Wed Jan 03 01:25:18 2007 -0800
@@ -77,4 +77,7 @@
 
 extern gboolean playlistwin_focus;
 
+extern GtkWidget *pladd_menu, *pldel_menu, *plsel_menu, *plsort_menu, *pllist_menu;
+extern GtkWidget *playlistwin_popup_menu;
+
 #endif