summaryrefslogtreecommitdiff
path: root/plugins/pltbrowser
diff options
context:
space:
mode:
authorGravatar waker <wakeroid@gmail.com>2013-07-11 03:00:56 +0200
committerGravatar waker <wakeroid@gmail.com>2013-07-11 03:00:56 +0200
commita20a3b8e0e7e83709756ddc518f968f2c879d36a (patch)
tree2fdba0c0d749cae2843624936b3e5bc6af84711c /plugins/pltbrowser
parentf6326098b4ebc849654f1a60a7a31a3bd8e24df0 (diff)
playlist browser plugin WIP
Diffstat (limited to 'plugins/pltbrowser')
-rw-r--r--plugins/pltbrowser/Makefile.am48
-rw-r--r--plugins/pltbrowser/pltbrowser.c182
2 files changed, 230 insertions, 0 deletions
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 <gtk/gtk.h>
+#include <stdlib.h>
+#include <string.h>
+#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);
+}