37#define DT_DEV_TOOLBOX_BUTTON_TYPE_KEY "dt-dev-toolbox-button-type"
64#define DT_DEV_TOOLBOX_PRESHOW_FN_KEY "dt-dev-toolbox-popover-preshow-fn"
65#define DT_DEV_TOOLBOX_PRESHOW_DATA_KEY "dt-dev-toolbox-popover-preshow-data"
75 GtkPopover *popover = GTK_POPOVER(user_data);
77 GtkWidget *button = gtk_popover_get_relative_to(popover);
78 GdkRectangle button_rect = { 0 };
80 GdkDevice *pointer = gdk_seat_get_pointer(gdk_display_get_default_seat(gdk_display_get_default()));
83 GdkWindow *pointer_window = gdk_device_get_window_at_position(pointer, &
x, &y);
84 gpointer pointer_widget = NULL;
85 if(pointer_window) gdk_window_get_user_data(pointer_window, &pointer_widget);
87 gtk_popover_set_relative_to(popover, anchor ? anchor : button);
89 GdkRectangle
rect = { button_rect.
x + button_rect.width / 2, button_rect.y, 1, 1 };
91 if(pointer_widget == anchor)
96 else if(pointer_widget && anchor && pointer_widget != anchor)
98 gtk_widget_translate_coordinates(pointer_widget, anchor,
x, y, &
rect.
x, &
rect.
y);
101 gtk_popover_set_pointing_to(popover, &
rect);
106 gtk_widget_show_all(GTK_WIDGET(popover));
114 static guint start_time = 0;
117 g_object_get(gtk_settings_get_default(),
"gtk-long-press-time", &delay, NULL);
119 if((event->type == GDK_BUTTON_PRESS && event->button == 3)
120 || (event->type == GDK_BUTTON_RELEASE && event->time - start_time > delay))
122 gtk_popover_set_relative_to(GTK_POPOVER(popover), button);
123 g_object_set(G_OBJECT(popover),
"transitions-enabled",
FALSE, NULL);
130 start_time =
event->time;
149 GdkModifierType modifier, gpointer data)
152 if(
IS_NULL_PTR(button) || !gtk_widget_is_visible(button) || !gtk_widget_is_sensitive(button))
return FALSE;
154 gtk_button_clicked(GTK_BUTTON(button));
159 GdkModifierType modifier, gpointer data)
162 if(
IS_NULL_PTR(button) || !gtk_widget_is_visible(button) || !gtk_widget_is_sensitive(button))
return FALSE;
167 gtk_widget_grab_focus(button);
168 gtk_popover_set_relative_to(GTK_POPOVER(popover), button);
176 for(
size_t i = 0;
i < n_buttons;
i++)
179 const char *activate_label = NULL;
180 const char *focus_label = NULL;
186 activate_label = N_(
"Toggle ISO 12646 color assessment conditions");
191 activate_label = N_(
"Toggle clipping indication");
192 focus_label = N_(
"Focus clipping indication options");
197 activate_label = N_(
"Toggle raw over exposed indication");
198 focus_label = N_(
"Focus raw over exposed indication options");
203 activate_label = N_(
"Toggle softproofing");
204 focus_label = N_(
"Focus softproof options");
209 activate_label = N_(
"Toggle gamut checking");
210 focus_label = N_(
"Focus gamut checking options");
215 focus_label = N_(
"Focus picture display options");
221 category, activate_label, 0, 0,
FALSE, _(
"Triggers the action"));
224 category, focus_label, 0, 0,
FALSE, _(
"Shows the options popover"));
350 _(
"select the metric you want to preview\nfull gamut is the combination of all other modes"),
352 N_(
"full gamut"), N_(
"any RGB channel"), N_(
"luminance only"), N_(
"saturation only"));
353 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(mode),
TRUE,
TRUE, 0);
359 N_(
"purple & green"));
360 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(colorscheme),
TRUE,
TRUE, 0);
366 gtk_widget_set_tooltip_text(lower, _(
"clipping threshold for the black point,\n"
367 "in EV, relatively to white (0 EV).\n"
368 "8 bits sRGB clips blacks at -12.69 EV,\n"
369 "8 bits Adobe RGB clips blacks at -19.79 EV,\n"
370 "16 bits sRGB clips blacks at -20.69 EV,\n"
371 "typical fine-art mat prints produce black at -5.30 EV,\n"
372 "typical color glossy prints produce black at -8.00 EV,\n"
373 "typical B&W glossy prints produce black at -9.00 EV."));
375 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(lower),
TRUE,
TRUE, 0);
382 gtk_widget_set_tooltip_text(upper, _(
"clipping threshold for the white point.\n100% is peak medium luminance."));
384 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(upper),
TRUE,
TRUE, 0);
386 gtk_widget_show_all(vbox);
428 N_(
"mark with CFA color"), N_(
"mark with solid color"), N_(
"false color"));
429 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(mode),
TRUE,
TRUE, 0);
439 gtk_widget_set_tooltip_text(
440 colorscheme, _(
"select the solid color to indicate over exposure.\nwill only be used if mode = mark with solid color"));
442 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(colorscheme),
TRUE,
TRUE, 0);
448 _(
"threshold of what shall be considered overexposed\n1.0 - white level\n0.0 - black level"));
452 gtk_widget_show_all(vbox);
504 gtk_box_pack_start(GTK_BOX(vbox), softproof_profile,
TRUE,
TRUE, 0);
512 for(
size_t k = 0;
k < n_out_profiles;
k++)
520 char *system_profile_dir = g_build_filename(datadir,
"color",
"out", NULL);
521 char *user_profile_dir = g_build_filename(confdir,
"color",
"out", NULL);
522 char *
tooltip = g_strdup_printf(_(
"softproof ICC profiles in %s or %s"), user_profile_dir, system_profile_dir);
523 gtk_widget_set_tooltip_text(softproof_profile,
tooltip);
530 gtk_widget_show_all(vbox);
564 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(brightness),
TRUE,
TRUE, 0);
571 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(borders),
TRUE,
TRUE, 0);
591 tooltip = _(
"toggle ISO 12646 color assessment conditions");
597 tooltip = _(
"toggle clipping indication\nright click for options");
603 tooltip = _(
"toggle raw over exposed indication\nright click for options");
609 tooltip = _(
"toggle softproofing\nright click for profile options");
615 tooltip = _(
"toggle gamut checking\nright click for profile options");
621 tooltip = _(
"Picture display options");
627 gtk_widget_set_tooltip_text(button,
tooltip);
628 g_signal_connect(G_OBJECT(button),
"clicked", G_CALLBACK(
_button_clicked), dev);
636 gboolean has_softproof =
FALSE;
637 gboolean has_gamut =
FALSE;
639 for(
size_t i = 0;
i < n_buttons;
i++)
649 has_softproof =
TRUE;
667 if(has_softproof && has_gamut)
void dt_accels_new_action_shortcut(dt_accels_t *accels, gboolean(*action_callback)(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data), gpointer data, GtkWidget *target_widget, GtkAccelGroup *accel_group, const gchar *action_scope, const gchar *action_name, guint key_val, GdkModifierType accel_mods, const gboolean lock, const char *description)
Register a new shortcut for a generic action, setting up its path, default keys and accel group....
Handle default and user-set shortcuts (accelerators)
struct dt_accels_t * dt_gui_get_accels(void)
void dt_gui_add_help_link(GtkWidget *widget, char *link)
const char ** views(dt_lib_module_t *self)
float dt_bauhaus_slider_get(GtkWidget *widget)
int dt_bauhaus_combobox_get(GtkWidget *widget)
void dt_bauhaus_combobox_set_entries_ellipsis(GtkWidget *widget, PangoEllipsizeMode ellipis)
const char * dt_bauhaus_combobox_get_text(GtkWidget *widget)
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_slider_new_with_range(dt_bauhaus_t *bh, dt_gui_module_t *self, float min, float max, float step, float defval, int digits)
GtkWidget * dt_bauhaus_combobox_new(dt_bauhaus_t *bh, dt_gui_module_t *self)
void dt_bauhaus_slider_set_format(GtkWidget *widget, const char *format)
void dt_bauhaus_combobox_add(GtkWidget *widget, const char *text)
#define DT_BAUHAUS_COMBOBOX_NEW_FULL(bauhaus, widget, action, label, tip, pos, callback, data,...)
typedef void((*dt_cache_allocate_t)(void *userdata, dt_cache_entry_t *entry))
static void profile_changed(GtkWidget *widget, gpointer user_data)
size_t dt_colorspaces_enumerate_profiles(const dt_colorspaces_profile_role_t role, dt_colorprofile_desc_t **out)
Ordered snapshot of every profile registered for one role.
int dt_colorspaces_profile_index(const dt_colorspaces_profile_role_t role, const dt_colorspaces_color_profile_type_t type, const char *const filename)
Combo position of (type, filename) within direction.
gboolean dt_colorprofiles_set_softproof_profile_choice(const dt_colorspaces_color_profile_type_t type, const char *const filename)
Set the soft-proofing target identity.
gboolean dt_colorspaces_profile_at(const dt_colorspaces_profile_role_t role, const int index, dt_colorprofile_desc_t *const out)
Identity of the profile at index within direction.
dt_colorspaces_color_mode_t dt_colorprofiles_toggle_mode(const dt_colorspaces_color_mode_t mode)
Turn mode on, or back to DT_PROFILE_NORMAL if it is already the current mode, as one locked read-modi...
void dt_colorprofiles_get_settings(dt_colorprofiles_settings_t *const out)
Copy the current settings into caller-provided storage, under one lock.
The colour-profile module's API: which profiles exist, and how to apply one.
struct _GtkWidget GtkWidget
GtkWidget, opaque, spelled exactly as GTK spells it.
void dt_conf_set_int(const char *name, int val)
int dt_conf_get_int(const char *name)
Integer for name, clamped to the bounds declared in the XML.
void dt_control_queue_redraw_center()
Request a redraw of the centre view.
struct dt_view_manager_t * dt_view_manager_get_global(void)
struct dt_bauhaus_t * dt_bauhaus_get_global(void)
void dt_dev_pixelpipe_change_zoom_main(dt_develop_t *dev)
#define dt_dev_pixelpipe_resync_history_main(dev)
#define dt_dev_pixelpipe_update_history_main(dev)
gboolean dt_dev_viewport_set_border(dt_develop_t *dev, const int32_t border_size)
int32_t dt_dev_viewport_border_size(const dt_develop_t *dev)
int32_t dt_dev_viewport_widget_height(const dt_develop_t *dev)
int32_t dt_dev_viewport_widget_width(const dt_develop_t *dev)
#define dt_dev_configure(dev, wd, ht)
void dt_loc_get_datadir(char *datadir, size_t bufsize)
void dt_loc_get_user_config_dir(char *configdir, size_t bufsize)
_lib_location_type_t type
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...
#define dt_free_align(ptr)
Release memory from dt_alloc_align() and set ptr to NULL.
#define dt_free(ptr)
g_free() ptr and set it to NULL, skipping both if it is already NULL.
#define DT_PATH_MAX
Buffer size for a filesystem path anywhere in Ansel.
@ DT_COLORSPACE_SRGB
sRGB – registered TWICE, and the two entries are not interchangeable.
@ DT_COLORSPACES_PROFILE_TYPE_SOFTPROOF
@ DT_PROFILE_ROLE_OUTPUT
Listed in the output/export-profile combo (colorout, export).
Asking the interface to repaint itself.
#define DT_DEBUG_CONTROL_SIGNAL_RAISE(ctlsig, signal,...)
struct dt_control_signal_t * dt_control_signal_get_global(void)
@ DT_SIGNAL_CONTROL_PROFILE_USER_CHANGED
This signal is raised when a profile is changed by the user 1 uint32_t : the profile type that has ch...
@ DT_SIGNAL_DARKROOM_UI_CHANGED
Signal that the darkroom GUI color changed.
A profile's public identity: what the GUI displays and stores, and nothing else.
dt_colorspaces_color_profile_type_t type
what to store in params / conf
char filename[DT_IOP_COLOR_ICC_LEN]
"" unless type == DT_COLORSPACE_FILE
Consistent snapshot of the display and soft-proofing settings.
char softproof_filename[DT_IOP_COLOR_ICC_LEN]
only meaningful for DT_COLORSPACE_FILE
dt_colorspaces_color_profile_type_t softproof_type
proofing target identity
dt_colorspaces_color_mode_t mode
NORMAL / SOFTPROOF / GAMUTCHECK.
struct dt_develop_t::@17 display
dt_clipping_preview_mode_t mode
GtkWidget * floating_window
struct dt_develop_t::@15 overexposed
struct dt_develop_t::@19 profile
dt_dev_overexposed_colorscheme_t colorscheme
struct dt_develop_t::@18 iso_12646
struct dt_develop_t::@16 rawoverexposed
GtkWidget * softproof_button
char * dt_get_help_url(char *name)
void dt_view_manager_module_toolbox_add(dt_view_manager_t *vm, GtkWidget *tool, dt_view_type_flags_t views)