#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;
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)
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)
{
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)
{
}
}
-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;
return ret;
}
+#pragma GCC diagnostic pop
/* the calling stack is this:
vd_select_row -> select_func -> layout_set_fd -> vd_set_fd
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;
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);
{
NodeData *nd;
gtk_tree_model_get(store, &iter, DIR_COLUMN_POINTER, &nd, -1);
- fd = (nd) ? nd->fd : NULL;
+ fd = (nd) ? nd->fd : nullptr;
};
break;
}
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);
}
}
-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;
}
}
-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;
}
/*
*-----------------------------------------------------------------------------
*/
-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;
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;
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);
}
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;
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;
}
*-----------------------------------------------------------------------------
*/
-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;
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;
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);
static void vd_pop_menu_dupe(ViewDir *vd, gint recursive)
{
DupeWindow *dw;
- GList *list = NULL;
+ GList *list = nullptr;
if (!vd->click_fd) return;
}
else
{
- filelist_read(vd->click_fd, &list, NULL);
+ filelist_read(vd->click_fd, &list, nullptr);
list = filelist_filter(list, FALSE);
}
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;
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);
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;
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:
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)
{
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;
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);
}
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);
}
GtkWidget *submenu;
GtkWidget *item;
- active = (fd != NULL);
+ active = (fd != nullptr);
switch (vd->type)
{
case DIRVIEW_LIST:
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);
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);
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);
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);
}
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;
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);
}
/*
*/
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;
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
{
}
}
-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;
{
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);
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);
*/
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;
{
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;
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);
static gboolean vd_auto_scroll_idle_cb(gpointer data)
{
- ViewDir *vd = data;
+ auto vd = static_cast<ViewDir *>(data);
GdkSeat *seat;
GdkDevice *device;
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);
}
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;
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
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",
*----------------------------------------------------------------------------
*/
-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;
*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))
{
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);
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)
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);
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)
}
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;
}
static void vd_notify_cb(FileData *fd, NotifyType type, gpointer data)
{
- ViewDir *vd = data;
+ auto vd = static_cast<ViewDir *>(data);
gboolean refresh;
gchar *base;