Fix #1224: Dragging a keyword to another position causes Geeqie to crash
[geeqie.git] / src / view-dir.cc
index 9a25d76..793dab3 100644 (file)
@@ -25,8 +25,8 @@
 #include "dupe.h"
 #include "editors.h"
 #include "filedata.h"
+#include "layout.h"
 #include "layout-image.h"
-#include "layout-util.h"
 #include "menu.h"
 #include "ui-fileops.h"
 #include "ui-tree-edit.h"
 #include "view-dir-list.h"
 #include "view-dir-tree.h"
 
+namespace
+{
+
+/** @FIXME Emblems should be attached to icons via e.g.:
+ * GIcon *....
+ * icon = g_themed_icon_new("folder");
+ * emblem_icon = g_themed_icon_new("emblem_symbolic_link");
+ * emblem = g_emblem_new(emblem_icon);
+ * emblemed = g_emblemed_icon_new(icon, emblem);
+ * gtk_icon_info_load_icon(icon_info, NULL)
+ * But there does not seem to be a way to get GtkIconInfo from a GIcon
+ */
+GdkPixbuf *create_folder_icon_with_emblem(GtkIconTheme *icon_theme, const gchar *emblem, const gchar *fallback_icon, gint size)
+{
+       if (!gtk_icon_theme_has_icon(icon_theme, emblem))
+               {
+               return gq_gtk_icon_theme_load_icon_copy(icon_theme, fallback_icon, size, GTK_ICON_LOOKUP_USE_BUILTIN);
+               }
+
+       GError *error = nullptr;
+       GdkPixbuf *icon = gtk_icon_theme_load_icon(icon_theme, emblem, size, GTK_ICON_LOOKUP_USE_BUILTIN, &error);
+       GdkPixbuf *pixbuf;
+       if (error)
+               {
+               log_printf("Error: %s\n", error->message);
+               g_error_free(error);
+               pixbuf = gq_gtk_icon_theme_load_icon_copy(icon_theme, fallback_icon, size, GTK_ICON_LOOKUP_USE_BUILTIN);
+               }
+       else
+               {
+               GdkPixbuf *directory_pixbuf = gtk_icon_theme_load_icon(icon_theme, GQ_ICON_DIRECTORY, size, GTK_ICON_LOOKUP_USE_BUILTIN, nullptr);
+               pixbuf = gdk_pixbuf_copy(directory_pixbuf);
+               g_object_unref(directory_pixbuf);
+               
+               gint scale = gdk_pixbuf_get_width(icon) / 2;
+               gdk_pixbuf_composite(icon, pixbuf, scale, scale, scale, scale, scale, scale, 0.5, 0.5, GDK_INTERP_HYPER, 255);
+               }
+       g_object_unref(icon);
+
+       return pixbuf;
+}
+
 /* Folders icons to be used in tree or list directory view */
-static PixmapFolders *folder_icons_new(GtkWidget *widget)
+PixmapFolders *folder_icons_new()
 {
-       PixmapFolders *pf = g_new0(PixmapFolders, 1);
+       auto pf = g_new0(PixmapFolders, 1);
+       GtkIconTheme *icon_theme = gtk_icon_theme_get_default();
 
-#if 1
-       GtkIconSize size = GTK_ICON_SIZE_MENU;
+       gint size;
+       if (!gtk_icon_size_lookup(GTK_ICON_SIZE_MENU, &size, &size))
+               {
+               size = 16;
+               }
+
+       pf->close  = gq_gtk_icon_theme_load_icon_copy(icon_theme, GQ_ICON_DIRECTORY, size, GTK_ICON_LOOKUP_USE_BUILTIN);
+       pf->open   = gq_gtk_icon_theme_load_icon_copy(icon_theme, GQ_ICON_OPEN, size, GTK_ICON_LOOKUP_USE_BUILTIN);
+       pf->parent = gq_gtk_icon_theme_load_icon_copy(icon_theme, GQ_ICON_GO_UP, size, GTK_ICON_LOOKUP_USE_BUILTIN);
+
+       pf->deny = create_folder_icon_with_emblem(icon_theme, GQ_ICON_UNREADABLE, GQ_ICON_STOP, size);
+       pf->link = create_folder_icon_with_emblem(icon_theme, GQ_ICON_LINK, GQ_ICON_REDO, size);
+       pf->read_only = create_folder_icon_with_emblem(icon_theme, GQ_ICON_READONLY, GQ_ICON_DIRECTORY, size);
 
-       /* Attempt to use stock gtk icons */
-       pf->close  = gtk_widget_render_icon(widget, GTK_STOCK_DIRECTORY, size, NULL);
-       pf->open   = gtk_widget_render_icon(widget, GTK_STOCK_OPEN, size, NULL);
-       pf->deny   = gtk_widget_render_icon(widget, GTK_STOCK_STOP, size, NULL);
-       pf->parent = gtk_widget_render_icon(widget, GTK_STOCK_GO_UP, size, NULL);
-       pf->link = gtk_widget_render_icon(widget, GTK_STOCK_REDO, size, NULL); /** @FIXME this is not a suitable icon */
-#else
-       /* GQView legacy icons */
-       pf->close  = pixbuf_inline(PIXBUF_INLINE_FOLDER_CLOSED);
-       pf->open   = pixbuf_inline(PIXBUF_INLINE_FOLDER_OPEN);
-       pf->deny   = pixbuf_inline(PIXBUF_INLINE_FOLDER_LOCKED);
-       pf->parent = pixbuf_inline(PIXBUF_INLINE_FOLDER_UP);
-#endif
        return pf;
 }
 
-static void folder_icons_free(PixmapFolders *pf)
+void folder_icons_free(PixmapFolders *pf)
 {
        if (!pf) return;
 
@@ -70,25 +111,26 @@ static void folder_icons_free(PixmapFolders *pf)
        g_object_unref(pf->deny);
        g_object_unref(pf->parent);
        g_object_unref(pf->link);
+       g_object_unref(pf->read_only);
 
        g_free(pf);
 }
 
-
+}
 
 static void vd_notify_cb(FileData *fd, NotifyType type, gpointer data);
 
 static void vd_destroy_cb(GtkWidget *widget, gpointer data)
 {
-       ViewDir *vd = data;
+       auto vd = static_cast<ViewDir *>(data);
 
        file_data_unregister_notify_func(vd_notify_cb, vd);
 
        if (vd->popup)
                {
                g_signal_handlers_disconnect_matched(G_OBJECT(vd->popup), G_SIGNAL_MATCH_DATA,
-                                                    0, 0, 0, NULL, vd);
-               gtk_widget_destroy(vd->popup);
+                                                    0, 0, nullptr, nullptr, vd);
+               g_object_unref(vd->popup);
                }
 
        switch (vd->type)
