58 static pthread_mutex_t
mutex = PTHREAD_MUTEX_INITIALIZER;
59 static pthread_cond_t
cond = PTHREAD_COND_INITIALIZER;
76 GDK_WINDOW_TYPE_HINT_DIALOG);
77 gtk_window_set_title ((GtkWindow *)
status_window,
_(
"Searching ..."));
79 gtk_container_set_border_width ((GtkContainer *)
status_window, 6);
81 GtkWidget * vbox = gtk_vbox_new (
FALSE, 6);
85 #if GTK_CHECK_VERSION (3, 0, 0)
92 PANGO_ELLIPSIZE_MIDDLE);
96 #if GTK_CHECK_VERSION (3, 0, 0)
110 pthread_mutex_lock (&
mutex);
113 snprintf (scratch,
sizeof scratch, dngettext (PACKAGE,
"%d file found",
118 printf (
"Searching, %s ...\r", scratch);
127 pthread_mutex_unlock (&
mutex);
133 pthread_mutex_lock (&
mutex);
141 pthread_mutex_unlock (&
mutex);
161 for (
int i = 0; i < count; i ++)
170 for (
int i = 0; i < count; i ++)
232 g_return_if_fail (filename);
233 if (filter && ! filter (filename, user))
241 if (! tuple && ! decoder)
244 if (validate && ! decoder)
259 for (
int sub = 0; sub < n_subtunes; sub ++)
261 char * subname =
str_printf (
"%s?%d", filename,
279 g_return_if_fail (filename);
280 if (filter && ! filter (filename, user))
295 if (unix_name[strlen (unix_name) - 1] ==
'/')
296 unix_name[strlen (unix_name) - 1] = 0;
298 GList * files =
NULL;
299 DIR * folder = opendir (unix_name);
303 struct dirent *
entry;
304 while ((entry = readdir (folder)))
306 if (entry->d_name[0] !=
'.')
307 files = g_list_prepend (files, g_strdup_printf (
"%s"
308 G_DIR_SEPARATOR_S
"%s", unix_name, entry->d_name));
317 if (stat (files->data, & info) < 0)
320 if (S_ISREG (info.st_mode))
329 else if (S_ISDIR (info.st_mode))
340 g_free (files->data);
341 files = g_list_delete_link (files, files);
352 g_return_if_fail (filename);
353 if (filter && ! filter (filename, user))
363 if (!
playlist_load (filename, & title, & filenames, & tuples))
370 for (
int i = 0; i < count; i ++)
372 NULL, NULL, filter, user, result,
FALSE);
384 g_return_if_fail (filename);
398 pthread_mutex_lock (&
mutex);
410 if (result->
at < 0 || result->
at > count)
441 pthread_mutex_unlock (&
mutex);
449 pthread_mutex_lock (&
mutex);
463 pthread_mutex_unlock (&
mutex);
472 for (
int i = 0; i < count; i ++)
485 pthread_mutex_lock (&
mutex);
494 pthread_mutex_unlock (&
mutex);
500 pthread_mutex_lock (&
mutex);
503 pthread_mutex_unlock (&
mutex);
508 pthread_mutex_lock (&
mutex);
510 pthread_cond_broadcast (&
cond);
511 pthread_mutex_unlock (&
mutex);
545 g_return_if_fail (playlist_id >= 0);
549 pthread_mutex_lock (&
mutex);
551 pthread_cond_broadcast (&
cond);
552 pthread_mutex_unlock (&
mutex);
558 g_return_val_if_fail (playlist_id >= 0,
FALSE);
560 pthread_mutex_lock (&
mutex);
562 for (GList * node =
add_tasks; node; node = node->next)
564 if (((
AddTask *) node->data)->playlist_id == playlist_id)
571 for (GList * node =
add_results; node; node = node->next)
573 if (((
AddResult *) node->data)->playlist_id == playlist_id)
577 pthread_mutex_unlock (&
mutex);
581 pthread_mutex_unlock (&
mutex);