Tmp fix #397: GPU acceleration
[geeqie.git] / src / preferences.c
index 5d6db5d..e298cc8 100644 (file)
@@ -117,7 +117,7 @@ gchar *format_class_list[] = {
        N_("Metadata"),
        N_("Video"),
        N_("Collection"),
-       N_("Pdf")
+       N_("Document")
        };
 
 /* config memory values */
@@ -378,6 +378,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->dnd_default_action = c_options->dnd_default_action;
 
        options->metadata.save_in_image_file = c_options->metadata.save_in_image_file;
        options->metadata.save_legacy_IPTC = c_options->metadata.save_legacy_IPTC;
@@ -449,6 +450,9 @@ static void config_window_apply(void)
                }
 #endif
 
+       options->mouse_button_8 = c_options->mouse_button_8;
+       options->mouse_button_9 = c_options->mouse_button_9;
+
        config_tab_keywords_save();
 
        image_options_sync();
@@ -461,7 +465,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();
+       toolbar_apply(TOOLBAR_MAIN);
+       toolbar_apply(TOOLBAR_STATUS);
 }
 
 /*
@@ -495,6 +500,7 @@ static void config_window_help_cb(GtkWidget *widget, gpointer data)
        "GuideOptionsColor.html",
        "GuideOptionsStereo.html",
        "GuideOptionsBehavior.html",
+       "GuideOptionsToolbar.html",
        "GuideOptionsToolbar.html"
        };
 
@@ -509,24 +515,14 @@ static gboolean config_window_delete(GtkWidget *widget, GdkEventAny *event, gpoi
 }
 
 static void config_window_ok_cb(GtkWidget *widget, gpointer data)
-{
-       config_window_apply();
-       config_window_close_cb(NULL, NULL);
-}
-
-static void config_window_apply_cb(GtkWidget *widget, gpointer data)
 {
        LayoutWindow *lw;
        lw = layout_window_list->data;
 
        config_window_apply();
        layout_util_sync(lw);
-}
-
-static void config_window_save_cb(GtkWidget *widget, gpointer data)
-{
-       config_window_apply();
        save_options(options);
+       config_window_close_cb(NULL, NULL);
 }
 
 /*
@@ -557,6 +553,24 @@ static void quality_menu_cb(GtkWidget *combo, gpointer data)
                }
 }
 
+static void dnd_default_action_selection_menu_cb(GtkWidget *combo, gpointer data)
+{
+       gint *option = data;
+
+       switch (gtk_combo_box_get_active(GTK_COMBO_BOX(combo)))
+               {
+               case 0:
+               default:
+                       *option = DND_ACTION_ASK;
+                       break;
+               case 1:
+                       *option = DND_ACTION_COPY;
+                       break;
+               case 2:
+                       *option = DND_ACTION_MOVE;
+                       break;
+               }
+}
 static void clipboard_selection_menu_cb(GtkWidget *combo, gpointer data)
 {
        gint *option = data;
@@ -599,8 +613,34 @@ 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_EXPAND | GTK_FILL, 0, 0, 0);
+       gtk_table_attach(GTK_TABLE(table), combo, column + 1, column + 2, row, row + 1, GTK_SHRINK, 0, 0, 0);
+       gtk_widget_show(combo);
+}
+
+static void add_dnd_default_action_selection_menu(GtkWidget *table, gint column, gint row, const gchar *text, DnDAction option, DnDAction *option_c)
+{
+       GtkWidget *combo;
+       gint current = 0;
+
+       *option_c = option;
+
+       pref_table_label(table, column, row, text, 0.0);
+
+       combo = gtk_combo_box_text_new();
+
+       gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), _("Ask"));
+       if (option == DND_ACTION_ASK) current = 0;
+       gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), _("Copy"));
+       if (option == DND_ACTION_COPY) current = 1;
+       gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), _("Move"));
+       if (option == DND_ACTION_MOVE) current = 2;
+
+       gtk_combo_box_set_active(GTK_COMBO_BOX(combo), current);
+
+       g_signal_connect(G_OBJECT(combo), "changed",
+                        G_CALLBACK(dnd_default_action_selection_menu_cb), option_c);
+
+       gtk_table_attach(GTK_TABLE(table), combo, column + 1, column + 2, row, row + 1, GTK_SHRINK, 0, 0, 0);
        gtk_widget_show(combo);
 }
 
@@ -626,8 +666,148 @@ 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_EXPAND | GTK_FILL, 0, 0, 0);
+       gtk_table_attach(GTK_TABLE(table), combo, column + 1, column + 2, row, row + 1, GTK_SHRINK, 0, 0, 0);
+       gtk_widget_show(combo);
+}
+
+typedef struct _UseableMouseItems UseableMouseItems;
+struct _UseableMouseItems
+{
+       gchar *name; /* GtkActionEntry terminology */
+       gchar *label;
+       gchar *stock_id;
+};
+
+static const UseableMouseItems useable_mouse_items[] = {
+       {"", "", NULL},
+       {"FirstImage",  N_("First Image"), GTK_STOCK_GOTO_TOP},
+       {"PrevImage",   N_("Previous Image"), GTK_STOCK_GO_UP},
+       {"NextImage",   N_("Next Image"), GTK_STOCK_GO_DOWN},
+       {"LastImage",   N_("Last Image"), GTK_STOCK_GOTO_BOTTOM},
+       {"Back",        N_("Back"), GTK_STOCK_GO_BACK},
+       {"Forward",     N_("Forward"), GTK_STOCK_GO_FORWARD},
+       {"Home",        N_("Home"), GTK_STOCK_HOME},
+       {"Up",  N_("Up"), GTK_STOCK_GO_UP},
+       {"FirstPage",   N_("First page"), GTK_STOCK_MEDIA_PREVIOUS},
+       {"LastPage",    N_("Last Page"), GTK_STOCK_MEDIA_NEXT},
+       {"NextPage",    N_("Next page"), GTK_STOCK_MEDIA_FORWARD},
+       {"PrevPage",    N_("Previous Page"), GTK_STOCK_MEDIA_REWIND},
+       {"NewWindow",   N_("New _window"), GTK_STOCK_NEW},
+       {"NewCollection",       N_("New collection"), GTK_STOCK_INDEX},
+       {"OpenCollection",      N_("Open collection"), GTK_STOCK_OPEN},
+       {"Search",      N_("Search"), GTK_STOCK_FIND},
+       {"FindDupes",   N_("Find duplicates"), GTK_STOCK_FIND},
+       {"NewFolder",   N_("New folder"),GTK_STOCK_DIRECTORY},
+       {"Copy",        N_("Copy"), GTK_STOCK_COPY},
+       {"Move",        N_("Move"), PIXBUF_INLINE_ICON_MOVE},
+       {"Rename",      N_("Rename"), PIXBUF_INLINE_ICON_RENAME},
+       {"Delete",      N_("Delete"), GTK_STOCK_DELETE},
+       {"CloseWindow", N_("Close Window"), GTK_STOCK_CLOSE},
+       {"PanView",     N_("Pan view"), PIXBUF_INLINE_ICON_PANORAMA},
+       {"SelectAll",   N_("Select all"), PIXBUF_INLINE_ICON_SELECT_ALL},
+       {"SelectNone",  N_("Select none"), PIXBUF_INLINE_ICON_SELECT_NONE},
+       {"SelectInvert",        N_("Select invert"), PIXBUF_INLINE_ICON_SELECT_INVERT},
+       {"ShowFileFilter",      N_("Show file filter"), PIXBUF_INLINE_ICON_FILE_FILTER},
+       {"RectangularSelection",        N_("Select rectangle"), PIXBUF_INLINE_ICON_SELECT_RECTANGLE},
+       {"Print",       N_("Print"), GTK_STOCK_PRINT},
+       {"Preferences", N_("Preferences"), GTK_STOCK_PREFERENCES},
+       {"LayoutConfig",        N_("Configure this window"), GTK_STOCK_PREFERENCES},
+       {"Maintenance", N_("Cache maintenance"), PIXBUF_INLINE_ICON_MAINTENANCE},
+       {"RotateCW",    N_("Rotate clockwise 90°"), PIXBUF_INLINE_ICON_CW},
+       {"RotateCCW",   N_("Rotate counterclockwise 90°"), PIXBUF_INLINE_ICON_CCW},
+       {"Rotate180",   N_("Rotate 180°"), PIXBUF_INLINE_ICON_180},
+       {"Mirror",      N_("Mirror"), PIXBUF_INLINE_ICON_MIRROR},
+       {"Flip",        N_("Flip"), PIXBUF_INLINE_ICON_FLIP},
+       {"AlterNone",   N_("Original state"), PIXBUF_INLINE_ICON_ORIGINAL},
+       {"ZoomIn",      N_("Zoom in"), GTK_STOCK_ZOOM_IN},
+       {"ZoomOut",     N_("Zoom out"), GTK_STOCK_ZOOM_OUT},
+       {"Zoom100",     N_("Zoom 1:1"), GTK_STOCK_ZOOM_100},
+       {"ZoomFit",     N_("Zoom to fit"), GTK_STOCK_ZOOM_FIT},
+       {"ZoomFillHor", N_("Fit Horizontaly"), PIXBUF_INLINE_ICON_ZOOMFILLHOR},
+       {"ZoomFillVert",        N_("Fit vertically"), PIXBUF_INLINE_ICON_ZOOMFILLVERT},
+       {"Zoom200",     N_("Zoom 2:1"), GTK_STOCK_FILE},
+       {"Zoom300",     N_("Zoom 3:1"), GTK_STOCK_FILE},
+       {"Zoom400",     N_("Zoom 4:1"), GTK_STOCK_FILE},
+       {"Zoom50",      N_("Zoom 1:2"), GTK_STOCK_FILE},
+       {"Zoom33",      N_("Zoom1:3"), GTK_STOCK_FILE},
+       {"Zoom25",      N_("Zoom 1:4"), GTK_STOCK_FILE},
+       {"ConnectZoomIn",       N_("Connected Zoom in"), GTK_STOCK_ZOOM_IN},
+       {"SplitPaneSync",       N_("Split Pane Sync"), PIXBUF_INLINE_SPLIT_PANE_SYNC},
+       {"Grayscale",   N_("Grayscale"), PIXBUF_INLINE_ICON_GRAYSCALE},
+       {"OverUnderExposed",    N_("Over Under Exposed"), PIXBUF_INLINE_ICON_EXPOSURE},
+       {"HideTools",   N_("Hide file list"), PIXBUF_INLINE_ICON_HIDETOOLS},
+       {"SlideShowPause",      N_("Pause slideshow"), GTK_STOCK_MEDIA_PAUSE},
+       {"SlideShowFaster",     N_("Slideshow Faster"), GTK_STOCK_FILE},
+       {"SlideShowSlower",     N_("Slideshow Slower"), GTK_STOCK_FILE},
+       {"Refresh",     N_("Refresh"), GTK_STOCK_REFRESH},
+       {"HelpContents",        N_("Help"), GTK_STOCK_HELP},
+       {"ExifWin",     N_("Exif window"), PIXBUF_INLINE_ICON_EXIF},
+       {"Thumbnails",  N_("Show thumbnails"), PIXBUF_INLINE_ICON_THUMB},
+       {"ShowMarks",   N_("Show marks"), PIXBUF_INLINE_ICON_MARKS},
+       {"ImageGuidelines",     N_("Show guidelines"), PIXBUF_INLINE_ICON_GUIDELINES},
+       {"DrawRectangle",       N_("Draw Rectangle"), PIXBUF_INLINE_ICON_DRAW_RECTANGLE},
+       {"FloatTools",  N_("Float file list"), PIXBUF_INLINE_ICON_FLOAT},
+       {"SBar",        N_("Info sidebar"), PIXBUF_INLINE_ICON_INFO},
+       {"SBarSort",    N_("Sort manager"), PIXBUF_INLINE_ICON_SORT},
+       {"Quit",        N_("Quit"), GTK_STOCK_QUIT},
+       {NULL,          NULL, NULL}
+};
+
+static void mouse_buttons_selection_menu_cb(GtkWidget *combo, gpointer data)
+{
+       gchar **option = data;
+       gchar *label;
+
+       label = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(combo));
+
+       const UseableMouseItems *list = useable_mouse_items;
+
+       while (list->name)
+               {
+               if (g_strcmp0(list->label, label) == 0)
+                       {
+                       break;
+                       }
+               list++;
+               }
+
+       g_free(*option);
+       *option = g_strdup(list->name);
+       g_free(label);
+}
+
+static void add_mouse_selection_menu(GtkWidget *table, gint column, gint row, const gchar *text,
+                            gchar *option, gchar **option_c)
+{
+       GtkWidget *combo;
+       gint current = 0;
+       gint i = 0;
+
+       *option_c = option;
+
+       pref_table_label(table, column, row, text, 0.0);
+
+       combo = gtk_combo_box_text_new();
+
+       const UseableMouseItems *list = useable_mouse_items;
+
+       while (list->name)
+               {
+               gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), list->label);
+               if (g_strcmp0(list->name, option) == 0)
+                       {
+                       current = i;
+                       }
+               i++;
+               list++;
+               }
+
+       gtk_combo_box_set_active(GTK_COMBO_BOX(combo), current);
+
+       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, 0, 0, 0);
        gtk_widget_show(combo);
 }
 
