diff options
author | waker <wakeroid@gmail.com> | 2013-07-11 02:42:26 +0200 |
---|---|---|
committer | waker <wakeroid@gmail.com> | 2013-07-11 03:00:01 +0200 |
commit | f6326098b4ebc849654f1a60a7a31a3bd8e24df0 (patch) | |
tree | b5f24a3a389f30adb48c66bc806f0b4c3c0ce4f7 | |
parent | 1cd3c2f589a3cc32a42e8991dbbd46435e24e1bb (diff) |
gtkui: added/fixed few things to make widget plugins work
-rw-r--r-- | deadbeef.h | 1 | ||||
-rw-r--r-- | main.c | 1 | ||||
-rw-r--r-- | plugins/gtkui/gtkui.c | 79 | ||||
-rw-r--r-- | plugins/gtkui/gtkui_api.h | 3 | ||||
-rw-r--r-- | plugins/gtkui/widgets.c | 9 | ||||
-rw-r--r-- | plugins/gtkui/widgets.h | 3 |
6 files changed, 63 insertions, 33 deletions
@@ -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 @@ -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); |