summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAmadeusz Sławiński (amade) <amade@asmblr.net>2011-03-04 22:18:55 +0100
committerAmadeusz Sławiński <amade@asmblr.net>2014-07-24 11:50:46 +0200
commit120b6d87ddbdd5ca875b708fd3a0e4561680f2ff (patch)
treec694c5b494c416834db5c14e853124e0a5a5ca15
parent690131f5691a8d4692f0c3ffc035dc88230c1ea7 (diff)
downloadscreen-120b6d87ddbdd5ca875b708fd3a0e4561680f2ff.tar.gz
Implement sort command
Based on http://lists.gnu.org/archive/html/screen-users/2011-03/msg00004.html
-rw-r--r--src/comm.c1
-rw-r--r--src/list_window.c4
-rw-r--r--src/process.c31
-rw-r--r--src/window.c2
-rw-r--r--src/window.h2
5 files changed, 32 insertions, 8 deletions
diff --git a/src/comm.c b/src/comm.c
index c7cb04a..d80f01c 100644
--- a/src/comm.c
+++ b/src/comm.c
@@ -194,6 +194,7 @@ struct comm comms[RC_LAST + 1] =
{ "sleep", ARGS_1, {NULL} },
{ "slowpaste", NEED_FORE|ARGS_01, {NULL} },
{ "sorendition", ARGS_012, {NULL} },
+ { "sort", ARGS_0, {NULL} },
{ "source", ARGS_1, {NULL} },
{ "split", NEED_DISPLAY|ARGS_01, {NULL} },
{ "startup_message", ARGS_1, {NULL} },
diff --git a/src/list_window.c b/src/list_window.c
index 7fe2e81..6b2edbd 100644
--- a/src/list_window.c
+++ b/src/list_window.c
@@ -373,7 +373,7 @@ gl_Window_input(struct ListData *ldata, char **inp, int *len)
* with NULL window. So that causes a redraw of the entire list. So reset the
* 'selected' after that. */
wdata->fore = win;
- WindowChangeNumber(win->w_number, pw->w_number);
+ SwapWindows(win->w_number, pw->w_number);
}
break;
@@ -385,7 +385,7 @@ gl_Window_input(struct ListData *ldata, char **inp, int *len)
break; /* Do not allow switching with the parent group */
wdata->fore = win;
- WindowChangeNumber(win->w_number, nw->w_number);
+ SwapWindows(win->w_number, nw->w_number);
}
break;
diff --git a/src/process.c b/src/process.c
index 05e57dc..b3765ad 100644
--- a/src/process.c
+++ b/src/process.c
@@ -3905,11 +3905,11 @@ DoAction(struct action *act, int key)
break;
case RC_BUMPRIGHT:
if (fore->w_number < NextWindow())
- WindowChangeNumber(fore->w_number, NextWindow());
+ SwapWindows(fore->w_number, NextWindow());
break;
case RC_BUMPLEFT:
if (fore->w_number > PreviousWindow())
- WindowChangeNumber(fore->w_number, PreviousWindow());
+ SwapWindows(fore->w_number, PreviousWindow());
break;
case RC_COLLAPSE:
CollapseWindowlist();
@@ -3936,7 +3936,7 @@ DoAction(struct action *act, int key)
n += old;
else if (rel < 0)
n = old - n;
- if (!WindowChangeNumber(old, n))
+ if (!SwapWindows(old, n))
{
/* Window number could not be changed. */
queryflag = -1;
@@ -3944,6 +3944,29 @@ DoAction(struct action *act, int key)
}
}
break;
+ case RC_SORT:
+ i = 0;
+ if (!wtab[i] || !wtab[i+1])
+ {
+ Msg(0, "Less than two windows, sorting makes no sense.\n");
+ break;
+ }
+ for (i = 0; wtab[i+1] != NULL; i++)
+ {
+ for (n = i, nr = i; wtab[n+1] != NULL; n++)
+ {
+ if (strcmp(wtab[nr]->w_title,wtab[n+1]->w_title) > 0)
+ {
+ nr = n+1;
+ }
+ }
+ if (nr != i)
+ {
+ SwapWindows(nr, i);
+ }
+ }
+ WindowChanged((struct win *)0, 0);
+ break;
case RC_SILENCE:
n = fore->w_silence != 0;
i = fore->w_silencewait;
@@ -5397,7 +5420,7 @@ CollapseWindowlist()
for (; moveto < pos; moveto++)
if (!wtab[moveto])
{
- WindowChangeNumber(pos, moveto);
+ SwapWindows(pos, moveto);
break;
}
}
diff --git a/src/window.c b/src/window.c
index 2672bab..15be6aa 100644
--- a/src/window.c
+++ b/src/window.c
@@ -2057,7 +2057,7 @@ zmodem_abort(struct win *p, struct display *d)
int
-WindowChangeNumber(int old, int dest)
+SwapWindows(int old, int dest)
{
struct win *p, *win_old;
diff --git a/src/window.h b/src/window.h
index e07f5bd..23b0811 100644
--- a/src/window.h
+++ b/src/window.h
@@ -307,7 +307,7 @@ struct win
#define Layer2Window(l) ((struct win *)(l)->l_bottom->l_data)
-int WindowChangeNumber (int, int);
+int SwapWindows (int, int);
#endif /* SCREEN_WINDOW_H */