Fix representing percent in c-format string
[geeqie.git] / src / view-dir-list.cc
index 7295c87..5cf69f7 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#include "main.h"
 #include "view-dir-list.h"
 
+#include <unistd.h>
+
+#include <cstdlib>
+#include <cstring>
+
+#include <gdk-pixbuf/gdk-pixbuf.h>
+#include <glib-object.h>
+
 #include "filedata.h"
+#include "layout.h"
+#include "options.h"
+#include "typedefs.h"
 #include "ui-fileops.h"
 #include "ui-tree-edit.h"
 #include "view-dir.h"
 
-#define VDLIST(_vd_) ((ViewDirInfoList *)(_vd_->info))
+struct ViewDirInfoList
+{
+       GList *list;
+};
+
+#define VDLIST(_vd_) ((ViewDirInfoList *)((_vd_)->info))
 
 
 /*
@@ -64,14 +79,14 @@ FileData *vdlist_row_by_path(ViewDir *vd, const gchar *path, gint *row)
        if (!path)
                {
                if (row) *row = -1;
-               return NULL;
+               return nullptr;
                }
 
        n = 0;
        work = VDLIST(vd)->list;
        while (work)
                {
-               FileData *fd = work->data;
+               auto fd = static_cast<FileData *>(work->data);
                if (strcmp(fd->path, path) == 0)
                        {
                        if (row) *row = n;
@@ -82,7 +97,7 @@ FileData *vdlist_row_by_path(ViewDir *vd, const gchar *path, gint *row)
                }
 
        if (row) *row = -1;
-       return NULL;
+       return nullptr;
 }
 
 /*
@@ -102,8 +117,8 @@ static void vdlist_scroll_to_row(ViewDir *vd, FileData *fd, gfloat y_align)
 
                store = gtk_tree_view_get_model(GTK_TREE_VIEW(vd->view));
                tpath = gtk_tree_model_get_path(store, &iter);
-               gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(vd->view), tpath, NULL, TRUE, y_align, 0.0);
-               gtk_tree_view_set_cursor(GTK_TREE_VIEW(vd->view), tpath, NULL, FALSE);
+               gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(vd->view), tpath, nullptr, TRUE, y_align, 0.0);
+               gtk_tree_view_set_cursor(GTK_TREE_VIEW(vd->view), tpath, nullptr, FALSE);
                gtk_tree_path_free(tpath);
 
                if (!gtk_widget_has_focus(vd->view)) gtk_widget_grab_focus(vd->view);
@@ -120,11 +135,11 @@ const gchar *vdlist_row_get_path(ViewDir *vd, gint row)
 {
        FileData *fd;
 
-       fd = g_list_nth_data(VDLIST(vd)->list, row);
+       fd = static_cast<FileData *>(g_list_nth_data(VDLIST(vd)->list, row));
 
        if (fd) return fd->path;
 
-       return NULL;
+       return nullptr;
 }
 
 static gboolean vdlist_populate(ViewDir *vd, gboolean clear)
@@ -139,18 +154,20 @@ static gboolean vdlist_populate(ViewDir *vd, gboolean clear)
        FileData *fd;
        SortType sort_type = SORT_NAME;
        gboolean sort_ascend = TRUE;
-       gchar *link = NULL;
+       gboolean sort_case = TRUE;
+       gchar *link = nullptr;
 
        if (vd->layout)
                {
                sort_type = vd->layout->options.dir_view_list_sort.method;
                sort_ascend = vd->layout->options.dir_view_list_sort.ascend;
+               sort_case = vd->layout->options.dir_view_list_sort.case_sensitive;
                }
 
        old_list = VDLIST(vd)->list;
 
-       ret = filelist_read(vd->dir_fd, NULL, &VDLIST(vd)->list);
-       VDLIST(vd)->list = filelist_sort(VDLIST(vd)->list, sort_type, sort_ascend);
+       ret = filelist_read(vd->dir_fd, nullptr, &VDLIST(vd)->list);
+       VDLIST(vd)->list = filelist_sort(VDLIST(vd)->list, sort_type, sort_ascend, sort_case);
 
        /* add . and .. */
 
