screen window hiding patch

Ben Kibbey <[email protected]> Sat, 4 Mar 2006 12:02:03 -0500
Newsgroups gmane.comp.gnu.screen
Message-ID <[email protected]>
This patch adds window hiding from the 'next', 'prev' and 'other'
commands.

-- 
Benjamin J. Kibbey       bjk/freenode/@luxsci.net
3019 F5FC AA33 5BC7 BE9F 09D2 393E DBD2 40D5 FA7E
screen-cvs+hide.diff (text/plain, 8.7 KB)
Index: comm.c
===================================================================
RCS file: /sources/screen/screen/src/comm.c,v
retrieving revision 1.21
diff -u -r1.21 comm.c
--- comm.c	16 Dec 2005 19:06:39 -0000	1.21
+++ comm.c	26 Feb 2006 19:23:15 -0000
@@ -190,6 +190,7 @@
   { "hardstatus",	ARGS_012 },
   { "height",		ARGS_0123 },
   { "help",		NEED_LAYER|ARGS_02 },
+  { "hide",		NEED_FORE|ARGS_01 },
 #ifdef COPY_PASTE
   { "history",		NEED_DISPLAY|NEED_FORE|ARGS_0 },
 #endif
Index: comm.h.dist
===================================================================
RCS file: /sources/screen/screen/src/comm.h.dist,v
retrieving revision 1.11
diff -u -r1.11 comm.h.dist
--- comm.h.dist	16 Dec 2005 18:44:47 -0000	1.11
+++ comm.h.dist	26 Feb 2006 19:23:15 -0000
@@ -223,5 +223,6 @@
 #define RC_XON 172
 #define RC_ZMODEM 173
 #define RC_ZOMBIE 174
+#define RC_HIDE 175
 
-#define RC_LAST 174
+#define RC_LAST 175
Index: process.c
===================================================================
RCS file: /sources/screen/screen/src/process.c,v
retrieving revision 1.22
diff -u -r1.22 process.c
--- process.c	19 Dec 2005 16:13:08 -0000	1.22
+++ process.c	26 Feb 2006 19:23:23 -0000
@@ -1025,6 +1025,49 @@
   return i;
 }
 
+void 
+HideWindow(p)
+struct win *p;
+{
+  int q;
+  int n = p ? p->w_number : -1;
+  struct win **pp;
+
+  if (!p)
+    {
+      ShowWindows(-1);
+      return;
+    }
+
+  // Valid window?
+  for (q = -1, pp = wtab; pp != wtab + MAXWIN; pp++)
+  {
+    struct win *w = *pp;
+
+    if (w && w->w_number == n)
+    {
+      q = n;
+      break;
+    }
+  }
+  n = q;
+  if (n < 0 || n >= MAXWIN)
+  {
+    ShowWindows(-1);
+    return;
+  }
+  if (p->w_hide)
+    {
+      p->w_hide = 0;
+      Msg(0, "Window %d (%s) unhidden", p->w_number, p->w_title);
+    }
+  else
+    {
+      p->w_hide = 1;
+      Msg(0, "Window %d (%s) is now hidden", p->w_number, p->w_title);
+    }
+}
+
 /*ARGSUSED*/
 void
 DoAction(act, key)
