Sort headers using clang-tidy
[geeqie.git] / src / preferences.cc
index a8589a2..8b73b6c 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#include "main.h"
 #include "preferences.h"
 
+#include <config.h>
+
 #include "bar-keywords.h"
 #include "cache.h"
 #include "color-man.h"
+#include "compat.h"
+#include "debug.h"
 #include "editors.h"
 #include "filedata.h"
 #include "filefilter.h"
 #include "fullscreen.h"
-#include "image.h"
 #include "image-overlay.h"
+#include "image.h"
 #include "img-view.h"
+#include "intl.h"
 #include "layout-util.h"
+#include "main-defines.h"
+#include "main.h"
 #include "metadata.h"
 #include "misc.h"
 #include "osd.h"
 #include "slideshow.h"
 #include "toolbar.h"
 #include "trash.h"
-#include "utilops.h"
 #include "ui-fileops.h"
 #include "ui-misc.h"
 #include "ui-tabcomp.h"
+#include "utilops.h"
 #include "window.h"
 #include "zonedetect.h"
 
 #include <gspell/gspell.h>
 #endif
 
-#define EDITOR_NAME_MAX_LENGTH 32
-#define EDITOR_COMMAND_MAX_LENGTH 1024
+enum {
+       EDITOR_NAME_MAX_LENGTH = 32,
+       EDITOR_COMMAND_MAX_LENGTH = 1024
+};
 
-static void image_overlay_set_text_colours();
+static void image_overlay_set_text_colors();
 
 GtkWidget *keyword_text;
 static void config_tab_keywords_save();
@@ -152,9 +160,13 @@ static GtkWidget *external_preview_extract_entry;
 static GtkWidget *sidecar_ext_entry;
 static GtkWidget *help_search_engine_entry;
 
+static GtkWidget *log_window_f1_entry;
 
