Fix #543: Size of dialog windows in the GTK3 version is too small
[geeqie.git] / src / preferences.c
index aebc768..6e63eaf 100644 (file)
@@ -38,6 +38,7 @@
 #include "layout_util.h"
 #include "pixbuf_util.h"
 #include "slideshow.h"
+#include "toolbar.h"
 #include "trash.h"
 #include "utilops.h"
 #include "ui_fileops.h"
@@ -106,7 +107,8 @@ static gchar *format_class_list[] = {
        N_("Unknown"),
        N_("Image"),
        N_("RAW Image"),
-       N_("Metadata")
+       N_("Metadata"),
+       N_("Video")
        };
 
 /* config memory values */
@@ -139,27 +141,53 @@ static GtkWidget *sidecar_ext_entry;
  *-----------------------------------------------------------------------------
  */
 
-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;
 }
 
 /*
@@ -227,7 +255,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->image.zoom_mode = c_options->image.zoom_mode;
+       options->save_dialog_window_positions = c_options->save_dialog_window_positions;
        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;
@@ -274,6 +302,8 @@ static void config_window_apply(void)
 
        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;
 
@@ -331,6 +361,7 @@ static void config_window_apply(void)
 
        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;
@@ -400,6 +431,8 @@ static void config_window_apply(void)
                }
 
        if (accel_store) gtk_tree_model_foreach(GTK_TREE_MODEL(accel_store), accel_apply_cb, NULL);
+
+       toolbar_apply();
 }
 
 /*
@@ -429,8 +462,9 @@ static void config_window_help_cb(GtkWidget *widget, gpointer data)
        "GuideOptionsFiltering.html",
        "GuideOptionsMetadata.html",
        "GuideOptionsColor.html",
-       "GuideOptionsSteroa.html",
-       "GuideOptionsBehavior.html"
+       "GuideOptionsStereo.html",
+       "GuideOptionsBehavior.html",
+       "GuideOptionsToolbar.html"
        };
 
        i = gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook));
@@ -492,6 +526,22 @@ static void quality_menu_cb(GtkWidget *combo, 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)
 {
@@ -523,6 +573,33 @@ static void add_quality_menu(GtkWidget *table, gint column, gint row, const gcha
        gtk_widget_show(combo);
 }
 
+static void add_clipboard_selection_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), _("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;
@@ -711,6 +788,48 @@ static void add_stereo_mode_menu(GtkWidget *table, gint column, gint row, const
        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;
@@ -998,7 +1117,7 @@ static void filter_default_cb(GtkWidget *widget, gpointer data)
                                "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);
 }
@@ -1029,7 +1148,7 @@ static void safe_delete_clear_cb(GtkWidget *widget, gpointer data)
                                "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);
@@ -1077,7 +1196,7 @@ static void image_overlay_default_template_cb(GtkWidget *widget, gpointer data)
                                "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);
 }
@@ -1419,17 +1538,59 @@ static GtkWidget *scrolled_notebook_page(GtkWidget *notebook, const gchar *title
        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"));
 
@@ -1445,14 +1606,25 @@ static void config_tab_general(GtkWidget *notebook)
        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);
@@ -1460,10 +1632,28 @@ static void config_tab_general(GtkWidget *notebook)
        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);
@@ -1472,7 +1662,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,
-                         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);
 
@@ -1501,9 +1691,7 @@ static void config_tab_image(GtkWidget *notebook)
 {
        GtkWidget *hbox;
        GtkWidget *vbox;
-       GtkWidget *vbox2;
        GtkWidget *group;
-       GtkWidget *button;
        GtkWidget *ct_button;
        GtkWidget *enlargement_button;
        GtkWidget *table;
@@ -1524,27 +1712,31 @@ static void config_tab_image(GtkWidget *notebook)
        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);
 
+       c_options->image.zoom_increment = options->image.zoom_increment;
+       spin = pref_spin_new(group, _("Zoom increment:"), NULL,
+                            0.01, 4.0, 0.01, 2, (gdouble)options->image.zoom_increment / 100.0,
+                            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, _("Fit image to window"), GTK_ORIENTATION_VERTICAL);
+
        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 %)"),
+       enlargement_button = pref_checkbox_new_int(hbox, _("Allow enlargement of image (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);
+       gtk_widget_set_tooltip_text(GTK_WIDGET(hbox), _("Enable this to allow Geeqie to increase the image size for images that are smaller than the current view area when the zoom is set to \"Fit image to window\". This value sets the maximum expansion permitted in percent i.e. 100% is full-size."));
 
        hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
-       ct_button = pref_checkbox_new_int(hbox, _("Limit image size when autofitting (% of window):"),
+       ct_button = pref_checkbox_new_int(hbox, _("Virtual window size (% of actual window):"),
                                          options->image.limit_autofit_size, &c_options->image.limit_autofit_size);
        spin = pref_spin_new_int(hbox, NULL, NULL,
                                 10, 150, 1,
                                 options->image.max_autofit_size, &c_options->image.max_autofit_size);
        pref_checkbox_link_sensitivity(ct_button, spin);
-
-       c_options->image.zoom_increment = options->image.zoom_increment;
-       spin = pref_spin_new(group, _("Zoom increment:"), NULL,
-                            0.01, 4.0, 0.01, 2, (gdouble)options->image.zoom_increment / 100.0,
-                            G_CALLBACK(zoom_increment_cb), NULL);
-       gtk_spin_button_set_update_policy(GTK_SPIN_BUTTON(spin), GTK_UPDATE_ALWAYS);
+       gtk_widget_set_tooltip_text(GTK_WIDGET(hbox), _("This value will set the virtual size of the window when \"Fit image to window\" is set. Instead of using the actual size of the window, the specified percentage of the window will be used. It allows one to keep a border around the image (values lower than 100%) or to auto zoom the image (values greater than 100%). It affects fullscreen mode too."));
 
        group = pref_group_new(vbox, FALSE, _("Appearance"), GTK_ORIENTATION_VERTICAL);
 
@@ -1601,6 +1793,9 @@ static void config_tab_windows(GtkWidget *notebook)
        pref_checkbox_new_int(group, _("Remember tool state (float/hidden)"),
                              options->tools_restore_state, &c_options->tools_restore_state);
 
+       pref_checkbox_new_int(group, _("Remember dialog window positions"),
+                             options->save_dialog_window_positions, &c_options->save_dialog_window_positions);
+
        group = pref_group_new(vbox, FALSE, _("Size"), GTK_ORIENTATION_VERTICAL);
 
        pref_checkbox_new_int(group, _("Fit window to image when tools are hidden/floating"),
@@ -2121,6 +2316,7 @@ static void config_tab_behavior(GtkWidget *notebook)
        GtkWidget *tabcomp;
        GtkWidget *ct_button;
        GtkWidget *spin;
+       GtkWidget *table;
 
        vbox = scrolled_notebook_page(notebook, _("Behavior"));
 
@@ -2180,6 +2376,9 @@ static void config_tab_behavior(GtkWidget *notebook)
        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"),
@@ -2190,12 +2389,23 @@ static void config_tab_behavior(GtkWidget *notebook)
                              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);
+
 
 #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
 }
 
@@ -2303,6 +2513,22 @@ static void config_tab_accelerators(GtkWidget *notebook)
        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)
 {
@@ -2416,6 +2642,7 @@ static void config_window_create(void)
        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);
@@ -2489,95 +2716,88 @@ void show_config_window(void)
  *-----------------
  */
 
-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()