@@ -1080,6 +1123,20 @@
   msgok = display && !*rc_name;
   switch(nr)
     {
+    case RC_HIDE:
+      if (!*args || (args[0][0] == '.' && !args[0][1]))
+        {
+	  if (!fore)
+	    {
+	      Msg(0, "hide . needs a window");
+	      break;
+	    }
+	  n = fore->w_number;
+	}
+      else if (ParseWinNum(act, &n) < 0)
+	break;
+      HideWindow(wtab[n]);
+      break;
     case RC_SELECT:
       if (!*args)
         InputSelect();
@@ -1706,7 +1763,7 @@
       /* FALLTHROUGH */
     case RC_OTHER:
       if (MoreWindows())
-	SwitchWindow(display && D_other ? D_other->w_number : NextWindow());
+	SwitchWindow(display && D_other && !D_other->w_hide ? D_other->w_number : NextWindow());
       break;
     case RC_META:
       if (user->u_Esc == -1)
@@ -4656,8 +4713,13 @@
 
   for (pp = wtab + n + 1; pp != wtab + n; pp++)
     {
+      struct win *p;
+
       if (pp == wtab + MAXWIN)
 	pp = wtab;
+      p = *pp;
+      if (p && p->w_hide)
+	continue;
       if (*pp)
 	break;
     }
@@ -4672,8 +4734,13 @@
 
   for (pp = wtab + n - 1; pp != wtab + n; pp--)
     {
+      struct win *p;
+
       if (pp < wtab)
 	pp = wtab + MAXWIN - 1;
+      p = *pp;
+      if (p && p->w_hide)
+	continue;
       if (*pp)
 	break;
     }
@@ -4684,8 +4751,15 @@
 MoreWindows()
 {
   char *m = "No other window.";
-  if (windows && (fore == 0 || windows->w_next))
-    return 1;
+  struct win **pp, *p;
+  int n = fore ? fore->w_number : -1;
+
+  for (pp = wtab; pp != wtab + MAXWIN; pp++) {
+    p = *pp;
+    if (fore && windows && p && p->w_number != n && p->w_hide == 0)
+      return 1;
+  }
+
   if (fore == 0)
     {
       Msg(0, "No window available");
@@ -4805,6 +4879,10 @@
 	continue;
       if ((flags & 1) && display && p == D_fore)
 	continue;
+      /*
+      if (p->w_hide)
+	continue;
+      */
 
       cmd = p->w_title;
       l = strlen(cmd);
@@ -4861,6 +4939,8 @@
     *s++ = '@';
   if (p->w_bell == BELL_DONE)
     *s++ = '!';
+  if (p->w_hide) 
+    *s++ = '^';
 #ifdef UTMPOK
   if (p->w_slot != (slot_t) 0 && p->w_slot != (slot_t) -1)
     *s++ = '$';
Index: window.h
===================================================================
RCS file: /sources/screen/screen/src/window.h,v
retrieving revision 1.22
diff -u -r1.22 window.h
--- window.h	16 Dec 2005 19:06:39 -0000	1.22
+++ window.h	26 Feb 2006 19:23:24 -0000
@@ -185,6 +185,7 @@
   int	 w_SavedCharsetR;
   int	 w_SavedCharsets[4];
 #endif
+  int    w_hide;
   int	 w_top, w_bot;		/* scrollregion */
   int	 w_wrap;		/* autowrap */
   int	 w_origin;		/* origin mode */
Index: doc/screen.1
===================================================================
RCS file: /sources/screen/screen/src/doc/screen.1,v
retrieving revision 1.22
diff -u -r1.22 screen.1
--- doc/screen.1	20 Dec 2005 18:46:23 -0000	1.22
+++ doc/screen.1	26 Feb 2006 19:23:32 -0000
@@ -1966,6 +1966,12 @@
 See also \*QDEFAULT KEY BINDINGS\*U section.
 .sp
 .ne 3
+.B hide [WindowID]
+.PP
+Toggles hiding of the specified window. If no window is specified the current
+window will be toggled.
+.sp
+.ne 3
 .B history
 .PP
 Usually users work with a shell that allows easy access to previous commands.
@@ -3027,6 +3033,7 @@
 is marked with an `@';
 a window which has output logging turned on is marked with `(L)'; 
 windows occupied by other users are marked with `&';
+hidden windows are marked with `^';
 windows in the zombie state are marked with `Z'.
 If this list is too long to fit on the terminal's status line only the
 portion around the current window is displayed.
Index: doc/screen.texinfo
===================================================================
RCS file: /sources/screen/screen/src/doc/screen.texinfo,v
retrieving revision 1.18
diff -u -r1.18 screen.texinfo
--- doc/screen.texinfo	20 Dec 2005 18:46:23 -0000	1.18
+++ doc/screen.texinfo	26 Feb 2006 19:23:43 -0000
@@ -975,6 +975,8 @@
 Set display height.  @xref{Window Size}.
 @item help [-c @var{class}]
 Display current key bindings.  @xref{Help}.
+@item hide [@var{n}]
+Toggle hiding of a window.
 @item history
 Find previous command beginning @dots{}.  @xref{History}.
 @item hstatus @var{status}
@@ -1413,7 +1415,7 @@
 @kindex C-n
 @deffn Command next
 (@kbd{C-a @key{SPC}}, @kbd{C-a n}, @kbd{C-a C-n})@*
-Switch to the next window.  This command can be used repeatedly to
+Switch to the next unhidden window.  This command can be used repeatedly to
 cycle through the list of windows.  (On some terminals, C-@key{SPC}
 generates a NUL character, so you must release the control key before
 pressing space.)
@@ -1423,7 +1425,7 @@
 @kindex C-p
 @deffn Command prev
 (@kbd{C-a p}, @kbd{C-a C-p})@*
-Switch to the previous window (the opposite of @kbd{C-a n}).
+Switch to the previous unhidden window (the opposite of @kbd{C-a n}).
 @end deffn
 
 @node Other Window, Select, Next and Previous, Selecting
@@ -1431,7 +1433,7 @@
 @kindex C-a
 @deffn Command other
 (@kbd{C-a C-a})@*
-Switch to the last window displayed.  Note that this command
+Switch to the last unhidden window displayed.  Note that this command
 defaults to the command character typed twice, unless overridden.
 For instance, if you use the option @samp{-e]x}, 
 this command becomes @kbd{]]} (@pxref{Command Character}).
@@ -2187,6 +2189,7 @@
 a window which has output logging turned on is marked with @samp{(L)};
 windows occupied by other users are marked with @samp{&}
 or @samp{&&} if the window is shared by other users;
+hidden windows are marked with @samp{^};
 windows in the zombie state are marked with @samp{Z}. 
 
 If this list is too long to fit on the terminal's status line only the
@@ -4325,6 +4328,7 @@
 * Nethack::                     Use @code{nethack}-like error messages.
 * Nonblock::			Disable flow-control to a display.
 * Number::                      Change the current window's number.
+* Hide::                        Toggle a windows hidden status.
 * Silence::			Notify on inactivity.
 * Time::                        Display the time and load average.
 * Verbose::                     Display window creation commands.
@@ -4468,7 +4472,7 @@
 displays is changed. Initial setting is @code{off}.
 @end deffn
 
-@node Number, Silence, Nonblock, Miscellaneous
+@node Number, Hide, Nonblock, Miscellaneous
 @section Number
 @kindex N
 @deffn Command number [@var{n}]
@@ -4478,7 +4482,17 @@
 specified, the current window number (and title) is shown.
 @end deffn
 
-@node Silence, Time, Number, Miscellaneous
+@node Hide, Silence, Number, Miscellaneous
+@section Hide
+@deffn Command hide [@var{window}]
+(none)@*
+Toggles hiding of the specified window @xref{Selecting}. If no window is
+specified then the current window will be toggled. When a window is hidden the
+commands @code{next}, @code{prev} and @code{other} will skip the window and
+the window will have a status flag of @samp{^}.
+@end deffn
+
+@node Silence, Time, Hide, Miscellaneous
 @section Silence
 @deffn Command silence [@var{state}|@var{sec}]
 (none)@*