@@ -173,7 +190,7 @@ static gboolean vdlist_populate(ViewDir *vd, gboolean clear)
        store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(vd->view)));
        if (clear) gtk_list_store_clear(store);
 
-       valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(store), &iter, NULL);
+       valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(store), &iter, nullptr);
 
        work = VDLIST(vd)->list;
        while (work)
@@ -183,7 +200,7 @@ static gboolean vdlist_populate(ViewDir *vd, gboolean clear)
                const gchar *date = "";
                gboolean done = FALSE;
 
-               fd = work->data;
+               fd = static_cast<FileData *>(work->data);
 
                if (access_file(fd->path, R_OK | X_OK) && fd->name)
                        {
@@ -199,6 +216,10 @@ static gboolean vdlist_populate(ViewDir *vd, gboolean clear)
                                {
                                pixbuf = vd->pf->parent;
                                }
+                       else if (!access_file(fd->path, W_OK) )
+                               {
+                               pixbuf = vd->pf->read_only;
+                               }
                        else
                                {
                                pixbuf = vd->pf->close;
@@ -213,7 +234,7 @@ static gboolean vdlist_populate(ViewDir *vd, gboolean clear)
 
                while (!done)
                        {
-                       FileData *old_fd = NULL;
+                       FileData *old_fd = nullptr;
 
                        if (valid)
                                {
@@ -240,11 +261,11 @@ static gboolean vdlist_populate(ViewDir *vd, gboolean clear)
 
                        if (islink(fd->path))
                                {
-                               link = realpath(fd->path, NULL);
+                               link = realpath(fd->path, nullptr);
                                }
                        else
                                {
-                               link = NULL;
+                               link = nullptr;
                                }
 
                        if (match < 0)
@@ -300,8 +321,8 @@ static gboolean vdlist_populate(ViewDir *vd, gboolean clear)
                }
 
 
-       vd->click_fd = NULL;
-       vd->drop_fd = NULL;
+       vd->click_fd = nullptr;
+       vd->drop_fd = nullptr;
 
        filelist_free(old_list);
        g_free(link);
@@ -311,7 +332,7 @@ static gboolean vdlist_populate(ViewDir *vd, gboolean clear)
 gboolean vdlist_set_fd(ViewDir *vd, FileData *dir_fd)
 {
        gboolean ret;
-       gchar *old_path = NULL; /* Used to store directory for walking up */
+       gchar *old_path = nullptr; /* Used to store directory for walking up */
 
        if (!dir_fd) return FALSE;
        if (vd->dir_fd == dir_fd) return TRUE;
@@ -334,13 +355,13 @@ gboolean vdlist_set_fd(ViewDir *vd, FileData *dir_fd)
        ret = vdlist_populate(vd, TRUE);
 
        /* scroll to make last path visible */
-       FileData *found = NULL;
+       FileData *found = nullptr;
        GList *work;
 
        work = VDLIST(vd)->list;
        while (work && !found)
                {
-               FileData *fd = work->data;
+               auto fd = static_cast<FileData *>(work->data);
                if (!old_path || strcmp(old_path, fd->name) == 0) found = fd;
                work = work->next;
                }
@@ -359,12 +380,12 @@ void vdlist_refresh(ViewDir *vd)
 
 gboolean vdlist_press_key_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
 {
-       ViewDir *vd = data;
+       auto vd = static_cast<ViewDir *>(data);
        GtkTreePath *tpath;
 
        if (event->keyval != GDK_KEY_Menu) return FALSE;
 
-       gtk_tree_view_get_cursor(GTK_TREE_VIEW(vd->view), &tpath, NULL);
+       gtk_tree_view_get_cursor(GTK_TREE_VIEW(vd->view), &tpath, nullptr);
        if (tpath)
                {
                GtkTreeModel *store;
@@ -378,34 +399,34 @@ gboolean vdlist_press_key_cb(GtkWidget *widget, GdkEventKey *event, gpointer dat
                }
        else
                {
-               vd->click_fd = NULL;
+               vd->click_fd = nullptr;
                }
 
        vd_color_set(vd, vd->click_fd, TRUE);
 
        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;
 }
 
 gboolean vdlist_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
 {
-       ViewDir *vd = data;
+       auto vd = static_cast<ViewDir *>(data);
        GtkTreePath *tpath;
        GtkTreeIter iter;
-       FileData *fd = NULL;
+       FileData *fd = nullptr;
 
        if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(widget), bevent->x, bevent->y,
-                                         &tpath, NULL, NULL, NULL))
+                                         &tpath, nullptr, nullptr, nullptr))
                {
                GtkTreeModel *store;
 
                store = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
                gtk_tree_model_get_iter(store, &iter, tpath);
                gtk_tree_model_get(store, &iter, DIR_COLUMN_POINTER, &fd, -1);
-               gtk_tree_view_set_cursor(GTK_TREE_VIEW(widget), tpath, NULL, FALSE);
+               gtk_tree_view_set_cursor(GTK_TREE_VIEW(widget), tpath, nullptr, FALSE);
                gtk_tree_path_free(tpath);
                }
 
@@ -417,16 +438,16 @@ gboolean vdlist_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer dat
        if (bevent->button == MOUSE_BUTTON_RIGHT)
                {
                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;
                }
 
        return options->view_dir_list_single_click_enter;
 }
 
-void vdlist_destroy_cb(GtkWidget *UNUSED(widget), gpointer data)
+void vdlist_destroy_cb(GtkWidget *, gpointer data)
 {
-       ViewDir *vd = data;
+       auto vd = static_cast<ViewDir *>(data);
 
        vd_dnd_drop_scroll_cancel(vd);
        widget_auto_scroll_stop(vd->view);
@@ -434,7 +455,7 @@ void vdlist_destroy_cb(GtkWidget *UNUSED(widget), gpointer data)
        filelist_free(VDLIST(vd)->list);
 }
 
-ViewDir *vdlist_new(ViewDir *vd, FileData *UNUSED(dir_fd))
+ViewDir *vdlist_new(ViewDir *vd, FileData *)
 {
        GtkListStore *store;
        GtkTreeSelection *selection;
@@ -461,17 +482,17 @@ ViewDir *vdlist_new(ViewDir *vd, FileData *UNUSED(dir_fd))
        renderer = gtk_cell_renderer_pixbuf_new();
        gtk_tree_view_column_pack_start(column, renderer, FALSE);
        gtk_tree_view_column_add_attribute(column, renderer, "pixbuf", DIR_COLUMN_ICON);
-       gtk_tree_view_column_set_cell_data_func(column, renderer, vd_color_cb, vd, NULL);
+       gtk_tree_view_column_set_cell_data_func(column, renderer, vd_color_cb, vd, nullptr);
 
        renderer = gtk_cell_renderer_text_new();
        gtk_tree_view_column_pack_start(column, renderer, TRUE);
        gtk_tree_view_column_add_attribute(column, renderer, "text", DIR_COLUMN_NAME);
-       gtk_tree_view_column_set_cell_data_func(column, renderer, vd_color_cb, vd, NULL);
+       gtk_tree_view_column_set_cell_data_func(column, renderer, vd_color_cb, vd, nullptr);
 
        renderer = gtk_cell_renderer_text_new();
        gtk_tree_view_column_pack_start(column, renderer, TRUE);
        gtk_tree_view_column_add_attribute(column, renderer, "text", DIR_COLUMN_DATE);
-       gtk_tree_view_column_set_cell_data_func(column, renderer, vd_color_cb, vd, NULL);
+       gtk_tree_view_column_set_cell_data_func(column, renderer, vd_color_cb, vd, nullptr);
 
        gtk_tree_view_append_column(GTK_TREE_VIEW(vd->view), column);