@@ -108,15 +150,15 @@ static void vd_destroy_cb(GtkWidget *widget, gpointer data)
 
 ViewDir *vd_new(LayoutWindow *lw)
 {
-       ViewDir *vd = g_new0(ViewDir, 1);
+       auto vd = g_new0(ViewDir, 1);
 
-       vd->widget = gtk_scrolled_window_new(NULL, NULL);
-       gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(vd->widget), GTK_SHADOW_IN);
+       vd->widget = gq_gtk_scrolled_window_new(nullptr, nullptr);
+       gq_gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(vd->widget), GTK_SHADOW_IN);
        gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(vd->widget),
                                       GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
 
        vd->layout = lw;
-       vd->pf = folder_icons_new(vd->widget);
+       vd->pf = folder_icons_new();
 
        switch (lw->options.dir_view_type)
                {
@@ -156,10 +198,13 @@ void vd_set_select_func(ViewDir *vd,
        vd->select_data = data;
 }
 
-void vd_set_layout(ViewDir *vd, LayoutWindow *layout)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-function"
+void vd_set_layout_unused(ViewDir *vd, LayoutWindow *layout)
 {
        vd->layout = layout;
 }
+#pragma GCC diagnostic pop
 
 gboolean vd_set_fd(ViewDir *vd, FileData *dir_fd)
 {
@@ -187,7 +232,9 @@ void vd_refresh(ViewDir *vd)
        }
 }
 
-const gchar *vd_row_get_path(ViewDir *vd, gint row)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-function"
+const gchar *vd_row_get_path_unused(ViewDir *vd, gint row)
 {
        const gchar *ret = NULL;
 
@@ -199,6 +246,7 @@ const gchar *vd_row_get_path(ViewDir *vd, gint row)
 
        return ret;
 }
+#pragma GCC diagnostic pop
 
 /* the calling stack is this:
    vd_select_row -> select_func -> layout_set_fd -> vd_set_fd
@@ -218,7 +266,7 @@ gboolean vd_find_row(ViewDir *vd, FileData *fd, GtkTreeIter *iter)
        switch (vd->type)
        {
        case DIRVIEW_LIST: ret = vdlist_find_row(vd, fd, iter); break;
-       case DIRVIEW_TREE: ret = vdtree_find_row(vd, fd, iter, NULL); break;
+       case DIRVIEW_TREE: ret = vdtree_find_row(vd, fd, iter, nullptr); break;
        }
 
        return ret;
@@ -227,7 +275,7 @@ gboolean vd_find_row(ViewDir *vd, FileData *fd, GtkTreeIter *iter)
 FileData *vd_get_fd_from_tree_path(ViewDir *vd, GtkTreeView *tview, GtkTreePath *tpath)
 {
        GtkTreeIter iter;
-       FileData *fd = NULL;
+       FileData *fd = nullptr;
        GtkTreeModel *store;
 
        store = gtk_tree_view_get_model(tview);
@@ -241,7 +289,7 @@ FileData *vd_get_fd_from_tree_path(ViewDir *vd, GtkTreeView *tview, GtkTreePath
                        {
                        NodeData *nd;
                        gtk_tree_model_get(store, &iter, DIR_COLUMN_POINTER, &nd, -1);
-                       fd = (nd) ? nd->fd : NULL;
+                       fd = (nd) ? nd->fd : nullptr;
                        };
                        break;
                }
@@ -251,7 +299,7 @@ FileData *vd_get_fd_from_tree_path(ViewDir *vd, GtkTreeView *tview, GtkTreePath
 
 static void vd_rename_finished_cb(gboolean success, const gchar *new_path, gpointer data)
 {
-       ViewDir *vd = data;
+       auto vd = static_cast<ViewDir *>(data);
        if (success)
                {
                FileData *fd = file_data_new_dir(new_path);
@@ -266,9 +314,9 @@ static void vd_rename_finished_cb(gboolean success, const gchar *new_path, gpoin
                }
 }
 
-static gboolean vd_rename_cb(TreeEditData *td, const gchar *UNUSED(old_name), const gchar *new_name, gpointer data)
+static gboolean vd_rename_cb(TreeEditData *td, const gchar *, const gchar *new_name, gpointer data)
 {
-       ViewDir *vd = data;
+       auto vd = static_cast<ViewDir *>(data);
        FileData *fd;
        gchar *new_path;
        gchar *base;
@@ -322,18 +370,18 @@ void vd_color_set(ViewDir *vd, FileData *fd, gint color_set)
        }
 }
 
-void vd_popup_destroy_cb(GtkWidget *UNUSED(widget), gpointer data)
+void vd_popup_destroy_cb(GtkWidget *, gpointer data)
 {
-       ViewDir *vd = data;
+       auto vd = static_cast<ViewDir *>(data);
 
        vd_color_set(vd, vd->click_fd, FALSE);
-       vd->click_fd = NULL;
-       vd->popup = NULL;
+       vd->click_fd = nullptr;
+       vd->popup = nullptr;
 
        vd_color_set(vd, vd->drop_fd, FALSE);
        filelist_free(vd->drop_list);
-       vd->drop_list = NULL;
-       vd->drop_fd = NULL;
+       vd->drop_list = nullptr;
+       vd->drop_fd = nullptr;
 }
 
 /*
@@ -342,9 +390,9 @@ void vd_popup_destroy_cb(GtkWidget *UNUSED(widget), gpointer data)
  *-----------------------------------------------------------------------------
  */
 