@@ -694,8 +874,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_EXPAND | GTK_FILL, 0, 0, 0);
+       gtk_table_attach(GTK_TABLE(table), combo, column + 1, column + 2, row, row + 1, GTK_SHRINK, 0, 0, 0);
        gtk_widget_show(combo);
 }
 
@@ -814,8 +993,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_EXPAND | GTK_FILL, 0, 0, 0);
+       gtk_table_attach(GTK_TABLE(table), combo, column + 1, column + 2, row, row + 1, GTK_SHRINK, 0, 0, 0);
        gtk_widget_show(combo);
 }
 
@@ -856,8 +1034,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_EXPAND | GTK_FILL, 0, 0, 0);
+       gtk_table_attach(GTK_TABLE(table), combo, column + 1, column + 2, row, row + 1, GTK_SHRINK, 0, 0, 0);
        gtk_widget_show(combo);
 }
 
@@ -1050,8 +1227,6 @@ static gboolean filter_add_scroll(gpointer data)
        GList *list_cells;
        GtkCellRenderer *cell;
        GtkTreeViewColumn *column;
-       const gchar *title;
-       guint i = 0;
        gint rows;
 
        rows = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(filter_store), NULL);
@@ -1735,7 +1910,12 @@ static void config_tab_general(GtkWidget *notebook)
        add_thumb_size_menu(table, 0, 0, _("Size:"));
        add_quality_menu(table, 0, 1, _("Quality:"), options->thumbnails.quality, &c_options->thumbnails.quality);
 
