99#ifdef GDK_WINDOWING_QUARTZ
114#define DT_IOP_HEADER_MENU_OPEN "dt-module-header-menu-open"
115#define DT_IOP_HEADER_MENU_DISMISS_CLICK "dt-module-header-menu-dismiss-click"
116#define DT_IOP_HEADER_IGNORE_RELEASE "dt-module-header-ignore-release"
125 GdkModifierType modifier, gpointer data);
127 GdkModifierType modifier, gpointer data);
259 module->op, (
void *)picker, (
void *)pipe, piece ? piece->
global_hash : 0);
291 const void *
const i,
void *
const o)
318 size_t param_size =
module->so->get_introspection()->size;
319 module->params_size = param_size;
325 module->params = NULL;
330 module->default_params = NULL;
332 module->params = (dt_iop_params_t *)calloc(1, param_size);
333 module->default_params = (dt_iop_params_t *)calloc(1, param_size);
335 module->default_enabled = 0;
336 module->gui_data = NULL;
341 switch(
i->header.type)
344 *(
float*)((uint8_t *)
module->default_params + i->header.offset) = i->Float.Default;
347 *(
int*)((uint8_t *)
module->default_params + i->header.offset) = i->Int.Default;
350 *(
unsigned int*)((uint8_t *)
module->default_params + i->header.offset) = i->UInt.Default;
353 *(
unsigned short*)((uint8_t *)
module->default_params + i->header.offset) = i->UShort.Default;
356 *(
int*)((uint8_t *)
module->default_params + i->header.offset) = i->Enum.Default;
359 *(gboolean*)((uint8_t *)
module->default_params + i->header.offset) = i->Bool.Default;
362 *(
char*)((uint8_t *)
module->default_params + i->header.offset) = i->Char.Default;
365 memset((uint8_t *)
module->default_params +
i->header.offset, 0,
i->header.size);
374 int8_t *
p = (int8_t *)
module->default_params +
i->header.offset;
381 size_t num_ints =
i->header.size /
sizeof(int);
383 int *
p = (
int *)((uint8_t *)
module->default_params + i->header.offset);
393 fprintf(
stderr,
"unsupported introspection type \"%s\" encountered in dt_iop_default_init (field %s)\n",
i->header.type_name,
i->header.field_name);
426#define INCLUDE_API_FROM_MODULE_LOAD "iop_load_module"
430 if(
IS_NULL_PTR(
module->modify_roi_in))
module->modify_roi_in = _iop_modify_roi_in;
431 if(
IS_NULL_PTR(
module->modify_roi_out))
module->modify_roi_out = _iop_modify_roi_out;
434 if(
IS_NULL_PTR(
module->process_tiling_cl))
module->process_tiling_cl = darktable.opencl->inited ? default_process_tiling_cl : NULL;
438 module->process_plain = module->process;
439 module->process = default_process;
444 module->have_introspection = FALSE;
445 if(
module->introspection_init)
450 module->have_introspection = TRUE;
459 fprintf(
stderr,
"[iop_load_module] failed to initialize introspection for operation `%s'\n", module_name);
462 if(
module->init_global)
module->init_global(module);
469 module->widget = NULL;
470 module->header = NULL;
472 module->hide_enable_button = 0;
473 module->request_color_pick = DT_REQUEST_COLORPICK_OFF;
474 module->request_histogram = DT_REQUEST_ONLY_IN_GUI;
475 module->histogram_stats.bins_count = 0;
476 module->histogram_stats.pixels = 0;
477 module->multi_priority = 0;
478 module->iop_order = 0;
479 for(
int k = 0;
k < 3;
k++)
481 module->picked_color[k] = module->picked_output_color[k] = 0.0f;
482 module->picked_color_min[k] = module->picked_output_color_min[k] = 666.0f;
483 module->picked_color_max[k] = module->picked_output_color_max[k] = -666.0f;
485 module->histogram_cst = IOP_CS_NONE;
486 module->histogram = NULL;
487 module->histogram_max[0] = module->histogram_max[1] = module->histogram_max[2] = module->histogram_max[3]
489 module->histogram_middle_grey = FALSE;
490 module->request_mask_display = DT_DEV_PIXELPIPE_DISPLAY_NONE;
491 module->bypass_cache = FALSE;
492 module->enabled = module->default_enabled = module->workflow_enabled = 0;
494 module->raster_mask.source.users = g_hash_table_new(NULL, NULL);
495 module->raster_mask.source.masks = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, dt_free_gpointer);
496 module->raster_mask.sink.source = NULL;
497 module->raster_mask.sink.id = 0;
500 module->module = so->module;
503#define INCLUDE_API_FROM_MODULE_LOAD_BY_SO
506 module->version = so->version;
507 module->process_plain = so->process_plain;
508 module->have_introspection = so->have_introspection;
510 module->reset_button = NULL;
511 module->presets_button = NULL;
512 module->fusion_slider = NULL;
514 module->global_data = so->data;
517 module->init(module);
518 module->hash = DT_PIXELPIPE_CACHE_HASH_INVALID;
519 module->blendop_hash = DT_PIXELPIPE_CACHE_HASH_INVALID;
521 if(
module->params_size == 0)
523 fprintf(
stderr,
"[iop_load_module] `%s' needs to have a params size > 0!\n", so->
op);
530 module->params = calloc(1, module->params_size);
532 module->default_params = calloc(1, module->params_size);
533 module->blend_params = calloc(1, sizeof(dt_develop_blend_params_t));
534 module->default_blendop_params = calloc(1, sizeof(dt_develop_blend_params_t));
542 module->common_fields.name = delete_underscore(module->name());
543 module->common_fields.view = g_strdup(_("Darkroom"));
547 module->common_fields.name = NULL;
548 module->common_fields.view = NULL;
550 module->common_fields.widget_list = NULL;
551 module->common_fields.widget_list_bh = NULL;
552 module->common_fields.focus = module->iop_focus;
553 module->common_fields.deprecated = (module->flags() & IOP_FLAGS_DEPRECATED) == IOP_FLAGS_DEPRECATED;
561 module->init_pipe(module, pipe, piece);
584 "[dt_iop_cleanup_pipe] missing module, skipping module pipe cleanup\n");
589 "[dt_iop_cleanup_pipe] missing pipe for `%s`, skipping module pipe cleanup\n",
611 "[dt_iop_cleanup_pipe] invalid shared-object descriptor %p, skipping module pipe cleanup\n",
615 "[dt_iop_cleanup_pipe] stale cleanup callback for `%s`, skipping module pipe cleanup\n",
645 else if(
mod->instance ==
module->instance)
659 const gboolean
is_zero = (
module->multi_priority == 0);
693 if(!hist || !hist->module)
698 if(hist->module->instance ==
module->instance && hist->module !=
module)
700 first = hist->module;
828 module->blend_params->mask_id = 0;
839 if(
module->dev->gui_attached)
900 module->multi_name[0] = module->multi_name[sizeof(module->multi_name) - 1];
901 module->multi_name[sizeof(module->multi_name) - 1] = 0;
912 module->multi_name[0] = 0;
921 module->multi_name[0] = module->multi_name[sizeof(module->multi_name) - 1];
922 module->multi_name[sizeof(module->multi_name) - 1] = 0;
967 module->multi_name[sizeof(module->multi_name) - 1] = module->multi_name[0];
968 module->multi_name[0] = 0;
1022 else if(!
IS_NULL_PTR(event) && event->button == 2)
1086 module->enabled = 1;
1093 module->enabled = 0;
1097 module->dev->proxy.chroma_adaptation = NULL;
1118 g_debug(
"Module '%s' is not hidden and lacks implementation of gui_init()...",
module->op);
1119 else if(!
module->gui_cleanup)
1120 g_debug(
"Module '%s' is not hidden and lacks implementation of gui_cleanup()...",
module->op);
1153 if(
mod->instance_name)
1169 mod->instance_name);
1191 if(
module->default_enabled &&
module->hide_enable_button)
1195 else if(!
module->default_enabled &&
module->hide_enable_button)
1212 if(
module->hide_enable_button)
1219 if(
module->hide_enable_button)
1222 module->enabled ?
"dt_iop_enable_forced_on" :
"dt_iop_enable_forced_off");
1243 const gchar *
const main_scope =
_(
"Darkroom/Modules");
1258 if(
module->gui_init)
module->gui_init(module);
1259 if(
module->color_picker_apply)
1271 if(
module->reload_defaults)
1278 module->reload_defaults(module);
1283 fprintf(
stderr,
"reload_defaults should not be called without image.\n");
1303 const int32_t module_version =
module_so->version();
1308 "SELECT name, op_version, op_params, blendop_version, blendop_params FROM data.presets WHERE operation = ?1",
1334 "SELECT module FROM main.history WHERE operation = ?1 AND op_params = ?2", -1,
1345 fprintf(
stderr,
"[imageop_init_presets] WARNING: Could not find versioning information for '%s' "
1346 "preset '%s'\nUntil some is found, the preset will be unavailable.\n(To make it "
1347 "return, please load an image that uses the preset.)\n",
1361 "UPDATE data.presets SET op_version=?1 WHERE operation=?2 AND name=?3", -1,
1375 module = (dt_iop_module_t *)calloc(1, sizeof(dt_iop_module_t));
1405 fprintf(
stderr,
"[imageop_init_presets] updating '%s' preset '%s' from version %d to version %d\nto:'%s'",
1413 "SET op_version=?1, op_params=?2 "
1414 "WHERE operation=?3 AND name=?4",
1431 fprintf(
stderr,
"[imageop_init_presets] Can't upgrade '%s' preset '%s' from version %d to %d, no "
1432 "legacy_params() implemented \n",
1439 "[imageop_init_presets] updating '%s' preset '%s' from blendop version %d to version %d\n",
1445 module = (dt_iop_module_t *)calloc(1, sizeof(dt_iop_module_t));
1452 if(
module->params_size == 0)
1477 "SET blendop_version=?1, blendop_params=?2 "
1478 "WHERE operation=?3 AND name=?4",
1563 module->cleanup(module);
1568 module->common_fields.name = NULL;
1573 module->common_fields.view = NULL;
1594 module->raster_mask.source.users = NULL;
1595 module->raster_mask.source.masks = NULL;
1609 if(
module->cleanup_global)
module->cleanup_global(module);
1619 static const int key = 0;
1641 && ((module->blend_params->mask_mode & DEVELOP_MASK_RASTER) == DEVELOP_MASK_RASTER);
1652 = ((
module->flags() & IOP_FLAGS_SUPPORTS_BLENDING) == IOP_FLAGS_SUPPORTS_BLENDING);
1653 const gboolean
internal_masks = ((
module->flags() & IOP_FLAGS_INTERNAL_MASKS) == IOP_FLAGS_INTERNAL_MASKS);
1669 if(
module->raster_mask.sink.source)
1672 if(
module->blend_params != blendop_params)
1677 module->blend_params->blend_cst = dt_develop_blend_default_module_blend_colorspace(module);
1688 if(!
strcmp(
m->op, blendop_params->raster_mask_source))
1690 if(
m->multi_priority == blendop_params->raster_mask_instance)
1695 module->raster_mask.sink.source = m;
1696 module->raster_mask.sink.id = blendop_params->raster_mask_id;
1703 module->raster_mask.sink.source = NULL;
1704 module->raster_mask.sink.id = 0;
1742 fprintf(
stderr,
"validation check failed in _iop_validate_params for type \"%s\"; string not null terminated.\n",
1754 fprintf(
stderr,
"validation check failed in _iop_validate_params for type \"%s\", for array element \"%d\"\n",
1790 if(
i->value == *(
int*)
p)
1804 fprintf(
stderr,
"unsupported introspection type \"%s\" encountered in _iop_validate_params (field %s)\n",
1811 fprintf(
stderr,
"validation check failed in _iop_validate_params for type \"%s\"%s%s\n",
1823 &&
mod_1->multi_priority ==
mod_2->multi_priority
1886 module->blendop_hash = hash;
1897 hash =
dt_hash(hash, (
char *)&
module->enabled,
sizeof(gboolean));
1898 hash =
dt_hash(hash, (
char *)&
module->instance,
sizeof(int32_t));
1899 hash =
dt_hash(hash, (
char *)&
module->multi_priority,
sizeof(
int));
1900 hash =
dt_hash(hash, (
char *)&
module->iop_order,
sizeof(
int));
1910 module->hash = hash;
1937 module->commit_params(module, params, pipe, piece);
2002 if(!
IS_NULL_PTR(
module->dev) &&
module->dev->gui_module == module) module->dev->gui_module = NULL;
2015 if(
mod->instance_name)
2027 m->widget_list =
NULL;
2029 m->widget_list_bh =
NULL;
2035 if(
module->color_picker_apply)
2042 module->gui_cleanup(module);
2085 module->widget = NULL;
2086 module->header = NULL;
2087 module->expander = NULL;
2101 module->gui_update(module);
2121 const gboolean disabled = !
module->default_enabled && module->hide_enable_button;
2122 if(disabled)
return;
2130 if(
module->blend_params->mask_id > 0)
2153 const gboolean disabled = !
module->default_enabled && module->hide_enable_button;
2154 if(disabled)
return;
2180 && !IS_NULL_PTR(module->header) && GTK_IS_WIDGET(module->header));
2228 if(
module->gui_focus)
module->gui_focus(module, TRUE);
2270 module->expanded = expanded;
2300 snprintf(var,
sizeof(var),
"plugins/darkroom/%s/expanded",
module->op);
2342 const gboolean expanded =
module->expanded;
2362 else if(e->button == 3)
2374 return module->focus(module, TRUE);
2387 GdkModifierType modifier, gpointer data)
2399 return module->focus(module, FALSE);
2403 GdkModifierType modifier, gpointer data)
2417 if(!
module->hide_enable_button)
2419 module->enabled = TRUE;
2461 else if(e->button == 3)
2516 module->request_mask_display
2517 &= ~(DT_DEV_PIXELPIPE_DISPLAY_MASK | DT_DEV_PIXELPIPE_DISPLAY_CHANNEL
2518 | DT_DEV_PIXELPIPE_DISPLAY_ANY | DT_DEV_PIXELPIPE_DISPLAY_STICKY);
2521 module->request_mask_display |= DT_DEV_PIXELPIPE_DISPLAY_MASK;
2587 if(
module->mask_indicator)
2589 gchar *
type =
_(
"unknown mask");
2596 type=
_(
"drawn + parametric mask");
2598 type=
_(
"drawn mask");
2600 type=
_(
"parametric mask");
2602 type=
_(
"raster mask");
2616 gchar *details =
g_strdup_printf(
"%s\n%s",
part2,
_(
"click to display (module must be activated first)"));
2622 part2 =
g_strdup(
_(
"click to display (module must be activated first)"));
2643 const gboolean
support_blending = (
module->flags() & IOP_FLAGS_SUPPORTS_BLENDING) == IOP_FLAGS_SUPPORTS_BLENDING;
2668 const char **
des =
module->description(module);
2696 const char *
ilabs[4] = {
_(
"Purpose"),
_(
"Input"),
_(
"Process"),
_(
"Output")};
2698 for(
int k=1;
k<5;
k++)
2747 module->header = header;
2765 char w_name[256] = { 0 };
2794 module->mask_indicator = hw[IOP_MODULE_MASK];
2798 module->multimenu_button = GTK_WIDGET(hw[IOP_MODULE_INSTANCE]);
2800 _(
"multiple instance actions\nright-click creates new instance"));
2810 module->reset_button = GTK_WIDGET(hw[IOP_MODULE_RESET]);
2818 module->presets_button = GTK_WIDGET(hw[IOP_MODULE_PRESETS]);
2835 module->off = DTGTK_TOGGLEBUTTON(hw[IOP_MODULE_SWITCH]);
2858 if(
module->deprecated_msg())
2875 module->expander = expander;
2901 if(
usec <= 0)
return;
2912 return module->bypass_cache;
2917 module->bypass_cache = state;
2981 "INSERT INTO memory.darktable_iop_names (operation, name) VALUES (?1, ?2)",
3064 module->multi_priority = new_priority;
3090 && (
mod->multi_priority == multi_priority || multi_priority == -1))
3152 return (
const char **)
str_out;
3160 if(
module->gui_changed)
module->gui_changed(module, widget, data);
3198 fprintf(stderr,
"[dt_bauhaus_update_module] unsupported slider data type\n");
3217 fprintf(stderr,
"[dt_bauhaus_update_module] unsupported combo data type\n");
3221 fprintf(stderr,
"[dt_bauhaus_update_module] invalid bauhaus widget type encountered\n");
3241 float *
f = w->
field, prevf = *
f; *
f = val;
3247 int *
i = w->
field, previ = *
i; *
i = val;
3253 unsigned short *s = w->
field, prevs = *s; *s = val;
3258 fprintf(stderr,
"[_bauhaus_slider_value_change] unsupported slider data type\n");
3272 int *e = w->
field, preve = *e; *e = GPOINTER_TO_INT(entry->
data);
3279 int *
i = w->
field, previ = *
i; *
i =
d->active;
3285 unsigned int *u = w->
field, prevu = *u; *u =
d->active;
3291 gboolean *b = w->
field, prevb = *b; *b =
d->active;
3296 fprintf(stderr,
"[_bauhaus_combobox_set] unsupported combo data type\n");
3301 fprintf(stderr,
"[dt_bauhaus_value_changed_default_callback] invalid bauhaus widget type encountered for %s %s: %i\n", w->
label, w->module->name, w->
type);
void dt_accels_remove_shortcut(dt_accels_t *accels, const char *path)
Remove the shortcut object identified by path and all its accels.
void dt_accels_new_virtual_instance_shortcut(dt_accels_t *accels, gboolean(*action_callback)(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data), gpointer data, GtkAccelGroup *accel_group, const gchar *action_scope, const gchar *action_name)
gchar * dt_accels_build_path(const gchar *scope, const gchar *feature)
void dt_accels_remove_accel(dt_accels_t *accels, const char *path, gpointer data)
Recursively remove all accels for all shortcuts containing path. This is unneeded for accels attached...
__DT_CLONE_TARGETS__ int process(struct dt_iop_module_t *self, const dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_iop_t *piece, const void *const ivoid, void *const ovoid)
float dt_bauhaus_slider_get(GtkWidget *widget)
gboolean dt_bauhaus_combobox_set_from_value(GtkWidget *widget, int value)
void dt_bauhaus_slider_set(GtkWidget *widget, float pos)
void dt_bauhaus_combobox_set(GtkWidget *widget, const int pos)
#define DT_BAUHAUS_WIDGET(obj)
void dt_develop_blend_init_blend_parameters(dt_develop_blend_params_t *blend_params, dt_develop_blend_colorspace_t cst)
dt_develop_blend_colorspace_t dt_develop_blend_default_module_blend_colorspace(dt_iop_module_t *module)
int dt_develop_blend_version(void)
int dt_develop_blend_legacy_params(dt_iop_module_t *module, const void *const old_params, const int old_version, void *new_params, const int new_version, const int length)
void dt_develop_blend_get_mask_usage(const dt_iop_module_t *module, const dt_develop_blend_params_t *params, gboolean *top_enabled, gboolean *raster_used, gboolean *drawn_used, gboolean *parametric_used)
gboolean blend_color_picker_apply(dt_iop_module_t *module, GtkWidget *picker, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece)
void dt_iop_gui_init_blending(dt_iop_module_t *module)
dt_develop_blend_colorspace_t
void dt_iop_gui_update_blending(dt_iop_module_t *module)
void dt_iop_gui_blending_lose_focus(dt_iop_module_t *module)
void dt_iop_gui_cleanup_blending(dt_iop_module_t *module)
void dt_iop_gui_blending_reload_defaults(dt_iop_module_t *module)
static const dt_aligned_pixel_simd_t const dt_adaptation_t const float p
void dt_collection_hint_message(const dt_collection_t *collection)
void dt_iop_color_picker_reset(dt_iop_module_t *module, gboolean keep)
int dt_iop_color_picker_get_ready_data(const dt_iop_module_t *module, GtkWidget **picker, dt_dev_pixelpipe_t **pipe, const dt_dev_pixelpipe_iop_t **piece)
const dt_aligned_pixel_t f
typedef void((*dt_cache_allocate_t)(void *userdata, dt_cache_entry_t *entry))
void dt_conf_set_bool(const char *name, int val)
int dt_conf_get_bool(const char *name)
int dt_conf_key_exists(const char *key)
gboolean dt_conf_key_not_empty(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_queue_cursor(cursor)
void dt_print(dt_debug_thread_t thread, const char *msg,...)
#define dt_free_align(ptr)
static void * dt_calloc_align(size_t size)
static gchar * delete_underscore(const char *s)
static uint64_t dt_hash(uint64_t hash, const char *str, size_t size)
static const dt_aligned_pixel_simd_t value
static gboolean dt_modifier_is(const GdkModifierType state, const GdkModifierType desired_modifier_mask)
#define IS_NULL_PTR(p)
C is way too permissive with !=, == and if(var) checks, which can mean too many things depending on w...
void dt_database_end_transaction_batch(const struct dt_database_t *db)
void dt_database_begin_transaction_batch(const struct dt_database_t *db)
sqlite3 * dt_database_get(const dt_database_t *db)
#define dt_database_start_transaction(db)
#define dt_database_release_transaction(db)
#define DT_DEBUG_SQLITE3_BIND_BLOB(a, b, c, d, e)
#define DT_DEBUG_SQLITE3_PREPARE_V2(a, b, c, d, e)
#define DT_DEBUG_SQLITE3_BIND_TEXT(a, b, c, d, e)
#define DT_DEBUG_SQLITE3_BIND_INT(a, b, c)
void dt_dev_write_history(dt_develop_t *dev, gboolean async)
Thread-safe wrapper around dt_dev_write_history_ext() for dev->image_storage.id.
#define dt_dev_add_history_item(dev, module, enable, redraw)
#define dt_dev_pixelpipe_rebuild_all(dev)
#define dt_dev_pixelpipe_update_history_main(dev)
void dt_dev_signal_modules_moved(dt_develop_t *dev)
void dt_dev_modulegroups_switch_tab(dt_develop_t *dev, dt_iop_module_t *module)
void dt_dev_module_remove(dt_develop_t *dev, dt_iop_module_t *module)
void dt_dev_undo_start_record(dt_develop_t *dev)
gchar * dt_history_item_get_label(const struct dt_iop_module_t *module)
void dt_dev_undo_end_record(dt_develop_t *dev)
gchar * dt_history_item_get_name(const struct dt_iop_module_t *module)
@ DT_DEV_PIXELPIPE_DISPLAY_NONE
void dtgtk_cairo_paint_module_switch_on(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_presets(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_showmask(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_multiinstance(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_module_switch(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_reset(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
char * dt_exif_xmp_encode(const unsigned char *input, const int len, int *output_len)
GtkWidget * dtgtk_expander_get_header_event_box(GtkDarktableExpander *expander)
GtkWidget * dtgtk_expander_get_body_event_box(GtkDarktableExpander *expander)
GtkWidget * dtgtk_expander_get_frame(GtkDarktableExpander *expander)
GtkWidget * dtgtk_expander_get_body(GtkDarktableExpander *expander)
void dtgtk_expander_set_expanded(GtkDarktableExpander *expander, gboolean expanded)
GtkWidget * dtgtk_expander_new(GtkWidget *header, GtkWidget *body)
#define DTGTK_EXPANDER(obj)
static guint dt_keys_mainpad_alternatives(const guint key_val)
Remap keypad keys to usual mainpad ones.
void dt_gui_menu_popup(GtkMenu *menu, GtkWidget *button, GdkGravity widget_anchor, GdkGravity menu_anchor)
void dt_gui_remove_class(GtkWidget *widget, const gchar *class_name)
GtkWidget * dt_gui_container_nth_child(GtkContainer *container, int which)
void dt_capitalize_label(gchar *text)
void dt_gui_add_help_link(GtkWidget *widget, char *link)
void dt_gui_refocus_center()
void dt_accels_disconnect_on_text_input(GtkWidget *widget)
Disconnects accels when a text or search entry gets the focus, and reconnects them when it looses it....
void dt_gui_add_class(GtkWidget *widget, const gchar *class_name)
void dt_ui_container_focus_widget(dt_ui_t *ui, const dt_ui_container_t c, GtkWidget *w)
gives a widget focus in the container
#define dt_accels_new_darkroom_action(a, b, c, d, e, f, g)
#define DT_GUI_BOX_SPACING
#define DT_PIXEL_APPLY_DPI(value)
gboolean dt_gui_presets_autoapply_for_module(dt_iop_module_t *module)
void dt_gui_presets_popup_menu_show_for_module(dt_iop_module_t *module)
gboolean dt_gui_presets_autogen_enabled()
void dt_gui_throttle_cancel(gpointer source)
static gboolean enable(dt_image_t *image)
static gboolean _iop_plugin_enable_accel(GtkAccelGroup *accel_group, GObject *accelerable, guint keyval, GdkModifierType modifier, gpointer data)
static int default_operation_tags(void)
dt_iop_module_t * dt_iop_get_module_from_list(GList *iop_list, const char *op)
static void _gui_reset_callback(GtkButton *button, GdkEventButton *event, dt_iop_module_t *module)
dt_iop_module_t * dt_iop_get_module(const char *op)
static int default_distort_backtransform(dt_iop_module_t *self, const dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_iop_t *piece, float *points, size_t points_count)
void dt_iop_set_darktable_iop_table()
static gboolean _gui_multiinstance_callback(GtkButton *button, GdkEventButton *event, gpointer user_data)
static const char * default_aliases(void)
void dt_iop_gui_cleanup_module(dt_iop_module_t *module)
static void _init_module_so(void *m)
void dt_iop_load_default_params(dt_iop_module_t *module)
dt_iop_module_t * dt_iop_get_module_by_instance_name(GList *modules, const char *operation, const char *multi_name)
static int default_distort_transform(dt_iop_module_t *self, const dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_iop_t *piece, float *points, size_t points_count)
static gboolean _iop_plugin_header_button_release(GtkWidget *w, GdkEventButton *e, gpointer user_data)
GtkWidget * dt_iop_gui_get_pluginui(dt_iop_module_t *module)
static int default_default_group(void)
gboolean dt_iop_is_raster_mask_used(dt_iop_module_t *module, int id)
static void _iop_plugin_header_menu_deactivate(GtkWidget *menu, gpointer user_data)
void dt_iop_commit_params(dt_iop_module_t *module, dt_iop_params_t *params, dt_develop_blend_params_t *blendop_params, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece)
void dt_iop_compute_module_hash(dt_iop_module_t *module, GList *masks)
void dt_iop_add_remove_mask_indicator(dt_iop_module_t *module)
void dt_iop_reload_defaults(dt_iop_module_t *module)
void _hash_raster_masks(gpointer key, gpointer value, uint64_t *hash)
void dt_iop_gui_set_expander(dt_iop_module_t *module)
void dt_iop_throttled_history_update(gpointer data)
void dt_iop_compute_blendop_hash(dt_iop_module_t *module, uint64_t hash, GList *masks)
dt_iop_module_t * dt_iop_gui_get_next_visible_module(dt_iop_module_t *module)
void dt_iop_init_pipe(struct dt_iop_module_t *module, struct dt_dev_pixelpipe_t *pipe, struct dt_dev_pixelpipe_iop_t *piece)
static gboolean _rename_module_key_press(GtkWidget *entry, GdkEventKey *event, dt_iop_module_t *module)
static gboolean _iop_plugin_header_activate(GtkWidget *self, gboolean group_cycling, gpointer user_data)
static void _iop_panel_label(dt_iop_module_t *module)
gboolean dt_iop_is_first_instance(GList *modules, dt_iop_module_t *module)
static int default_flags(void)
int dt_iop_load_module_so(void *m, const char *libname, const char *module_name)
void dt_iop_gui_init(dt_iop_module_t *module)
void dt_iop_commit_blend_params(dt_iop_module_t *module, const dt_develop_blend_params_t *blendop_params)
void dt_iop_cleanup_module(dt_iop_module_t *module)
static gboolean _iop_plugin_focus_accel(GtkAccelGroup *accel_group, GObject *accelerable, guint keyval, GdkModifierType modifier, gpointer data)
static void _iop_modify_roi_out(struct dt_iop_module_t *self, const struct dt_dev_pixelpipe_t *pipe, struct dt_dev_pixelpipe_iop_t *piece, dt_iop_roi_t *roi_out, const dt_iop_roi_t *roi_in)
gboolean dt_iop_module_has_raster_mask(const dt_iop_module_t *module)
void dt_iop_gui_update(dt_iop_module_t *module)
const gchar * dt_iop_get_localized_aliases(const gchar *op)
const gchar * dt_iop_get_localized_name(const gchar *op)
void dt_bauhaus_update_module(dt_iop_module_t *self)
static void default_commit_params(struct dt_iop_module_t *self, dt_iop_params_t *params, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece)
static dt_introspection_field_t * default_get_f(const char *name)
int dt_iop_load_module(dt_iop_module_t *module, dt_iop_module_so_t *module_so, dt_develop_t *dev)
gboolean _iop_validate_params(dt_introspection_field_t *field, gpointer params, gboolean report)
int dt_iop_load_module_by_so(dt_iop_module_t *module, dt_iop_module_so_t *so, dt_develop_t *dev)
static void default_cleanup_pipe(struct dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece)
static void default_gui_cleanup(dt_iop_module_t *self)
static void _display_mask_indicator_callback(GtkToggleButton *bt, dt_iop_module_t *module)
void dt_iop_gui_reset(dt_iop_module_t *module)
static void default_init_pipe(struct dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece)
gboolean dt_iop_module_needs_mask_history(const dt_iop_module_t *module)
void dt_iop_load_modules_so(void)
void dt_iop_nap(int32_t usec)
static void default_cleanup(dt_iop_module_t *module)
void dt_iop_default_init(dt_iop_module_t *module)
void _iop_dim_all_but(dt_iop_module_t *module, gboolean dim)
void dt_iop_gui_update_expanded(dt_iop_module_t *module)
void dt_iop_gui_update_header(dt_iop_module_t *module)
void dt_iop_unload_modules_so()
static gboolean _iop_plugin_header_menu_dismiss_idle(gpointer user_data)
void dt_iop_gui_set_enable_button(dt_iop_module_t *module)
int default_iop_focus(dt_gui_module_t *m, gboolean toggle)
void dt_iop_cleanup_pipe(struct dt_iop_module_t *module, struct dt_dev_pixelpipe_t *pipe, struct dt_dev_pixelpipe_iop_t *piece)
Release module-owned resources for one pixelpipe node.
static const char ** default_description(struct dt_iop_module_t *self)
static void _gui_copy_callback(GtkButton *button, gpointer user_data)
gboolean dt_iop_is_visible(dt_iop_module_t *module)
void dt_iop_request_focus(dt_iop_module_t *module)
dt_iop_module_t * dt_iop_gui_get_previous_visible_module(dt_iop_module_t *module)
static const char * default_deprecated_msg(void)
gboolean dt_iop_is_hidden(dt_iop_module_t *module)
static gboolean default_has_defaults(struct dt_iop_module_t *self)
static gboolean _iop_plugin_body_button_press(GtkWidget *w, GdkEventButton *e, gpointer user_data)
const char ** dt_iop_set_description(dt_iop_module_t *module, const char *main_text, const char *purpose, const char *input, const char *process, const char *output)
GtkWidget * dt_iop_gui_get_widget(dt_iop_module_t *module)
gboolean dt_iop_so_is_hidden(dt_iop_module_so_t *module)
static void _gui_set_single_expanded(dt_iop_module_t *module, gboolean expanded)
float dt_dev_get_module_scale(const dt_dev_pixelpipe_t *const pipe, const dt_iop_roi_t *const roi_in)
void dt_iop_gui_changed(dt_iop_module_t *action, GtkWidget *widget, gpointer data)
int dt_iop_get_module_flags(const char *op)
static void _iop_color_picker_data_ready_callback(gpointer instance, gpointer user_data)
static void _mask_indicator_get_usage(dt_iop_module_t *module, gboolean *top_enabled, gboolean *raster_used, gboolean *drawn_used, gboolean *parametric_used)
static gboolean _iop_plugin_header_child_button_press(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
static gboolean _mask_indicator_tooltip(GtkWidget *treeview, gint x, gint y, gboolean kb_mode, GtkTooltip *tooltip, dt_iop_module_t *module)
void dt_iop_gui_set_enable_button_icon(GtkWidget *w, dt_iop_module_t *module)
static gboolean default_runtime_data_hash(struct dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_iop_t *piece)
gboolean dt_iop_gui_move_module_before(dt_iop_module_t *module, dt_iop_module_t *module_next, const char *reason)
Move a module before another one and commit the GUI-side effects.
void dt_bauhaus_value_changed_default_callback(GtkWidget *widget)
dt_iop_module_t * dt_iop_get_colorout_module(void)
gboolean dt_iop_check_modules_equal(dt_iop_module_t *mod_1, dt_iop_module_t *mod_2)
#define DT_IOP_HEADER_IGNORE_RELEASE
static void _presets_popup_callback(GtkButton *button, dt_iop_module_t *module)
static int default_operation_tags_filter(void)
#define DT_IOP_HEADER_MENU_DISMISS_CLICK
static sqlite3_stmt * _iop_presets_select_stmt
static void _iop_gui_widget_gone(gpointer user_data, GObject *where_the_object_was)
Clear GUI pointers that still reference one iop widget being finalized.
static gboolean _rename_module_resize(GtkWidget *entry, GdkEventKey *event, dt_iop_module_t *module)
void dt_iop_gui_set_expanded(dt_iop_module_t *module, gboolean expanded, gboolean collapse_others)
static void _gui_delete_callback(GtkButton *button, dt_iop_module_t *module)
void dt_iop_set_cache_bypass(dt_iop_module_t *module, gboolean state)
static dt_introspection_t * default_get_introspection(void)
gboolean dt_iop_get_cache_bypass(dt_iop_module_t *module)
gboolean dt_iop_gui_move_module_after(dt_iop_module_t *module, dt_iop_module_t *module_prev, const char *reason)
Move a module after another one and commit the GUI-side effects.
void dt_iop_set_mask_mode(dt_iop_module_t *module, int mask_mode)
static gboolean _rename_module_idle(gpointer user_data)
static gboolean _iop_plugin_header_button_press(GtkWidget *w, GdkEventButton *e, gpointer user_data)
static void _iop_modify_roi_in(struct dt_iop_module_t *self, const struct dt_dev_pixelpipe_t *pipe, struct dt_dev_pixelpipe_iop_t *piece, const dt_iop_roi_t *roi_out, dt_iop_roi_t *roi_in)
gboolean _iop_tooltip_callback(GtkWidget *widget, gint x, gint y, gboolean keyboard_mode, GtkTooltip *tooltip, gpointer user_data)
static void _init_presets(dt_iop_module_so_t *module_so)
void dt_iop_gui_rename_module(dt_iop_module_t *module)
dt_iop_module_t * dt_iop_gui_duplicate(dt_iop_module_t *base, gboolean copy_params)
gboolean dt_iop_gui_module_is_visible(dt_iop_module_t *module)
dt_iop_module_t * dt_iop_get_module_by_op_priority(GList *modules, const char *operation, const int multi_priority)
gboolean dt_iop_gui_commit_iop_order_change(dt_develop_t *dev, dt_iop_module_t *module, gboolean enable, gboolean write_history, const char *reason)
Commit the GUI-side consequences of an IOP-order change.
static void _gui_duplicate_callback(GtkButton *button, gpointer user_data)
static void * default_get_p(const void *param, const char *name)
static dt_introspection_field_t * default_get_introspection_linear(void)
void dt_iop_update_multi_priority(dt_iop_module_t *module, int new_priority)
static void _gui_off_callback(GtkToggleButton *togglebutton, gpointer user_data)
static void _gui_rename_callback(GtkButton *button, dt_iop_module_t *module)
#define DT_IOP_HEADER_MENU_OPEN
static int default_process(struct dt_iop_module_t *self, const struct dt_dev_pixelpipe_t *pipe, const struct dt_dev_pixelpipe_iop_t *piece, const void *const i, void *const o)
static gboolean dt_iop_colorspace_is_rgb(const dt_iop_colorspace_type_t cst)
@ IOP_FLAGS_SUPPORTS_BLENDING
#define DT_INTROSPECTION_VERSION
@ DT_INTROSPECTION_TYPE_BOOL
@ DT_INTROSPECTION_TYPE_ENUM
@ DT_INTROSPECTION_TYPE_OPAQUE
@ DT_INTROSPECTION_TYPE_NONE
@ DT_INTROSPECTION_TYPE_ARRAY
@ DT_INTROSPECTION_TYPE_CHAR
@ DT_INTROSPECTION_TYPE_FLOAT
@ DT_INTROSPECTION_TYPE_UNION
@ DT_INTROSPECTION_TYPE_UINT
@ DT_INTROSPECTION_TYPE_USHORT
@ DT_INTROSPECTION_TYPE_INT8
@ DT_INTROSPECTION_TYPE_STRUCT
@ DT_INTROSPECTION_TYPE_FLOATCOMPLEX
@ DT_INTROSPECTION_TYPE_INT
gboolean dt_ioppr_move_iop_after(struct dt_develop_t *dev, dt_iop_module_t *module, dt_iop_module_t *module_prev)
Move a module instance after another module in the pipe.
gboolean dt_ioppr_move_iop_before(struct dt_develop_t *dev, dt_iop_module_t *module, dt_iop_module_t *module_next)
Move a module instance before another module in the pipe.
int dt_ioppr_check_iop_order(dt_develop_t *dev, const int32_t imgid, const char *msg)
Debug helper to validate the current order for a develop context.
float *const restrict const size_t k
void dt_masks_iop_use_same_as(struct dt_iop_module_t *module, struct dt_iop_module_t *src)
void dt_masks_reset_form_gui(void)
dt_masks_form_t * dt_masks_get_from_id_ext(GList *forms, int id)
dt_masks_form_t * dt_masks_get_from_id(dt_develop_t *dev, int id)
void dt_masks_form_delete(struct dt_iop_module_t *module, dt_masks_form_t *grp, dt_masks_form_t *form)
void dt_masks_group_update_name(dt_iop_module_t *module)
uint64_t dt_masks_group_get_hash(uint64_t hash, dt_masks_form_t *form)
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))
char * dt_pixelpipe_get_pipe_name(dt_dev_pixelpipe_type_t pipe_type)
void dt_sentry_record_module_usage(const char *category, const char *name)
char dt_dev_operation_t[20]
#define DT_DEBUG_CONTROL_SIGNAL_DISCONNECT(ctlsig, cb, user_data)
#define DT_DEBUG_CONTROL_SIGNAL_RAISE(ctlsig, signal,...)
@ DT_SIGNAL_DEVELOP_MASKS_GUI_CHANGED
@ DT_SIGNAL_CONTROL_PICKERDATA_READY
This signal is raised when new color picker data are available in darkroom. no param,...
#define DT_DEBUG_CONTROL_SIGNAL_CONNECT(ctlsig, signal, cb, user_data)
struct _GtkWidget GtkWidget
const float uint32_t state[4]
const float const float param
unsigned __int64 uint64_t
struct dt_gui_gtk_t * gui
struct dt_collection_t * collection
const struct dt_database_t * db
struct dt_control_signal_t * signals
struct dt_opencl_t * opencl
struct dt_develop_t * develop
GtkAccelGroup * darkroom_accels
struct dt_develop_blend_params_t * blend_params
uint64_t global_mask_hash
struct dt_iop_module_t *void * data
gboolean cache_output_on_ram
dt_dev_pixelpipe_type_t type
struct dt_develop_t::@19 color_picker
Authoritative darkroom color-picker state.
struct dt_iop_module_t * gui_module
struct dt_iop_module_t *struct dt_iop_color_picker_t * picker
GtkMenu * presets_popup_menu
GtkWidget * has_scroll_focus
GtkWidget * scroll_to_header_once
The dt_gui_module_t type is the intersection between a dt_lib_module_t and a dt_iop_module_t structur...
union dt_introspection_field_t * field
dt_introspection_type_t type
dt_introspection_type_enum_tuple_t * values
union dt_introspection_field_t ** fields
union dt_introspection_field_t ** fields
GModule *dt_dev_operation_t op
dt_iop_params_t * default_params
struct dt_develop_blend_params_t * blend_params
struct dt_develop_t * dev
int(* process_plain)(struct dt_iop_module_t *self, const struct dt_dev_pixelpipe_t *pipe, const struct dt_dev_pixelpipe_iop_t *piece, const void *const i, void *const o)
struct dt_develop_blend_params_t * default_blendop_params
Region of interest passed through the pixelpipe.
void dt_telemetry_record_module_usage(const char *category, const char *name)
dt_bauhaus_combobox_data_t combobox
dt_introspection_type_float_complex_t FloatComplex
dt_introspection_type_header_t header
dt_introspection_type_ushort_t UShort
dt_introspection_type_float_t Float
dt_introspection_type_union_t Union
dt_introspection_type_uint_t UInt
dt_introspection_type_int_t Int
dt_introspection_type_char_t Char
dt_introspection_type_int8_t Int8
dt_introspection_type_array_t Array
dt_introspection_type_enum_t Enum
dt_introspection_type_struct_t Struct
char * dt_get_help_url(char *name)
void dt_ui_container_add_widget(dt_ui_t *ui, const dt_ui_container_t c, GtkWidget *w)
@ DT_UI_CONTAINER_PANEL_RIGHT_CENTER