-#define CONFIG_WINDOW_DEF_WIDTH                700
-#define CONFIG_WINDOW_DEF_HEIGHT       600
+
+enum {
+       CONFIG_WINDOW_DEF_WIDTH =               700,
+       CONFIG_WINDOW_DEF_HEIGHT =      600
+};
 
 /*
  *-----------------------------------------------------------------------------
@@ -169,7 +181,8 @@ static void zoom_increment_cb(GtkWidget *spin, gpointer)
 
 static void slideshow_delay_hours_cb(GtkWidget *spin, gpointer)
 {
-       gint mins_secs_tenths, delay;
+       gint mins_secs_tenths;
+       gint delay;
 
        mins_secs_tenths = c_options->slideshow.delay %
                                                (3600 * SLIDESHOW_SUBSECOND_PRECISION);
@@ -184,7 +197,9 @@ static void slideshow_delay_hours_cb(GtkWidget *spin, gpointer)
 
 static void slideshow_delay_minutes_cb(GtkWidget *spin, gpointer)
 {
-       gint hours, secs_tenths, delay;
+       gint hours;
+       gint secs_tenths;
+       gint delay;
 
        hours = c_options->slideshow.delay / (3600 * SLIDESHOW_SUBSECOND_PRECISION);
        secs_tenths = c_options->slideshow.delay % (60 * SLIDESHOW_SUBSECOND_PRECISION);
@@ -199,7 +214,8 @@ static void slideshow_delay_minutes_cb(GtkWidget *spin, gpointer)
 
 static void slideshow_delay_seconds_cb(GtkWidget *spin, gpointer)
 {
-       gint hours_mins, delay;
+       gint hours_mins;
+       gint delay;
 
        hours_mins = c_options->slideshow.delay / (60 * SLIDESHOW_SUBSECOND_PRECISION);
 
@@ -223,7 +239,7 @@ void config_entry_to_option(GtkWidget *entry, gchar **option, gchar *(*func)(con
 
        g_free(*option);
        *option = nullptr;
-       buf = gtk_entry_get_text(GTK_ENTRY(entry));
+       buf = gq_gtk_entry_get_text(GTK_ENTRY(entry));
        if (buf && strlen(buf) > 0)
                {
                if (func)
@@ -236,7 +252,8 @@ void config_entry_to_option(GtkWidget *entry, gchar **option, gchar *(*func)(con
 
 static gboolean accel_apply_cb(GtkTreeModel *model, GtkTreePath *, GtkTreeIter *iter, gpointer)
 {
-       gchar *accel_path, *accel;
+       gchar *accel_path;
+       gchar *accel;
 
        gtk_tree_model_get(model, iter, AE_ACCEL, &accel_path, AE_KEY, &accel, -1);
 
@@ -298,8 +315,8 @@ static void config_window_apply()
        if (options->thumbnails.max_width != c_options->thumbnails.max_width
            || options->thumbnails.max_height != c_options->thumbnails.max_height
            || options->thumbnails.quality != c_options->thumbnails.quality)
-               {
-               thumb_format_changed = TRUE;
+               {
+               thumb_format_changed = TRUE;
                refresh = TRUE;
                options->thumbnails.max_width = c_options->thumbnails.max_width;
                options->thumbnails.max_height = c_options->thumbnails.max_height;
@@ -352,7 +369,7 @@ static void config_window_apply()
 
        if (options->image.use_custom_border_color != c_options->image.use_custom_border_color
            || options->image.use_custom_border_color_in_fullscreen != c_options->image.use_custom_border_color_in_fullscreen
-           || !gdk_color_equal(&options->image.border_color, &c_options->image.border_color))
+           || !gdk_rgba_equal(&options->image.border_color, &c_options->image.border_color))
                {
                options->image.use_custom_border_color_in_fullscreen = c_options->image.use_custom_border_color_in_fullscreen;
                options->image.use_custom_border_color = c_options->image.use_custom_border_color;
@@ -382,6 +399,7 @@ static void config_window_apply()
        options->image_overlay.background_green = c_options->image_overlay.background_green;
        options->image_overlay.background_blue = c_options->image_overlay.background_blue;
        options->image_overlay.background_alpha = c_options->image_overlay.background_alpha;
+       options->image_overlay.font = c_options->image_overlay.font;
        options->update_on_time_change = c_options->update_on_time_change;
 
        options->duplicates_similarity_threshold = c_options->duplicates_similarity_threshold;
@@ -441,6 +459,11 @@ static void config_window_apply()
 
        options->show_predefined_keyword_tree = c_options->show_predefined_keyword_tree;
        options->expand_menu_toolbar = c_options->expand_menu_toolbar;
+       options->hamburger_menu = c_options->hamburger_menu;
+
+       options->selectable_bars.menu_bar = c_options->selectable_bars.menu_bar;
+       options->selectable_bars.tool_bar = c_options->selectable_bars.tool_bar;
+       options->selectable_bars.status_bar = c_options->selectable_bars.status_bar;
 
        options->marks_save = c_options->marks_save;
        options->with_rename = c_options->with_rename;
@@ -460,8 +483,12 @@ static void config_window_apply()
 
        options->threads.duplicates = c_options->threads.duplicates > 0 ? c_options->threads.duplicates : -1;
 
+       options->alternate_similarity_algorithm.enabled = c_options->alternate_similarity_algorithm.enabled;
+       options->alternate_similarity_algorithm.grayscale = c_options->alternate_similarity_algorithm.grayscale;
+
 #ifdef DEBUG
        set_debug_level(debug_c);
+       config_entry_to_option(log_window_f1_entry, &options->log_window.action, nullptr);
 #endif
 
 #ifdef HAVE_LCMS
@@ -508,7 +535,7 @@ static void config_window_apply()
 
 static void config_window_close_cb(GtkWidget *, gpointer)
 {
-       gtk_widget_destroy(configwindow);
+       gq_gtk_widget_destroy(configwindow);
        configwindow = nullptr;
        filter_store = nullptr;
 }
@@ -664,7 +691,7 @@ static void add_quality_menu(GtkWidget *table, gint column, gint row, const gcha
        g_signal_connect(G_OBJECT(combo), "changed",
                         G_CALLBACK(quality_menu_cb), option_c);
 
-       gtk_table_attach(GTK_TABLE(table), combo, column + 1, column + 2, row, row + 1, GTK_SHRINK, static_cast<GtkAttachOptions>(0), 0, 0);
+       gq_gtk_grid_attach(GTK_GRID(table), combo, column + 1, column + 2, row, row + 1, GTK_SHRINK, static_cast<GtkAttachOptions>(0), 0, 0);
        gtk_widget_show(combo);
 }
 
@@ -691,7 +718,7 @@ static void add_dnd_default_action_selection_menu(GtkWidget *table, gint column,
        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, static_cast<GtkAttachOptions>(0), 0, 0);
+       gq_gtk_grid_attach(GTK_GRID(table), combo, column + 1, column + 2, row, row + 1, GTK_SHRINK, static_cast<GtkAttachOptions>(0), 0, 0);
        gtk_widget_show(combo);
 }
 
@@ -719,7 +746,7 @@ static void add_clipboard_selection_menu(GtkWidget *table, gint column, gint row
        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_SHRINK, static_cast<GtkAttachOptions>(0), 0, 0);
+       gq_gtk_grid_attach(GTK_GRID(table), combo, column + 1, column + 2, row, row + 1, GTK_SHRINK, static_cast<GtkAttachOptions>(0), 0, 0);
        gtk_widget_show(combo);
 }
 
@@ -760,7 +787,7 @@ static void add_zoom_style_selection_menu(GtkWidget *table, gint column, gint ro
 
        g_signal_connect(G_OBJECT(combo), "changed", G_CALLBACK(zoom_style_selection_menu_cb), option_c);
 
-       gtk_table_attach(GTK_TABLE(table), combo, column + 1, column + 2, row, row + 1, GTK_SHRINK, static_cast<GtkAttachOptions>(0), 0, 0);
+       gq_gtk_grid_attach(GTK_GRID(table), combo, column + 1, column + 2, row, row + 1, GTK_SHRINK, static_cast<GtkAttachOptions>(0), 0, 0);
        gtk_widget_show(combo);
 }
 
@@ -829,7 +856,7 @@ static void add_mouse_selection_menu(GtkWidget *table, gint column, gint row, co
 
        g_signal_connect(G_OBJECT(combo), "changed", G_CALLBACK(mouse_buttons_selection_menu_cb), option_c);
 
-       gtk_table_attach(GTK_TABLE(table), combo, column + 1, column + 2, row, row + 1, GTK_SHRINK, static_cast<GtkAttachOptions>(0), 0, 0);
+       gq_gtk_grid_attach(GTK_GRID(table), combo, column + 1, column + 2, row, row + 1, GTK_SHRINK, static_cast<GtkAttachOptions>(0), 0, 0);
        gtk_widget_show(combo);
 }
 
@@ -868,7 +895,8 @@ static void add_thumb_size_menu(GtkWidget *table, gint column, gint row, gchar *
        current = -1;
        for (i = 0; static_cast<guint>(i) < sizeof(thumb_size_list) / sizeof(ThumbSize); i++)
                {
-               gint w, h;
+               gint w;
+               gint h;
                gchar *buf;
 
                w = thumb_size_list[i].w;
@@ -896,7 +924,7 @@ static void add_thumb_size_menu(GtkWidget *table, gint column, gint row, gchar *
        g_signal_connect(G_OBJECT(combo), "changed",
                         G_CALLBACK(thumb_size_menu_cb), NULL);
 
-       gtk_table_attach(GTK_TABLE(table), combo, column + 1, column + 2, row, row + 1, GTK_SHRINK, static_cast<GtkAttachOptions>(0), 0, 0);
+       gq_gtk_grid_attach(GTK_GRID(table), combo, column + 1, column + 2, row, row + 1, GTK_SHRINK, static_cast<GtkAttachOptions>(0), 0, 0);
        gtk_widget_show(combo);
 }
 
@@ -1015,7 +1043,7 @@ static void add_stereo_mode_menu(GtkWidget *table, gint column, gint row, const
        g_signal_connect(G_OBJECT(combo), "changed",
                         G_CALLBACK(stereo_mode_menu_cb), option_c);
 
-       gtk_table_attach(GTK_TABLE(table), combo, column + 1, column + 2, row, row + 1, GTK_SHRINK, static_cast<GtkAttachOptions>(0), 0, 0);
+       gq_gtk_grid_attach(GTK_GRID(table), combo, column + 1, column + 2, row, row + 1, GTK_SHRINK, static_cast<GtkAttachOptions>(0), 0, 0);
        gtk_widget_show(combo);
 }
 
@@ -1056,7 +1084,7 @@ static void add_video_menu(GtkWidget *table, gint column, gint row, const gchar
        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_SHRINK, static_cast<GtkAttachOptions>(0), 0, 0);
+       gq_gtk_grid_attach(GTK_GRID(table), combo, column + 1, column + 2, row, row + 1, GTK_SHRINK, static_cast<GtkAttachOptions>(0), 0, 0);
        gtk_widget_show(combo);
 }
 
@@ -1367,7 +1395,7 @@ static void filter_disable_cb(GtkWidget *widget, gpointer data)
 
 static void safe_delete_view_cb(GtkWidget *, gpointer)
 {
-       layout_set_path(nullptr, gtk_entry_get_text(GTK_ENTRY(safe_delete_path_entry)));
+       layout_set_path(nullptr, gq_gtk_entry_get_text(GTK_ENTRY(safe_delete_path_entry)));
 }
 
 static void safe_delete_clear_ok_cb(GenericDialog *, gpointer)
@@ -1388,8 +1416,8 @@ static void safe_delete_clear_cb(GtkWidget *widget, gpointer)
        entry = gtk_entry_new();
        gtk_widget_set_can_focus(entry, FALSE);
        gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);
-       if (options->file_ops.safe_delete_path) gtk_entry_set_text(GTK_ENTRY(entry), options->file_ops.safe_delete_path);
-       gtk_box_pack_start(GTK_BOX(gd->vbox), entry, FALSE, FALSE, 0);
+       if (options->file_ops.safe_delete_path) gq_gtk_entry_set_text(GTK_ENTRY(entry), options->file_ops.safe_delete_path);
+       gq_gtk_box_pack_start(GTK_BOX(gd->vbox), entry, FALSE, FALSE, 0);
        gtk_widget_show(entry);
        gtk_widget_show(gd->dialog);
 }
@@ -1441,80 +1469,151 @@ static void image_overlay_help_cb(GtkWidget *, gpointer)
        help_window_show("GuideOptionsOSD.html");
 }
 
-static void image_overlay_set_font_cb(GtkWidget *widget, gpointer)
+static void font_activated_cb(GtkFontChooser *widget, gchar *fontname, gpointer)
 {
-       GtkWidget *dialog;
-       char *font;
-       PangoFontDescription *font_desc;
+       g_free(c_options->image_overlay.font);
+       c_options->image_overlay.font = g_strdup(fontname);
+       g_free(fontname);
 
-       dialog = gtk_font_chooser_dialog_new("Image Overlay Font", GTK_WINDOW(gtk_widget_get_toplevel(widget)));
-       gtk_font_chooser_set_font(GTK_FONT_CHOOSER(dialog), options->image_overlay.font);
+       gq_gtk_widget_destroy(GTK_WIDGET(widget));
+}
 
-       if (gtk_dialog_run(GTK_DIALOG(dialog)) != GTK_RESPONSE_CANCEL)
+static void font_response_cb(GtkDialog *dialog, gint response_id, gpointer)
+{
+       gchar *font;
+
+       g_free(c_options->image_overlay.font);
+       c_options->image_overlay.font = g_strdup(options->image_overlay.font);
+
+       if (response_id == GTK_RESPONSE_OK)
                {
-               font_desc = gtk_font_chooser_get_font_desc(GTK_FONT_CHOOSER(dialog));
-               font = pango_font_description_to_string(font_desc);
+               font = gtk_font_chooser_get_font(GTK_FONT_CHOOSER(dialog));
                g_free(c_options->image_overlay.font);
                c_options->image_overlay.font = g_strdup(font);
                g_free(font);
                }
 
-       gtk_widget_destroy(dialog);
+       g_object_unref(dialog);
 }
 
-static void image_overlay_set_text_colour_cb(GtkWidget *widget, gpointer)
+static void image_overlay_set_font_cb(GtkWidget *widget, gpointer)
 {
        GtkWidget *dialog;
-       GdkRGBA colour;
-
-       dialog = gtk_color_chooser_dialog_new("Image Overlay Text Colour", GTK_WINDOW(gtk_widget_get_toplevel(widget)));
-       colour.red = options->image_overlay.text_red;
-       colour.green = options->image_overlay.text_green;
-       colour.blue = options->image_overlay.text_blue;
-       colour.alpha = options->image_overlay.text_alpha;
-       gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(dialog), &colour);
-       gtk_color_chooser_set_use_alpha(GTK_COLOR_CHOOSER(dialog), TRUE);
 
-       if (gtk_dialog_run(GTK_DIALOG(dialog)) != GTK_RESPONSE_CANCEL)
+       dialog = gtk_font_chooser_dialog_new("Image Overlay Font", GTK_WINDOW(gtk_widget_get_toplevel(widget)));
+       gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
+       gtk_font_chooser_set_font(GTK_FONT_CHOOSER(dialog), options->image_overlay.font);
+
+       g_signal_connect(dialog, "font-activated", G_CALLBACK(font_activated_cb), nullptr);
+       g_signal_connect(dialog, "response", G_CALLBACK(font_response_cb), nullptr);
+
+       gtk_widget_show(dialog);
+}
+
+static void text_color_activated_cb(GtkColorChooser *chooser, GdkRGBA *color, gpointer)
+{
+       c_options->image_overlay.text_red = color->red * 255;
+       c_options->image_overlay.text_green = color->green * 255;
+       c_options->image_overlay.text_blue = color->blue * 255;
+       c_options->image_overlay.text_alpha = color->alpha * 255;
+
+       gq_gtk_widget_destroy(GTK_WIDGET(chooser));
+}
+
+static void text_color_response_cb(GtkDialog *dialog, gint response_id, gpointer)
+{
+       GdkRGBA color;
+
+       c_options->image_overlay.text_red = options->image_overlay.text_red;
+       c_options->image_overlay.text_green = options->image_overlay.text_green;
+       c_options->image_overlay.text_blue = options->image_overlay.text_blue;
+       c_options->image_overlay.text_alpha = options->image_overlay.text_alpha;
+
+       if (response_id == GTK_RESPONSE_OK)
                {
-               gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(dialog), &colour);
-               c_options->image_overlay.text_red = colour.red*255;
-               c_options->image_overlay.text_green = colour.green*255;
-               c_options->image_overlay.text_blue = colour.blue*255;
-               c_options->image_overlay.text_alpha = colour.alpha*255;
+               gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(dialog), &color);
+               c_options->image_overlay.text_red = color.red * 255;
+               c_options->image_overlay.text_green = color.green * 255;
+               c_options->image_overlay.text_blue = color.blue * 255;
+               c_options->image_overlay.text_alpha = color.alpha * 255;
                }
-       gtk_widget_destroy(dialog);
-}
 
+       g_object_unref(dialog);
+}
 
-static void image_overlay_set_background_colour_cb(GtkWidget *widget, gpointer)
+static void image_overlay_set_text_color_cb(GtkWidget *widget, gpointer)
 {
        GtkWidget *dialog;
-       GdkRGBA colour;
-
-       dialog = gtk_color_chooser_dialog_new("Image Overlay Background Colour", GTK_WINDOW(gtk_widget_get_toplevel(widget)));
-       colour.red = options->image_overlay.background_red;
-       colour.green = options->image_overlay.background_green;
-       colour.blue = options->image_overlay.background_blue;
-       colour.alpha = options->image_overlay.background_alpha;
-       gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(dialog), &colour);
+       GdkRGBA color;
+
+       dialog = gtk_color_chooser_dialog_new(_("Image Overlay Text Color"), GTK_WINDOW(gtk_widget_get_toplevel(widget)));
+       color.red = options->image_overlay.text_red;
+       color.green = options->image_overlay.text_green;
+       color.blue = options->image_overlay.text_blue;
+       color.alpha = options->image_overlay.text_alpha;
+       gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(dialog), &color);
        gtk_color_chooser_set_use_alpha(GTK_COLOR_CHOOSER(dialog), TRUE);
 
-       if (gtk_dialog_run(GTK_DIALOG(dialog)) != GTK_RESPONSE_CANCEL)
+       g_signal_connect(dialog, "color-activated", G_CALLBACK(text_color_activated_cb), nullptr);
+       g_signal_connect(dialog, "response", G_CALLBACK(text_color_response_cb), nullptr);
+
+       gtk_widget_show(dialog);
+}
+
+static void bg_color_activated_cb(GtkColorChooser *chooser, GdkRGBA *color, gpointer)
+{
+       c_options->image_overlay.background_red = color->red * 255;
+       c_options->image_overlay.background_green = color->green * 255;
+       c_options->image_overlay.background_blue = color->blue * 255;
+       c_options->image_overlay.background_alpha = color->alpha * 255;
+
+       gq_gtk_widget_destroy(GTK_WIDGET(chooser));
+}
+
+static void bg_color_response_cb(GtkDialog *dialog, gint response_id, gpointer)
+{
+       GdkRGBA color;
+
+       c_options->image_overlay.background_red = options->image_overlay.background_red;
+       c_options->image_overlay.background_green = options->image_overlay.background_green;
+       c_options->image_overlay.background_blue = options->image_overlay.background_blue;
+       c_options->image_overlay.background_alpha = options->image_overlay.background_alpha;
+
+       if (response_id == GTK_RESPONSE_OK)
                {
-               gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(dialog), &colour);
-               c_options->image_overlay.background_red = colour.red*255;
-               c_options->image_overlay.background_green = colour.green*255;
-               c_options->image_overlay.background_blue = colour.blue*255;
-               c_options->image_overlay.background_alpha = colour.alpha*255;
+               gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(dialog), &color);
+               c_options->image_overlay.background_red = color.red * 255;
+               c_options->image_overlay.background_green = color.green * 255;
+               c_options->image_overlay.background_blue = color.blue * 255;
+               c_options->image_overlay.background_alpha = color.alpha * 255;
                }
-       gtk_widget_destroy(dialog);
+       gq_gtk_widget_destroy(GTK_WIDGET(dialog));
+}
+
+static void image_overlay_set_background_color_cb(GtkWidget *widget, gpointer)
+{
+       GtkWidget *dialog;
+       GdkRGBA color;
+
+       dialog = gtk_color_chooser_dialog_new(_("Image Overlay Background Color"), GTK_WINDOW(gtk_widget_get_toplevel(widget)));
+       color.red = options->image_overlay.background_red;
+       color.green = options->image_overlay.background_green;
+       color.blue = options->image_overlay.background_blue;
+       color.alpha = options->image_overlay.background_alpha;
+       gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(dialog), &color);
+       gtk_color_chooser_set_use_alpha(GTK_COLOR_CHOOSER(dialog), TRUE);
+
+       g_signal_connect(dialog, "color-activated", G_CALLBACK(bg_color_activated_cb), nullptr);
+       g_signal_connect(dialog, "response", G_CALLBACK(bg_color_response_cb), nullptr);
+
+       gtk_widget_show(dialog);
 }
 
 static void accel_store_populate()
 {
        LayoutWindow *lw;
-       GList *groups, *actions;
+       GList *groups;
+       GList *actions;
        GtkAction *action;
        const gchar *accel_path;
        GtkAccelKey key;
@@ -1536,7 +1635,10 @@ static void accel_store_populate()
                        accel_path = gtk_action_get_accel_path(action);
                        if (accel_path && gtk_accel_map_lookup_entry(accel_path, &key))
                                {
-                               gchar *label, *label2, *tooltip, *accel;
+                               gchar *label;
+                               gchar *label2;
+                               gchar *tooltip;
+                               gchar *accel;
                                g_object_get(action,
                                             "tooltip", &tooltip,
                                             "label", &label,
@@ -1607,7 +1709,8 @@ static void accel_store_edited_cb(GtkCellRendererAccel *, gchar *path_string, gu
        GtkTreeIter iter;
        gchar *acc;
        gchar *accel_path;
-       GtkAccelKey old_key, key;
+       GtkAccelKey old_key;
+       GtkAccelKey key;
        GtkTreePath *path = gtk_tree_path_new_from_string(path_string);
 
        gtk_tree_model_get_iter(model, &iter, path);
@@ -1665,7 +1768,8 @@ void accel_clear_selection(GtkTreeModel *, GtkTreePath *, GtkTreeIter *iter, gpo
 void accel_reset_selection(GtkTreeModel *model, GtkTreePath *, GtkTreeIter *iter, gpointer)
 {
        GtkAccelKey key;
-       gchar *accel_path, *accel;
+       gchar *accel_path;
+       gchar *accel;
 
        gtk_tree_model_get(model, iter, AE_ACCEL, &accel_path, -1);
        gtk_accel_map_lookup_entry(accel_path, &key);
@@ -1705,7 +1809,7 @@ static GtkWidget *scrolled_notebook_page(GtkWidget *notebook, const gchar *title
        GtkWidget *scrolled;
        GtkWidget *viewport;
 
-       scrolled = gtk_scrolled_window_new(nullptr, nullptr);
+       scrolled = gq_gtk_scrolled_window_new(nullptr, nullptr);
        gtk_container_set_border_width(GTK_CONTAINER(scrolled), PREF_PAD_BORDER);
        gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
                                       GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
@@ -1715,11 +1819,11 @@ static GtkWidget *scrolled_notebook_page(GtkWidget *notebook, const gchar *title
 
        viewport = gtk_viewport_new(nullptr, nullptr);
        gtk_viewport_set_shadow_type(GTK_VIEWPORT(viewport), GTK_SHADOW_NONE);
-       gtk_container_add(GTK_CONTAINER(scrolled), viewport);
+       gq_gtk_container_add(GTK_WIDGET(scrolled), viewport);
        gtk_widget_show(viewport);
 
        vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
-       gtk_container_add(GTK_CONTAINER(viewport), vbox);
+       gq_gtk_container_add(GTK_WIDGET(viewport), vbox);
        gtk_widget_show(vbox);
 
        return vbox;
@@ -1756,11 +1860,11 @@ static void help_search_engine_entry_icon_cb(GtkEntry *, GtkEntryIconPosition po
 {
        if (pos == GTK_ENTRY_ICON_PRIMARY)
                {
-               gtk_entry_set_text(GTK_ENTRY(userdata), HELP_SEARCH_ENGINE);
+               gq_gtk_entry_set_text(GTK_ENTRY(userdata), HELP_SEARCH_ENGINE);
                }
        else
                {
-               gtk_entry_set_text(GTK_ENTRY(userdata), "");
+               gq_gtk_entry_set_text(GTK_ENTRY(userdata), "");
                }
 }
 
@@ -1771,12 +1875,12 @@ static void star_rating_star_icon_cb(GtkEntry *, GtkEntryIconPosition pos, GdkEv
        if (pos == GTK_ENTRY_ICON_PRIMARY)
                {
                rating_symbol = g_strdup_printf("U+%X", STAR_RATING_STAR);
-               gtk_entry_set_text(GTK_ENTRY(userdata), rating_symbol);
+               gq_gtk_entry_set_text(GTK_ENTRY(userdata), rating_symbol);
                g_free(rating_symbol);
                }
        else
                {
-               gtk_entry_set_text(GTK_ENTRY(userdata), "U+");
+               gq_gtk_entry_set_text(GTK_ENTRY(userdata), "U+");
                gtk_widget_grab_focus(GTK_WIDGET(userdata));
                gtk_editable_select_region(GTK_EDITABLE(userdata), 2, 2);
                }
@@ -1789,12 +1893,12 @@ static void star_rating_rejected_icon_cb(GtkEntry *, GtkEntryIconPosition pos, G
        if (pos == GTK_ENTRY_ICON_PRIMARY)
                {
                rating_symbol = g_strdup_printf("U+%X", STAR_RATING_REJECTED);
-               gtk_entry_set_text(GTK_ENTRY(userdata), rating_symbol);
+               gq_gtk_entry_set_text(GTK_ENTRY(userdata), rating_symbol);
                g_free(rating_symbol);
                }
        else
                {
-               gtk_entry_set_text(GTK_ENTRY(userdata), "U+");
+               gq_gtk_entry_set_text(GTK_ENTRY(userdata), "U+");
                gtk_widget_grab_focus(GTK_WIDGET(userdata));
                gtk_editable_select_region(GTK_EDITABLE(userdata), 2, 2);
                }
@@ -1813,7 +1917,7 @@ static guint star_rating_symbol_test(GtkWidget *, gpointer data)
        list = gtk_container_get_children(hbox);
 
        hex_code_entry = static_cast<GtkEntry *>(g_list_nth_data(list, 2));
-       hex_code_full = g_strdup(gtk_entry_get_text(hex_code_entry));
+       hex_code_full = g_strdup(gq_gtk_entry_get_text(hex_code_entry));
 
        hex_code = g_strsplit(hex_code_full, "+", 2);
        if (hex_code[0] && hex_code[1])
@@ -1874,7 +1978,9 @@ static void config_tab_general(GtkWidget *notebook)
        GtkWidget *ct_button;
        GtkWidget *table;
        GtkWidget *spin;
-       gint hours, minutes, remainder;
+       gint hours;
+       gint minutes;
+       gint remainder;
        gdouble seconds;
        GtkWidget *star_rating_entry;
        GString *str;
@@ -1958,14 +2064,14 @@ static void config_tab_general(GtkWidget *notebook)
        pref_label_new(hbox, g_strdup(str->str));
        rating_symbol = g_strdup_printf("U+%X", options->star_rating.star);
        star_rating_entry = gtk_entry_new();
-       gtk_entry_set_text(GTK_ENTRY(star_rating_entry), rating_symbol);
-       gtk_box_pack_start(GTK_BOX(hbox), star_rating_entry, FALSE, FALSE, 0);
+       gq_gtk_entry_set_text(GTK_ENTRY(star_rating_entry), rating_symbol);
+       gq_gtk_box_pack_start(GTK_BOX(hbox), star_rating_entry, FALSE, FALSE, 0);
        gtk_entry_set_width_chars(GTK_ENTRY(star_rating_entry), 15);
        gtk_widget_show(star_rating_entry);
        button = pref_button_new(nullptr, nullptr, _("Set"),
                                        G_CALLBACK(star_rating_star_test_cb), hbox);
        gtk_widget_set_tooltip_text(button, _("Display selected character"));
-       gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+       gq_gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
        gtk_widget_show(button);
        gtk_widget_set_tooltip_text(star_rating_entry, _("Hexadecimal representation of a Unicode character. A list of all Unicode characters may be found on the Internet."));
        gtk_entry_set_icon_from_icon_name(GTK_ENTRY(star_rating_entry),
@@ -1990,14 +2096,14 @@ static void config_tab_general(GtkWidget *notebook)
        pref_label_new(hbox, g_strdup(str->str));
        rating_symbol = g_strdup_printf("U+%X", options->star_rating.rejected);
        star_rating_entry = gtk_entry_new();
-       gtk_entry_set_text(GTK_ENTRY(star_rating_entry), rating_symbol);
-       gtk_box_pack_start(GTK_BOX(hbox), star_rating_entry, FALSE, FALSE, 0);
+       gq_gtk_entry_set_text(GTK_ENTRY(star_rating_entry), rating_symbol);
+       gq_gtk_box_pack_start(GTK_BOX(hbox), star_rating_entry, FALSE, FALSE, 0);
        gtk_entry_set_width_chars(GTK_ENTRY(star_rating_entry), 15);
        gtk_widget_show(star_rating_entry);
        button = pref_button_new(nullptr, nullptr, _("Set"),
                                        G_CALLBACK(star_rating_rejected_test_cb), hbox);
        gtk_widget_set_tooltip_text(button, _("Display selected character"));
-       gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+       gq_gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
        gtk_widget_show(button);
        gtk_widget_set_tooltip_text(star_rating_entry, _("Hexadecimal representation of a Unicode character. A list of all Unicode characters may be found on the Internet."));
        gtk_entry_set_icon_from_icon_name(GTK_ENTRY(star_rating_entry),
@@ -2062,11 +2168,33 @@ static void config_tab_general(GtkWidget *notebook)
 
        pref_spacer(group, PREF_PAD_GROUP);
 
-       group = pref_group_new(vbox, FALSE, _("Expand menu and toolbar"), GTK_ORIENTATION_VERTICAL);
+       group = pref_group_new(vbox, FALSE, _("Menu style"), GTK_ORIENTATION_VERTICAL);
+
+       pref_checkbox_new_int(group, _("☰ style menu button (NOTE! Geeqie must be restarted for change to take effect)"),
+                               options->hamburger_menu, &c_options->hamburger_menu);
+       gtk_widget_set_tooltip_text(group, _("Use a â˜° style menu button instead of the classic style across the top of the frame"));
+
+       pref_spacer(group, PREF_PAD_GROUP);
+
+       group = pref_group_new(vbox, FALSE, _("Expand toolbar"), GTK_ORIENTATION_VERTICAL);
 
-       pref_checkbox_new_int(group, _("Expand menu and toolbar (NOTE! Geeqie must be restarted for change to take effect)"),
+       pref_checkbox_new_int(group, _("Expand menu/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"));
+       gtk_widget_set_tooltip_text(group, _("Expand the menu/toolbar to the full width of the window"));
+
+       pref_spacer(group, PREF_PAD_GROUP);
+
+       group = pref_group_new(vbox, FALSE, _("Hide Selectable Bars"), GTK_ORIENTATION_VERTICAL);
+
+       pref_checkbox_new_int(group, _("Menu bar"),
+                               options->selectable_bars.menu_bar, &c_options->selectable_bars.menu_bar);
+
+       pref_checkbox_new_int(group, _("Tool bar"),
+                               options->selectable_bars.tool_bar, &c_options->selectable_bars.tool_bar);
+
+       pref_checkbox_new_int(group, _("Status bar"),
+                               options->selectable_bars.status_bar, &c_options->selectable_bars.status_bar);
+       gtk_widget_set_tooltip_text(group, _("The Hide Selectable Bars menu item (default keystroke is control-backtick) will toggle the display of the bars selected here"));
 
        pref_spacer(group, PREF_PAD_GROUP);
 
@@ -2133,8 +2261,8 @@ static void config_tab_general(GtkWidget *notebook)
        group = pref_group_new(vbox, FALSE, _("On-line help search engine"), GTK_ORIENTATION_VERTICAL);
 
        help_search_engine_entry = gtk_entry_new();
-       gtk_entry_set_text(GTK_ENTRY(help_search_engine_entry), options->help_search_engine);
-       gtk_box_pack_start(GTK_BOX(group), help_search_engine_entry, FALSE, FALSE, 0);
+       gq_gtk_entry_set_text(GTK_ENTRY(help_search_engine_entry), options->help_search_engine);
+       gq_gtk_box_pack_start(GTK_BOX(group), help_search_engine_entry, FALSE, FALSE, 0);
        gtk_widget_show(help_search_engine_entry);
 
        gtk_widget_set_tooltip_text(help_search_engine_entry, _("The format varies between search engines, e.g the format may be:\nhttps://www.search_engine.com/search?q=site:geeqie.org/help\nhttps://www.search_engine.com/?q=site:geeqie.org/help"));
@@ -2246,7 +2374,7 @@ static void save_default_window_layout_cb(GtkWidget *, gpointer)
        layout_valid(&lw);
 
        tmp_id = lw->options.id;
-       lw->options.id = g_strdup("lw_default");
+       lw->options.id = g_strdup("");
 
        default_path = g_build_filename(get_rc_dir(), DEFAULT_WINDOW_LAYOUT, NULL);
        save_default_layout_options_to_file(default_path, options, lw);
@@ -2277,7 +2405,7 @@ static GtkWidget *create_popover(GtkWidget *parent, GtkWidget *child, GtkPositio
 
        popover = gtk_popover_new(parent);
        gtk_popover_set_position(GTK_POPOVER (popover), pos);
-       gtk_container_add (GTK_CONTAINER(popover), child);
+       gq_gtk_container_add(GTK_WIDGET(popover), child);
        gtk_container_set_border_width(GTK_CONTAINER (popover), 6);
        gtk_widget_show (child);
 
@@ -2291,6 +2419,7 @@ static void config_tab_windows(GtkWidget *notebook)
        GtkWidget *group;
        GtkWidget *subgroup;
        GtkWidget *button;
+       GtkWidget *checkbox;
        GtkWidget *ct_button;
        GtkWidget *spin;
 
@@ -2301,13 +2430,13 @@ static void config_tab_windows(GtkWidget *notebook)
        ct_button = pref_checkbox_new_int(group, _("Remember session"),
                                          options->save_window_positions, &c_options->save_window_positions);
 
-       button = pref_checkbox_new_int(group, _("Use saved window positions also for new windows"),
+       checkbox = pref_checkbox_new_int(group, _("Use saved window positions also for new windows"),
                                       options->use_saved_window_positions_for_new_windows, &c_options->use_saved_window_positions_for_new_windows);
-       pref_checkbox_link_sensitivity(ct_button, button);
+       pref_checkbox_link_sensitivity(ct_button, checkbox);
 
-       button = pref_checkbox_new_int(group, _("Remember window workspace"),
+       checkbox = 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_link_sensitivity(ct_button, checkbox);
 
        pref_checkbox_new_int(group, _("Remember tool state (float/hidden)"),
                              options->tools_restore_state, &c_options->tools_restore_state);
@@ -2346,7 +2475,7 @@ static void config_tab_windows(GtkWidget *notebook)
        c_options->fullscreen.screen = options->fullscreen.screen;
        c_options->fullscreen.above = options->fullscreen.above;
        hbox = fullscreen_prefs_selection_new(_("Location:"), &c_options->fullscreen.screen, &c_options->fullscreen.above);
-       gtk_box_pack_start(GTK_BOX(group), hbox, FALSE, FALSE, 0);
+       gq_gtk_box_pack_start(GTK_BOX(group), hbox, FALSE, FALSE, 0);
        gtk_widget_show(hbox);
 
        pref_checkbox_new_int(group, _("Smooth image flip"),
@@ -2355,7 +2484,9 @@ static void config_tab_windows(GtkWidget *notebook)
                              options->fullscreen.disable_saver, &c_options->fullscreen.disable_saver);
 }
 
-#define PRE_FORMATTED_COLUMNS 5
+enum {
+       PRE_FORMATTED_COLUMNS = 5
+};
 static void config_tab_osd(GtkWidget *notebook)
 {
        GtkWidget *hbox;
@@ -2379,7 +2510,7 @@ static void config_tab_osd(GtkWidget *notebook)
 
        scrolled_pre_formatted = osd_new(PRE_FORMATTED_COLUMNS, image_overlay_template_view);
        gtk_widget_set_size_request(scrolled_pre_formatted, 200, 150);
-       gtk_box_pack_start(GTK_BOX(subgroup), scrolled_pre_formatted, FALSE, FALSE, 0);
+       gq_gtk_box_pack_start(GTK_BOX(subgroup), scrolled_pre_formatted, FALSE, FALSE, 0);
        gtk_widget_show(scrolled_pre_formatted);
        gtk_widget_show(subgroup);
 
@@ -2387,18 +2518,18 @@ static void config_tab_osd(GtkWidget *notebook)
 
        pref_label_new(group, _("Image overlay template"));
 
-       scrolled = gtk_scrolled_window_new(nullptr, nullptr);
+       scrolled = gq_gtk_scrolled_window_new(nullptr, nullptr);
        gtk_widget_set_size_request(scrolled, 200, 150);
-       gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
+       gq_gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
        gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
                                                                        GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-       gtk_box_pack_start(GTK_BOX(group), scrolled, TRUE, TRUE, 5);
+       gq_gtk_box_pack_start(GTK_BOX(group), scrolled, TRUE, TRUE, 5);
        gtk_widget_show(scrolled);
 
        gtk_widget_set_tooltip_markup(image_overlay_template_view,
                                        _("Extensive formatting options are shown in the Help file"));
 
-       gtk_container_add(GTK_CONTAINER(scrolled), image_overlay_template_view);
+       gq_gtk_container_add(GTK_WIDGET(scrolled), image_overlay_template_view);
        gtk_widget_show(image_overlay_template_view);
 
        hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_BUTTON_GAP);
@@ -2406,28 +2537,26 @@ static void config_tab_osd(GtkWidget *notebook)
        button = pref_button_new(nullptr, GQ_ICON_SELECT_FONT, _("Font"),
                                 G_CALLBACK(image_overlay_set_font_cb), notebook);
 
-       gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+       gq_gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
        gtk_widget_show(button);
 
-       button = pref_button_new(nullptr, GQ_ICON_SELECT_COLOR, _("Text"),
-                                G_CALLBACK(image_overlay_set_text_colour_cb), nullptr);
-       gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+       button = pref_button_new(nullptr, GQ_ICON_SELECT_COLOR, _("Text"), G_CALLBACK(image_overlay_set_text_color_cb), nullptr);
+       gq_gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
        gtk_widget_show(button);
 
-       button = pref_button_new(nullptr, GQ_ICON_SELECT_COLOR, _("Background"),
-                                G_CALLBACK(image_overlay_set_background_colour_cb), nullptr);
-       gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+       button = pref_button_new(nullptr, GQ_ICON_SELECT_COLOR, _("Background"), G_CALLBACK(image_overlay_set_background_color_cb), nullptr);
+       gq_gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
        gtk_widget_show(button);
-       image_overlay_set_text_colours();
+       image_overlay_set_text_colors();
 
        button = pref_button_new(nullptr, nullptr, _("Defaults"),
                                 G_CALLBACK(image_overlay_default_template_cb), image_overlay_template_view);
-       gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+       gq_gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
        gtk_widget_show(button);
 
        button = pref_button_new(nullptr, GQ_ICON_HELP, _("Help"),
                                 G_CALLBACK(image_overlay_help_cb), nullptr);
-       gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+       gq_gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
        gtk_widget_show(button);
 
        buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(image_overlay_template_view));
@@ -2439,46 +2568,46 @@ static void config_tab_osd(GtkWidget *notebook)
 
        group = pref_group_new(vbox, FALSE, _("Exif, XMP or IPTC tags"), GTK_ORIENTATION_VERTICAL);
        hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
-       gtk_box_pack_start(GTK_BOX(group), hbox, FALSE, FALSE, 0);
+       gq_gtk_box_pack_start(GTK_BOX(group), hbox, FALSE, FALSE, 0);
        gtk_widget_show(hbox);
        label = gtk_label_new(_("%Exif.Image.Orientation%"));
-       gtk_box_pack_start(GTK_BOX(hbox),label, FALSE,FALSE,0);
+       gq_gtk_box_pack_start(GTK_BOX(hbox),label, FALSE,FALSE,0);
        gtk_widget_show(label);
        pref_spacer(group,TRUE);
 
        group = pref_group_new(vbox, FALSE, _("Field separators"), GTK_ORIENTATION_VERTICAL);
        hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
-       gtk_box_pack_start(GTK_BOX(group), hbox, FALSE, FALSE, 0);
+       gq_gtk_box_pack_start(GTK_BOX(group), hbox, FALSE, FALSE, 0);
        gtk_widget_show(hbox);
        label = gtk_label_new(_("Separator shown only if both fields are non-null:\n%formatted.ShutterSpeed%|%formatted.ISOSpeedRating%"));
-       gtk_box_pack_start(GTK_BOX(hbox),label, FALSE,FALSE,0);
+       gq_gtk_box_pack_start(GTK_BOX(hbox),label, FALSE,FALSE,0);
        gtk_widget_show(label);
        pref_spacer(group,TRUE);
 
        group = pref_group_new(vbox, FALSE, _("Field maximum length"), GTK_ORIENTATION_VERTICAL);
        hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
-       gtk_box_pack_start(GTK_BOX(group), hbox, FALSE, FALSE, 0);
+       gq_gtk_box_pack_start(GTK_BOX(group), hbox, FALSE, FALSE, 0);
        gtk_widget_show(hbox);
        label = gtk_label_new(_("%path:39%"));
-       gtk_box_pack_start(GTK_BOX(hbox),label, FALSE,FALSE,0);
+       gq_gtk_box_pack_start(GTK_BOX(hbox),label, FALSE,FALSE,0);
        gtk_widget_show(label);
        pref_spacer(group,TRUE);
 
        group = pref_group_new(vbox, FALSE, _("Pre- and post- text"), GTK_ORIENTATION_VERTICAL);
        hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
-       gtk_box_pack_start(GTK_BOX(group), hbox, FALSE, FALSE, 0);
+       gq_gtk_box_pack_start(GTK_BOX(group), hbox, FALSE, FALSE, 0);
        gtk_widget_show(hbox);
        label = gtk_label_new(_("Text shown only if the field is non-null:\n%formatted.Aperture:F no. * setting%\n %formatted.Aperture:10:F no. * setting%"));
-       gtk_box_pack_start(GTK_BOX(hbox),label, FALSE,FALSE,0);
+       gq_gtk_box_pack_start(GTK_BOX(hbox),label, FALSE,FALSE,0);
        gtk_widget_show(label);
        pref_spacer(group,TRUE);
 
        group = pref_group_new(vbox, FALSE, _("Pango markup"), GTK_ORIENTATION_VERTICAL);
        hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
-       gtk_box_pack_start(GTK_BOX(group), hbox, FALSE, FALSE, 0);
+       gq_gtk_box_pack_start(GTK_BOX(group), hbox, FALSE, FALSE, 0);
        gtk_widget_show(hbox);
        label = gtk_label_new(_("<b>bold</b>\n<u>underline</u>\n<i>italic</i>\n<s>strikethrough</s>"));
-       gtk_box_pack_start(GTK_BOX(hbox),label, FALSE,FALSE,0);
+       gq_gtk_box_pack_start(GTK_BOX(hbox),label, FALSE,FALSE,0);
        gtk_widget_show(label);
 }
 
@@ -2597,8 +2726,8 @@ static void config_tab_files(GtkWidget *notebook)
        group = pref_group_new(vbox, FALSE, _("Grouping sidecar extensions"), GTK_ORIENTATION_VERTICAL);
 
        sidecar_ext_entry = gtk_entry_new();
-       gtk_entry_set_text(GTK_ENTRY(sidecar_ext_entry), options->sidecar.ext);
-       gtk_box_pack_start(GTK_BOX(group), sidecar_ext_entry, FALSE, FALSE, 0);
+       gq_gtk_entry_set_text(GTK_ENTRY(sidecar_ext_entry), options->sidecar.ext);
+       gq_gtk_box_pack_start(GTK_BOX(group), sidecar_ext_entry, FALSE, FALSE, 0);
        gtk_widget_show(sidecar_ext_entry);
 
        group = pref_group_new(vbox, TRUE, _("File types"), GTK_ORIENTATION_VERTICAL);
@@ -2608,10 +2737,10 @@ static void config_tab_files(GtkWidget *notebook)
                         G_CALLBACK(filter_disable_cb), frame);
        gtk_widget_set_sensitive(frame, !options->file_filter.disable);
 
-       scrolled = gtk_scrolled_window_new(nullptr, nullptr);
-       gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
+       scrolled = gq_gtk_scrolled_window_new(nullptr, nullptr);
+       gq_gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
        gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
-       gtk_box_pack_start(GTK_BOX(group), scrolled, TRUE, TRUE, 0);
+       gq_gtk_box_pack_start(GTK_BOX(group), scrolled, TRUE, TRUE, 0);
        gtk_widget_show(scrolled);
 
        filter_store = gtk_list_store_new(1, G_TYPE_POINTER);
@@ -2718,24 +2847,24 @@ static void config_tab_files(GtkWidget *notebook)
        gtk_tree_view_column_set_sort_column_id(column, FILETYPES_COLUMN_SIDECAR);
 
        filter_store_populate();
-       gtk_container_add(GTK_CONTAINER(scrolled), filter_view);
+       gq_gtk_container_add(GTK_WIDGET(scrolled), filter_view);
        gtk_widget_show(filter_view);
 
        hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_BUTTON_GAP);
 
        button = pref_button_new(nullptr, nullptr, _("Defaults"),
                                 G_CALLBACK(filter_default_cb), filter_view);
-       gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+       gq_gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
        gtk_widget_show(button);
 
        button = pref_button_new(nullptr, GQ_ICON_REMOVE, _("Remove"),
                                 G_CALLBACK(filter_remove_cb), filter_view);
-       gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+       gq_gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
        gtk_widget_show(button);
 
        button = pref_button_new(nullptr, GQ_ICON_ADD, _("Add"),
                                 G_CALLBACK(filter_add_cb), filter_view);
-       gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+       gq_gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
        gtk_widget_show(button);
 }
 
@@ -2895,7 +3024,9 @@ struct KeywordFindData
        guint idle_id; /* event source id */
 };
 
