commit c8ace043040f52da4fcf152c93d437251781fc14
Author: phantomjinx <p.g.richard...@phantomjinx.co.uk>
Date:   Sat Feb 11 09:13:01 2012 +0000

    Plugin for attaching use of an external player
    
    * Allow the user to plug in their own player to play tracks
    
    * xmms added back as the default preference

 .gitignore                                        |    2 +
 configure.ac                                      |    1 +
 libgtkpod/tools.c                                 |  113 +++++++++------
 libgtkpod/tools.h                                 |    2 +
 plugins/Makefile.am                               |    3 +-
 plugins/external_player/Makefile.am               |   45 ++++++
 plugins/external_player/external_player.c         |   89 ++++++++++++
 plugins/external_player/external_player.h         |   38 +++++
 plugins/external_player/external_player.plugin.in |    4 +
 plugins/external_player/external_player.ui        |    7 +
 plugins/external_player/external_player.xml       |  109 ++++++++++++++
 plugins/external_player/plugin.c                  |  161 +++++++++++++++++++++
 plugins/external_player/plugin.h                  |   60 ++++++++
 13 files changed, 588 insertions(+), 46 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index 69a4aa7..751fbc0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -95,6 +95,7 @@ version
 /data/glade/mserv.xml
 /data/glade/clarity.xml
 /data/glade/sjcd.xml
+/data/glade/external_player.xml
 
 /data/ui/details_editor.ui
 /data/ui/coverweb.ui
@@ -111,6 +112,7 @@ version
 /data/ui/mserv.ui
 /data/ui/clarity.ui
 /data/ui/sjcd.ui
+/data/ui/external_player.ui
 
 /data/rhythmbox.gep
 
diff --git a/configure.ac b/configure.ac
index b8ddc3f..5aeade4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -637,6 +637,7 @@ plugins/sjcd/icons/hicolor/48x48/Makefile
 plugins/sjcd/icons/hicolor/48x48/places/Makefile
 plugins/sjcd/icons/hicolor/scalable/Makefile
 plugins/sjcd/icons/hicolor/scalable/places/Makefile
+plugins/external_player/Makefile
 ])
 AC_OUTPUT
 
diff --git a/libgtkpod/tools.c b/libgtkpod/tools.c
index ae90ad8..6847444 100644
--- a/libgtkpod/tools.c
+++ b/libgtkpod/tools.c
@@ -76,17 +76,18 @@ static gboolean mutex_data = FALSE;
  *
  * Command may include options, like "mp3gain -q -k %s"
  *
- * %s is replaced by @track_path if present, otherwise @track_path is
+ * %s is replaced by @selected_tracks if present, otherwise @selected_tracks 
are
  * added at the end.
  *
  * Return value: TRUE if the command ran successfully, FALSE if any
  * error occurred.
  */
