Include a Other Software section in Help file
[geeqie.git] / src / preferences.c
index c0c3810..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;
@@ -202,7 +204,7 @@ static void slideshow_delay_seconds_cb(GtkWidget *spin, gpointer data)
 
 /*
  *-----------------------------------------------------------------------------
- * sync progam to config window routine (private)
+ * sync program to config window routine (private)
  *-----------------------------------------------------------------------------
  */
 
@@ -245,8 +247,10 @@ static gboolean accel_apply_cb(GtkTreeModel *model, GtkTreePath *path, GtkTreeIt
 
 static void config_window_apply(void)
 {
-       gint i;
        gboolean refresh = FALSE;
+#ifdef HAVE_LCMS2
+       int i = 0;
+#endif
 
        config_entry_to_option(safe_delete_path_entry, &options->file_ops.safe_delete_path, remove_trailing_slash);
 
@@ -267,6 +271,7 @@ static void config_window_apply(void)
        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->save_window_workspace = c_options->save_window_workspace;
        options->save_dialog_window_positions = c_options->save_dialog_window_positions;
        options->show_window_ids = c_options->show_window_ids;
        options->image.scroll_reset_method = c_options->image.scroll_reset_method;
@@ -295,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;
@@ -374,10 +380,12 @@ 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;
        options->clipboard_selection = c_options->clipboard_selection;
+       options->dnd_default_action = c_options->dnd_default_action;
 
        options->metadata.save_in_image_file = c_options->metadata.save_in_image_file;
        options->metadata.save_legacy_IPTC = c_options->metadata.save_legacy_IPTC;
@@ -420,12 +428,18 @@ static void config_window_apply(void)
        options->info_rating.height = c_options->info_rating.height;
 
        options->show_predefined_keyword_tree = c_options->show_predefined_keyword_tree;
+       options->expand_menu_toolbar = c_options->expand_menu_toolbar;
 
        options->marks_save = c_options->marks_save;
        options->with_rename = c_options->with_rename;
        options->collections_on_top = c_options->collections_on_top;
+       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;
@@ -452,6 +466,8 @@ static void config_window_apply(void)
        options->mouse_button_8 = c_options->mouse_button_8;
        options->mouse_button_9 = c_options->mouse_button_9;
 
+       options->override_disable_gpu = c_options->override_disable_gpu;
+
        config_tab_keywords_save();
 
        image_options_sync();
@@ -499,7 +515,9 @@ static void config_window_help_cb(GtkWidget *widget, gpointer data)
        "GuideOptionsColor.html",
        "GuideOptionsStereo.html",
        "GuideOptionsBehavior.html",
-       "GuideOptionsToolbar.html"
+       "GuideOptionsToolbar.html",
+       "GuideOptionsToolbar.html",
+       "GuideOptionsAdvanced.html"
        };
 
        i = gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook));
@@ -515,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);
@@ -545,13 +583,10 @@ static void quality_menu_cb(GtkWidget *combo, gpointer data)
                case 2:
                        *option = GDK_INTERP_BILINEAR;
                        break;
-               case 3:
-                       *option = GDK_INTERP_HYPER;
-                       break;
                }
 }
 
-static void clipboard_selection_menu_cb(GtkWidget *combo, gpointer data)
+static void dnd_default_action_selection_menu_cb(GtkWidget *combo, gpointer data)
 {
        gint *option = data;
 
@@ -559,11 +594,33 @@ static void clipboard_selection_menu_cb(GtkWidget *combo, gpointer data)
                {
                case 0:
                default:
-                       *option = PRIMARY;
+                       *option = DND_ACTION_ASK;
+                       break;
+               case 1:
+                       *option = DND_ACTION_COPY;
+                       break;
+               case 2:
+                       *option = DND_ACTION_MOVE;
+                       break;
+               }
+}
+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:
+                       *option = CLIPBOARD_PRIMARY;
                        break;
                case 1:
-                       *option = CLIPBOARD;
+                       *option = CLIPBOARD_CLIPBOARD;
+                       break;
+               case 2:
+                       *option = CLIPBOARD_BOTH;
                        break;
+               default:
+                       *option = CLIPBOARD_BOTH;
                }
 }
 
@@ -583,10 +640,8 @@ static void add_quality_menu(GtkWidget *table, gint column, gint row, const gcha
        if (option == GDK_INTERP_NEAREST) current = 0;
        gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), _("Tiles"));
        if (option == GDK_INTERP_TILES) current = 1;
-       gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), _("Bilinear"));
+       gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), _("Bilinear (best, but slowest)"));
        if (option == GDK_INTERP_BILINEAR) current = 2;
