[Goodies-commits] r6696 - in xfmpc/trunk: . src
Mike Massonnet
mmassonnet at xfce.org
Mon Feb 16 09:56:24 CET 2009
Author: mmassonnet
Date: 2009-02-16 08:56:24 +0000 (Mon, 16 Feb 2009)
New Revision: 6696
Added:
xfmpc/trunk/src/statusbar.c
xfmpc/trunk/src/statusbar.h
Modified:
xfmpc/trunk/ChangeLog
xfmpc/trunk/NEWS
xfmpc/trunk/src/Makefile.am
xfmpc/trunk/src/dbbrowser.c
xfmpc/trunk/src/dbbrowser.h
xfmpc/trunk/src/extended-interface.c
xfmpc/trunk/src/main.c
xfmpc/trunk/src/mpdclient.c
xfmpc/trunk/src/mpdclient.h
xfmpc/trunk/src/playlist.c
xfmpc/trunk/src/playlist.h
Log:
Features for the database browser and a statusbar contributed by Vincent Legout
* src/mpdclient.c, src/mpdclient.h:
- New functions xfmpc_mpdclient_playlist_get_length() and get_total_time()
- New function xfmpc_mpdclient_playlist_has_filename() to know if a
filename is already in the playlist
- (xfmpc_mpdclient_playlist_read): Takes a new argument **filename that
will be useful to browse the database from the playlist
- (cb_status_changed): The signal "song-changed" must not be emitted
when the playlist changed
* src/playlist.c, src/playlist.h:
- Use new function playlist_read from mpdclient
- (xfmpc_playlist_append): New argument filename
* src/dbbrowser.c, src/dbbrowser.h:
- New menu item Browse that is only displayed on a search and on a
single row selection to open the directory of the filename
- The rows are displayed in bold if they exist in the playlist
- (xfmpc_dbbrowser_append): New argument is_bold
- (cb_playlist_changed): New callback to refresh the rows in bold on
playlist changes
- (xfmpc_dbbrowser_add_selected_rows): Fix leak, list ended being NULL
thus it didn't freed anything
- (xfmpc_dbbrowser_reload): Fix a bug with i not being kept at -1
when last_wdir is found in the current directory
* src/statusbar.c, src/statusbar.h, src/main.c:
- New statusbar displayed in the main interface
Modified: xfmpc/trunk/ChangeLog
===================================================================
--- xfmpc/trunk/ChangeLog 2009-02-15 20:09:45 UTC (rev 6695)
+++ xfmpc/trunk/ChangeLog 2009-02-16 08:56:24 UTC (rev 6696)
@@ -1,3 +1,111 @@
+2009-02-16 Mike Massonnet <mmassonnet at gmail.com>
+
+Features for the database browser and a statusbar contributed by Vincent Legout
+ * src/mpdclient.c, src/mpdclient.h:
+ - New functions xfmpc_mpdclient_playlist_get_length() and get_total_time()
+ - New function xfmpc_mpdclient_playlist_has_filename() to know if a
+ filename is already in the playlist
+ - (xfmpc_mpdclient_playlist_read): Takes a new argument **filename that
+ will be useful to browse the database from the playlist
+ - (cb_status_changed): The signal "song-changed" must not be emitted
+ when the playlist changed
+ * src/playlist.c, src/playlist.h:
+ - Use new function playlist_read from mpdclient
+ - (xfmpc_playlist_append): New argument filename
+ * src/dbbrowser.c, src/dbbrowser.h:
+ - New menu item Browse that is only displayed on a search and on a
+ single row selection to open the directory of the filename
+ - The rows are displayed in bold if they exist in the playlist
+ - (xfmpc_dbbrowser_append): New argument is_bold
+ - (cb_playlist_changed): New callback to refresh the rows in bold on
+ playlist changes
+ - (xfmpc_dbbrowser_add_selected_rows): Fix leak, list ended being NULL
+ thus it didn't freed anything
+ - (xfmpc_dbbrowser_reload): Fix a bug with i not being kept at -1
+ when last_wdir is found in the current directory
+ * src/statusbar.c, src/statusbar.h, src/main.c:
+ - New statusbar displayed in the main interface
+
+2009-02-05 Mike Massonnet <mmassonnet at gmail.com>
+
+Small leak
+ * src/extended-interface.c, src/extended-interface.h:
+ - Move xfmpc_extended_interface_context_menu_new() to the C source and made
+ it a static function
+ - (xfmpc_server_dialog_show): Free the strings host and passwd
+ - (popup_context_menu): Don't destroy the menu to recreate it as it doesn't
+ make sense because it doesn't have any dynamic items
+ * IDEAS:
+ - A very small update
+
+2009-02-03 Mike Massonnet <mmassonnet at gmail.com>
+
+Rename Server Settings to MPD Settings and run make update-po
+ * src/extended-interface.c:
+ - Rename Server Settings to MPD Settings
+ * po/*.po, po/*.pot:
+ - Run make update-po
+
+2009-02-03 Mike Massonnet <mmassonnet at gmail.com>
+
+General cleanup
+ * configure.in.in:
+ - Move from AC_PROG_CC to AM_PROG_CC_C_O as suggested by the autotools output
+ to support multiple program rules
+ - Add call to AC_PROG_LIBTOOL as required by recent versions of libtool
+ * Makefile.am:
+ - Add distclean rule
+ * po/POTFILES.*:
+ - Clean up
+ * src/*.c, src/*.h:
+ - Store private pointer in class structure to avoid repeatitive and boring
+ calls via the GET_PRIVATE macro
+ - Copyright headers
+ - Merge the action entries
+ - Replace calls of g_signal_emit_by_name() against g_signal_emit()
+ * src/extended-interface.c:
+ - Drop the repeat and random pointers out from the private data structure
+
+2009-02-03 Mike Massonnet <mmassonnet at gmail.com>
+
+Fix weird condition in XfmpcMpdclient
+ * src/mpdclient.c(cb_xfmpc_mpdclient_status_changed):
+ - The signal "song-changed" must not be emitted when the database has been
+ updated
+
+2009-02-03 Mike Massonnet <mmassonnet at gmail.com>
+
+Add a graphical settings dialog for the MPD host contributed by Vincent Legout
+ * src/preferences.c(xfmpc_preferences_class_init):
+ - Install new class properties for the MPD host
+ * src/mpdclient.c:
+ - Use the XfmpcPreferences interface to fetch the host or the environment
+ variables when mpd-use-defaults is true
+ - Use the environment variables when
+ - Check the host before connecting for real
+ * src/extended-interface.c:
+ - Implement a dialog to set the MPD host
+ * src/interface.c(xfmpc_interface_init):
+ - Connect to "connected" signal to refresh the interface when connecting
+ manually to a new MPD host.
+ * src/main.c:
+ - Set a default window size to 330x330.
+ * autogen.sh:
+ - Fix the revision number from svn, enable debug, and delete configure.in
+
+2008-08-26 Mike Massonnet <mmassonnet at gmail.com>
+
+Add Replace to the right click menu in the database browser
+ * src/mpdclient.c(xfmpc_mpdclient_queue_clear):
+ - New function that removes all the songs from the playlist without
+ commiting to MPD
+ * src/mpdclient.c(xfmpc_mpdclient_playlist_read):
+ - Possibility to pass NULL to song and length
+ * src/dbbrowser.c(xfmpc_dbbrowser_replace_with_selected_rows):
+ - New function to replace the playlist with the selected rows
+ * src/dbbrowser.c(xfmpc_dbbrowser_init):
+ - Add Replace item in the right click menu
+
2008-08-25 Mike Massonnet <mmassonnet at gmail.com>
=== Release 0.0.7 ===
Modified: xfmpc/trunk/NEWS
===================================================================
--- xfmpc/trunk/NEWS 2009-02-15 20:09:45 UTC (rev 6695)
+++ xfmpc/trunk/NEWS 2009-02-16 08:56:24 UTC (rev 6696)
@@ -1,3 +1,12 @@
+ 0.0.8 (2009-0x-xx)
+
+- Graphical settings dialog for the MPD host
+- The database browser shows filenames already in the playlist in bold
+- A status bar with the number of songs and the total time of the playlist
+- Add a Replace item in the database browser context menu
+- Fix misc bugs
+- New translations: Swedish, Turkish, Portuguese, Czech, Basque, Italian
+
0.0.7 (2008-08-25)
- Add a search entry in the database browser
Modified: xfmpc/trunk/src/Makefile.am
===================================================================
--- xfmpc/trunk/src/Makefile.am 2009-02-15 20:09:45 UTC (rev 6695)
+++ xfmpc/trunk/src/Makefile.am 2009-02-16 08:56:24 UTC (rev 6696)
@@ -12,6 +12,8 @@
playlist.h \
dbbrowser.c \
dbbrowser.h \
+ statusbar.c \
+ statusbar.h \
preferences.c \
preferences.h \
mpdclient.c \
Modified: xfmpc/trunk/src/dbbrowser.c
===================================================================
--- xfmpc/trunk/src/dbbrowser.c 2009-02-15 20:09:45 UTC (rev 6695)
+++ xfmpc/trunk/src/dbbrowser.c 2009-02-16 08:56:24 UTC (rev 6696)
@@ -49,6 +49,7 @@
GdkEventButton *event);
static gboolean cb_popup_menu (XfmpcDbbrowser *dbbrowser);
static void popup_menu (XfmpcDbbrowser *dbbrowser);
+static void cb_browse (XfmpcDbbrowser *dbbrowser);
static void cb_search_entry_activated (XfmpcDbbrowser *dbbrowser);
static gboolean cb_search_entry_key_released (XfmpcDbbrowser *dbbrowser,
@@ -57,8 +58,10 @@
static gboolean timeout_search (XfmpcDbbrowser *dbbrowser);
static void timeout_search_destroy (XfmpcDbbrowser *dbbrowser);
+static void cb_playlist_changed (XfmpcDbbrowser *dbbrowser);
+
/* List store identifiers */
enum
{
@@ -67,6 +70,7 @@
COLUMN_FILENAME,
COLUMN_BASENAME,
COLUMN_IS_DIR,
+ COLUMN_WEIGHT,
N_COLUMNS,
};
@@ -92,6 +96,7 @@
GtkListStore *store;
GtkWidget *search_entry;
GtkWidget *menu;
+ GtkWidget *mi_browse;
guint search_timeout;
gboolean is_searching;
@@ -167,7 +172,8 @@
GDK_TYPE_PIXBUF,
G_TYPE_STRING,
G_TYPE_STRING,
- G_TYPE_BOOLEAN);
+ G_TYPE_BOOLEAN,
+ G_TYPE_INT);
/* === Tree view === */
priv->treeview = gtk_tree_view_new ();
@@ -194,6 +200,7 @@
gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (priv->treeview),
-1, "Filename", cell,
"text", COLUMN_BASENAME,
+ "weight", COLUMN_WEIGHT,
NULL);
/* Scrolled window */
@@ -219,6 +226,14 @@
GtkWidget *image = gtk_image_new_from_stock (GTK_STOCK_CUT, GTK_ICON_SIZE_MENU);
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mi), image);
+ /* Menu -> Browse (only shown on a search) */
+ mi = priv->mi_browse = gtk_image_menu_item_new_with_mnemonic (_("_Browse"));
+ gtk_menu_shell_append (GTK_MENU_SHELL (priv->menu), mi);
+ g_signal_connect_swapped (mi, "activate",
+ G_CALLBACK (cb_browse), dbbrowser);
+ image = gtk_image_new_from_stock (GTK_STOCK_OPEN, GTK_ICON_SIZE_MENU);
+ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mi), image);
+
gtk_widget_show_all (priv->menu);
/* === Search entry === */
@@ -234,6 +249,8 @@
G_CALLBACK (xfmpc_dbbrowser_reload), dbbrowser);
g_signal_connect_swapped (dbbrowser->mpdclient, "database-changed",
G_CALLBACK (xfmpc_dbbrowser_reload), dbbrowser);
+ g_signal_connect_swapped (dbbrowser->mpdclient, "playlist-changed",
+ G_CALLBACK (cb_playlist_changed), dbbrowser);
/* Tree view */
g_signal_connect_swapped (priv->treeview, "row-activated",
G_CALLBACK (cb_row_activated), dbbrowser);
@@ -292,7 +309,8 @@
xfmpc_dbbrowser_append (XfmpcDbbrowser *dbbrowser,
gchar *filename,
gchar *basename,
- gboolean is_dir)
+ gboolean is_dir,
+ gboolean is_bold)
{
XfmpcDbbrowserPrivate *priv = XFMPC_DBBROWSER (dbbrowser)->priv;
GdkPixbuf *pixbuf;
@@ -309,6 +327,7 @@
COLUMN_FILENAME, filename,
COLUMN_BASENAME, basename,
COLUMN_IS_DIR, is_dir,
+ COLUMN_WEIGHT, is_bold ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL,
-1);
}
@@ -318,14 +337,14 @@
XfmpcDbbrowserPrivate *priv = XFMPC_DBBROWSER (dbbrowser)->priv;
GtkTreeModel *store = GTK_TREE_MODEL (priv->store);
GtkTreeIter iter;
- GList *list;
+ GList *l, *list;
gchar *filename;
- list = gtk_tree_selection_get_selected_rows (gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->treeview)),
- &store);
- while (NULL != list)
+ list = gtk_tree_selection_get_selected_rows (gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->treeview)), &store);
+
+ for (l = list; l != NULL; l = l->next)
{
- if (gtk_tree_model_get_iter (store, &iter, list->data))
+ if (gtk_tree_model_get_iter (store, &iter, l->data))
{
gtk_tree_model_get (store, &iter,
COLUMN_FILENAME, &filename,
@@ -333,7 +352,6 @@
xfmpc_mpdclient_queue_add (dbbrowser->mpdclient, filename);
g_free (filename);
}
- list = g_list_next (list);
}
xfmpc_mpdclient_queue_commit (dbbrowser->mpdclient);
@@ -356,6 +374,7 @@
gchar *filename;
gchar *basename;
gboolean is_dir;
+ gboolean is_bold;
gint i = 0;
if (G_UNLIKELY (!xfmpc_mpdclient_is_connected (dbbrowser->mpdclient)))
@@ -368,7 +387,7 @@
if (!xfmpc_dbbrowser_wdir_is_root (dbbrowser))
{
filename = xfmpc_dbbrowser_get_parent_wdir (dbbrowser);
- xfmpc_dbbrowser_append (dbbrowser, filename, "..", TRUE);
+ xfmpc_dbbrowser_append (dbbrowser, filename, "..", TRUE, FALSE);
g_free (filename);
i++;
}
@@ -376,7 +395,8 @@
while (xfmpc_mpdclient_database_read (dbbrowser->mpdclient, priv->wdir,
&filename, &basename, &is_dir))
{
- xfmpc_dbbrowser_append (dbbrowser, filename, basename, is_dir);
+ is_bold = xfmpc_mpdclient_playlist_has_filename (dbbrowser->mpdclient, filename);
+ xfmpc_dbbrowser_append (dbbrowser, filename, basename, is_dir, is_bold);
if (i >= 0)
{
@@ -389,7 +409,8 @@
i = -1;
}
- i++;
+ else
+ i++;
}
g_free (filename);
@@ -404,6 +425,7 @@
XfmpcDbbrowserPrivate *priv = XFMPC_DBBROWSER (dbbrowser)->priv;
gchar *filename;
gchar *basename;
+ gboolean is_bold;
gint i = 0;
static gboolean no_result, no_result_buf;
GdkColor color = {0, 0xFFFF, 0x6666, 0x6666};
@@ -416,7 +438,8 @@
while (xfmpc_mpdclient_database_search (dbbrowser->mpdclient, query, &filename, &basename))
{
- xfmpc_dbbrowser_append (dbbrowser, filename, basename, FALSE);
+ is_bold = xfmpc_mpdclient_playlist_has_filename (dbbrowser->mpdclient, filename);
+ xfmpc_dbbrowser_append (dbbrowser, filename, basename, FALSE, is_bold);
g_free (filename);
g_free (basename);
i++;
@@ -599,6 +622,17 @@
popup_menu (XfmpcDbbrowser *dbbrowser)
{
XfmpcDbbrowserPrivate *priv = XFMPC_DBBROWSER (dbbrowser)->priv;
+ GtkTreeSelection *selection;
+ gint count;
+
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->treeview));
+ count = gtk_tree_selection_count_selected_rows (selection);
+
+ if (priv->is_searching && count == 1)
+ gtk_widget_show (priv->mi_browse);
+ else
+ gtk_widget_hide (priv->mi_browse);
+
gtk_menu_popup (GTK_MENU (priv->menu),
NULL, NULL,
NULL, NULL,
@@ -606,8 +640,39 @@
gtk_get_current_event_time ());
}
+static void
+cb_browse (XfmpcDbbrowser *dbbrowser)
+{
+ XfmpcDbbrowserPrivate *priv = XFMPC_DBBROWSER (dbbrowser)->priv;
+ GtkTreeSelection *selection;
+ GtkTreeModel *store = GTK_TREE_MODEL (priv->store);
+ GtkTreeIter iter;
+ GList *list;
+ gchar *dir, *filename;
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->treeview));
+ if (gtk_tree_selection_count_selected_rows (selection) > 1)
+ return;
+ list = gtk_tree_selection_get_selected_rows (selection, &store);
+ if (gtk_tree_model_get_iter (store, &iter, list->data))
+ {
+ gtk_tree_model_get (store, &iter,
+ COLUMN_FILENAME, &filename,
+ -1);
+
+ priv->is_searching = FALSE;
+ dir = g_path_get_dirname (filename);
+ xfmpc_dbbrowser_set_wdir (dbbrowser, dir);
+ xfmpc_dbbrowser_reload (dbbrowser);
+
+ g_free (filename);
+ g_free (dir);
+ }
+}
+
+
+
static void
cb_search_entry_activated (XfmpcDbbrowser *dbbrowser)
{
@@ -675,3 +740,33 @@
priv->search_timeout = 0;
}
+
+
+static void
+cb_playlist_changed (XfmpcDbbrowser *dbbrowser)
+{
+ XfmpcDbbrowserPrivate *priv = XFMPC_DBBROWSER (dbbrowser)->priv;
+ GtkTreeModel *store = GTK_TREE_MODEL (priv->store);
+ GtkTreeIter iter;
+ gchar *filename;
+ gboolean is_bold;
+
+ if (!gtk_tree_model_get_iter_first (store, &iter))
+ return;
+
+ do
+ {
+ gtk_tree_model_get (store, &iter,
+ COLUMN_FILENAME, &filename,
+ -1);
+
+ is_bold = xfmpc_mpdclient_playlist_has_filename (dbbrowser->mpdclient, filename);
+ gtk_list_store_set (GTK_LIST_STORE (store), &iter,
+ COLUMN_WEIGHT, is_bold ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL,
+ -1);
+
+ g_free (filename);
+ }
+ while (gtk_tree_model_iter_next (store, &iter));
+}
+
Modified: xfmpc/trunk/src/dbbrowser.h
===================================================================
--- xfmpc/trunk/src/dbbrowser.h 2009-02-15 20:09:45 UTC (rev 6695)
+++ xfmpc/trunk/src/dbbrowser.h 2009-02-16 08:56:24 UTC (rev 6696)
@@ -43,7 +43,8 @@
void xfmpc_dbbrowser_append (XfmpcDbbrowser *dbbrowser,
gchar *filename,
gchar *basename,
- gboolean is_dir);
+ gboolean is_dir,
+ gboolean is_bold);
void xfmpc_dbbrowser_add_selected_rows (XfmpcDbbrowser *dbbrowser);
void xfmpc_dbbrowser_replace_with_selected_rows (XfmpcDbbrowser *dbbrowser);
Modified: xfmpc/trunk/src/extended-interface.c
===================================================================
--- xfmpc/trunk/src/extended-interface.c 2009-02-15 20:09:45 UTC (rev 6695)
+++ xfmpc/trunk/src/extended-interface.c 2009-02-16 08:56:24 UTC (rev 6696)
@@ -57,8 +57,6 @@
(XfmpcExtendedInterface *extended_interface,
GtkWidget *attach_widget);
static void xfmpc_server_dialog_show (XfmpcExtendedInterface *extended_interface);
-static void cb_use_defaults_toggled (GtkToggleButton *button,
- GtkWidget *widget);
static void cb_interface_changed (GtkComboBox *widget,
XfmpcExtendedInterface *extended_interface);
@@ -74,6 +72,8 @@
gint *y,
gboolean *push_in,
GtkWidget *widget);
+static void cb_use_defaults_toggled (GtkToggleButton *button,
+ GtkWidget *widget);
Modified: xfmpc/trunk/src/main.c
===================================================================
--- xfmpc/trunk/src/main.c 2009-02-15 20:09:45 UTC (rev 6695)
+++ xfmpc/trunk/src/main.c 2009-02-16 08:56:24 UTC (rev 6696)
@@ -37,6 +37,7 @@
#include "main-ui.h"
#include "interface.h"
#include "extended-interface.h"
+#include "statusbar.h"
#define BORDER 4
@@ -102,17 +103,6 @@
gtk_window_set_default_icon_name ("xfmpc");
- /* Window */
- GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- gtk_window_set_icon_name (GTK_WINDOW (window), "stock_volume");
- gtk_window_set_title (GTK_WINDOW (window), _("Xfmpc"));
- gtk_window_set_default_size (GTK_WINDOW (window), 330, 330);
- g_signal_connect (G_OBJECT (window), "delete-event", G_CALLBACK (cb_window_closed), NULL);
- g_signal_connect (G_OBJECT (window), "window-state-event", G_CALLBACK (cb_window_state_event), NULL);
-
- GtkWidget *vbox = gtk_vbox_new (FALSE, 0);
- gtk_container_add (GTK_CONTAINER (window), vbox);
-
/* Read window preferences */
gint posx, posy;
gint width, height;
@@ -126,6 +116,18 @@
"last-window-height", &height,
"last-window-state-sticky", &sticky,
NULL);
+
+ /* Window */
+ GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_icon_name (GTK_WINDOW (window), "stock_volume");
+ gtk_window_set_title (GTK_WINDOW (window), _("Xfmpc"));
+ gtk_window_set_default_size (GTK_WINDOW (window), 330, 330);
+ g_signal_connect (G_OBJECT (window), "delete-event", G_CALLBACK (cb_window_closed), NULL);
+ g_signal_connect (G_OBJECT (window), "window-state-event", G_CALLBACK (cb_window_state_event), NULL);
+
+ GtkWidget *vbox = gtk_vbox_new (FALSE, 0);
+ gtk_container_add (GTK_CONTAINER (window), vbox);
+
if (G_LIKELY (posx != -1 && posy != -1))
gtk_window_move (GTK_WINDOW (window), posx, posy);
if (G_LIKELY (width != -1 && height != -1))
@@ -148,6 +150,10 @@
GtkWidget *extended_interface = xfmpc_extended_interface_new ();
gtk_box_pack_start (GTK_BOX (vbox), extended_interface, TRUE, TRUE, 0);
+ /* Statusbar */
+ GtkWidget *statusbar = xfmpc_statusbar_new ();
+ gtk_box_pack_start (GTK_BOX (vbox), statusbar, FALSE, FALSE, 2);
+
gtk_widget_show_all (window);
/* Accelerators */
Modified: xfmpc/trunk/src/mpdclient.c
===================================================================
--- xfmpc/trunk/src/mpdclient.c 2009-02-15 20:09:45 UTC (rev 6695)
+++ xfmpc/trunk/src/mpdclient.c 2009-02-16 08:56:24 UTC (rev 6696)
@@ -630,7 +630,7 @@
if (what & MPD_CST_PLAYLIST)
g_signal_emit (mpdclient, signals[SIG_PLAYLIST_CHANGED], 0);
- if (what & MPD_CST_SONGID && !(what & MPD_CST_DATABASE))
+ if (what & MPD_CST_SONGID && !(what & (MPD_CST_DATABASE|MPD_CST_PLAYLIST)))
g_signal_emit (mpdclient, signals[SIG_SONG_CHANGED], 0);
if (what & MPD_CST_STATE)
@@ -703,7 +703,7 @@
{
gint id;
- while (xfmpc_mpdclient_playlist_read (mpdclient, &id, NULL, NULL))
+ while (xfmpc_mpdclient_playlist_read (mpdclient, &id, NULL, NULL, NULL))
{
if (!xfmpc_mpdclient_queue_remove_id (mpdclient, id))
return FALSE;
@@ -717,6 +717,7 @@
gboolean
xfmpc_mpdclient_playlist_read (XfmpcMpdclient *mpdclient,
gint *id,
+ gchar **filename,
gchar **song,
gchar **length)
{
@@ -730,6 +731,8 @@
if (NULL != data)
{
+ if (NULL != filename)
+ *filename = g_strdup (data->song->file);
if (NULL != song)
*song = _get_formatted_name (data->song);
if (NULL != length)
@@ -751,7 +754,49 @@
return TRUE;
}
+gint
+xfmpc_mpdclient_playlist_get_length (XfmpcMpdclient *mpdclient)
+{
+ return mpd_playlist_get_playlist_length (mpdclient->priv->mi);
+}
+
+gint
+xfmpc_mpdclient_playlist_get_total_time (XfmpcMpdclient *mpdclient)
+{
+ XfmpcMpdclientPrivate *priv = mpdclient->priv;
+ MpdData *data;
+ gint seconds;
+
+ for (seconds = 0, data = mpd_playlist_get_changes (priv->mi, -1);
+ data != NULL; data = mpd_data_get_next (data))
+ seconds += data->song->time;
+
+ return seconds;
+}
+
gboolean
+xfmpc_mpdclient_playlist_has_filename (XfmpcMpdclient *mpdclient,
+ const gchar *filename)
+{
+ XfmpcMpdclientPrivate *priv = mpdclient->priv;
+ MpdData *data;
+
+ mpd_playlist_search_start (priv->mi, TRUE);
+ mpd_playlist_search_add_constraint (priv->mi, MPD_TAG_ITEM_FILENAME, filename);
+ data = mpd_playlist_search_commit (priv->mi);
+
+ if (data != NULL)
+ {
+ mpd_data_free (data);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+
+
+gboolean
xfmpc_mpdclient_database_refresh (XfmpcMpdclient *mpdclient)
{
XfmpcMpdclientPrivate *priv = XFMPC_MPDCLIENT (mpdclient)->priv;
Modified: xfmpc/trunk/src/mpdclient.h
===================================================================
--- xfmpc/trunk/src/mpdclient.h 2009-02-15 20:09:45 UTC (rev 6695)
+++ xfmpc/trunk/src/mpdclient.h 2009-02-16 08:56:24 UTC (rev 6696)
@@ -83,9 +83,14 @@
gboolean xfmpc_mpdclient_playlist_read (XfmpcMpdclient *mpdclient,
gint *id,
+ gchar **filename,
gchar **song,
gchar **length);
gboolean xfmpc_mpdclient_playlist_clear (XfmpcMpdclient *mpdclient);
+gint xfmpc_mpdclient_playlist_get_length (XfmpcMpdclient *mpdclient);
+gint xfmpc_mpdclient_playlist_get_total_time (XfmpcMpdclient *mpdclient);
+gboolean xfmpc_mpdclient_playlist_has_filename (XfmpcMpdclient *mpdclient,
+ const gchar *filename);
gboolean xfmpc_mpdclient_database_refresh (XfmpcMpdclient *mpdclient);
gboolean xfmpc_mpdclient_database_read (XfmpcMpdclient *mpdclient,
Modified: xfmpc/trunk/src/playlist.c
===================================================================
--- xfmpc/trunk/src/playlist.c 2009-02-15 20:09:45 UTC (rev 6695)
+++ xfmpc/trunk/src/playlist.c 2009-02-16 08:56:24 UTC (rev 6696)
@@ -66,6 +66,7 @@
enum
{
COLUMN_ID,
+ COLUMN_FILENAME,
COLUMN_SONG,
COLUMN_LENGTH,
COLUMN_WEIGHT,
@@ -165,6 +166,7 @@
G_TYPE_INT,
G_TYPE_STRING,
G_TYPE_STRING,
+ G_TYPE_STRING,
G_TYPE_INT);
/* === Filter === */
@@ -283,6 +285,7 @@
void
xfmpc_playlist_append (XfmpcPlaylist *playlist,
gint id,
+ gchar *filename,
gchar *song,
gchar *length)
{
@@ -292,6 +295,7 @@
gtk_list_store_append (priv->store, &iter);
gtk_list_store_set (priv->store, &iter,
COLUMN_ID, id,
+ COLUMN_FILENAME, filename,
COLUMN_SONG, song,
COLUMN_LENGTH, length,
COLUMN_WEIGHT, PANGO_WEIGHT_NORMAL,
@@ -389,15 +393,16 @@
cb_playlist_changed (XfmpcPlaylist *playlist)
{
XfmpcPlaylistPrivate *priv = XFMPC_PLAYLIST (playlist)->priv;
- gchar *song, *length;
+ gchar *filename, *song, *length;
gint id, current;
current = xfmpc_mpdclient_get_id (playlist->mpdclient);
xfmpc_playlist_clear (playlist);
- while (xfmpc_mpdclient_playlist_read (playlist->mpdclient, &id, &song, &length))
+ while (xfmpc_mpdclient_playlist_read (playlist->mpdclient, &id, &filename, &song, &length))
{
- xfmpc_playlist_append (playlist, id, song, length);
+ xfmpc_playlist_append (playlist, id, filename, song, length);
+ g_free (filename);
g_free (song);
g_free (length);
}
Modified: xfmpc/trunk/src/playlist.h
===================================================================
--- xfmpc/trunk/src/playlist.h 2009-02-15 20:09:45 UTC (rev 6695)
+++ xfmpc/trunk/src/playlist.h 2009-02-16 08:56:24 UTC (rev 6696)
@@ -41,6 +41,7 @@
void xfmpc_playlist_append (XfmpcPlaylist *playlist,
gint id,
+ gchar *filename,
gchar *song,
gchar *length);
void xfmpc_playlist_clear (XfmpcPlaylist *playlist);
Added: xfmpc/trunk/src/statusbar.c
===================================================================
--- xfmpc/trunk/src/statusbar.c (rev 0)
+++ xfmpc/trunk/src/statusbar.c 2009-02-16 08:56:24 UTC (rev 6696)
@@ -0,0 +1,202 @@
+/*
+ * Copyright (c) 2009 Vincent Legout <vincent at legout.info>
+ * Copyright (c) 2009 Mike Massonnet <mmassonnet at xfce.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+
+#include "statusbar.h"
+#include "mpdclient.h"
+
+#define GET_PRIVATE(o) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((o), XFMPC_TYPE_STATUSBAR, XfmpcStatusbarPrivate))
+
+
+
+static void xfmpc_statusbar_class_init (XfmpcStatusbarClass *klass);
+static void xfmpc_statusbar_init (XfmpcStatusbar *statusbar);
+static void xfmpc_statusbar_finalize (GObject *object);
+static void xfmpc_statusbar_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec);
+
+static void cb_playlist_changed (XfmpcStatusbar *statusbar);
+
+
+
+enum
+{
+ TEXT = 1,
+};
+
+
+
+struct _XfmpcStatusbarClass
+{
+ GtkStatusbarClass parent;
+};
+
+struct _XfmpcStatusbar
+{
+ GtkStatusbar parent;
+ XfmpcMpdclient *mpdclient;
+ /*<private>*/
+ XfmpcStatusbarPrivate *priv;
+};
+
+struct _XfmpcStatusbarPrivate
+{
+ guint context_id;
+};
+
+
+
+static GObjectClass *parent_class = NULL;
+
+
+
+GType
+xfmpc_statusbar_get_type (void)
+{
+ static GType xfmpc_statusbar_type = G_TYPE_INVALID;
+
+ if (G_UNLIKELY (xfmpc_statusbar_type == G_TYPE_INVALID))
+ {
+ static const GTypeInfo xfmpc_statusbar_info =
+ {
+ sizeof (XfmpcStatusbarClass),
+ NULL,
+ NULL,
+ (GClassInitFunc) xfmpc_statusbar_class_init,
+ NULL,
+ NULL,
+ sizeof (XfmpcStatusbar),
+ 0,
+ (GInstanceInitFunc) xfmpc_statusbar_init,
+ NULL,
+ };
+
+ xfmpc_statusbar_type = g_type_register_static (GTK_TYPE_STATUSBAR, "XfmpcStatusbar", &xfmpc_statusbar_info, 0);
+ }
+
+ return xfmpc_statusbar_type;
+}
+
+static void
+xfmpc_statusbar_class_init (XfmpcStatusbarClass *klass)
+{
+ GObjectClass *gobject_class;
+
+ g_type_class_add_private (klass, sizeof (XfmpcStatusbarPrivate));
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ gobject_class = G_OBJECT_CLASS (klass);
+ gobject_class->finalize = xfmpc_statusbar_finalize;
+ gobject_class->set_property = xfmpc_statusbar_set_property;
+
+ g_object_class_install_property (gobject_class,
+ TEXT,
+ g_param_spec_string ("text",
+ "Text",
+ "Text in the statusbar",
+ NULL,
+ G_PARAM_WRITABLE));
+}
+
+static void
+xfmpc_statusbar_init (XfmpcStatusbar *statusbar)
+{
+ XfmpcStatusbarPrivate *priv = statusbar->priv = GET_PRIVATE (statusbar);
+
+ statusbar->mpdclient = xfmpc_mpdclient_get ();
+
+ priv->context_id = gtk_statusbar_get_context_id (GTK_STATUSBAR (statusbar), "Main text");
+ gtk_statusbar_set_has_resize_grip (GTK_STATUSBAR (statusbar), FALSE);
+
+ /* === Signals === */
+ g_signal_connect_swapped (statusbar->mpdclient, "playlist-changed",
+ G_CALLBACK (cb_playlist_changed), statusbar);
+}
+
+static void
+xfmpc_statusbar_finalize (GObject *object)
+{
+ XfmpcStatusbar *statusbar = XFMPC_STATUSBAR (object);
+ g_object_unref (statusbar->mpdclient);
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+xfmpc_statusbar_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ XfmpcStatusbar *statusbar = XFMPC_STATUSBAR (object);
+
+ switch (prop_id)
+ {
+ case TEXT:
+ xfmpc_statusbar_set_text (statusbar, g_value_get_string (value));
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+GtkWidget*
+xfmpc_statusbar_new (void)
+{
+ return g_object_new (XFMPC_TYPE_STATUSBAR, NULL);
+}
+
+void
+xfmpc_statusbar_set_text (XfmpcStatusbar *statusbar,
+ const gchar *text)
+{
+ XfmpcStatusbarPrivate *priv = statusbar->priv = GET_PRIVATE (statusbar);
+
+ gtk_statusbar_pop (GTK_STATUSBAR (statusbar), priv->context_id);
+ gtk_statusbar_push (GTK_STATUSBAR (statusbar), priv->context_id, text);
+}
+
+static void
+cb_playlist_changed (XfmpcStatusbar *statusbar)
+{
+ gchar *text;
+ gint seconds, length;
+
+ length = xfmpc_mpdclient_playlist_get_length (statusbar->mpdclient);
+ seconds = xfmpc_mpdclient_playlist_get_total_time (statusbar->mpdclient);
+
+ if (seconds / 3600 > 0)
+ text = g_strdup_printf ("%d songs, %d hours and %d minutes", length, seconds / 3600, (seconds / 60) % 60);
+ else
+ text = g_strdup_printf ("%d songs, %d minutes", length, (seconds / 60) % 60);
+
+ xfmpc_statusbar_set_text (statusbar, text);
+ g_free (text);
+}
+
Added: xfmpc/trunk/src/statusbar.h
===================================================================
--- xfmpc/trunk/src/statusbar.h (rev 0)
+++ xfmpc/trunk/src/statusbar.h 2009-02-16 08:56:24 UTC (rev 6696)
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2009 Vincent Legout <vincent at legout.info>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __XFMPC_STATUSBAR_H__
+#define __XFMPC_STATUSBAR_H__
+
+G_BEGIN_DECLS;
+
+#define XFMPC_TYPE_STATUSBAR (xfmpc_statusbar_get_type ())
+
+#define XFMPC_STATUSBAR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), XFMPC_TYPE_STATUSBAR, XfmpcStatusbar))
+#define XFMPC_STATUSBAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), XFMPC_TYPE_STATUSBAR, XfmpcStatusbarClass))
+#define XFMPC_IS_STATUSBAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), XFMPC_TYPE_STATUSBAR))
+#define XFMPC_IS_STATUSBAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), XFMPC_TYPE_STATUSBAR))
+#define XFMPC_STATUSBAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), XFMPC_TYPE_STATUSBAR, XfmpcStatusbarClass))
+
+typedef struct _XfmpcStatusbarClass XfmpcStatusbarClass;
+typedef struct _XfmpcStatusbar XfmpcStatusbar;
+typedef struct _XfmpcStatusbarPrivate XfmpcStatusbarPrivate;
+
+GType xfmpc_statusbar_get_type (void) G_GNUC_CONST;
+
+GtkWidget* xfmpc_statusbar_new (void);
+
+void xfmpc_statusbar_set_text (XfmpcStatusbar *statusbar,
+ const gchar *text);
+
+G_END_DECLS;
+
+#endif
+
More information about the Goodies-commits
mailing list