Ansel 0.0
A darktable fork - bloat + design vision
Loading...
Searching...
No Matches
display.c
Go to the documentation of this file.
1/*
2 This file is part of the Ansel project.
3 Copyright (C) 2023, 2025 Alynx Zhou.
4 Copyright (C) 2023, 2025-2026 Aurélien PIERRE.
5 Copyright (C) 2023 Luca Zulberti.
6
7 Ansel is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
11
12 Ansel is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with Ansel. If not, see <http://www.gnu.org/licenses/>.
19*/
20#include "common/darktable.h"
21#include "common/collection.h"
22#include "control/control.h"
24#include "gui/actions/menu.h"
25#include "gui/gtk.h"
26#include "views/view.h"
27
28#include "gui/window_manager.h"
29
30#include <gtk/gtk.h>
31
32
35{
37 return gdk_window_get_state(gtk_widget_get_window(widget)) & GDK_WINDOW_STATE_FULLSCREEN;
38}
39
40static gboolean full_screen_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
41{
43
45 {
46 gtk_window_unfullscreen(GTK_WINDOW(window));
47
48#ifdef GDK_WINDOWING_QUARTZ
49 // workaround for GTK Quartz backend bug
50 gtk_window_set_title(GTK_WINDOW(window), "Ansel");
51#endif
52
53 // Hide window controls
55 }
56 else
57 {
58 gtk_window_fullscreen(GTK_WINDOW(window));
59
60#ifdef GDK_WINDOWING_QUARTZ
61 // workaround for GTK Quartz backend bug
62 gtk_window_set_title(GTK_WINDOW(window), "Ansel Preview");
63#endif
64
65 // Show window controls
67 }
68
69#ifdef GDK_WINDOWING_QUARTZ
70 // Mac OS workaround: always re-anchor the window to the bottom of the screen
71 GdkWindow *win = gtk_widget_get_window(window);
72 GdkDisplay *display = gtk_widget_get_display(window);
73 GdkMonitor *monitor = gdk_display_get_monitor_at_window(display, win);
74 GdkRectangle geometry;
75 gdk_monitor_get_geometry(monitor, &geometry);
76
77 int w, h;
78 gtk_window_get_size(GTK_WINDOW(window), &w, &h);
79 gtk_window_move(GTK_WINDOW(window), geometry.x + geometry.width - w, geometry.y + geometry.height - h);
80#endif
81
83
84 return TRUE;
85}
86
88static gboolean _panel_is_visible(dt_ui_panel_t panel)
89{
90 gchar *key = panels_get_view_path("panel_collaps_state");
92 {
93 dt_free(key);
94 return FALSE;
95 }
96 key = panels_get_panel_path(panel, "_visible");
97 const gboolean ret = dt_conf_get_bool(key);
98 dt_free(key);
99 return ret;
100}
101
102static gboolean _toggle_side_borders_accel_callback(GtkAccelGroup *accel_group, GObject *accelerable, guint keyval,
103 GdkModifierType modifier, gpointer data)
104{
106
107 /* trigger invalidation of centerview to reprocess pipe */
109 return TRUE;
110}
111
113{
114 gchar *key = panels_get_view_path("panel_collaps_state");
115 const uint32_t state = dt_conf_get_int(key);
116
117 if(state) dt_conf_set_int(key, 0);
118 else dt_conf_set_int(key, 1);
119
121 dt_free(key);
122}
123
124void dt_ui_panel_show(dt_ui_t *ui, const dt_ui_panel_t p, gboolean show, gboolean write)
125{
126 g_return_if_fail(GTK_IS_WIDGET(ui->panels[p]));
127
128 // for left and right sides, panels are inside a gtkoverlay
129 GtkWidget *over_panel = NULL;
131 over_panel = gtk_widget_get_parent(ui->panels[p]);
132
133 if(show)
134 {
135 gtk_widget_show(ui->panels[p]);
136 if(over_panel) gtk_widget_show(over_panel);
137
139 {
140 const int32_t imgid = dt_view_active_images_get_first();
141 if(imgid > UNKNOWN_IMAGE)
142 {
146 g_idle_add((GSourceFunc)dt_thumbtable_scroll_to_selection, ui->thumbtable_filmstrip);
147 }
148 }
149 }
150 else
151 {
152 gtk_widget_hide(ui->panels[p]);
153 if(over_panel) gtk_widget_hide(over_panel);
154 }
155
156 if(write)
157 {
158 gchar *key;
159 if(show)
160 {
161 // we reset the collaps_panel value if we show a panel
162 key = panels_get_view_path("panel_collaps_state");
163 if(dt_conf_get_int(key) != 0)
164 {
166 dt_free(key);
167 // we ensure that all panels state are recorded as hidden
168 for(int k = 0; k < DT_UI_PANEL_SIZE; k++)
169 {
170 key = panels_get_panel_path(k, "_visible");
172 dt_free(key);
173 }
174 }
175 else
176 dt_free(key);
177 key = panels_get_panel_path(p, "_visible");
178 dt_conf_set_bool(key, show);
179 dt_free(key);
180 }
181 else
182 {
183 // if it was the last visible panel, we set collaps_panel value instead
184 // so collapsing panels after will have an effect
185 gboolean collapse = TRUE;
186 for(int k = 0; k < DT_UI_PANEL_SIZE; k++)
187 {
188 if(k != p && dt_ui_panel_visible(ui, k))
189 {
190 collapse = FALSE;
191 break;
192 }
193 }
194
195 if(collapse)
196 {
197 key = panels_get_view_path("panel_collaps_state");
199 dt_free(key);
200 }
201 else
202 {
203 key = panels_get_panel_path(p, "_visible");
204 dt_conf_set_bool(key, show);
205 dt_free(key);
206 }
207 }
208 }
209}
210
212{
213 g_return_val_if_fail(GTK_IS_WIDGET(ui->panels[p]), FALSE);
214 return gtk_widget_get_visible(ui->panels[p]);
215}
216
217
218static gboolean panel_left_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
219{
221 return TRUE;
222}
223
228
229static gboolean panel_top_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
230{
232 return TRUE;
233}
234
239
241{
242 // Filmstrip is not visible in lighttable
244 return (view && strcmp(view->module_name, "lighttable"));
245}
246
247
248static gboolean panel_right_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
249{
252
253 return TRUE;
254}
255
260
261static gboolean filmstrip_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
262{
265
266 return TRUE;
267}
268
273
281
282static gboolean profile_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
283{
285
286 gboolean profile_changed = FALSE;
290 {
295 }
296
297 if(!profile_changed)
298 {
299 // profile not found, fall back to system display profile. shouldn't happen
300 fprintf(stderr, "can't find display profile `%s', using system display profile instead\n", pp->filename);
304 }
305
307 {
308 pthread_rwlock_rdlock(&darktable.color_profiles->xprofile_lock);
310 pthread_rwlock_unlock(&darktable.color_profiles->xprofile_lock);
312 }
313 return TRUE;
314}
315
317{
318 if(!strcmp(string, "perceptual"))
320 else if(!strcmp(string, "relative colorimetric"))
322 else if(!strcmp(string, "saturation"))
324 else if(!strcmp(string, "absolute colorimetric"))
326 else
328
329 // Those seem to make no difference with most ICC profiles anyway.
330 // Perceptual needs A_to_B and B_to_A LUT defined in the .icc profile to work.
331 // Since most profiles don't have them, it falls back to something close to relative colorimetric.
332 // Really not sure if it's our implementation or if it's LittleCMS2 that is faulty here.
333 // This option just makes it look like pRoFESsional CoLoR mAnAgeMEnt®©.
334 // ICC intents are pretty much bogus in the first place... (gamut mapping by RGB clipping...)
335}
336
337static gboolean intent_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
338{
340 dt_iop_color_intent_t new_intent = string_to_color_intent(get_custom_data(GTK_WIDGET(user_data)));
341 if(new_intent != old_intent)
342 {
344 pthread_rwlock_rdlock(&darktable.color_profiles->xprofile_lock);
346 pthread_rwlock_unlock(&darktable.color_profiles->xprofile_lock);
348 }
349 return TRUE;
350}
351
356
357static gboolean always_hide_overlays_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
358{
361 return TRUE;
362}
363
365{
366 return dt_conf_get_int("plugins/lighttable/overlays/global") == DT_THUMBNAIL_OVERLAYS_NONE;
367}
368
369static gboolean hover_overlays_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
370{
373 return TRUE;
374}
375
377{
378 return dt_conf_get_int("plugins/lighttable/overlays/global") == DT_THUMBNAIL_OVERLAYS_HOVER_NORMAL;
379}
380
381static gboolean always_show_overlays_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
382{
385 return TRUE;
386}
387
389{
390 return dt_conf_get_int("plugins/lighttable/overlays/global") == DT_THUMBNAIL_OVERLAYS_ALWAYS_NORMAL;
391}
392
393static gboolean group_borders_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
394{
395 gboolean borders = !dt_conf_get_bool("plugins/lighttable/group_borders");
396 dt_conf_set_bool("plugins/lighttable/group_borders", borders);
399 return TRUE;
400}
401
403{
404 return dt_conf_get_bool("plugins/lighttable/group_borders");
405}
406
407static gboolean collapse_grouped_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
408{
409 dt_conf_set_bool("ui_last/grouping", !dt_conf_get_bool("ui_last/grouping"));
411 return TRUE;
412}
413
415{
416 return dt_conf_get_bool("ui_last/grouping");
417}
418
419static gboolean _jpg_checked(GtkWidget *widget)
420{
421 const int item = GPOINTER_TO_INT(get_custom_data(widget));
422 return item == dt_conf_get_int("lighttable/embedded_jpg");
423}
424
425static gboolean _jpg_combobox_changed(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
426{
427 const int mode = GPOINTER_TO_INT(get_custom_data(GTK_WIDGET(user_data)));
428 if(mode != dt_conf_get_int("lighttable/embedded_jpg"))
429 {
430 GList *imgs = dt_collection_get_all(darktable.collection, -1);
431
432 // Empty the mipmap cache for the current collection, but only on RAM
433 // Don't delete disk cache, but RAM cache may be flushed to disk if user param sets it.
434 for(GList *img = g_list_first(imgs); img; img = g_list_next(img))
435 {
436 const int32_t imgid = GPOINTER_TO_INT(img->data);
438 }
439 g_list_free(imgs);
440 imgs = NULL;
441
442 // Change the mode
443 dt_conf_set_int("lighttable/embedded_jpg", mode);
444
445 // Redraw thumbnails
447 }
448 return TRUE;
449}
450
451void append_display(GtkWidget **menus, GList **lists, const dt_menus_t index)
452{
453 // Parent sub-menu color profile
454 add_top_submenu_entry(menus, lists, _("Monitor color profile"), index);
455 GtkWidget *parent = get_last_widget(lists);
456
457 // Add available color profiles to the sub-menu
458 for(const GList *l = darktable.color_profiles->profiles; l; l = g_list_next(l))
459 {
461 if(prof->display_pos > -1)
462 {
463 add_sub_sub_menu_entry(menus, parent, lists, prof->name, index, prof, profile_callback, profile_checked_callback, NULL, NULL, 0, 0);
464 //gtk_check_menu_item_set_draw_as_radio(GTK_CHECK_MENU_ITEM(get_last_widget(lists)), TRUE);
465 }
466 }
467
468 // Parent sub-menu profile intent
469 add_top_submenu_entry(menus, lists, _("Monitor color intent"), index);
470 parent = get_last_widget(lists);
471
472 const char *intents[4] = { _("Perceptual"), _("Relative colorimetric"), C_("rendering intent", "Saturation"),
473 _("Absolute colorimetric") };
474 // non-translatable strings to store in menu items for later mapping with dt_iop_color_intent_t
475 const char *data[4] = { "perceptual", "relative colorimetric", "saturation", "absolute colorimetric" };
476
477 for(int i = 0; i < 4; i++)
478 add_sub_sub_menu_entry(menus, parent, lists, intents[i], index, (void *)data[i], intent_callback, intent_checked_callback, NULL, NULL, 0, 0);
479
480 add_menu_separator(menus[index]);
481
482 // Parent sub-menu panels
483 add_top_submenu_entry(menus, lists, _("Panels"), index);
484 parent = get_last_widget(lists);
485
486 // Children of sub-menu panels
487 add_sub_sub_menu_entry(menus, parent, lists, _("Top"), index, NULL, panel_top_callback,
488 panel_top_checked_callback, NULL, NULL, GDK_KEY_t, GDK_CONTROL_MASK | GDK_SHIFT_MASK);
489
490 add_sub_sub_menu_entry(menus, parent, lists, _("Left"), index, NULL,
491 panel_left_callback, panel_left_checked_callback, NULL, NULL, GDK_KEY_l, GDK_CONTROL_MASK | GDK_SHIFT_MASK);
492
493 add_sub_sub_menu_entry(menus, parent, lists, _("Right"), index, NULL,
494 panel_right_callback, panel_right_checked_callback, NULL, available_in_lighttable_callback, GDK_KEY_r, GDK_CONTROL_MASK | GDK_SHIFT_MASK);
495
496 add_sub_sub_menu_entry(menus, parent, lists, _("Filmstrip"), index, NULL,
497 filmstrip_callback, filmstrip_checked_callback, NULL, available_in_lighttable_callback, GDK_KEY_f, GDK_CONTROL_MASK | GDK_SHIFT_MASK);
498
499 add_menu_separator(menus[index]);
500
501 // Lighttable & Filmstrip options
502 add_top_submenu_entry(menus, lists, _("Thumbnail overlays"), index);
503 parent = get_last_widget(lists);
504
505 add_sub_sub_menu_entry(menus, parent, lists, _("Always hide"), index, NULL,
506 always_hide_overlays_callback, always_hide_overlays_checked_callback, NULL, NULL, GDK_KEY_h, GDK_CONTROL_MASK | GDK_SHIFT_MASK);
507
508 add_sub_sub_menu_entry(menus, parent, lists, _("Show on hover"), index, NULL,
510
511 add_sub_sub_menu_entry(menus, parent, lists, _("Always show"), index, NULL,
512 always_show_overlays_callback, always_show_overlays_checked_callback, NULL, NULL, GDK_KEY_o, GDK_CONTROL_MASK | GDK_SHIFT_MASK);
513
514 // Submenu embedded JPEG
515 add_top_submenu_entry(menus, lists, _("Thumbnail source"), index);
516 parent = get_last_widget(lists);
517 add_sub_sub_menu_entry(menus, parent, lists, _("Always process the RAW"), index, GINT_TO_POINTER(0),
518 _jpg_combobox_changed, _jpg_checked, NULL, NULL, 0, 0);
519 add_sub_sub_menu_entry(menus, parent, lists, _("Use embedded JPG if unedited"), index, GINT_TO_POINTER(1),
520 _jpg_combobox_changed, _jpg_checked, NULL, NULL, 0, 0);
521 add_sub_sub_menu_entry(menus, parent, lists, _("Always use embedded JPG"), index, GINT_TO_POINTER(2),
522 _jpg_combobox_changed, _jpg_checked, NULL, NULL, 0, 0);
523
524 add_sub_menu_entry(menus, lists, _("Collapse grouped images"), index, NULL, collapse_grouped_callback, collapse_grouped_checked_callback, NULL, NULL, 0, 0);
525
526 add_sub_menu_entry(menus, lists, _("Show group borders"), index, NULL, group_borders_callback,
527 group_borders_checked_callback, NULL, NULL, GDK_KEY_p, GDK_CONTROL_MASK | GDK_SHIFT_MASK);
528
529 add_menu_separator(menus[index]);
530
531 add_sub_menu_entry(menus, lists, _("Full screen"), index, NULL, full_screen_callback,
532 full_screen_checked_callback, NULL, NULL, GDK_KEY_F11, 0);
533
534 dt_accels_new_global_action(_toggle_side_borders_accel_callback, NULL, N_("Global/Actions"), N_("Toggle all panels visibility"), GDK_KEY_F11, GDK_SHIFT_MASK, _("Triggers the action"));
535}
#define TRUE
Definition ashift_lsd.c:162
#define FALSE
Definition ashift_lsd.c:158
static const dt_aligned_pixel_simd_t const dt_adaptation_t const float p
void dt_collection_update_query(const dt_collection_t *collection, dt_collection_change_t query_change, dt_collection_properties_t changed_property, GList *list)
GList * dt_collection_get_all(const dt_collection_t *collection, int limit)
Definition collection.c:889
@ DT_COLLECTION_PROP_GROUPING
Definition collection.h:130
@ DT_COLLECTION_CHANGE_RELOAD
Definition collection.h:151
static void profile_changed(GtkWidget *widget, gpointer user_data)
Definition colorin.c:511
void dt_colorspaces_update_display_transforms()
dt_iop_color_intent_t
Definition colorspaces.h:63
@ DT_INTENT_ABSOLUTE_COLORIMETRIC
Definition colorspaces.h:67
@ DT_INTENT_RELATIVE_COLORIMETRIC
Definition colorspaces.h:65
@ DT_INTENT_PERCEPTUAL
Definition colorspaces.h:64
@ DT_INTENT_SATURATION
Definition colorspaces.h:66
@ DT_COLORSPACE_FILE
Definition colorspaces.h:83
@ DT_COLORSPACE_DISPLAY
Definition colorspaces.h:91
@ DT_COLORSPACES_PROFILE_TYPE_DISPLAY
Definition colorspaces.h:76
char * key
void dt_conf_set_bool(const char *name, int val)
int dt_conf_get_bool(const char *name)
void dt_conf_set_int(const char *name, int val)
int dt_conf_get_int(const char *name)
void dt_control_set_mouse_over_id(int32_t value)
Definition control.c:931
void dt_control_set_keyboard_over_id(int32_t value)
Definition control.c:957
uint32_t view(const dt_view_t *self)
Definition darkroom.c:227
darktable_t darktable
Definition darktable.c:181
#define UNKNOWN_IMAGE
Definition darktable.h:182
#define dt_free(ptr)
Definition darktable.h:456
void dt_dev_pixelpipe_change_zoom_main(dt_develop_t *dev)
static gboolean profile_checked_callback(GtkWidget *widget)
Definition display.c:274
static gboolean filmstrip_checked_callback(GtkWidget *widget)
Definition display.c:269
static gboolean always_show_overlays_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
Definition display.c:381
static gboolean panel_right_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
Definition display.c:248
void dt_ui_panel_show(dt_ui_t *ui, const dt_ui_panel_t p, gboolean show, gboolean write)
shows/hide a panel
Definition display.c:124
static gboolean hover_overlays_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
Definition display.c:369
static gboolean group_borders_checked_callback()
Definition display.c:402
static gboolean collapse_grouped_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
Definition display.c:407
static gboolean panel_left_checked_callback(GtkWidget *widget)
Definition display.c:224
void append_display(GtkWidget **menus, GList **lists, const dt_menus_t index)
Definition display.c:451
static gboolean always_hide_overlays_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
Definition display.c:357
static gboolean available_in_lighttable_callback()
Definition display.c:240
gboolean dt_ui_panel_visible(dt_ui_t *ui, const dt_ui_panel_t p)
get visible state of panel
Definition display.c:211
static gboolean intent_checked_callback(GtkWidget *widget)
Definition display.c:352
gboolean full_screen_checked_callback(GtkWidget *w)
Definition display.c:34
static gboolean panel_left_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
Definition display.c:218
static gboolean intent_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
Definition display.c:337
dt_iop_color_intent_t string_to_color_intent(const char *string)
Definition display.c:316
static gboolean filmstrip_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
Definition display.c:261
static gboolean _toggle_side_borders_accel_callback(GtkAccelGroup *accel_group, GObject *accelerable, guint keyval, GdkModifierType modifier, gpointer data)
Definition display.c:102
static gboolean hover_overlays_checked_callback(GtkWidget *widget)
Definition display.c:376
void dt_ui_toggle_panels_visibility(dt_ui_t *ui)
toggle view of panels eg. collapse/expands to previous view state
Definition display.c:112
static gboolean group_borders_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
Definition display.c:393
static gboolean panel_right_checked_callback(GtkWidget *widget)
Definition display.c:256
static gboolean profile_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
Definition display.c:282
static gboolean always_hide_overlays_checked_callback(GtkWidget *widget)
Definition display.c:364
static gboolean panel_top_checked_callback(GtkWidget *widget)
Definition display.c:235
static gboolean always_show_overlays_checked_callback(GtkWidget *widget)
Definition display.c:388
static gboolean full_screen_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
Definition display.c:40
static gboolean _panel_is_visible(dt_ui_panel_t panel)
Definition display.c:88
static gboolean collapse_grouped_checked_callback()
Definition display.c:414
static gboolean _jpg_combobox_changed(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
Definition display.c:425
static gboolean panel_top_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
Definition display.c:229
static gboolean _jpg_checked(GtkWidget *widget)
Definition display.c:419
GtkWidget * dt_ui_main_window(dt_ui_t *ui)
get the main window widget
#define dt_accels_new_global_action(a, b, c, d, e, f, g)
Definition gtk.h:428
float *const restrict const size_t k
void add_sub_sub_menu_entry(GtkWidget **menus, GtkWidget *parent, GList **lists, const gchar *label, const dt_menus_t index, void *data, gboolean(*action_callback)(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data), gboolean(*checked_callback)(GtkWidget *widget), gboolean(*active_callback)(GtkWidget *widget), gboolean(*sensitive_callback)(GtkWidget *widget), guint key_val, GdkModifierType mods)
Definition menu.c:584
GtkWidget * get_last_widget(GList **list)
Definition menu.c:618
void add_sub_menu_entry(GtkWidget **menus, GList **lists, const gchar *label, const dt_menus_t index, void *data, gboolean(*action_callback)(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data), gboolean(*checked_callback)(GtkWidget *widget), gboolean(*active_callback)(GtkWidget *widget), gboolean(*sensitive_callback)(GtkWidget *widget), guint key_val, GdkModifierType mods)
Definition menu.c:542
void * get_custom_data(GtkWidget *widget)
Definition menu.c:612
void add_top_submenu_entry(GtkWidget **menus, GList **lists, const gchar *label, const dt_menus_t index)
Definition menu.c:515
void add_menu_separator(GtkWidget *menu)
Definition menu.c:598
dt_menus_t
Definition menu.h:42
void dt_mipmap_cache_remove(dt_mipmap_cache_t *cache, const int32_t imgid, const gboolean flush_disk)
#define DT_DEBUG_CONTROL_SIGNAL_RAISE(ctlsig, signal,...)
Definition signal.h:347
@ 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...
Definition signal.h:242
struct _GtkWidget GtkWidget
Definition splash.h:29
const float uint32_t state[4]
struct dt_gui_gtk_t * gui
Definition darktable.h:775
struct dt_colorspaces_t * color_profiles
Definition darktable.h:788
struct dt_collection_t * collection
Definition darktable.h:781
struct dt_mipmap_cache_t * mipmap_cache
Definition darktable.h:776
struct dt_control_signal_t * signals
Definition darktable.h:774
struct dt_develop_t * develop
Definition darktable.h:770
struct dt_view_manager_t * view_manager
Definition darktable.h:772
dt_colorspaces_color_profile_type_t type
pthread_rwlock_t xprofile_lock
dt_colorspaces_color_profile_type_t display_type
char display_filename[512]
dt_iop_color_intent_t display_intent
dt_ui_t * ui
Definition gtk.h:164
dt_thumbtable_t * thumbtable_lighttable
dt_thumbtable_t * thumbtable_filmstrip
GtkWidget * panels[DT_UI_PANEL_SIZE]
@ DT_THUMBNAIL_OVERLAYS_HOVER_NORMAL
Definition thumbnail.h:60
@ DT_THUMBNAIL_OVERLAYS_ALWAYS_NORMAL
Definition thumbnail.h:61
@ DT_THUMBNAIL_OVERLAYS_NONE
Definition thumbnail.h:59
int dt_thumbtable_scroll_to_selection(dt_thumbtable_t *table)
Scroll to show selected content.
Definition thumbtable.c:572
void dt_thumbtable_set_overlays_mode(dt_thumbtable_t *table, dt_thumbnail_overlay_t over)
Set the overlay display mode for thumbnails.
void dt_thumbtable_set_draw_group_borders(dt_thumbtable_t *table, gboolean enable)
void dt_thumbtable_update_parent(dt_thumbtable_t *table)
#define dt_thumbtable_refresh_thumbnail(table, imgid, reinit)
Definition thumbtable.h:283
int32_t dt_view_active_images_get_first()
Definition view.c:1306
const dt_view_t * dt_view_manager_get_current_view(dt_view_manager_t *vm)
Definition view.c:140
gchar * panels_get_view_path(char *suffix)
gchar * panels_get_panel_path(dt_ui_panel_t panel, char *suffix)
void dt_ui_set_window_buttons_visible(dt_ui_t *ui, gboolean visible)
void dt_ui_restore_panels(dt_ui_t *ui)
dt_ui_panel_t
@ DT_UI_PANEL_TOP
@ DT_UI_PANEL_SIZE
@ DT_UI_PANEL_BOTTOM
@ DT_UI_PANEL_LEFT
@ DT_UI_PANEL_RIGHT