Include a Other Software section in Help file
[geeqie.git] / src / preferences.c
index 74d689d..d0d34a2 100644 (file)
@@ -137,6 +137,8 @@ static GtkWidget *safe_delete_path_entry;
 static GtkWidget *color_profile_input_file_entry[COLOR_PROFILE_INPUTS];
 static GtkWidget *color_profile_input_name_entry[COLOR_PROFILE_INPUTS];
 static GtkWidget *color_profile_screen_file_entry;
+static GtkWidget *external_preview_select_entry;
+static GtkWidget *external_preview_extract_entry;
 
 static GtkWidget *sidecar_ext_entry;
 static GtkWidget *help_search_engine_entry;
@@ -298,6 +300,7 @@ static void config_window_apply(void)
        options->thumbnails.enable_caching = c_options->thumbnails.enable_caching;
        options->thumbnails.cache_into_dirs = c_options->thumbnails.cache_into_dirs;
        options->thumbnails.use_exif = c_options->thumbnails.use_exif;
+       options->thumbnails.use_color_management = c_options->thumbnails.use_color_management;
        options->thumbnails.collection_preview = c_options->thumbnails.collection_preview;
        options->thumbnails.use_ft_metadata = c_options->thumbnails.use_ft_metadata;
 //     options->thumbnails.use_ft_metadata_small = c_options->thumbnails.use_ft_metadata_small;
@@ -377,6 +380,7 @@ static void config_window_apply(void)
        options->tree_descend_subdirs = c_options->tree_descend_subdirs;
 
        options->view_dir_list_single_click_enter = c_options->view_dir_list_single_click_enter;
+       options->circular_selection_lists = c_options->circular_selection_lists;
 
        options->open_recent_list_maxsize = c_options->open_recent_list_maxsize;
        options->dnd_icon_size = c_options->dnd_icon_size;
@@ -432,6 +436,10 @@ static void config_window_apply(void)
        options->hide_window_in_fullscreen = c_options->hide_window_in_fullscreen;
        config_entry_to_option(help_search_engine_entry, &options->help_search_engine, NULL);
 
+       options->external_preview.enable = c_options->external_preview.enable;
+       config_entry_to_option(external_preview_select_entry, &options->external_preview.select, NULL);
+       config_entry_to_option(external_preview_extract_entry, &options->external_preview.extract, NULL);
+
        options->read_metadata_in_idle = c_options->read_metadata_in_idle;
 
        options->star_rating.star = c_options->star_rating.star;
@@ -508,7 +516,8 @@ static void config_window_help_cb(GtkWidget *widget, gpointer data)
        "GuideOptionsStereo.html",
        "GuideOptionsBehavior.html",
        "GuideOptionsToolbar.html",
-       "GuideOptionsToolbar.html"
+       "GuideOptionsToolbar.html",
+       "GuideOptionsAdvanced.html"
        };
 
        i = gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook));