-static void vd_drop_menu_copy_cb(GtkWidget *UNUSED(widget), gpointer data)
+static void vd_drop_menu_copy_cb(GtkWidget *, gpointer data)
 {
-       ViewDir *vd = data;
+       auto vd = static_cast<ViewDir *>(data);
        const gchar *path;
        GList *list;
 
@@ -352,14 +400,14 @@ static void vd_drop_menu_copy_cb(GtkWidget *UNUSED(widget), gpointer data)
 
        path = vd->drop_fd->path;
        list = vd->drop_list;
-       vd->drop_list = NULL;
+       vd->drop_list = nullptr;
 
        file_util_copy_simple(list, path, vd->widget);
 }
 
-static void vd_drop_menu_move_cb(GtkWidget *UNUSED(widget), gpointer data)
+static void vd_drop_menu_move_cb(GtkWidget *, gpointer data)
 {
-       ViewDir *vd = data;
+       auto vd = static_cast<ViewDir *>(data);
        const gchar *path;
        GList *list;
 
@@ -368,26 +416,26 @@ static void vd_drop_menu_move_cb(GtkWidget *UNUSED(widget), gpointer data)
        path = vd->drop_fd->path;
        list = vd->drop_list;
 
-       vd->drop_list = NULL;
+       vd->drop_list = nullptr;
 
        file_util_move_simple(list, path, vd->widget);
 }
 
 static void vd_drop_menu_filter_cb(GtkWidget *widget, gpointer data)
 {
-       ViewDir *vd = data;
+       auto vd = static_cast<ViewDir *>(data);
        const gchar *path;
        GList *list;
        const gchar *key;
 
        if (!vd->drop_fd) return;
 
-       key = g_object_get_data(G_OBJECT(widget), "filter_key");
+       key = static_cast<const gchar *>(g_object_get_data(G_OBJECT(widget), "filter_key"));
 
        path = vd->drop_fd->path;
        list = vd->drop_list;
 
-       vd->drop_list = NULL;
+       vd->drop_list = nullptr;
 
        file_util_start_filter_from_filelist(key, list, path, vd->widget);
 }
@@ -407,14 +455,14 @@ GtkWidget *vd_drop_menu(ViewDir *vd, gint active)
        g_signal_connect(G_OBJECT(menu), "destroy",
                         G_CALLBACK(vd_popup_destroy_cb), vd);
 
-       menu_item_add_stock_sensitive(menu, _("_Copy"), GTK_STOCK_COPY, active,
+       menu_item_add_icon_sensitive(menu, _("_Copy"), GQ_ICON_COPY, active,
                                      G_CALLBACK(vd_drop_menu_copy_cb), vd);
        menu_item_add_sensitive(menu, _("_Move"), active, G_CALLBACK(vd_drop_menu_move_cb), vd);
 
        while (work)
                {
                GtkWidget *item;
-               const EditorDescription *editor = work->data;
+               auto editor = static_cast<const EditorDescription *>(work->data);
                gchar *key;
                work = work->next;
 
@@ -427,7 +475,7 @@ GtkWidget *vd_drop_menu(ViewDir *vd, gint active)
        g_list_free(editors_list);
 
        menu_item_add_divider(menu);
-       menu_item_add_stock(menu, _("Cancel"), GTK_STOCK_CANCEL, NULL, vd);
+       menu_item_add_icon(menu, _("Cancel"), GQ_ICON_CANCEL, nullptr, vd);
 
        return menu;
 }
@@ -438,9 +486,9 @@ GtkWidget *vd_drop_menu(ViewDir *vd, gint active)
  *-----------------------------------------------------------------------------
  */
 
-static void vd_pop_menu_up_cb(GtkWidget *UNUSED(widget), gpointer data)
+static void vd_pop_menu_up_cb(GtkWidget *, gpointer data)
 {
-       ViewDir *vd = data;
+       auto vd = static_cast<ViewDir *>(data);
        gchar *path;
 
        if (!vd->dir_fd || strcmp(vd->dir_fd->path, G_DIR_SEPARATOR_S) == 0) return;
@@ -456,9 +504,9 @@ static void vd_pop_menu_up_cb(GtkWidget *UNUSED(widget), gpointer data)
        g_free(path);
 }
 
-static void vd_pop_menu_slide_cb(GtkWidget *UNUSED(widget), gpointer data)
+static void vd_pop_menu_slide_cb(GtkWidget *, gpointer data)
 {
-       ViewDir *vd = data;
+       auto vd = static_cast<ViewDir *>(data);
 
        if (!vd->layout) return;
        if (!vd->click_fd) return;
@@ -469,15 +517,15 @@ static void vd_pop_menu_slide_cb(GtkWidget *UNUSED(widget), gpointer data)
        layout_image_slideshow_start(vd->layout);
 }
 
-static void vd_pop_menu_slide_rec_cb(GtkWidget *UNUSED(widget), gpointer data)
+static void vd_pop_menu_slide_rec_cb(GtkWidget *, gpointer data)
 {
-       ViewDir *vd = data;
+       auto vd = static_cast<ViewDir *>(data);
        GList *list;
 
        if (!vd->layout) return;
        if (!vd->click_fd) return;
 
-       list = filelist_recursive_full(vd->click_fd, vd->layout->sort_method, vd->layout->sort_ascend);
+       list = filelist_recursive_full(vd->click_fd, vd->layout->options.file_view_list_sort.method, vd->layout->options.file_view_list_sort.ascend, vd->layout->options.file_view_list_sort.case_sensitive);
 
        layout_image_slideshow_stop(vd->layout);
        layout_image_slideshow_start_from_list(vd->layout, list);
@@ -486,7 +534,7 @@ static void vd_pop_menu_slide_rec_cb(GtkWidget *UNUSED(widget), gpointer data)
 static void vd_pop_menu_dupe(ViewDir *vd, gint recursive)
 {
        DupeWindow *dw;
-       GList *list = NULL;
+       GList *list = nullptr;
 
        if (!vd->click_fd) return;
 
@@ -496,7 +544,7 @@ static void vd_pop_menu_dupe(ViewDir *vd, gint recursive)
                }
        else
                {
-               filelist_read(vd->click_fd, &list, NULL);
+               filelist_read(vd->click_fd, &list, nullptr);
                list = filelist_filter(list, FALSE);
                }
 
@@ -506,38 +554,38 @@ static void vd_pop_menu_dupe(ViewDir *vd, gint recursive)
        filelist_free(list);
 }
 
-static void vd_pop_menu_dupe_cb(GtkWidget *UNUSED(widget), gpointer data)
+static void vd_pop_menu_dupe_cb(GtkWidget *, gpointer data)
 {
-       ViewDir *vd = data;
+       auto vd = static_cast<ViewDir *>(data);
        vd_pop_menu_dupe(vd, FALSE);
 }
 
-static void vd_pop_menu_dupe_rec_cb(GtkWidget *UNUSED(widget), gpointer data)
+static void vd_pop_menu_dupe_rec_cb(GtkWidget *, gpointer data)
 {
-       ViewDir *vd = data;
+       auto vd = static_cast<ViewDir *>(data);
        vd_pop_menu_dupe(vd, TRUE);
 }
 
-static void vd_pop_menu_delete_cb(GtkWidget *UNUSED(widget), gpointer data)
+static void vd_pop_menu_delete_cb(GtkWidget *, gpointer data)
 {
-       ViewDir *vd = data;
+       auto vd = static_cast<ViewDir *>(data);
 
        if (!vd->click_fd) return;
        file_util_delete_dir(vd->click_fd, vd->widget);
 }
 
-static void vd_pop_menu_copy_path_cb(GtkWidget *UNUSED(widget), gpointer data)
+static void vd_pop_menu_copy_path_cb(GtkWidget *, gpointer data)
 {
-       ViewDir *vd = data;
+       auto vd = static_cast<ViewDir *>(data);
 
        if (!vd->click_fd) return;
 
        file_util_copy_path_to_clipboard(vd->click_fd, TRUE);
 }
 
-static void vd_pop_menu_copy_path_unquoted_cb(GtkWidget *UNUSED(widget), gpointer data)
+static void vd_pop_menu_copy_path_unquoted_cb(GtkWidget *, gpointer data)
 {
-       ViewDir *vd = data;
+       auto vd = static_cast<ViewDir *>(data);
 
        if (!vd->click_fd) return;
 
@@ -546,22 +594,22 @@ static void vd_pop_menu_copy_path_unquoted_cb(GtkWidget *UNUSED(widget), gpointe
 
 static void vd_pop_submenu_dir_view_as_cb(GtkWidget *widget, gpointer data)
 {
-       ViewDir *vd = data;
+       auto vd = static_cast<ViewDir *>(data);
 
-       DirViewType new_type = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), "menu_item_radio_data"));
+       auto new_type = static_cast<DirViewType>(GPOINTER_TO_INT((g_object_get_data(G_OBJECT(widget), "menu_item_radio_data"))));
        layout_views_set(vd->layout, new_type, vd->layout->options.file_view_type);
 }
 
