70#ifdef GDK_WINDOWING_QUARTZ
89 g_dir_close(film->
dir);
137 if(*last ==
'/' && last != film->
dirname) *last =
'\0';
182 if(film->
id <= 0)
return 0;
189 GError *
error = NULL;
211 const int filmid = film->
id;
218 fprintf(stderr,
"[film_import] failed to open directory %s: %s\n", film->
dirname,
error->message);
250 if(handler) handler();
255 for(
const GList *iter = dirs; iter; iter = g_list_next(iter))
256 rmdir((
char *)iter->data);
269 r->
ids = g_list_prepend(
r->ids, GINT_TO_POINTER(
id));
270 r->folders = g_list_prepend(
r->folders, g_strdup(
folder));
284 gchar *
final = g_strcmp0(
folder,
r->old_path)
285 ? g_strdup_printf(
"%s/%s",
r->new_path,
folder + strlen(
r->old_path) + 1)
286 : g_strdup(
r->new_path);
287 r->ids = g_list_prepend(
r->ids, GINT_TO_POINTER(
id));
288 r->folders = g_list_prepend(
r->folders,
final);
294 GList *empty_dirs = NULL;
296 gboolean raise_signal =
FALSE;
301 rolls.
ids = g_list_reverse(rolls.
ids);
304 for(GList *
i = rolls.
ids, *
f = rolls.
folders;
i &&
f;
i = g_list_next(
i),
f = g_list_next(
f))
307 const gchar *
folder = (
const gchar *)
f->data;
312 if(ask_before_rmdir) empty_dirs = g_list_prepend(empty_dirs, g_strdup(
folder));
316 g_list_free(rolls.
ids);
317 g_list_free_full(rolls.
folders, g_free);
323 empty_dirs = g_list_reverse(empty_dirs);
344 gboolean remove_ok =
TRUE;
348 for(GList *l = imgids; l; l = g_list_next(l))
360 dt_control_log(_(
"cannot remove film roll having local copies with non accessible originals"));
365 for(GList *l = imgids; l; l = g_list_next(l))
367 const int32_t imgid = GPOINTER_TO_INT(l->data);
388 reloc.
ids = g_list_reverse(reloc.
ids);
391 for(GList *
i = reloc.
ids, *
f = reloc.
folders;
i &&
f;
i = g_list_next(
i),
f = g_list_next(
f))
394 g_list_free(reloc.
ids);
395 g_list_free_full(reloc.
folders, g_free);
static void error(char *msg)
typedef void((*dt_cache_allocate_t)(void *userdata, dt_cache_entry_t *entry))
void dt_collection_update_query(const dt_collection_t *collection, dt_collection_change_t query_change, dt_collection_properties_t changed_property, GList *list)
dt_collection_t * dt_collection_get_global(void)
@ DT_COLLECTION_PROP_UNDEF
@ DT_COLLECTION_CHANGE_NEW_QUERY
int dt_conf_get_bool(const char *name)
void dt_conf_set_int(const char *name, int val)
void dt_conf_set_string(const char *name, const char *val)
int dt_image_local_copy_reset(const int32_t imgid)
gboolean dt_image_safe_remove(const int32_t imgid)
void dt_control_log(const char *msg,...)
void dt_control_queue_redraw_center()
Request a redraw of the centre view.
struct dt_control_t * dt_control_get_global(void)
struct dt_view_manager_t * dt_view_manager_get_global(void)
const char * dt_database_get_last_error(void)
gchar * directory
documentation root given after –doc, or NULL
GtkWidget * folder
destination folder chooser
static int dt_pthread_mutex_init(dt_pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr)
Initialise a mutex. With mutexattr NULL – which is how 54 of the 56 call sites in this tree spell it ...
static int dt_pthread_mutex_destroy(dt_pthread_mutex_t *mutex)
void dt_film_init(dt_film_t *film)
void dt_film_relocate(const char *old_path, const char *new_path)
gboolean dt_film_is_empty(const int id)
int dt_film_new(dt_film_t *film, const char *directory)
void dt_film_set_rolls_changed_handler(dt_film_rolls_changed_handler_t handler)
Install the handler, or NULL to remove it.
void dt_film_remove_empty()
void dt_film_remove(const int id)
static void _record_folder_status(void *user_data, const int32_t id, const char *folder)
int32_t dt_film_get_id(const char *folder)
static void _collect_empty_roll(void *user_data, const int32_t id, const char *folder)
void dt_film_set_query(const int32_t id)
static dt_film_confirm_rmdir_handler_t _confirm_rmdir_handler
static void _collect_relocation(void *user_data, const int32_t id, const char *folder)
GList * dt_film_get_image_ids(const int filmid)
void dt_film_remove_directories(const GList *dirs)
int dt_film_open(const int32_t id)
void dt_film_set_folder_status()
static dt_film_rolls_changed_handler_t _rolls_changed_handler
void dt_film_set_confirm_rmdir_handler(dt_film_confirm_rmdir_handler_t handler)
int dt_film_import(const char *dirname)
void dt_film_cleanup(dt_film_t *film)
void dt_film_notify_rolls_changed(void)
State that the film-roll list changed.
void(* dt_film_rolls_changed_handler_t)(void)
The film-roll list changed. Raised on whichever thread changed it; a handler that touches widgets get...
void(* dt_film_confirm_rmdir_handler_t)(GList *empty_dirs)
dt_job_t * dt_film_import1_create(dt_film_t *film)
char * dt_film_repository_get_folder(const int32_t id)
gboolean dt_film_repository_insert(const char *folder)
void dt_film_repository_foreach_empty(dt_film_repository_row_cb cb, void *user_data)
gboolean dt_film_repository_has_images(const int32_t id)
void dt_film_repository_foreach_under(const char *path, dt_film_repository_row_cb cb, void *user_data)
int32_t dt_film_repository_find_by_folder(const char *folder)
gboolean dt_film_repository_touch_access(const int32_t id)
void dt_film_repository_foreach(dt_film_repository_row_cb cb, void *user_data)
gboolean dt_film_repository_set_folder(const int32_t id, const char *folder)
gboolean dt_film_repository_delete(const int32_t id)
void dt_film_repository_folder_status_set(const int32_t id, const gboolean present)
GList * dt_film_repository_get_image_ids(const int32_t filmid)
void dt_film_repository_folder_status_clear(void)
void dt_image_cache_remove(const int32_t imgid)
int dt_control_add_job(dt_control_t *control, dt_job_queue_t queue_id, _dt_job_t *job)
void dt_print(dt_debug_thread_t thread, const char *msg,...) __attribute__((format(printf
Print to stdout when thread is enabled, prefixed with seconds since startup.
#define IS_NULL_PTR(p)
C is way too permissive with !=, == and if(var) checks, which can mean too many things depending on w...
static void dt_free_gpointer(gpointer ptr)
g_free() one pointer, with the signature GDestroyNotify wants.
#define dt_free(ptr)
g_free() ptr and set it to NULL, skipping both if it is already NULL.
void dt_mipmap_cache_remove(const int32_t imgid, const gboolean flush_disk)
#define DT_DEBUG_CONTROL_SIGNAL_RAISE(ctlsig, signal,...)
struct dt_control_signal_t * dt_control_signal_get_global(void)
@ DT_SIGNAL_FILMROLLS_REMOVED
This signal is raised only when a filmroll is removed.
dt_pthread_mutex_t images_mutex
gboolean dt_util_is_dir_empty(const char *dirname)
void dt_view_manager_reset(dt_view_manager_t *vm)