diff options
author | Alexander Naumov <posix.ru@gmail.com> | 2015-06-03 13:28:39 +0200 |
---|---|---|
committer | Alexander Naumov <posix.ru@gmail.com> | 2015-06-03 13:28:39 +0200 |
commit | 93fc5a42ad401cc2ef461f7e536b9b72210d6060 (patch) | |
tree | 45f26aab2092684bf47621505bef1ea9f37eb0d1 | |
parent | 54d3b3ca4f7b51a1a42c74225af89609d10f958e (diff) | |
download | screen-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.c | 1 | ||||
-rw-r--r-- | src/doc/screen.1 | 5 | ||||
-rw-r--r-- | src/process.c | 43 |
3 files changed, 49 insertions, 0 deletions
@@ -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; |