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>2015-06-10 23:09:58 +0200
commit6721b8d1f5d80ee55ce208ac882141fdf1e426fa (patch)
treeaa2c413d58e3b50df6540f015400812fd576236e
parent6795815fe1a9d7a12c4fbe3d407ed06377377b14 (diff)
downloadscreen-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.c3
-rw-r--r--src/list_window.c4
-rw-r--r--src/process.c30
-rw-r--r--src/window.c32
-rw-r--r--src/window.h2
5 files changed, 48 insertions, 23 deletions
diff --git a/src/comm.c b/src/comm.c
index abf542c..a298814 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 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 */