-#define KEYWORD_DIALOG_WIDTH 400
+enum {
+       KEYWORD_DIALOG_WIDTH = 400
+};
 
 static void keywords_find_folder(KeywordFindData *kfd, FileData *dir_fd)
 {
@@ -2942,7 +3073,7 @@ static void keywords_find_finish(KeywordFindData *kfd)
 {
        keywords_find_reset(kfd);
 
-       gtk_entry_set_text(GTK_ENTRY(kfd->progress), _("done"));
+       gq_gtk_entry_set_text(GTK_ENTRY(kfd->progress), _("done"));
        gtk_spinner_stop(GTK_SPINNER(kfd->spinner));
 
        gtk_widget_set_sensitive(kfd->group, TRUE);
@@ -2987,13 +3118,14 @@ static gboolean keywords_find_file(gpointer data)
                        keywords = keywords->next;
                        }
 
-               gtk_entry_set_text(GTK_ENTRY(kfd->progress), fd->path);
+               gq_gtk_entry_set_text(GTK_ENTRY(kfd->progress), fd->path);
                file_data_unref(fd);
                g_list_free_full(keywords, g_free);
 
                return (G_SOURCE_CONTINUE);
                }
-       else if (kfd->list_dir)
+
+       if (kfd->list_dir)
                {
                FileData *fd;
 
@@ -3019,7 +3151,7 @@ static void keywords_find_start_cb(GenericDialog *, gpointer data)
 
        if (kfd->list || !gtk_widget_get_sensitive(kfd->button_start)) return;
 
-       path = remove_trailing_slash((gtk_entry_get_text(GTK_ENTRY(kfd->entry))));
+       path = remove_trailing_slash((gq_gtk_entry_get_text(GTK_ENTRY(kfd->entry))));
        parse_out_relatives(path);
 
        if (!isdir(path))
@@ -3080,7 +3212,7 @@ static void keywords_find_dialog(GtkWidget *widget, const gchar *path)
 
        label = tab_completion_new(&kfd->entry, path, nullptr, nullptr, nullptr, nullptr);
        tab_completion_add_select_button(kfd->entry,_("Select folder") , TRUE);
-       gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
+       gq_gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
        gtk_widget_show(label);
 
        pref_checkbox_new_int(kfd->group, _("Include subfolders"), FALSE, &kfd->recurse);
@@ -3091,12 +3223,12 @@ static void keywords_find_dialog(GtkWidget *widget, const gchar *path)
        kfd->progress = gtk_entry_new();
        gtk_widget_set_can_focus(kfd->progress, FALSE);
        gtk_editable_set_editable(GTK_EDITABLE(kfd->progress), FALSE);
-       gtk_entry_set_text(GTK_ENTRY(kfd->progress), _("click start to begin"));
-       gtk_box_pack_start(GTK_BOX(hbox), kfd->progress, TRUE, TRUE, 0);
+       gq_gtk_entry_set_text(GTK_ENTRY(kfd->progress), _("click start to begin"));
+       gq_gtk_box_pack_start(GTK_BOX(hbox), kfd->progress, TRUE, TRUE, 0);
        gtk_widget_show(kfd->progress);
 
        kfd->spinner = gtk_spinner_new();
-       gtk_box_pack_start(GTK_BOX(hbox), kfd->spinner, FALSE, FALSE, 0);
+       gq_gtk_box_pack_start(GTK_BOX(hbox), kfd->spinner, FALSE, FALSE, 0);
        gtk_widget_show(kfd->spinner);
 
        kfd->list = nullptr;
@@ -3114,7 +3246,8 @@ static void keywords_find_cb(GtkWidget *widget, gpointer)
 
 static void config_tab_keywords_save()
 {
-       GtkTextIter start, end;
+       GtkTextIter start;
+       GtkTextIter end;
        GtkTextBuffer *buffer;
        GList *kw_list = nullptr;
        GList *work;
@@ -3181,8 +3314,8 @@ static void config_tab_keywords(GtkWidget *notebook)
 
        keyword_text = gtk_text_view_new();
        gtk_widget_set_size_request(keyword_text, 20, 20);
-       scrolled = gtk_scrolled_window_new(nullptr, nullptr);
-       gtk_box_pack_start(GTK_BOX(group), scrolled, TRUE, TRUE, 0);
+       scrolled = gq_gtk_scrolled_window_new(nullptr, nullptr);
+       gq_gtk_box_pack_start(GTK_BOX(group), scrolled, TRUE, TRUE, 0);
        gtk_widget_show(scrolled);
 
 #ifdef HAVE_SPELL
@@ -3193,7 +3326,7 @@ static void config_tab_keywords(GtkWidget *notebook)
                }
 #endif
 
-       gtk_container_add(GTK_CONTAINER(scrolled), keyword_text);
+       gq_gtk_container_add(GTK_WIDGET(scrolled), keyword_text);
        gtk_widget_show(keyword_text);
 
        gtk_text_view_set_editable(GTK_TEXT_VIEW(keyword_text), TRUE);
@@ -3277,7 +3410,7 @@ static void add_intent_menu(GtkWidget *table, gint column, gint row, const gchar
        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_SHRINK, static_cast<GtkAttachOptions>(0), 0, 0);
+       gq_gtk_grid_attach(GTK_GRID(table), combo, column + 1, column + 2, row, row + 1, GTK_SHRINK, static_cast<GtkAttachOptions>(0), 0, 0);
        gtk_widget_show(combo);
 }
 #endif
