Sort headers using clang-tidy
[geeqie.git] / src / ui-pathsel.cc
index 967b8a5..a0c4ffb 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
+#include "ui-pathsel.h"
+
 #include <cstring>
 
 #include <dirent.h>
-#include <sys/types.h>
 #include <sys/stat.h>
+#include <sys/types.h>
 
-#include "main.h"
-#include "ui-pathsel.h"
+#include <config.h>
 
+#include "compat.h"
+#include "debug.h"
+#include "intl.h"
+#include "main-defines.h"
+#include "misc.h"
+#include "options.h"
 #include "ui-bookmark.h"
 #include "ui-fileops.h"
 #include "ui-menu.h"
 #include "utilops.h"
 
 
-#define DEST_WIDTH 250
-#define DEST_HEIGHT 210
+enum {
+       DEST_WIDTH = 250,
+       DEST_HEIGHT = 210
+};
 
-#define RENAME_PRESS_DELAY 333 /* 1/3 second, to allow double clicks */
+enum {
+       RENAME_PRESS_DELAY = 333        /* 1/3 second, to allow double clicks */
+};
 
 #define PATH_SEL_USE_HEADINGS FALSE
 
@@ -91,7 +102,7 @@ static void dest_view_delete_dlg_cancel(GenericDialog *gd, gpointer data);
  *-----------------------------------------------------------------------------
  */
 
-static void dest_free_data(GtkWidget *UNUSED(widget), gpointer data)
+static void dest_free_data(GtkWidget *, gpointer data)
 {
        auto dd = static_cast<Dest_Data *>(data);
 
@@ -237,7 +248,7 @@ static void dest_populate(Dest_Data *dd, const gchar *path)
                list = list->next;
                }
 
-       string_list_free(path_list);
+       g_list_free_full(path_list, g_free);
 
 
        if (dd->f_view)
@@ -261,7 +272,7 @@ static void dest_populate(Dest_Data *dd, const gchar *path)
                        list = list->next;
                        }
 
-               string_list_free(file_list);
+               g_list_free_full(file_list, g_free);
                }
 
        g_free(dd->path);