-       ct_button = pref_checkbox_new_int(group, _("Cache thumbnails"),
+       hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
+       pref_label_new(hbox, _("Custom size: "));
+       pref_spin_new_int(hbox, _("Width:"), NULL, 1, 512, 1, options->thumbnails.max_width, &c_options->thumbnails.max_width);
+       pref_spin_new_int(hbox, _("Height:"), NULL, 1, 512, 1, options->thumbnails.max_height, &c_options->thumbnails.max_height);
+
+       ct_button = pref_checkbox_new_int(group, _("Cache thumbnails and sim. files"),
                                          options->thumbnails.enable_caching, &c_options->thumbnails.enable_caching);
 
        subgroup = pref_box_new(group, FALSE, GTK_ORIENTATION_VERTICAL, PREF_PAD_GAP);
@@ -2004,7 +2184,7 @@ static void config_tab_image(GtkWidget *notebook)
        add_quality_menu(table, 0, 0, _("Quality:"), options->image.zoom_quality, &c_options->image.zoom_quality);
 
 #ifdef HAVE_CLUTTER
-       pref_checkbox_new_int(group, _("Use GPU acceleration via Clutter library"),
+       pref_checkbox_new_int(group, _("Use GPU acceleration via Clutter library (Requires restart)"),
                              options->image.use_clutter_renderer, &c_options->image.use_clutter_renderer);
 #endif
 
@@ -2127,7 +2307,6 @@ static void config_tab_osd(GtkWidget *notebook)
 {
        GtkWidget *hbox;
        GtkWidget *vbox;
-       GtkWidget *vbox_buttons;
        GtkWidget *group;
        GtkWidget *button;
        GtkWidget *image_overlay_template_view;
@@ -2135,10 +2314,7 @@ static void config_tab_osd(GtkWidget *notebook)
        GtkWidget *scrolled_pre_formatted;
        GtkTextBuffer *buffer;
        GtkWidget *label;
-       GtkWidget *     subgroup;
-       gint i = 0;
-       gint rows = 0;
-       gint cols = 0;
+       GtkWidget *subgroup;
 
        vbox = scrolled_notebook_page(notebook, _("OSD"));
 
@@ -2932,8 +3108,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_EXPAND | GTK_FILL, 0, 0, 0);
+       gtk_table_attach(GTK_TABLE(table), combo, column + 1, column + 2, row, row + 1, GTK_SHRINK, 0, 0, 0);
        gtk_widget_show(combo);
 }
 #endif
@@ -3140,6 +3315,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_dnd_default_action_selection_menu(table, 0, 0, _("Drag`n drop default action:"), options->dnd_default_action, &c_options->dnd_default_action);
+
        table = pref_table_new(group, 2, 1, FALSE, FALSE);
        add_clipboard_selection_menu(table, 0, 0, _("Copy path clipboard selection:"), options->clipboard_selection, &c_options->clipboard_selection);
 
@@ -3160,6 +3338,11 @@ static void config_tab_behavior(GtkWidget *notebook)
        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);
 
