96#ifdef GDK_WINDOWING_QUARTZ
107#define DECORATION_SIZE_LIMIT 40
124 for(GList *iter = vm->
views; iter; iter = g_list_next(iter))
149 static const char *view_order[] = {
"lighttable",
"darkroom"};
150 static const int n_view_order = G_N_ELEMENTS(view_order);
154 const char *aname = av->name(av);
155 const char *bname = bv->name(bv);
156 int apos = n_view_order;
157 int bpos = n_view_order;
159 for(
int i = 0;
i < n_view_order;
i++)
166 const int order = apos - bpos;
167 return order ? order : strcmp(aname, bname);
185 g_strlcpy(module->module_name, module_name,
sizeof(module->module_name));
187#define INCLUDE_API_FROM_MODULE_LOAD "view_load_module"
191 module->vscroll_size = module->vscroll_viewport_size = 1.0;
192 module->hscroll_size = module->hscroll_viewport_size = 1.0;
193 module->vscroll_pos = module->hscroll_pos = 0.0;
194 module->height = module->width = 100;
196 if(module->init)
module->init(module);
206 if(
view->module) g_module_close(
view->module);
211 if(GTK_IS_CONTAINER(data))
212 gtk_container_remove(GTK_CONTAINER(data), widget);
225 if(GTK_IS_CONTAINER(evb))
227 gtk_widget_destroy(child);
237 gboolean switching_to_none = *view_name ==
'\0';
240 if(!switching_to_none)
242 for(GList *iter = vm->
views; iter; iter = g_list_next(iter))
245 if(!strcmp(
v->module_name, view_name))
286 if(old_view->leave) old_view->leave(old_view);
296 if(plugin->view_leave) plugin->view_leave(plugin, old_view, NULL);
297 plugin->gui_cleanup(plugin);
316 if(new_view->try_enter)
318 const int error = new_view->try_enter(new_view);
330 if(old_view->leave) old_view->leave(old_view);
340 if(plugin->view_leave) plugin->view_leave(plugin, old_view, new_view);
395 gboolean expanded =
FALSE;
397 if(plugin->expandable(plugin))
409 gtk_widget_show_all(plugin->
widget);
411 gtk_widget_hide(plugin->
widget);
413 if(plugin->view_enter) plugin->view_enter(plugin, old_view, new_view);
419 if(new_view->enter) new_view->enter(new_view);
446 int32_t pointerx, int32_t pointery)
464 float px = pointerx, py = pointery;
474 for(
const GList *plugins = g_list_last(
darktable.
lib->
plugins); plugins; plugins = g_list_previous(plugins))
479 if(plugin->gui_post_expose
498 gboolean handled =
FALSE;
501 plugins = g_list_previous(plugins))
507 if(plugin->mouse_leave(plugin)) handled =
TRUE;
511 if(!handled &&
v->mouse_leave)
v->mouse_leave(
v);
526 gboolean handled =
FALSE;
529 plugins = g_list_previous(plugins))
535 if(plugin->mouse_moved(plugin,
x, y, pressure, which)) handled =
TRUE;
539 if(!handled &&
v->mouse_moved)
v->mouse_moved(
v,
x, y, pressure, which);
548 gboolean handled =
FALSE;
551 plugins = g_list_previous(plugins))
557 if(plugin->key_pressed(plugin, event)) handled =
TRUE;
563 else if(
v->key_pressed)
564 v->key_pressed(
v, event);
575 gboolean handled =
FALSE;
578 plugins = g_list_previous(plugins))
584 if(plugin->button_released(plugin,
x, y, which,
state)) handled =
TRUE;
590 else if(
v->button_released)
591 v->button_released(
v,
x, y, which,
state);
607 gboolean handled =
FALSE;
611 plugins = g_list_previous(plugins))
617 if(plugin->button_pressed(plugin,
x, y, pressure, which,
type,
state)) handled =
TRUE;
620 if(handled)
return 1;
622 else if(
v->button_pressed)
623 return v->button_pressed(
v,
x, y, pressure, which,
type,
state);
630 for(GList *iter = vm->
views; iter; iter = g_list_next(iter))
671 cairo_surface_t **surface,
int zoom,
676 if(surface && *surface && cairo_surface_get_reference_count(*surface) > 0)
677 cairo_surface_destroy(*surface);
678 if(surface) *surface = NULL;
682 const int32_t imgid,
const int width,
const int height,
const int zoom)
691 params->fetcher = fetcher;
693 params->imgid = fetcher->
imgid;
694 params->width = fetcher->
width;
695 params->height = fetcher->
height;
696 params->zoom = fetcher->
zoom;
717 gboolean queue_redraw =
FALSE;
718 gboolean enqueue_next =
FALSE;
722 pthread_cond_broadcast(&fetcher->
cond);
753 gtk_widget_queue_draw(widget);
754 GdkWindow *window = gtk_widget_get_window(widget);
757 G_GNUC_BEGIN_IGNORE_DEPRECATIONS
758 gdk_window_process_updates(window,
TRUE);
759 G_GNUC_END_IGNORE_DEPRECATIONS
762 g_object_unref(widget);
775 return G_SOURCE_REMOVE;
786 if(stale || cancelled)
798 pthread_cond_broadcast(&fetcher->
cond);
804 cairo_surface_t *surface = NULL;
812 commit->
imgid = params->imgid;
813 commit->
width = params->width;
814 commit->
height = params->height;
815 commit->
zoom = params->zoom;
822 pthread_cond_broadcast(&fetcher->
cond);
827 g_main_context_wakeup(g_main_context_default());
835 pthread_cond_init(&fetcher->
cond, NULL);
857 g_main_context_iteration(g_main_context_default(),
TRUE);
862 pthread_cond_destroy(&fetcher->
cond);
891 const gboolean changed = fetcher->
target != target || fetcher->
imgid != imgid || fetcher->
width !=
width
894 const gboolean fallback_match = target && *target && fetcher->
cached_imgid == imgid
897 fetcher->
imgid = imgid;
900 fetcher->
zoom = zoom;
903 if(exact_match || fallback_match)
912 else if(changed && !exact_match && !fetcher->
destroying)
924 if(!src || dst_w <= 0 || dst_h <= 0)
927 const int src_w = cairo_image_surface_get_width(src);
928 const int src_h = cairo_image_surface_get_height(src);
930 cairo_surface_t *dst =
931 cairo_image_surface_create(CAIRO_FORMAT_RGB24, dst_w, dst_h);
933 cairo_t *cr = cairo_create(dst);
936 cairo_set_source_rgba(cr, 0, 0, 0, 0);
939 double scale_x = (
double)dst_w / src_w;
940 double scale_y = (
double)dst_h / src_h;
948 double s =
MIN(scale_x, scale_y);
951 tx = (dst_w - src_w * s) * 0.5;
952 ty = (dst_h - src_h * s) * 0.5;
955 cairo_translate(cr, tx, ty);
956 cairo_scale(cr, sx, sy);
958 cairo_set_source_surface(cr, src, 0, 0);
960 cairo_pattern_t *pat = cairo_get_source(cr);
961 cairo_pattern_set_filter(pat, CAIRO_FILTER_BEST);
962 cairo_pattern_set_extend(pat, CAIRO_EXTEND_PAD);
975 cairo_surface_flush(surface);
977 unsigned char *data = cairo_image_surface_get_data(surface);
978 int width = cairo_image_surface_get_width(surface);
979 int height = cairo_image_surface_get_height(surface);
980 int stride = cairo_image_surface_get_stride(surface);
987 const float k_center = 4.0f;
988 const float k_edge = -0.5f;
989 const float k_corner = -0.25f;
992 const float amount = 0.05f;
993 const float amount_inv = 1.f - amount;
996 for(
int y = 1; y <
height - 1; y++)
999 int idx = y * stride +
x * 4;
1001 for(
int c = 0; c < 3; c++)
1016 copy[
i - stride - 4] +
1017 copy[
i - stride + 4] +
1018 copy[
i + stride - 4] +
1019 copy[
i + stride + 4]
1023 const float out = amount_inv *
copy[
i] + amount *
v;
1024 data[
i] = (
unsigned char)(CLAMP(roundf(
out), 0.f, 255.f));
1027 data[idx + 3] =
copy[idx + 3];
1031 cairo_surface_mark_dirty(surface);
1035 cairo_surface_t **surface,
int zoom,
1045 if(*surface && cairo_surface_get_reference_count(*surface) > 0)
1046 cairo_surface_destroy(*surface);
1060 const int full_width = image->
width;
1061 const int full_height = image->
height;
1076 const int buf_wd = buf.
width;
1077 const int buf_ht = buf.
height;
1088 int img_width = buf_wd;
1089 int img_height = buf_ht;
1094 img_width = roundf(buf_wd * scale);
1095 img_height = roundf(buf_ht * scale);
1098 scale = fmaxf((
float)img_width / (
float)buf_wd, (
float)img_height / (
float)buf_ht);
1105 img_width = roundf(buf_wd * scale);
1106 img_height = roundf(buf_ht * scale);
1109 *surface = cairo_image_surface_create(CAIRO_FORMAT_RGB24, img_width, img_height);
1112 uint8_t *rgbbuf = (uint8_t *)calloc((
size_t)buf_wd * buf_ht * 4,
sizeof(uint8_t));
1121 gboolean alloc =
FALSE;
1144 INTENT_PERCEPTUAL, 0);
1148 if(alloc) cmsDeleteTransform(
transform);
1152 const int32_t stride = cairo_format_stride_for_width(CAIRO_FORMAT_RGB24, buf_wd);
1153 cairo_surface_t *tmp_surface = cairo_image_surface_create_for_data(rgbbuf, CAIRO_FORMAT_RGB24, buf_wd, buf_ht, stride);
1161 cairo_t *cr = cairo_create(*surface);
1162 cairo_scale(cr, scale, scale);
1163 cairo_set_source_surface(cr, tmp_surface, 0, 0);
1169 if((buf_wd <= 8 && buf_ht <= 8)
1170 || fabsf(scale - 1.0f) < 0.01f
1172 cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_NEAREST);
1174 cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_BEST);
1177 cairo_surface_destroy(tmp_surface);
1186 if(buf_wd <= 8 && buf_ht <= 8)
1202 "[dt_view_image_get_surface] id %i, mip code %i, dots %ix%i, mip %ix%i, surf %ix%i created in %0.04f sec\n",
1207 dt_print(
DT_DEBUG_IMAGEIO,
"[dt_view_image_get_surface] id %i, mip code %i, dots %ix%i, mip %ix%i, surf %ix%i\n", imgid, mip,
1208 width,
height, buf_wd, buf_ht, img_width, img_height);
1223 char* upcase = g_ascii_strup(
name, -1);
1225 if(0 == g_ascii_strcasecmp(upcase,
"JPG"))
1227 gchar* canonical = g_strdup(
"JPEG");
1231 else if(0 == g_ascii_strcasecmp(upcase,
"HDR"))
1233 gchar* canonical = g_strdup(
"RGBE");
1237 else if(0 == g_ascii_strcasecmp(upcase,
"TIF"))
1239 gchar* canonical = g_strdup(
"TIFF");
1246 gchar* fullname = g_strdup_printf(
"%s HDR", upcase);
1252 gchar* fullname = g_strdup_printf(
"%s B&W", upcase);
1257 fullname = g_strdup_printf(
"%s-", upcase);
1347void dt_view_map_center_on_bbox(
const dt_view_manager_t *vm, gdouble lon1, gdouble lat1, gdouble lon2, gdouble lat2)
1350 vm->
proxy.map.center_on_bbox(vm->
proxy.map.
view, lon1, lat1, lon2, lat2);
1359void dt_view_map_set_map_source(
const dt_view_manager_t *vm, OsmGpsMapSource_t map_source)
1402 vm->
proxy.print.print_settings(vm->
proxy.print.
view, pinfo, imgs);
1411 g_spawn_close_pid(pid);
1417 if(player && *player)
1422 char *argv[] = { player, filename, NULL };
1423 gboolean ret = g_spawn_async(NULL, argv, NULL,
1424 G_SPAWN_DO_NOT_REAP_CHILD
1425 | G_SPAWN_SEARCH_PATH
1426 | G_SPAWN_STDOUT_TO_DEV_NULL
1427 | G_SPAWN_STDERR_TO_DEV_NULL,
1480 char input_dir[512] = { 0 };
1481 gboolean from_cache =
TRUE;
static void error(char *msg)
void dt_atomic_set_int(dt_atomic_int *var, int value)
uint32_t container(dt_lib_module_t *self)
const char ** views(dt_lib_module_t *self)
static const dt_aligned_pixel_simd_t const dt_adaptation_t const float p
static void transform(float *x, float *o, const float *m, const float t_h, const float t_v)
const dt_colorspaces_color_profile_t * dt_colorspaces_get_profile(dt_colorspaces_color_profile_type_t type, const char *filename, dt_colorspaces_profile_direction_t direction)
void dt_colorspaces_transform_rgba8_to_bgra8(const cmsHTRANSFORM transform, const uint8_t *image_in, uint8_t *image_out, const int width, const int height)
@ DT_PROFILE_DIRECTION_DISPLAY
const dt_colormatrix_t dt_aligned_pixel_t out
char * dt_image_get_audio_path(const int32_t imgid)
void dt_image_full_path(const int32_t imgid, char *pathname, size_t pathname_len, gboolean *from_cache, const char *calling_func)
Get the full path of an image out of the database.
int dt_conf_get_bool(const char *name)
gchar * dt_conf_get_string(const char *name)
void dt_control_queue_redraw_center()
request redraw of center window. This redraws the center view within a gdk critical section to preven...
#define dt_control_change_cursor(cursor)
uint32_t view(const dt_view_t *self)
void * dt_alloc_align(size_t size)
void dt_print(dt_debug_thread_t thread, const char *msg,...)
static void dt_free_gpointer(gpointer ptr)
#define __OMP_PARALLEL_FOR__(...)
static double dt_get_wtime(void)
#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 int dt_pthread_mutex_unlock(dt_pthread_mutex_t *mutex) RELEASE(mutex) NO_THREAD_SAFETY_ANALYSIS
static int dt_pthread_mutex_init(dt_pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr)
static int dt_pthread_mutex_destroy(dt_pthread_mutex_t *mutex)
static int dt_pthread_cond_wait(pthread_cond_t *cond, dt_pthread_mutex_t *mutex)
static int dt_pthread_mutex_lock(dt_pthread_mutex_t *mutex) ACQUIRE(mutex) NO_THREAD_SAFETY_ANALYSIS
GtkWidget * dtgtk_expander_get_body_event_box(GtkDarktableExpander *expander)
GtkWidget * dtgtk_expander_get_body(GtkDarktableExpander *expander)
#define DTGTK_EXPANDER(obj)
#define DTGTK_IS_EXPANDER(obj)
void dt_ui_container_foreach(dt_ui_t *ui, const dt_ui_container_t c, GtkCallback callback)
calls a callback on all children widgets from container
void dt_ui_container_destroy_children(dt_ui_t *ui, const dt_ui_container_t c)
destroy all child widgets from container
void dt_gui_gtk_set_source_rgb(cairo_t *cr, dt_gui_color_t color)
void dt_gui_add_help_link(GtkWidget *widget, char *link)
GtkWidget * dt_ui_center(dt_ui_t *ui)
get the center drawable widget
GtkWidget * dt_ui_main_window(dt_ui_t *ui)
get the main window widget
void dt_image_cache_read_release(dt_image_cache_t *cache, const dt_image_t *img)
dt_image_t * dt_image_cache_get(dt_image_cache_t *cache, const int32_t imgid, char mode)
dt_job_state_t dt_control_job_get_state(_dt_job_t *job)
dt_job_t * dt_control_job_create(dt_job_execute_callback execute, const char *msg,...)
int dt_control_add_job(dt_control_t *control, dt_job_queue_t queue_id, _dt_job_t *job)
void * dt_control_job_get_params(const _dt_job_t *job)
void dt_control_job_set_params_with_size(dt_job_t *job, void *params, size_t params_size, dt_job_destroy_callback callback)
gboolean dt_lib_is_visible_in_view(dt_lib_module_t *module, const dt_view_t *view)
gboolean dt_lib_is_visible(dt_lib_module_t *module)
void dt_lib_gui_set_expanded(dt_lib_module_t *module, gboolean expanded)
void dt_lib_set_visible(dt_lib_module_t *module, gboolean visible)
GtkWidget * dt_lib_gui_get_expander(dt_lib_module_t *module)
dt_mipmap_size_t dt_mipmap_cache_get_matching_size(const dt_mipmap_cache_t *cache, const int32_t width, const int32_t height, const uint32_t imgid)
#define dt_mipmap_cache_get_with_shutdown(A, B, C, D, E, F, G)
#define dt_mipmap_cache_release(A, B)
GList * dt_module_load_modules(const char *subdir, size_t module_size, int(*load_module_so)(void *module, const char *libname, const char *plugin_name), void(*init_module)(void *module), gint(*sort_modules)(gconstpointer a, gconstpointer b))
void copy(double *dest, double *source, size_t num_el)
Copy a flat buffer.
void dt_sentry_record_module_usage(const char *category, const char *name)
#define DT_DEBUG_CONTROL_SIGNAL_RAISE(ctlsig, signal,...)
@ DT_SIGNAL_ACTIVE_IMAGES_CHANGE
This signal is raised when image shown in the main view change no param, no returned value.
@ DT_SIGNAL_CONTROL_TOAST_REDRAW
This signal is raised when dt_control_toast_redraw() is called. no param, no returned value.
@ DT_SIGNAL_VIEWMANAGER_VIEW_CANNOT_CHANGE
This signal is raised by viewmanager when a view has changed. 1 : dt_view_t * the old view 2 : dt_vie...
@ DT_SIGNAL_CONTROL_LOG_REDRAW
This signal is raised when dt_control_log_redraw() is called. no param, no returned value.
@ DT_SIGNAL_VIEWMANAGER_VIEW_CHANGED
This signal is raised by viewmanager when a view has changed. 1 : dt_view_t * the old view 2 : dt_vie...
struct _GtkWidget GtkWidget
char * dt_variables_expand(dt_variables_params_t *params, gchar *source, gboolean iterate)
void dt_variables_params_destroy(dt_variables_params_t *params)
void dt_variables_params_init(dt_variables_params_t **params)
const float uint32_t state[4]
struct dt_gui_gtk_t * gui
struct dt_colorspaces_t * color_profiles
struct dt_mipmap_cache_t * mipmap_cache
struct dt_control_signal_t * signals
struct dt_image_cache_t * image_cache
struct dt_view_manager_t * view_manager
struct dt_control_t * control
cmsHTRANSFORM transform_adobe_rgb_to_display
cmsHTRANSFORM transform_srgb_to_display
pthread_rwlock_t xprofile_lock
GtkWidget * has_scroll_focus
dt_colorspaces_color_profile_type_t color_space
Track one asynchronous Cairo surface fetch request for a GUI widget.
cairo_surface_t ** target
guint audio_player_event_source
struct dt_view_manager_t::@67 proxy
dt_darkroom_layout_t(* get_layout)(struct dt_view_t *view)
struct dt_view_manager_t::@66 audio
struct dt_view_manager_t::@67::@68 module_toolbox
struct dt_view_manager_t::@67::@70 darkroom
struct dt_lib_module_t *void(* add)(struct dt_lib_module_t *, GtkWidget *, dt_view_type_flags_t)
dt_view_image_surface_fetcher_t * fetcher
cairo_surface_t * surface
dt_view_surface_value_t result
dt_view_image_surface_fetcher_t * fetcher
void dt_telemetry_record_module_usage(const char *category, const char *name)
typedef double((*spd)(unsigned long int wavelength, double TempK))
A widget to manage and display image thumbnails in Ansel's lighttable and filmstrip views.
@ DT_THUMBTABLE_ZOOM_TWICE
@ DT_THUMBTABLE_ZOOM_FULL
@ DT_THUMBTABLE_ZOOM_HALF
void dt_undo_clear(dt_undo_t *self, uint32_t filter)
char * dt_get_help_url(char *name)
void dt_view_image_surface_fetcher_invalidate(dt_view_image_surface_fetcher_t *fetcher, cairo_surface_t **target)
void dt_view_manager_cleanup(dt_view_manager_t *vm)
void dt_view_image_surface_fetcher_cleanup(dt_view_image_surface_fetcher_t *fetcher)
static int dt_view_load_module(void *v, const char *libname, const char *module_name)
void dt_view_manager_mouse_moved(dt_view_manager_t *vm, double x, double y, double pressure, int which)
const char * dt_view_manager_name(dt_view_manager_t *vm)
void dt_view_manager_mouse_enter(dt_view_manager_t *vm)
void dt_view_manager_configure(dt_view_manager_t *vm, int width, int height)
void dt_view_manager_reset(dt_view_manager_t *vm)
static void _enqueue_surface_fetch(dt_view_image_surface_fetcher_t *fetcher)
void dt_view_image_surface_fetcher_init(dt_view_image_surface_fetcher_t *fetcher)
cairo_surface_t * dt_cairo_rescale_surface(cairo_surface_t *src, int dst_w, int dst_h)
void dt_cairo_sharpen_surface_rgb24(cairo_surface_t *surface)
static void _destroy_surface(cairo_surface_t **surface)
static void dt_view_unload_module(dt_view_t *view)
gboolean dt_view_active_images_has_imgid(int32_t imgid)
int dt_view_manager_button_released(dt_view_manager_t *vm, double x, double y, int which, uint32_t state)
void dt_view_manager_expose(dt_view_manager_t *vm, cairo_t *cr, int32_t width, int32_t height, int32_t pointerx, int32_t pointery)
int dt_view_manager_key_pressed(dt_view_manager_t *vm, GdkEventKey *event)
dt_view_surface_value_t dt_view_image_get_surface_async(dt_view_image_surface_fetcher_t *fetcher, int32_t imgid, int width, int height, cairo_surface_t **target, GtkWidget *widget, int zoom)
void dt_view_audio_start(dt_view_manager_t *vm, int32_t imgid)
void dt_view_manager_module_toolbox_add(dt_view_manager_t *vm, GtkWidget *tool, dt_view_type_flags_t views)
void dt_view_active_images_add(int32_t imgid, gboolean raise)
void dt_view_manager_init(dt_view_manager_t *vm)
void dt_view_active_images_reset(gboolean raise)
void dt_view_active_images_remove(int32_t imgid, gboolean raise)
int dt_view_manager_button_pressed(dt_view_manager_t *vm, double x, double y, double pressure, int which, int type, uint32_t state)
GList * dt_view_active_images_get_all()
static gboolean _view_surface_commit_main(gpointer user_data)
void dt_view_manager_gui_init(dt_view_manager_t *vm)
void dt_vm_remove_child(GtkWidget *widget, gpointer data)
static void _remove_child(GtkWidget *child, GtkContainer *container)
void dt_view_audio_stop(dt_view_manager_t *vm)
int dt_view_manager_switch(dt_view_manager_t *vm, const char *view_name)
static dt_view_surface_value_t _view_image_get_surface_internal(int32_t imgid, int width, int height, cairo_surface_t **surface, int zoom, dt_atomic_int *shutdown)
dt_view_surface_value_t dt_view_image_get_surface(int32_t imgid, int width, int height, cairo_surface_t **surface, int zoom)
int dt_view_manager_switch_by_view(dt_view_manager_t *vm, const dt_view_t *nv)
static void dt_view_manager_load_modules(dt_view_manager_t *vm)
static uint32_t default_flags()
static gboolean _view_surface_matches(const dt_view_image_surface_fetcher_t *fetcher, cairo_surface_t **target, const int32_t imgid, const int width, const int height, const int zoom)
static int32_t _view_surface_fetch_job_run(dt_job_t *job)
int dt_view_manager_scrolled(dt_view_manager_t *vm, double x, double y, int up, int state, int delta_y)
void dt_view_image_info_update(int32_t imgid)
void dt_view_manager_mouse_leave(dt_view_manager_t *vm)
static gint sort_views(gconstpointer a, gconstpointer b)
void dt_view_active_images_set(GList *images, gboolean raise)
int32_t dt_view_active_images_get_first()
dt_darkroom_layout_t dt_view_darkroom_get_layout(dt_view_manager_t *vm)
static void _audio_child_watch(GPid pid, gint status, gpointer data)
const dt_view_t * dt_view_manager_get_current_view(dt_view_manager_t *vm)
char * dt_view_extend_modes_str(const char *name, const gboolean is_hdr, const gboolean is_bw, const gboolean is_bw_flow)
@ DT_DARKROOM_LAYOUT_EDITING
void dt_ui_cleanup_main_table(dt_ui_t *ui)
void dt_ui_restore_panels(dt_ui_t *ui)
void dt_ui_set_image_info_label(dt_ui_t *ui, const char *label)
void dt_ui_container_add_widget(dt_ui_t *ui, const dt_ui_container_t c, GtkWidget *w)