[Goodies-commits] r2245 - xfce4-mpc-plugin/trunk/panel-plugin
Landry Breuil
landry at xfce.org
Sun Dec 17 19:38:35 CET 2006
Author: landry
Date: 2006-12-17 18:38:35 +0000 (Sun, 17 Dec 2006)
New Revision: 2245
Modified:
xfce4-mpc-plugin/trunk/panel-plugin/xfce4-mpc-plugin.c
xfce4-mpc-plugin/trunk/panel-plugin/xfce4-mpc-plugin.h
Log:
* added _simple_ playlist support, works only if built against libmpd atm
* need to write same interface in simple-libmpd
* middle-click on the plugin buttons to show playlist (keep_above window, UGLY solution)
* dbl-click on a track to play it and close window
* need to work on little memory leaks (tooltip, windows..)
Modified: xfce4-mpc-plugin/trunk/panel-plugin/xfce4-mpc-plugin.c
===================================================================
--- xfce4-mpc-plugin/trunk/panel-plugin/xfce4-mpc-plugin.c 2006-12-17 15:49:50 UTC (rev 2244)
+++ xfce4-mpc-plugin/trunk/panel-plugin/xfce4-mpc-plugin.c 2006-12-17 18:38:35 UTC (rev 2245)
@@ -345,83 +345,169 @@
/* g_free(song); FIXME ?? */
}
-static void
-toggle(GtkWidget *widget, GdkEventButton* event, t_mpc* mpc)
+static void
+playlist_title_dblclicked (GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *col, t_mpc* mpc)
{
+#ifdef HAVE_LIBMPD
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ gint id = 0, pos = 0;
+
+ model = gtk_tree_view_get_model(treeview);
+ if (gtk_tree_model_get_iter(model, &iter, path))
+ {
+ gtk_tree_model_get(model, &iter, 2, &pos, 3, &id, -1);
+ DBG("Dbl-clicked id %d (pos=%d)",id, pos);
+ mpd_player_play_id(mpc->mo, id);
+ }
+ gtk_widget_destroy(mpc->playlist);
+#endif
+}
+
+static void
+show_playlist (t_mpc* mpc)
+{
+#ifdef HAVE_LIBMPD
DBG("!");
+ GtkWidget *scrolledwin,*treeview;
+ GtkListStore *liststore;
+ GtkTreeIter iter;
+ GtkTreePath *path_to_cur;
+ GtkCellRenderer *renderer;
+ gchar str[512];
+ int current, i;
+ MpdData *mpd_data;
- if (event->button != 1)
- return;
-
- if (mpd_status_update (mpc->mo) != MPD_OK)
- if (!mpc_plugin_reconnect (mpc))
- return;
-
- switch (mpd_player_get_state(mpc->mo))
+ mpc->playlist = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_default_size(GTK_WINDOW(mpc->playlist), 300, 530);
+ gtk_window_set_icon_name(GTK_WINDOW(mpc->playlist),"xfce-multimedia");
+ gtk_window_set_title(GTK_WINDOW(mpc->playlist),_("Mpd playlist"));
+ gtk_window_set_keep_above(GTK_WINDOW(mpc->playlist),TRUE); /* UGLY !!! */
+ scrolledwin = gtk_scrolled_window_new(NULL, NULL);
+ gtk_container_add(GTK_CONTAINER(mpc->playlist),GTK_WIDGET(scrolledwin));
+
+ treeview = gtk_tree_view_new ();
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE);
+ gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(treeview), TRUE);
+ g_signal_connect(treeview, "row-activated", G_CALLBACK(playlist_title_dblclicked), mpc);
+ gtk_container_add(GTK_CONTAINER(scrolledwin),treeview);
+
+ liststore = gtk_list_store_new(4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT);
+ gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), GTK_TREE_MODEL(liststore));
+
+ renderer = gtk_cell_renderer_pixbuf_new ();
+ gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), -1, "Icon", renderer, "stock-id", 0, NULL);
+ renderer = gtk_cell_renderer_text_new ();
+ gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), -1, "Title", renderer, "text", 1, NULL);
+
+ mpc_plugin_reconnect(mpc);
+
+ current = mpd_player_get_current_song_pos (mpc->mo);
+ DBG ("Current song pos in the list: %d", current);
+
+ for (i=0, mpd_data = mpd_playlist_get_changes (mpc->mo, -1); mpd_data != NULL; i++, mpd_data=mpd_data_get_next (mpd_data))
{
- case MPD_PLAYER_PAUSE:
- case MPD_PLAYER_PLAY:
- mpd_player_pause(mpc->mo); /* toggles play/pause */
- break;
- case MPD_PLAYER_STOP:
- default:
- mpd_player_play(mpc->mo); /* if stopped, mpd_player_pause() doesn't restart playing */
- break;
+ g_sprintf(str,"%s - %s", mpd_data->song->artist, mpd_data->song->title);
+
+ gtk_list_store_append (liststore, &iter);
+ if (current == i)
+ {
+ gtk_list_store_set (liststore, &iter, 0, "gtk-media-play", 1, str, 2, mpd_data->song->pos, 3, mpd_data->song->id, -1);
+ path_to_cur = gtk_tree_model_get_path(GTK_TREE_MODEL(liststore), &iter);
+ gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(treeview), path_to_cur, NULL, TRUE, 0.5, 0);
+ gtk_tree_view_set_cursor(GTK_TREE_VIEW(treeview), path_to_cur, NULL, FALSE);
+ gtk_tree_path_free(path_to_cur);
+ }
+ else
+ gtk_list_store_set (liststore, &iter, 0, NULL, 1, str, 2, mpd_data->song->pos, 3, mpd_data->song->id, -1);
}
+ gtk_widget_show_all(mpc->playlist);
+#endif
}
static void
+toggle(GtkWidget *widget, GdkEventButton* event, t_mpc* mpc)
+{
+ if (1 == event->button)
+ {
+ if (mpd_status_update (mpc->mo) != MPD_OK)
+ if (!mpc_plugin_reconnect (mpc))
+ return;
+
+ switch (mpd_player_get_state(mpc->mo))
+ {
+ case MPD_PLAYER_PAUSE:
+ case MPD_PLAYER_PLAY:
+ mpd_player_pause(mpc->mo); /* toggles play/pause */
+ break;
+ case MPD_PLAYER_STOP:
+ default:
+ mpd_player_play(mpc->mo); /* if stopped, mpd_player_pause() doesn't restart playing */
+ break;
+ }
+ }
+ else
+ show_playlist(mpc);
+}
+
+static void
prev(GtkWidget *widget, GdkEventButton* event, t_mpc* mpc)
{
- if (event->button != 1)
- return;
-
- if (mpd_player_prev(mpc->mo) != MPD_OK)
+ if (1 == event->button)
{
- if (mpc_plugin_reconnect (mpc))
+ if (mpd_player_prev(mpc->mo) != MPD_OK)
{
- DBG("calling mpd_player_prev() after reconnect");
- mpd_player_prev(mpc->mo);
+ if (mpc_plugin_reconnect(mpc))
+ {
+ DBG("calling mpd_player_prev() after reconnect");
+ mpd_player_prev(mpc->mo);
+ }
}
+ else
+ DBG("mpd_player_prev() ok");
}
else
- DBG("mpd_player_prev() ok");
+ show_playlist(mpc);
}
static void
stop(GtkWidget *widget, GdkEventButton* event, t_mpc* mpc)
{
- if (event->button != 1)
- return;
-
- if (mpd_player_stop(mpc->mo) != MPD_OK)
+ if (1 == event->button)
{
- if (mpc_plugin_reconnect(mpc))
+ if (mpd_player_stop(mpc->mo) != MPD_OK)
{
- DBG("calling mpd_player_stop() after reconnect");
- mpd_player_stop(mpc->mo);
+ if (mpc_plugin_reconnect(mpc))
+ {
+ DBG("calling mpd_player_stop() after reconnect");
+ mpd_player_stop(mpc->mo);
+ }
}
+ else
+ DBG("mpd_player_stop() ok");
}
else
- DBG("mpd_player_stop() ok");
+ show_playlist(mpc);
}
static void
next(GtkWidget *widget, GdkEventButton* event, t_mpc* mpc)
{
- if (event->button != 1)
- return;
-
- if (mpd_player_next(mpc->mo) != MPD_OK)
+ if (1 == event->button)
{
- if (mpc_plugin_reconnect (mpc))
+ if (mpd_player_next(mpc->mo) != MPD_OK)
{
- DBG("calling mpd_player_next() after reconnect");
- mpd_player_next(mpc->mo);
+ if (mpc_plugin_reconnect(mpc))
+ {
+ DBG("calling mpd_player_next() after reconnect");
+ mpd_player_next(mpc->mo);
+ }
}
+ else
+ DBG("mpd_player_next() ok");
}
else
- DBG("mpd_player_next() ok");
+ show_playlist(mpc);
}
static void
@@ -435,8 +521,8 @@
{
if (!mpc_plugin_reconnect (mpc) || mpd_status_update (mpc->mo) != MPD_OK)
{
- gtk_tooltips_set_tip (mpc->tips, widget, _(".... not connected ?"), NULL);
- return;
+ gtk_tooltips_set_tip (mpc->tips, widget, _(".... not connected ?"), NULL);
+ return;
}
}
@@ -534,7 +620,7 @@
mpc->mpd_password = g_strdup("");
mpc->client_appl = g_strdup("");
mpc->show_frame = TRUE;
- /* mpc->stay_connected = TRUE; */
+ mpc->playlist = NULL;
mpc_read_config (plugin, mpc);
Modified: xfce4-mpc-plugin/trunk/panel-plugin/xfce4-mpc-plugin.h
===================================================================
--- xfce4-mpc-plugin/trunk/panel-plugin/xfce4-mpc-plugin.h 2006-12-17 15:49:50 UTC (rev 2244)
+++ xfce4-mpc-plugin/trunk/panel-plugin/xfce4-mpc-plugin.h 2006-12-17 18:38:35 UTC (rev 2245)
@@ -35,6 +35,7 @@
XfcePanelPlugin *plugin;
GtkTooltips *tips;
GtkWidget *frame,*ebox,*box,*prev,*stop,*toggle,*next,*random,*repeat,*appl;
+ GtkWidget *playlist;
gboolean show_frame;
/* mpd handle */
MpdObj *mo;
More information about the Goodies-commits
mailing list