-       gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), _("Hyper (best, but slowest)"));
-       if (option == GDK_INTERP_HYPER) current = 3;
 
        gtk_combo_box_set_active(GTK_COMBO_BOX(combo), current);
 
@@ -597,6 +652,33 @@ static void add_quality_menu(GtkWidget *table, gint column, gint row, const gcha
        gtk_widget_show(combo);
 }
 
+static void add_dnd_default_action_selection_menu(GtkWidget *table, gint column, gint row, const gchar *text, DnDAction option, DnDAction *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), _("Ask"));
+       if (option == DND_ACTION_ASK) current = 0;
+       gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), _("Copy"));
+       if (option == DND_ACTION_COPY) current = 1;
+       gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), _("Move"));
+       if (option == DND_ACTION_MOVE) current = 2;
+
+       gtk_combo_box_set_active(GTK_COMBO_BOX(combo), current);
+
+       g_signal_connect(G_OBJECT(combo), "changed",
+                        G_CALLBACK(dnd_default_action_selection_menu_cb), option_c);
+
+       gtk_table_attach(GTK_TABLE(table), combo, column + 1, column + 2, row, row + 1, GTK_SHRINK, 0, 0, 0);
+       gtk_widget_show(combo);
+}
+
 static void add_clipboard_selection_menu(GtkWidget *table, gint column, gint row, const gchar *text,
                             gint option, gint *option_c)
 {
@@ -609,10 +691,12 @@ static void add_clipboard_selection_menu(GtkWidget *table, gint column, gint row
 
        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_text_append_text(GTK_COMBO_BOX_TEXT(combo), _("Primary"));
+       if (option == CLIPBOARD_PRIMARY) current = 0;
+       gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), _("Clipboard"));
+       if (option == CLIPBOARD_CLIPBOARD) current = 1;
+       gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), _("Both"));
+       if (option == CLIPBOARD_BOTH) current = 2;
 
        gtk_combo_box_set_active(GTK_COMBO_BOX(combo), current);
 
@@ -685,6 +769,7 @@ static const UseableMouseItems useable_mouse_items[] = {
        {"Zoom33",      N_("Zoom1:3"), GTK_STOCK_FILE},
        {"Zoom25",      N_("Zoom 1:4"), GTK_STOCK_FILE},
        {"ConnectZoomIn",       N_("Connected Zoom in"), GTK_STOCK_ZOOM_IN},
+       {"SplitPaneSync",       N_("Split Pane Sync"), PIXBUF_INLINE_SPLIT_PANE_SYNC},
        {"Grayscale",   N_("Grayscale"), PIXBUF_INLINE_ICON_GRAYSCALE},
        {"OverUnderExposed",    N_("Over Under Exposed"), PIXBUF_INLINE_ICON_EXPOSURE},
        {"HideTools",   N_("Hide file list"), PIXBUF_INLINE_ICON_HIDETOOLS},
@@ -1179,8 +1264,6 @@ static gboolean filter_add_scroll(gpointer data)
        GList *list_cells;
        GtkCellRenderer *cell;
        GtkTreeViewColumn *column;
-       const gchar *title;
-       guint i = 0;
        gint rows;
 
        rows = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(filter_store), NULL);
@@ -1869,7 +1952,7 @@ static void config_tab_general(GtkWidget *notebook)
        pref_spin_new_int(hbox, _("Width:"), NULL, 1, 512, 1, options->thumbnails.max_width, &c_options->thumbnails.max_width);
        pref_spin_new_int(hbox, _("Height:"), NULL, 1, 512, 1, options->thumbnails.max_height, &c_options->thumbnails.max_height);
 
-       ct_button = pref_checkbox_new_int(group, _("Cache thumbnails"),
+       ct_button = pref_checkbox_new_int(group, _("Cache thumbnails and sim. files"),
                                          options->thumbnails.enable_caching, &c_options->thumbnails.enable_caching);
 
        subgroup = pref_box_new(group, FALSE, GTK_ORIENTATION_VERTICAL, PREF_PAD_GAP);
@@ -1900,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);
@@ -1922,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);
@@ -1954,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);
@@ -2020,7 +2106,7 @@ static void config_tab_general(GtkWidget *notebook)
 
        group = pref_group_new(vbox, FALSE, _("Image loading and caching"), GTK_ORIENTATION_VERTICAL);
 