+       table = pref_table_new(group, 2, 1, FALSE, FALSE);
+       table = pref_table_new(group, 2, 1, FALSE, FALSE);
+       add_mouse_selection_menu(table, 0, 0, _("Mouse button Back:"), options->mouse_button_8, &c_options->mouse_button_8);
+       table = pref_table_new(group, 2, 1, FALSE, FALSE);
+       add_mouse_selection_menu(table, 0, 0, _("Mouse button Forward:"), options->mouse_button_9, &c_options->mouse_button_9);
 
 #ifdef DEBUG
        pref_spacer(group, PREF_PAD_GROUP);
@@ -3281,8 +3464,24 @@ static void config_tab_accelerators(GtkWidget *notebook)
        gtk_widget_show(button);
 }
 
-/* toolbar tab */
-static void config_tab_toolbar(GtkWidget *notebook)
+/* toolbar main tab */
+static void config_tab_toolbar_main(GtkWidget *notebook)
+{
+       GtkWidget *vbox;
+       GtkWidget *toolbardata;
+       LayoutWindow *lw;
+
+       lw = layout_window_list->data;
+
+       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);
+       gtk_widget_show(vbox);
+}
+
+/* toolbar status tab */
+static void config_tab_toolbar_status(GtkWidget *notebook)
 {
        GtkWidget *vbox;
        GtkWidget *toolbardata;
@@ -3290,9 +3489,9 @@ static void config_tab_toolbar(GtkWidget *notebook)
 
        lw = layout_window_list->data;
 
-       vbox = scrolled_notebook_page(notebook, _("Toolbar"));
+       vbox = scrolled_notebook_page(notebook, _("Toolbar Status"));
 
-       toolbardata = toolbar_select_new(lw);
+       toolbardata = toolbar_select_new(lw, TOOLBAR_STATUS);
        gtk_box_pack_start(GTK_BOX(vbox), toolbardata, TRUE, TRUE, 0);
        gtk_widget_show(vbox);
 }