@@ -524,8 +533,28 @@ static gboolean config_window_delete(GtkWidget *widget, GdkEventAny *event, gpoi
 static void config_window_ok_cb(GtkWidget *widget, gpointer data)
 {
        LayoutWindow *lw;
+       GtkNotebook *notebook = data;
+       GdkWindow *window;
+       gint x;
+       gint y;
+       gint w;
+       gint h;
+       gint page_number;
+
        lw = layout_window_list->data;
 
+       window = gtk_widget_get_window(widget);
+       gdk_window_get_root_origin(window, &x, &y);
+       w = gdk_window_get_width(window);
+       h = gdk_window_get_height(window);
+       page_number = gtk_notebook_get_current_page(notebook);
+
+       lw->options.preferences_window.x = x;
+       lw->options.preferences_window.y = y;
+       lw->options.preferences_window.w = w;
+       lw->options.preferences_window.h = h;
+       lw->options.preferences_window.page_number = page_number;
+
        config_window_apply();
        layout_util_sync(lw);
        save_options(options);
@@ -1954,6 +1983,9 @@ static void config_tab_general(GtkWidget *notebook)
        pref_checkbox_new_int(group, _("Use EXIF thumbnails when available (EXIF thumbnails may be outdated)"),
                              options->thumbnails.use_exif, &c_options->thumbnails.use_exif);
 
+       pref_checkbox_new_int(group, _("Thumbnail color management"),
+                               options->thumbnails.use_color_management, &c_options->thumbnails.use_color_management);
+
        spin = pref_spin_new_int(group, _("Collection preview:"), NULL,
                                 1, 999, 1,
                                 options->thumbnails.collection_preview, &c_options->thumbnails.collection_preview);
@@ -1976,7 +2008,7 @@ static void config_tab_general(GtkWidget *notebook)
 
        str = g_string_new(NULL);
        hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
-       pref_label_new(hbox, "Star character: ");
+       pref_label_new(hbox, _("Star character: "));
        str = g_string_append_unichar(str, options->star_rating.star);
        pref_label_new(hbox, g_strdup(str->str));
        rating_symbol = g_strdup_printf("U+%X", options->star_rating.star);
@@ -2008,7 +2040,7 @@ static void config_tab_general(GtkWidget *notebook)
 
        str = g_string_new(NULL);
        hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
-       pref_label_new(hbox, "Rejected character: ");
+       pref_label_new(hbox, _("Rejected character: "));
        str = g_string_append_unichar(str, options->star_rating.rejected);
        pref_label_new(hbox, g_strdup(str->str));
        rating_symbol = g_strdup_printf("U+%X", options->star_rating.rejected);
@@ -3283,6 +3315,7 @@ static void config_tab_behavior(GtkWidget *notebook)
        GtkWidget *collections_on_top;
        GtkWidget *hide_window_in_fullscreen;
        GtkWidget *checkbox;
+       GtkWidget *tmp;
 
        vbox = scrolled_notebook_page(notebook, _("Behavior"));
 
@@ -3346,6 +3379,10 @@ static void config_tab_behavior(GtkWidget *notebook)
        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);
 
+       tmp = pref_checkbox_new_int(group, _("Circular selection lists"),
+                             options->circular_selection_lists, &c_options->circular_selection_lists);
+       gtk_widget_set_tooltip_text(tmp, _("Traverse selection lists in a circular manner"));
+
        marks = pref_checkbox_new_int(group, _("Save marks on exit"),
                                options->marks_save, &c_options->marks_save);
        gtk_widget_set_tooltip_text(marks,"Note that marks linked to a keyword will be saved irrespective of this setting");
@@ -3557,6 +3594,92 @@ static void config_tab_toolbar_status(GtkWidget *notebook)
        gtk_widget_show(vbox);
 }
 
+/* advanced tab */
+static gint extension_sort_cb(gconstpointer a, gconstpointer b)
+{
+       return g_strcmp0((gchar *)a, (gchar *)b);
+}
+
+static void config_tab_advanced(GtkWidget *notebook)
+{
+       GtkWidget *vbox;
+       GtkWidget *group;
+       GSList *formats_list;
+       GList *extensions_list = NULL;
+       gchar **extensions;
+       GtkWidget *tabcomp;
+       GdkPixbufFormat *fm;
+       gint i;
+       GString *types_string = g_string_new(NULL);
+
+       vbox = scrolled_notebook_page(notebook, _("Advanced"));
+       group = pref_group_new(vbox, FALSE, _("External preview extraction"), GTK_ORIENTATION_VERTICAL);
+
+       pref_checkbox_new_int(group, _("Use external preview extraction -  Requires restart"), options->external_preview.enable, &c_options->external_preview.enable);
+
+       pref_spacer(group, PREF_PAD_GROUP);
+
+       formats_list = gdk_pixbuf_get_formats();
+
+       while (formats_list)
+               {
+               fm = formats_list->data;
+               extensions = gdk_pixbuf_format_get_extensions(fm);
+
+               i = 0;
+               while (extensions[i])
+                       {
+                       extensions_list = g_list_insert_sorted(extensions_list, g_strdup(extensions[i]), extension_sort_cb);
+                       i++;
+                       }
+
+               g_strfreev(extensions);
+               formats_list = formats_list->next;
+               }
+
+       while (extensions_list)
+               {
+               if (types_string->len == 0)
+                       {
+                       types_string = g_string_append(types_string, extensions_list->data);
+                       }
+               else
+                       {
+                       types_string = g_string_append(types_string, ", ");
+                       types_string = g_string_append(types_string, extensions_list->data);
+                       }
+
+               extensions_list = extensions_list->next;
+               }
+
+       types_string = g_string_prepend(types_string, _("Usable file types:\n"));
+       pref_label_new(group, types_string->str);
+       GtkWidget *types_string_label = gtk_label_new(types_string->str);
+       gtk_label_set_line_wrap(GTK_LABEL(types_string_label), TRUE);
+
+       pref_spacer(group, PREF_PAD_GROUP);
+
+       group = pref_group_new(vbox, FALSE, _("File identification tool"), GTK_ORIENTATION_VERTICAL);
+       external_preview_select_entry = gtk_entry_new();
+       tabcomp = tab_completion_new(&external_preview_select_entry, options->external_preview.select, NULL, NULL, NULL, NULL);
+       tab_completion_add_select_button(external_preview_select_entry, _("Select file identification tool"), FALSE);
+       gtk_box_pack_start(GTK_BOX(group), tabcomp, TRUE, TRUE, 0);
+       gtk_widget_show(tabcomp);
+
+       group = pref_group_new(vbox, FALSE, _("Preview extraction tool"), GTK_ORIENTATION_VERTICAL);
+       external_preview_extract_entry = gtk_entry_new();
+       tabcomp = tab_completion_new(&external_preview_extract_entry, options->external_preview.extract, NULL, NULL, NULL, NULL);
+       tab_completion_add_select_button(external_preview_extract_entry, _("Select preview extraction tool"), FALSE);
+       gtk_box_pack_start(GTK_BOX(group), tabcomp, TRUE, TRUE, 0);
+       gtk_widget_show(tabcomp);
+
+       gtk_widget_show(vbox);
+
+       g_slist_free(formats_list);
+       string_list_free(extensions_list);
+       g_string_free(types_string, TRUE);
+}
+
 /* stereo tab */
 static void config_tab_stereo(GtkWidget *notebook)
 {
@@ -3635,7 +3758,7 @@ static void config_tab_stereo(GtkWidget *notebook)
 }
 
 /* Main preferences window */