-static gboolean run_exec_on_track(const gchar *commandline, const gchar 
*track_path, GError **error) {
+gboolean run_exec_on_tracks(const gchar *commandline, GList *selected_tracks, 
GError **error) {
     gchar *command_full_path = NULL;
     gchar *command = NULL;
     gchar *command_base = NULL;
     gchar *buf;
+    GList *tks;
     const gchar *nextarg;
     gboolean success = FALSE;
     gboolean percs = FALSE;
@@ -95,8 +96,8 @@ static gboolean run_exec_on_track(const gchar *commandline, 
const gchar *track_p
     int status, fdnull, ret;
     pid_t tpid;
 
-    g_return_val_if_fail (commandline, FALSE);
-    g_return_val_if_fail (track_path, FALSE);
+    g_return_val_if_fail(commandline, FALSE);
+    g_return_val_if_fail(selected_tracks, FALSE);
 
     /* skip whitespace */
     while (g_ascii_isspace (*commandline))
@@ -113,7 +114,8 @@ static gboolean run_exec_on_track(const gchar *commandline, 
const gchar *track_p
     command_full_path = g_find_program_in_path(command);
 
     if (!command_full_path) {
-        buf = g_strdup_printf(_("Could not find '%s'.\nPlease specifiy the 
exact path in the Tools section of the preference dialog or install the program 
if it is not installed on your system.\n\n"), command);
+        buf =
+                g_strdup_printf(_("Could not find '%s'.\nPlease specifiy the 
exact path in the preference dialog or install the program if it is not 
installed on your system.\n\n"), command);
         gtkpod_log_error(error, buf);
         g_free(buf);
         goto cleanup;
@@ -143,8 +145,16 @@ static gboolean run_exec_on_track(const gchar 
*commandline, const gchar *track_p
         if (!next)
             next = commandline + strlen(commandline);
 
-        if (strncmp(commandline, "%s", 2) == 0) { /* substitute %s with 
@track_path */
-            g_ptr_array_add(args, g_strdup(track_path));
+        if (strncmp(commandline, "%s", 2) == 0) { /* substitute %s with 
@selected_tracks */
+            for (tks = selected_tracks; tks; tks = tks->next) {
+                Track *tr = tks->data;
+                g_return_val_if_fail(tr, FALSE);
+                gchar *path;
+                path = get_file_name_from_source(tr, SOURCE_PREFER_LOCAL);
+                if (path) {
+                    g_ptr_array_add(args, path);
+                }
+            }
             percs = TRUE;
         }
         else {
@@ -159,9 +169,18 @@ static gboolean run_exec_on_track(const gchar 
*commandline, const gchar *track_p
             ++commandline;
     }
 
-    /* Add @track_path if "%s" was not present */
-    if (!percs)
-        g_ptr_array_add(args, g_strdup(track_path));
+    /* Add @selected_tracks if "%s" was not present */
+    if (!percs) {
+        for (tks = selected_tracks; tks; tks = tks->next) {
+            Track *tr = tks->data;
+            g_return_val_if_fail(tr, FALSE);
+            gchar *path;
+            path = get_file_name_from_source(tr, SOURCE_PREFER_LOCAL);
+            if (path) {
+                g_ptr_array_add(args, path);
+            }
+        }
+    }
 
     /* need NULL pointer */
     g_ptr_array_add(args, NULL);
@@ -190,10 +209,8 @@ static gboolean run_exec_on_track(const gchar 
*commandline, const gchar *track_p
     default: /* we are the parent, everything's fine */
         tpid = waitpid(tpid, &status, 0);
         g_ptr_array_free(args, TRUE);
-        if (
-        WIFEXITED(status))
-            ret =
-            WEXITSTATUS(status);
+        if (WIFEXITED(status))
+            ret = WEXITSTATUS(status);
         else
             ret = 2;
         if (ret > 1) {
@@ -214,13 +231,15 @@ static gboolean run_exec_on_track(const gchar 
*commandline, const gchar *track_p
     return success;
 }
 
+
+
 /* reread the soundcheck value from the file */
 static gboolean nm_get_soundcheck(Track *track, GError **error) {
     gchar *path, *buf;
     gchar *commandline = NULL;
     FileType *filetype;
 
-    g_return_val_if_fail (track, FALSE);
+    g_return_val_if_fail(track, FALSE);
 
     if (read_soundcheck(track, error))
         return TRUE;
@@ -241,8 +260,9 @@ static gboolean nm_get_soundcheck(Track *track, GError 
**error) {
 
     commandline = filetype_get_gain_cmd(filetype);
     if (commandline) {
-        if (run_exec_on_track(commandline, path, error)) {
-            g_free(path);
+        GList *tks = NULL;
+        tks = g_list_append(tks, track);
+        if (run_exec_on_tracks(commandline, tks, error)) {
             return read_soundcheck(track, error);
         }
     }
@@ -263,10 +283,10 @@ static gboolean nm_get_soundcheck(Track *track, GError 
**error) {
 static gpointer th_nm_get_soundcheck(gpointer data) {
     struct nm *nm = data;
     gboolean success = nm_get_soundcheck(nm->track, &(nm->error));
-    g_mutex_lock (mutex);
+    g_mutex_lock(mutex);
     mutex_data = TRUE; /* signal that thread will end */
-    g_cond_signal (cond);
-    g_mutex_unlock (mutex);
+    g_cond_signal(cond);
+    g_mutex_unlock(mutex);
     return GUINT_TO_POINTER(success);
 }
 #endif
@@ -276,11 +296,11 @@ void nm_new_tracks(iTunesDB *itdb) {
     GList *tracks = NULL;
     GList *gl;
 
-    g_return_if_fail (itdb);
+    g_return_if_fail(itdb);
 
     for (gl = itdb->tracks; gl; gl = gl->next) {
         Track *track = gl->data;
-        g_return_if_fail (track);
+        g_return_if_fail(track);
         if (!track->transferred) {
             tracks = g_list_append(tracks, track);
         }
@@ -292,19 +312,19 @@ void nm_new_tracks(iTunesDB *itdb) {
 static void nm_report_errors_and_free(GString *errors) {
     if (errors && errors->len > 0) {
         gtkpod_confirmation(-1, /* gint id, */
-                TRUE, /* gboolean modal, */
-                _("Normalization Errors"), /* title */
-                _("Errors created by track normalisation"), /* label */
-                errors->str, /* scrolled text */
-                NULL, 0, NULL, /* option 1 */
-                NULL, 0, NULL, /* option 2 */
-                TRUE, /* gboolean confirm_again, */
-                "show_normalization_errors",/* confirm_again_key,*/
-                CONF_NULL_HANDLER, /* ConfHandler ok_handler,*/
-                NULL, /* don't show "Apply" button */
-                NULL, /* cancel_handler,*/
-                NULL, /* gpointer user_data1,*/
-                NULL); /* gpointer user_data2,*/
+        TRUE, /* gboolean modal, */
+        _("Normalization Errors"), /* title */
+        _("Errors created by track normalisation"), /* label */
+        errors->str, /* scrolled text */
+        NULL, 0, NULL, /* option 1 */
+        NULL, 0, NULL, /* option 2 */
+        TRUE, /* gboolean confirm_again, */
+        "show_normalization_errors",/* confirm_again_key,*/
+        CONF_NULL_HANDLER, /* ConfHandler ok_handler,*/
+        NULL, /* don't show "Apply" button */
+        NULL, /* cancel_handler,*/
+        NULL, /* gpointer user_data1,*/
+        NULL); /* gpointer user_data2,*/
 
         g_string_free(errors, TRUE);
     }
@@ -362,7 +382,7 @@ void nm_tracks_list(GList *list) {
 
         thread = g_thread_create (th_nm_get_soundcheck, nm, TRUE, NULL);
         if (thread) {
-            g_mutex_lock (mutex);
+            g_mutex_lock(mutex);
             do {
                 while (widgets_blocked && gtk_events_pending())
                     gtk_main_iteration();
@@ -370,14 +390,14 @@ void nm_tracks_list(GList *list) {
 
                 g_get_current_time(&gtime);
                 g_time_val_add(&gtime, 20000);
-                g_cond_timed_wait (cond, mutex, &gtime);
+                g_cond_timed_wait(cond, mutex, &gtime);
             }
             while (!mutex_data);
             success = GPOINTER_TO_UINT(g_thread_join (thread));
-            g_mutex_unlock (mutex);
+            g_mutex_unlock(mutex);
         }
         else {
-            g_warning ("Thread creation failed, falling back to default.\n");
+            g_warning("Thread creation failed, falling back to default.\n");
             success = nm_get_soundcheck(nm->track, &(nm->error));
 
         }
@@ -390,10 +410,14 @@ void nm_tracks_list(GList *list) {
             gchar *path = get_file_name_from_source(nm->track, 
SOURCE_PREFER_LOCAL);
 
             if (nm->error) {
-                errors = g_string_append(errors, g_strdup_printf(_("'%s-%s' 
(%s) could not be normalized. %s\n"), nm->track->artist, nm->track->title, path 
? path : "", nm->error->message));
+                errors =
+                        g_string_append(errors, g_strdup_printf(_("'%s-%s' 
(%s) could not be normalized. %s\n"), nm->track->artist, nm->track->title,
+                                path ? path : "", nm->error->message));
             }
             else {
-                errors = g_string_append(errors, g_strdup_printf(_("'%s-%s' 
(%s) could not be normalized. Unknown error.\n"), nm->track->artist, 
nm->track->title, path ? path : ""));
+                errors =
+                        g_string_append(errors, g_strdup_printf(_("'%s-%s' 
(%s) could not be normalized. Unknown error.\n"), nm->track->artist, 
nm->track->title,
+                                path ? path : ""));
             }
 
             g_free(path);
@@ -437,9 +461,8 @@ void nm_tracks_list(GList *list) {
 
     nm_report_errors_and_free(errors);
 
-    gtkpod_statusbar_message (ngettext ("Normalized %d of %d tracks.",
-                                     "Normalized %d of %d tracks.", n),
-                           count, n);
+    gtkpod_statusbar_message(ngettext ("Normalized %d of %d tracks.",
+            "Normalized %d of %d tracks.", n), count, n);
 
     release_widgets();
 }
@@ -525,7 +548,7 @@ static gboolean tools_sync_script(iTunesDB *itdb, SyncType 
type) {
 
     /* remove leading and trailing whitespace */
     if (script)
-        g_strstrip (script);
+        g_strstrip(script);
 
     if (!script || (strlen(script) == 0)) {
         gtkpod_warning(_("Please specify the command to be called on the 
'Tools' section of the preferences dialog.\n"));
diff --git a/libgtkpod/tools.h b/libgtkpod/tools.h
index b46f192..cdd7c62 100644
--- a/libgtkpod/tools.h
+++ b/libgtkpod/tools.h
@@ -43,6 +43,8 @@
 
 #define TRACKVOLERROR G_MININT32
 
+gboolean run_exec_on_tracks(const gchar *commandline, GList *selected_tracks, 
GError **error);
+
 void nm_new_tracks (iTunesDB *itdb);
 void nm_tracks_list (GList *list);
 
diff --git a/plugins/Makefile.am b/plugins/Makefile.am
index 391f7a6..bd61c83 100644
--- a/plugins/Makefile.am
+++ b/plugins/Makefile.am
@@ -22,6 +22,7 @@ SUBDIRS = . \
        filetype_mp4 \
        filetype_m4a \
        clarity \
-       sjcd
+       sjcd \
+       external_player
 
 # indent
diff --git a/plugins/external_player/Makefile.am 
b/plugins/external_player/Makefile.am
new file mode 100644
index 0000000..ec7df07
--- /dev/null
+++ b/plugins/external_player/Makefile.am
@@ -0,0 +1,45 @@
+plugin_name = external_player
+plugin_file = $(plugin_name).plugin
+
+# Plugin UI file
+external_player_uidir = $(gtkpod_ui_dir)
+external_player_ui_DATA = $(plugin_name).ui
+
+# Plugin Glade file
+external_player_gladedir = $(gtkpod_glade_dir)
+external_player_glade_DATA =  $(plugin_name).xml
+
+# Plugin Icon file
+external_player_pixmapsdir = $(gtkpod_image_dir)
+external_player_pixmaps_DATA =
+
+# Where to install the plugin
+external_player_plugindir = $(gtkpod_plugin_dir)
+external_player_plugin_DATA =
+
+SUBDIRS =
+
+include ../plugins.mk
+external_player.plugin: build-plugin-file
+
+# The plugin
+plugin_lib = lib$(plugin_name).so
+plugin_LTLIBRARIES = libexternal_player.la
+
+# Plugin sources
+libexternal_player_la_SOURCES = plugin.c plugin.h \
+                                                           external_player.c 
external_player.h
+                                                        
+libexternal_player_la_LDFLAGS = $(GTKPOD_PLUGIN_LDFLAGS)
+
+# Plugin dependencies
+libexternal_player_la_LIBADD = \
+    $(GTKPOD_LIBS) \
+    $(LIBANJUTA_LIBS)
+
+EXTRA_DIST = \
+       $(plugin_file).in \
+       $(external_player_plugin_DATA) \
+       $(external_player_ui_DATA) \
+       $(external_player_glade_DATA) \
+       $(external_player_pixmaps_DATA)
diff --git a/plugins/external_player/external_player.c 
b/plugins/external_player/external_player.c
new file mode 100644
index 0000000..4e1b83e
--- /dev/null
+++ b/plugins/external_player/external_player.c
@@ -0,0 +1,89 @@
+/*
+ |
+ |  Copyright (C) 2002-2012 Paul Richardson <phantom_sf at 
users.sourceforge.net>
+ |  Part of the gtkpod project.
+ |
+ |  URL: http://gtkpod.sourceforge.net/
+ |
+ |  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ |
+ |  iTunes and iPod are trademarks of Apple
+ |
+ |  This product is not supported/written/published by Apple!
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "libgtkpod/directories.h"
+#include "libgtkpod/prefs.h"
+#include "libgtkpod/misc.h"
+#include "libgtkpod/tools.h"
+#include "plugin.h"
+#include "external_player.h"
+
+#define PLAY_NOW_PREF "path_play_now"
+
+/*
+ * play tracks with external player.
+ *
+ * @selected_tracks: list of tracks to be played
+ */
+void external_player_play_tracks(GList *tracks) {
+    GError *error = NULL;
+    gchar *cmd = prefs_get_string ("path_play_now");
+
+    run_exec_on_tracks(cmd, tracks, &error);
+
+    if (error) {
+        gtkpod_warning_simple(error->message);
+        g_error_free(error);
+    }
+
+    g_free(cmd);
+}
+
+GtkWidget *init_external_player_preferences() {
+    GtkBuilder *prefbuilder;
+    GtkWidget *w = NULL;
+    GtkWidget *notebook;
+    GtkWidget *play_entry;
+
+    gchar *glade_path = g_build_filename(get_glade_dir(), 
"external_player.xml", NULL);
+    prefbuilder = gtkpod_builder_xml_new(glade_path);
+    w = gtkpod_builder_xml_get_widget(prefbuilder, "prefs_window");
+    notebook = gtkpod_builder_xml_get_widget(prefbuilder, 
"external_player_notebook");
+    play_entry = gtkpod_builder_xml_get_widget(prefbuilder, 
"play_command_entry");
+    g_object_ref(notebook);
+    gtk_container_remove(GTK_CONTAINER(w), notebook);
+    gtk_widget_destroy(w);
+    g_free(glade_path);
+
+    gtk_entry_set_text(GTK_ENTRY(play_entry), prefs_get_string(PLAY_NOW_PREF));
+
+    gtk_builder_connect_signals(prefbuilder, NULL);
+    g_object_unref(prefbuilder);
+
+    return notebook;
+}
+
+/**
+ * Callback for play command entry in preference dialog
+ */
+G_MODULE_EXPORT void on_play_command_entry_changed (GtkEditable *sender, 
gpointer e) {
+    prefs_set_string (PLAY_NOW_PREF, gtk_entry_get_text (GTK_ENTRY (sender)));
+}
+
diff --git a/plugins/external_player/external_player.h 
b/plugins/external_player/external_player.h
new file mode 100644
index 0000000..9706e08
--- /dev/null
+++ b/plugins/external_player/external_player.h
@@ -0,0 +1,38 @@
+/*
+|
+|  Copyright (C) 2002-2012 Paul Richardson <phantom_sf at 
users.sourceforge.net>
+|  Part of the gtkpod project.
+|
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: oggfile.h 954 2007-01-16 09:45:00Z jcsjcs $
+*/
+
+#ifndef __EXTERNAL_PLAYER_H__
+#define __EXTERNAL_PLAYER_H__
+
+#include <gtk/gtk.h>
+
+void external_player_play_tracks(GList *tracks);
+
+GtkWidget *init_external_player_preferences();
+
+#endif
diff --git a/plugins/external_player/external_player.plugin.in 
b/plugins/external_player/external_player.plugin.in
new file mode 100644
index 0000000..4b0bc43
--- /dev/null
+++ b/plugins/external_player/external_player.plugin.in
@@ -0,0 +1,4 @@
+[Anjuta Plugin]
+Location=external_player:ExternalPlayerPlugin
+_Name=External Media Player Plugin
+_Description=Adds track command for playing tracks in external player, eg. xmms
diff --git a/plugins/external_player/external_player.ui 
b/plugins/external_player/external_player.ui
new file mode 100644
index 0000000..b141558
--- /dev/null
+++ b/plugins/external_player/external_player.ui
@@ -0,0 +1,7 @@
+<!--*- xml -*-->
+<ui>
+       <menubar name="MenuMain">
+       </menubar>
+       <toolbar name="ToolbarMain">
+       </toolbar>
+</ui>
diff --git a/plugins/external_player/external_player.xml 
b/plugins/external_player/external_player.xml
new file mode 100644
index 0000000..054c42b
--- /dev/null
+++ b/plugins/external_player/external_player.xml
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <requires lib="gtk+" version="2.16"/>
+  <object class="GtkWindow" id="prefs_window">
+    <property name="can_focus">False</property>
+    <child>
+      <object class="GtkNotebook" id="external_player_notebook">
+        <property name="visible">True</property>
+        <property name="can_focus">True</property>
+        <child>
+          <object class="GtkVBox" id="vbox5">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="border_width">12</property>
+            <property name="spacing">18</property>
+            <child>
+              <object class="GtkFrame" id="frame4">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label_xalign">0</property>
+                <property name="shadow_type">none</property>
+                <child>
+                  <object class="GtkAlignment" id="alignment14">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="top_padding">6</property>
+                    <property name="left_padding">12</property>
+                    <child>
+                      <object class="GtkVBox" id="vbox1">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="valign">start</property>
+                        <property name="spacing">10</property>
+                        <child>
+                          <object class="GtkBox" id="box1">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <child>
+                              <object class="GtkLabel" id="label1">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="label" 
translatable="yes">Command for 'play'</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">True</property>
+                                <property name="padding">5</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="play_command_entry">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <signal name="changed" 
handler="on_play_command_entry_changed" swapped="no"/>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="padding">5</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">True</property>
+                            <property name="fill">True</property>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+                <child type="label">
+                  <object class="GtkLabel" id="label7">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes">&lt;b&gt;Player 
Command&lt;/b&gt;</property>
+                    <property name="use_markup">True</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="tab_fill">False</property>
+          </packing>
+        </child>
+        <child type="tab">
+          <object class="GtkLabel" id="display_page_label">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label" translatable="yes">External Media 
Player</property>
+          </object>
+          <packing>
+            <property name="tab_fill">False</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </object>
+</interface>
diff --git a/plugins/external_player/plugin.c b/plugins/external_player/plugin.c
new file mode 100644
index 0000000..55c44fe
--- /dev/null
+++ b/plugins/external_player/plugin.c
@@ -0,0 +1,161 @@
+/*
+ |  Copyright (C) 2002-2012 Paul Richardson <phantom_sf at 
users.sourceforge.net>
+ |  Part of the gtkpod project.
+ |
+ |  URL: http://www.gtkpod.org/
+ |  URL: http://gtkpod.sourceforge.net/
+ |
+ |  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ |
+ |  iTunes and iPod are trademarks of Apple
+ |
+ |  This product is not supported/written/published by Apple!
+ |
+ |  $Id$
+ */
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <glib.h>
+#include <libanjuta/anjuta-utils.h>
+#include "libgtkpod/gtkpod_app_iface.h"
+#include "libgtkpod/prefs.h"
+#include <libanjuta/interfaces/ianjuta-preferences.h>
+#include "libgtkpod/directories.h"
+#include "plugin.h"
+#include "external_player.h"
+
+#define TAB_NAME "External Media Player"
+
+/* Parent class. Part of standard class definition */
+static gpointer parent_class;
+
+static GtkActionEntry external_player_actions[] =
+    { };
+
+static void set_default_preferences() {
+    if (! prefs_get_string_value("path_play_now", NULL))
+        prefs_set_string ("path_play_now", "xmms -e %s");
+
+    if (! prefs_get_int_value("path_play_enqueue", NULL))
+        prefs_set_string ("path_play_enqueue", "xmms -e %s");
+}
+
+static gboolean activate_plugin(AnjutaPlugin *plugin) {
+    AnjutaUI *ui;
+    ExternalPlayerPlugin *external_player_plugin;
+    GtkActionGroup* action_group;
+
+    /* Set preferences */
+    set_default_preferences();
+
+    external_player_plugin = (ExternalPlayerPlugin*) plugin;
+    ui = anjuta_shell_get_ui(plugin->shell, NULL);
+
+    /* Add our cover_actions */
+    action_group
+            = anjuta_ui_add_action_group_entries(ui, 
"ActionGroupExternalPlayer", _("External Player"), external_player_actions, 
G_N_ELEMENTS (external_player_actions), GETTEXT_PACKAGE, TRUE, plugin);
+    external_player_plugin->action_group = action_group;
+
+    /* Merge UI */
+    gchar *uipath = g_build_filename(get_ui_dir(), "external_player.ui", NULL);
+    external_player_plugin->uiid = anjuta_ui_merge(ui, uipath);
+    g_free(uipath);
+
+    gtkpod_register_track_command(TRACK_COMMAND(external_player_plugin));
+
+    return TRUE; /* FALSE if activation failed */
+}
+
+static gboolean deactivate_plugin(AnjutaPlugin *plugin) {
+    AnjutaUI *ui;
+    ExternalPlayerPlugin *external_player_plugin;
+
+    external_player_plugin = (ExternalPlayerPlugin*) plugin;
+    ui = anjuta_shell_get_ui(plugin->shell, NULL);
+
+    gtkpod_unregister_track_command(TRACK_COMMAND(external_player_plugin));
+
+    /* Unmerge UI */
+    anjuta_ui_unmerge(ui, external_player_plugin->uiid);
+
+    /* Remove Action groups */
+    anjuta_ui_remove_action_group(ui, external_player_plugin->action_group);
+
+    /* FALSE if plugin doesn't want to deactivate */
+    return TRUE;
+}
+
+static void external_player_plugin_instance_init(GObject *obj) {
+    ExternalPlayerPlugin *plugin = (ExternalPlayerPlugin*) obj;
+    plugin->uiid = 0;
+    plugin->action_group = NULL;
+    plugin->prefs = NULL;
+}
+
+static void external_player_plugin_class_init(GObjectClass *klass) {
+    AnjutaPluginClass *plugin_class = ANJUTA_PLUGIN_CLASS (klass);
+
+    parent_class = g_type_class_peek_parent(klass);
+
+    plugin_class->activate = activate_plugin;
+    plugin_class->deactivate = deactivate_plugin;
+}
+
+static void track_command_iface_init(TrackCommandInterface *iface) {
+    iface->id = "external_player_play_track_command";
+    iface->text = _("Play with preferred app...");
+    iface->execute = external_player_play_tracks;
+}
+
+static void ipreferences_merge(IAnjutaPreferences* ipref, AnjutaPreferences* 
prefs, GError** e) {
+    GdkPixbuf *pixbuf;
+    GdkPixbuf *scaled;
+
+    ExternalPlayerPlugin* plugin = EXTERNAL_PLAYER_PLUGIN(ipref);
+    plugin->prefs = init_external_player_preferences();
+    if (plugin->prefs == NULL)
+        return;
+
+    pixbuf = gtk_widget_render_icon_pixbuf(plugin->prefs, 
GTK_STOCK_MEDIA_PLAY, GTK_ICON_SIZE_LARGE_TOOLBAR);
+    if (!pixbuf) {
+        g_warning (N_("Couldn't load theme media player icon"));
+    }
+
+    scaled = gdk_pixbuf_scale_simple(pixbuf, 48, 48, GDK_INTERP_BILINEAR);
+
+    anjuta_preferences_dialog_add_page(ANJUTA_PREFERENCES_DIALOG 
(anjuta_preferences_get_dialog (prefs)), "gtkpod-external-player-settings", 
_(TAB_NAME), scaled, plugin->prefs);
+    g_object_unref(scaled);
+    g_object_unref(pixbuf);
+}
+
+static void ipreferences_unmerge(IAnjutaPreferences* ipref, AnjutaPreferences* 
prefs, GError** e) {
+    anjuta_preferences_remove_page(prefs, TAB_NAME);
+    ExternalPlayerPlugin* plugin = EXTERNAL_PLAYER_PLUGIN(ipref);
+    gtk_widget_destroy(plugin->prefs);
+}
+
+static void ipreferences_iface_init(IAnjutaPreferencesIface* iface) {
+    iface->merge = ipreferences_merge;
+    iface->unmerge = ipreferences_unmerge;
+}
+
+ANJUTA_PLUGIN_BEGIN (ExternalPlayerPlugin, external_player_plugin);
+ANJUTA_PLUGIN_ADD_INTERFACE(track_command, TRACK_COMMAND_TYPE);
+ANJUTA_PLUGIN_ADD_INTERFACE(ipreferences, IANJUTA_TYPE_PREFERENCES);
+ANJUTA_PLUGIN_END;
+
+ANJUTA_SIMPLE_PLUGIN (ExternalPlayerPlugin, external_player_plugin);
diff --git a/plugins/external_player/plugin.h b/plugins/external_player/plugin.h
new file mode 100644
index 0000000..da9a93a
--- /dev/null
+++ b/plugins/external_player/plugin.h
@@ -0,0 +1,60 @@
+/*
+|  Copyright (C) 2002-2012 Paul Richardson <phantom_sf at 
users.sourceforge.net>
+|  Part of the gtkpod project.
+|
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id$
+*/
+
+#ifndef PLUGIN_H_
+#define PLUGIN_H_
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <libanjuta/anjuta-plugin.h>
+
+extern GType external_player_plugin_get_type (GTypeModule *module);
+#define EXTERNAL_PLAYER_TYPE_PLUGIN         (external_player_plugin_get_type 
(NULL))
+#define EXTERNAL_PLAYER_PLUGIN(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), 
EXTERNAL_PLAYER_TYPE_PLUGIN, ExternalPlayerPlugin))
+#define EXTERNAL_PLAYER_PLUGIN_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST ((k), 
EXTERNAL_PLAYER_TYPE_PLUGIN, ExternalPlayerPluginClass))
+#define EXTERNAL_PLAYER_IS_PLUGIN(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), 
EXTERNAL_PLAYER_TYPE_PLUGIN))
+#define EXTERNAL_PLAYER_IS_PLUGIN_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), 
EXTERNAL_PLAYER_TYPE_PLUGIN))
+#define EXTERNAL_PLAYER_PLUGIN_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), 
EXTERNAL_PLAYER_TYPE_PLUGIN, ExternalPlayerPluginClass))
+
+typedef struct _ExternalPlayerPlugin ExternalPlayerPlugin;
+typedef struct _ExternalPlayerPluginClass ExternalPlayerPluginClass;
+
+struct _ExternalPlayerPlugin {
+    AnjutaPlugin parent;
+    gint uiid;
+    GtkActionGroup *action_group;
+    GtkWidget *prefs;
+};
+
+struct _ExternalPlayerPluginClass {
+    AnjutaPluginClass parent_class;
+};
+
+#endif /* PLUGIN_H_ */

------------------------------------------------------------------------------
Virtualization & Cloud Management Using Capacity Planning
Cloud computing makes use of virtualization - but cloud computing 
also focuses on allowing computing to be delivered as a service.
http://www.accelacomm.com/jaw/sfnl/114/51521223/
_______________________________________________
gtkpod-cvs2 mailing list
gtkpod-cvs2@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2

Reply via email to