summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Naumov <posix.ru@gmail.com>2015-06-03 13:28:39 +0200
committerAlexander Naumov <posix.ru@gmail.com>2015-06-03 13:28:39 +0200
commit93fc5a42ad401cc2ef461f7e536b9b72210d6060 (patch)
tree45f26aab2092684bf47621505bef1ea9f37eb0d1
parent54d3b3ca4f7b51a1a42c74225af89609d10f958e (diff)
downloadscreen-93fc5a42ad401cc2ef461f7e536b9b72210d6060.tar.gz
Sort the windows in alphabetical order of the window tiles
Signed-off-by: Alexander Naumov <alexander_naumov@opensuse.org> Signed-off-by: Thomas Renninger <trenn@suse.de>
-rw-r--r--src/comm.c1
-rw-r--r--src/doc/screen.15
-rw-r--r--src/process.c43
3 files changed, 49 insertions, 0 deletions
diff --git a/src/comm.c b/src/comm.c
index 25779c9..c63bb1e 100644
--- a/src/comm.c
+++ b/src/comm.c
@@ -296,6 +296,7 @@ struct comm comms[RC_LAST + 1] =
{ "sleep", ARGS_1 },
{ "slowpaste", NEED_FORE|ARGS_01 },
{ "sorendition", ARGS_012 },
+ { "sort", ARGS_0},
{ "source", ARGS_1 },
{ "split", NEED_DISPLAY|ARGS_01 },
{ "startup_message", ARGS_1 },
diff --git a/src/doc/screen.1 b/src/doc/screen.1
index b9ab176..33fe978 100644
--- a/src/doc/screen.1
+++ b/src/doc/screen.1
@@ -3022,6 +3022,11 @@ underlying system exposes flow control problems while pasting large amounts of
text.
.sp
.ne 3
+.B sort
+.PP
+Sort the windows in alphabetical order of the window tiles.
+.sp
+.ne 3
.BI "source " file
.PP
Read and execute commands from file \fIfile\fP. Source commands may
diff --git a/src/process.c b/src/process.c
index 8353098..662cae8 100644
--- a/src/process.c
+++ b/src/process.c
@@ -3039,6 +3039,49 @@ int key;
debug1("Setting zombie polling to %d\n", nwin_default.poll_zombie_timeout);
break;
+ case RC_SORT:
+ if (fore) {
+ /* Better do not allow this. Not sure what the utmp stuff in number
+ * command above is for (you get four entries in e.g. /var/log/wtmp
+ * per number switch). But I don't know enough about this.
+ */
+ Msg(0, "Sorting inside a window is not allowed. Push CTRL-a \" "
+ "and try again\n");
+ break;
+ }
+ /*
+ * Simple sort algorithm: Look out for the smallest, put it
+ * to the first place, look out for the 2nd smallest, ...
+ */
+ for (i = 0; i < maxwin ; i++) {
+ if (wtab[i] == NULL)
+ continue;
+ n = i;
+
+ for (nr = i + 1; nr < maxwin; nr++) {
+ if (wtab[nr] == NULL)
+ continue;
+ debug2("Testing window %d and %d.\n", nr, n);
+ if (strcmp(wtab[nr]->w_title,wtab[n]->w_title) < 0)
+ n = nr;
+ }
+
+ if (n != i) {
+ debug2("Exchange window %d and %d.\n", i, n);
+ p = wtab[n];
+ wtab[n] = wtab[i];
+ wtab[i] = p;
+ wtab[n]->w_number = n;
+ wtab[i]->w_number = i;
+#ifdef MULTIUSER
+ /* exchange the acls for these windows. */
+ AclWinSwap(i, n);
+#endif
+ }
+ }
+ WindowChanged((struct win *)0, 0);
+ break;
+
case RC_SILENCE:
n = fore->w_silence != 0;
i = fore->w_silencewait;