-static void config_window_create(void)
+static void config_window_create(LayoutWindow *lw)
 {
        GtkWidget *win_vbox;
        GtkWidget *hbox;
@@ -3650,7 +3773,15 @@ static void config_window_create(void)
        gtk_window_set_type_hint(GTK_WINDOW(configwindow), GDK_WINDOW_TYPE_HINT_DIALOG);
        g_signal_connect(G_OBJECT(configwindow), "delete_event",
                         G_CALLBACK(config_window_delete), NULL);
-       gtk_window_set_default_size(GTK_WINDOW(configwindow), CONFIG_WINDOW_DEF_WIDTH, CONFIG_WINDOW_DEF_HEIGHT);
+       if (options->save_dialog_window_positions)
+               {
+               gtk_window_resize(GTK_WINDOW(configwindow), lw->options.preferences_window.w, lw->options.preferences_window.h);
+               gtk_window_move(GTK_WINDOW(configwindow), lw->options.preferences_window.x, lw->options.preferences_window.y);
+               }
+       else
+               {
+               gtk_window_set_default_size(GTK_WINDOW(configwindow), CONFIG_WINDOW_DEF_WIDTH, CONFIG_WINDOW_DEF_HEIGHT);
+               }
        gtk_window_set_resizable(GTK_WINDOW(configwindow), TRUE);
        gtk_container_set_border_width(GTK_CONTAINER(configwindow), PREF_PAD_BORDER);
 
@@ -3676,6 +3807,9 @@ static void config_window_create(void)
        config_tab_behavior(notebook);
        config_tab_toolbar_main(notebook);
        config_tab_toolbar_status(notebook);
+       config_tab_advanced(notebook);
+
+       gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), lw->options.preferences_window.page_number);
 
        hbox = gtk_hbutton_box_new();
        gtk_button_box_set_layout(GTK_BUTTON_BOX(hbox), GTK_BUTTONBOX_END);
@@ -3690,7 +3824,7 @@ static void config_window_create(void)
        gtk_widget_show(button);
 
        button = pref_button_new(NULL, GTK_STOCK_OK, NULL, FALSE,
-                                G_CALLBACK(config_window_ok_cb), NULL);
+                                G_CALLBACK(config_window_ok_cb), notebook);
        gtk_container_add(GTK_CONTAINER(hbox), button);
        gtk_widget_set_can_default(button, TRUE);
        gtk_widget_grab_default(button);
@@ -3720,7 +3854,7 @@ static void config_window_create(void)
  *-----------------------------------------------------------------------------
  */
 
-void show_config_window(void)
+void show_config_window(LayoutWindow *lw)
 {
        if (configwindow)
                {
@@ -3728,7 +3862,7 @@ void show_config_window(void)
                return;
                }
 
-       config_window_create();
+       config_window_create(lw);
 }
 
 /*
@@ -3773,7 +3907,7 @@ void show_about_window(LayoutWindow *lw)
        g_free(basename);
 
        authors[0] = NULL;
-       path = g_build_filename(GQ_HELPDIR, "AUTHORS", NULL);
+       path = g_build_filename(gq_helpdir, "AUTHORS", NULL);
        fp = fopen(path, "r");
        if (fp)
                {