@@ -3299,7 +3432,7 @@ static void config_tab_color(GtkWidget *notebook)
 #endif
 
        table = pref_table_new(group, 3, COLOR_PROFILE_INPUTS + 1, FALSE, FALSE);
-       gtk_table_set_col_spacings(GTK_TABLE(table), PREF_PAD_GAP);
+       gtk_grid_set_column_spacing(GTK_GRID(table), PREF_PAD_GAP);
 
        label = pref_table_label(table, 0, 0, _("Type"), GTK_ALIGN_START);
        pref_label_bold(label, TRUE, FALSE);
@@ -3323,18 +3456,16 @@ static void config_tab_color(GtkWidget *notebook)
                gtk_entry_set_max_length(GTK_ENTRY(entry), EDITOR_NAME_MAX_LENGTH);
                if (options->color_profile.input_name[i])
                        {
-                       gtk_entry_set_text(GTK_ENTRY(entry), options->color_profile.input_name[i]);
+                       gq_gtk_entry_set_text(GTK_ENTRY(entry), options->color_profile.input_name[i]);
                        }
-               gtk_table_attach(GTK_TABLE(table), entry, 1, 2, i + 1, i + 2,
-                                static_cast<GtkAttachOptions>(GTK_FILL | GTK_EXPAND), static_cast<GtkAttachOptions>(0), 0, 0);
+               gq_gtk_grid_attach(GTK_GRID(table), entry, 1, 2, i + 1, i + 2, static_cast<GtkAttachOptions>(GTK_FILL | GTK_EXPAND), static_cast<GtkAttachOptions>(0), 0, 0);
                gtk_widget_show(entry);
                color_profile_input_name_entry[i] = entry;
 
                tabcomp = tab_completion_new(&entry, options->color_profile.input_file[i], nullptr, ".icc", "ICC Files", nullptr);
                tab_completion_add_select_button(entry, _("Select color profile"), FALSE);
                gtk_widget_set_size_request(entry, 160, -1);