@@ -276,7 +287,7 @@ static void dest_change_dir(Dest_Data *dd, const gchar *path, gboolean retain_na
 
        if (retain_name)
                {
-               const gchar *buf = gtk_entry_get_text(GTK_ENTRY(dd->entry));
+               const gchar *buf = gq_gtk_entry_get_text(GTK_ENTRY(dd->entry));
 
                if (!isdir(buf)) old_name = filename_from_path(buf);
                }
@@ -287,7 +298,7 @@ static void dest_change_dir(Dest_Data *dd, const gchar *path, gboolean retain_na
        else
                new_directory = g_strdup(full_path);
 
-       gtk_entry_set_text(GTK_ENTRY(dd->entry), full_path);
+       gq_gtk_entry_set_text(GTK_ENTRY(dd->entry), full_path);
 
        dest_populate(dd, new_directory);
        g_free(new_directory);
@@ -318,12 +329,14 @@ static GtkTargetEntry dest_drag_types[] = {
        { const_cast<gchar *>("text/uri-list"), 0, TARGET_URI_LIST },
        { const_cast<gchar *>("text/plain"),    0, TARGET_TEXT_PLAIN }
 };
-#define dest_drag_types_n 2
+enum {
+       dest_drag_types_n = 2
+};
 
 
-static void dest_dnd_set_data(GtkWidget *view,
-                             GdkDragContext *UNUSED(context), GtkSelectionData *selection_data,
-                             guint UNUSED(info), guint UNUSED(time), gpointer UNUSED(data))
+static void dest_dnd_set_data(GtkWidget *view, GdkDragContext *,
+                                 GtkSelectionData *selection_data,
+                                 guint, guint, gpointer)
 {
        gchar *path = nullptr;
        GList *list = nullptr;
@@ -348,7 +361,7 @@ static void dest_dnd_set_data(GtkWidget *view,
                g_free(str);
                }
 
-       string_list_free(list);
+       g_list_free_full(list, g_free);
 }
 
 static void dest_dnd_init(Dest_Data *dd)
@@ -416,13 +429,13 @@ static gint dest_view_rename_cb(TreeEditData *ted, const gchar *old_name, const
        if (isname(new_path))
                {
                buf = g_strdup_printf(_("A file with name %s already exists."), new_name);
-               warning_dialog(_("Rename failed"), buf, GTK_STOCK_DIALOG_INFO, dd->entry);
+               warning_dialog(_("Rename failed"), buf, GQ_ICON_DIALOG_INFO, dd->entry);
                g_free(buf);
                }
        else if (!rename_file(old_path, new_path))
                {
                buf = g_strdup_printf(_("Failed to rename %s to %s."), old_name, new_name);
-               warning_dialog(_("Rename failed"), buf, GTK_STOCK_DIALOG_ERROR, dd->entry);
+               warning_dialog(_("Rename failed"), buf, GQ_ICON_DIALOG_ERROR, dd->entry);
                g_free(buf);
                }
        else
@@ -431,10 +444,10 @@ static gint dest_view_rename_cb(TreeEditData *ted, const gchar *old_name, const
 
                gtk_list_store_set(GTK_LIST_STORE(model), &iter, 0, new_name, 1, new_path, -1);
 
-               text = gtk_entry_get_text(GTK_ENTRY(dd->entry));
+               text = gq_gtk_entry_get_text(GTK_ENTRY(dd->entry));
                if (text && old_path && strcmp(text, old_path) == 0)
                        {
-                       gtk_entry_set_text(GTK_ENTRY(dd->entry), new_path);
+                       gq_gtk_entry_set_text(GTK_ENTRY(dd->entry), new_path);
                        }
                }
 
@@ -462,7 +475,7 @@ static void dest_view_rename(Dest_Data *dd, GtkTreeView *view)
        g_free(text);
 }
 
-static void dest_view_delete_dlg_cancel(GenericDialog *UNUSED(gd), gpointer data)
+static void dest_view_delete_dlg_cancel(GenericDialog *, gpointer data)
 {
        auto dl = static_cast<DestDel_Data *>(data);
 
@@ -478,7 +491,7 @@ static void dest_view_delete_dlg_ok_cb(GenericDialog *gd, gpointer data)
        if (!unlink_file(dl->path))
                {
                gchar *text = g_strdup_printf(_("Unable to delete file:\n%s"), dl->path);
-               warning_dialog(_("File deletion failed"), text, GTK_STOCK_DIALOG_WARNING, dl->dd->entry);
+               warning_dialog(_("File deletion failed"), text, GQ_ICON_DIALOG_WARNING, dl->dd->entry);
                g_free(text);
                }
        else if (dl->dd->path)
@@ -524,10 +537,10 @@ static void dest_view_delete(Dest_Data *dd, GtkTreeView *view)
                                    dd->entry, TRUE,
                                    dest_view_delete_dlg_cancel, dl);
 
-       generic_dialog_add_button(dd->gd, GTK_STOCK_DELETE, nullptr, dest_view_delete_dlg_ok_cb, TRUE);
+       generic_dialog_add_button(dd->gd, GQ_ICON_DELETE, "Delete", dest_view_delete_dlg_ok_cb, TRUE);
 
        text = g_strdup_printf(_("About to delete the file:\n %s"), path);
-       generic_dialog_add_message(dd->gd, GTK_STOCK_DIALOG_QUESTION,
+       generic_dialog_add_message(dd->gd, GQ_ICON_DIALOG_QUESTION,
                                   _("Delete file"), text, TRUE);
        g_free(text);
 
@@ -550,38 +563,37 @@ static void dest_view_bookmark(Dest_Data *dd, GtkTreeView *view)
        g_free(path);
 }
 
-static void dest_popup_dir_rename_cb(GtkWidget *UNUSED(widget), gpointer data)
+static void dest_popup_dir_rename_cb(GtkWidget *, gpointer data)
 {
        auto dd = static_cast<Dest_Data *>(data);
        dest_view_rename(dd, GTK_TREE_VIEW(dd->d_view));
 }
 
-static void dest_popup_dir_bookmark_cb(GtkWidget *UNUSED(widget), gpointer data)
+static void dest_popup_dir_bookmark_cb(GtkWidget *, gpointer data)
 {
        auto dd = static_cast<Dest_Data *>(data);
        dest_view_bookmark(dd, GTK_TREE_VIEW(dd->d_view));
 }
 
-static void dest_popup_file_rename_cb(GtkWidget *UNUSED(widget), gpointer data)
+static void dest_popup_file_rename_cb(GtkWidget *, gpointer data)
 {
        auto dd = static_cast<Dest_Data *>(data);
        dest_view_rename(dd, GTK_TREE_VIEW(dd->f_view));
 }
 
-static void dest_popup_file_delete_cb(GtkWidget *UNUSED(widget), gpointer data)
+static void dest_popup_file_delete_cb(GtkWidget *, gpointer data)
 {
        auto dd = static_cast<Dest_Data *>(data);
        dest_view_delete(dd, GTK_TREE_VIEW(dd->f_view));
 }
 
-static void dest_popup_file_bookmark_cb(GtkWidget *UNUSED(widget), gpointer data)
+static void dest_popup_file_bookmark_cb(GtkWidget *, gpointer data)
 {
        auto dd = static_cast<Dest_Data *>(data);
        dest_view_bookmark(dd, GTK_TREE_VIEW(dd->f_view));
 }
 
-static gboolean dest_popup_menu(Dest_Data *dd, GtkTreeView *view,
-                               guint UNUSED(button), guint32 UNUSED(time), gboolean local)
+static gboolean dest_popup_menu(Dest_Data *dd, GtkTreeView *view, guint, guint32, gboolean local)
 {
        GtkWidget *menu;
 
@@ -605,7 +617,7 @@ static gboolean dest_popup_menu(Dest_Data *dd, GtkTreeView *view,
                menu = popup_menu_short_lived();
                menu_item_add_sensitive(menu, _("_Rename"), !normal_dir,
                              G_CALLBACK(dest_popup_dir_rename_cb), dd);
-               menu_item_add_stock(menu, _("Add _Bookmark"), GTK_STOCK_JUMP_TO,
+               menu_item_add_icon(menu, _("Add _Bookmark"), GQ_ICON_GO_JUMP,
                              G_CALLBACK(dest_popup_dir_bookmark_cb), dd);
                }
        else
@@ -613,9 +625,9 @@ static gboolean dest_popup_menu(Dest_Data *dd, GtkTreeView *view,
                menu = popup_menu_short_lived();
                menu_item_add(menu, _("_Rename"),
                                G_CALLBACK(dest_popup_file_rename_cb), dd);
-               menu_item_add_stock(menu, _("_Delete"), GTK_STOCK_DELETE,
+               menu_item_add_icon(menu, _("_Delete"), GQ_ICON_DELETE,
                                G_CALLBACK(dest_popup_file_delete_cb), dd);
-               menu_item_add_stock(menu, _("Add _Bookmark"), GTK_STOCK_JUMP_TO,
+               menu_item_add_icon(menu, _("Add _Bookmark"), GQ_ICON_GO_JUMP,
                                G_CALLBACK(dest_popup_file_bookmark_cb), dd);
                }
 
@@ -638,7 +650,8 @@ static gboolean dest_press_cb(GtkWidget *view, GdkEventButton *event, gpointer d
        auto dd = static_cast<Dest_Data *>(data);
        GtkTreePath *tpath;
        GtkTreeViewColumn *column;
-       gint cell_x, cell_y;
+       gint cell_x;
+       gint cell_y;
        GtkTreeModel *model;
        GtkTreeIter iter;
        GtkTreeSelection *selection;
@@ -702,58 +715,51 @@ static gboolean dest_keypress_cb(GtkWidget *view, GdkEventKey *event, gpointer d
        return FALSE;
 }
 
-static void dest_new_dir_cb(GtkWidget *widget, gpointer data)
+static void file_util_create_dir_cb(gboolean success, const gchar *new_path, gpointer data)
 {
        auto dd = static_cast<Dest_Data *>(data);
-       gchar *path;
-       GtkWidget *dialog_window;
-
-/**
- * @FIXME on exit from the "new folder" modal dialog, focus returns to the main Geeqie
- * window rather than the file dialog window. gtk_window_present() does not seem to
- * function unless the window was previously minimized.
- */
-       dialog_window = gtk_widget_get_toplevel(widget);
-       gtk_window_iconify(GTK_WINDOW(dialog_window));
-       path = new_folder(GTK_WINDOW(dialog_window), dd->path);
-       gtk_window_present(GTK_WINDOW(dialog_window));
+       const gchar *text;
+       GtkListStore *store;
+       GtkTreeIter iter;
 
-       if (path == nullptr)
+       if (!success)
                {
                return;
                }
 
-       if (!mkdir_utf8(path, 0755))
+       if (new_path == nullptr)
                {
-               /* failed */
-               gchar *text;
-
-               text = g_strdup_printf(_("Unable to create folder:\n%s"), filename_from_path(path));
-               warning_dialog(_("Error creating folder"), text, GTK_STOCK_DIALOG_ERROR, dd->entry);
-               g_free(text);
+               return;
                }
-       else
-               {
-               GtkTreeIter iter;
-               GtkListStore *store;
-               const gchar *text;
-
-               store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(dd->d_view)));
 
-               text = filename_from_path(path);
+       store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(dd->d_view)));
 
-               gtk_list_store_append(store, &iter);
-               gtk_list_store_set(store, &iter, 0, text, 1, path, -1);
+       text = filename_from_path(new_path);
 
-               if (dd->right_click_path) gtk_tree_path_free(dd->right_click_path);
-               dd->right_click_path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &iter);
+       gtk_list_store_append(store, &iter);
+       gtk_list_store_set(store, &iter, 0, text, 1, new_path, -1);
 
-               gtk_entry_set_text(GTK_ENTRY(dd->entry), path);
+       if (dd->right_click_path)
+               {
+               gtk_tree_path_free(dd->right_click_path);
                }
+       dd->right_click_path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &iter);
+
+       gq_gtk_entry_set_text(GTK_ENTRY(dd->entry), new_path);
 
        gtk_widget_grab_focus(GTK_WIDGET(dd->entry));
+}
 
-       g_free(path);
+static void dest_new_dir_cb(GtkWidget *widget, gpointer data)
+{
+       auto dd = static_cast<Dest_Data *>(data);
+
+/**
+ * @FIXME on exit from the "new folder" modal dialog, focus returns to the main Geeqie
+ * window rather than the file dialog window. gtk_window_present() does not seem to
+ * function unless the window was previously minimized.
+ */
+       file_util_create_dir(gq_gtk_entry_get_text(GTK_ENTRY(dd->entry)), widget, file_util_create_dir_cb, data);
 }
 
 /*
@@ -782,13 +788,13 @@ static void dest_select_cb(GtkTreeSelection *selection, gpointer data)
                }
        else
                {
-               gtk_entry_set_text(GTK_ENTRY(dd->entry), path);
+               gq_gtk_entry_set_text(GTK_ENTRY(dd->entry), path);
                }
 
        g_free(path);
 }
 
-static void dest_activate_cb(GtkWidget *view, GtkTreePath *tpath, GtkTreeViewColumn *UNUSED(column), gpointer data)
+static void dest_activate_cb(GtkWidget *view, GtkTreePath *tpath, GtkTreeViewColumn *, gpointer data)
 {
        auto dd = static_cast<Dest_Data *>(data);
        GtkTreeModel *store;
@@ -814,14 +820,14 @@ static void dest_activate_cb(GtkWidget *view, GtkTreePath *tpath, GtkTreeViewCol
        g_free(path);
 }
 
-static void dest_home_cb(GtkWidget *UNUSED(widget), gpointer data)
+static void dest_home_cb(GtkWidget *, gpointer data)
 {
        auto dd = static_cast<Dest_Data *>(data);
 
        dest_change_dir(dd, homedir(), (dd->f_view != nullptr));
 }
 
-static void dest_show_hidden_cb(GtkWidget *UNUSED(widget), gpointer data)
+static void dest_show_hidden_cb(GtkWidget *, gpointer data)
 {
        auto dd = static_cast<Dest_Data *>(data);
        gchar *buf;
@@ -833,13 +839,13 @@ static void dest_show_hidden_cb(GtkWidget *UNUSED(widget), gpointer data)
        g_free(buf);
 }
 
-static void dest_entry_changed_cb(GtkEditable *UNUSED(editable), gpointer data)
+static void dest_entry_changed_cb(GtkEditable *, gpointer data)
 {
        auto dd = static_cast<Dest_Data *>(data);
        const gchar *path;
        gchar *buf;
 
-       path = gtk_entry_get_text(GTK_ENTRY(dd->entry));
+       path = gq_gtk_entry_get_text(GTK_ENTRY(dd->entry));
        if (dd->path && strcmp(path, dd->path) == 0) return;
 
        buf = remove_level_from_path(path);
@@ -871,7 +877,7 @@ static void dest_filter_list_sync(Dest_Data *dd)
        if (!dd->filter_list || !dd->filter_combo) return;
 
        entry = gtk_bin_get_child(GTK_BIN(dd->filter_combo));
-       old_text = g_strdup(gtk_entry_get_text(GTK_ENTRY(entry)));
+       old_text = g_strdup(gq_gtk_entry_get_text(GTK_ENTRY(entry)));
 
        store = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(dd->filter_combo)));
        gtk_list_store_clear(store);
@@ -937,22 +943,22 @@ static void dest_filter_add(Dest_Data *dd, const gchar *filter, const gchar *des
                }
        dd->filter_text_list = uig_list_insert_link(dd->filter_text_list, g_list_last(dd->filter_text_list), buf);
 
-       if (set) gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(dd->filter_combo))), filter);
+       if (set) gq_gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(dd->filter_combo))), filter);
        dest_filter_list_sync(dd);
 }
 
 static void dest_filter_clear(Dest_Data *dd)
 {
-       string_list_free(dd->filter_list);
+       g_list_free_full(dd->filter_list, g_free);
        dd->filter_list = nullptr;
 
-       string_list_free(dd->filter_text_list);
+       g_list_free_full(dd->filter_text_list, g_free);
        dd->filter_text_list = nullptr;
 
        dest_filter_add(dd, "*", _("All Files"), TRUE);
 }
 
-static void dest_filter_changed_cb(GtkEditable *UNUSED(editable), gpointer data)
+static void dest_filter_changed_cb(GtkEditable *, gpointer data)
 {
        auto dd = static_cast<Dest_Data *>(data);
        GtkWidget *entry;
@@ -960,7 +966,7 @@ static void dest_filter_changed_cb(GtkEditable *UNUSED(editable), gpointer data)
        gchar *path;
 
        entry = gtk_bin_get_child(GTK_BIN(dd->filter_combo));
-       buf = gtk_entry_get_text(GTK_ENTRY(entry));
+       buf = gq_gtk_entry_get_text(GTK_ENTRY(entry));
 
        g_free(dd->filter);
        dd->filter = nullptr;
@@ -981,7 +987,7 @@ static void dest_bookmark_select_cb(const gchar *path, gpointer data)
                }
        else if (isfile(path) && dd->f_view)
                {
-               gtk_entry_set_text(GTK_ENTRY(dd->entry), path);
+               gq_gtk_entry_set_text(GTK_ENTRY(dd->entry), path);
                }
 }
 
@@ -994,69 +1000,69 @@ static void dest_bookmark_select_cb(const gchar *path, gpointer data)
 GtkWidget *path_selection_new_with_files(GtkWidget *entry, const gchar *path,
                                         const gchar *filter, const gchar *filter_desc)
 {
-       GtkWidget *hbox2;
        Dest_Data *dd;
-       GtkWidget *scrolled;
-       GtkWidget *table;
-       GtkWidget *paned;
+       GtkCellRenderer *renderer;
        GtkListStore *store;
        GtkTreeSelection *selection;
        GtkTreeViewColumn *column;
-       GtkCellRenderer *renderer;
+       GtkWidget *hbox1; // home, new folder, hidden, filter
+       GtkWidget *hbox2; // files paned
+       GtkWidget *hbox3; // filter
+       GtkWidget *paned;
+       GtkWidget *scrolled;
+       GtkWidget *table; // main box
 
        dd = g_new0(Dest_Data, 1);
 
-       table = gtk_table_new(4, (filter != nullptr) ? 3 : 1, FALSE);
-       gtk_table_set_col_spacings(GTK_TABLE(table), PREF_PAD_GAP);
-       gtk_table_set_row_spacing(GTK_TABLE(table), 0, PREF_PAD_GAP);
-       gtk_widget_show(table);
+       table = gtk_box_new(GTK_ORIENTATION_VERTICAL, PREF_PAD_GAP);
 
        dd->entry = entry;
        g_object_set_data(G_OBJECT(dd->entry), "destination_data", dd);
 
-       hbox2 = pref_table_box(table, 0, 0, GTK_ORIENTATION_HORIZONTAL, nullptr);
-       gtk_box_set_spacing(GTK_BOX(hbox2), PREF_PAD_BUTTON_GAP);
-       pref_button_new(hbox2, nullptr, _("Home"), FALSE,
+       hbox1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, PREF_PAD_GAP);
+       gtk_box_set_spacing(GTK_BOX(hbox1), PREF_PAD_BUTTON_GAP);
+       pref_button_new(hbox1, nullptr, _("Home"),
                        G_CALLBACK(dest_home_cb), dd);
-       pref_button_new(hbox2, nullptr, _("New folder"), FALSE,
+       pref_button_new(hbox1, nullptr, _("New folder"),
                        G_CALLBACK(dest_new_dir_cb), dd);
 
        dd->hidden_button = gtk_check_button_new_with_label(_("Show hidden"));
        g_signal_connect(G_OBJECT(dd->hidden_button), "clicked",
                         G_CALLBACK(dest_show_hidden_cb), dd);
-       gtk_box_pack_end(GTK_BOX(hbox2), dd->hidden_button, FALSE, FALSE, 0);
+       gq_gtk_box_pack_end(GTK_BOX(hbox1), dd->hidden_button, FALSE, FALSE, 0);
        gtk_widget_show(dd->hidden_button);
 
+       gq_gtk_box_pack_start(GTK_BOX(table), hbox1, FALSE, FALSE, 0);
+       gtk_widget_show_all(hbox1);
+
        hbox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, PREF_PAD_GAP);
        if (filter)
                {
-               paned = gtk_hpaned_new();
+               paned = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
                DEBUG_NAME(paned);
-               gtk_table_attach(GTK_TABLE(table), paned, 0, 3, 1, 2,
-                                static_cast<GtkAttachOptions>(GTK_EXPAND | GTK_FILL), static_cast<GtkAttachOptions>(GTK_EXPAND | GTK_FILL), 0, 0);
+               gq_gtk_box_pack_end(GTK_BOX(table), paned, TRUE , TRUE, 0);
                gtk_widget_show(paned);
                gtk_paned_add1(GTK_PANED(paned), hbox2);
                }
        else
                {
                paned = nullptr;
-               gtk_table_attach(GTK_TABLE(table), hbox2, 0, 1, 1, 2,
-                                static_cast<GtkAttachOptions>(GTK_EXPAND | GTK_FILL), static_cast<GtkAttachOptions>(GTK_EXPAND | GTK_FILL), 0, 0);
+               gq_gtk_box_pack_end(GTK_BOX(table), hbox2, TRUE, TRUE, 0);
                }
        gtk_widget_show(hbox2);
 
        /* bookmarks */
        scrolled = bookmark_list_new(nullptr, dest_bookmark_select_cb, dd);
-       gtk_box_pack_start(GTK_BOX(hbox2), scrolled, FALSE, FALSE, 0);
+       gq_gtk_box_pack_start(GTK_BOX(hbox2), scrolled, FALSE, FALSE, 0);
        gtk_widget_show(scrolled);
 
        dd->bookmark_list = scrolled;
 
-       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(hbox2), scrolled, TRUE, TRUE, 0);
+       gq_gtk_box_pack_start(GTK_BOX(hbox2), scrolled, TRUE, TRUE, 0);
        gtk_widget_show(scrolled);
 
        store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
@@ -1089,7 +1095,7 @@ GtkWidget *path_selection_new_with_files(GtkWidget *entry, const gchar *path,
 #endif
 
        gtk_widget_set_size_request(dd->d_view, DEST_WIDTH, DEST_HEIGHT);
-       gtk_container_add(GTK_CONTAINER(scrolled), dd->d_view);
+       gq_gtk_container_add(GTK_WIDGET(scrolled), dd->d_view);
        gtk_widget_show(dd->d_view);
 
        g_signal_connect(G_OBJECT(dd->d_view), "button_press_event",
@@ -1105,26 +1111,29 @@ GtkWidget *path_selection_new_with_files(GtkWidget *entry, const gchar *path,
                {
                GtkListStore *store;
 
-               hbox2 = pref_table_box(table, 2, 0, GTK_ORIENTATION_HORIZONTAL, nullptr);
-               pref_label_new(hbox2, _("Filter:"));
+               hbox3 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+               pref_label_new(hbox3, _("Filter:"));
 
                store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
 
                dd->filter_combo = gtk_combo_box_new_with_model_and_entry(GTK_TREE_MODEL(store));
                gtk_combo_box_set_entry_text_column(GTK_COMBO_BOX(dd->filter_combo),
                                                                                                                FILTER_COLUMN_FILTER);
+               gtk_widget_set_tooltip_text(dd->filter_combo, _("File extension.\nAll files: *\nOr, e.g. png;jpg\nOr, e.g. png; jpg"));
 
                g_object_unref(store);
                gtk_cell_layout_clear(GTK_CELL_LAYOUT(dd->filter_combo));
                renderer = gtk_cell_renderer_text_new();
                gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(dd->filter_combo), renderer, TRUE);
-               gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(dd->filter_combo), renderer,
-                                              "text", FILTER_COLUMN_NAME, NULL);
-               gtk_box_pack_start(GTK_BOX(hbox2), dd->filter_combo, TRUE, TRUE, 0);
+               gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(dd->filter_combo), renderer, "text", FILTER_COLUMN_NAME, NULL);
+               gq_gtk_box_pack_start(GTK_BOX(hbox3), dd->filter_combo, TRUE, TRUE, 0);
                gtk_widget_show(dd->filter_combo);
 
-               scrolled = gtk_scrolled_window_new(nullptr, nullptr);
-               gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
+               gq_gtk_box_pack_end(GTK_BOX(hbox1), hbox3, FALSE, FALSE, 0);
+               gtk_widget_show(hbox3);
+
+               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);
                if (paned)
@@ -1133,8 +1142,7 @@ GtkWidget *path_selection_new_with_files(GtkWidget *entry, const gchar *path,
                        }
                else
                        {
-                       gtk_table_attach(GTK_TABLE(table), scrolled, 2, 3, 1, 2,
-                                static_cast<GtkAttachOptions>(GTK_EXPAND | GTK_FILL), static_cast<GtkAttachOptions>(GTK_EXPAND | GTK_FILL), 0, 0);
+                       gq_gtk_box_pack_end(GTK_BOX(table), paned, FALSE, FALSE, 0);
                        }
                gtk_widget_show(scrolled);
 
@@ -1158,7 +1166,7 @@ GtkWidget *path_selection_new_with_files(GtkWidget *entry, const gchar *path,
                gtk_tree_view_append_column(GTK_TREE_VIEW(dd->f_view), column);
 
                gtk_widget_set_size_request(dd->f_view, DEST_WIDTH, DEST_HEIGHT);
-               gtk_container_add(GTK_CONTAINER(scrolled), dd->f_view);
+               gq_gtk_container_add(GTK_WIDGET(scrolled), dd->f_view);
                gtk_widget_show(dd->f_view);
 
                g_signal_connect(G_OBJECT(dd->f_view), "button_press_event",
@@ -1173,7 +1181,7 @@ GtkWidget *path_selection_new_with_files(GtkWidget *entry, const gchar *path,
                dest_filter_clear(dd);
                dest_filter_add(dd, filter, filter_desc, TRUE);
 
-               dd->filter = g_strdup(gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(dd->filter_combo)))));
+               dd->filter = g_strdup(gq_gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(dd->filter_combo)))));
                }
 
        if (path && path[0] == G_DIR_SEPARATOR && isdir(path))
@@ -1215,17 +1223,17 @@ GtkWidget *path_selection_new_with_files(GtkWidget *entry, const gchar *path,
 #pragma GCC diagnostic ignored "-Wunused-function"
 GtkWidget *path_selection_new_unused(const gchar *path, GtkWidget *entry)
 {
-       return path_selection_new_with_files(entry, path, NULL, NULL);
+       return path_selection_new_with_files(entry, path, nullptr, nullptr);
 }
 
 void path_selection_sync_to_entry_unused(GtkWidget *entry)
 {
-       Dest_Data *dd = static_cast<Dest_Data *>(g_object_get_data(G_OBJECT(entry), "destination_data"));
+       auto *dd = static_cast<Dest_Data *>(g_object_get_data(G_OBJECT(entry), "destination_data"));
        const gchar *path;
 
        if (!dd) return;
 
-       path = gtk_entry_get_text(GTK_ENTRY(entry));
+       path = gq_gtk_entry_get_text(GTK_ENTRY(entry));
 
        if (isdir(path) && (!dd->path || strcmp(path, dd->path) != 0))
                {