diff options
author | waker <wakeroid@gmail.com> | 2012-12-03 18:34:49 +0100 |
---|---|---|
committer | waker <wakeroid@gmail.com> | 2012-12-03 18:34:49 +0100 |
commit | d2f1b28b81d0f80ef14536d5955a1b92925c62cc (patch) | |
tree | c7343627301395c2cbde92a6d88dc96504a173d7 /plugins | |
parent | 47201c70fcf8f85e333bab2d3804fe7a89539b4a (diff) |
gtkui: cover art fixes
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/gtkui/coverart.c | 30 | ||||
-rw-r--r-- | plugins/gtkui/coverart.h | 9 | ||||
-rw-r--r-- | plugins/gtkui/gtkui.c | 2 | ||||
-rw-r--r-- | plugins/gtkui/plcommon.c | 15 | ||||
-rw-r--r-- | plugins/gtkui/widgets.c | 48 |
5 files changed, 47 insertions, 57 deletions
diff --git a/plugins/gtkui/coverart.c b/plugins/gtkui/coverart.c index 2a803e51..ed167c48 100644 --- a/plugins/gtkui/coverart.c +++ b/plugins/gtkui/coverart.c @@ -103,13 +103,6 @@ queue_pop (void) { deadbeef->mutex_unlock (mutex); } -gboolean -redraw_playlist_cb (gpointer dt) { - void main_refresh (void); - main_refresh (); - return FALSE; -} - void loading_thread (void *none) { #ifdef __linux__ @@ -154,6 +147,7 @@ loading_thread (void *none) { if (stat (queue->fname, &stat_buf) < 0) { trace ("failed to stat file %s\n", queue->fname); } + GdkPixbuf *pixbuf = NULL; GError *error = NULL; pixbuf = gdk_pixbuf_new_from_file_at_scale (queue->fname, queue->width, queue->width, TRUE, &error); @@ -256,28 +250,6 @@ get_pixbuf (const char *fname, int width, void (*callback)(void *user_data), voi return NULL; } -static void -redraw_playlist (void *user_data) { - g_idle_add (redraw_playlist_cb, NULL); -} - -GdkPixbuf * -get_cover_art (const char *fname, const char *artist, const char *album, int width) { - if (!coverart_plugin) { - return NULL; - } - cover_avail_info_t *dt = malloc (sizeof (cover_avail_info_t)); - dt->width = width; - dt->callback = redraw_playlist; - dt->user_data = NULL; - char *image_fname = coverart_plugin->get_album_art (fname, artist, album, -1, cover_avail_callback, (void*)dt); - if (image_fname) { - GdkPixbuf *pb = get_pixbuf (image_fname, width, redraw_playlist, NULL); - free (image_fname); - return pb; - } - return NULL; -} GdkPixbuf * get_cover_art_callb (const char *fname, const char *artist, const char *album, int width, void (*callback) (void *user_data), void *user_data) { diff --git a/plugins/gtkui/coverart.h b/plugins/gtkui/coverart.h index a4914b6f..65bf1d6f 100644 --- a/plugins/gtkui/coverart.h +++ b/plugins/gtkui/coverart.h @@ -25,16 +25,11 @@ // this function puts request for cover art into queue, or returns default image // of specific size // -// if the image is not available immediately -- callback will be called later, -// which will redraw all tracks matching the query +// if the image is not available immediately -- callback will be called later // // if cover art loader plugin is not available -- NULL will be returned GdkPixbuf * -get_cover_art (const char *fname, const char *artist, const char *album, int width); - -GdkPixbuf * -get_cover_art_callb (const char *fname, const char *artist, const char *album, int width, void -(*cover_avail_callback) (void *user_data), void *user_data); +get_cover_art_callb (const char *fname, const char *artist, const char *album, int width, void (*cover_avail_callback) (void *user_data), void *user_data); void coverart_reset_queue (void); diff --git a/plugins/gtkui/gtkui.c b/plugins/gtkui/gtkui.c index a584b834..77d7e0a8 100644 --- a/plugins/gtkui/gtkui.c +++ b/plugins/gtkui/gtkui.c @@ -1274,6 +1274,8 @@ gtkui_connect_cb (void *none) { } gtkui_playlist_changed (); add_mainmenu_actions (); + ddb_event_t *e = deadbeef->event_alloc (DB_EV_TRACKINFOCHANGED); + deadbeef->event_send(e, 0, 0); return FALSE; } diff --git a/plugins/gtkui/plcommon.c b/plugins/gtkui/plcommon.c index 880f5f81..65734752 100644 --- a/plugins/gtkui/plcommon.c +++ b/plugins/gtkui/plcommon.c @@ -73,6 +73,19 @@ rewrite_column_config (DdbListview *listview, const char *name) { } } +static gboolean +redraw_playlist_cb (gpointer dt) { + void main_refresh (void); + main_refresh (); + return FALSE; +} + +static void +redraw_playlist (void *user_data) { + g_idle_add (redraw_playlist_cb, NULL); +} + + #define ART_PADDING_HORZ 8 #define ART_PADDING_VERT 0 @@ -134,7 +147,7 @@ void draw_column_data (DdbListview *listview, cairo_t *cr, DdbListviewIter it, D if (!album || !*album) { album = deadbeef->pl_find_meta (group_it, "title"); } - GdkPixbuf *pixbuf = get_cover_art (deadbeef->pl_find_meta (((DB_playItem_t *)group_it), ":URI"), artist, album, art_width); + GdkPixbuf *pixbuf = get_cover_art_callb (deadbeef->pl_find_meta (((DB_playItem_t *)group_it), ":URI"), artist, album, art_width, redraw_playlist, NULL); if (pixbuf) { int pw = gdk_pixbuf_get_width (pixbuf); int ph = gdk_pixbuf_get_height (pixbuf); diff --git a/plugins/gtkui/widgets.c b/plugins/gtkui/widgets.c index 1f474a88..c5fc0a94 100644 --- a/plugins/gtkui/widgets.c +++ b/plugins/gtkui/widgets.c @@ -1798,19 +1798,26 @@ selproperties_message (ddb_gtkui_widget_t *w, uint32_t id, uintptr_t ctx, uint32 return 0; } +static void +w_selproperties_init (struct ddb_gtkui_widget_s *w) { + fill_selproperties_cb (w); +} + ddb_gtkui_widget_t * w_selproperties_create (void) { w_selproperties_t *w = malloc (sizeof (w_selproperties_t)); memset (w, 0, sizeof (w_selproperties_t)); w->base.widget = gtk_scrolled_window_new (NULL, NULL); + w->base.init = w_selproperties_init; + w->base.message = selproperties_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); - w->base.message = selproperties_message; GtkListStore *store = gtk_list_store_new (4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT); gtk_tree_view_set_model (GTK_TREE_VIEW (w->tree), GTK_TREE_MODEL (store)); @@ -1833,38 +1840,46 @@ w_selproperties_create (void) { } ///// cover art display -void -coverart_avail_callback (void *user_data) { +static gboolean +coverart_redraw_cb (void *user_data) { w_coverart_t *w = user_data; gtk_widget_queue_draw (w->drawarea); + return FALSE; +} + +void +coverart_avail_callback (void *user_data) { + g_idle_add (coverart_redraw_cb, user_data); } static gboolean coverart_draw (GtkWidget *widget, cairo_t *cr, gpointer user_data) { DB_playItem_t *it = deadbeef->streamer_get_playing_track (); - if (!it) { - return FALSE; - } GtkAllocation a; gtk_widget_get_allocation (widget, &a); int width = a.width; int height = a.height; - const char *album = deadbeef->pl_find_meta (it, "album"); - const char *artist = deadbeef->pl_find_meta (it, "artist"); - if (!album || !*album) { - album = deadbeef->pl_find_meta (it, "title"); + const char *album = NULL, *artist = NULL; + if (it) { + album = deadbeef->pl_find_meta (it, "album"); + artist = deadbeef->pl_find_meta (it, "artist"); + if (!album || !*album) { + album = deadbeef->pl_find_meta (it, "title"); + } } - GdkPixbuf *pixbuf = get_cover_art_callb (deadbeef->pl_find_meta ((it), ":URI"), artist, album, min(width,height), coverart_avail_callback, user_data); + GdkPixbuf *pixbuf = get_cover_art_callb (it ? deadbeef->pl_find_meta ((it), ":URI") : NULL, artist, album, min(width,height), coverart_avail_callback, user_data); + if (pixbuf) { int pw = gdk_pixbuf_get_width (pixbuf); int ph = gdk_pixbuf_get_height (pixbuf); gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0); cairo_rectangle (cr, 0, 0, pw, ph); cairo_fill (cr); -// gdk_draw_pixbuf (gtk_widget_get_window (widget), widget->style->white_gc, pixbuf, 0, 0, a.width/2-pw/2, a.height/2-ph/2, pw, ph, GDK_RGB_DITHER_NONE, 0, 0); g_object_unref (pixbuf); } - deadbeef->pl_item_unref (it); + if (it) { + deadbeef->pl_item_unref (it); + } return TRUE; } @@ -1876,13 +1891,6 @@ coverart_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_d return res; } -static gboolean -coverart_redraw_cb (void *user_data) { - w_coverart_t *w = user_data; - gtk_widget_queue_draw (w->drawarea); - return FALSE; -} - static int coverart_message (ddb_gtkui_widget_t *w, uint32_t id, uintptr_t ctx, uint32_t p1, uint32_t p2) { w_coverart_t *ca = (w_coverart_t *)w; |