#include "layout_util.h"
#include "pixbuf_util.h"
#include "slideshow.h"
+#include "toolbar.h"
#include "trash.h"
#include "utilops.h"
#include "ui_fileops.h"
#include <math.h>
+#ifdef HAVE_LCMS
+#ifdef HAVE_LCMS2
+#include <lcms2.h>
+#else
+#include <lcms.h>
+#endif
+#endif
#define EDITOR_NAME_MAX_LENGTH 32
#define EDITOR_COMMAND_MAX_LENGTH 1024
N_("Unknown"),
N_("Image"),
N_("RAW Image"),
- N_("Metadata")
+ N_("Metadata"),
+ N_("Video")
};
/* config memory values */
*-----------------------------------------------------------------------------
*/
-static void zoom_mode_cb(GtkWidget *widget, gpointer data)
+static void zoom_increment_cb(GtkWidget *spin, gpointer data)
{
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))
- c_options->image.zoom_mode = GPOINTER_TO_INT(data);
+ c_options->image.zoom_increment = (gint)(gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin)) * 100.0 + 0.01);
}
-static void scroll_reset_cb(GtkWidget *widget, gpointer data)
+static void slideshow_delay_hours_cb(GtkWidget *spin, gpointer data)
{
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))
- c_options->image.scroll_reset_method = GPOINTER_TO_INT(data);
+ gint mins_secs_tenths, delay;
+
+ mins_secs_tenths = c_options->slideshow.delay %
+ (3600 * SLIDESHOW_SUBSECOND_PRECISION);
+
+ delay = (gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin)) *
+ (3600 * SLIDESHOW_SUBSECOND_PRECISION) +
+ mins_secs_tenths);
+
+ c_options->slideshow.delay = delay > 0 ? delay : SLIDESHOW_MIN_SECONDS *
+ SLIDESHOW_SUBSECOND_PRECISION;
}
-static void zoom_increment_cb(GtkWidget *spin, gpointer data)
+static void slideshow_delay_minutes_cb(GtkWidget *spin, gpointer data)
{
- c_options->image.zoom_increment = (gint)(gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin)) * 100.0 + 0.01);
+ gint hours, secs_tenths, delay;
+
+ hours = c_options->slideshow.delay / (3600 * SLIDESHOW_SUBSECOND_PRECISION);
+ secs_tenths = c_options->slideshow.delay % (60 * SLIDESHOW_SUBSECOND_PRECISION);
+
+ delay = hours * (3600 * SLIDESHOW_SUBSECOND_PRECISION) +
+ (gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin)) *
+ (60 * SLIDESHOW_SUBSECOND_PRECISION) + secs_tenths);
+
+ c_options->slideshow.delay = delay > 0 ? delay : SLIDESHOW_MIN_SECONDS *
+ SLIDESHOW_SUBSECOND_PRECISION;
}
-static void slideshow_delay_cb(GtkWidget *spin, gpointer data)
+static void slideshow_delay_seconds_cb(GtkWidget *spin, gpointer data)
{
- c_options->slideshow.delay = (gint)(gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin)) *
- (gdouble)SLIDESHOW_SUBSECOND_PRECISION + 0.01);
+ gint hours_mins, delay;
+
+ hours_mins = c_options->slideshow.delay / (60 * SLIDESHOW_SUBSECOND_PRECISION);
+
+ delay = (hours_mins * (60 * SLIDESHOW_SUBSECOND_PRECISION)) +
+ (gint)(gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin)) *
+ (gdouble)(SLIDESHOW_SUBSECOND_PRECISION) + 0.01);
+
+ c_options->slideshow.delay = delay > 0 ? delay : SLIDESHOW_MIN_SECONDS *
+ SLIDESHOW_SUBSECOND_PRECISION;
}
/*
if (options->file_filter.show_parent_directory != c_options->file_filter.show_parent_directory) refresh = TRUE;
if (options->file_filter.show_dot_directory != c_options->file_filter.show_dot_directory) refresh = TRUE;
if (options->file_sort.case_sensitive != c_options->file_sort.case_sensitive) refresh = TRUE;
+ if (options->file_sort.natural != c_options->file_sort.natural) refresh = TRUE;
if (options->file_filter.disable_file_extension_checks != c_options->file_filter.disable_file_extension_checks) refresh = TRUE;
if (options->file_filter.disable != c_options->file_filter.disable) refresh = TRUE;
options->tools_restore_state = c_options->tools_restore_state;
options->save_window_positions = c_options->save_window_positions;
options->use_saved_window_positions_for_new_windows = c_options->use_saved_window_positions_for_new_windows;
- options->image.zoom_mode = c_options->image.zoom_mode;
options->image.scroll_reset_method = c_options->image.scroll_reset_method;
options->image.zoom_2pass = c_options->image.zoom_2pass;
options->image.fit_window_to_image = c_options->image.fit_window_to_image;
options->image.max_window_size = c_options->image.max_window_size;
options->image.limit_autofit_size = c_options->image.limit_autofit_size;
options->image.max_autofit_size = c_options->image.max_autofit_size;
+ options->image.max_enlargement_size = c_options->image.max_enlargement_size;
options->image.use_clutter_renderer = c_options->image.use_clutter_renderer;
options->progressive_key_scrolling = c_options->progressive_key_scrolling;
options->keyboard_scroll_step = c_options->keyboard_scroll_step;
options->file_filter.disable_file_extension_checks = c_options->file_filter.disable_file_extension_checks;
options->file_sort.case_sensitive = c_options->file_sort.case_sensitive;
+ options->file_sort.natural = c_options->file_sort.natural;
options->file_filter.disable = c_options->file_filter.disable;
config_entry_to_option(sidecar_ext_entry, &options->sidecar.ext, NULL);
options->mousewheel_scrolls = c_options->mousewheel_scrolls;
options->image_lm_click_nav = c_options->image_lm_click_nav;
+ options->image_l_click_video = c_options->image_l_click_video;
+ options->image_l_click_video_editor = c_options->image_l_click_video_editor;
options->file_ops.enable_in_place_rename = c_options->file_ops.enable_in_place_rename;
- options->collections.rectangular_selection = c_options->collections.rectangular_selection;
-
options->image.tile_cache_max = c_options->image.tile_cache_max;
options->image.image_cache_max = c_options->image.image_cache_max;
view_window_colors_update();
}
+ options->image.alpha_color_1 = c_options->image.alpha_color_1;
+ options->image.alpha_color_2 = c_options->image.alpha_color_2;
+
options->fullscreen.screen = c_options->fullscreen.screen;
options->fullscreen.clean_flip = c_options->fullscreen.clean_flip;
options->fullscreen.disable_saver = c_options->fullscreen.disable_saver;
options->image_overlay.background_blue = c_options->image_overlay.background_blue;
options->image_overlay.background_alpha = c_options->image_overlay.background_alpha;
options->update_on_time_change = c_options->update_on_time_change;
- options->image.exif_rotate_enable = c_options->image.exif_rotate_enable;
options->image.exif_proof_rotate_enable = c_options->image.exif_proof_rotate_enable;
options->duplicates_similarity_threshold = c_options->duplicates_similarity_threshold;
options->open_recent_list_maxsize = c_options->open_recent_list_maxsize;
options->dnd_icon_size = c_options->dnd_icon_size;
+ options->clipboard_selection = c_options->clipboard_selection;
options->metadata.save_in_image_file = c_options->metadata.save_in_image_file;
options->metadata.save_legacy_IPTC = c_options->metadata.save_legacy_IPTC;
options->metadata.save_legacy_format = c_options->metadata.save_legacy_format;
options->metadata.sync_grouped_files = c_options->metadata.sync_grouped_files;
options->metadata.confirm_write = c_options->metadata.confirm_write;
+ options->metadata.sidecar_extended_name = c_options->metadata.sidecar_extended_name;
options->metadata.confirm_timeout = c_options->metadata.confirm_timeout;
options->metadata.confirm_after_timeout = c_options->metadata.confirm_after_timeout;
options->metadata.confirm_on_image_change = c_options->metadata.confirm_on_image_change;
options->stereo.fixed_x2 = c_options->stereo.fixed_x2;
options->stereo.fixed_y2 = c_options->stereo.fixed_y2;
+ options->info_keywords.height = c_options->info_keywords.height;
+ options->info_title.height = c_options->info_title.height;
+ options->info_comment.height = c_options->info_comment.height;
+ options->info_rating.height = c_options->info_rating.height;
+
#ifdef DEBUG
set_debug_level(debug_c);
#endif
}
config_entry_to_option(color_profile_screen_file_entry, &options->color_profile.screen_file, NULL);
options->color_profile.use_x11_screen_profile = c_options->color_profile.use_x11_screen_profile;
+ if (options->color_profile.render_intent != c_options->color_profile.render_intent)
+ {
+ options->color_profile.render_intent = c_options->color_profile.render_intent;
+ color_man_update();
+ }
#endif
image_options_sync();
}
if (accel_store) gtk_tree_model_foreach(GTK_TREE_MODEL(accel_store), accel_apply_cb, NULL);
+
+ toolbar_apply();
}
/*
filter_store = NULL;
}
+static void config_window_help_cb(GtkWidget *widget, gpointer data)
+{
+ GtkWidget *notebook = data;
+ gint i;
+
+ static gchar *html_section[] =
+ {
+ "GuideOptionsGeneral.html",
+ "GuideOptionsImage.html",
+ "GuideOptionsWindow.html",
+ "GuideOptionsKeyboard.html",
+ "GuideOptionsFiltering.html",
+ "GuideOptionsMetadata.html",
+ "GuideOptionsColor.html",
+ "GuideOptionsStereo.html",
+ "GuideOptionsBehavior.html",
+ "GuideOptionsToolbar.html"
+ };
+
+ i = gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook));
+ help_window_show(html_section[i]);
+}
+
static gboolean config_window_delete(GtkWidget *widget, GdkEventAny *event, gpointer data)
{
config_window_close_cb(NULL, NULL);
static void config_window_apply_cb(GtkWidget *widget, gpointer data)
{
+ LayoutWindow *lw;
+ lw = layout_window_list->data;
+
config_window_apply();
+ layout_util_sync(lw);
}
static void config_window_save_cb(GtkWidget *widget, gpointer data)
}
}
+static void clipboard_selection_menu_cb(GtkWidget *combo, gpointer data)
+{
+ gint *option = data;
+
+ switch (gtk_combo_box_get_active(GTK_COMBO_BOX(combo)))
+ {
+ case 0:
+ default:
+ *option = PRIMARY;
+ break;
+ case 1:
+ *option = CLIPBOARD;
+ break;
+ }
+}
+
static void add_quality_menu(GtkWidget *table, gint column, gint row, const gchar *text,
guint option, guint *option_c)
{
gtk_widget_show(combo);
}
+static void add_clipboard_selection_menu(GtkWidget *table, gint column, gint row, const gchar *text,
+ guint option, guint *option_c)
+{
+ GtkWidget *combo;
+ gint current = 0;
+
+ *option_c = option;
+
+ pref_table_label(table, column, row, text, 0.0);
+
+ combo = gtk_combo_box_text_new();
+
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), _("PRIMARY"));
+ if (option == PRIMARY) current = 0;
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), _("CLIPBOARD"));
+ if (option == CLIPBOARD) current = 1;
+
+ gtk_combo_box_set_active(GTK_COMBO_BOX(combo), current);
+
+ g_signal_connect(G_OBJECT(combo), "changed",
+ G_CALLBACK(clipboard_selection_menu_cb), option_c);
+
+ gtk_table_attach(GTK_TABLE(table), combo, column + 1, column + 2, row, row + 1,
+ GTK_EXPAND | GTK_FILL, 0, 0, 0);
+ gtk_widget_show(combo);
+}
+
static void thumb_size_menu_cb(GtkWidget *combo, gpointer data)
{
gint n;
gtk_widget_show(combo);
}
+static void video_menu_cb(GtkWidget *combo, gpointer data)
+{
+ gchar **option = data;
+
+ EditorDescription *ed = g_list_nth_data(editor_list_get(), gtk_combo_box_get_active(GTK_COMBO_BOX(combo)));
+ *option = ed->key;
+}
+
+static void video_menu_populate(gpointer data, gpointer user_data)
+{
+ GtkWidget *combo = user_data;
+ EditorDescription *ed = data;
+
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), ed->name);
+}
+
+static void add_video_menu(GtkWidget *table, gint column, gint row, const gchar *text,
+ gchar *option, gchar **option_c)
+{
+ GtkWidget *combo;
+ gint current;
+/* use lists since they are sorted */
+ GList *eds = editor_list_get();
+
+ *option_c = option;
+
+ pref_table_label(table, column, row, text, 0.0);
+
+ combo = gtk_combo_box_text_new();
+ g_list_foreach(eds,video_menu_populate,(gpointer)combo);
+ current = option ? g_list_index(eds,g_hash_table_lookup(editors,option)): -1;
+
+ gtk_combo_box_set_active(GTK_COMBO_BOX(combo), current);
+
+ g_signal_connect(G_OBJECT(combo), "changed",
+ G_CALLBACK(video_menu_cb), option_c);
+
+ gtk_table_attach(GTK_TABLE(table), combo, column + 1, column + 2, row, row + 1,
+ GTK_EXPAND | GTK_FILL, 0, 0, 0);
+ gtk_widget_show(combo);
+}
+
static void filter_store_populate(void)
{
GList *work;
"reset_filter", widget, TRUE,
dummy_cancel_cb, data);
generic_dialog_add_message(gd, GTK_STOCK_DIALOG_QUESTION, _("Reset filters"),
- _("This will reset the file filters to the defaults.\nContinue?"));
+ _("This will reset the file filters to the defaults.\nContinue?"), TRUE);
generic_dialog_add_button(gd, GTK_STOCK_OK, NULL, filter_default_ok_cb, TRUE);
gtk_widget_show(gd->dialog);
}
"clear_trash", widget, TRUE,
dummy_cancel_cb, NULL);
generic_dialog_add_message(gd, GTK_STOCK_DIALOG_QUESTION, _("Clear trash"),
- _("This will remove the trash contents."));
+ _("This will remove the trash contents."), FALSE);
generic_dialog_add_button(gd, GTK_STOCK_OK, NULL, safe_delete_clear_ok_cb, TRUE);
entry = gtk_entry_new();
gtk_widget_set_can_focus(entry, FALSE);
"reset_image_overlay_template_string", widget, TRUE,
dummy_cancel_cb, data);
generic_dialog_add_message(gd, GTK_STOCK_DIALOG_QUESTION, _("Reset image overlay template string"),
- _("This will reset the image overlay template string to the default.\nContinue?"));
+ _("This will reset the image overlay template string to the default.\nContinue?"), TRUE);
generic_dialog_add_button(gd, GTK_STOCK_OK, NULL, image_overlay_default_template_ok_cb, TRUE);
gtk_widget_show(gd->dialog);
}
static void image_overlay_help_cb(GtkWidget *widget, gpointer data)
{
- help_window_show("overlay");
+ help_window_show("GuideOptionsWindow.html#OverlayScreenDisplay");
}
static void image_overlay_set_font_cb(GtkWidget *widget, gpointer data)
return vbox;
}
+static void cache_standard_cb(GtkWidget *widget, gpointer data)
+{
+ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))
+ {
+ c_options->thumbnails.spec_standard =TRUE;
+ c_options->thumbnails.cache_into_dirs = FALSE;
+ }
+ else
+ {
+ c_options->thumbnails.spec_standard =FALSE;
+ }
+}
+
+static void cache_geeqie_cb(GtkWidget *widget, gpointer data)
+{
+ if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))
+ {
+ c_options->thumbnails.spec_standard =TRUE;
+ c_options->thumbnails.cache_into_dirs = FALSE;
+ }
+ else
+ {
+ c_options->thumbnails.spec_standard =FALSE;
+ }
+}
+
+static void cache_local_cb(GtkWidget *widget, gpointer data)
+{
+ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))
+ {
+ c_options->thumbnails.cache_into_dirs = TRUE;
+ c_options->thumbnails.spec_standard =FALSE;
+ }
+ else
+ {
+ c_options->thumbnails.cache_into_dirs = FALSE;
+ }
+}
+
/* general options tab */
static void config_tab_general(GtkWidget *notebook)
{
GtkWidget *vbox;
+ GtkWidget *hbox;
GtkWidget *group;
+ GtkWidget *group_frame;
GtkWidget *subgroup;
GtkWidget *button;
GtkWidget *ct_button;
GtkWidget *table;
GtkWidget *spin;
+ gint hours, minutes, remainder;
+ gdouble seconds;
vbox = scrolled_notebook_page(notebook, _("General"));
subgroup = pref_box_new(group, FALSE, GTK_ORIENTATION_VERTICAL, PREF_PAD_GAP);
pref_checkbox_link_sensitivity(ct_button, subgroup);
- button = pref_checkbox_new_int(subgroup, _("Use standard thumbnail cache, shared with other applications"),
- options->thumbnails.spec_standard, &c_options->thumbnails.spec_standard);
-
- subgroup = pref_box_new(subgroup, FALSE, GTK_ORIENTATION_VERTICAL, PREF_PAD_GAP);
- pref_checkbox_link_sensitivity_swap(button, subgroup);
-
- pref_checkbox_new_int(subgroup, _("Store thumbnails in '.thumbnails' folder, local to image folder (non-standard)"),
- options->thumbnails.cache_into_dirs, &c_options->thumbnails.cache_into_dirs);
+ group_frame = pref_frame_new(subgroup, TRUE, _("Use Geeqie thumbnail style and cache"),
+ GTK_ORIENTATION_VERTICAL, PREF_PAD_GAP);
+ button = pref_radiobutton_new(group_frame, NULL, get_thumbnails_cache_dir(),
+ !options->thumbnails.spec_standard,
+ G_CALLBACK(cache_geeqie_cb), NULL);
+
+ group_frame = pref_frame_new(subgroup, TRUE,
+ _("Store thumbnails local to image folder (non-standard)"),
+ GTK_ORIENTATION_VERTICAL, PREF_PAD_GAP);
+ pref_radiobutton_new(group_frame, button, "*/.thumbnails",
+ options->thumbnails.cache_into_dirs,
+ G_CALLBACK(cache_local_cb), NULL);
+
+ group_frame = pref_frame_new(subgroup, TRUE,
+ _("Use standard thumbnail style and cache, shared with other applications"),
+ GTK_ORIENTATION_VERTICAL, PREF_PAD_GAP);
+ pref_radiobutton_new(group_frame, button, get_thumbnails_standard_cache_dir(),
+ options->thumbnails.spec_standard,
+ G_CALLBACK(cache_standard_cb), NULL);
pref_checkbox_new_int(group, _("Use EXIF thumbnails when available (EXIF thumbnails may be outdated)"),
options->thumbnails.use_exif, &c_options->thumbnails.use_exif);
group = pref_group_new(vbox, FALSE, _("Slide show"), GTK_ORIENTATION_VERTICAL);
c_options->slideshow.delay = options->slideshow.delay;
- spin = pref_spin_new(group, _("Delay between image change:"), _("seconds"),
- SLIDESHOW_MIN_SECONDS, SLIDESHOW_MAX_SECONDS, 1.0, 1,
- options->slideshow.delay ? (gdouble)options->slideshow.delay / SLIDESHOW_SUBSECOND_PRECISION : 10.0,
- G_CALLBACK(slideshow_delay_cb), NULL);
+ hours = options->slideshow.delay / (3600 * SLIDESHOW_SUBSECOND_PRECISION);
+ remainder = options->slideshow.delay % (3600 * SLIDESHOW_SUBSECOND_PRECISION);
+ minutes = remainder / (60 * SLIDESHOW_SUBSECOND_PRECISION);
+ seconds = (gdouble)(remainder % (60 * SLIDESHOW_SUBSECOND_PRECISION)) /
+ SLIDESHOW_SUBSECOND_PRECISION;
+
+ hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
+
+ spin = pref_spin_new(hbox, _("Delay between image change hrs:mins:secs.dec"), NULL,
+ 0, 23, 1.0, 0,
+ options->slideshow.delay ? hours : 0.0,
+ G_CALLBACK(slideshow_delay_hours_cb), NULL);
+ gtk_spin_button_set_update_policy(GTK_SPIN_BUTTON(spin), GTK_UPDATE_ALWAYS);
+ spin = pref_spin_new(hbox, ":" , NULL,
+ 0, 59, 1.0, 0,
+ options->slideshow.delay ? minutes: 0.0,
+ G_CALLBACK(slideshow_delay_minutes_cb), NULL);
+ gtk_spin_button_set_update_policy(GTK_SPIN_BUTTON(spin), GTK_UPDATE_ALWAYS);
+ spin = pref_spin_new(hbox, ":", NULL,
+ SLIDESHOW_MIN_SECONDS, 59, 1.0, 1,
+ options->slideshow.delay ? seconds : 10.0,
+ G_CALLBACK(slideshow_delay_seconds_cb), NULL);
gtk_spin_button_set_update_policy(GTK_SPIN_BUTTON(spin), GTK_UPDATE_ALWAYS);
pref_checkbox_new_int(group, _("Random"), options->slideshow.random, &c_options->slideshow.random);
group = pref_group_new(vbox, FALSE, _("Image loading and caching"), GTK_ORIENTATION_VERTICAL);
pref_spin_new_int(group, _("Decoded image cache size (Mb):"), NULL,
- 0, 1024, 1, options->image.image_cache_max, &c_options->image.image_cache_max);
+ 0, 99999, 1, options->image.image_cache_max, &c_options->image.image_cache_max);
pref_checkbox_new_int(group, _("Preload next image"),
options->image.enable_read_ahead, &c_options->image.enable_read_ahead);
pref_checkbox_new_int(group, _("Refresh on file change"),
options->update_on_time_change, &c_options->update_on_time_change);
+
+ group = pref_group_new(vbox, FALSE, _("Info sidebar heights"), GTK_ORIENTATION_VERTICAL);
+ pref_label_new(group, _("NOTE! Geeqie must be restarted for changes to take effect"));
+ hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
+ pref_spin_new_int(hbox, _("Keywords:"), NULL,
+ 1, 9999, 1,
+ options->info_keywords.height, &c_options->info_keywords.height);
+ pref_spin_new_int(hbox, _("Title:"), NULL,
+ 1, 9999, 1,
+ options->info_title.height, &c_options->info_title.height);
+ pref_spin_new_int(hbox, _("Comment:"), NULL,
+ 1, 9999, 1,
+ options->info_comment.height, &c_options->info_comment.height);
+ pref_spin_new_int(hbox, _("Rating:"), NULL,
+ 1, 9999, 1,
+ options->info_rating.height, &c_options->info_rating.height);
}
/* image tab */
{
GtkWidget *hbox;
GtkWidget *vbox;
- GtkWidget *vbox2;
GtkWidget *group;
- GtkWidget *button;
GtkWidget *ct_button;
+ GtkWidget *enlargement_button;
GtkWidget *table;
GtkWidget *spin;
pref_checkbox_new_int(group, _("Two pass rendering (apply HQ zoom and color correction in second pass)"),
options->image.zoom_2pass, &c_options->image.zoom_2pass);
- pref_checkbox_new_int(group, _("Allow enlargement of image for zoom to fit"),
+ hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
+ enlargement_button = pref_checkbox_new_int(hbox, _("Allow enlargement of image for zoom to fit (max. size in %)"),
options->image.zoom_to_fit_allow_expand, &c_options->image.zoom_to_fit_allow_expand);
+ spin = pref_spin_new_int(hbox, NULL, NULL,
+ 100, 999, 1,
+ options->image.max_enlargement_size, &c_options->image.max_enlargement_size);
+ pref_checkbox_link_sensitivity(enlargement_button, spin);
hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
- ct_button = pref_checkbox_new_int(hbox, _("Limit image size when autofitting (%):"),
+ ct_button = pref_checkbox_new_int(hbox, _("Limit image size when autofitting (% of window):"),
options->image.limit_autofit_size, &c_options->image.limit_autofit_size);
spin = pref_spin_new_int(hbox, NULL, NULL,
10, 150, 1,
G_CALLBACK(zoom_increment_cb), NULL);
gtk_spin_button_set_update_policy(GTK_SPIN_BUTTON(spin), GTK_UPDATE_ALWAYS);
- group = pref_group_new(vbox, FALSE, _("When new image is selected:"), GTK_ORIENTATION_HORIZONTAL);
-
- vbox2 = pref_box_new(group, TRUE, GTK_ORIENTATION_VERTICAL, PREF_PAD_SPACE);
- c_options->image.zoom_mode = options->image.zoom_mode;
- button = pref_radiobutton_new(vbox2, NULL, _("Zoom to original size"),
- (options->image.zoom_mode == ZOOM_RESET_ORIGINAL),
- G_CALLBACK(zoom_mode_cb), GINT_TO_POINTER(ZOOM_RESET_ORIGINAL));
- button = pref_radiobutton_new(vbox2, button, _("Fit image to window"),
- (options->image.zoom_mode == ZOOM_RESET_FIT_WINDOW),
- G_CALLBACK(zoom_mode_cb), GINT_TO_POINTER(ZOOM_RESET_FIT_WINDOW));
- button = pref_radiobutton_new(vbox2, button, _("Leave Zoom at previous setting"),
- (options->image.zoom_mode == ZOOM_RESET_NONE),
- G_CALLBACK(zoom_mode_cb), GINT_TO_POINTER(ZOOM_RESET_NONE));
-
- vbox2 = pref_box_new(group, TRUE, GTK_ORIENTATION_VERTICAL, PREF_PAD_SPACE);
- c_options->image.scroll_reset_method = options->image.scroll_reset_method;
- button = pref_radiobutton_new(vbox2, NULL, _("Scroll to top left corner"),
- (options->image.scroll_reset_method == SCROLL_RESET_TOPLEFT),
- G_CALLBACK(scroll_reset_cb), GINT_TO_POINTER(SCROLL_RESET_TOPLEFT));
- button = pref_radiobutton_new(vbox2, button, _("Scroll to image center"),
- (options->image.scroll_reset_method == SCROLL_RESET_CENTER),
- G_CALLBACK(scroll_reset_cb), GINT_TO_POINTER(SCROLL_RESET_CENTER));
- button = pref_radiobutton_new(vbox2, button, _("Keep the region from previous image"),
- (options->image.scroll_reset_method == SCROLL_RESET_NOCHANGE),
- G_CALLBACK(scroll_reset_cb), GINT_TO_POINTER(SCROLL_RESET_NOCHANGE));
-
-
group = pref_group_new(vbox, FALSE, _("Appearance"), GTK_ORIENTATION_VERTICAL);
pref_checkbox_new_int(group, _("Use custom border color in window mode"),
pref_color_button_new(group, _("Border color"), &options->image.border_color,
G_CALLBACK(pref_color_button_set_cb), &c_options->image.border_color);
- group = pref_group_new(vbox, FALSE, _("Convenience"), GTK_ORIENTATION_VERTICAL);
+ c_options->image.border_color = options->image.border_color;
+
+ pref_color_button_new(group, _("Alpha channel color 1"), &options->image.alpha_color_1,
+ G_CALLBACK(pref_color_button_set_cb), &c_options->image.alpha_color_1);
- pref_checkbox_new_int(group, _("Auto rotate image using Exif information"),
- options->image.exif_rotate_enable, &c_options->image.exif_rotate_enable);
+ pref_color_button_new(group, _("Alpha channel color 2"), &options->image.alpha_color_2,
+ G_CALLBACK(pref_color_button_set_cb), &c_options->image.alpha_color_2);
+
+ c_options->image.alpha_color_1 = options->image.alpha_color_1;
+ c_options->image.alpha_color_2 = options->image.alpha_color_2;
+
+ group = pref_group_new(vbox, FALSE, _("Convenience"), GTK_ORIENTATION_VERTICAL);
pref_checkbox_new_int(group, _("Auto rotate proofs using Exif information"),
options->image.exif_proof_rotate_enable, &c_options->image.exif_proof_rotate_enable);
options->file_filter.show_parent_directory, &c_options->file_filter.show_parent_directory);
pref_checkbox_new_int(group, _("Case sensitive sort"),
options->file_sort.case_sensitive, &c_options->file_sort.case_sensitive);
+ pref_checkbox_new_int(group, _("Natural sort order"),
+ options->file_sort.natural, &c_options->file_sort.natural);
pref_checkbox_new_int(group, _("Disable file extension checks"),
options->file_filter.disable_file_extension_checks, &c_options->file_filter.disable_file_extension_checks);
label = pref_label_new(group, _("Metadata are written in the following order. The process ends after first success."));
gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
- ct_button = pref_checkbox_new_int(group, _("1) Save metadata in image files, resp. sidecar files, according to the XMP standard"),
+ ct_button = pref_checkbox_new_int(group, _("1) Save metadata in image files, or sidecar files, according to the XMP standard"),
options->metadata.save_in_image_file, &c_options->metadata.save_in_image_file);
#ifndef HAVE_EXIV2
gtk_widget_set_sensitive(ct_button, FALSE);
pref_checkbox_new_int(hbox, _("Ask before writing to image files"),
options->metadata.confirm_write, &c_options->metadata.confirm_write);
+ pref_checkbox_new_int(hbox, _("Create sidecar files named image.ext.xmp (as opposed to image.xmp)"),
+ options->metadata.sidecar_extended_name, &c_options->metadata.sidecar_extended_name);
+
group = pref_group_new(vbox, FALSE, _("Step 2 and 3: write to Geeqie private files"), GTK_ORIENTATION_VERTICAL);
#ifndef HAVE_EXIV2
gtk_widget_set_sensitive(group, FALSE);
}
/* metadata tab */
+#ifdef HAVE_LCMS
+static void intent_menu_cb(GtkWidget *combo, gpointer data)
+{
+ gint *option = data;
+
+ switch (gtk_combo_box_get_active(GTK_COMBO_BOX(combo)))
+ {
+ case 0:
+ default:
+ *option = INTENT_PERCEPTUAL;
+ break;
+ case 1:
+ *option = INTENT_RELATIVE_COLORIMETRIC;
+ break;
+ case 2:
+ *option = INTENT_SATURATION;
+ break;
+ case 3:
+ *option = INTENT_ABSOLUTE_COLORIMETRIC;
+ break;
+ }
+}
+
+static void add_intent_menu(GtkWidget *table, gint column, gint row, const gchar *text,
+ gint option, gint *option_c)
+{
+ GtkWidget *combo;
+ gint current = 0;
+
+ *option_c = option;
+
+ pref_table_label(table, column, row, text, 0.0);
+
+ combo = gtk_combo_box_text_new();
+
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), _("Perceptual"));
+ if (option == INTENT_PERCEPTUAL) current = 0;
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), _("Relative Colorimetric"));
+ if (option == INTENT_RELATIVE_COLORIMETRIC) current = 1;
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), _("Saturation"));
+ if (option == INTENT_SATURATION) current = 2;
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), _("Absolute Colorimetric"));
+ if (option == INTENT_ABSOLUTE_COLORIMETRIC) current = 3;
+
+ gtk_combo_box_set_active(GTK_COMBO_BOX(combo), current);
+
+ gtk_widget_set_tooltip_text(combo,"Refer to the lcms documentation for the defaults used when the selected Intent is not available");
+
+ g_signal_connect(G_OBJECT(combo), "changed",
+ G_CALLBACK(intent_menu_cb), option_c);
+
+ gtk_table_attach(GTK_TABLE(table), combo, column + 1, column + 2, row, row + 1,
+ GTK_EXPAND | GTK_FILL, 0, 0, 0);
+ gtk_widget_show(combo);
+}
+#endif
+
static void config_tab_color(GtkWidget *notebook)
{
GtkWidget *label;
options->color_profile.screen_file, NULL, NULL);
tab_completion_add_select_button(color_profile_screen_file_entry, _("Select color profile"), FALSE);
gtk_widget_set_size_request(color_profile_screen_file_entry, 160, -1);
+#ifdef HAVE_LCMS
+ add_intent_menu(table, 0, 1, _("Render Intent:"), options->color_profile.render_intent, &c_options->color_profile.render_intent);
+#endif
gtk_table_attach(GTK_TABLE(table), tabcomp, 1, 2,
0, 1,
GTK_FILL | GTK_EXPAND, 0, 0, 0);
+
gtk_widget_show(tabcomp);
}
GtkWidget *tabcomp;
GtkWidget *ct_button;
GtkWidget *spin;
+ GtkWidget *table;
vbox = scrolled_notebook_page(notebook, _("Behavior"));
group = pref_group_new(vbox, FALSE, _("Behavior"), GTK_ORIENTATION_VERTICAL);
- pref_checkbox_new_int(group, _("Rectangular selection in icon view"),
- options->collections.rectangular_selection, &c_options->collections.rectangular_selection);
-
pref_checkbox_new_int(group, _("Descend folders in tree view"),
options->tree_descend_subdirs, &c_options->tree_descend_subdirs);
pref_checkbox_new_int(group, _("List directory view uses single click to enter"),
options->view_dir_list_single_click_enter, &c_options->view_dir_list_single_click_enter);
- pref_spin_new_int(group, _("Open recent list maximum size"), NULL,
+ pref_spin_new_int(group, _("Recent folder list maximum size"), NULL,
1, 50, 1, options->open_recent_list_maxsize, &c_options->open_recent_list_maxsize);
pref_spin_new_int(group, _("Drag'n drop icon size"), NULL,
16, 256, 16, options->dnd_icon_size, &c_options->dnd_icon_size);
+ table = pref_table_new(group, 2, 1, FALSE, FALSE);
+ add_clipboard_selection_menu(table, 0, 0, _("Copy path clipboard selection:"), options->clipboard_selection, &c_options->clipboard_selection);
+
group = pref_group_new(vbox, FALSE, _("Navigation"), GTK_ORIENTATION_VERTICAL);
pref_checkbox_new_int(group, _("Progressive keyboard scrolling"),
options->mousewheel_scrolls, &c_options->mousewheel_scrolls);
pref_checkbox_new_int(group, _("Navigation by left or middle click on image"),
options->image_lm_click_nav, &c_options->image_lm_click_nav);
+ pref_checkbox_new_int(group, _("Play video by left click on image"),
+ options->image_l_click_video, &c_options->image_l_click_video);
+ table = pref_table_new(group, 2, 1, FALSE, FALSE);
+ add_video_menu(table, 0, 0, _("Play with:"), options->image_l_click_video_editor, &c_options->image_l_click_video_editor);
- group = pref_group_new(vbox, FALSE, _("Similarities"), GTK_ORIENTATION_VERTICAL);
-
- pref_spin_new_int(group, _("Custom similarity threshold:"), NULL,
- 0, 100, 1, options->duplicates_similarity_threshold, (int *)&c_options->duplicates_similarity_threshold);
- pref_checkbox_new_int(group, _("Rotation invariant duplicate check"),
- options->rot_invariant_sim, &c_options->rot_invariant_sim);
#ifdef DEBUG
group = pref_group_new(vbox, FALSE, _("Debugging"), GTK_ORIENTATION_VERTICAL);
pref_spin_new_int(group, _("Debug level:"), NULL,
DEBUG_LEVEL_MIN, DEBUG_LEVEL_MAX, 1, get_debug_level(), &debug_c);
+
+ pref_checkbox_new_int(group, _("Timer data"),
+ options->log_window.timer_data, &c_options->log_window.timer_data);
+
+ pref_spin_new_int(group, _("Log Window max. lines:"), NULL,
+ 1, 99999, 1, options->log_window_lines, &options->log_window_lines);
#endif
}
gtk_widget_show(button);
}
+/* toolbar tab */
+static void config_tab_toolbar(GtkWidget *notebook)
+{
+ GtkWidget *vbox;
+ GtkWidget *toolbardata;
+ LayoutWindow *lw;
+
+ lw = layout_window_list->data;
+
+ vbox = scrolled_notebook_page(notebook, _("Toolbar"));
+
+ toolbardata = toolbar_select_new(lw);
+ gtk_box_pack_start(GTK_BOX(vbox), toolbardata, TRUE, TRUE, 0);
+ gtk_widget_show(vbox);
+}
+
/* stereo tab */
static void config_tab_stereo(GtkWidget *notebook)
{
gtk_container_add(GTK_CONTAINER(configwindow), win_vbox);
gtk_widget_show(win_vbox);
+ notebook = gtk_notebook_new();
+ gtk_notebook_set_tab_pos(GTK_NOTEBOOK(notebook), GTK_POS_TOP);
+ gtk_box_pack_start(GTK_BOX(win_vbox), notebook, TRUE, TRUE, 0);
+
+ config_tab_general(notebook);
+ config_tab_image(notebook);
+ config_tab_windows(notebook);
+ config_tab_accelerators(notebook);
+ config_tab_files(notebook);
+ config_tab_metadata(notebook);
+ config_tab_color(notebook);
+ config_tab_stereo(notebook);
+ config_tab_behavior(notebook);
+ config_tab_toolbar(notebook);
+
hbox = gtk_hbutton_box_new();
gtk_button_box_set_layout(GTK_BUTTON_BOX(hbox), GTK_BUTTONBOX_END);
gtk_box_set_spacing(GTK_BOX(hbox), PREF_PAD_BUTTON_GAP);
gtk_box_pack_end(GTK_BOX(win_vbox), hbox, FALSE, FALSE, 0);
gtk_widget_show(hbox);
+ button = pref_button_new(NULL, GTK_STOCK_HELP, NULL, FALSE,
+ G_CALLBACK(config_window_help_cb), notebook);
+ gtk_container_add(GTK_CONTAINER(hbox), button);
+ gtk_widget_set_can_default(button, TRUE);
+ gtk_widget_show(button);
+
button = pref_button_new(NULL, GTK_STOCK_OK, NULL, FALSE,
G_CALLBACK(config_window_ok_cb), NULL);
gtk_container_add(GTK_CONTAINER(hbox), button);
gtk_box_reorder_child(GTK_BOX(hbox), ct_button, -1);
}
- notebook = gtk_notebook_new();
- gtk_notebook_set_tab_pos(GTK_NOTEBOOK(notebook), GTK_POS_TOP);
- gtk_box_pack_start(GTK_BOX(win_vbox), notebook, TRUE, TRUE, 0);
-
- config_tab_general(notebook);
- config_tab_image(notebook);
- config_tab_windows(notebook);
- config_tab_accelerators(notebook);
- config_tab_files(notebook);
- config_tab_metadata(notebook);
- config_tab_color(notebook);
- config_tab_stereo(notebook);
- config_tab_behavior(notebook);
-
gtk_widget_show(notebook);
gtk_widget_show(configwindow);
*-----------------
*/
-static GtkWidget *about = NULL;
-
-static gboolean about_delete_cb(GtkWidget *widget, GdkEventAny *event, gpointer data)
-{
- gtk_widget_destroy(about);
- about = NULL;
-
- return TRUE;
-}
-
-static void about_window_close(GtkWidget *widget, gpointer data)
-{
- if (!about) return;
-
- gtk_widget_destroy(about);
- about = NULL;
-}
-
-static void about_credits_cb(GtkWidget *widget, gpointer data)
-{
- help_window_show("credits");
-}
-
-void show_about_window(void)
-{
- GtkWidget *vbox;
- GtkWidget *hbox;
- GtkWidget *label;
- GtkWidget *button;
- GdkPixbuf *pixbuf;
-
- gchar *buf;
-
- if (about)
+void show_about_window(LayoutWindow *lw)
+{
+ GdkPixbuf *pixbuf_logo;
+ GdkPixbuf *pixbuf_icon;
+ gchar *authors[1000];
+ gchar *comment;
+ gint i_authors = 0;
+ gchar *path;
+ FILE *fp = NULL;
+#define LINE_LENGTH 1000
+ gchar line[LINE_LENGTH];
+
+#if !GTK_CHECK_VERSION(3,0,0)
+ GString *copyright;
+
+ copyright = g_string_new(NULL);
+ path = g_build_filename(GQ_HELPDIR, "COPYING", NULL);
+ fp = fopen(path, "r");
+ if (fp)
{
- gtk_window_present(GTK_WINDOW(about));
- return;
+ while(fgets(line, LINE_LENGTH, fp))
+ {
+ copyright = g_string_append(copyright, line);
+ }
+ fclose(fp);
}
+ g_free(path);
+#endif
- about = window_new(GTK_WINDOW_TOPLEVEL, "about", NULL, NULL, _("About"));
- gtk_window_set_type_hint(GTK_WINDOW(about), GDK_WINDOW_TYPE_HINT_DIALOG);
- g_signal_connect(G_OBJECT(about), "delete_event",
- G_CALLBACK(about_delete_cb), NULL);
-
- gtk_container_set_border_width(GTK_CONTAINER(about), PREF_PAD_BORDER);
-
- vbox = gtk_vbox_new(FALSE, PREF_PAD_SPACE);
- gtk_container_add(GTK_CONTAINER(about), vbox);
- gtk_widget_show(vbox);
-
- pixbuf = pixbuf_inline(PIXBUF_INLINE_LOGO);
- button = gtk_image_new_from_pixbuf(pixbuf);
- g_object_unref(pixbuf);
- gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, TRUE, 0);
- gtk_widget_show(button);
-
- buf = g_strdup_printf(_("%s %s\n\nCopyright (c) 2006 John Ellis\nCopyright (c) %s The Geeqie Team\nwebsite: %s\nemail: %s\n\nReleased under the GNU General Public License"),
- GQ_APPNAME,
- VERSION,
- "2008 - 2016",
- GQ_WEBSITE,
- GQ_EMAIL_ADDRESS);
- label = gtk_label_new(buf);
- g_free(buf);
-
- gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER);
- gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0);
- gtk_widget_show(label);
-
- hbox = gtk_hbutton_box_new();
- gtk_button_box_set_layout(GTK_BUTTON_BOX(hbox), GTK_BUTTONBOX_END);
- gtk_box_set_spacing(GTK_BOX(hbox), PREF_PAD_BUTTON_GAP);
- gtk_box_pack_end(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
- gtk_widget_show(hbox);
-
- button = pref_button_new(NULL, NULL, _("Credits..."), FALSE,
- G_CALLBACK(about_credits_cb), NULL);
- gtk_container_add(GTK_CONTAINER(hbox), button);
- gtk_widget_set_can_default(button, TRUE);
- gtk_widget_show(button);
+ authors[0] = NULL;
+ path = g_build_filename(GQ_HELPDIR, "AUTHORS", NULL);
+ fp = fopen(path, "r");
+ if (fp)
+ {
+ while(fgets(line, LINE_LENGTH, fp))
+ {
+ /* get rid of ending \n from fgets */
+ line[strlen(line) - 1] = '\0';
+ authors[i_authors] = g_strdup(line);
+ i_authors++;
+ }
+ authors[i_authors] = NULL;
+ fclose(fp);
+ }
+ g_free(path);
+
+ comment = g_strconcat("Development and bug reports:\n", GQ_EMAIL_ADDRESS,
+ "\nhttps://github.com/BestImageViewer/geeqie/issues",NULL);
+
+ pixbuf_logo = pixbuf_inline(PIXBUF_INLINE_LOGO);
+ pixbuf_icon = pixbuf_inline(PIXBUF_INLINE_ICON);
+ gtk_show_about_dialog(GTK_WINDOW(lw->window),
+ "title", _("About Geeqie"),
+ "resizable", TRUE,
+ "program-name", GQ_APPNAME,
+ "version", VERSION,
+ "logo", pixbuf_logo,
+ "icon", pixbuf_icon,
+ "website", GQ_WEBSITE,
+ "website-label", "Website",
+ "comments", comment,
+ "authors", authors,
+ "translator-credits", _("translator-credits"),
+#if GTK_CHECK_VERSION(3,0,0)
+ "license-type", GTK_LICENSE_GPL_2_0,
+#else
+ "license", copyright->str,
+#endif
+ NULL);
- button = pref_button_new(NULL, GTK_STOCK_CLOSE, NULL, FALSE,
- G_CALLBACK(about_window_close), NULL);
- gtk_container_add(GTK_CONTAINER(hbox), button);
- gtk_widget_set_can_default(button, TRUE);
- gtk_widget_grab_default(button);
- gtk_widget_show(button);
+#if !GTK_CHECK_VERSION(3,0,0)
+ g_string_free(copyright, TRUE);
+#endif
+ gint n = 0;
+ while(n < i_authors)
+ {
+ g_free(authors[n]);
+ n++;
+ }
+ g_free(comment);
- gtk_widget_show(about);
+ return;
}
static void image_overlay_set_text_colours()