-               gtk_table_attach(GTK_TABLE(table), tabcomp, 2, 3, i + 1, i + 2,
-                                static_cast<GtkAttachOptions>(GTK_FILL | GTK_EXPAND), static_cast<GtkAttachOptions>(0), 0, 0);
+               gq_gtk_grid_attach(GTK_GRID(table), tabcomp, 2, 3, i + 1, i + 2, static_cast<GtkAttachOptions>(GTK_FILL | GTK_EXPAND), static_cast<GtkAttachOptions>(0), 0, 0);
                gtk_widget_show(tabcomp);
                color_profile_input_file_entry[i] = entry;
                }
@@ -3356,9 +3487,7 @@ static void config_tab_color(GtkWidget *notebook)
 #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,
-                        static_cast<GtkAttachOptions>(GTK_FILL | GTK_EXPAND), static_cast<GtkAttachOptions>(0), 0, 0);
+       gq_gtk_grid_attach(GTK_GRID(table), tabcomp, 1, 2, 0, 1, static_cast<GtkAttachOptions>(GTK_FILL | GTK_EXPAND), static_cast<GtkAttachOptions>(0), 0, 0);
 
        gtk_widget_show(tabcomp);
 }
@@ -3429,7 +3558,7 @@ static void config_tab_behavior(GtkWidget *notebook)
 
        tabcomp = tab_completion_new(&safe_delete_path_entry, options->file_ops.safe_delete_path, nullptr, nullptr, nullptr, nullptr);
        tab_completion_add_select_button(safe_delete_path_entry, nullptr, TRUE);
