Add directory sorting - noice - small file browser (mirror / fork from 2f30.org)
 (HTM) git clone git://git.codemadness.org/noice
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 4799ca8afd18a7443bdb4faff2ce2c5cd02b84e8
 (DIR) parent 3ae2cb00d7db3a1aec7d0687bdc32c814d96581a
 (HTM) Author: dok <dok@grehack.fr>
       Date:   Sun,  6 Jan 2019 18:42:49 +0100
       
       Add directory sorting
       
       Diffstat:
         M config.def.h                        |       3 +++
         M noice.1                             |       2 ++
         M noice.c                             |      25 +++++++++++++++++++++++++
       
       3 files changed, 30 insertions(+), 0 deletions(-)
       ---
 (DIR) diff --git a/config.def.h b/config.def.h
       @@ -3,6 +3,7 @@
        #define CURSR " > "
        #define EMPTY "   "
        
       +int dirorder    = 0; /* Set to 1 to sort by directory first */
        int mtimeorder  = 0; /* Set to 1 to sort by time modified */
        int icaseorder  = 0; /* Set to 1 to sort by ignoring case */
        int idletimeout = 0; /* Screensaver timeout in seconds, 0 to disable */
       @@ -79,6 +80,8 @@ struct key bindings[] = {
                { '~',            SEL_CDHOME },
                /* Toggle hide .dot files */
                { '.',            SEL_TOGGLEDOT },
       +        /* Toggle sort by directory first */
       +        { 'd',            SEL_DSORT },
                /* Toggle sort by time */
                { 't',            SEL_MTIME },
                /* Toggle case sensitivity */
 (DIR) diff --git a/noice.1 b/noice.1
       @@ -57,6 +57,8 @@ Change to the
        directory.
        .It Ic \&.
        Toggle hidden .dot files.
       +.It Ic d
       +Toggle sort by directory first.
        .It Ic t
        Toggle sort by time modified.
        .It Ic i
 (DIR) diff --git a/noice.c b/noice.c
       @@ -65,6 +65,7 @@ enum action {
                SEL_CD,
                SEL_CDHOME,
                SEL_TOGGLEDOT,
       +        SEL_DSORT,
                SEL_MTIME,
                SEL_ICASE,
                SEL_REDRAW,
       @@ -266,10 +267,28 @@ visible(regex_t *regex, char *file)
        }
        
        int
       +dircmp(mode_t a, mode_t b)
       +{
       +        if (S_ISDIR(a) && S_ISDIR(b))
       +                return 0;
       +        if (!S_ISDIR(a) && !S_ISDIR(b))
       +                return 0;
       +        if (S_ISDIR(a))
       +                return -1;
       +        else
       +                return 1;
       +}
       +
       +int
        entrycmp(const void *va, const void *vb)
        {
                const struct entry *a = va, *b = vb;
        
       +        if (dirorder) {
       +                if (dircmp(a->mode, b->mode) != 0)
       +                        return dircmp(a->mode, b->mode);
       +        }
       +
                if (mtimeorder)
                        return b->t - a->t;
                if (icaseorder)
       @@ -801,6 +820,12 @@ nochange:
                                if (ndents > 0)
                                        mkpath(path, dents[cur].name, oldpath, sizeof(oldpath));
                                goto begin;
       +                case SEL_DSORT:
       +                        dirorder = !dirorder;
       +                        /* Save current */
       +                        if (ndents > 0)
       +                                mkpath(path, dents[cur].name, oldpath, sizeof(oldpath));
       +                        goto begin;
                        case SEL_ICASE:
                                icaseorder = !icaseorder;
                                /* Save current */