-       pref_spin_new_int(group, _("Decoded image cache size (Mb):"), NULL,
+       pref_spin_new_int(group, _("Decoded image cache size (MiB):"), NULL,
                          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);
@@ -2028,6 +2114,15 @@ static void config_tab_general(GtkWidget *notebook)
        pref_checkbox_new_int(group, _("Refresh on file change"),
                              options->update_on_time_change, &c_options->update_on_time_change);
 
+
+       pref_spacer(group, PREF_PAD_GROUP);
+
+       group = pref_group_new(vbox, FALSE, _("Expand menu and toolbar"), GTK_ORIENTATION_VERTICAL);
+
+       pref_checkbox_new_int(group, _("Expand menu and toolbar (NOTE! Geeqie must be restarted for change to take effect)"),
+                               options->expand_menu_toolbar, &c_options->expand_menu_toolbar);
+       gtk_widget_set_tooltip_text(group, _("Expand the menu and toolbar to the full width of the window"));
+
        pref_spacer(group, PREF_PAD_GROUP);
 
        group = pref_group_new(vbox, FALSE, _("Info sidebar heights"), GTK_ORIENTATION_VERTICAL);
@@ -2129,6 +2224,10 @@ static void config_tab_image(GtkWidget *notebook)
        GtkWidget *enlargement_button;
        GtkWidget *table;
        GtkWidget *spin;
+       GtkWidget *two_pass;
+#ifdef HAVE_CLUTTER
+       GtkWidget *gpu_accel;
+#endif
 
        vbox = scrolled_notebook_page(notebook, _("Image"));
 
@@ -2136,14 +2235,26 @@ static void config_tab_image(GtkWidget *notebook)
 
        table = pref_table_new(group, 2, 1, FALSE, FALSE);
        add_quality_menu(table, 0, 0, _("Quality:"), options->image.zoom_quality, &c_options->image.zoom_quality);
+       if (options->image.use_clutter_renderer && !options->disable_gpu)
+               {
+               gtk_widget_set_sensitive(table, FALSE);
+               }
 
 #ifdef HAVE_CLUTTER
-       pref_checkbox_new_int(group, _("Use GPU acceleration via Clutter library"),
+       gpu_accel = pref_checkbox_new_int(group, _("Use GPU acceleration via Clutter library (Requires restart)"),
                              options->image.use_clutter_renderer, &c_options->image.use_clutter_renderer);
+       if (options->disable_gpu && !options->override_disable_gpu)
+               {
+               gtk_widget_set_sensitive(gpu_accel, FALSE);
+               }
 #endif
 
-       pref_checkbox_new_int(group, _("Two pass rendering (apply HQ zoom and color correction in second pass)"),
+       two_pass = 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);
+       if (options->image.use_clutter_renderer && !options->disable_gpu)
+               {
+               gtk_widget_set_sensitive(two_pass, FALSE);
+               }
 
        c_options->image.zoom_increment = options->image.zoom_increment;
        spin = pref_spin_new(group, _("Zoom increment:"), NULL,
@@ -2220,6 +2331,10 @@ static void config_tab_windows(GtkWidget *notebook)
                                       options->use_saved_window_positions_for_new_windows, &c_options->use_saved_window_positions_for_new_windows);
        pref_checkbox_link_sensitivity(ct_button, button);
 
+       button = pref_checkbox_new_int(group, _("Remember window workspace"),
+                             options->save_window_workspace, &c_options->save_window_workspace);
+       pref_checkbox_link_sensitivity(ct_button, button);
+
        pref_checkbox_new_int(group, _("Remember tool state (float/hidden)"),
                              options->tools_restore_state, &c_options->tools_restore_state);
 
@@ -2261,7 +2376,6 @@ static void config_tab_osd(GtkWidget *notebook)
 {
        GtkWidget *hbox;
        GtkWidget *vbox;
-       GtkWidget *vbox_buttons;
        GtkWidget *group;
        GtkWidget *button;
        GtkWidget *image_overlay_template_view;
@@ -2269,10 +2383,7 @@ static void config_tab_osd(GtkWidget *notebook)
        GtkWidget *scrolled_pre_formatted;
        GtkTextBuffer *buffer;
        GtkWidget *label;
-       GtkWidget *     subgroup;
-       gint i = 0;
-       gint rows = 0;
-       gint cols = 0;
+       GtkWidget *subgroup;
 
        vbox = scrolled_notebook_page(notebook, _("OSD"));
 
@@ -2588,7 +2699,12 @@ static void config_tab_metadata(GtkWidget *notebook)
        label = pref_label_new(group, _("Warning: Geeqie is built without Exiv2. Some options are disabled."));
 #endif
        label = pref_label_new(group, _("Metadata are written in the following order. The process ends after first success."));
+#if GTK_CHECK_VERSION(3,16,0)
+       gtk_label_set_xalign(GTK_LABEL(label), 0.0);
+       gtk_label_set_yalign(GTK_LABEL(label), 0.5);
+#else
        gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+#endif
 
        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);
@@ -2601,7 +2717,12 @@ static void config_tab_metadata(GtkWidget *notebook)
 
        text = g_strdup_printf(_("3) Save metadata in Geeqie private directory '%s'"), get_metadata_cache_dir());
        label = pref_label_new(group, text);
+#if GTK_CHECK_VERSION(3,16,0)
+       gtk_label_set_xalign(GTK_LABEL(label), 0.0);
+       gtk_label_set_yalign(GTK_LABEL(label), 0.5);
+#else
        gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+#endif
        gtk_misc_set_padding(GTK_MISC(label), 22, 0);
        g_free(text);
 
@@ -3192,6 +3313,9 @@ static void config_tab_behavior(GtkWidget *notebook)
        GtkWidget *marks;
        GtkWidget *with_rename;
        GtkWidget *collections_on_top;
+       GtkWidget *hide_window_in_fullscreen;
+       GtkWidget *checkbox;
+       GtkWidget *tmp;
 
        vbox = scrolled_notebook_page(notebook, _("Behavior"));
 
@@ -3222,7 +3346,7 @@ static void config_tab_behavior(GtkWidget *notebook)
        pref_checkbox_link_sensitivity(ct_button, hbox);
 
        pref_spacer(hbox, PREF_PAD_INDENT - PREF_PAD_GAP);
-       spin = pref_spin_new_int(hbox, _("Maximum size:"), _("MB"),
+       spin = pref_spin_new_int(hbox, _("Maximum size:"), _("MiB"),
                                 0, 2048, 1, options->file_ops.safe_delete_folder_maxsize, &c_options->file_ops.safe_delete_folder_maxsize);
        gtk_widget_set_tooltip_markup(spin, _("Set to 0 for unlimited size"));
        button = pref_button_new(NULL, NULL, _("View"), FALSE,
@@ -3255,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");
@@ -3267,12 +3395,19 @@ static void config_tab_behavior(GtkWidget *notebook)
                                options->collections_on_top, &c_options->collections_on_top);
        gtk_widget_set_tooltip_text(collections_on_top,"Open collections window on top");
 
+       hide_window_in_fullscreen = pref_checkbox_new_int(group, _("Hide window in fullscreen"),
+                               options->hide_window_in_fullscreen, &c_options->hide_window_in_fullscreen);
+       gtk_widget_set_tooltip_text(hide_window_in_fullscreen,"When alt-tabbing, prevent Geeqie window showing twice");
+
        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_dnd_default_action_selection_menu(table, 0, 0, _("Drag`n drop default action:"), options->dnd_default_action, &c_options->dnd_default_action);
+
        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);
 
@@ -3299,6 +3434,14 @@ static void config_tab_behavior(GtkWidget *notebook)
        table = pref_table_new(group, 2, 1, FALSE, FALSE);
        add_mouse_selection_menu(table, 0, 0, _("Mouse button Forward:"), options->mouse_button_9, &c_options->mouse_button_9);
 
+       pref_spacer(group, PREF_PAD_GROUP);
+
+       group = pref_group_new(vbox, FALSE, _("GPU"), GTK_ORIENTATION_VERTICAL);
+
+       checkbox = pref_checkbox_new_int(group, _("Override disable GPU"),
+                               options->override_disable_gpu, &c_options->override_disable_gpu);
+       gtk_widget_set_tooltip_text(checkbox, "Contact the developers for usage");
+
 #ifdef DEBUG
        pref_spacer(group, PREF_PAD_GROUP);
 
@@ -3451,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)
 {
@@ -3529,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;
@@ -3544,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);
 
@@ -3570,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);
@@ -3584,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);
@@ -3614,7 +3854,7 @@ static void config_window_create(void)
  *-----------------------------------------------------------------------------
  */
 
-void show_config_window(void)
+void show_config_window(LayoutWindow *lw)
 {
        if (configwindow)
                {
@@ -3622,7 +3862,7 @@ void show_config_window(void)
                return;
                }
 
-       config_window_create();
+       config_window_create(lw);
 }
 
 /*
@@ -3667,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)
                {
@@ -3778,7 +4018,6 @@ static void timezone_progress_cb(goffset current_num_bytes, goffset total_num_by
 static void timezone_cancel_button_cb(GenericDialog *gd, gpointer data)
 {
        TZData *tz = data;
-       GError *error = NULL;
 
        g_cancellable_cancel(tz->cancellable);
 }