52#define DT_IOP_HEADER_MENU_OPEN "dt-module-header-menu-open"
53#define DT_IOP_HEADER_MENU_DISMISS_CLICK "dt-module-header-menu-dismiss-click"
55#define DT_IOP_HEADER_IGNORE_RELEASE "dt-module-header-ignore-release"
59 GdkModifierType modifier, gpointer data);
61 GdkModifierType modifier, gpointer data);
74#ifdef GDK_WINDOWING_QUARTZ
95 gboolean *field = (gboolean*)(data->
param);
97 gboolean previous = *field;
100 if(*field != previous)
148 const float min =
f->Float.Min;
149 const float max =
f->Float.Max;
150 offset =
f->header.offset +
param_index *
sizeof(float);
151 const float defval = *(
float*)((uint8_t *)
d + offset);
160 const int min =
f->Int.Min;
161 const int max =
f->Int.Max;
163 const int defval = *(
int*)((uint8_t *)
d + offset);
169 const unsigned short min =
f->UShort.Min;
170 const unsigned short max =
f->UShort.Max;
171 offset =
f->header.offset +
param_index *
sizeof(
unsigned short);
172 const unsigned short defval = *(
unsigned short*)((uint8_t *)
d + offset);
185 if (*
f->header.description)
237 if (*
f->header.description)
263 if(*
iter->description)
298 str = *
f->header.description
328 GCallback callback, gboolean local, guint
accel_key, GdkModifierType mods,
352 const gchar *ctrl_label, GCallback callback, gboolean local,
375 GCallback callback, gboolean local, guint
accel_key, GdkModifierType mods,
446 else if(
mod->instance ==
module->instance)
460 const gboolean
is_zero = (
module->multi_priority == 0);
494 if(!hist || !hist->module)
499 if(hist->module->instance ==
module->instance && hist->module !=
module)
501 first = hist->module;
540 GtkWidget *expander =
module->gui ? module->gui->expander : NULL;
604 module->blend_params->mask_id = 0;
615 if(
module->dev->gui_attached)
697 module->multi_name[0] = module->multi_name[sizeof(module->multi_name) - 1];
698 module->multi_name[sizeof(module->multi_name) - 1] = 0;
709 module->multi_name[0] = 0;
718 module->multi_name[0] = module->multi_name[sizeof(module->multi_name) - 1];
719 module->multi_name[sizeof(module->multi_name) - 1] = 0;
766 module->multi_name[sizeof(module->multi_name) - 1] = module->multi_name[0];
767 module->multi_name[0] = 0;
887 module->dev->proxy.chroma_adaptation = NULL;
926 if(
mod->instance_name)
965 if(
module->default_enabled &&
module->hide_enable_button)
969 else if(!
module->default_enabled &&
module->hide_enable_button)
986 if(
module->hide_enable_button)
993 if(
module->hide_enable_button)
996 module->enabled ?
"dt_iop_enable_forced_on" :
"dt_iop_enable_forced_off");
1007 if(
IS_NULL_PTR(
module->gui))
module->gui = (dt_iop_module_gui_t *)calloc(1, sizeof(dt_iop_module_gui_t));
1026 const gchar *
const main_scope =
_(
"Darkroom/Modules");
1041 if(
module->gui_init)
module->gui_init(module);
1042 if(
module->color_picker_apply)
1081 if(!
IS_NULL_PTR(
module->dev) &&
module->dev->gui_module == module) module->dev->gui_module = NULL;
1098 if(
mod->instance_name)
1110 m->widget_list =
NULL;
1112 m->widget_list_bh =
NULL;
1118 if(
module->color_picker_apply)
1125 module->gui_cleanup(module);
1144 GtkWidget *expander =
module->gui->expander;
1153 GtkWidget *header =
module->gui->header;
1161 GtkWidget *widget =
module->gui->widget;
1168 module->gui->widget = NULL;
1169 module->gui->header = NULL;
1170 module->gui->expander = NULL;
1171 module->gui->off = NULL;
1187 module->gui_update(module);
1200 const gboolean disabled = !
module->default_enabled && module->hide_enable_button;
1201 if(disabled)
return;
1219 if(
module->blend_params->mask_id > 0)
1242 const gboolean disabled = !
module->default_enabled && module->hide_enable_button;
1243 if(disabled)
return;
1271 && !IS_NULL_PTR(module->gui->header) && GTK_IS_WIDGET(module->gui->header));
1327 if(
module->gui_focus)
module->gui_focus(module, TRUE);
1374 module->gui->expanded = expanded;
1404 snprintf(var,
sizeof(var),
"plugins/darkroom/%s/expanded",
module->op);
1446 const gboolean expanded =
module->gui->expanded;
1466 else if(e->button == 3)
1478 return module->focus(module, TRUE);
1491 GdkModifierType modifier, gpointer data)
1499 if(iop->gui->expander)
1503 return module->focus(module, FALSE);
1507 GdkModifierType modifier, gpointer data)
1521 if(!
module->hide_enable_button)
1523 module->enabled = TRUE;
1561 if(
module->gui->expander)
1567 else if(e->button == 3)
1622 module->request_mask_display
1623 &= ~(DT_DEV_PIXELPIPE_DISPLAY_MASK | DT_DEV_PIXELPIPE_DISPLAY_CHANNEL
1624 | DT_DEV_PIXELPIPE_DISPLAY_ANY | DT_DEV_PIXELPIPE_DISPLAY_STICKY);
1627 module->request_mask_display |= DT_DEV_PIXELPIPE_DISPLAY_MASK;
1693 if(
module->gui->mask_indicator)
1695 gchar *
type =
_(
"unknown mask");
1702 type=
_(
"drawn + parametric mask");
1704 type=
_(
"drawn mask");
1706 type=
_(
"parametric mask");
1708 type=
_(
"raster mask");
1722 gchar *details =
g_strdup_printf(
"%s\n%s",
part2,
_(
"click to display (module must be activated first)"));
1728 part2 =
g_strdup(
_(
"click to display (module must be activated first)"));
1749 const gboolean
support_blending = (
module->flags() & IOP_FLAGS_SUPPORTS_BLENDING) == IOP_FLAGS_SUPPORTS_BLENDING;
1774 const char **
des =
module->description(module);
1802 const char *
ilabs[4] = {
_(
"Purpose"),
_(
"Input"),
_(
"Process"),
_(
"Output")};
1804 for(
int k=1;
k<5;
k++)
1853 module->gui->header = header;
1871 char w_name[256] = { 0 };
1900 module->gui->mask_indicator = hw[IOP_MODULE_MASK];
1904 module->gui->multimenu_button = GTK_WIDGET(hw[IOP_MODULE_INSTANCE]);
1906 _(
"multiple instance actions\nright-click creates new instance"));
1916 module->gui->reset_button = GTK_WIDGET(hw[IOP_MODULE_RESET]);
1924 module->gui->presets_button = GTK_WIDGET(hw[IOP_MODULE_PRESETS]);
1941 module->gui->off = switch_button;
1976 if(
module->deprecated_msg())
1993 module->gui->expander = expander;
2025 if(
module->gui_changed)
module->gui_changed(module, widget, data);
2051 switch(
bhw->field_type)
2063 fprintf(
stderr,
"[dt_bauhaus_update_module] unsupported slider data type\n");
2067 switch(
bhw->field_type)
2082 fprintf(
stderr,
"[dt_bauhaus_update_module] unsupported combo data type\n");
2086 fprintf(
stderr,
"[dt_bauhaus_update_module] invalid bauhaus widget type encountered\n");
2123 fprintf(
stderr,
"[_bauhaus_slider_value_change] unsupported slider data type\n");
2150 unsigned int *u = w->
field,
prevu = *u; *u =
d->active;
2156 gboolean *b = w->
field,
prevb = *b; *b =
d->active;
2161 fprintf(
stderr,
"[_bauhaus_combobox_set] unsupported combo data type\n");
2166 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);
2184 return module && module->gui ? module->gui->off : NULL;
2189 return module->gui && (module->gui->expander == (const void *)target || module->gui->header == (const void *)target);
2211 memcpy(((
char *)
d->module->params) +
d->offset, ((
char *)
d->module->default_params) +
d->offset,
d->size);
2212 if(
d->module->gui_update)
d->module->gui_update(
d->module);
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...
void dt_accels_disconnect_on_text_input(GtkWidget *widget)
Disconnect accels while a text or search entry has the focus, and reconnect them when it loses it....
Handle default and user-set shortcuts (accelerators)
#define dt_accels_new_darkroom_action(a, b, c, d, e, f, g)
struct dt_accels_t * dt_gui_get_accels(void)
struct dt_ui_t * dt_gui_get_ui(void)
void dt_gui_add_help_link(GtkWidget *widget, char *link)
void dt_gui_refocus_center()
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
GtkWidget * dt_bauhaus_slider_new(dt_bauhaus_t *bh, dt_gui_module_t *self)
float dt_bauhaus_slider_get(GtkWidget *widget)
gboolean dt_bauhaus_combobox_set_from_value(GtkWidget *widget, int value)
GtkWidget * dt_bauhaus_slider_new_with_range_and_feedback(dt_bauhaus_t *bh, dt_gui_module_t *self, float min, float max, float step, float defval, int digits, int feedback)
void dt_bauhaus_widget_set_field(GtkWidget *widget, gpointer field, dt_introspection_type_t field_type)
void dt_bauhaus_combobox_add_full(GtkWidget *widget, const char *text, dt_bauhaus_combobox_alignment_t align, gpointer data, void(free_func)(void *data), gboolean sensitive)
void dt_bauhaus_slider_set(GtkWidget *widget, float pos)
void dt_bauhaus_combobox_set(GtkWidget *widget, const int pos)
void dt_bauhaus_widget_set_label(GtkWidget *widget, const char *label)
GtkWidget * dt_bauhaus_combobox_new(dt_bauhaus_t *bh, dt_gui_module_t *self)
void dt_bauhaus_combobox_add(GtkWidget *widget, const char *text)
@ DT_BAUHAUS_COMBOBOX_ALIGN_RIGHT
#define DT_BAUHAUS_WIDGET(obj)
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)
void dt_iop_gui_init_blending(dt_iop_module_t *module)
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)
The blending panel's GUI state and API, cut out of develop/blend.h.
gboolean blend_color_picker_apply(dt_iop_module_t *module, GtkWidget *picker, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece)
typedef void((*dt_cache_allocate_t)(void *userdata, dt_cache_entry_t *entry))
dt_collection_t * dt_collection_get_global(void)
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)
struct _GtkWidget GtkWidget
GtkWidget, opaque, spelled exactly as GTK spells it.
static const float const float const float min
void dt_conf_set_bool(const char *name, int val)
int dt_conf_get_bool(const char *name)
GtkWidget * dt_gui_container_nth_child(GtkContainer *container, int which)
void dt_control_queue_redraw_center()
Request a redraw of the centre view.
#define dt_control_queue_cursor(cursor)
struct dt_develop_t * dt_dev_get_global(void)
struct dt_gui_gtk_t * dt_gui_get_global(void)
struct dt_bauhaus_t * dt_bauhaus_get_global(void)
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)
void dt_dev_history_flush_pending_commits(struct dt_develop_t *dev)
Run every history commit still queued for dev, now.
#define dt_dev_pixelpipe_rebuild_all(dev)
#define dt_dev_pixelpipe_update_history_main(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
static int dt_pthread_mutex_BAD_lock(dt_pthread_mutex_t *mutex)
static int dt_pthread_mutex_BAD_unlock(dt_pthread_mutex_t *mutex)
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.
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)
Everything the history, styles and presets code says to the outside world: messages for the user,...
void dt_iop_reload_defaults(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_gui_reset(dt_iop_module_t *module)
gboolean dt_iop_is_hidden(dt_iop_module_t *module)
void dt_iop_set_cache_bypass(dt_iop_module_t *module, gboolean state)
void dt_iop_update_multi_priority(dt_iop_module_t *module, int new_priority)
@ IOP_FLAGS_SUPPORTS_BLENDING
static gboolean _iop_plugin_enable_accel(GtkAccelGroup *accel_group, GObject *accelerable, guint keyval, GdkModifierType modifier, gpointer data)
GtkWidget * dt_iop_togglebutton_new_no_register(dt_iop_module_t *self, const char *section, const gchar *label, const gchar *ctrl_label, GCallback callback, gboolean local, guint accel_key, GdkModifierType mods, DTGTKCairoPaintIconFunc paint, GtkWidget *box)
static void _gui_reset_callback(GtkButton *button, GdkEventButton *event, dt_iop_module_t *module)
static gboolean _gui_multiinstance_callback(GtkButton *button, GdkEventButton *event, gpointer user_data)
void dt_iop_gui_cleanup_module(dt_iop_module_t *module)
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 void _iop_plugin_header_menu_deactivate(GtkWidget *menu, gpointer user_data)
void dt_iop_add_remove_mask_indicator(dt_iop_module_t *module)
GtkWidget * dt_iop_button_new(dt_iop_module_t *self, const gchar *label, GCallback callback, gboolean local, guint accel_key, GdkModifierType mods, DTGTKCairoPaintIconFunc paint, gint paintflags, GtkWidget *box)
void dt_iop_gui_set_expander(dt_iop_module_t *module)
dt_iop_module_t * dt_iop_gui_get_next_visible_module(dt_iop_module_t *module)
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)
void dt_iop_gui_init(dt_iop_module_t *module)
static gboolean _iop_plugin_focus_accel(GtkAccelGroup *accel_group, GObject *accelerable, guint keyval, GdkModifierType modifier, gpointer data)
void dt_iop_gui_update(dt_iop_module_t *module)
void dt_bauhaus_update_module(dt_iop_module_t *self)
GtkWidget * dt_iop_gui_reset_label_new(const gchar *label, dt_iop_module_t *module, void *param, int param_size)
void dt_iop_gui_leave_critical_section(dt_iop_module_t *const module)
Release what dt_iop_gui_enter_critical_section() took. Also a no-op headless.
static void _display_mask_indicator_callback(GtkToggleButton *bt, dt_iop_module_t *module)
static void _iop_toggle_callback(GtkWidget *togglebutton, dt_module_param_t *data)
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)
static gboolean _iop_plugin_header_menu_dismiss_idle(gpointer user_data)
void dt_iop_gui_set_enable_button(dt_iop_module_t *module)
static void _iop_reset_label_reset(GtkWidget *widget, gpointer user_data)
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)
Move darkroom focus to module, or clear it with NULL.
dt_iop_module_t * dt_iop_gui_get_previous_visible_module(dt_iop_module_t *module)
GtkWidget * dt_iop_togglebutton_new(dt_iop_module_t *self, const char *section, const gchar *label, const gchar *ctrl_label, GCallback callback, gboolean local, guint accel_key, GdkModifierType mods, DTGTKCairoPaintIconFunc paint, GtkWidget *box)
static gboolean _iop_plugin_body_button_press(GtkWidget *w, GdkEventButton *e, gpointer user_data)
GtkWidget * dt_bauhaus_toggle_from_params(dt_iop_module_t *self, const char *param)
GtkWidget * dt_iop_gui_get_widget(dt_iop_module_t *module)
GtkWidget * dt_bauhaus_slider_from_params(dt_iop_module_t *self, const char *param)
static void _gui_set_single_expanded(dt_iop_module_t *module, gboolean expanded)
void dt_iop_gui_changed(dt_iop_module_t *action, GtkWidget *widget, gpointer data)
static void _iop_color_picker_data_ready_callback(gpointer instance, gpointer user_data)
gboolean dt_iop_gui_owns_widget(const dt_iop_module_t *module, const GtkWidget *target)
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)
void dt_bauhaus_value_changed_default_callback(GtkWidget *widget)
static void _add_widget_to_module_list(dt_iop_module_t *self, GtkWidget *widget)
void dt_iop_gui_enter_critical_section(dt_iop_module_t *const module)
Take the module's GUI lock, serialising access to its dt_iop_gui_data_t.
#define DT_IOP_HEADER_IGNORE_RELEASE
static void _presets_popup_callback(GtkButton *button, dt_iop_module_t *module)
#define DT_IOP_HEADER_MENU_DISMISS_CLICK
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)
static gboolean _rename_module_idle(gpointer user_data)
static gboolean _iop_plugin_header_button_press(GtkWidget *w, GdkEventButton *e, gpointer user_data)
gboolean dt_mask_scroll_increases(int up)
gboolean _iop_tooltip_callback(GtkWidget *widget, gint x, gint y, gboolean keyboard_mode, GtkTooltip *tooltip, gpointer user_data)
GtkWidget * dt_bauhaus_combobox_from_params(dt_iop_module_t *self, const char *param)
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)
Create another instance of base, insert it into dev->iop and give it a GUI.
gboolean dt_iop_gui_module_is_visible(dt_iop_module_t *module)
GtkWidget * dt_iop_gui_get_off(dt_iop_module_t *module)
static void _gui_duplicate_callback(GtkButton *button, gpointer user_data)
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 dt_iop_gui_data_t * dt_iop_gui_data(const struct dt_iop_module_t *m)
The module's GUI data blob, NULL-safe for headless callers: IOP process() implementations read it for...
@ DT_INTROSPECTION_TYPE_BOOL
@ DT_INTROSPECTION_TYPE_ENUM
@ DT_INTROSPECTION_TYPE_FLOAT
@ DT_INTROSPECTION_TYPE_UINT
@ DT_INTROSPECTION_TYPE_USHORT
@ DT_INTROSPECTION_TYPE_INT
gchar * delete_underscore(const char *s)
_lib_location_type_t type
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.
float *const restrict const size_t k
#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_masks_iop_use_same_as(struct dt_iop_module_t *module, struct dt_iop_module_t *src)
void dt_masks_form_delete(dt_develop_t *dev, struct dt_iop_module_t *module, dt_masks_form_t *grp, dt_masks_form_t *form)
dt_masks_form_t * dt_masks_get_from_id(dt_develop_t *dev, int id)
void dt_masks_reset_form_gui(dt_develop_t *dev)
void dt_masks_group_update_name(dt_iop_module_t *module)
The interactive half of the masks subsystem: the editing state (dt_masks_form_gui_t),...
#define dt_free(ptr)
g_free() ptr and set it to NULL, skipping both if it is already NULL.
data.presets: a module's saved parameters, with the conditions under which it auto-applies.
GtkWidget * dtgtk_reset_label_new(const gchar *text)
void dt_sentry_record_module_usage(const char *category, const char *name)
#define DT_DEBUG_CONTROL_SIGNAL_DISCONNECT(ctlsig, cb, user_data)
#define DT_DEBUG_CONTROL_SIGNAL_RAISE(ctlsig, signal,...)
struct dt_control_signal_t * dt_control_signal_get_global(void)
@ 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)
const float const float param
struct dt_iop_module_t * gui_module
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...
dt_iop_params_t * default_params
struct dt_develop_blend_params_t * blend_params
struct dt_iop_module_gui_t * gui
struct dt_develop_t * dev
dt_iop_module_t *int offset
dt_iop_module_t *void * param
void dt_telemetry_record_module_usage(const char *category, const char *name)
dt_bauhaus_combobox_data_t combobox
char * dt_get_help_url(char *name)
gchar * dt_util_str_replace(const gchar *string, const gchar *pattern, const gchar *substitute)
void dt_ui_container_add_widget(dt_ui_t *ui, const dt_ui_container_t c, GtkWidget *w)
@ DT_UI_CONTAINER_PANEL_RIGHT_CENTER