-static void vd_pop_menu_refresh_cb(GtkWidget *UNUSED(widget), gpointer data)
+static void vd_pop_menu_refresh_cb(GtkWidget *, gpointer data)
 {
-       ViewDir *vd = data;
+       auto vd = static_cast<ViewDir *>(data);
 
        if (vd->layout) layout_refresh(vd->layout);
 }
 
-static void vd_toggle_show_hidden_files_cb(GtkWidget *UNUSED(widget), gpointer data)
+static void vd_toggle_show_hidden_files_cb(GtkWidget *, gpointer data)
 {
-       ViewDir *vd = data;
+       auto vd = static_cast<ViewDir *>(data);
 
        options->file_filter.show_hidden_files = !options->file_filter.show_hidden_files;
        if (vd->layout) layout_refresh(vd->layout);
@@ -569,8 +617,8 @@ static void vd_toggle_show_hidden_files_cb(GtkWidget *UNUSED(widget), gpointer d
 
 static void vd_pop_menu_new_folder_cb(gboolean success, const gchar *new_path, gpointer data)
 {
-       ViewDir *vd = data;
-       FileData *fd = NULL;
+       auto vd = static_cast<ViewDir *>(data);
+       FileData *fd = nullptr;
        GtkTreeIter iter;
        GtkTreePath *tpath;
        GtkTreeModel *store;
@@ -582,7 +630,7 @@ static void vd_pop_menu_new_folder_cb(gboolean success, const gchar *new_path, g
                case DIRVIEW_LIST:
                        {
                        vd_refresh(vd);
-                       fd = vdlist_row_by_path(vd, new_path, NULL);
+                       fd = vdlist_row_by_path(vd, new_path, nullptr);
                        };
                        break;
                case DIRVIEW_TREE:
@@ -597,15 +645,15 @@ static void vd_pop_menu_new_folder_cb(gboolean success, const gchar *new_path, g
        if (!fd || !vd_find_row(vd, fd, &iter)) return;
        store = gtk_tree_view_get_model(GTK_TREE_VIEW(vd->view));
        tpath = gtk_tree_model_get_path(store, &iter);
-       gtk_tree_view_set_cursor(GTK_TREE_VIEW(vd->view), tpath, NULL, FALSE);
+       gtk_tree_view_set_cursor(GTK_TREE_VIEW(vd->view), tpath, nullptr, FALSE);
 
        gtk_tree_path_free(tpath);
 }
 
-static void vd_pop_menu_new_cb(GtkWidget *UNUSED(widget), gpointer data)
+static void vd_pop_menu_new_cb(GtkWidget *, gpointer data)
 {
-       ViewDir *vd = data;
-       FileData *dir_fd = NULL;
+       auto vd = static_cast<ViewDir *>(data);
+       FileData *dir_fd = nullptr;
 
        switch (vd->type)
                {
@@ -623,19 +671,19 @@ static void vd_pop_menu_new_cb(GtkWidget *UNUSED(widget), gpointer data)
                        break;
                }
 
-       file_util_create_dir(dir_fd, vd->layout->window, vd_pop_menu_new_folder_cb, vd);
+       file_util_create_dir(dir_fd->path, vd->layout->window, vd_pop_menu_new_folder_cb, vd);
 }
 
-static void vd_pop_menu_rename_cb(GtkWidget *UNUSED(widget), gpointer data)
+static void vd_pop_menu_rename_cb(GtkWidget *, gpointer data)
 {
-       ViewDir *vd = data;
+       auto vd = static_cast<ViewDir *>(data);
 
        vd_rename_by_data(vd, vd->click_fd);
 }
 
 static void vd_pop_menu_sort_ascend_cb(GtkWidget *widget, gpointer data)
 {
-       ViewDir *vd = data;
+       auto vd = static_cast<ViewDir *>(data);
        gboolean ascend;
 
        if (!vd) return;
@@ -643,7 +691,22 @@ static void vd_pop_menu_sort_ascend_cb(GtkWidget *widget, gpointer data)
        if (!vd->layout) return;
 
        ascend = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget));
-       layout_views_set_sort(vd->layout, vd->layout->options.dir_view_list_sort.method, ascend);
+       layout_views_set_sort_dir(vd->layout, vd->layout->options.dir_view_list_sort.method, ascend, vd->layout->options.dir_view_list_sort.case_sensitive);
+
+       if (vd->layout) layout_refresh(vd->layout);
+}
+
+static void vd_pop_menu_sort_case_cb(GtkWidget *widget, gpointer data)
+{
+       auto vd = static_cast<ViewDir *>(data);
+       gboolean case_sensitive;
+
+       if (!vd) return;
+
+       if (!vd->layout) return;
+
+       case_sensitive = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget));
+       layout_views_set_sort_dir(vd->layout, vd->layout->options.dir_view_list_sort.method, vd->layout->options.dir_view_list_sort.ascend, case_sensitive);
 
        if (vd->layout) layout_refresh(vd->layout);
 }
