55#include <gdk/gdkkeysyms.h>
78#include "preferences_gen.h"
84#ifdef GDK_WINDOWING_QUARTZ
105 const int detected = GPOINTER_TO_INT(user_data);
106 const gboolean device_enabled = gtk_toggle_button_get_active(button);
108 restart_required =
TRUE;
112 GList *dependents = (GList *)g_object_get_data(G_OBJECT(button),
"dependent-widgets");
113 for(GList *l = dependents; l; l = l->next) gtk_widget_set_sensitive(GTK_WIDGET(l->data), device_enabled);
120 const int detected = GPOINTER_TO_INT(user_data);
121 const gboolean pinned_memory = gtk_toggle_button_get_active(button);
128 const int detected = GPOINTER_TO_INT(user_data);
129 const size_t headroom = gtk_spin_button_get_value_as_int(button);
165static void edit_preset(GtkTreeView *tree,
const gint rowid,
const gchar *
name,
const gchar *module);
173 char *themes_dir = g_build_filename(basedir,
"themes", NULL);
174 GDir *dir = g_dir_open(themes_dir, 0, NULL);
180 while((d_name = g_dir_read_name(dir)))
181 themes = g_list_append(themes, g_strdup(d_name));
199 GList *themes = NULL;
214 const int selected = gtk_combo_box_get_active(GTK_COMBO_BOX(widget));
216 gchar *
i = g_strrstr(theme,
".");
224 dt_conf_set_bool(
"themes/usercss", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)));
230 dt_conf_set_float(
"font_size", gtk_spin_button_get_value(GTK_SPIN_BUTTON(widget)));
236 float dpi = gtk_spin_button_get_value(GTK_SPIN_BUTTON(widget));
237 if(dpi > 0.0) dpi = fmax(64, dpi);
239 restart_required =
TRUE;
246 dt_conf_set_bool(
"use_system_font", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)));
248 gtk_widget_set_state_flags(GTK_WIDGET(user_data), GTK_STATE_FLAG_INSENSITIVE,
TRUE);
250 gtk_widget_set_state_flags(GTK_WIDGET(user_data), GTK_STATE_FLAG_NORMAL,
TRUE);
260 g_snprintf(usercsspath,
sizeof(usercsspath),
"%s/user.css", configdir);
263 GtkTextIter start, end;
264 gtk_text_buffer_get_start_iter(buffer, &start);
265 gtk_text_buffer_get_end_iter(buffer, &end);
266 gchar *usercsscontent = gtk_text_buffer_get_text(buffer, &start, &end,
FALSE);
269 GError *
error = NULL;
270 if(!g_file_set_contents(usercsspath, usercsscontent, -1, &
error))
272 fprintf(stderr,
"%s: error saving css to %s: %s\n", G_STRFUNC, usercsspath,
error->message);
273 g_clear_error(&
error);
281 GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(tw->
css_text_view));
285 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(tw->
apply_toggle)))
301 GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(tw->
css_text_view));
309 int selected = gtk_combo_box_get_active(GTK_COMBO_BOX(widget));
321 restart_required =
TRUE;
326 if(event->type == GDK_2BUTTON_PRESS)
341 gtk_widget_set_valign(grid, GTK_ALIGN_START);
346 gtk_stack_add_titled(GTK_STACK(stack),
container, _(
"general"), _(
"general"));
350 GtkWidget *label = gtk_label_new(_(
"interface language"));
351 gtk_widget_set_halign(label, GTK_ALIGN_START);
352 GtkWidget *labelev = gtk_event_box_new();
353 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
354 gtk_container_add(GTK_CONTAINER(labelev), label);
355 GtkWidget *widget = gtk_combo_box_text_new();
360 gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(widget),
name);
365 gtk_widget_set_tooltip_text(labelev, _(
"double-click to reset to the system language"));
366 gtk_event_box_set_visible_window(GTK_EVENT_BOX(labelev),
FALSE);
367 gtk_widget_set_tooltip_text(widget, _(
"set the language of the user interface. the system default is marked with an * (needs a restart)"));
368 gtk_grid_attach(GTK_GRID(grid), labelev, 0, line++, 1, 1);
369 gtk_grid_attach_next_to(GTK_GRID(grid), widget, labelev, GTK_POS_RIGHT, 1, 1);
370 g_signal_connect(G_OBJECT(labelev),
"button-press-event", G_CALLBACK(
reset_language_widget), (gpointer)widget);
376 label = gtk_label_new(_(
"theme"));
377 gtk_widget_set_halign(label, GTK_ALIGN_START);
378 widget = gtk_combo_box_text_new();
379 labelev = gtk_event_box_new();
380 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
381 gtk_container_add(GTK_CONTAINER(labelev), label);
382 gtk_grid_attach(GTK_GRID(grid), labelev, 0, line++, 1, 1);
383 gtk_grid_attach_next_to(GTK_GRID(grid), widget, labelev, GTK_POS_RIGHT, 1, 1);
391 gchar *
name = g_strdup((gchar*)(iter->data));
393 gchar *
i = g_strrstr(
name,
".");
395 gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(widget),
name);
402 gtk_combo_box_set_active(GTK_COMBO_BOX(widget),
selected);
404 g_signal_connect(G_OBJECT(widget),
"changed", G_CALLBACK(
theme_callback), 0);
405 gtk_widget_set_tooltip_text(widget, _(
"set the theme for the user interface"));
408 GtkWidget *usesysfont = gtk_check_button_new();
409 GtkWidget *fontsize = gtk_spin_button_new_with_range(5.0f, 30.0f, 0.2f);
414 gtk_widget_set_state_flags(fontsize, GTK_STATE_FLAG_INSENSITIVE,
TRUE);
416 gtk_widget_set_state_flags(fontsize, GTK_STATE_FLAG_NORMAL,
TRUE);
418 label = gtk_label_new(_(
"use system font size"));
419 gtk_widget_set_halign(label, GTK_ALIGN_START);
420 labelev = gtk_event_box_new();
421 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
422 gtk_container_add(GTK_CONTAINER(labelev), label);
423 gtk_grid_attach(GTK_GRID(grid), labelev,
i,
i?2:line++, 1, 1);
424 gtk_grid_attach_next_to(GTK_GRID(grid), usesysfont, labelev, GTK_POS_RIGHT, 1, 1);
425 gtk_widget_set_tooltip_text(usesysfont, _(
"use system font size"));
426 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(usesysfont),
dt_conf_get_bool(
"use_system_font"));
427 g_signal_connect(G_OBJECT(usesysfont),
"toggled", G_CALLBACK(
use_sys_font_callback), (gpointer)fontsize);
434 label = gtk_label_new(_(
"font size in points"));
435 gtk_widget_set_halign(label, GTK_ALIGN_START);
436 labelev = gtk_event_box_new();
437 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
438 gtk_container_add(GTK_CONTAINER(labelev), label);
439 gtk_grid_attach(GTK_GRID(grid), labelev,
i,
i?0:line++, 1, 1);
440 gtk_grid_attach_next_to(GTK_GRID(grid), fontsize, labelev, GTK_POS_RIGHT, 1, 1);
441 gtk_widget_set_tooltip_text(fontsize, _(
"font size in points"));
442 gtk_spin_button_set_value(GTK_SPIN_BUTTON(fontsize),
dt_conf_get_float(
"font_size"));
445 GtkWidget *screen_dpi_overwrite = gtk_spin_button_new_with_range(-1.0f, 360, 1.f);
446 label = gtk_label_new(_(
"GUI controls and text DPI"));
447 gtk_widget_set_halign(label, GTK_ALIGN_START);
448 labelev = gtk_event_box_new();
449 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
450 gtk_container_add(GTK_CONTAINER(labelev), label);
451 gtk_grid_attach(GTK_GRID(grid), labelev,
i,
i?1:line++, 1, 1);
452 gtk_grid_attach_next_to(GTK_GRID(grid), screen_dpi_overwrite, labelev, GTK_POS_RIGHT, 1, 1);
453 gtk_widget_set_tooltip_text(screen_dpi_overwrite, _(
"adjust the global GUI resolution to rescale controls, buttons, labels, etc.\n"
454 "increase for a magnified GUI, decrease to fit more content in window.\n"
455 "set to -1 to use the system-defined global resolution.\n"
456 "default is 96 DPI on most systems.\n"
457 "(needs a restart)."));
458 gtk_spin_button_set_value(GTK_SPIN_BUTTON(screen_dpi_overwrite),
dt_conf_get_float(
"screen_dpi_overwrite"));
462 label = gtk_label_new(_(
"modify selected theme with CSS tweaks below"));
463 gtk_widget_set_halign(label, GTK_ALIGN_START);
465 labelev = gtk_event_box_new();
466 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
467 gtk_container_add(GTK_CONTAINER(labelev), label);
468 gtk_grid_attach(GTK_GRID(grid), labelev, 0, line++, 1, 1);
469 gtk_grid_attach_next_to(GTK_GRID(grid), tw->
apply_toggle, labelev, GTK_POS_RIGHT, 1, 1);
470 gtk_widget_set_tooltip_text(tw->
apply_toggle, _(
"modify theme with CSS keyed below (saved to user.css)"));
477 gtk_widget_set_name(usercssbox,
"usercss-box");
479 GtkTextBuffer *buffer = gtk_text_buffer_new(NULL);
483 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(tw->
css_text_view), GTK_WRAP_WORD);
488 GtkWidget *scroll = gtk_scrolled_window_new(NULL, NULL);
489 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
491 gtk_box_pack_start(GTK_BOX(usercssbox), scroll,
TRUE,
TRUE, 0);
493 tw->
save_button = gtk_button_new_with_label(C_(
"usercss",
"save CSS and apply"));
498 gtk_box_pack_start(GTK_BOX(usercssbox), hbox,
FALSE,
FALSE, 0);
499 gtk_widget_set_tooltip_text(tw->
save_button, _(
"click to save and apply the CSS tweaks entered in this editor"));
504 g_snprintf(usercsspath,
sizeof(usercsspath),
"%s/user.css", configdir);
506 if(g_file_test(usercsspath, G_FILE_TEST_EXISTS))
508 gchar *usercsscontent = NULL;
510 if(g_file_get_contents(usercsspath, &usercsscontent, NULL, NULL))
512 gtk_text_buffer_set_text(buffer, usercsscontent, -1);
517 gchar *errtext = g_strconcat(
"/* ", _(
"ERROR Loading user.css"),
" */", NULL);
518 gtk_text_buffer_set_text(buffer, errtext, -1);
526 gchar *deftext = g_strconcat(
"/* ", _(
"Enter CSS theme tweaks here"),
" */\n\n", NULL);
527 gtk_text_buffer_set_text(buffer, deftext, -1);
537gboolean preferences_window_deleted(
GtkWidget *widget, GdkEvent *event, gpointer data)
546 gtk_widget_hide(widget);
553 GtkAllocation allocation;
554 gtk_widget_get_allocation(widget, &allocation);
556 dt_conf_set_int(
"ui_last/preferences_dialog_height", allocation.height);
563 GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
567 g_signal_connect(G_OBJECT(
_preferences_dialog),
"delete-event", G_CALLBACK(preferences_window_deleted), NULL);
574#ifdef GDK_WINDOWING_QUARTZ
582 gtk_widget_set_name(content,
"preferences-content");
583 gtk_container_set_border_width(GTK_CONTAINER(content), 0);
587 gtk_widget_set_name(box,
"preferences-box");
588 gtk_container_set_border_width(GTK_CONTAINER(box), 0);
589 gtk_box_pack_start(GTK_BOX(content), box,
TRUE,
TRUE, 0);
593 GtkWidget *stacksidebar = gtk_stack_sidebar_new();
594 gtk_stack_sidebar_set_stack(GTK_STACK_SIDEBAR(stacksidebar), GTK_STACK(stack));
595 gtk_box_pack_start(GTK_BOX(box), stacksidebar,
FALSE,
FALSE, 0);
596 gtk_box_pack_start(GTK_BOX(box), stack,
TRUE,
TRUE, 0);
600 restart_required =
FALSE;
611 GtkWidget *scroll = gtk_stack_get_child_by_name(GTK_STACK(stack), _(
"processing"));
612 GtkWidget *viewport = GTK_IS_BIN(scroll) ? gtk_bin_get_child(GTK_BIN(scroll)) : NULL;
613 GtkWidget *grid = GTK_IS_BIN(viewport) ? gtk_bin_get_child(GTK_BIN(viewport)) : NULL;
619 int insert_line = -1;
620 GList *children = gtk_container_get_children(GTK_CONTAINER(grid));
623 for(GList *child = children; child; child = g_list_next(child))
627 gtk_container_child_get(GTK_CONTAINER(grid), GTK_WIDGET(child->data),
"top-attach", &
top,
"height", &
height,
631 if(GTK_IS_CONTAINER(child->data))
635 GList *box_children = gtk_container_get_children(GTK_CONTAINER(child->data));
636 for(GList *box_child = box_children; box_child; box_child = g_list_next(box_child))
638 const char *
name = gtk_widget_get_name(GTK_WIDGET(box_child->data));
645 g_list_free(box_children);
648 g_list_free(children);
652 const int device_rows = detected_devices * 4;
658 children = gtk_container_get_children(GTK_CONTAINER(grid));
661 for(GList *child = children; child; child = g_list_next(child))
664 gtk_container_child_get(GTK_CONTAINER(grid), GTK_WIDGET(child->data),
"top-attach", &
top, NULL);
665 if(
top >= insert_line)
666 gtk_container_child_set(GTK_CONTAINER(grid), GTK_WIDGET(child->data),
"top-attach",
667 top + device_rows, NULL);
669 g_list_free(children);
678 for(
int dev = 0; dev < detected_devices; dev++)
685 gchar *label_text = g_strdup_printf(
"%d: %s", device->
config_id, device_name);
686 GtkWidget *device_title = gtk_label_new(label_text);
688 gtk_box_pack_start(GTK_BOX(title_box), device_title,
FALSE,
FALSE, 0);
694 gtk_widget_set_name(title_box,
"pref_subsection");
695 gtk_grid_attach(GTK_GRID(grid), title_box, 0, line++, 3, 1);
698 GtkWidget *enable_label = gtk_label_new(_(
"Enable"));
699 gtk_widget_set_halign(enable_label, GTK_ALIGN_START);
700 gtk_widget_set_hexpand(enable_label,
TRUE);
702 gtk_grid_attach(GTK_GRID(grid), enable_label, 0, line, 1, 1);
703 GtkWidget *enable_labdef = gtk_label_new(
"");
704 gtk_widget_set_name(enable_labdef,
"preference_non_default");
705 gtk_grid_attach(GTK_GRID(grid), enable_labdef, 1, line, 1, 1);
709 gtk_widget_set_tooltip_text(
enable, _(
"Enable or disable OpenCL processing for this GPU"));
711 GINT_TO_POINTER(dev));
712 gtk_grid_attach(GTK_GRID(grid),
enable, 2, line++, 1, 1);
714 GtkWidget *pinned_memory_label = gtk_label_new(_(
"pinned memory"));
715 gtk_widget_set_halign(pinned_memory_label, GTK_ALIGN_START);
716 gtk_widget_set_hexpand(pinned_memory_label,
TRUE);
718 gtk_grid_attach(GTK_GRID(grid), pinned_memory_label, 0, line, 1, 1);
719 GtkWidget *pinned_memory_labdef = gtk_label_new(
"");
720 gtk_widget_set_name(pinned_memory_labdef,
"preference_non_default");
721 gtk_grid_attach(GTK_GRID(grid), pinned_memory_labdef, 1, line, 1, 1);
723 GtkWidget *pinned_memory = gtk_check_button_new();
724 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pinned_memory),
726 gtk_widget_set_tooltip_text(pinned_memory, _(
"Use pinned host memory for OpenCL transfers on this GPU"));
728 GINT_TO_POINTER(dev));
729 gtk_grid_attach(GTK_GRID(grid), pinned_memory, 2, line++, 1, 1);
735 ? _(
"GPU memory headroom, shared with system RAM (MiB)")
736 : _(
"GPU vRAM headroom (MiB)"));
737 gtk_widget_set_halign(headroom_label, GTK_ALIGN_START);
738 gtk_widget_set_hexpand(headroom_label,
TRUE);
740 gtk_grid_attach(GTK_GRID(grid), headroom_label, 0, line, 1, 1);
741 GtkWidget *headroom_labdef = gtk_label_new(
"");
742 gtk_widget_set_name(headroom_labdef,
"preference_non_default");
743 gtk_grid_attach(GTK_GRID(grid), headroom_labdef, 1, line, 1, 1);
745 GtkWidget *headroom = gtk_spin_button_new_with_range(0, G_MAXINT, 1);
746 gtk_widget_set_hexpand(headroom,
FALSE);
747 gtk_spin_button_set_digits(GTK_SPIN_BUTTON(headroom), 0);
750 ? _(
"This GPU has no dedicated vRAM -- it shares memory with the "
751 "system. Memory reserved here for the OS, desktop and other "
753 : _(
"GPU memory reserved for the system and other applications"));
755 GINT_TO_POINTER(dev));
756 gtk_grid_attach(GTK_GRID(grid), headroom, 2, line++, 1, 1);
762 GList *dependents = NULL;
763 dependents = g_list_append(dependents, pinned_memory_label);
764 dependents = g_list_append(dependents, pinned_memory_labdef);
765 dependents = g_list_append(dependents, pinned_memory);
766 dependents = g_list_append(dependents, headroom_label);
767 dependents = g_list_append(dependents, headroom_labdef);
768 dependents = g_list_append(dependents, headroom);
769 g_object_set_data_full(G_OBJECT(
enable),
"dependent-widgets", dependents, (GDestroyNotify)g_list_free);
771 const gboolean device_enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
enable));
772 for(GList *l = dependents; l; l = l->next) gtk_widget_set_sensitive(GTK_WIDGET(l->data), device_enabled);
791 dt_control_log(_(
"Ansel needs to be restarted for settings to take effect"));
798 cairo_destroy((cairo_t *)data);
803 GtkTreeIter iter, parent;
804 gchar *last_module = NULL;
810 cairo_t *lock_cr = cairo_create(lock_cst);
811 cairo_set_source_rgb(lock_cr, 0.7, 0.7, 0.7);
813 cairo_surface_flush(lock_cst);
814 guchar *data = cairo_image_surface_get_data(lock_cst);
816 GdkPixbuf *lock_pixbuf = gdk_pixbuf_new_from_data(data, GDK_COLORSPACE_RGB,
TRUE, 8,
818 cairo_image_surface_get_stride(lock_cst),
824 cairo_t *check_cr = cairo_create(check_cst);
825 cairo_set_source_rgb(check_cr, 0.7, 0.7, 0.7);
827 cairo_surface_flush(check_cst);
828 data = cairo_image_surface_get_data(check_cst);
830 GdkPixbuf *check_pixbuf = gdk_pixbuf_new_from_data(data, GDK_COLORSPACE_RGB,
TRUE, 8,
832 cairo_image_surface_get_stride(check_cst),
835 for(GList *
p = presets;
p;
p = g_list_next(
p))
838 const gint rowid =
preset->rowid;
840 const gchar *operation =
preset->operation;
841 const gboolean autoapply =
preset->autoapply;
844 const gchar *lens =
preset->lens;
847 const float exposure_min =
preset->exposure_min;
848 const float exposure_max =
preset->exposure_max;
849 const float aperture_min =
preset->aperture_min;
850 const float aperture_max =
preset->aperture_max;
851 const int focal_length_min =
preset->focal_length_min;
852 const int focal_length_max =
preset->focal_length_max;
853 const gboolean writeprotect =
preset->writeprotect;
855 gchar *iso = NULL, *exposure = NULL, *aperture = NULL, *focal_length = NULL, *smaker = NULL, *smodel = NULL, *slens = NULL;
858 gchar *
module = g_strdup(dt_iop_get_localized_name(operation));
859 if(
IS_NULL_PTR(module))
module = g_strdup(dt_lib_get_localized_name(operation));
860 if(
IS_NULL_PTR(module))
module = g_strdup(operation);
865 exposure = g_strdup(
"");
866 aperture = g_strdup(
"");
867 focal_length = g_strdup(
"");
868 smaker = g_strdup(
"");
869 smodel = g_strdup(
"");
870 slens = g_strdup(
"");
874 smaker = g_strdup(
maker);
875 smodel = g_strdup(
model);
876 slens = g_strdup(lens);
881 iso = g_strdup_printf(
"%" G_GSIZE_FORMAT
" - %" G_GSIZE_FORMAT
"", (
size_t)
iso_min, (
size_t)
iso_max);
888 exposure = g_strdup(
"%");
898 aperture = g_strdup(
"%");
903 if(focal_length_min == 0.0 && focal_length_max == 1000.0)
904 focal_length = g_strdup(
"%");
906 focal_length = g_strdup_printf(
"%d - %d", focal_length_min, focal_length_max);
909 if(g_strcmp0(last_module, operation) != 0)
911 gtk_tree_store_insert_with_values(tree_model, &iter, NULL, -1,
917 last_module = g_strdup(operation);
921 gtk_tree_store_insert_with_values(tree_model, &iter, &parent, -1,
927 autoapply ? check_pixbuf : NULL, -1);
941 g_object_unref(lock_pixbuf);
942 cairo_surface_destroy(lock_cst);
943 g_object_unref(check_pixbuf);
944 cairo_surface_destroy(check_cst);
947static gboolean
_search_func(GtkTreeModel *
model, gint column,
const gchar *
key, GtkTreeIter *iter, gpointer search_data)
949 gchar *key_case = g_utf8_casefold(
key, -1), *label = NULL;
952 gchar *name_case = g_utf8_casefold(label, -1);
955 gchar *module_case = g_utf8_casefold(label, -1);
958 const gboolean different = !((name_case && strstr(name_case, key_case))
959 || (module_case && strstr(module_case, key_case)));
967 GtkTreePath *path = gtk_tree_model_get_path(
model, iter);
968 gtk_tree_view_expand_to_path(GTK_TREE_VIEW(search_data), path);
969 gtk_tree_path_free(path);
975 if(gtk_tree_model_iter_children(
model, &child, iter))
981 while(gtk_tree_model_iter_next(
model, &child));
990 GtkWidget *scroll = gtk_scrolled_window_new(NULL, NULL);
991 GtkTreeView *tree = GTK_TREE_VIEW(gtk_tree_view_new());
992 GtkTreeStore *
model = gtk_tree_store_new(
993 P_N_COLUMNS, G_TYPE_INT , G_TYPE_STRING , G_TYPE_STRING ,
994 GDK_TYPE_PIXBUF , G_TYPE_STRING , G_TYPE_STRING , G_TYPE_STRING ,
995 G_TYPE_STRING , G_TYPE_STRING , G_TYPE_STRING , G_TYPE_STRING ,
996 G_TYPE_STRING , GDK_TYPE_PIXBUF );
997 GtkCellRenderer *renderer;
998 GtkTreeViewColumn *column;
1001 gtk_stack_add_titled(GTK_STACK(stack),
container, _(
"presets"), _(
"presets"));
1006 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(
model),
P_MODULE_COLUMN, GTK_SORT_ASCENDING);
1010 renderer = gtk_cell_renderer_text_new();
1011 column = gtk_tree_view_column_new_with_attributes(_(
"module"), renderer,
"text",
P_MODULE_COLUMN, NULL);
1012 gtk_tree_view_append_column(tree, column);
1014 renderer = gtk_cell_renderer_pixbuf_new();
1015 column = gtk_tree_view_column_new_with_attributes(
"", renderer,
"pixbuf",
P_EDITABLE_COLUMN, NULL);
1016 gtk_tree_view_append_column(tree, column);
1018 renderer = gtk_cell_renderer_text_new();
1019 column = gtk_tree_view_column_new_with_attributes(_(
"name"), renderer,
"text",
P_NAME_COLUMN, NULL);
1020 gtk_tree_view_append_column(tree, column);
1022 renderer = gtk_cell_renderer_text_new();
1023 column = gtk_tree_view_column_new_with_attributes(_(
"model"), renderer,
"text",
P_MODEL_COLUMN, NULL);
1024 gtk_tree_view_append_column(tree, column);
1026 renderer = gtk_cell_renderer_text_new();
1027 column = gtk_tree_view_column_new_with_attributes(_(
"maker"), renderer,
"text",
P_MAKER_COLUMN, NULL);
1028 gtk_tree_view_append_column(tree, column);
1030 renderer = gtk_cell_renderer_text_new();
1031 column = gtk_tree_view_column_new_with_attributes(_(
"lens"), renderer,
"text",
P_LENS_COLUMN, NULL);
1032 gtk_tree_view_append_column(tree, column);
1034 renderer = gtk_cell_renderer_text_new();
1035 column = gtk_tree_view_column_new_with_attributes(_(
"ISO"), renderer,
"text",
P_ISO_COLUMN, NULL);
1036 gtk_tree_view_append_column(tree, column);
1038 renderer = gtk_cell_renderer_text_new();
1039 column = gtk_tree_view_column_new_with_attributes(_(
"exposure"), renderer,
"text",
P_EXPOSURE_COLUMN, NULL);
1040 gtk_tree_view_append_column(tree, column);
1042 renderer = gtk_cell_renderer_text_new();
1043 column = gtk_tree_view_column_new_with_attributes(_(
"aperture"), renderer,
"text",
P_APERTURE_COLUMN, NULL);
1044 gtk_tree_view_append_column(tree, column);
1046 renderer = gtk_cell_renderer_text_new();
1047 column = gtk_tree_view_column_new_with_attributes(_(
"focal length"), renderer,
"text",
1049 gtk_tree_view_append_column(tree, column);
1051 renderer = gtk_cell_renderer_pixbuf_new();
1052 column = gtk_tree_view_column_new_with_attributes(_(
"auto"), renderer,
"pixbuf",
P_AUTOAPPLY_COLUMN, NULL);
1053 gtk_tree_view_append_column(tree, column);
1055 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1060 gtk_widget_set_name(hbox,
"preset_controls");
1062 GtkWidget *search_presets = gtk_search_entry_new();
1065 gtk_box_pack_start(GTK_BOX(hbox), search_presets,
FALSE,
TRUE, 0);
1066 gtk_entry_set_placeholder_text(GTK_ENTRY(search_presets), _(
"search presets list"));
1067 gtk_widget_set_tooltip_text(GTK_WIDGET(search_presets), _(
"incrementally search the list of presets\npress up or down keys to cycle through matches"));
1068 g_signal_connect(G_OBJECT(search_presets),
"activate", G_CALLBACK(
dt_gui_search_stop), tree);
1069 g_signal_connect(G_OBJECT(search_presets),
"stop-search", G_CALLBACK(
dt_gui_search_stop), tree);
1070 g_signal_connect(G_OBJECT(tree),
"key-press-event", G_CALLBACK(
dt_gui_search_start), search_presets);
1071 gtk_tree_view_set_search_entry(tree, GTK_ENTRY(search_presets));
1073 GtkWidget *button = gtk_button_new_with_label(C_(
"preferences",
"import..."));
1074 gtk_box_pack_end(GTK_BOX(hbox), button,
FALSE,
TRUE, 0);
1075 g_signal_connect(G_OBJECT(button),
"clicked", G_CALLBACK(
import_preset), (gpointer)
model);
1077 button = gtk_button_new_with_label(C_(
"preferences",
"export..."));
1078 gtk_box_pack_end(GTK_BOX(hbox), button,
FALSE,
TRUE, 0);
1079 g_signal_connect(G_OBJECT(button),
"clicked", G_CALLBACK(
export_preset), (gpointer)
model);
1092 gtk_tree_view_set_search_equal_func(tree,
_search_func, tree, NULL);
1095 gtk_tree_view_set_model(tree, GTK_TREE_MODEL(
model));
1099 gtk_container_add(GTK_CONTAINER(scroll), GTK_WIDGET(tree));
1100 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1102 g_object_unref(G_OBJECT(
model));
1113 GtkTreeModel *
model = gtk_tree_view_get_model(tree);
1115 gtk_tree_model_get_iter(
model, &iter, path);
1117 if(gtk_tree_model_iter_has_child(
model, &iter))
1120 if(gtk_tree_view_row_expanded(tree, path))
1121 gtk_tree_view_collapse_row(tree, path);
1123 gtk_tree_view_expand_row(tree, path,
FALSE);
1129 gchar *
name, *operation;
1130 GdkPixbuf *editable;
1136 g_object_unref(editable);
1147 GtkTreeModel *
model = (GtkTreeModel *)data;
1149 GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
1152 if(event->is_modifier)
return FALSE;
1155 if(
key == GDK_KEY_Delete ||
key == GDK_KEY_BackSpace)
1160 if(!gtk_tree_selection_get_selected(selection, &
model, &iter)
1161 || gtk_tree_model_iter_has_child(
model, &iter))
1167 GdkPixbuf *editable;
1173 gchar *operation = NULL;
1179 GtkTreeStore *tree_store = GTK_TREE_STORE(
model);
1180 gtk_tree_store_clear(tree_store);
1189 g_object_unref(editable);
1211 GtkTreeModel *
model = (GtkTreeModel *)data;
1212 GtkWindow *win = GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(button)));
1215 GtkFileChooserNative *chooser = gtk_file_chooser_native_new(
1216 _(
"select preset(s) to import"), GTK_WINDOW(win), GTK_FILE_CHOOSER_ACTION_OPEN,
1217 _(
"_open"), _(
"_cancel"));
1220 gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(chooser),
TRUE);
1222 GtkFileFilter *filter;
1223 filter = GTK_FILE_FILTER(gtk_file_filter_new());
1224 gtk_file_filter_add_pattern(filter,
"*.dtpreset");
1225 gtk_file_filter_add_pattern(filter,
"*.DTPRESET");
1226 gtk_file_filter_set_name(filter, _(
"Ansel preset files"));
1227 gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), filter);
1229 filter = GTK_FILE_FILTER(gtk_file_filter_new());
1230 gtk_file_filter_add_pattern(filter,
"*");
1231 gtk_file_filter_set_name(filter, _(
"all files"));
1233 gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), filter);
1235 if(gtk_native_dialog_run(GTK_NATIVE_DIALOG(chooser)) == GTK_RESPONSE_ACCEPT)
1237 GSList *filenames = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(chooser));
1241 GtkTreeStore *tree_store = GTK_TREE_STORE(
model);
1242 gtk_tree_store_clear(tree_store);
1247 g_object_unref(chooser);
1252 GtkWindow *win = GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(button)));
1254 GtkFileChooserNative *filechooser = gtk_file_chooser_native_new(
1255 _(
"select directory"), GTK_WINDOW(win), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
1256 _(
"_save"), _(
"_cancel"));
1260 if(gtk_native_dialog_run(GTK_NATIVE_DIALOG(filechooser)) == GTK_RESPONSE_ACCEPT)
1262 gchar *filedir = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filechooser));
1268 for(GList *
p = presets;
p;
p = g_list_next(
p))
1271 gchar *preset_name = g_strdup_printf(
"%s_%s",
preset->operation,
preset->name);
1285 g_object_unref(filechooser);
1296 if(*a_text ==
'\0' && *b_text ==
'\0')
1305 const int res = strcoll(a_text, b_text);
1315 GtkTreeStore *tree_store = GTK_TREE_STORE(gtk_tree_view_get_model((GtkTreeView *)
g->data));
1316 gtk_tree_store_clear(tree_store);
1320static void edit_preset(GtkTreeView *tree,
const gint rowid,
const gchar *
name,
const gchar *module)
1329 dt_conf_set_bool((
char *)data, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)));
1334 const char *
key = gtk_widget_get_name(widget);
1336 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), def);
1342 if(event->type == GDK_2BUTTON_PRESS)
1352 const char *
key = gtk_widget_get_name(widget);
1354 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), val);
1358 const guint line,
const gboolean
swap)
1362 GtkWidget *labelev = gtk_event_box_new();
1363 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
1364 gtk_container_add(GTK_CONTAINER(labelev), w_label);
1367 gtk_grid_attach(GTK_GRID(grid), labelev,
swap ? (col + 1) : col, line, 1, 1);
1368 gtk_grid_attach(GTK_GRID(grid), w,
swap ? col : (col + 1), line, 1, 1);
1377 dt_conf_set_int((
char *)data, gtk_spin_button_get_value(GTK_SPIN_BUTTON(widget)));
1382 const char *
key = gtk_widget_get_name(widget);
1384 gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), def);
1390 if(event->type == GDK_2BUTTON_PRESS)
1400 const char *
key = gtk_widget_get_name(widget);
1402 gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), val);
1410 GtkWidget *labelev = gtk_event_box_new();
1411 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
1412 gtk_container_add(GTK_CONTAINER(labelev), w_label);
1416 gtk_widget_set_hexpand(w,
FALSE);
1417 gtk_spin_button_set_digits(GTK_SPIN_BUTTON(w), 0);
1419 gtk_grid_attach(GTK_GRID(grid), labelev, col, line, 1, 1);
1420 gtk_grid_attach(GTK_GRID(grid), w, col + 1, line, 1, 1);
1430 if(gtk_combo_box_get_active_iter(GTK_COMBO_BOX(widget), &iter))
1433 gtk_tree_model_get(gtk_combo_box_get_model(GTK_COMBO_BOX(widget)), &iter, 0, &s, -1);
1441 GtkTreeModel *
model = gtk_combo_box_get_model(GTK_COMBO_BOX(widget));
1443 gboolean valid = gtk_tree_model_get_iter_first(
model, &iter);
1445 gboolean found =
FALSE;
1449 gtk_tree_model_get(
model, &iter, 0, &
value, -1);
1450 if(!g_strcmp0(
value, str))
1458 valid = gtk_tree_model_iter_next(
model, &iter);
1461 gtk_combo_box_set_active(GTK_COMBO_BOX(widget),
i);
1466 const char *
key = gtk_widget_get_name(widget);
1474 if(event->type == GDK_2BUTTON_PRESS)
1484 const char *
key = gtk_widget_get_name(widget);
1495 GtkWidget *labelev = gtk_event_box_new();
1496 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
1497 gtk_container_add(GTK_CONTAINER(labelev), w_label);
1500 GtkListStore *
store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
1506 for(GList *val = vals; val; val = g_list_next(val))
1508 char *item = (
char *)val->data;
1510 if(item[0] ==
'[') item++;
1511 else if(item[strlen(item) - 1] ==
']') item[strlen(item) - 1] =
'\0';
1512 gtk_list_store_append(
store, &iter);
1513 gtk_list_store_set(
store, &iter, 0, item, 1, g_dpgettext2(NULL,
"preferences", item), -1);
1514 if(pos == -1 && !g_strcmp0(str, item))
1524 GtkWidget *w = gtk_combo_box_new_with_model(GTK_TREE_MODEL(
store));
1525 gtk_widget_set_hexpand(w,
FALSE);
1526 g_object_unref(
store);
1527 GtkCellRenderer *renderer = gtk_cell_renderer_text_new();
1528 gtk_cell_renderer_set_padding(renderer, 0, 0);
1529 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(w), renderer,
TRUE);
1530 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(w), renderer,
"text", 1, NULL);
1531 gtk_combo_box_set_active(GTK_COMBO_BOX(w), pos);
1533 gtk_grid_attach(GTK_GRID(grid), labelev, col, line, 1, 1);
1534 gtk_grid_attach(GTK_GRID(grid), w, col + 1, line, 1, 1);
1543 const char *str = gtk_entry_get_text(GTK_ENTRY(widget));
1549 const char *
key = gtk_widget_get_name(widget);
1551 gtk_entry_set_text(GTK_ENTRY(widget), str);
1557 if(event->type == GDK_2BUTTON_PRESS)
1567 const char *
key = gtk_widget_get_name(widget);
1569 gtk_entry_set_text(GTK_ENTRY(widget), str);
1577 GtkWidget *labelev = gtk_event_box_new();
1578 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
1579 gtk_container_add(GTK_CONTAINER(labelev), w_label);
1584 gtk_entry_set_text(GTK_ENTRY(w), str);
1585 gtk_widget_set_hexpand(w,
TRUE);
1587 gtk_grid_attach(GTK_GRID(grid), labelev, col, line, 1, 1);
1588 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_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_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)