95#ifdef GDK_WINDOWING_QUARTZ
106#define DECORATION_SIZE_LIMIT 40
117 vm->audio.audio_player_id = -1;
141 return vm->current_view;
148 static const char *
view_order[] = {
"lighttable",
"darkroom"};
186#define INCLUDE_API_FROM_MODULE_LOAD "view_load_module"
190 module->vscroll_size = module->vscroll_viewport_size = 1.0;
191 module->hscroll_size = module->hscroll_viewport_size = 1.0;
192 module->vscroll_pos = module->hscroll_pos = 0.0;
193 module->height = module->width = 100;
195 if(
module->init)
module->init(module);
394 gboolean expanded =
FALSE;
438 if(
vm->current_view->name)
439 return vm->current_view->name(
vm->current_view);
441 return vm->current_view->module_name;
447 return vm->current_view->flags();
459 vm->current_view->width =
width;
462 if(
vm->current_view->expose)
475 vm->current_view->expose(
vm->current_view, cr,
vm->current_view->width,
vm->current_view->height, px, py);
484 if(
plugin->gui_post_expose
486 plugin->gui_post_expose(
plugin, cr,
vm->current_view->width,
vm->current_view->height, px, py);
494 if(
vm->current_view->reset)
vm->current_view->reset(
vm->current_view);
516 if(!
handled &&
v->mouse_leave)
v->mouse_leave(
v);
522 if(
vm->current_view->mouse_enter)
vm->current_view->mouse_enter(
vm->current_view);
544 if(!
handled &&
v->mouse_moved)
v->mouse_moved(
v,
x, y, pressure, which);
568 else if(
v->key_pressed)
595 else if(
v->button_released)
596 v->button_released(
v,
x, y, which,
state);
627 else if(
v->button_pressed)
628 return v->button_pressed(
v,
x, y, pressure, which,
type,
state);
648 if(
vm->current_view->scrolled)
683 if(surface) *surface =
NULL;
687 const int32_t imgid,
const int width,
const int height,
const int zoom)
696 params->fetcher = fetcher;
815 commit->fetcher = fetcher;
821 commit->surface = surface;
902 const gboolean changed = fetcher->
target != target || fetcher->
imgid != imgid || fetcher->
width !=
width
908 fetcher->
imgid = imgid;
911 fetcher->
zoom = zoom;
959 double s =
MIN(scale_x, scale_y);
999 const float k_edge = -0.5f;
1003 const float amount = 0.05f;
1007 for(
int y = 1; y <
height - 1; y++)
1010 int idx = y * stride +
x * 4;
1012 for(
int c = 0; c < 3; c++)
1027 copy[
i - stride - 4] +
1028 copy[
i - stride + 4] +
1029 copy[
i + stride - 4] +
1030 copy[
i + stride + 4]
1038 data[idx + 3] =
copy[idx + 3];
1121 scale =
fmaxf((
float)img_width / (
float)
buf_wd, (
float)img_height / (
float)
buf_ht);
1167 ||
fabsf(scale - 1.0f) < 0.01f
1199 "[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",
1204 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,
1226 gchar* canonical =
g_strdup(
"JPEG");
1232 gchar* canonical =
g_strdup(
"RGBE");
1238 gchar* canonical =
g_strdup(
"TIFF");
1271 vm->active_images =
NULL;
1318 &&
vm->active_images != images)
1323 vm->active_images = images;
1331 if(
vm->proxy.module_toolbox.module)
1332 vm->proxy.module_toolbox.add(
vm->proxy.module_toolbox.module,
tool,
views);
1337 if(
vm->proxy.darkroom.view)
1338 return vm->proxy.darkroom.get_layout(
vm->proxy.darkroom.view);
1346 if(
vm->proxy.map.view)
1347 vm->proxy.map.center_on_location(
vm->proxy.map.view,
lon,
lat, zoom);
1352 if(
vm->proxy.map.view)
1353 vm->proxy.map.center_on_bbox(
vm->proxy.map.view, lon1, lat1, lon2, lat2);
1358 if(
vm->proxy.map.view)
1359 vm->proxy.map.show_osd(
vm->proxy.map.view);
1364 if(
vm->proxy.map.view)
1365 vm->proxy.map.set_map_source(
vm->proxy.map.view, map_source);
1370 if(
vm->proxy.map.view)
1371 return vm->proxy.map.add_marker(
vm->proxy.map.view,
type, points);
1377 if(
vm->proxy.map.view)
1378 return vm->proxy.map.remove_marker(
vm->proxy.map.view,
type, marker);
1383 if(
vm->proxy.map.view)
1384 vm->proxy.map.add_location(
vm->proxy.map.view,
p,
posid);
1389 if(
vm->proxy.map.view)
1390 vm->proxy.map.location_action(
vm->proxy.map.view,
action);
1395 if(
vm->proxy.map.view)
1396 vm->proxy.map.redraw(
vm->proxy.map.view);
1404 if (
vm->proxy.print.view)
1405 vm->proxy.print.print_settings(
vm->proxy.print.view, pinfo, imgs);
1432 &
vm->audio.audio_player_pid,
NULL);
1436 vm->audio.audio_player_id = imgid;
1437 vm->audio.audio_player_event_source
1441 vm->audio.audio_player_id = -1;
1452 if(
vm->audio.audio_player_id == -1)
1460 if(
vm->audio.audio_player_id != -1)
1469 vm->audio.audio_player_id = -1;
GtkWidget * dt_gui_main_window(void)
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
struct dt_ui_t * dt_gui_get_ui(void)
GtkWidget * dt_gui_center_widget(void)
void dt_gui_add_help_link(GtkWidget *widget, char *link)
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)
gboolean dt_colorprofiles_rgba8_to_display_bgra8(const uint8_t *const in, uint8_t *const out, const int width, const int height, const dt_colorspaces_color_profile_type_t src_space)
Convert a whole 8-bit plane from src_space to the display profile: packed RGBA8 in,...
struct _GtkWidget GtkWidget
GtkWidget, opaque, spelled exactly as GTK spells it.
const dt_colormatrix_t dt_aligned_pixel_t out
int dt_conf_get_bool(const char *name)
gchar * dt_conf_get_string(const char *name)
Read the stored string for name as a private copy.
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.
void dt_control_queue_redraw_center()
Request a redraw of the centre view.
#define dt_control_change_cursor(cursor)
struct dt_control_t * dt_control_get_global(void)
struct dt_lib_t * dt_lib_get_global(void)
struct dt_view_manager_t * dt_view_manager_get_global(void)
void * dt_alloc_align(size_t size)
Allocate cacheline-aligned memory.
struct dt_gui_gtk_t * dt_gui_get_global(void)
GtkWidget * status
result of the last capture
GtkWidget * view
the tree view
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)
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)
static int dt_pthread_cond_wait(pthread_cond_t *cond, dt_pthread_mutex_t *mutex)
Wait on cond, releasing mutex for the duration.
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)
dt_image_t * dt_image_cache_get(const int32_t imgid, char mode)
void dt_image_cache_read_release(const dt_image_t *img)
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)
static const dt_iop_drawlayer_params_t * params
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)
_lib_location_type_t type
int32_t dt_get_debug_flags(void)
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...
#define dt_free_align(ptr)
Release memory from dt_alloc_align() and set ptr to NULL.
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.
dt_mipmap_size_t dt_mipmap_cache_get_matching_size(const int32_t width, const int32_t height, const uint32_t imgid)
#define dt_mipmap_cache_get_with_shutdown(B, C, D, E, F, G)
#define dt_mipmap_cache_release(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))
Load every module the given directory's manifest lists.
#define __OMP_PARALLEL_FOR__(...)
void copy(TYPE *dest, TYPE *source, size_t num_el)
Copy a flat buffer used to initialize test matrices.
void dt_sentry_record_module_usage(const char *category, const char *name)
#define DT_DEBUG_CONTROL_SIGNAL_RAISE(ctlsig, signal,...)
struct dt_control_signal_t * dt_control_signal_get_global(void)
@ 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...
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]
dt_colorspaces_color_profile_type_t color_space
Track one asynchronous Cairo surface fetch request for a GUI widget.
cairo_surface_t ** target
struct dt_view_manager_t::@60 audio
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_supervisor_thumbnail(const dt_sv_op_t op, const int32_t imgid, const int width, const int height, const int mip, const gboolean success)
static gboolean dt_supervisor_active(void)
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
static double dt_get_wtime(void)
void dt_undo_clear(dt_undo_t *self, uint32_t filter)
dt_undo_t * dt_undo_get_global(void)
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_map_center_on_location(const dt_view_manager_t *vm, gdouble lon, gdouble lat, gdouble zoom)
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)
void dt_view_map_location_action(const dt_view_manager_t *vm, const int action)
cairo_surface_t * dt_cairo_rescale_surface(cairo_surface_t *src, int dst_w, int dst_h)
void dt_view_map_redraw(const dt_view_manager_t *vm)
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)
GObject * dt_view_map_add_marker(const dt_view_manager_t *vm, dt_geo_map_display_t type, GList *points)
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)
void dt_view_map_show_osd(const dt_view_manager_t *vm)
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)
uint32_t dt_view_manager_current_flags(const dt_view_manager_t *vm)
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_map_add_location(const dt_view_manager_t *vm, dt_map_location_data_t *p, const guint posid)
void dt_view_print_settings(const dt_view_manager_t *vm, dt_print_info_t *pinfo, dt_images_box *imgs)
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)
void dt_view_map_center_on_bbox(const dt_view_manager_t *vm, gdouble lon1, gdouble lat1, gdouble lon2, gdouble lat2)
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_map_set_map_source(const dt_view_manager_t *vm, OsmGpsMapSource_t map_source)
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()
gboolean dt_view_map_remove_marker(const dt_view_manager_t *vm, dt_geo_map_display_t type, GObject *marker)
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)