-       gtk_box_pack_start(GTK_BOX(hbox), tabcomp, TRUE, TRUE, 0);
+       gq_gtk_box_pack_start(GTK_BOX(hbox), tabcomp, TRUE, TRUE, 0);
        gtk_widget_show(tabcomp);
 
        hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_BUTTON_GAP);
@@ -3441,12 +3570,12 @@ static void config_tab_behavior(GtkWidget *notebook)
        gtk_widget_set_tooltip_markup(spin, _("Set to 0 for unlimited size"));
        button = pref_button_new(nullptr, nullptr, _("View"),
                                 G_CALLBACK(safe_delete_view_cb), nullptr);
-       gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+       gq_gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
        gtk_widget_show(button);
 
        button = pref_button_new(nullptr, GQ_ICON_CLEAR, nullptr,
                                 G_CALLBACK(safe_delete_clear_cb), nullptr);
-       gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+       gq_gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
 
        c_options->file_ops.no_trash = options->file_ops.no_trash;
        c_options->file_ops.use_system_trash = options->file_ops.use_system_trash;
@@ -3558,6 +3687,14 @@ static void config_tab_behavior(GtkWidget *notebook)
 
        pref_spin_new_int(group, _("Log Window max. lines:"), nullptr,
                          1, 99999, 1, options->log_window_lines, &options->log_window_lines);
