From a20a3b8e0e7e83709756ddc518f968f2c879d36a Mon Sep 17 00:00:00 2001 From: waker Date: Thu, 11 Jul 2013 03:00:56 +0200 Subject: playlist browser plugin WIP --- plugins/pltbrowser/Makefile.am | 48 +++++++++++ plugins/pltbrowser/pltbrowser.c | 182 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 230 insertions(+) create mode 100644 plugins/pltbrowser/Makefile.am create mode 100644 plugins/pltbrowser/pltbrowser.c (limited to 'plugins/pltbrowser') diff --git a/plugins/pltbrowser/Makefile.am b/plugins/pltbrowser/Makefile.am new file mode 100644 index 00000000..73923b55 --- /dev/null +++ b/plugins/pltbrowser/Makefile.am @@ -0,0 +1,48 @@ +if HAVE_PLTBROWSER + +if HAVE_GTK2 +if HAVE_GTK3 +pkglib_LTLIBRARIES = pltbrowser_gtk2.la pltbrowser_gtk3.la +else +pkglib_LTLIBRARIES = pltbrowser_gtk2.la +endif +else +if HAVE_GTK3 +pkglib_LTLIBRARIES = pltbrowser_gtk3.la +endif +endif + +AM_CFLAGS = $(CFLAGS) -std=c99 -fPIC + +if HAVE_GTK2 +pltbrowser_gtk2_la_SOURCES = pltbrowser.c +pltbrowser_gtk2_la_LDFLAGS = -module +if STATICLINK +GTK_ROOT=@top_srcdir@/$(LIB)/gtk-2.12.12/usr + +pltbrowser_gtk2_la_LIBADD = $(LDADD) -L$(GTK_ROOT)/lib $(GTK_ROOT)/lib/libgtk-x11-2.0.la $(GTK_ROOT)/lib/libgdk-x11-2.0.la $(GTK_ROOT)/lib/libpangoft2-1.0.la $(GTK_ROOT)/lib/libpangocairo-1.0.la $(GTK_ROOT)/lib/libgdk_pixbuf-2.0.la -lm $(GTK_ROOT)/lib/libcairo.la $(GTK_ROOT)/lib/libpango-1.0.la $(GTK_ROOT)/lib/libgobject-2.0.la $(GTK_ROOT)/lib/libgmodule-2.0.la $(GTK_ROOT)/lib/libgthread-2.0.la -lrt $(GTK_ROOT)/lib/libglib-2.0.la + +pltbrowser_gtk2_la_CFLAGS = -std=c99 -I $(GTK_ROOT)/include -I $(GTK_ROOT)/lib/gtk-2.0/include -I $(GTK_ROOT)/include/glib-2.0 -I $(GTK_ROOT)/include/gtk-2.0 -I $(GTK_ROOT)/include/cairo -I $(GTK_ROOT)/lib/glib-2.0/include/ -I $(GTK_ROOT)/include/pango-1.0 -I $(GTK_ROOT)/include/atk-1.0 -DULTRA_COMPATIBLE=1 +else +pltbrowser_gtk2_la_LIBADD = $(LDADD) $(GTK2_DEPS_LIBS) +pltbrowser_gtk2_la_CFLAGS = -std=c99 $(GTK2_DEPS_CFLAGS) +endif +endif + +if HAVE_GTK3 +pltbrowser_gtk3_la_SOURCES = pltbrowser.c +pltbrowser_gtk3_la_LDFLAGS = -module +if STATICLINK +GTK_ROOT_300=@top_srcdir@/$(LIB)/gtk-3.0.0 + +pltbrowser_gtk3_la_LIBADD = $(LDADD) -L$(GTK_ROOT_300)/lib -lgtk-3 -lgdk-3 -latk-1.0 -lgio-2.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo-gobject -lpango-1.0 -lcairo -lgobject-2.0 -lglib-2.0 -lfreetype -lfontconfig $(SM_LIBADD) + +pltbrowser_gtk3_la_CFLAGS = -std=c99 -I$(GTK_ROOT_300)/include/gtk-3.0 -I$(GTK_ROOT_300)/include/pango-1.0 -I$(GTK_ROOT_300)/include/gio-unix-2.0/ -I$(GTK_ROOT_300)/include/atk-1.0 -I$(GTK_ROOT_300)/include/cairo -I$(GTK_ROOT_300)/include/gdk-pixbuf-2.0 -I$(GTK_ROOT_300)/include/freetype2 -I$(GTK_ROOT_300)/include/glib-2.0 -I$(GTK_ROOT_300)/lib/glib-2.0/include $(SM_CFLAGS) + +else +pltbrowser_gtk3_la_LIBADD = $(LDADD) $(GTK3_DEPS_LIBS) +pltbrowser_gtk3_la_CFLAGS = -std=c99 $(GTK3_DEPS_CFLAGS) +endif +endif + +endif diff --git a/plugins/pltbrowser/pltbrowser.c b/plugins/pltbrowser/pltbrowser.c new file mode 100644 index 00000000..25513d96 --- /dev/null +++ b/plugins/pltbrowser/pltbrowser.c @@ -0,0 +1,182 @@ +/* + DeaDBeeF -- the music player + Copyright (C) 2009-2012 Alexey Yakovenko and other contributors + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source distribution. +*/ +#include "../../deadbeef.h" +#include +#include +#include +#ifdef HAVE_CONFIG_H +#include "../../config.h" +#endif +#include "../gtkui/gtkui_api.h" +#include "../../gettext.h" + +DB_functions_t *deadbeef; +static ddb_gtkui_t *gtkui_plugin; + +typedef struct { + ddb_gtkui_widget_t base; + GtkWidget *tree; +} w_pltbrowser_t; + +static gboolean +fill_pltbrowser_cb (gpointer data) { + w_pltbrowser_t *w = data; + deadbeef->pl_lock (); + GtkListStore *store = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (w->tree))); + gtk_list_store_clear (store); + int n = deadbeef->plt_get_count (); + int curr = deadbeef->plt_get_curr_idx (); + for (int i = 0; i < n; i++) { + ddb_playlist_t *plt = deadbeef->plt_get_for_idx (i); + GtkTreeIter iter; + gtk_list_store_append (store, &iter); + char buf[1000]; + deadbeef->plt_get_title (plt, buf, sizeof (buf)); + gtk_list_store_set (store, &iter, 0, buf, -1); + } + if (curr != -1) { + GtkTreePath *path = gtk_tree_path_new_from_indices (curr, -1); + gtk_tree_view_set_cursor (GTK_TREE_VIEW (w->tree), path, NULL, FALSE); + gtk_tree_path_free (path); + } + deadbeef->pl_unlock (); + return FALSE; +} + +static int +pltbrowser_message (ddb_gtkui_widget_t *w, uint32_t id, uintptr_t ctx, uint32_t p1, uint32_t p2) { + switch (id) { + case DB_EV_PLAYLISTSWITCHED: + g_idle_add (fill_pltbrowser_cb, w); + break; + } + return 0; +} + + +static void +w_pltbrowser_init (struct ddb_gtkui_widget_s *w) { + fill_pltbrowser_cb (w); +} + +static ddb_gtkui_widget_t * +w_pltbrowser_create (void) { + w_pltbrowser_t *w = malloc (sizeof (w_pltbrowser_t)); + memset (w, 0, sizeof (w_pltbrowser_t)); + + w->base.widget = gtk_scrolled_window_new (NULL, NULL); + w->base.init = w_pltbrowser_init; + w->base.message = pltbrowser_message; + + gtk_widget_set_can_focus (w->base.widget, FALSE); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (w->base.widget), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + w->tree = gtk_tree_view_new (); + gtk_widget_show (w->tree); + gtk_tree_view_set_enable_search (GTK_TREE_VIEW (w->tree), FALSE); + gtk_container_add (GTK_CONTAINER (w->base.widget), w->tree); + + GtkListStore *store = gtk_list_store_new (1, G_TYPE_STRING); + gtk_tree_view_set_model (GTK_TREE_VIEW (w->tree), GTK_TREE_MODEL (store)); + gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (w->tree), TRUE); + + GtkCellRenderer *rend1 = gtk_cell_renderer_text_new (); + GtkTreeViewColumn *col1 = gtk_tree_view_column_new_with_attributes (_("Key"), rend1, "text", 0, NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW (w->tree), col1); + gtk_tree_view_set_headers_clickable (GTK_TREE_VIEW (w->tree), TRUE); + gtkui_plugin->w_override_signals (w->base.widget, w); + + return (ddb_gtkui_widget_t *)w; +} + +static gboolean +pltbrowser_connect_cb (void *ctx) { + return FALSE; +} + +static int +pltbrowser_connect (void) { +#if GTK_CHECK_VERSION(3,0,0) + gtkui_plugin = (ddb_gtkui_t *)deadbeef->plug_get_for_id ("gtkui3"); +#else + gtkui_plugin = (ddb_gtkui_t *)deadbeef->plug_get_for_id ("gtkui"); +#endif + if(!gtkui_plugin) { + return -1; + } + gtkui_plugin->w_reg_widget ("pltbrowser", _("Playlist browser"), w_pltbrowser_create); + // need to do it in gtk thread + g_idle_add (pltbrowser_connect_cb, NULL); + + return 0; +} + +static int +pltbrowser_disconnect (void) { + gtkui_plugin->w_unreg_widget ("pltbrowser"); + return 0; +} + +static DB_misc_t plugin = { + .plugin.api_vmajor = 1, + .plugin.api_vminor = 5, + .plugin.version_major = 1, + .plugin.version_minor = 0, + .plugin.type = DB_PLUGIN_MISC, + .plugin.id = "pltbrowser", + .plugin.descr = "Playlist browser", + .plugin.copyright = + "DeaDBeeF -- the music player\n" + "Copyright (C) 2009-2012 Alexey Yakovenko and other contributors\n" + "\n" + "This software is provided 'as-is', without any express or implied\n" + "warranty. In no event will the authors be held liable for any damages\n" + "arising from the use of this software.\n" + "\n" + "Permission is granted to anyone to use this software for any purpose,\n" + "including commercial applications, and to alter it and redistribute it\n" + "freely, subject to the following restrictions:\n" + "\n" + "1. The origin of this software must not be misrepresented; you must not\n" + " claim that you wrote the original software. If you use this software\n" + " in a product, an acknowledgment in the product documentation would be\n" + " appreciated but is not required.\n" + "\n" + "2. Altered source versions must be plainly marked as such, and must not be\n" + " misrepresented as being the original software.\n" + "\n" + "3. This notice may not be removed or altered from any source distribution.\n" + , + .plugin.website = "http://deadbeef.sf.net", + .plugin.connect = pltbrowser_connect, + .plugin.disconnect = pltbrowser_disconnect, +}; + +DB_plugin_t * +#if GTK_CHECK_VERSION(3,0,0) +pltbrowser_gtk3_load (DB_functions_t *api) { +#else +pltbrowser_gtk2_load (DB_functions_t *api) { +#endif + deadbeef = api; + return DB_PLUGIN(&plugin); +} -- cgit v1.2.3