From a63aac0b11c1bc8e54eed95f2fce6fd6dbb41ca8 Mon Sep 17 00:00:00 2001
From: sin <sin@2f30.org>
Date: Sat, 31 Jan 2015 22:02:59 +0000
Subject: [PATCH] Add 't' command to sort output by entry's mtime

---
 config.def.h |  1 +
 noice.1      |  2 ++
 noice.c      | 10 ++++++++++
 3 files changed, 13 insertions(+)

diff --git a/config.def.h b/config.def.h
index 996436f..3b12199 100644
--- a/config.def.h
+++ b/config.def.h
@@ -47,4 +47,5 @@ struct key bindings[] = {
 	{ '!',            SEL_SH },
 	/* Change dir */
 	{ 'c',            SEL_CD },
+	{ 't',            SEL_MTIME },
 };
diff --git a/noice.1 b/noice.1
index 61669e5..d3d0879 100644
--- a/noice.1
+++ b/noice.1
@@ -47,6 +47,8 @@ Change filter (see below for more information).
 Enter filter-as-you-type mode.
 .It Ic c
 Change into the given directory.
+.It Ic t
+Sort by time modified.
 .It Ic !
 Spawn shell in current directory.
 .It Ic q
diff --git a/noice.c b/noice.c
index 5358111..04115cf 100644
--- a/noice.c
+++ b/noice.c
@@ -56,6 +56,7 @@ enum action {
 	SEL_PGUP,
 	SEL_SH,
 	SEL_CD,
+	SEL_MTIME,
 };
 
 struct key {
@@ -68,8 +69,11 @@ struct key {
 struct entry {
 	char *name;
 	mode_t mode;
+	time_t t;
 };
 
+int mtimeorder;
+
 /*
  * Layout:
  * .---------
@@ -231,6 +235,8 @@ entrycmp(const void *va, const void *vb)
 	a = (struct entry *)va;
 	b = (struct entry *)vb;
 
+	if (mtimeorder)
+		return b->t - a->t;
 	return strcmp(a->name, b->name);
 }
 
@@ -487,6 +493,7 @@ dentfill(char *path, struct entry **dents,
 		if (r == -1)
 			printerr(1, "lstat");
 		(*dents)[n].mode = sb.st_mode;
+		(*dents)[n].t = sb.st_mtime;
 		n++;
 	}
 
@@ -809,6 +816,9 @@ moretyping:
 			filter = xstrdup(ifilter); /* Reset filter */
 			DPRINTF_S(path);
 			goto out;
+		case SEL_MTIME:
+			mtimeorder = !mtimeorder;
+			goto out;
 		}
 	}