+
+       hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
+       pref_label_new(hbox, _("Log Window F1 command: "));
+       log_window_f1_entry = gtk_entry_new();
+       gq_gtk_entry_set_text(GTK_ENTRY(log_window_f1_entry), options->log_window.action);
+       gq_gtk_box_pack_start(GTK_BOX(hbox), log_window_f1_entry, FALSE, FALSE, 0);
+       gtk_entry_set_width_chars(GTK_ENTRY(log_window_f1_entry), 15);
+       gtk_widget_show(log_window_f1_entry);
 #endif
 }
 
@@ -3615,10 +3752,10 @@ static void config_tab_accelerators(GtkWidget *notebook)
 
        group = pref_group_new(vbox, TRUE, _("Accelerators"), GTK_ORIENTATION_VERTICAL);
 
-       scrolled = gtk_scrolled_window_new(nullptr, nullptr);
-       gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
+       scrolled = gq_gtk_scrolled_window_new(nullptr, nullptr);
+       gq_gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
        gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
-       gtk_box_pack_start(GTK_BOX(group), scrolled, TRUE, TRUE, 0);
+       gq_gtk_box_pack_start(GTK_BOX(group), scrolled, TRUE, TRUE, 0);
        gtk_widget_show(scrolled);
 
        accel_store = gtk_tree_store_new(4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
@@ -3693,25 +3830,25 @@ static void config_tab_accelerators(GtkWidget *notebook)
        gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(accel_view), accel_search_function_cb, nullptr, nullptr);
 
        accel_store_populate();
-       gtk_container_add(GTK_CONTAINER(scrolled), accel_view);
+       gq_gtk_container_add(GTK_WIDGET(scrolled), accel_view);
        gtk_widget_show(accel_view);
 
        hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_BUTTON_GAP);
 
        button = pref_button_new(nullptr, nullptr, _("Defaults"),
                                 G_CALLBACK(accel_default_cb), accel_view);
-       gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+       gq_gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
        gtk_widget_show(button);
 
        button = pref_button_new(nullptr, nullptr, _("Reset selected"),
                                 G_CALLBACK(accel_reset_cb), accel_view);
        gtk_widget_set_tooltip_text(button, _("Will only reset changes made before the settings are saved"));
-       gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+       gq_gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
        gtk_widget_show(button);
 
        button = pref_button_new(nullptr, nullptr, _("Clear selected"),
                                 G_CALLBACK(accel_clear_cb), accel_view);
-       gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+       gq_gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
        gtk_widget_show(button);
 }
 
@@ -3727,7 +3864,7 @@ static void config_tab_toolbar_main(GtkWidget *notebook)
        vbox = scrolled_notebook_page(notebook, _("Toolbar Main"));
 
        toolbardata = toolbar_select_new(lw, TOOLBAR_MAIN);
-       gtk_box_pack_start(GTK_BOX(vbox), toolbardata, TRUE, TRUE, 0);
+       gq_gtk_box_pack_start(GTK_BOX(vbox), toolbardata, TRUE, TRUE, 0);
        gtk_widget_show(vbox);
 }
 
@@ -3743,7 +3880,7 @@ static void config_tab_toolbar_status(GtkWidget *notebook)
        vbox = scrolled_notebook_page(notebook, _("Toolbar Status"));
 
        toolbardata = toolbar_select_new(lw, TOOLBAR_STATUS);
-       gtk_box_pack_start(GTK_BOX(vbox), toolbardata, TRUE, TRUE, 0);
+       gq_gtk_box_pack_start(GTK_BOX(vbox), toolbardata, TRUE, TRUE, 0);
        gtk_widget_show(vbox);
 }
 