@@ -653,16 +716,16 @@ static void vd_pop_menu_sort_cb(GtkWidget *widget, gpointer data)
        ViewDir *vd;
        SortType type;
 
-       vd = submenu_item_get_data(widget);
+       vd = static_cast<ViewDir *>(submenu_item_get_data(widget));
 
        if (!vd) return;
        if (!vd->layout) return;
 
-       type = (SortType)GPOINTER_TO_INT(data);
+       type = static_cast<SortType>GPOINTER_TO_INT(data);
 
-       if (type == SORT_NAME || type == SORT_TIME)
+       if (type == SORT_NAME || type == SORT_NUMBER || type == SORT_TIME)
                {
-               layout_views_set_sort(vd->layout, type, vd->layout->options.dir_view_list_sort.ascend);
+               layout_views_set_sort_dir(vd->layout, type, vd->layout->options.dir_view_list_sort.ascend, vd->layout->options.dir_view_list_sort.case_sensitive);
 
                if (vd->layout) layout_refresh(vd->layout);
                }
@@ -677,7 +740,7 @@ GtkWidget *vd_pop_menu(ViewDir *vd, FileData *fd)
        GtkWidget *submenu;
        GtkWidget *item;
 
-       active = (fd != NULL);
+       active = (fd != nullptr);
        switch (vd->type)
                {
                case DIRVIEW_LIST:
@@ -710,7 +773,7 @@ GtkWidget *vd_pop_menu(ViewDir *vd, FileData *fd)
        g_signal_connect(G_OBJECT(menu), "destroy",
                         G_CALLBACK(vd_popup_destroy_cb), vd);
 
-       menu_item_add_stock_sensitive(menu, _("_Up to parent"), GTK_STOCK_GO_UP,
+       menu_item_add_icon_sensitive(menu, _("_Up to parent"), GQ_ICON_GO_UP,
                                      (vd->dir_fd && strcmp(vd->dir_fd->path, G_DIR_SEPARATOR_S) != 0),
                                      G_CALLBACK(vd_pop_menu_up_cb), vd);
 
@@ -721,9 +784,9 @@ GtkWidget *vd_pop_menu(ViewDir *vd, FileData *fd)
                                G_CALLBACK(vd_pop_menu_slide_rec_cb), vd);
 
        menu_item_add_divider(menu);
-       menu_item_add_stock_sensitive(menu, _("Find _duplicates..."), GTK_STOCK_FIND, active,
+       menu_item_add_icon_sensitive(menu, _("Find _duplicates..."), GQ_ICON_FIND, active,
                                      G_CALLBACK(vd_pop_menu_dupe_cb), vd);
-       menu_item_add_stock_sensitive(menu, _("Find duplicates recursive..."), GTK_STOCK_FIND, active,
+       menu_item_add_icon_sensitive(menu, _("Find duplicates recursive..."), GQ_ICON_FIND, active,
                                      G_CALLBACK(vd_pop_menu_dupe_rec_cb), vd);
 
        menu_item_add_divider(menu);
@@ -740,7 +803,7 @@ GtkWidget *vd_pop_menu(ViewDir *vd, FileData *fd)
        menu_item_add(menu, _("_Copy path unquoted"),
                      G_CALLBACK(vd_pop_menu_copy_path_unquoted_cb), vd);
 
-       menu_item_add_stock_sensitive(menu, _("_Delete..."), GTK_STOCK_DELETE, rename_delete_active,
+       menu_item_add_icon_sensitive(menu, _("_Delete..."), GQ_ICON_DELETE, rename_delete_active,
                                      G_CALLBACK(vd_pop_menu_delete_cb), vd);
        menu_item_add_divider(menu);
 
@@ -753,9 +816,17 @@ GtkWidget *vd_pop_menu(ViewDir *vd, FileData *fd)
 
        if (vd->type == DIRVIEW_LIST)
                {
-               submenu = submenu_add_dir_sort(NULL, G_CALLBACK(vd_pop_menu_sort_cb), vd, FALSE, FALSE, TRUE, vd->layout->options.dir_view_list_sort.method);
+               submenu = submenu_add_dir_sort(nullptr, G_CALLBACK(vd_pop_menu_sort_cb), vd, FALSE, FALSE, TRUE, vd->layout->options.dir_view_list_sort.method);
                menu_item_add_check(submenu, _("Ascending"), vd->layout->options.dir_view_list_sort.ascend, G_CALLBACK(vd_pop_menu_sort_ascend_cb), (vd));
-               item = menu_item_add(menu, _("_Sort"), NULL, NULL);
+               menu_item_add_check(submenu, _("Case"), vd->layout->options.dir_view_list_sort.case_sensitive, G_CALLBACK(vd_pop_menu_sort_case_cb), (vd));
+               item = menu_item_add(menu, _("_Sort"), nullptr, nullptr);
+               gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
+               }
+
+       if (vd->type == DIRVIEW_TREE)
+               {
+               submenu = submenu_add_dir_sort(nullptr, G_CALLBACK(vd_pop_menu_sort_cb), vd, FALSE, FALSE, TRUE, vd->layout->options.dir_view_list_sort.method);
+               item = menu_item_add(menu, _("_Sort"), nullptr, nullptr);
                gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
                }
 
@@ -764,7 +835,7 @@ GtkWidget *vd_pop_menu(ViewDir *vd, FileData *fd)
        menu_item_add_check(menu, _("Show _hidden files"), options->file_filter.show_hidden_files,
                            G_CALLBACK(vd_toggle_show_hidden_files_cb), vd);
 
-       menu_item_add_stock(menu, _("Re_fresh"), GTK_STOCK_REFRESH,
+       menu_item_add_icon(menu, _("Re_fresh"), GQ_ICON_REFRESH,
                            G_CALLBACK(vd_pop_menu_refresh_cb), vd);
 
        return menu;
@@ -772,7 +843,7 @@ GtkWidget *vd_pop_menu(ViewDir *vd, FileData *fd)
 
 void vd_new_folder(ViewDir *vd, FileData *dir_fd)
 {
-       file_util_create_dir(dir_fd, vd->layout->window, vd_pop_menu_new_folder_cb, vd);
+       file_util_create_dir(dir_fd->path, vd->layout->window, vd_pop_menu_new_folder_cb, vd);
 }
 
 /*
@@ -782,7 +853,7 @@ void vd_new_folder(ViewDir *vd, FileData *dir_fd)
  */
 
 static GtkTargetEntry vd_dnd_drop_types[] = {
-       { "text/uri-list", 0, TARGET_URI_LIST }
+       { const_cast<gchar *>("text/uri-list"), 0, TARGET_URI_LIST }
 };
 static gint vd_dnd_drop_types_count = 1;
 
@@ -791,9 +862,9 @@ static void vd_dest_set(ViewDir *vd, gint enable)
        if (enable)
                {
                gtk_drag_dest_set(vd->view,
-                                 GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_DROP,
+                                 static_cast<GtkDestDefaults>(GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_DROP),
                                  vd_dnd_drop_types, vd_dnd_drop_types_count,
-                                 GDK_ACTION_MOVE | GDK_ACTION_COPY);
+                                 static_cast<GdkDragAction>(GDK_ACTION_MOVE | GDK_ACTION_COPY));
                }
        else
                {
@@ -801,11 +872,11 @@ static void vd_dest_set(ViewDir *vd, gint enable)
                }
 }
 
-static void vd_dnd_get(GtkWidget *UNUSED(widget), GdkDragContext *UNUSED(context),
+static void vd_dnd_get(GtkWidget *, GdkDragContext *,
                           GtkSelectionData *selection_data, guint info,
-                          guint UNUSED(time), gpointer data)
+                          guint, gpointer data)
 {
-       ViewDir *vd = data;
+       auto vd = static_cast<ViewDir *>(data);
        GList *list;
 
        if (!vd->click_fd) return;
@@ -814,24 +885,24 @@ static void vd_dnd_get(GtkWidget *UNUSED(widget), GdkDragContext *UNUSED(context
                {
                case TARGET_URI_LIST:
                case TARGET_TEXT_PLAIN:
-                       list = g_list_prepend(NULL, vd->click_fd);
+                       list = g_list_prepend(nullptr, vd->click_fd);
                        uri_selection_data_set_uris_from_filelist(selection_data, list);
                        g_list_free(list);
                        break;
                }
 }
 
-static void vd_dnd_begin(GtkWidget *UNUSED(widget), GdkDragContext *UNUSED(context), gpointer data)
+static void vd_dnd_begin(GtkWidget *, GdkDragContext *, gpointer data)
 {
-       ViewDir *vd = data;
+       auto vd = static_cast<ViewDir *>(data);
 
        vd_color_set(vd, vd->click_fd, TRUE);
        vd_dest_set(vd, FALSE);
 }
 
-static void vd_dnd_end(GtkWidget *UNUSED(widget), GdkDragContext *context, gpointer data)
+static void vd_dnd_end(GtkWidget *, GdkDragContext *context, gpointer data)
 {
-       ViewDir *vd = data;
+       auto vd = static_cast<ViewDir *>(data);
 
        vd_color_set(vd, vd->click_fd, FALSE);
 
@@ -842,20 +913,20 @@ static void vd_dnd_end(GtkWidget *UNUSED(widget), GdkDragContext *context, gpoin
        vd_dest_set(vd, TRUE);
 }
 
-static void vd_dnd_drop_receive(GtkWidget *widget,
-                               GdkDragContext *UNUSED(context), gint x, gint y,
+static void vd_dnd_drop_receive(GtkWidget *widget, GdkDragContext *,
+                               gint x, gint y,
                                GtkSelectionData *selection_data, guint info,
-                               guint UNUSED(time), gpointer data)
+                               guint, gpointer data)
 {
-       ViewDir *vd = data;
+       auto vd = static_cast<ViewDir *>(data);
        GtkTreePath *tpath;
-       FileData *fd = NULL;
+       FileData *fd = nullptr;
        GdkDragAction action = GDK_ACTION_ASK;
 
-       vd->click_fd = NULL;
+       vd->click_fd = nullptr;
 
        if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(widget), x, y,
-                                         &tpath, NULL, NULL, NULL))
+                                         &tpath, nullptr, nullptr, nullptr))
                {
                fd = vd_get_fd_from_tree_path(vd, GTK_TREE_VIEW(widget), tpath);
                gtk_tree_path_free(tpath);
@@ -884,7 +955,7 @@ static void vd_dnd_drop_receive(GtkWidget *widget,
  */
                        GdkModifierType mask;
 
-                       gdk_window_get_pointer(gtk_widget_get_window(widget), NULL, NULL, &mask);
+                       gdk_window_get_pointer(gtk_widget_get_window(widget), nullptr, nullptr, &mask);
                        if (mask & GDK_CONTROL_MASK)
                                {
                                action = GDK_ACTION_COPY;
@@ -910,20 +981,20 @@ static void vd_dnd_drop_receive(GtkWidget *widget,
                                {
                                file_util_copy_simple(list, fd->path, vd->widget);
                                done = TRUE;
-                               list = NULL;
+                               list = nullptr;
                                }
                        else if (action == GDK_ACTION_MOVE)
                                {
                                file_util_move_simple(list, fd->path, vd->widget);
                                done = TRUE;
-                               list = NULL;
+                               list = nullptr;
                                }
                        }
 
                if (done == FALSE)
                        {
                        vd->popup = vd_drop_menu(vd, active);
-                       gtk_menu_popup_at_pointer(GTK_MENU(vd->popup), NULL);
+                       gtk_menu_popup_at_pointer(GTK_MENU(vd->popup), nullptr);
                        }
 
                vd->drop_fd = fd;
@@ -934,10 +1005,10 @@ static void vd_dnd_drop_receive(GtkWidget *widget,
 static void vd_dnd_drop_update(ViewDir *vd, gint x, gint y)
 {
        GtkTreePath *tpath;
-       FileData *fd = NULL;
+       FileData *fd = nullptr;
 
        if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(vd->view), x, y,
-                                         &tpath, NULL, NULL, NULL))
+                                         &tpath, nullptr, nullptr, nullptr))
                {
                fd = vd_get_fd_from_tree_path(vd, GTK_TREE_VIEW(vd->view), tpath);
                gtk_tree_path_free(tpath);
@@ -964,7 +1035,7 @@ void vd_dnd_drop_scroll_cancel(ViewDir *vd)
 
 static gboolean vd_auto_scroll_idle_cb(gpointer data)
 {
-       ViewDir *vd = data;
+       auto vd = static_cast<ViewDir *>(data);
        GdkSeat *seat;
        GdkDevice *device;
 
@@ -977,7 +1048,7 @@ static gboolean vd_auto_scroll_idle_cb(gpointer data)
                window = gtk_widget_get_window(vd->view);
                seat = gdk_display_get_default_seat(gdk_window_get_display(window));
                device = gdk_seat_get_pointer(seat);
-               gdk_window_get_device_position(window, device, &x, &y, NULL);
+               gdk_window_get_device_position(window, device, &x, &y, nullptr);
 
                w = gdk_window_get_width(window);
                h = gdk_window_get_height(window);
@@ -988,12 +1059,12 @@ static gboolean vd_auto_scroll_idle_cb(gpointer data)
                }
 
        vd->drop_scroll_id = 0;
-       return FALSE;
+       return G_SOURCE_REMOVE;
 }
 
-static gboolean vd_auto_scroll_notify_cb(GtkWidget *UNUSED(widget), gint UNUSED(x), gint UNUSED(y), gpointer data)
+static gboolean vd_auto_scroll_notify_cb(GtkWidget *, gint, gint, gpointer data)
 {
-       ViewDir *vd = data;
+       auto vd = static_cast<ViewDir *>(data);
 
        if (!vd->drop_fd || vd->drop_list) return FALSE;
 
@@ -1002,17 +1073,16 @@ static gboolean vd_auto_scroll_notify_cb(GtkWidget *UNUSED(widget), gint UNUSED(
        return TRUE;
 }
 
-static gboolean vd_dnd_drop_motion(GtkWidget *UNUSED(widget), GdkDragContext *context,
-                                  gint x, gint y, guint time, gpointer data)
+static gboolean vd_dnd_drop_motion(GtkWidget *, GdkDragContext *context, gint x, gint y, guint time, gpointer data)
 {
-       ViewDir *vd = data;
+       auto vd = static_cast<ViewDir *>(data);
 
-       vd->click_fd = NULL;
+       vd->click_fd = nullptr;
 
        if (gtk_drag_get_source_widget(context) == vd->view)
                {
                /* from same window */
-               gdk_drag_status(context, 0, time);
+               gdk_drag_status(context, GDK_ACTION_DEFAULT, time);
                return TRUE;
                }
        else
@@ -1024,29 +1094,29 @@ static gboolean vd_dnd_drop_motion(GtkWidget *UNUSED(widget), GdkDragContext *co
 
        if (vd->drop_fd)
                {
-               GtkAdjustment *adj = gtk_tree_view_get_vadjustment(GTK_TREE_VIEW(vd->view));
+               GtkAdjustment *adj = gtk_scrollable_get_vadjustment(GTK_SCROLLABLE(vd->view));
                widget_auto_scroll_start(vd->view, adj, -1, -1, vd_auto_scroll_notify_cb, vd);
                }
 
        return FALSE;
 }
 
-static void vd_dnd_drop_leave(GtkWidget *UNUSED(widget), GdkDragContext *UNUSED(context), guint UNUSED(time), gpointer data)
+static void vd_dnd_drop_leave(GtkWidget *, GdkDragContext *, guint, gpointer data)
 {
-       ViewDir *vd = data;
+       auto vd = static_cast<ViewDir *>(data);
 
        if (vd->drop_fd != vd->click_fd) vd_color_set(vd, vd->drop_fd, FALSE);
 
-       vd->drop_fd = NULL;
+       vd->drop_fd = nullptr;
 
        if (vd->dnd_drop_leave_func) vd->dnd_drop_leave_func(vd);
 }
 
 void vd_dnd_init(ViewDir *vd)
 {
-       gtk_drag_source_set(vd->view, GDK_BUTTON1_MASK | GDK_BUTTON2_MASK,
+       gtk_drag_source_set(vd->view, static_cast<GdkModifierType>(GDK_BUTTON1_MASK | GDK_BUTTON2_MASK),
                            dnd_file_drag_types, dnd_file_drag_types_count,
-                           GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_ASK);
+                           static_cast<GdkDragAction>(GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_ASK));
        g_signal_connect(G_OBJECT(vd->view), "drag_data_get",
                         G_CALLBACK(vd_dnd_get), vd);
        g_signal_connect(G_OBJECT(vd->view), "drag_begin",
@@ -1069,9 +1139,11 @@ void vd_dnd_init(ViewDir *vd)
  *----------------------------------------------------------------------------
  */
 
-void vd_menu_position_cb(GtkMenu *menu, gint *x, gint *y, gboolean *UNUSED(push_in), gpointer data)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-function"
+void vd_menu_position_cb_unused(GtkMenu *menu, gint *x, gint *y, gboolean *, gpointer data)
 {
-       ViewDir *vd = data;
+       ViewDir *vd = static_cast<ViewDir *>(data);
        GtkTreeModel *store;
        GtkTreeIter iter;
        GtkTreePath *tpath;
@@ -1085,50 +1157,58 @@ void vd_menu_position_cb(GtkMenu *menu, gint *x, gint *y, gboolean *UNUSED(push_
        *y += ch;
        popup_menu_position_clamp(menu, x, y, 0);
 }
+#pragma GCC diagnostic pop
 
-void vd_activate_cb(GtkTreeView *tview, GtkTreePath *tpath, GtkTreeViewColumn *UNUSED(column), gpointer data)
+void vd_activate_cb(GtkTreeView *tview, GtkTreePath *tpath, GtkTreeViewColumn *, gpointer data)
 {
-       ViewDir *vd = data;
+       auto vd = static_cast<ViewDir *>(data);
        FileData *fd = vd_get_fd_from_tree_path(vd, tview, tpath);
 
        vd_select_row(vd, fd);
 }
 
-static GdkColor *vd_color_shifted(GtkWidget *widget)
+static GdkRGBA *vd_color_shifted(GtkWidget *widget)
 {
-       static GdkColor color;
-       static GtkWidget *done = NULL;
+       static GdkRGBA color;
+       static GdkRGBA color_style;
+       static GtkWidget *done = nullptr;
 
+#ifdef HAVE_GTK4
+/* @FIXME GTK4 no background color */
+#else
        if (done != widget)
                {
-               GtkStyle *style;
+               GtkStyleContext *style_context;
+
+               style_context = gtk_widget_get_style_context(widget);
+               gtk_style_context_get_background_color(style_context, GTK_STATE_FLAG_NORMAL, &color_style);
+
+               memcpy(&color, &color_style, sizeof(color_style));
 
-               style = gtk_widget_get_style(widget);
-               memcpy(&color, &style->base[GTK_STATE_NORMAL], sizeof(color));
                shift_color(&color, -1, 0);
                done = widget;
                }
+#endif
 
        return &color;
 }
 
-void vd_color_cb(GtkTreeViewColumn *UNUSED(tree_column), GtkCellRenderer *cell,
-                GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data)
+void vd_color_cb(GtkTreeViewColumn *, GtkCellRenderer *cell, GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data)
 {
-       ViewDir *vd = data;
+       auto vd = static_cast<ViewDir *>(data);
        gboolean set;
 
        gtk_tree_model_get(tree_model, iter, DIR_COLUMN_COLOR, &set, -1);
        g_object_set(G_OBJECT(cell),
-                    "cell-background-gdk", vd_color_shifted(vd->view),
+                    "cell-background-rgba", vd_color_shifted(vd->view),
                     "cell-background-set", set, NULL);
 }
 
 gboolean vd_release_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
 {
-       ViewDir *vd = data;
+       auto vd = static_cast<ViewDir *>(data);
        GtkTreePath *tpath;
-       FileData *fd = NULL;
+       FileData *fd = nullptr;
 
        if (defined_mouse_buttons(widget, bevent, vd->layout))
                {
@@ -1145,7 +1225,7 @@ gboolean vd_release_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
 
        if ((bevent->x != 0 || bevent->y != 0) &&
            gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(widget), bevent->x, bevent->y,
-                                         &tpath, NULL, NULL, NULL))
+                                         &tpath, nullptr, nullptr, nullptr))
                {
                fd = vd_get_fd_from_tree_path(vd, GTK_TREE_VIEW(widget), tpath);
                gtk_tree_path_free(tpath);
@@ -1161,7 +1241,7 @@ gboolean vd_release_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
 
 gboolean vd_press_key_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
 {
-       ViewDir *vd = data;
+       auto vd = static_cast<ViewDir *>(data);
        gboolean ret = FALSE;
 
        switch (vd->type)
@@ -1175,17 +1255,17 @@ gboolean vd_press_key_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
 
 gboolean vd_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
 {
-       ViewDir *vd = data;
+       auto vd = static_cast<ViewDir *>(data);
        gboolean ret = FALSE;
        FileData *fd;
        GtkTreePath *tpath;
        GtkTreeIter iter;
-       NodeData *nd = NULL;
+       NodeData *nd = nullptr;
        GtkTreeModel *store;
 
        if (bevent->button == MOUSE_BUTTON_RIGHT)
                {
-               if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(widget), bevent->x, bevent->y, &tpath, NULL, NULL, NULL))
+               if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(widget), bevent->x, bevent->y, &tpath, nullptr, nullptr, nullptr))
                        {
                        store = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
                        gtk_tree_model_get_iter(store, &iter, tpath);
@@ -1198,7 +1278,7 @@ gboolean vd_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
                                        break;
                                case DIRVIEW_TREE:
                                        gtk_tree_model_get(store, &iter, DIR_COLUMN_POINTER, &nd, -1);
-                                       vd->click_fd = (nd) ? nd->fd : NULL;
+                                       vd->click_fd = (nd) ? nd->fd : nullptr;
                                }
 
                        if (vd->click_fd)
@@ -1208,7 +1288,7 @@ gboolean vd_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
                        }
 
                vd->popup = vd_pop_menu(vd, vd->click_fd);
-               gtk_menu_popup_at_pointer(GTK_MENU(vd->popup), NULL);
+               gtk_menu_popup_at_pointer(GTK_MENU(vd->popup), nullptr);
 
                return TRUE;
                }
@@ -1224,7 +1304,7 @@ gboolean vd_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
 
 static void vd_notify_cb(FileData *fd, NotifyType type, gpointer data)
 {
-       ViewDir *vd = data;
+       auto vd = static_cast<ViewDir *>(data);
        gboolean refresh;
        gchar *base;