@@ -3414,7 +3613,8 @@ static void config_window_create(void)
        config_tab_color(notebook);
        config_tab_stereo(notebook);
        config_tab_behavior(notebook);
-       config_tab_toolbar(notebook);
+       config_tab_toolbar_main(notebook);
+       config_tab_toolbar_status(notebook);
 
        hbox = gtk_hbutton_box_new();
        gtk_button_box_set_layout(GTK_BUTTON_BOX(hbox), GTK_BUTTONBOX_END);
@@ -3437,18 +3637,6 @@ static void config_window_create(void)
 
        ct_button = button;
 
-       button = pref_button_new(NULL, GTK_STOCK_SAVE, NULL, FALSE,
-                                G_CALLBACK(config_window_save_cb), NULL);
-       gtk_container_add(GTK_CONTAINER(hbox), button);
-       gtk_widget_set_can_default(button, TRUE);
-       gtk_widget_show(button);
-
-       button = pref_button_new(NULL, GTK_STOCK_APPLY, NULL, FALSE,
-                                G_CALLBACK(config_window_apply_cb), NULL);
-       gtk_container_add(GTK_CONTAINER(hbox), button);
-       gtk_widget_set_can_default(button, TRUE);
-       gtk_widget_show(button);
-
        button = pref_button_new(NULL, GTK_STOCK_CANCEL, NULL, FALSE,
                                 G_CALLBACK(config_window_close_cb), NULL);
        gtk_container_add(GTK_CONTAINER(hbox), button);
