diff options
author | Amadeusz Sławiński <amade@asmblr.net> | 2010-11-28 18:52:18 +0100 |
---|---|---|
committer | Amadeusz Sławiński <amade@asmblr.net> | 2015-06-10 23:09:58 +0200 |
commit | 6721b8d1f5d80ee55ce208ac882141fdf1e426fa (patch) | |
tree | aa2c413d58e3b50df6540f015400812fd576236e | |
parent | 6795815fe1a9d7a12c4fbe3d407ed06377377b14 (diff) | |
download | screen-6721b8d1f5d80ee55ce208ac882141fdf1e426fa.tar.gz |
port of bumpandcollapse patch
original patch by D Andrew Reynhout
http://www.quesera.com/reynhout/misc/screen+bumpandcollapse/
Signed-off-by: Amadeusz Sławiński <amade@asmblr.net>
-rw-r--r-- | src/comm.c | 3 | ||||
-rw-r--r-- | src/list_window.c | 4 | ||||
-rw-r--r-- | src/process.c | 30 | ||||
-rw-r--r-- | src/window.c | 32 | ||||
-rw-r--r-- | src/window.h | 2 |
5 files changed, 48 insertions, 23 deletions
@@ -111,6 +111,8 @@ struct comm comms[RC_LAST + 1] = #ifdef COPY_PASTE { "bufferfile", ARGS_01 }, #endif + { "bumpleft", ARGS_0 }, + { "bumpright", ARGS_0 }, { "c1", NEED_FORE|ARGS_01 }, { "caption", ARGS_12 }, #ifdef MULTIUSER @@ -122,6 +124,7 @@ struct comm comms[RC_LAST + 1] = { "cjkwidth", ARGS_01 }, #endif { "clear", NEED_FORE|ARGS_0 }, + { "collapse", ARGS_0 }, { "colon", NEED_LAYER|ARGS_01 }, { "command", NEED_DISPLAY|ARGS_02 }, #ifdef COPY_PASTE diff --git a/src/list_window.c b/src/list_window.c index 2242de9..3e64714 100644 --- a/src/list_window.c +++ b/src/list_window.c @@ -389,7 +389,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, pw->w_number); + WindowChangeNumber(win->w_number, pw->w_number); } break; @@ -401,7 +401,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, nw->w_number); + WindowChangeNumber(win->w_number, nw->w_number); } break; diff --git a/src/process.c b/src/process.c index 1f83573..25ba311 100644 --- a/src/process.c +++ b/src/process.c @@ -129,6 +129,7 @@ static void SaveAction __P((struct action *, int, char **, int *)); static int NextWindow __P((void)); static int PreviousWindow __P((void)); static int MoreWindows __P((void)); +static void CollapseWindowlist __P((void)); static void LogToggle __P((int)); static void ShowInfo __P((void)); static void ShowDInfo __P((void)); @@ -3005,6 +3006,17 @@ int key; if (msgok) OutputMsg(0, "silencewait set to %d seconds", SilenceWait); break; + case RC_BUMPRIGHT: + if (fore->w_number < NextWindow()) + WindowChangeNumber(fore->w_number, NextWindow()); + break; + case RC_BUMPLEFT: + if (fore->w_number > PreviousWindow()) + WindowChangeNumber(fore->w_number, PreviousWindow()); + break; + case RC_COLLAPSE: + CollapseWindowlist(); + break; case RC_NUMBER: if (*args == 0) OutputMsg(0, queryflag >= 0 ? "%d (%s)" : "This is window %d (%s).", fore->w_number, fore->w_title); @@ -3027,7 +3039,7 @@ int key; n += old; else if (rel < 0) n = old - n; - if (!WindowChangeNumber(fore, n)) + if (!WindowChangeNumber(old, n)) { /* Window number could not be changed. */ queryflag = -1; @@ -4602,6 +4614,22 @@ int key; #undef OutputMsg void +CollapseWindowlist() +/* renumber windows from 0, leaving no gaps */ +{ + int pos, moveto=0; + + for (pos = 1; pos < MAXWIN; pos++) + if (wtab[pos]) + for (; moveto < pos; moveto++) + if (!wtab[moveto]) + { + WindowChangeNumber(pos, moveto); + break; + } +} + +void DoCommand(argv, argl) char **argv; int *argl; diff --git a/src/window.c b/src/window.c index 53cffcd..c68a8d5 100644 --- a/src/window.c +++ b/src/window.c @@ -2308,49 +2308,43 @@ struct display *d; #endif int -WindowChangeNumber(struct win *win, int n) +WindowChangeNumber(int old, int dest) { - struct win *p; - int old = win->w_number; + struct win *p, *win_old; - if (n < 0 || n >= maxwin) + if (dest < 0 || dest >= maxwin) { Msg(0, "Given window position is invalid."); return 0; } - p = wtab[n]; - wtab[n] = win; - win->w_number = n; + win_old = wtab[old]; + p = wtab[dest]; + wtab[dest] = win_old; + win_old->w_number = dest; wtab[old] = p; if (p) p->w_number = old; #ifdef MULTIUSER /* exchange the acls for these windows. */ - AclWinSwap(old, n); + AclWinSwap(old, dest); #endif #ifdef UTMPOK /* exchange the utmp-slots for these windows */ - if ((win->w_slot != (slot_t) -1) && (win->w_slot != (slot_t) 0)) + if ((win_old->w_slot != (slot_t) -1) && (win_old->w_slot != (slot_t) 0)) { - RemoveUtmp(win); - SetUtmp(win); + RemoveUtmp(win_old); + SetUtmp(win_old); } if (p && (p->w_slot != (slot_t) -1) && (p->w_slot != (slot_t) 0)) { - /* XXX: first display wins? */ -#if 0 - /* Does this make more sense? */ - display = p->w_lastdisp ? p->w_lastdisp : p->w_layer.l_cvlist ? p->w_layer.l_cvlist->c_display : 0; -#else - display = win->w_layer.l_cvlist ? win->w_layer.l_cvlist->c_display : 0; -#endif + display = win_old->w_layer.l_cvlist ? win_old->w_layer.l_cvlist->c_display : 0; RemoveUtmp(p); SetUtmp(p); } #endif - WindowChanged(win, 'n'); + WindowChanged(win_old, 'n'); WindowChanged((struct win *)0, 'w'); WindowChanged((struct win *)0, 'W'); WindowChanged((struct win *)0, 0); diff --git a/src/window.h b/src/window.h index f14ed04..3272b1c 100644 --- a/src/window.h +++ b/src/window.h @@ -346,7 +346,7 @@ struct win #define Layer2Window(l) ((struct win *)(l)->l_bottom->l_data) -int WindowChangeNumber __P((struct win *, int)); +int WindowChangeNumber __P((int, int)); #endif /* SCREEN_WINDOW_H */ |