@@ -3755,18 +3892,20 @@ static gint extension_sort_cb(gconstpointer a, gconstpointer b)
 
 static void config_tab_advanced(GtkWidget *notebook)
 {
-       GtkWidget *vbox;
-       GtkWidget *group;
-       GSList *formats_list;
-       GList *extensions_list = nullptr;
        gchar **extensions;
-       GtkWidget *tabcomp;
        GdkPixbufFormat *fm;
        gint i;
+       GList *extensions_list = nullptr;
+       GSList *formats_list;
        GString *types_string = g_string_new(nullptr);
-       GtkWidget *types_string_label;
-       GtkWidget *threads_string_label;
+       GtkWidget *alternate_checkbox;
        GtkWidget *dupes_threads_spin;
+       GtkWidget *group;
+       GtkWidget *subgroup;
+       GtkWidget *tabcomp;
+       GtkWidget *threads_string_label;
+       GtkWidget *types_string_label;
+       GtkWidget *vbox;
 
        vbox = scrolled_notebook_page(notebook, _("Advanced"));
        group = pref_group_new(vbox, FALSE, _("External preview extraction"), GTK_ORIENTATION_VERTICAL);
@@ -3818,14 +3957,14 @@ static void config_tab_advanced(GtkWidget *notebook)
        external_preview_select_entry = gtk_entry_new();
        tabcomp = tab_completion_new(&external_preview_select_entry, options->external_preview.select, nullptr, nullptr, nullptr, nullptr);
        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);
+       gq_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, nullptr, nullptr, nullptr, nullptr);
        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);
+       gq_gtk_box_pack_start(GTK_BOX(group), tabcomp, TRUE, TRUE, 0);
        gtk_widget_show(tabcomp);
 
        gtk_widget_show(vbox);
@@ -3839,13 +3978,27 @@ static void config_tab_advanced(GtkWidget *notebook)
        pref_line(vbox, PREF_PAD_SPACE);
        group = pref_group_new(vbox, FALSE, _("Thread pool limits"), GTK_ORIENTATION_VERTICAL);
 
-       threads_string_label = pref_label_new(group, "This option limits the number of threads (or cpu cores)\nthat Geeqie will use when running duplicate checks. The default value is 0, which means all available cores will be used.");
+       threads_string_label = pref_label_new(group, "This option limits the number of threads (or cpu cores) that Geeqie will use when running duplicate checks.\nThe value 0 means all available cores will be used.");
        gtk_label_set_line_wrap(GTK_LABEL(threads_string_label), TRUE);
 
        pref_spacer(vbox, PREF_PAD_GROUP);
 
        dupes_threads_spin = pref_spin_new_int(vbox, _("Duplicate check:"), _("max. threads"), 0, get_cpu_cores(), 1, options->threads.duplicates, &c_options->threads.duplicates);
        gtk_widget_set_tooltip_markup(dupes_threads_spin, _("Set to 0 for unlimited"));
+
+       pref_spacer(group, PREF_PAD_GROUP);
+
+       pref_line(vbox, PREF_PAD_SPACE);
+
+       group = pref_group_new(vbox, FALSE, _("Alternate similarity alogorithm"), GTK_ORIENTATION_VERTICAL);
+
+       alternate_checkbox = pref_checkbox_new_int(group, _("Enable alternate similarity algorithm"), options->alternate_similarity_algorithm.enabled, &c_options->alternate_similarity_algorithm.enabled);
+
+       subgroup = pref_box_new(group, FALSE, GTK_ORIENTATION_VERTICAL, PREF_PAD_GAP);
+       pref_checkbox_link_sensitivity(alternate_checkbox, subgroup);
+
+       alternate_checkbox = pref_checkbox_new_int(subgroup, _("Use grayscale"), options->alternate_similarity_algorithm.grayscale, &c_options->alternate_similarity_algorithm.grayscale);
+       gtk_widget_set_tooltip_text(alternate_checkbox, _("Reduce fingerprint to grayscale"));
 }
 
 /* stereo tab */
@@ -3936,7 +4089,7 @@ static void config_window_create(LayoutWindow *lw)
 
        if (!c_options) c_options = init_options(nullptr);
 
-       configwindow = window_new(GTK_WINDOW_TOPLEVEL, "preferences", PIXBUF_INLINE_ICON_CONFIG, nullptr, _("Preferences"));
+       configwindow = window_new("preferences", PIXBUF_INLINE_ICON_CONFIG, nullptr, _("Preferences"));
        DEBUG_NAME(configwindow);
        gtk_window_set_type_hint(GTK_WINDOW(configwindow), GDK_WINDOW_TYPE_HINT_DIALOG);
        g_signal_connect(G_OBJECT(configwindow), "delete_event",
@@ -3944,7 +4097,7 @@ static void config_window_create(LayoutWindow *lw)
        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);
+               gq_gtk_window_move(GTK_WINDOW(configwindow), lw->options.preferences_window.x, lw->options.preferences_window.y);
                }
        else
                {
@@ -3954,13 +4107,13 @@ static void config_window_create(LayoutWindow *lw)
        gtk_container_set_border_width(GTK_CONTAINER(configwindow), PREF_PAD_BORDER);
 
        win_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, PREF_PAD_SPACE);
-       gtk_container_add(GTK_CONTAINER(configwindow), win_vbox);
+       gq_gtk_container_add(GTK_WIDGET(configwindow), win_vbox);
        gtk_widget_show(win_vbox);
 
        notebook = gtk_notebook_new();
        gtk_notebook_set_tab_pos(GTK_NOTEBOOK(notebook), GTK_POS_LEFT);
        gtk_notebook_set_scrollable(GTK_NOTEBOOK(notebook), TRUE);
-       gtk_box_pack_start(GTK_BOX(win_vbox), notebook, TRUE, TRUE, 0);
+       gq_gtk_box_pack_start(GTK_BOX(win_vbox), notebook, TRUE, TRUE, 0);
 
        config_tab_general(notebook);
        config_tab_image(notebook);
@@ -3982,18 +4135,18 @@ static void config_window_create(LayoutWindow *lw)
        hbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
        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);
+       gq_gtk_box_pack_end(GTK_BOX(win_vbox), hbox, FALSE, FALSE, 0);
        gtk_widget_show(hbox);
 
        button = pref_button_new(nullptr, GQ_ICON_HELP, _("Help"),
                                 G_CALLBACK(config_window_help_cb), notebook);
-       gtk_container_add(GTK_CONTAINER(hbox), button);
+       gq_gtk_container_add(GTK_WIDGET(hbox), button);
        gtk_widget_set_can_default(button, TRUE);
        gtk_widget_show(button);
 
        button = pref_button_new(nullptr, GQ_ICON_OK, "OK",
                                 G_CALLBACK(config_window_ok_cb), notebook);
-       gtk_container_add(GTK_CONTAINER(hbox), button);
+       gq_gtk_container_add(GTK_WIDGET(hbox), button);
        gtk_widget_set_can_default(button, TRUE);
        gtk_widget_grab_default(button);
        gtk_widget_show(button);
@@ -4002,7 +4155,7 @@ static void config_window_create(LayoutWindow *lw)
 
        button = pref_button_new(nullptr, GQ_ICON_CANCEL, _("Cancel"),
                                 G_CALLBACK(config_window_close_cb), nullptr);
-       gtk_container_add(GTK_CONTAINER(hbox), button);
+       gq_gtk_container_add(GTK_WIDGET(hbox), button);
        gtk_widget_set_can_default(button, TRUE);
        gtk_widget_show(button);
 
@@ -4061,8 +4214,7 @@ void show_about_window(LayoutWindow *lw)
        gsize size;
        guint32 flags;
 
-       copyright = g_string_new(nullptr);
-       copyright = g_string_append(copyright, "This program comes with absolutely no warranty.\nGNU General Public License, version 2 or later.\nSee https://www.gnu.org/licenses/old-licenses/gpl-2.0.html\n\n");
+       copyright = g_string_new("This program comes with absolutely no warranty.\nGNU General Public License, version 2 or later.\nSee https://www.gnu.org/licenses/old-licenses/gpl-2.0.html\n\n");
 
        timezone_path = g_build_filename(get_rc_dir(), TIMEZONE_DATABASE_FILE, NULL);
        if (g_file_test(timezone_path, G_FILE_TEST_EXISTS))
@@ -4080,6 +4232,8 @@ void show_about_window(LayoutWindow *lw)
                }
        g_free(timezone_path);
 
+       copyright = g_string_append(copyright, "\n\nSome icons by https://www.flaticon.com");
+
        in_stream_authors = g_resources_open_stream(GQ_RESOURCE_PATH_CREDITS "/authors", G_RESOURCE_LOOKUP_FLAGS_NONE, nullptr);
 
        data_stream = g_data_input_stream_new(in_stream_authors);
@@ -4144,7 +4298,7 @@ void show_about_window(LayoutWindow *lw)
        g_object_unref(in_stream_translators);
 }
 
-static void image_overlay_set_text_colours()
+static void image_overlay_set_text_colors()
 {
        c_options->image_overlay.text_red = options->image_overlay.text_red;
        c_options->image_overlay.text_green = options->image_overlay.text_green;
@@ -4263,7 +4417,7 @@ static void timezone_database_install_cb(GtkWidget *widget, gpointer data)
                generic_dialog_add_message(tz->gd, GQ_ICON_DIALOG_INFO, _("Downloading timezone database"), nullptr, FALSE);
 
                tz->progress = gtk_progress_bar_new();
-               gtk_box_pack_start(GTK_BOX(tz->gd->vbox), tz->progress, FALSE, FALSE, 0);
+               gq_gtk_box_pack_start(GTK_BOX(tz->gd->vbox), tz->progress, FALSE, FALSE, 0);
                gtk_widget_show(tz->progress);
 
                gtk_widget_show(tz->gd->dialog);