36#define DT_DEV_TOOLBOX_BUTTON_TYPE_KEY "dt-dev-toolbox-button-type"
63#define DT_DEV_TOOLBOX_PRESHOW_FN_KEY "dt-dev-toolbox-popover-preshow-fn"
64#define DT_DEV_TOOLBOX_PRESHOW_DATA_KEY "dt-dev-toolbox-popover-preshow-data"
74 GtkPopover *popover = GTK_POPOVER(user_data);
76 GtkWidget *button = gtk_popover_get_relative_to(popover);
77 GdkRectangle button_rect = { 0 };
79 GdkDevice *pointer = gdk_seat_get_pointer(gdk_display_get_default_seat(gdk_display_get_default()));
82 GdkWindow *pointer_window = gdk_device_get_window_at_position(pointer, &
x, &y);
83 gpointer pointer_widget = NULL;
84 if(pointer_window) gdk_window_get_user_data(pointer_window, &pointer_widget);
86 gtk_popover_set_relative_to(popover, anchor ? anchor : button);
88 GdkRectangle
rect = { button_rect.
x + button_rect.width / 2, button_rect.y, 1, 1 };
90 if(pointer_widget == anchor)
95 else if(pointer_widget && anchor && pointer_widget != anchor)
97 gtk_widget_translate_coordinates(pointer_widget, anchor,
x, y, &
rect.
x, &
rect.
y);
100 gtk_popover_set_pointing_to(popover, &
rect);
105 gtk_widget_show_all(GTK_WIDGET(popover));
113 static guint start_time = 0;
116 g_object_get(gtk_settings_get_default(),
"gtk-long-press-time", &delay, NULL);
118 if((event->type == GDK_BUTTON_PRESS && event->button == 3)
119 || (event->type == GDK_BUTTON_RELEASE && event->time - start_time > delay))
121 gtk_popover_set_relative_to(GTK_POPOVER(popover), button);
122 g_object_set(G_OBJECT(popover),
"transitions-enabled",
FALSE, NULL);
129 start_time =
event->time;
148 GdkModifierType modifier, gpointer data)
151 if(
IS_NULL_PTR(button) || !gtk_widget_is_visible(button) || !gtk_widget_is_sensitive(button))
return FALSE;
153 gtk_button_clicked(GTK_BUTTON(button));
158 GdkModifierType modifier, gpointer data)
161 if(
IS_NULL_PTR(button) || !gtk_widget_is_visible(button) || !gtk_widget_is_sensitive(button))
return FALSE;
166 gtk_widget_grab_focus(button);
167 gtk_popover_set_relative_to(GTK_POPOVER(popover), button);
175 for(
size_t i = 0;
i < n_buttons;
i++)
178 const char *activate_label = NULL;
179 const char *focus_label = NULL;
185 activate_label = N_(
"Toggle ISO 12646 color assessment conditions");
190 activate_label = N_(
"Toggle clipping indication");
191 focus_label = N_(
"Focus clipping indication options");
196 activate_label = N_(
"Toggle raw over exposed indication");
197 focus_label = N_(
"Focus raw over exposed indication options");
202 activate_label = N_(
"Toggle softproofing");
203 focus_label = N_(
"Focus softproof options");
208 activate_label = N_(
"Toggle gamut checking");
209 focus_label = N_(
"Focus gamut checking options");
214 focus_label = N_(
"Focus picture display options");
220 category, activate_label, 0, 0,
FALSE, _(
"Triggers the action"));
223 category, focus_label, 0, 0,
FALSE, _(
"Shows the options popover"));
347 _(
"select the metric you want to preview\nfull gamut is the combination of all other modes"),
349 N_(
"full gamut"), N_(
"any RGB channel"), N_(
"luminance only"), N_(
"saturation only"));
350 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(mode),
TRUE,
TRUE, 0);
356 N_(
"purple & green"));
357 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(colorscheme),
TRUE,
TRUE, 0);
363 gtk_widget_set_tooltip_text(lower, _(
"clipping threshold for the black point,\n"
364 "in EV, relatively to white (0 EV).\n"
365 "8 bits sRGB clips blacks at -12.69 EV,\n"
366 "8 bits Adobe RGB clips blacks at -19.79 EV,\n"
367 "16 bits sRGB clips blacks at -20.69 EV,\n"
368 "typical fine-art mat prints produce black at -5.30 EV,\n"
369 "typical color glossy prints produce black at -8.00 EV,\n"
370 "typical B&W glossy prints produce black at -9.00 EV."));
372 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(lower),
TRUE,
TRUE, 0);
379 gtk_widget_set_tooltip_text(upper, _(
"clipping threshold for the white point.\n100% is peak medium luminance."));
381 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(upper),
TRUE,
TRUE, 0);
383 gtk_widget_show_all(vbox);
425 N_(
"mark with CFA color"), N_(
"mark with solid color"), N_(
"false color"));
426 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(mode),
TRUE,
TRUE, 0);
436 gtk_widget_set_tooltip_text(
437 colorscheme, _(
"select the solid color to indicate over exposure.\nwill only be used if mode = mark with solid color"));
439 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(colorscheme),
TRUE,
TRUE, 0);
445 _(
"threshold of what shall be considered overexposed\n1.0 - white level\n0.0 - black level"));
449 gtk_widget_show_all(vbox);
513 gtk_box_pack_start(GTK_BOX(vbox), softproof_profile,
TRUE,
TRUE, 0);
528 char *system_profile_dir = g_build_filename(datadir,
"color",
"out", NULL);
529 char *user_profile_dir = g_build_filename(confdir,
"color",
"out", NULL);
530 char *
tooltip = g_strdup_printf(_(
"softproof ICC profiles in %s or %s"), user_profile_dir, system_profile_dir);
531 gtk_widget_set_tooltip_text(softproof_profile,
tooltip);
538 gtk_widget_show_all(vbox);
572 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(brightness),
TRUE,
TRUE, 0);
579 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(borders),
TRUE,
TRUE, 0);
599 tooltip = _(
"toggle ISO 12646 color assessment conditions");
605 tooltip = _(
"toggle clipping indication\nright click for options");
611 tooltip = _(
"toggle raw over exposed indication\nright click for options");
617 tooltip = _(
"toggle softproofing\nright click for profile options");
623 tooltip = _(
"toggle gamut checking\nright click for profile options");
629 tooltip = _(
"Picture display options");
635 gtk_widget_set_tooltip_text(button,
tooltip);
636 g_signal_connect(G_OBJECT(button),
"clicked", G_CALLBACK(
_button_clicked), dev);
644 gboolean has_softproof =
FALSE;
645 gboolean has_gamut =
FALSE;
647 for(
size_t i = 0;
i < n_buttons;
i++)
657 has_softproof =
TRUE;
675 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, 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)
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,...)
static void profile_changed(GtkWidget *widget, gpointer user_data)
@ DT_COLORSPACES_PROFILE_TYPE_SOFTPROOF
typedef void((*dt_cache_allocate_t)(void *userdata, dt_cache_entry_t *entry))
void dt_conf_set_int(const char *name, int val)
int dt_conf_get_int(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 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_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)
#define dt_dev_configure(dev, wd, ht)
void dtgtk_cairo_paint_bulb(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_overexposed(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_gamut_check(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_rawoverexposed(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_softproof(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_display(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dt_loc_get_datadir(char *datadir, size_t bufsize)
void dt_loc_get_user_config_dir(char *configdir, size_t bufsize)
void dt_gui_add_help_link(GtkWidget *widget, char *link)
GtkWidget * dt_gui_get_popup_relative_widget(GtkWidget *widget, GdkRectangle *rect)
Resolve the widget used as parent for nested popups on Wayland.
#define DT_GUI_BOX_SPACING
#define DT_PIXEL_APPLY_DPI(value)
#define DT_DEBUG_CONTROL_SIGNAL_RAISE(ctlsig, signal,...)
@ 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.
struct _GtkWidget GtkWidget
struct dt_gui_gtk_t * gui
struct dt_colorspaces_t * color_profiles
struct dt_control_signal_t * signals
struct dt_bauhaus_t * bauhaus
struct dt_view_manager_t * view_manager
dt_colorspaces_color_profile_type_t type
dt_colorspaces_color_profile_type_t softproof_type
dt_colorspaces_color_mode_t mode
char softproof_filename[512]
struct dt_develop_t::@19 roi
struct dt_develop_t::@23 overexposed
dt_clipping_preview_mode_t mode
struct dt_develop_t::@25 display
GtkWidget * floating_window
dt_dev_overexposed_colorscheme_t colorscheme
struct dt_develop_t::@27 profile
struct dt_develop_t::@26 iso_12646
GtkWidget * softproof_button
struct dt_develop_t::@24 rawoverexposed
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)