summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--deadbeef.h1
-rw-r--r--main.c1
-rw-r--r--plugins/gtkui/gtkui.c79
-rw-r--r--plugins/gtkui/gtkui_api.h3
-rw-r--r--plugins/gtkui/widgets.c9
-rw-r--r--plugins/gtkui/widgets.h3
6 files changed, 63 insertions, 33 deletions
diff --git a/deadbeef.h b/deadbeef.h
index 5f83a389..60294d9d 100644
--- a/deadbeef.h
+++ b/deadbeef.h
@@ -274,6 +274,7 @@ enum {
// new in 1.5
DB_EV_SELCHANGED = 22, // selection changed in playlist p1 iter p2
+ DB_EV_PLUGINSLOADED = 23, // after all plugins have been loaded and connected
// -----------------
// structured events
diff --git a/main.c b/main.c
index eea4caa5..288b4895 100644
--- a/main.c
+++ b/main.c
@@ -976,6 +976,7 @@ main (int argc, char *argv[]) {
streamer_init ();
plug_connect_all ();
+ messagepump_push (DB_EV_PLUGINSLOADED, 0, 0, 0);
if (!noloadpl) {
restore_resume_state ();
diff --git a/plugins/gtkui/gtkui.c b/plugins/gtkui/gtkui.c
index 08fbd603..c5cb456f 100644
--- a/plugins/gtkui/gtkui.c
+++ b/plugins/gtkui/gtkui.c
@@ -79,6 +79,12 @@ GtkWidget *traymenu;
GtkWidget *theme_treeview;
GtkWidget *theme_button;
+// overriden API methods
+int (*gtkui_original_plt_add_dir) (ddb_playlist_t *plt, const char *dirname, int (*cb)(DB_playItem_t *it, void *data), void *user_data);
+int (*gtkui_original_plt_add_file) (ddb_playlist_t *plt, const char *fname, int (*cb)(DB_playItem_t *it, void *data), void *user_data);
+int (*gtkui_original_pl_add_files_begin) (ddb_playlist_t *plt);
+void (*gtkui_original_pl_add_files_end) (void);
+
int gtkui_embolden_current_track;
#define TRAY_ICON "deadbeef_tray_icon"
@@ -791,6 +797,24 @@ add_mainmenu_actions_cb (void *data) {
return FALSE;
}
+void
+gtkui_thread (void *ctx);
+
+int
+gtkui_plt_add_dir (ddb_playlist_t *plt, const char *dirname, int (*cb)(DB_playItem_t *it, void *data), void *user_data);
+
+int
+gtkui_plt_add_file (ddb_playlist_t *plt, const char *filename, int (*cb)(DB_playItem_t *it, void *data), void *user_data);
+
+int
+gtkui_pl_add_files_begin (ddb_playlist_t *plt);
+
+void
+gtkui_pl_add_files_end (void);
+
+DB_playItem_t *
+gtkui_plt_load (ddb_playlist_t *plt, DB_playItem_t *after, const char *fname, int *pabort, int (*cb)(DB_playItem_t *it, void *data), void *user_data);
+
int
gtkui_message (uint32_t id, uintptr_t ctx, uint32_t p1, uint32_t p2) {
ddb_gtkui_widget_t *rootwidget = w_get_rootwidget ();
@@ -798,6 +822,31 @@ gtkui_message (uint32_t id, uintptr_t ctx, uint32_t p1, uint32_t p2) {
send_messages_to_widgets (rootwidget, id, ctx, p1, p2);
}
switch (id) {
+ case DB_EV_PLUGINSLOADED:
+ // gtk must be running in separate thread
+ gtk_initialized = 0;
+ gtk_tid = deadbeef->thread_start (gtkui_thread, NULL);
+ // wait until gtk finishes initializing
+ while (!gtk_initialized) {
+ usleep (10000);
+ }
+
+ // override default file adding APIs to show progress bar
+ gtkui_original_plt_add_dir = deadbeef->plt_add_dir;
+ deadbeef->plt_add_dir = gtkui_plt_add_dir;
+
+ gtkui_original_plt_add_file = deadbeef->plt_add_file;
+ deadbeef->plt_add_file = gtkui_plt_add_file;
+
+ gtkui_original_pl_add_files_begin = deadbeef->pl_add_files_begin;
+ deadbeef->pl_add_files_begin = gtkui_pl_add_files_begin;
+
+ gtkui_original_pl_add_files_end = deadbeef->pl_add_files_end;
+ deadbeef->pl_add_files_end = gtkui_pl_add_files_end;
+
+ gtkui_original_plt_load = deadbeef->plt_load;
+ deadbeef->plt_load = gtkui_plt_load;
+ break;
case DB_EV_ACTIVATED:
g_idle_add (activate_cb, NULL);
break;
@@ -1113,11 +1162,6 @@ gtkui_add_file_info_cb (DB_playItem_t *it, void *data) {
return 0;
}
-int (*gtkui_original_plt_add_dir) (ddb_playlist_t *plt, const char *dirname, int (*cb)(DB_playItem_t *it, void *data), void *user_data);
-int (*gtkui_original_plt_add_file) (ddb_playlist_t *plt, const char *fname, int (*cb)(DB_playItem_t *it, void *data), void *user_data);
-int (*gtkui_original_pl_add_files_begin) (ddb_playlist_t *plt);
-void (*gtkui_original_pl_add_files_end) (void);
-
DB_playItem_t * (*gtkui_original_plt_load) (ddb_playlist_t *plt, DB_playItem_t *after, const char *fname, int *pabort, int (*cb)(DB_playItem_t *it, void *data), void *user_data);
int
@@ -1212,30 +1256,6 @@ static int
gtkui_start (void) {
fprintf (stderr, "gtkui plugin compiled for gtk version: %d.%d.%d\n", GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION);
- // gtk must be running in separate thread
- gtk_initialized = 0;
- gtk_tid = deadbeef->thread_start (gtkui_thread, NULL);
- // wait until gtk finishes initializing
- while (!gtk_initialized) {
- usleep (10000);
- }
-
- // override default file adding APIs to show progress bar
- gtkui_original_plt_add_dir = deadbeef->plt_add_dir;
- deadbeef->plt_add_dir = gtkui_plt_add_dir;
-
- gtkui_original_plt_add_file = deadbeef->plt_add_file;
- deadbeef->plt_add_file = gtkui_plt_add_file;
-
- gtkui_original_pl_add_files_begin = deadbeef->pl_add_files_begin;
- deadbeef->pl_add_files_begin = gtkui_pl_add_files_begin;
-
- gtkui_original_pl_add_files_end = deadbeef->pl_add_files_end;
- deadbeef->pl_add_files_end = gtkui_pl_add_files_end;
-
- gtkui_original_plt_load = deadbeef->plt_load;
- deadbeef->plt_load = gtkui_plt_load;
-
return 0;
}
@@ -1716,6 +1736,7 @@ static ddb_gtkui_t plugin = {
.get_mainwin = gtkui_get_mainwin,
.w_reg_widget = w_reg_widget,
.w_unreg_widget = w_unreg_widget,
+ .w_override_signals = w_override_signals,
.w_is_registered = w_is_registered,
.w_get_rootwidget = w_get_rootwidget,
.w_create = w_create,
diff --git a/plugins/gtkui/gtkui_api.h b/plugins/gtkui/gtkui_api.h
index d9482d17..28e76f98 100644
--- a/plugins/gtkui/gtkui_api.h
+++ b/plugins/gtkui/gtkui_api.h
@@ -106,6 +106,9 @@ typedef struct {
// unregister the widget
void (*w_unreg_widget) (const char *type);
+ // this must be called from your <widget>_create for design mode support
+ void (*w_override_signals) (GtkWidget *w, gpointer user_data);
+
// returns 1 if a widget of the specified is registered
int (*w_is_registered) (const char *type);
diff --git a/plugins/gtkui/widgets.c b/plugins/gtkui/widgets.c
index c5fc0a94..b15df529 100644
--- a/plugins/gtkui/widgets.c
+++ b/plugins/gtkui/widgets.c
@@ -244,6 +244,10 @@ w_create_from_string (const char *s, ddb_gtkui_widget_t **parent) {
return NULL;
}
ddb_gtkui_widget_t *w = w_create (t);
+ if (!w) {
+ fprintf (stderr, "failed to create widget for type %s\n", t);
+ return NULL;
+ }
// nuke all default children
while (w->children) {
w_remove (w, w->children);
@@ -558,7 +562,7 @@ w_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_da
return TRUE;
}
-static void
+void
w_override_signals (GtkWidget *widget, gpointer user_data) {
g_signal_connect ((gpointer) widget, "button_press_event", G_CALLBACK (w_button_press_event), user_data);
#if !GTK_CHECK_VERSION(3,0,0)
@@ -1786,7 +1790,6 @@ fill_selproperties_cb (gpointer data) {
static int
selproperties_message (ddb_gtkui_widget_t *w, uint32_t id, uintptr_t ctx, uint32_t p1, uint32_t p2) {
- w_tabbed_playlist_t *tp = (w_tabbed_playlist_t *)w;
switch (id) {
case DB_EV_PLAYLISTCHANGED:
case DB_EV_SELCHANGED:
@@ -1831,8 +1834,6 @@ w_selproperties_create (void) {
gtk_tree_view_column_set_resizable (col2, TRUE);
gtk_tree_view_append_column (GTK_TREE_VIEW (w->tree), col1);
gtk_tree_view_append_column (GTK_TREE_VIEW (w->tree), col2);
- GtkCellRenderer *rend_propkey = gtk_cell_renderer_text_new ();
- GtkCellRenderer *rend_propvalue = gtk_cell_renderer_text_new ();
gtk_tree_view_set_headers_clickable (GTK_TREE_VIEW (w->tree), TRUE);
w_override_signals (w->base.widget, w);
diff --git a/plugins/gtkui/widgets.h b/plugins/gtkui/widgets.h
index f054a082..38ca7f5e 100644
--- a/plugins/gtkui/widgets.h
+++ b/plugins/gtkui/widgets.h
@@ -42,6 +42,9 @@ w_reg_widget (const char *type, const char *title, ddb_gtkui_widget_t *(*create_
void
w_unreg_widget (const char *type);
+void
+w_override_signals (GtkWidget *widget, gpointer user_data);
+
int
w_is_registered (const char *type);