2313
|
1 /*
|
|
2 * Audacious: A cross-platform multimedia player
|
|
3 * Copyright (c) 2006 William Pitcock, Tony Vroon, George Averill,
|
|
4 * Giacomo Lozito, Derek Pomery and Yoshiki Yazawa.
|
|
5 *
|
|
6 * This program is free software; you can redistribute it and/or modify
|
|
7 * it under the terms of the GNU General Public License as published by
|
|
8 * the Free Software Foundation; under version 2 of the License.
|
|
9 *
|
|
10 * This program is distributed in the hope that it will be useful,
|
|
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13 * GNU General Public License for more details.
|
|
14 *
|
|
15 * You should have received a copy of the GNU General Public License
|
|
16 * along with this program; if not, write to the Free Software
|
|
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
18 * 02110-1301, USA.
|
|
19 */
|
|
20
|
|
21 #ifdef HAVE_CONFIG_H
|
|
22 # include "config.h"
|
|
23 #endif
|
|
24
|
|
25 #include <glib.h>
|
|
26 #include <glib/gi18n.h>
|
|
27 #include <gtk/gtk.h>
|
|
28 #include <glade/glade.h>
|
|
29 #include <string.h>
|
|
30 #include <stddef.h>
|
|
31 #include <stdio.h>
|
|
32 #include <sys/types.h>
|
|
33 #include <dirent.h>
|
|
34 #include <unistd.h>
|
|
35 #include <errno.h>
|
|
36 #include <sys/types.h>
|
|
37 #include <sys/stat.h>
|
|
38
|
|
39 #include "glade.h"
|
|
40
|
|
41 #include "plugin.h"
|
|
42 #include "pluginenum.h"
|
|
43 #include "input.h"
|
|
44 #include "effect.h"
|
|
45 #include "general.h"
|
|
46 #include "output.h"
|
|
47 #include "visualization.h"
|
|
48
|
|
49 #include "main.h"
|
|
50 #include "libaudacious/urldecode.h"
|
|
51 #include "util.h"
|
|
52 #include "dnd.h"
|
|
53 #include "titlestring.h"
|
|
54
|
|
55 #include "libaudacious/configdb.h"
|
|
56
|
|
57 #include "playlist.h"
|
|
58
|
|
59 #include "ui_main.h"
|
|
60 #include "ui_playlist.h"
|
|
61 #include "build_stamp.h"
|
|
62 #include "ui_fileinfo.h"
|
|
63 #include "ui_playlist.h"
|
|
64
|
|
65 GtkWidget *fileinfo_win;
|
|
66 GtkWidget *filepopup_win;
|
|
67
|
|
68 static void
|
|
69 fileinfo_entry_set_text(const char *entry, const char *text)
|
|
70 {
|
|
71 GladeXML *xml = g_object_get_data(G_OBJECT(fileinfo_win), "glade-xml");
|
|
72 GtkWidget *widget = glade_xml_get_widget(xml, entry);
|
|
73
|
|
74 if (xml == NULL || widget == NULL)
|
|
75 return;
|
|
76
|
|
77 gtk_entry_set_text(GTK_ENTRY(widget), text);
|
|
78 }
|
|
79
|
|
80 static void
|
|
81 fileinfo_entry_set_text_free(const char *entry, char *text)
|
|
82 {
|
|
83 GladeXML *xml = g_object_get_data(G_OBJECT(fileinfo_win), "glade-xml");
|
|
84 GtkWidget *widget = glade_xml_get_widget(xml, entry);
|
|
85
|
|
86 if (xml == NULL || widget == NULL)
|
|
87 return;
|
|
88
|
|
89 gtk_entry_set_text(GTK_ENTRY(widget), text);
|
|
90
|
|
91 g_free(text);
|
|
92 }
|
|
93
|
|
94 static void
|
|
95 fileinfo_entry_set_image(const char *entry, const char *text)
|
|
96 {
|
|
97 GladeXML *xml = g_object_get_data(G_OBJECT(fileinfo_win), "glade-xml");
|
|
98 GtkWidget *widget = glade_xml_get_widget(xml, entry);
|
|
99 GdkPixbuf *pixbuf;
|
|
100 int width, height;
|
|
101 double aspect;
|
|
102 GdkPixbuf *pixbuf2;
|
|
103
|
|
104 if (xml == NULL || widget == NULL)
|
|
105 return;
|
|
106
|
|
107 pixbuf = gdk_pixbuf_new_from_file(text, NULL);
|
|
108
|
|
109 if (pixbuf == NULL)
|
|
110 return;
|
|
111
|
|
112 width = gdk_pixbuf_get_width(GDK_PIXBUF(pixbuf));
|
|
113 height = gdk_pixbuf_get_height(GDK_PIXBUF(pixbuf));
|
|
114
|
|
115 if(strcmp(DATA_DIR "/images/audio.png", text))
|
|
116 {
|
|
117 if(width == 0)
|
|
118 width = 1;
|
|
119 aspect = (double)height / (double)width;
|
|
120 if(aspect > 1.0) {
|
|
121 height = (int)(cfg.filepopup_pixelsize * aspect);
|
|
122 width = cfg.filepopup_pixelsize;
|
|
123 } else {
|
|
124 height = cfg.filepopup_pixelsize;
|
|
125 width = (int)(cfg.filepopup_pixelsize / aspect);
|
|
126 }
|
|
127 pixbuf2 = gdk_pixbuf_scale_simple(GDK_PIXBUF(pixbuf), width, height, GDK_INTERP_BILINEAR);
|
|
128 g_object_unref(G_OBJECT(pixbuf));
|
|
129 pixbuf = pixbuf2;
|
|
130 }
|
|
131
|
|
132 gtk_image_set_from_pixbuf(GTK_IMAGE(widget), GDK_PIXBUF(pixbuf));
|
|
133 g_object_unref(G_OBJECT(pixbuf));
|
|
134 }
|
|
135
|
|
136 static void
|
|
137 filepopup_entry_set_text(const char *entry, const char *text)
|
|
138 {
|
|
139 GladeXML *xml = g_object_get_data(G_OBJECT(filepopup_win), "glade-xml");
|
|
140 GtkWidget *widget = glade_xml_get_widget(xml, entry);
|
|
141
|
|
142 if (xml == NULL || widget == NULL)
|
|
143 return;
|
|
144
|
|
145 gtk_label_set_text(GTK_LABEL(widget), text);
|
|
146 }
|
|
147
|
|
148 static void
|
|
149 filepopup_entry_set_image(const char *entry, const char *text)
|
|
150 {
|
|
151 GladeXML *xml = g_object_get_data(G_OBJECT(filepopup_win), "glade-xml");
|
|
152 GtkWidget *widget = glade_xml_get_widget(xml, entry);
|
|
153 GdkPixbuf *pixbuf;
|
|
154 int width, height;
|
|
155 double aspect;
|
|
156 GdkPixbuf *pixbuf2;
|
|
157
|
|
158 if (xml == NULL || widget == NULL)
|
|
159 return;
|
|
160
|
|
161 pixbuf = gdk_pixbuf_new_from_file(text, NULL);
|
|
162
|
|
163 if (pixbuf == NULL)
|
|
164 return;
|
|
165
|
|
166 width = gdk_pixbuf_get_width(GDK_PIXBUF(pixbuf));
|
|
167 height = gdk_pixbuf_get_height(GDK_PIXBUF(pixbuf));
|
|
168
|
|
169 if(strcmp(DATA_DIR "/images/audio.png", text))
|
|
170 {
|
|
171 if(width == 0)
|
|
172 width = 1;
|
|
173 aspect = (double)height / (double)width;
|
|
174 if(aspect > 1.0) {
|
|
175 height = (int)(cfg.filepopup_pixelsize * aspect);
|
|
176 width = cfg.filepopup_pixelsize;
|
|
177 } else {
|
|
178 height = cfg.filepopup_pixelsize;
|
|
179 width = (int)(cfg.filepopup_pixelsize / aspect);
|
|
180 }
|
|
181 pixbuf2 = gdk_pixbuf_scale_simple(GDK_PIXBUF(pixbuf), width, height, GDK_INTERP_BILINEAR);
|
|
182 g_object_unref(G_OBJECT(pixbuf));
|
|
183 pixbuf = pixbuf2;
|
|
184 }
|
|
185
|
|
186 gtk_image_set_from_pixbuf(GTK_IMAGE(widget), GDK_PIXBUF(pixbuf));
|
|
187 g_object_unref(G_OBJECT(pixbuf));
|
|
188 }
|
|
189
|
|
190 static void
|
|
191 filepopup_entry_set_text_free(const char *entry, char *text)
|
|
192 {
|
|
193 GladeXML *xml = g_object_get_data(G_OBJECT(filepopup_win), "glade-xml");
|
|
194 GtkWidget *widget = glade_xml_get_widget(xml, entry);
|
|
195
|
|
196 if (xml == NULL || widget == NULL)
|
|
197 return;
|
|
198
|
|
199 gtk_label_set_text(GTK_LABEL(widget), text);
|
|
200
|
|
201 g_free(text);
|
|
202 }
|
|
203
|
|
204 static gboolean
|
|
205 filepopup_pointer_check_iter(gpointer unused)
|
|
206 {
|
|
207 gint x, y, pos;
|
|
208 TitleInput *tuple;
|
|
209 static gint prev_x = 0, prev_y = 0, ctr = 0, prev_pos = -1;
|
|
210 static gint shaded_pos = -1, shaded_prev_pos = -1;
|
|
211 gboolean skip = FALSE;
|
|
212 GdkWindow *win;
|
|
213 Playlist *playlist = playlist_get_active();
|
|
214
|
|
215 win = gdk_window_at_pointer(NULL, NULL);
|
|
216 gdk_window_get_pointer(GDK_WINDOW(playlistwin->window), &x, &y, NULL);
|
|
217 pos = playlist_list_get_playlist_position(playlistwin_list, x, y);
|
|
218
|
|
219 if (win == NULL
|
|
220 || cfg.show_filepopup_for_tuple == FALSE
|
|
221 || playlistwin_list->pl_tooltips == FALSE
|
|
222 || pos != prev_pos
|
|
223 || win != GDK_WINDOW(playlistwin->window))
|
|
224 {
|
|
225 prev_pos = pos;
|
|
226 ctr = 0;
|
|
227 if ( filepopup_win->window != NULL &&
|
|
228 gdk_window_is_viewable(GDK_WINDOW(filepopup_win->window)) )
|
|
229 filepopup_hide(NULL);
|
|
230 return TRUE;
|
|
231 }
|
|
232
|
|
233 if (prev_x == x && prev_y == y)
|
|
234 ctr++;
|
|
235 else
|
|
236 {
|
|
237 ctr = 0;
|
|
238 prev_x = x;
|
|
239 prev_y = y;
|
|
240 filepopup_hide(NULL);
|
|
241 return TRUE;
|
|
242 }
|
|
243
|
|
244 if (filepopup_win->window == NULL)
|
|
245 skip = TRUE;
|
|
246
|
|
247 if (playlistwin_is_shaded()) {
|
|
248 shaded_pos = playlist_get_position(playlist);
|
|
249 if (shaded_prev_pos != shaded_pos)
|
|
250 skip = TRUE;
|
|
251 }
|
|
252
|
|
253 if (ctr >= cfg.filepopup_delay && (skip == TRUE || gdk_window_is_viewable(GDK_WINDOW(filepopup_win->window)) != TRUE)) {
|
|
254 if (pos == -1 && !playlistwin_is_shaded()) {
|
|
255 filepopup_hide(NULL);
|
|
256 return TRUE;
|
|
257 }
|
|
258 else { /* shaded mode */
|
|
259 tuple = playlist_get_tuple(playlist, shaded_pos);
|
|
260 filepopup_hide(NULL);
|
|
261 filepopup_show_for_tuple(tuple);
|
|
262 shaded_prev_pos = shaded_pos;
|
|
263 }
|
|
264
|
|
265 prev_pos = pos;
|
|
266
|
|
267 tuple = playlist_get_tuple(playlist, pos);
|
|
268 filepopup_show_for_tuple(tuple);
|
|
269 }
|
|
270
|
|
271 return TRUE;
|
|
272 }
|
|
273
|
|
274 void fileinfo_hide(gpointer unused)
|
|
275 {
|
|
276 gtk_widget_hide(fileinfo_win);
|
|
277
|
|
278 /* Clear it out. */
|
|
279 fileinfo_entry_set_text("entry_title", "");
|
|
280 fileinfo_entry_set_text("entry_artist", "");
|
|
281 fileinfo_entry_set_text("entry_album", "");
|
|
282 fileinfo_entry_set_text("entry_comment", "");
|
|
283 fileinfo_entry_set_text("entry_genre", "");
|
|
284 fileinfo_entry_set_text("entry_year", "");
|
|
285 fileinfo_entry_set_text("entry_track", "");
|
|
286 fileinfo_entry_set_text("entry_location", "");
|
|
287
|
|
288 fileinfo_entry_set_image("image_artwork", DATA_DIR "/images/audio.png");
|
|
289 }
|
|
290
|
|
291 void filepopup_hide(gpointer unused)
|
|
292 {
|
|
293 gtk_widget_hide(filepopup_win);
|
|
294
|
|
295 filepopup_entry_set_text("label_title", "");
|
|
296 filepopup_entry_set_text("label_artist", "");
|
|
297 filepopup_entry_set_text("label_album", "");
|
|
298 filepopup_entry_set_text("label_genre", "");
|
|
299 filepopup_entry_set_text("label_track", "");
|
|
300 filepopup_entry_set_text("label_year", "");
|
|
301 filepopup_entry_set_text("label_length", "");
|
|
302
|
|
303
|
|
304 gtk_window_resize(GTK_WINDOW(filepopup_win), 1, 1);
|
|
305 }
|
|
306
|
|
307 void
|
|
308 create_fileinfo_window(void)
|
|
309 {
|
|
310 const gchar *glade_file = DATA_DIR "/glade/fileinfo.glade";
|
|
311 GladeXML *xml;
|
|
312 GtkWidget *widget;
|
|
313
|
|
314 xml = glade_xml_new_or_die(_("Track Information Window"), glade_file, NULL, NULL);
|
|
315
|
|
316 glade_xml_signal_autoconnect(xml);
|
|
317
|
|
318 fileinfo_win = glade_xml_get_widget(xml, "fileinfo_win");
|
|
319 g_object_set_data(G_OBJECT(fileinfo_win), "glade-xml", xml);
|
|
320 gtk_window_set_transient_for(GTK_WINDOW(fileinfo_win), GTK_WINDOW(mainwin));
|
|
321
|
|
322 widget = glade_xml_get_widget(xml, "image_artwork");
|
|
323 gtk_image_set_from_file(GTK_IMAGE(widget), DATA_DIR "/images/audio.png");
|
|
324
|
|
325 widget = glade_xml_get_widget(xml, "btn_close");
|
|
326 g_signal_connect(G_OBJECT(widget), "clicked", (GCallback) fileinfo_hide, NULL);
|
|
327 }
|
|
328
|
|
329 void
|
|
330 create_filepopup_window(void)
|
|
331 {
|
|
332 const gchar *glade_file = DATA_DIR "/glade/fileinfo_popup.glade";
|
|
333 GladeXML *xml;
|
|
334 GtkWidget *widget;
|
|
335
|
|
336 xml = glade_xml_new_or_die(_("Track Information Popup"), glade_file, NULL, NULL);
|
|
337
|
|
338 glade_xml_signal_autoconnect(xml);
|
|
339
|
|
340 filepopup_win = glade_xml_get_widget(xml, "win_pl_popup");
|
|
341 g_object_set_data(G_OBJECT(filepopup_win), "glade-xml", xml);
|
|
342 gtk_window_set_transient_for(GTK_WINDOW(filepopup_win), GTK_WINDOW(mainwin));
|
|
343
|
|
344 widget = glade_xml_get_widget(xml, "image_artwork");
|
|
345 gtk_image_set_from_file(GTK_IMAGE(widget), DATA_DIR "/images/audio.png");
|
|
346
|
|
347 g_timeout_add(50, filepopup_pointer_check_iter, NULL);
|
|
348 }
|
|
349
|
|
350 void
|
|
351 fileinfo_show_for_tuple(TitleInput *tuple)
|
|
352 {
|
|
353 gchar *tmp = NULL;
|
|
354
|
|
355 if (tuple == NULL)
|
|
356 return;
|
|
357
|
|
358 gtk_widget_realize(fileinfo_win);
|
|
359
|
|
360 if (tuple->track_name)
|
|
361 fileinfo_entry_set_text("entry_title", tuple->track_name);
|
|
362 if (tuple->performer)
|
|
363 fileinfo_entry_set_text("entry_artist", tuple->performer);
|
|
364 if (tuple->album_name)
|
|
365 fileinfo_entry_set_text("entry_album", tuple->album_name);
|
|
366 if (tuple->comment)
|
|
367 fileinfo_entry_set_text("entry_comment", tuple->comment);
|
|
368 if (tuple->genre)
|
|
369 fileinfo_entry_set_text("entry_genre", tuple->genre);
|
|
370
|
|
371 tmp = g_strdup_printf("%s/%s", tuple->file_path, tuple->file_name);
|
|
372 if(tmp){
|
|
373 fileinfo_entry_set_text_free("entry_location", str_to_utf8(tmp));
|
|
374 g_free(tmp);
|
|
375 tmp = NULL;
|
|
376 }
|
|
377
|
|
378 if (tuple->year != 0)
|
|
379 fileinfo_entry_set_text_free("entry_year", g_strdup_printf("%d", tuple->year));
|
|
380
|
|
381 if (tuple->track_number != 0)
|
|
382 fileinfo_entry_set_text_free("entry_track", g_strdup_printf("%d", tuple->track_number));
|
|
383
|
|
384 tmp = fileinfo_recursive_get_image(tuple->file_path, tuple->file_name, 0);
|
|
385
|
|
386 if(tmp)
|
|
387 {
|
|
388 fileinfo_entry_set_image("image_artwork", tmp);
|
|
389 g_free(tmp);
|
|
390 }
|
|
391
|
|
392 gtk_widget_show(fileinfo_win);
|
|
393 }
|
|
394
|
|
395 static gboolean
|
|
396 has_front_cover_extension(const gchar *name)
|
|
397 {
|
|
398 char *ext;
|
|
399
|
|
400 ext = strrchr(name, '.');
|
|
401 if (!ext) {
|
|
402 /* No file extension */
|
|
403 return FALSE;
|
|
404 }
|
|
405
|
|
406 return g_strcasecmp(ext, ".jpg") == 0 ||
|
|
407 g_strcasecmp(ext, ".jpeg") == 0 ||
|
|
408 g_strcasecmp(ext, ".png") == 0;
|
|
409 }
|
|
410
|
|
411 static gboolean
|
|
412 cover_name_filter(const gchar *name, const gchar *filter, const gboolean ret_on_empty)
|
|
413 {
|
|
414 gboolean result = FALSE;
|
|
415 gchar **splitted;
|
|
416 gchar *current;
|
|
417 gchar *lname;
|
|
418 gint i;
|
|
419
|
|
420 if (!filter || strlen(filter) == 0) {
|
|
421 return ret_on_empty;
|
|
422 }
|
|
423
|
|
424 splitted = g_strsplit(filter, ",", 0);
|
|
425
|
|
426 lname = g_strdup(name);
|
|
427 g_strdown(lname);
|
|
428
|
|
429 for (i = 0; !result && (current = splitted[i]); i++) {
|
|
430 gchar *stripped = g_strstrip(g_strdup(current));
|
|
431 g_strdown(stripped);
|
|
432
|
|
433 result = result || strstr(lname, stripped);
|
|
434
|
|
435 g_free(stripped);
|
|
436 }
|
|
437
|
|
438 g_free(lname);
|
|
439 g_strfreev(splitted);
|
|
440
|
|
441 return result;
|
|
442 }
|
|
443
|
|
444 /* Check wether it's an image we want */
|
|
445 static gboolean
|
|
446 is_front_cover_image(const gchar *imgfile)
|
|
447 {
|
|
448 return cover_name_filter(imgfile, cfg.cover_name_include, TRUE) &&
|
|
449 !cover_name_filter(imgfile, cfg.cover_name_exclude, FALSE);
|
|
450 }
|
|
451
|
|
452 static gboolean
|
|
453 is_file_image(const gchar *imgfile, const gchar *file_name)
|
|
454 {
|
|
455 char *imgfile_ext, *file_name_ext;
|
|
456 size_t imgfile_len, file_name_len;
|
|
457
|
|
458 imgfile_ext = strrchr(imgfile, '.');
|
|
459 if (!imgfile_ext) {
|
|
460 /* No file extension */
|
|
461 return FALSE;
|
|
462 }
|
|
463
|
|
464 file_name_ext = strrchr(file_name, '.');
|
|
465 if (!file_name_ext) {
|
|
466 /* No file extension */
|
|
467 return FALSE;
|
|
468 }
|
|
469
|
|
470 imgfile_len = (imgfile_ext - imgfile);
|
|
471 file_name_len = (file_name_ext - file_name);
|
|
472
|
|
473 if (imgfile_len == file_name_len) {
|
|
474 return (g_ascii_strncasecmp(imgfile, file_name, imgfile_len) == 0);
|
|
475 } else {
|
|
476 return FALSE;
|
|
477 }
|
|
478 }
|
|
479
|
|
480 gchar*
|
|
481 fileinfo_recursive_get_image(const gchar* path,
|
|
482 const gchar* file_name, gint depth)
|
|
483 {
|
|
484 GDir *d;
|
|
485
|
|
486 if (cfg.recurse_for_cover && depth > cfg.recurse_for_cover_depth)
|
|
487 return NULL;
|
|
488
|
|
489 d = g_dir_open(path, 0, NULL);
|
|
490
|
|
491 if (d) {
|
|
492 const gchar *f;
|
|
493
|
|
494 if (cfg.use_file_cover && file_name) {
|
|
495 /* Look for images matching file name */
|
2328
|
496 while((f = g_dir_read_name(d))) {
|
2313
|
497 gchar *newpath = g_strconcat(path, "/", f, NULL);
|
|
498
|
|
499 if (!g_file_test(newpath, G_FILE_TEST_IS_DIR) &&
|
|
500 has_front_cover_extension(f) &&
|
|
501 is_file_image(f, file_name)) {
|
|
502 g_dir_close(d);
|
|
503 return newpath;
|
|
504 }
|
|
505
|
|
506 g_free(newpath);
|
|
507 }
|
|
508 g_dir_rewind(d);
|
|
509 }
|
|
510
|
|
511 /* Search for files using filter */
|
2328
|
512 while ((f = g_dir_read_name(d))) {
|
2313
|
513 gchar *newpath = g_strconcat(path, "/", f, NULL);
|
|
514
|
|
515 if (!g_file_test(newpath, G_FILE_TEST_IS_DIR) &&
|
|
516 has_front_cover_extension(f) &&
|
|
517 is_front_cover_image(f)) {
|
|
518 g_dir_close(d);
|
|
519 return newpath;
|
|
520 }
|
|
521
|
|
522 g_free(newpath);
|
|
523 }
|
|
524 g_dir_rewind(d);
|
|
525
|
|
526 /* checks whether recursive or not. */
|
|
527 if (!cfg.recurse_for_cover) {
|
|
528 g_dir_close(d);
|
|
529 return NULL;
|
|
530 }
|
|
531
|
|
532 /* Descend into directories recursively. */
|
2328
|
533 while ((f = g_dir_read_name(d))) {
|
2313
|
534 gchar *newpath = g_strconcat(path, "/", f, NULL);
|
|
535
|
|
536 if(g_file_test(newpath, G_FILE_TEST_IS_DIR)) {
|
|
537 gchar *tmp = fileinfo_recursive_get_image(newpath,
|
|
538 NULL, depth + 1);
|
|
539 if(tmp) {
|
|
540 g_free(newpath);
|
|
541 g_dir_close(d);
|
|
542 return tmp;
|
|
543 }
|
|
544 }
|
|
545
|
|
546 g_free(newpath);
|
|
547 }
|
|
548
|
|
549 g_dir_close(d);
|
|
550 }
|
|
551
|
|
552 return NULL;
|
|
553 }
|
|
554
|
|
555 void
|
|
556 filepopup_show_for_tuple(TitleInput *tuple)
|
|
557 {
|
|
558 gchar *tmp = NULL;
|
|
559 gint x, y, x_off = 3, y_off = 3, h, w;
|
|
560
|
|
561 static gchar *last_artwork = NULL;
|
|
562 const static char default_artwork[] = DATA_DIR "/images/audio.png";
|
|
563
|
|
564 if (tuple == NULL)
|
|
565 return;
|
|
566
|
|
567 gtk_widget_realize(filepopup_win);
|
|
568
|
|
569 filepopup_entry_set_text("label_title", tuple->track_name);
|
|
570 filepopup_entry_set_text("label_artist", tuple->performer);
|
|
571 filepopup_entry_set_text("label_album", tuple->album_name);
|
|
572 filepopup_entry_set_text("label_genre", tuple->genre);
|
|
573
|
|
574 if (tuple->length != -1)
|
|
575 filepopup_entry_set_text_free("label_length", g_strdup_printf("%d:%02d", tuple->length / 60000, (tuple->length / 1000) % 60));
|
|
576
|
|
577 if (tuple->year != 0)
|
|
578 filepopup_entry_set_text_free("label_year", g_strdup_printf("%d", tuple->year));
|
|
579
|
|
580 if (tuple->track_number != 0)
|
|
581 filepopup_entry_set_text_free("label_track", g_strdup_printf("%d", tuple->track_number));
|
|
582
|
|
583 tmp = fileinfo_recursive_get_image(tuple->file_path, tuple->file_name, 0);
|
|
584 if (tmp) { // picture found
|
|
585 if (!last_artwork || strcmp(last_artwork, tmp)) { // new picture
|
|
586 filepopup_entry_set_image("image_artwork", tmp);
|
|
587 g_free(last_artwork);
|
|
588 last_artwork = tmp;
|
|
589 }
|
|
590 else { // same picture
|
|
591 }
|
|
592 }
|
|
593 else { // no picture found
|
|
594 if (!last_artwork || strcmp(last_artwork, default_artwork)) {
|
|
595 filepopup_entry_set_image("image_artwork", default_artwork);
|
|
596 g_free(last_artwork);
|
|
597 last_artwork = g_strdup(default_artwork);
|
|
598 }
|
|
599 else {
|
|
600 }
|
|
601 }
|
|
602
|
|
603 gdk_window_get_pointer(NULL, &x, &y, NULL);
|
|
604 gtk_window_get_size(GTK_WINDOW(filepopup_win), &w, &h);
|
|
605 if (gdk_screen_width()-(w+3) < x) x_off = (w*-1)-3;
|
|
606 if (gdk_screen_height()-(h+3) < y) y_off = (h*-1)-3;
|
|
607 gtk_window_move(GTK_WINDOW(filepopup_win), x + x_off, y + y_off);
|
|
608
|
|
609 gtk_widget_show(filepopup_win);
|
|
610 }
|
|
611
|
|
612 void
|
|
613 fileinfo_show_for_path(gchar *path)
|
|
614 {
|
|
615 TitleInput *tuple = input_get_song_tuple(path);
|
|
616
|
|
617 if (tuple == NULL)
|
|
618 return input_file_info_box(path);
|
|
619
|
|
620 fileinfo_show_for_tuple(tuple);
|
|
621
|
|
622 bmp_title_input_free(tuple);
|
|
623 tuple = NULL;
|
|
624 }
|