@@ -3497,7 +3685,8 @@ void show_about_window(LayoutWindow *lw)
        gint i_authors = 0;
        gchar *path;
        GString *copyright;
-       gchar *zd_path;
+       gchar *timezone_path;
+       gchar *basename;
        ZoneDetect *cd;
        FILE *fp = NULL;
 #define LINE_LENGTH 1000
@@ -3506,14 +3695,21 @@ void show_about_window(LayoutWindow *lw)
        copyright = g_string_new(NULL);
        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");
 
-       zd_path = g_build_filename(GQ_BIN_DIR, TIMEZONE_DATABASE, NULL);
-       cd = ZDOpenDatabase(zd_path);
-       if (cd)
+       path = path_from_utf8(TIMEZONE_DATABASE);
+       basename = g_path_get_basename(path);
+       timezone_path = g_build_filename(get_rc_dir(), basename, NULL);
+       if (g_file_test(timezone_path, G_FILE_TEST_EXISTS))
                {
-               copyright = g_string_append(copyright, ZDGetNotice(cd));
+               cd = ZDOpenDatabase(timezone_path);
+               if (cd)
+                       {
+                       copyright = g_string_append(copyright, ZDGetNotice(cd));
+                       ZDCloseDatabase(cd);
+                       }
                }
-       ZDCloseDatabase(cd);
-       g_free(zd_path);
+       g_free(path);
+       g_free(timezone_path);
+       g_free(basename);
 
        authors[0] = NULL;
        path = g_build_filename(GQ_HELPDIR, "AUTHORS", NULL);
@@ -3627,7 +3823,6 @@ static void timezone_progress_cb(goffset current_num_bytes, goffset total_num_by
 static void timezone_cancel_button_cb(GenericDialog *gd, gpointer data)
 {
        TZData *tz = data;
-       GError *error = NULL;
 
        g_cancellable_cancel(tz->cancellable);
 }