56#include <gdk/gdkkeysyms.h>
79#include "preferences_gen.h"
85#ifdef GDK_WINDOWING_QUARTZ
106 const int detected = GPOINTER_TO_INT(user_data);
107 const gboolean device_enabled = gtk_toggle_button_get_active(button);
109 restart_required =
TRUE;
113 GList *dependents = (GList *)g_object_get_data(G_OBJECT(button),
"dependent-widgets");
114 for(GList *l = dependents; l; l = l->next) gtk_widget_set_sensitive(GTK_WIDGET(l->data), device_enabled);
121 const int detected = GPOINTER_TO_INT(user_data);
122 const gboolean pinned_memory = gtk_toggle_button_get_active(button);
129 const int detected = GPOINTER_TO_INT(user_data);
130 const size_t headroom = gtk_spin_button_get_value_as_int(button);
166static void edit_preset(GtkTreeView *tree,
const gint rowid,
const gchar *
name,
const gchar *module);
174 char *themes_dir = g_build_filename(basedir,
"themes", NULL);
175 GDir *dir = g_dir_open(themes_dir, 0, NULL);
181 while((d_name = g_dir_read_name(dir)))
182 themes = g_list_append(themes, g_strdup(d_name));
200 GList *themes = NULL;
215 const int selected = gtk_combo_box_get_active(GTK_COMBO_BOX(widget));
217 gchar *
i = g_strrstr(theme,
".");
225 dt_conf_set_bool(
"themes/usercss", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)));
231 dt_conf_set_float(
"font_size", gtk_spin_button_get_value(GTK_SPIN_BUTTON(widget)));
237 float dpi = gtk_spin_button_get_value(GTK_SPIN_BUTTON(widget));
238 if(dpi > 0.0) dpi = fmax(64, dpi);
240 restart_required =
TRUE;
247 dt_conf_set_bool(
"use_system_font", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)));
249 gtk_widget_set_state_flags(GTK_WIDGET(user_data), GTK_STATE_FLAG_INSENSITIVE,
TRUE);
251 gtk_widget_set_state_flags(GTK_WIDGET(user_data), GTK_STATE_FLAG_NORMAL,
TRUE);
261 g_snprintf(usercsspath,
sizeof(usercsspath),
"%s/user.css", configdir);
264 GtkTextIter start, end;
265 gtk_text_buffer_get_start_iter(buffer, &start);
266 gtk_text_buffer_get_end_iter(buffer, &end);
267 gchar *usercsscontent = gtk_text_buffer_get_text(buffer, &start, &end,
FALSE);
270 GError *
error = NULL;
271 if(!g_file_set_contents(usercsspath, usercsscontent, -1, &
error))
273 fprintf(stderr,
"%s: error saving css to %s: %s\n", G_STRFUNC, usercsspath,
error->message);
274 g_clear_error(&
error);
282 GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(tw->
css_text_view));
286 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(tw->
apply_toggle)))
302 GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(tw->
css_text_view));
310 int selected = gtk_combo_box_get_active(GTK_COMBO_BOX(widget));
322 restart_required =
TRUE;
327 if(event->type == GDK_2BUTTON_PRESS)
342 gtk_widget_set_valign(grid, GTK_ALIGN_START);
347 gtk_stack_add_titled(GTK_STACK(stack),
container, _(
"general"), _(
"general"));
351 GtkWidget *label = gtk_label_new(_(
"interface language"));
352 gtk_widget_set_halign(label, GTK_ALIGN_START);
353 GtkWidget *labelev = gtk_event_box_new();
354 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
355 gtk_container_add(GTK_CONTAINER(labelev), label);
356 GtkWidget *widget = gtk_combo_box_text_new();
361 gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(widget),
name);
366 gtk_widget_set_tooltip_text(labelev, _(
"double-click to reset to the system language"));
367 gtk_event_box_set_visible_window(GTK_EVENT_BOX(labelev),
FALSE);
368 gtk_widget_set_tooltip_text(widget, _(
"set the language of the user interface. the system default is marked with an * (needs a restart)"));
369 gtk_grid_attach(GTK_GRID(grid), labelev, 0, line++, 1, 1);
370 gtk_grid_attach_next_to(GTK_GRID(grid), widget, labelev, GTK_POS_RIGHT, 1, 1);
371 g_signal_connect(G_OBJECT(labelev),
"button-press-event", G_CALLBACK(
reset_language_widget), (gpointer)widget);
377 label = gtk_label_new(_(
"theme"));
378 gtk_widget_set_halign(label, GTK_ALIGN_START);
379 widget = gtk_combo_box_text_new();
380 labelev = gtk_event_box_new();
381 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
382 gtk_container_add(GTK_CONTAINER(labelev), label);
383 gtk_grid_attach(GTK_GRID(grid), labelev, 0, line++, 1, 1);
384 gtk_grid_attach_next_to(GTK_GRID(grid), widget, labelev, GTK_POS_RIGHT, 1, 1);
392 gchar *
name = g_strdup((gchar*)(iter->data));
394 gchar *
i = g_strrstr(
name,
".");
396 gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(widget),
name);
403 gtk_combo_box_set_active(GTK_COMBO_BOX(widget),
selected);
405 g_signal_connect(G_OBJECT(widget),
"changed", G_CALLBACK(
theme_callback), 0);
406 gtk_widget_set_tooltip_text(widget, _(
"set the theme for the user interface"));
409 GtkWidget *usesysfont = gtk_check_button_new();
410 GtkWidget *fontsize = gtk_spin_button_new_with_range(5.0f, 30.0f, 0.2f);
415 gtk_widget_set_state_flags(fontsize, GTK_STATE_FLAG_INSENSITIVE,
TRUE);
417 gtk_widget_set_state_flags(fontsize, GTK_STATE_FLAG_NORMAL,
TRUE);
419 label = gtk_label_new(_(
"use system font size"));
420 gtk_widget_set_halign(label, GTK_ALIGN_START);
421 labelev = gtk_event_box_new();
422 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
423 gtk_container_add(GTK_CONTAINER(labelev), label);
424 gtk_grid_attach(GTK_GRID(grid), labelev,
i,
i?2:line++, 1, 1);
425 gtk_grid_attach_next_to(GTK_GRID(grid), usesysfont, labelev, GTK_POS_RIGHT, 1, 1);
426 gtk_widget_set_tooltip_text(usesysfont, _(
"use system font size"));
427 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(usesysfont),
dt_conf_get_bool(
"use_system_font"));
428 g_signal_connect(G_OBJECT(usesysfont),
"toggled", G_CALLBACK(
use_sys_font_callback), (gpointer)fontsize);
435 label = gtk_label_new(_(
"font size in points"));
436 gtk_widget_set_halign(label, GTK_ALIGN_START);
437 labelev = gtk_event_box_new();
438 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
439 gtk_container_add(GTK_CONTAINER(labelev), label);
440 gtk_grid_attach(GTK_GRID(grid), labelev,
i,
i?0:line++, 1, 1);
441 gtk_grid_attach_next_to(GTK_GRID(grid), fontsize, labelev, GTK_POS_RIGHT, 1, 1);
442 gtk_widget_set_tooltip_text(fontsize, _(
"font size in points"));
443 gtk_spin_button_set_value(GTK_SPIN_BUTTON(fontsize),
dt_conf_get_float(
"font_size"));
446 GtkWidget *screen_dpi_overwrite = gtk_spin_button_new_with_range(-1.0f, 360, 1.f);
447 label = gtk_label_new(_(
"GUI controls and text DPI"));
448 gtk_widget_set_halign(label, GTK_ALIGN_START);
449 labelev = gtk_event_box_new();
450 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
451 gtk_container_add(GTK_CONTAINER(labelev), label);
452 gtk_grid_attach(GTK_GRID(grid), labelev,
i,
i?1:line++, 1, 1);
453 gtk_grid_attach_next_to(GTK_GRID(grid), screen_dpi_overwrite, labelev, GTK_POS_RIGHT, 1, 1);
454 gtk_widget_set_tooltip_text(screen_dpi_overwrite, _(
"adjust the global GUI resolution to rescale controls, buttons, labels, etc.\n"
455 "increase for a magnified GUI, decrease to fit more content in window.\n"
456 "set to -1 to use the system-defined global resolution.\n"
457 "default is 96 DPI on most systems.\n"
458 "(needs a restart)."));
459 gtk_spin_button_set_value(GTK_SPIN_BUTTON(screen_dpi_overwrite),
dt_conf_get_float(
"screen_dpi_overwrite"));
463 label = gtk_label_new(_(
"modify selected theme with CSS tweaks below"));
464 gtk_widget_set_halign(label, GTK_ALIGN_START);
466 labelev = gtk_event_box_new();
467 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
468 gtk_container_add(GTK_CONTAINER(labelev), label);
469 gtk_grid_attach(GTK_GRID(grid), labelev, 0, line++, 1, 1);
470 gtk_grid_attach_next_to(GTK_GRID(grid), tw->
apply_toggle, labelev, GTK_POS_RIGHT, 1, 1);
471 gtk_widget_set_tooltip_text(tw->
apply_toggle, _(
"modify theme with CSS keyed below (saved to user.css)"));
478 gtk_widget_set_name(usercssbox,
"usercss-box");
480 GtkTextBuffer *buffer = gtk_text_buffer_new(NULL);
484 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(tw->
css_text_view), GTK_WRAP_WORD);
489 GtkWidget *scroll = gtk_scrolled_window_new(NULL, NULL);
490 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
492 gtk_box_pack_start(GTK_BOX(usercssbox), scroll,
TRUE,
TRUE, 0);
494 tw->
save_button = gtk_button_new_with_label(C_(
"usercss",
"save CSS and apply"));
499 gtk_box_pack_start(GTK_BOX(usercssbox), hbox,
FALSE,
FALSE, 0);
500 gtk_widget_set_tooltip_text(tw->
save_button, _(
"click to save and apply the CSS tweaks entered in this editor"));
505 g_snprintf(usercsspath,
sizeof(usercsspath),
"%s/user.css", configdir);
507 if(g_file_test(usercsspath, G_FILE_TEST_EXISTS))
509 gchar *usercsscontent = NULL;
511 if(g_file_get_contents(usercsspath, &usercsscontent, NULL, NULL))
513 gtk_text_buffer_set_text(buffer, usercsscontent, -1);
518 gchar *errtext = g_strconcat(
"/* ", _(
"ERROR Loading user.css"),
" */", NULL);
519 gtk_text_buffer_set_text(buffer, errtext, -1);
527 gchar *deftext = g_strconcat(
"/* ", _(
"Enter CSS theme tweaks here"),
" */\n\n", NULL);
528 gtk_text_buffer_set_text(buffer, deftext, -1);
538gboolean preferences_window_deleted(
GtkWidget *widget, GdkEvent *event, gpointer data)
547 gtk_widget_hide(widget);
554 GtkAllocation allocation;
555 gtk_widget_get_allocation(widget, &allocation);
557 dt_conf_set_int(
"ui_last/preferences_dialog_height", allocation.height);
564 GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
568 g_signal_connect(G_OBJECT(
_preferences_dialog),
"delete-event", G_CALLBACK(preferences_window_deleted), NULL);
575#ifdef GDK_WINDOWING_QUARTZ
583 gtk_widget_set_name(content,
"preferences-content");
584 gtk_container_set_border_width(GTK_CONTAINER(content), 0);
588 gtk_widget_set_name(box,
"preferences-box");
589 gtk_container_set_border_width(GTK_CONTAINER(box), 0);
590 gtk_box_pack_start(GTK_BOX(content), box,
TRUE,
TRUE, 0);
594 GtkWidget *stacksidebar = gtk_stack_sidebar_new();
595 gtk_stack_sidebar_set_stack(GTK_STACK_SIDEBAR(stacksidebar), GTK_STACK(stack));
596 gtk_box_pack_start(GTK_BOX(box), stacksidebar,
FALSE,
FALSE, 0);
597 gtk_box_pack_start(GTK_BOX(box), stack,
TRUE,
TRUE, 0);
601 restart_required =
FALSE;
612 GtkWidget *scroll = gtk_stack_get_child_by_name(GTK_STACK(stack), _(
"processing"));
613 GtkWidget *viewport = GTK_IS_BIN(scroll) ? gtk_bin_get_child(GTK_BIN(scroll)) : NULL;
614 GtkWidget *grid = GTK_IS_BIN(viewport) ? gtk_bin_get_child(GTK_BIN(viewport)) : NULL;
620 int insert_line = -1;
621 GList *children = gtk_container_get_children(GTK_CONTAINER(grid));
624 for(GList *child = children; child; child = g_list_next(child))
628 gtk_container_child_get(GTK_CONTAINER(grid), GTK_WIDGET(child->data),
"top-attach", &
top,
"height", &
height,
632 if(GTK_IS_CONTAINER(child->data))
636 GList *box_children = gtk_container_get_children(GTK_CONTAINER(child->data));
637 for(GList *box_child = box_children; box_child; box_child = g_list_next(box_child))
639 const char *
name = gtk_widget_get_name(GTK_WIDGET(box_child->data));
646 g_list_free(box_children);
649 g_list_free(children);
653 const int device_rows = detected_devices * 4;
659 children = gtk_container_get_children(GTK_CONTAINER(grid));
662 for(GList *child = children; child; child = g_list_next(child))
665 gtk_container_child_get(GTK_CONTAINER(grid), GTK_WIDGET(child->data),
"top-attach", &
top, NULL);
666 if(
top >= insert_line)
667 gtk_container_child_set(GTK_CONTAINER(grid), GTK_WIDGET(child->data),
"top-attach",
668 top + device_rows, NULL);
670 g_list_free(children);
679 for(
int dev = 0; dev < detected_devices; dev++)
686 gchar *label_text = g_strdup_printf(
"%d: %s", device->
config_id, device_name);
687 GtkWidget *device_title = gtk_label_new(label_text);
689 gtk_box_pack_start(GTK_BOX(title_box), device_title,
FALSE,
FALSE, 0);
695 gtk_widget_set_name(title_box,
"pref_subsection");
696 gtk_grid_attach(GTK_GRID(grid), title_box, 0, line++, 3, 1);
699 GtkWidget *enable_label = gtk_label_new(_(
"Enable"));
700 gtk_widget_set_halign(enable_label, GTK_ALIGN_START);
701 gtk_widget_set_hexpand(enable_label,
TRUE);
703 gtk_grid_attach(GTK_GRID(grid), enable_label, 0, line, 1, 1);
704 GtkWidget *enable_labdef = gtk_label_new(
"");
705 gtk_widget_set_name(enable_labdef,
"preference_non_default");
706 gtk_grid_attach(GTK_GRID(grid), enable_labdef, 1, line, 1, 1);
710 gtk_widget_set_tooltip_text(
enable, _(
"Enable or disable OpenCL processing for this GPU"));
712 GINT_TO_POINTER(dev));
713 gtk_grid_attach(GTK_GRID(grid),
enable, 2, line++, 1, 1);
715 GtkWidget *pinned_memory_label = gtk_label_new(_(
"pinned memory"));
716 gtk_widget_set_halign(pinned_memory_label, GTK_ALIGN_START);
717 gtk_widget_set_hexpand(pinned_memory_label,
TRUE);
719 gtk_grid_attach(GTK_GRID(grid), pinned_memory_label, 0, line, 1, 1);
720 GtkWidget *pinned_memory_labdef = gtk_label_new(
"");
721 gtk_widget_set_name(pinned_memory_labdef,
"preference_non_default");
722 gtk_grid_attach(GTK_GRID(grid), pinned_memory_labdef, 1, line, 1, 1);
724 GtkWidget *pinned_memory = gtk_check_button_new();
725 gtk_widget_set_tooltip_text(
727 _(
"Keep the host-side buffers this device transfers to and from in page-locked "
729 "Enabled, the driver can move them by direct memory access. Disabled, it must "
730 "copy them through a staging buffer of its own first, so every transfer is made "
731 "twice. On a discrete card this is several times slower, and it is paid on every "
732 "frame the darkroom displays.\n\n"
733 "Page-locked memory cannot be swapped out, so turn this off if the machine is "
735 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pinned_memory),
737 gtk_widget_set_tooltip_text(pinned_memory, _(
"Use pinned host memory for OpenCL transfers on this GPU"));
739 GINT_TO_POINTER(dev));
740 gtk_grid_attach(GTK_GRID(grid), pinned_memory, 2, line++, 1, 1);
746 ? _(
"GPU memory headroom, shared with system RAM (MiB)")
747 : _(
"GPU vRAM headroom (MiB)"));
748 gtk_widget_set_halign(headroom_label, GTK_ALIGN_START);
749 gtk_widget_set_hexpand(headroom_label,
TRUE);
751 gtk_grid_attach(GTK_GRID(grid), headroom_label, 0, line, 1, 1);
752 GtkWidget *headroom_labdef = gtk_label_new(
"");
753 gtk_widget_set_name(headroom_labdef,
"preference_non_default");
754 gtk_grid_attach(GTK_GRID(grid), headroom_labdef, 1, line, 1, 1);
756 GtkWidget *headroom = gtk_spin_button_new_with_range(0, G_MAXINT, 1);
757 gtk_widget_set_hexpand(headroom,
FALSE);
758 gtk_spin_button_set_digits(GTK_SPIN_BUTTON(headroom), 0);
761 ? _(
"This GPU has no dedicated vRAM -- it shares memory with the "
762 "system. Memory reserved here for the OS, desktop and other "
764 : _(
"GPU memory reserved for the system and other applications"));
766 GINT_TO_POINTER(dev));
767 gtk_grid_attach(GTK_GRID(grid), headroom, 2, line++, 1, 1);
773 GList *dependents = NULL;
774 dependents = g_list_append(dependents, pinned_memory_label);
775 dependents = g_list_append(dependents, pinned_memory_labdef);
776 dependents = g_list_append(dependents, pinned_memory);
777 dependents = g_list_append(dependents, headroom_label);
778 dependents = g_list_append(dependents, headroom_labdef);
779 dependents = g_list_append(dependents, headroom);
780 g_object_set_data_full(G_OBJECT(
enable),
"dependent-widgets", dependents, (GDestroyNotify)g_list_free);
782 const gboolean device_enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
enable));
783 for(GList *l = dependents; l; l = l->next) gtk_widget_set_sensitive(GTK_WIDGET(l->data), device_enabled);
802 dt_control_log(_(
"Ansel needs to be restarted for settings to take effect"));
809 dt_control_alert(_(
"Settings not saved"), _(
"the settings file could not be written in this folder"), configdir);
817 cairo_destroy((cairo_t *)data);
822 GtkTreeIter iter, parent;
823 gchar *last_module = NULL;
829 cairo_t *lock_cr = cairo_create(lock_cst);
830 cairo_set_source_rgb(lock_cr, 0.7, 0.7, 0.7);
832 cairo_surface_flush(lock_cst);
833 guchar *data = cairo_image_surface_get_data(lock_cst);
835 GdkPixbuf *lock_pixbuf = gdk_pixbuf_new_from_data(data, GDK_COLORSPACE_RGB,
TRUE, 8,
837 cairo_image_surface_get_stride(lock_cst),
843 cairo_t *check_cr = cairo_create(check_cst);
844 cairo_set_source_rgb(check_cr, 0.7, 0.7, 0.7);
846 cairo_surface_flush(check_cst);
847 data = cairo_image_surface_get_data(check_cst);
849 GdkPixbuf *check_pixbuf = gdk_pixbuf_new_from_data(data, GDK_COLORSPACE_RGB,
TRUE, 8,
851 cairo_image_surface_get_stride(check_cst),
854 for(GList *
p = presets;
p;
p = g_list_next(
p))
857 const gint rowid =
preset->rowid;
859 const gchar *operation =
preset->operation;
860 const gboolean autoapply =
preset->autoapply;
863 const gchar *lens =
preset->lens;
866 const float exposure_min =
preset->exposure_min;
867 const float exposure_max =
preset->exposure_max;
868 const float aperture_min =
preset->aperture_min;
869 const float aperture_max =
preset->aperture_max;
870 const int focal_length_min =
preset->focal_length_min;
871 const int focal_length_max =
preset->focal_length_max;
872 const gboolean writeprotect =
preset->writeprotect;
874 gchar *iso = NULL, *exposure = NULL, *aperture = NULL, *focal_length = NULL, *smaker = NULL, *smodel = NULL, *slens = NULL;
877 gchar *
module = g_strdup(dt_iop_get_localized_name(operation));
878 if(
IS_NULL_PTR(module))
module = g_strdup(dt_lib_get_localized_name(operation));
879 if(
IS_NULL_PTR(module))
module = g_strdup(operation);
884 exposure = g_strdup(
"");
885 aperture = g_strdup(
"");
886 focal_length = g_strdup(
"");
887 smaker = g_strdup(
"");
888 smodel = g_strdup(
"");
889 slens = g_strdup(
"");
893 smaker = g_strdup(
maker);
894 smodel = g_strdup(
model);
895 slens = g_strdup(lens);
900 iso = g_strdup_printf(
"%" G_GSIZE_FORMAT
" - %" G_GSIZE_FORMAT
"", (
size_t)
iso_min, (
size_t)
iso_max);
907 exposure = g_strdup(
"%");
917 aperture = g_strdup(
"%");
922 if(focal_length_min == 0.0 && focal_length_max == 1000.0)
923 focal_length = g_strdup(
"%");
925 focal_length = g_strdup_printf(
"%d - %d", focal_length_min, focal_length_max);
928 if(g_strcmp0(last_module, operation) != 0)
930 gtk_tree_store_insert_with_values(tree_model, &iter, NULL, -1,
936 last_module = g_strdup(operation);
940 gtk_tree_store_insert_with_values(tree_model, &iter, &parent, -1,
946 autoapply ? check_pixbuf : NULL, -1);
960 g_object_unref(lock_pixbuf);
961 cairo_surface_destroy(lock_cst);
962 g_object_unref(check_pixbuf);
963 cairo_surface_destroy(check_cst);
966static gboolean
_search_func(GtkTreeModel *
model, gint column,
const gchar *
key, GtkTreeIter *iter, gpointer search_data)
968 gchar *key_case = g_utf8_casefold(
key, -1), *label = NULL;
971 gchar *name_case = g_utf8_casefold(label, -1);
974 gchar *module_case = g_utf8_casefold(label, -1);
977 const gboolean different = !((name_case && strstr(name_case, key_case))
978 || (module_case && strstr(module_case, key_case)));
986 GtkTreePath *path = gtk_tree_model_get_path(
model, iter);
987 gtk_tree_view_expand_to_path(GTK_TREE_VIEW(search_data), path);
988 gtk_tree_path_free(path);
994 if(gtk_tree_model_iter_children(
model, &child, iter))
1000 while(gtk_tree_model_iter_next(
model, &child));
1009 GtkWidget *scroll = gtk_scrolled_window_new(NULL, NULL);
1010 GtkTreeView *tree = GTK_TREE_VIEW(gtk_tree_view_new());
1011 GtkTreeStore *
model = gtk_tree_store_new(
1012 P_N_COLUMNS, G_TYPE_INT , G_TYPE_STRING , G_TYPE_STRING ,
1013 GDK_TYPE_PIXBUF , G_TYPE_STRING , G_TYPE_STRING , G_TYPE_STRING ,
1014 G_TYPE_STRING , G_TYPE_STRING , G_TYPE_STRING , G_TYPE_STRING ,
1015 G_TYPE_STRING , GDK_TYPE_PIXBUF );
1016 GtkCellRenderer *renderer;
1017 GtkTreeViewColumn *column;
1020 gtk_stack_add_titled(GTK_STACK(stack),
container, _(
"presets"), _(
"presets"));
1025 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(
model),
P_MODULE_COLUMN, GTK_SORT_ASCENDING);
1029 renderer = gtk_cell_renderer_text_new();
1030 column = gtk_tree_view_column_new_with_attributes(_(
"module"), renderer,
"text",
P_MODULE_COLUMN, NULL);
1031 gtk_tree_view_append_column(tree, column);
1033 renderer = gtk_cell_renderer_pixbuf_new();
1034 column = gtk_tree_view_column_new_with_attributes(
"", renderer,
"pixbuf",
P_EDITABLE_COLUMN, NULL);
1035 gtk_tree_view_append_column(tree, column);
1037 renderer = gtk_cell_renderer_text_new();
1038 column = gtk_tree_view_column_new_with_attributes(_(
"name"), renderer,
"text",
P_NAME_COLUMN, NULL);
1039 gtk_tree_view_append_column(tree, column);
1041 renderer = gtk_cell_renderer_text_new();
1042 column = gtk_tree_view_column_new_with_attributes(_(
"model"), renderer,
"text",
P_MODEL_COLUMN, NULL);
1043 gtk_tree_view_append_column(tree, column);
1045 renderer = gtk_cell_renderer_text_new();
1046 column = gtk_tree_view_column_new_with_attributes(_(
"maker"), renderer,
"text",
P_MAKER_COLUMN, NULL);
1047 gtk_tree_view_append_column(tree, column);
1049 renderer = gtk_cell_renderer_text_new();
1050 column = gtk_tree_view_column_new_with_attributes(_(
"lens"), renderer,
"text",
P_LENS_COLUMN, NULL);
1051 gtk_tree_view_append_column(tree, column);
1053 renderer = gtk_cell_renderer_text_new();
1054 column = gtk_tree_view_column_new_with_attributes(_(
"ISO"), renderer,
"text",
P_ISO_COLUMN, NULL);
1055 gtk_tree_view_append_column(tree, column);
1057 renderer = gtk_cell_renderer_text_new();
1058 column = gtk_tree_view_column_new_with_attributes(_(
"exposure"), renderer,
"text",
P_EXPOSURE_COLUMN, NULL);
1059 gtk_tree_view_append_column(tree, column);
1061 renderer = gtk_cell_renderer_text_new();
1062 column = gtk_tree_view_column_new_with_attributes(_(
"aperture"), renderer,
"text",
P_APERTURE_COLUMN, NULL);
1063 gtk_tree_view_append_column(tree, column);
1065 renderer = gtk_cell_renderer_text_new();
1066 column = gtk_tree_view_column_new_with_attributes(_(
"focal length"), renderer,
"text",
1068 gtk_tree_view_append_column(tree, column);
1070 renderer = gtk_cell_renderer_pixbuf_new();
1071 column = gtk_tree_view_column_new_with_attributes(_(
"auto"), renderer,
"pixbuf",
P_AUTOAPPLY_COLUMN, NULL);
1072 gtk_tree_view_append_column(tree, column);
1074 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1079 gtk_widget_set_name(hbox,
"preset_controls");
1081 GtkWidget *search_presets = gtk_search_entry_new();
1084 gtk_box_pack_start(GTK_BOX(hbox), search_presets,
FALSE,
TRUE, 0);
1085 gtk_entry_set_placeholder_text(GTK_ENTRY(search_presets), _(
"search presets list"));
1086 gtk_widget_set_tooltip_text(GTK_WIDGET(search_presets), _(
"incrementally search the list of presets\npress up or down keys to cycle through matches"));
1087 g_signal_connect(G_OBJECT(search_presets),
"activate", G_CALLBACK(
dt_gui_search_stop), tree);
1088 g_signal_connect(G_OBJECT(search_presets),
"stop-search", G_CALLBACK(
dt_gui_search_stop), tree);
1089 g_signal_connect(G_OBJECT(tree),
"key-press-event", G_CALLBACK(
dt_gui_search_start), search_presets);
1090 gtk_tree_view_set_search_entry(tree, GTK_ENTRY(search_presets));
1092 GtkWidget *button = gtk_button_new_with_label(C_(
"preferences",
"import..."));
1093 gtk_box_pack_end(GTK_BOX(hbox), button,
FALSE,
TRUE, 0);
1094 g_signal_connect(G_OBJECT(button),
"clicked", G_CALLBACK(
import_preset), (gpointer)
model);
1096 button = gtk_button_new_with_label(C_(
"preferences",
"export..."));
1097 gtk_box_pack_end(GTK_BOX(hbox), button,
FALSE,
TRUE, 0);
1098 g_signal_connect(G_OBJECT(button),
"clicked", G_CALLBACK(
export_preset), (gpointer)
model);
1111 gtk_tree_view_set_search_equal_func(tree,
_search_func, tree, NULL);
1114 gtk_tree_view_set_model(tree, GTK_TREE_MODEL(
model));
1118 gtk_container_add(GTK_CONTAINER(scroll), GTK_WIDGET(tree));
1119 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1121 g_object_unref(G_OBJECT(
model));
1132 GtkTreeModel *
model = gtk_tree_view_get_model(tree);
1134 gtk_tree_model_get_iter(
model, &iter, path);
1136 if(gtk_tree_model_iter_has_child(
model, &iter))
1139 if(gtk_tree_view_row_expanded(tree, path))
1140 gtk_tree_view_collapse_row(tree, path);
1142 gtk_tree_view_expand_row(tree, path,
FALSE);
1148 gchar *
name, *operation;
1149 GdkPixbuf *editable;
1155 g_object_unref(editable);
1166 GtkTreeModel *
model = (GtkTreeModel *)data;
1168 GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
1171 if(event->is_modifier)
return FALSE;
1174 if(
key == GDK_KEY_Delete ||
key == GDK_KEY_BackSpace)
1179 if(!gtk_tree_selection_get_selected(selection, &
model, &iter)
1180 || gtk_tree_model_iter_has_child(
model, &iter))
1186 GdkPixbuf *editable;
1192 gchar *operation = NULL;
1198 GtkTreeStore *tree_store = GTK_TREE_STORE(
model);
1199 gtk_tree_store_clear(tree_store);
1208 g_object_unref(editable);
1224 dt_control_alert(_(
"Preset not imported"), _(
"failed to import preset"), filename);
1230 GtkTreeModel *
model = (GtkTreeModel *)data;
1231 GtkWindow *win = GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(button)));
1234 GtkFileChooserNative *chooser = gtk_file_chooser_native_new(
1235 _(
"select preset(s) to import"), GTK_WINDOW(win), GTK_FILE_CHOOSER_ACTION_OPEN,
1236 _(
"_open"), _(
"_cancel"));
1239 gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(chooser),
TRUE);
1241 GtkFileFilter *filter;
1242 filter = GTK_FILE_FILTER(gtk_file_filter_new());
1243 gtk_file_filter_add_pattern(filter,
"*.dtpreset");
1244 gtk_file_filter_add_pattern(filter,
"*.DTPRESET");
1245 gtk_file_filter_set_name(filter, _(
"Ansel preset files"));
1246 gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), filter);
1248 filter = GTK_FILE_FILTER(gtk_file_filter_new());
1249 gtk_file_filter_add_pattern(filter,
"*");
1250 gtk_file_filter_set_name(filter, _(
"all files"));
1252 gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), filter);
1254 if(gtk_native_dialog_run(GTK_NATIVE_DIALOG(chooser)) == GTK_RESPONSE_ACCEPT)
1256 GSList *filenames = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(chooser));
1260 GtkTreeStore *tree_store = GTK_TREE_STORE(
model);
1261 gtk_tree_store_clear(tree_store);
1266 g_object_unref(chooser);
1271 GtkWindow *win = GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(button)));
1273 GtkFileChooserNative *filechooser = gtk_file_chooser_native_new(
1274 _(
"select directory"), GTK_WINDOW(win), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
1275 _(
"_save"), _(
"_cancel"));
1279 if(gtk_native_dialog_run(GTK_NATIVE_DIALOG(filechooser)) == GTK_RESPONSE_ACCEPT)
1281 gchar *filedir = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filechooser));
1287 for(GList *
p = presets;
p;
p = g_list_next(
p))
1290 gchar *preset_name = g_strdup_printf(
"%s_%s",
preset->operation,
preset->name);
1304 g_object_unref(filechooser);
1315 if(*a_text ==
'\0' && *b_text ==
'\0')
1324 const int res = strcoll(a_text, b_text);
1334 GtkTreeStore *tree_store = GTK_TREE_STORE(gtk_tree_view_get_model((GtkTreeView *)
g->data));
1335 gtk_tree_store_clear(tree_store);
1339static void edit_preset(GtkTreeView *tree,
const gint rowid,
const gchar *
name,
const gchar *module)
1348 dt_conf_set_bool((
char *)data, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)));
1353 const char *
key = gtk_widget_get_name(widget);
1355 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), def);
1361 if(event->type == GDK_2BUTTON_PRESS)
1371 const char *
key = gtk_widget_get_name(widget);
1373 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), val);
1377 const guint line,
const gboolean
swap)
1381 GtkWidget *labelev = gtk_event_box_new();
1382 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
1383 gtk_container_add(GTK_CONTAINER(labelev), w_label);
1386 gtk_grid_attach(GTK_GRID(grid), labelev,
swap ? (col + 1) : col, line, 1, 1);
1387 gtk_grid_attach(GTK_GRID(grid), w,
swap ? col : (col + 1), line, 1, 1);
1396 dt_conf_set_int((
char *)data, gtk_spin_button_get_value(GTK_SPIN_BUTTON(widget)));
1401 const char *
key = gtk_widget_get_name(widget);
1403 gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), def);
1409 if(event->type == GDK_2BUTTON_PRESS)
1419 const char *
key = gtk_widget_get_name(widget);
1421 gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), val);
1429 GtkWidget *labelev = gtk_event_box_new();
1430 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
1431 gtk_container_add(GTK_CONTAINER(labelev), w_label);
1435 gtk_widget_set_hexpand(w,
FALSE);
1436 gtk_spin_button_set_digits(GTK_SPIN_BUTTON(w), 0);
1438 gtk_grid_attach(GTK_GRID(grid), labelev, col, line, 1, 1);
1439 gtk_grid_attach(GTK_GRID(grid), w, col + 1, line, 1, 1);
1449 if(gtk_combo_box_get_active_iter(GTK_COMBO_BOX(widget), &iter))
1452 gtk_tree_model_get(gtk_combo_box_get_model(GTK_COMBO_BOX(widget)), &iter, 0, &s, -1);
1460 GtkTreeModel *
model = gtk_combo_box_get_model(GTK_COMBO_BOX(widget));
1462 gboolean valid = gtk_tree_model_get_iter_first(
model, &iter);
1464 gboolean found =
FALSE;
1468 gtk_tree_model_get(
model, &iter, 0, &
value, -1);
1469 if(!g_strcmp0(
value, str))
1477 valid = gtk_tree_model_iter_next(
model, &iter);
1480 gtk_combo_box_set_active(GTK_COMBO_BOX(widget),
i);
1485 const char *
key = gtk_widget_get_name(widget);
1493 if(event->type == GDK_2BUTTON_PRESS)
1503 const char *
key = gtk_widget_get_name(widget);
1514 GtkWidget *labelev = gtk_event_box_new();
1515 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
1516 gtk_container_add(GTK_CONTAINER(labelev), w_label);
1519 GtkListStore *
store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
1525 for(GList *val = vals; val; val = g_list_next(val))
1527 char *item = (
char *)val->data;
1529 if(item[0] ==
'[') item++;
1530 else if(item[strlen(item) - 1] ==
']') item[strlen(item) - 1] =
'\0';
1531 gtk_list_store_append(
store, &iter);
1532 gtk_list_store_set(
store, &iter, 0, item, 1, g_dpgettext2(NULL,
"preferences", item), -1);
1533 if(pos == -1 && !g_strcmp0(str, item))
1543 GtkWidget *w = gtk_combo_box_new_with_model(GTK_TREE_MODEL(
store));
1544 gtk_widget_set_hexpand(w,
FALSE);
1545 g_object_unref(
store);
1546 GtkCellRenderer *renderer = gtk_cell_renderer_text_new();
1547 gtk_cell_renderer_set_padding(renderer, 0, 0);
1548 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(w), renderer,
TRUE);
1549 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(w), renderer,
"text", 1, NULL);
1550 gtk_combo_box_set_active(GTK_COMBO_BOX(w), pos);
1552 gtk_grid_attach(GTK_GRID(grid), labelev, col, line, 1, 1);
1553 gtk_grid_attach(GTK_GRID(grid), w, col + 1, line, 1, 1);
1562 const char *str = gtk_entry_get_text(GTK_ENTRY(widget));
1568 const char *
key = gtk_widget_get_name(widget);
1570 gtk_entry_set_text(GTK_ENTRY(widget), str);
1576 if(event->type == GDK_2BUTTON_PRESS)
1586 const char *
key = gtk_widget_get_name(widget);
1588 gtk_entry_set_text(GTK_ENTRY(widget), str);
1596 GtkWidget *labelev = gtk_event_box_new();
1597 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
1598 gtk_container_add(GTK_CONTAINER(labelev), w_label);
1603 gtk_entry_set_text(GTK_ENTRY(w), str);
1604 gtk_widget_set_hexpand(w,
TRUE);
1606 gtk_grid_attach(GTK_GRID(grid), labelev, col, line, 1, 1);
1607 gtk_grid_attach(GTK_GRID(grid), w, col, line + 1, 1, 1);
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....
GtkWidget * dt_gui_main_window(void)
void dt_gui_load_theme(const char *theme)
void dt_configure_ppd_dpi(dt_gui_gtk_t *gui)
GtkWidget * dt_gui_center_widget(void)
static void error(char *msg)
uint32_t container(dt_lib_module_t *self)
void dt_bauhaus_load_theme(dt_bauhaus_t *bauhaus)
typedef void((*dt_cache_allocate_t)(void *userdata, dt_cache_entry_t *entry))
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_flush(void)
Write the settings to their file now. Overridden keys keep their stored value.
int dt_conf_get_bool(const char *name)
void dt_conf_set_float(const char *name, float val)
float dt_conf_get_float(const char *name)
Float for name, clamped to its declared bounds.
const char * dt_confgen_get_tooltip(const char *name)
Translated long description of name, borrowed and valid for the process lifetime. NULL when name is n...
gchar * dt_conf_get_string(const char *name)
Read the stored string for name as a private copy.
void dt_conf_set_int(const char *name, int val)
gboolean dt_confgen_get_bool(const char *name, dt_confgen_value_kind_t kind)
int dt_conf_get_int(const char *name)
Integer for name, clamped to the bounds declared in the XML.
int dt_confgen_get_int(const char *name, dt_confgen_value_kind_t kind)
void dt_conf_set_string(const char *name, const char *val)
const char * dt_conf_get_string_const(const char *name)
Borrow the stored string for name without copying it.
const char * dt_confgen_get(const char *name, dt_confgen_value_kind_t kind)
One declared attribute of name from the generated XML, as text.
void dt_conf_set_folder_from_file_chooser(const char *name, GtkFileChooser *chooser)
const char * dt_confgen_get_label(const char *name)
Translated short description of name, borrowed and valid for the process lifetime....
gboolean dt_conf_get_folder_to_file_chooser(const char *name, GtkFileChooser *chooser)
void dt_control_alert(const char *title, const char *message, const char *item)
Tell the user something that must not go unseen: what it says stays true after a toast would have fad...
void dt_control_log(const char *msg,...)
struct dt_gui_gtk_t * dt_gui_get_global(void)
void dt_gui_set_themes(GList *themes)
struct dt_bauhaus_t * dt_bauhaus_get_global(void)
GList * dt_gui_get_themes(void)
#define dt_database_start_transaction()
#define dt_database_release_transaction()
void dt_gui_refocus_parent(GtkWindow *parent)
GtkTreeStore * store
its model, owned by the view
GHashTable * selected
set of checked row labels, mirrored to conf on every change
static void dt_draw_cairo_to_gdk_pixbuf(uint8_t *data, unsigned int width, unsigned int height)
void dt_loc_get_datadir(char *datadir, size_t bufsize)
void dt_loc_get_user_config_dir(char *configdir, size_t bufsize)
static guint dt_keys_mainpad_alternatives(const guint key_val)
Remap keypad keys to usual mainpad ones.
void dt_gui_search_stop(GtkSearchEntry *entry, GtkWidget *widget)
gboolean dt_gui_search_start(GtkWidget *widget, GdkEventKey *event, GtkSearchEntry *entry)
void dt_gui_presets_show_edit_dialog(const char *name_in, const char *module_name, int rowid, GCallback final_callback, gpointer data, gboolean allow_name_change, gboolean allow_desc_change, gboolean allow_remove, GtkWindow *parent)
void dt_gui_presets_confirm_and_delete(GtkWidget *parent_dialog, const char *name, const char *module_name, int rowid)
static gboolean enable(const dt_image_t *image)
int dt_presets_import_from_file(const char *preset_path)
void dt_presets_save_to_file(const int rowid, const char *preset_name, const char *filedir)
gboolean dt_presets_module_can_autoapply(const gchar *operation)
struct dt_iop_tonecurve_params_t preset
const char * dt_l10n_get_name(const dt_l10n_language_t *language)
struct dt_l10n_t * dt_l10n_get_global(void)
GtkWidget * dt_ui_label_new(const gchar *str)
void dt_gui_textview_set_padding(GtkTextView *textview)
Apply the standard recessed-input text padding to a GtkTextView.
static void swap(float *x, float *y)
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...
static void dt_free_gpointer(gpointer ptr)
g_free() one pointer, with the signature GDestroyNotify wants.
#define dt_free(ptr)
g_free() ptr and set it to NULL, skipping both if it is already NULL.
int dt_opencl_set_detected_device_enabled(const int detected, const gboolean enabled)
gboolean dt_opencl_detected_device_pinned_memory(const int detected)
int dt_opencl_set_detected_device_headroom(const int detected, const size_t headroom)
int dt_opencl_get_detected_device_count(void)
int dt_opencl_set_detected_device_pinned_memory(const int detected, const gboolean enabled)
const dt_opencl_detected_device_t * dt_opencl_get_detected_device(const int detected)
size_t dt_opencl_detected_device_headroom(const int detected)
gboolean dt_opencl_detected_device_enabled(const int detected)
void dt_osx_disallow_fullscreen(GtkWidget *widget)
#define DT_PATH_MAX
Buffer size for a filesystem path anywhere in Ansel.
static void _resize_dialog(GtkWidget *widget)
static void cairo_destroy_from_pixbuf(guchar *pixels, gpointer data)
static gboolean _gui_preferences_bool_reset(GtkWidget *label, GdkEventButton *event, GtkWidget *widget)
static void tree_selection_changed(GtkTreeSelection *selection, gpointer data)
static void _opencl_device_pinned_memory_callback(GtkToggleButton *button, gpointer user_data)
static void _gui_preferences_bool_callback(GtkWidget *widget, gpointer data)
void dt_gui_preferences_enum_reset(GtkWidget *widget)
void dt_gui_preferences_string_reset(GtkWidget *widget)
static void _gui_preferences_enum_callback(GtkWidget *widget, gpointer data)
const int dt_gui_presets_exposure_value_cnt
void dt_gui_preferences_show()
static gboolean tree_key_press(GtkWidget *widget, GdkEventKey *event, gpointer data)
static void language_callback(GtkWidget *widget, gpointer user_data)
static gboolean tree_key_press_presets(GtkWidget *widget, GdkEventKey *event, gpointer data)
static void use_sys_font_callback(GtkWidget *widget, gpointer user_data)
static void dpi_scaling_changed_callback(GtkWidget *widget, gpointer user_data)
void dt_gui_preferences_string_update(GtkWidget *widget)
static void save_usercss(GtkTextBuffer *buffer)
const float dt_gui_presets_aperture_value[]
static void usercss_dialog_callback(GtkDialog *dialog, gint response_id, gpointer user_data)
const int dt_gui_presets_aperture_value_cnt
static void _opencl_device_enabled_callback(GtkToggleButton *button, gpointer user_data)
static GtkWidget * _preferences_dialog
static void import_preset(GtkButton *button, gpointer data)
static void edit_preset_response(dt_gui_presets_edit_dialog_t *g)
void dt_gui_preferences_int_update(GtkWidget *widget)
static void init_tab_presets(GtkWidget *stack)
static void _gui_preferences_int_callback(GtkWidget *widget, gpointer data)
const char * dt_gui_presets_exposure_value_str[]
static void tree_row_activated_presets(GtkTreeView *tree, GtkTreePath *path, GtkTreeViewColumn *column, gpointer data)
static void export_preset(GtkButton *button, gpointer data)
static void _gui_preferences_string_callback(GtkWidget *widget, gpointer data)
static void reload_ui_last_theme(void)
static GList * load_themes_dir(GList *themes, const char *basedir)
static gboolean reset_language_widget(GtkWidget *label, GdkEventButton *event, GtkWidget *widget)
static void theme_callback(GtkWidget *widget, gpointer user_data)
static void init_tab_general(GtkWidget *dialog, GtkWidget *stack, dt_gui_themetweak_widgets_t *tw)
static gint compare_rows_presets(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer data)
void dt_gui_preferences_bool_reset(GtkWidget *widget)
void dt_gui_preferences_int_reset(GtkWidget *widget)
void _gui_preferences_enum_set(GtkWidget *widget, const char *str)
static void edit_preset(GtkTreeView *tree, const gint rowid, const gchar *name, const gchar *module)
static gboolean _gui_preferences_string_reset(GtkWidget *label, GdkEventButton *event, GtkWidget *widget)
const char * dt_gui_presets_aperture_value_str[]
void dt_gui_preferences_enum_update(GtkWidget *widget)
static void save_usercss_callback(GtkWidget *widget, gpointer user_data)
GtkWidget * dt_gui_preferences_int(GtkGrid *grid, const char *key, const guint col, const guint line)
const float dt_gui_presets_exposure_value[]
static gboolean _gui_preferences_enum_reset(GtkWidget *label, GdkEventButton *event, GtkWidget *widget)
static void font_size_changed_callback(GtkWidget *widget, gpointer user_data)
static void tree_insert_presets(GtkTreeStore *tree_model)
GtkWidget * dt_gui_preferences_string(GtkGrid *grid, const char *key, const guint col, const guint line)
static gboolean _search_func(GtkTreeModel *model, gint column, const gchar *key, GtkTreeIter *iter, gpointer search_data)
static void load_themes(void)
static void usercss_callback(GtkWidget *widget, gpointer user_data)
GtkWidget * dt_gui_preferences_enum(GtkGrid *grid, const char *key, const guint col, const guint line)
GtkWidget * dt_gui_preferences_bool(GtkGrid *grid, const char *key, const guint col, const guint line, const gboolean swap)
static void _import_preset_from_file(const gchar *filename)
void dt_gui_preferences_bool_update(GtkWidget *widget)
static gboolean _gui_preferences_int_reset(GtkWidget *label, GdkEventButton *event, GtkWidget *widget)
static void _opencl_device_headroom_callback(GtkSpinButton *button, gpointer user_data)
GList * dt_preset_repository_list_all(void)
Every preset, ordered by (operation, name) – the grouping the tree relies on to start a new module no...
void dt_preset_row_free(gpointer data)
Free one dt_preset_row_t. Suits g_list_free_full().
GList * dt_preset_repository_list_editable(void)
Every preset the user may edit (writeprotect = 0), in row order.
void dt_preset_identity_free(gpointer data)
Free one dt_preset_identity_t. Suits g_list_free_full().
gboolean dt_preset_repository_get_identity(const int rowid, gchar **operation, int *op_version)
The (operation, op_version) a rowid belongs to. Returns FALSE if there is none; *operation is newly a...
data.presets: a module's saved parameters, with the conditions under which it auto-applies.
#define DT_DEBUG_CONTROL_SIGNAL_RAISE(ctlsig, signal,...)
struct dt_control_signal_t * dt_control_signal_get_global(void)
@ DT_SIGNAL_PREFERENCES_CHANGE
This signal is raised after preferences have been changed no parameters no return.
static const dt_aligned_pixel_simd_t value
gboolean host_unified_memory
Identity of one preset, for callers listing rather than loading.
One row of the Preferences preset tree, with its auto-apply conditions.
Telling the user something happened.
GList * dt_util_str_to_glist(const gchar *separator, const gchar *text)