summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAmadeusz Sławiński <amade@asmblr.net>2010-11-28 18:52:18 +0100
committerAmadeusz Sławiński <amade@asmblr.net>2014-05-03 19:41:20 +0200
commit8a834f6a35cf928d04e161e8e14103a20eb204ed (patch)
tree48af875ea34ce6370ce525bc236b64943fafa8bc
parent0418904ae78dfed334fd90d43a82d336422943e6 (diff)
downloadscreen-8a834f6a35cf928d04e161e8e14103a20eb204ed.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.c3
-rw-r--r--src/list_window.c4
-rw-r--r--src/process.c34
-rw-r--r--src/window.c32
-rw-r--r--src/window.h2
5 files changed, 52 insertions, 23 deletions
diff --git a/src/comm.c b/src/comm.c
index a086859..696f982 100644
--- a/src/comm.c
+++ b/src/comm.c
@@ -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 d9c69cf..cb8f170 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));
@@ -625,6 +626,10 @@ InitKeytab()
ktab['<'].nr = RC_READBUF;
ktab['='].nr = RC_REMOVEBUF;
#endif
+/* co-opting "^A [<>=]", looking for alternatives */
+ ktab['>'].nr = ktab[Ctrl('.')].nr = RC_BUMPRIGHT;
+ ktab['<'].nr = ktab[Ctrl(',')].nr = RC_BUMPLEFT;
+ ktab['='].nr = RC_COLLAPSE;
#ifdef POW_DETACH
ktab['D'].nr = RC_POW_DETACH;
#endif
@@ -3000,6 +3005,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);
@@ -3022,7 +3038,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;
@@ -4538,6 +4554,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 c9d6817..afc8c8c 100644
--- a/src/window.c
+++ b/src/window.c
@@ -2277,49 +2277,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 7311ecb..7c56a3e 100644
--- a/src/window.h
+++ b/src/window.h
@@ -343,7 +343,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 */