summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSadrul Habib Chowdhury <sadrul@users.sourceforge.net>2010-01-26 15:15:24 -0500
committerSadrul Habib Chowdhury <sadrul@users.sourceforge.net>2010-01-26 15:15:24 -0500
commitf33e5cdecb7bf3b6ae8e4a5c0ca394dd5a06a416 (patch)
treed6baefed5981fd92167db29335bb67bab48ad2e0
parenta6eea7b4d6dd3e4385919b4a50a58688f9a6b52b (diff)
downloadscreen-f33e5cdecb7bf3b6ae8e4a5c0ca394dd5a06a416.tar.gz
Increase the max-window limit.
The limit can be increased using the 'maxwin' command. There is still an upper-limit of 2048 windows.
-rw-r--r--src/acconfig.h6
-rw-r--r--src/acls.c2
-rw-r--r--src/comm.c2
-rw-r--r--src/doc/screen.13
-rw-r--r--src/doc/screen.texinfo3
-rw-r--r--src/extern.h2
-rw-r--r--src/help.c87
-rw-r--r--src/process.c44
-rw-r--r--src/screen.c8
-rw-r--r--src/socket.c5
-rw-r--r--src/window.c8
11 files changed, 104 insertions, 66 deletions
diff --git a/src/acconfig.h b/src/acconfig.h
index 4f5e2f8..ffedbbc 100644
--- a/src/acconfig.h
+++ b/src/acconfig.h
@@ -35,7 +35,7 @@
* Maximum of simultaneously allowed windows per screen session.
*/
#ifndef MAXWIN
-# define MAXWIN 40
+# define MAXWIN 100
#endif
/*
@@ -521,12 +521,12 @@
#undef USESETENV
/*
- * If setenv() takes 3 arguments sefine HAVE_SETENV_3
+ * If setenv() takes 3 arguments define HAVE_SETENV_3
*/
#undef HAVE_SETENV_3
/*
- * If setenv() takes 2 arguments sefine HAVE_SETENV_2
+ * If setenv() takes 2 arguments define HAVE_SETENV_2
*/
#undef HAVE_SETENV_2
diff --git a/src/acls.c b/src/acls.c
index d764023..e652e74 100644
--- a/src/acls.c
+++ b/src/acls.c
@@ -56,7 +56,7 @@
************************************************************************/
extern struct comm comms[];
-extern struct win *windows, *wtab[];
+extern struct win *windows, **wtab;
extern char NullStr[];
extern char SockPath[];
extern struct display *display, *displays;
diff --git a/src/comm.c b/src/comm.c
index 883c99a..17fbd56 100644
--- a/src/comm.c
+++ b/src/comm.c
@@ -232,7 +232,7 @@ struct comm comms[RC_LAST + 1] =
#ifdef COPY_PASTE
{ "markkeys", ARGS_1 },
#endif
- { "maxwin", ARGS_1 },
+ { "maxwin", ARGS_01 },
{ "meta", NEED_LAYER|ARGS_0 },
{ "monitor", NEED_FORE|ARGS_01 },
{ "mousetrack", NEED_DISPLAY | ARGS_01 },
diff --git a/src/doc/screen.1 b/src/doc/screen.1
index bbf7975..3ac5571 100644
--- a/src/doc/screen.1
+++ b/src/doc/screen.1
@@ -2234,7 +2234,8 @@ single statement.
.BI "maxwin " num
.PP
Set the maximum window number screen will create. Doesn't affect
-already existing windows. The number may only be decreased.
+already existing windows. The number can be increased only when there are no
+existing windows.
.sp
.ne 3
.B meta
diff --git a/src/doc/screen.texinfo b/src/doc/screen.texinfo
index 6142de0..44d233e 100644
--- a/src/doc/screen.texinfo
+++ b/src/doc/screen.texinfo
@@ -5104,7 +5104,8 @@ Parses and executes each argument as separate command.
@deffn Command maxwin @var{n}
(none)@*
Set the maximum window number screen will create. Doesn't affect
-already existing windows. The number may only be decreased.
+already existing windows. The number can be increased only when there are no
+existing windows.
@end deffn
@node Backtick, Screen Saver, Maxwin, Miscellaneous
diff --git a/src/extern.h b/src/extern.h
index 0eb811a..315daab 100644
--- a/src/extern.h
+++ b/src/extern.h
@@ -195,7 +195,7 @@ extern void ProcessInput2 __P((char *, int));
#endif
extern void DoProcess __P((struct win *, char **, int *, struct paster *));
extern void DoAction __P((struct action *, int));
-extern int FindCommnr __P((char *));
+extern int FindCommnr __P((const char *));
extern void DoCommand __P((char **, int *));
extern void Activate __P((int));
extern void KillWindow __P((struct win *));
diff --git a/src/help.c b/src/help.c
index 338c4cd..e98f50c 100644
--- a/src/help.c
+++ b/src/help.c
@@ -38,11 +38,12 @@ char version[60]; /* initialised by main() */
extern struct layer *flayer;
extern struct display *display, *displays;
extern struct win *windows;
+extern int maxwin;
extern char *noargs[];
extern struct mchar mchar_blank, mchar_so;
extern int renditions[];
extern unsigned char *blank;
-extern struct win *wtab[];
+extern struct win **wtab;
#ifdef MAPKEYS
extern struct term term[];
#endif
@@ -691,6 +692,7 @@ int y, xs, xe, isblank;
struct wlistdata;
static void WListProcess __P((char **, int *));
+static void WListAbort __P((void));
static void WListRedisplayLine __P((int, int, int, int));
static void wlistpage __P((void));
static void WListLine __P((int, int, int, int));
@@ -712,13 +714,13 @@ struct wlistdata {
int order;
struct win *group;
int nested;
- int list[MAXWIN];
+ int *list;
};
static struct LayFuncs WListLf =
{
WListProcess,
- HelpAbort,
+ WListAbort,
WListRedisplayLine,
DefClearLine,
DefRewrite,
@@ -746,6 +748,16 @@ int wi, he;
}
static void
+WListAbort()
+{
+ struct wlistdata * wlistdata = (struct wlistdata *)flayer->l_data;
+ if (wlistdata->list)
+ Free(wlistdata->list);
+ LAY_CALL_UP(LRefreshAll(flayer, 0));
+ ExitOverlayPage();
+}
+
+static void
WListProcess(ppbuf, plen)
char **ppbuf;
int *plen;
@@ -766,7 +778,7 @@ int *plen;
{
int n = (unsigned char)**ppbuf - '0';
int d = 0;
- if (n < MAXWIN && wtab[n] && WTAB_GROUP_MATCHES(n))
+ if (n < maxwin && wtab[n] && WTAB_GROUP_MATCHES(n))
{
int i;
for (d = -wlistdata->npos, i = WListNext(wlistdata, -1, 0); i != n; i = WListNext(wlistdata, i, 1), d++)
@@ -805,7 +817,7 @@ int *plen;
WListMove(-wlistdata->pos, -1);
break;
case 0205: /* end */
- WListMove(MAXWIN, -1);
+ WListMove(maxwin, -1);
break;
case 'a':
/* All-window view */
@@ -827,9 +839,9 @@ int *plen;
case '\n':
case ' ':
h = wlistdata->pos;
- if (h == MAXWIN && Layer2Window(flayer) && Layer2Window(flayer)->w_type == W_TYPE_GROUP)
+ if (h == maxwin && Layer2Window(flayer) && Layer2Window(flayer)->w_type == W_TYPE_GROUP)
break;
- if (display && h != MAXWIN && wtab[h] && (wtab[h]->w_type == W_TYPE_GROUP) && Layer2Window(flayer) == wtab[h])
+ if (display && h != maxwin && wtab[h] && (wtab[h]->w_type == W_TYPE_GROUP) && Layer2Window(flayer) == wtab[h])
{
wlistdata->group = wtab[h];
wlistdata->pos = wtab[h]->w_number;
@@ -837,17 +849,21 @@ int *plen;
break;
}
done = 1;
- if (!display || h == MAXWIN || !wtab[h] || wtab[h] == D_fore || (flayer->l_cvlist && flayer->l_cvlist->c_lnext))
- HelpAbort();
+ if (!display || h == maxwin || !wtab[h] || wtab[h] == D_fore || (flayer->l_cvlist && flayer->l_cvlist->c_lnext))
+ WListAbort();
#ifdef MULTIUSER
else if (AclCheckPermWin(D_user, ACL_READ, wtab[h]))
- HelpAbort();
+ WListAbort();
#endif
else
- ExitOverlayPage(); /* no need to redisplay */
+ {
+ if (wlistdata->list)
+ Free(wlistdata->list);
+ ExitOverlayPage(); /* no need to redisplay */
+ }
/* restore display, don't switch wrong user */
display = olddisplay;
- if (h != MAXWIN)
+ if (h != maxwin)
SwitchWindow(h);
break;
case 0222: /* Mouse event */
@@ -865,7 +881,7 @@ int *plen;
}
break;
}
- HelpAbort();
+ WListAbort();
display = olddisplay;
if (h >= 0 && wtab[h])
SwitchWindow(h);
@@ -909,7 +925,7 @@ int isblank;
struct mchar mchar_rend = mchar_blank;
struct mchar *mchar = (struct mchar *)0;
- if (i == MAXWIN)
+ if (i == maxwin)
return;
wlistdata = (struct wlistdata *)flayer->l_data;
if (wlistdata->nested && wtab[i])
@@ -959,21 +975,21 @@ int old, delta;
{
int i;
- if (old == MAXWIN)
- return MAXWIN;
+ if (old == maxwin)
+ return maxwin;
if (old == -1)
old = 0;
else
{
- for (i = 0; i < MAXWIN && wlistdata->list[i] != -1; i++)
+ for (i = 0; i < maxwin && wlistdata->list[i] != -1; i++)
if (wlistdata->list[i] == old)
break;
- if (i < MAXWIN && wlistdata->list[i] != -1)
+ if (i < maxwin && wlistdata->list[i] != -1)
old = i;
}
old += delta;
- if (old < 0 || old >= MAXWIN || wlistdata->list[old] == -1)
+ if (old < 0 || old >= maxwin || wlistdata->list[old] == -1)
old -= delta;
return wlistdata->list[old];
}
@@ -993,7 +1009,7 @@ int up, oldpos;
i = WListNext(wlistdata, pos, -ypos);
for (y = 0; y < wlistdata->numwin; y++)
{
- if (i == MAXWIN || !wtab[i])
+ if (i == maxwin || !wtab[i])
return;
if (y == 0)
wlistdata->first = i;
@@ -1004,7 +1020,7 @@ int up, oldpos;
wlistdata->ypos = y;
oldi = i;
i = WListNext(wlistdata, i, 1);
- if (i == MAXWIN || i == oldi)
+ if (i == maxwin || i == oldi)
break;
}
}
@@ -1023,11 +1039,11 @@ WListNormalize()
ypos = 0;
if (ypos >= wlistdata->numwin)
ypos = wlistdata->numwin - 1;
- for (n = 0, oldi = MAXWIN, i = pos; i != MAXWIN && i != oldi && n < wlistdata->numwin; oldi = i, i = WListNext(wlistdata, i, 1))
+ for (n = 0, oldi = maxwin, i = pos; i != maxwin && i != oldi && n < wlistdata->numwin; oldi = i, i = WListNext(wlistdata, i, 1))
n++;
if (ypos < wlistdata->numwin - n)
ypos = wlistdata->numwin - n;
- for (n = 0, oldi = MAXWIN, i = WListNext(wlistdata, -1, 0); i != MAXWIN && i != oldi && i != pos; oldi = i, i = WListNext(wlistdata, i, 1))
+ for (n = 0, oldi = maxwin, i = WListNext(wlistdata, -1, 0); i != maxwin && i != oldi && i != pos; oldi = i, i = WListNext(wlistdata, i, 1))
n++;
if (ypos > n)
ypos = n;
@@ -1092,10 +1108,10 @@ struct win *group;
{
int i;
- if (ind >= MAXWIN)
+ if (ind >= maxwin)
return ind;
if (ind == 0)
- for (i = 0; i < MAXWIN; i++)
+ for (i = 0; i < maxwin; i++)
wlistdata->list[i] = -1;
if (wlistdata->order == WLIST_MRU)
@@ -1107,23 +1123,23 @@ struct win *group;
{
if (start == -1)
start = 0;
- while (start < MAXWIN && !wtab[start])
+ while (start < maxwin && !wtab[start])
start++;
}
- if (start >= MAXWIN || !wtab[start])
+ if (start >= maxwin || !wtab[start])
return ind;
if (!WTAB_GROUP_MATCHES(start))
{
- while (start < MAXWIN && (!wtab[start] || !WTAB_GROUP_MATCHES(start)))
+ while (start < maxwin && (!wtab[start] || !WTAB_GROUP_MATCHES(start)))
if (wlistdata->order != WLIST_MRU)
start++;
else if (wtab[start]->w_next)
start = wtab[start]->w_next->w_number;
else
- start = MAXWIN;
- if (start >= MAXWIN || !wtab[start])
+ start = maxwin;
+ if (start >= maxwin || !wtab[start])
return ind;
}
@@ -1186,6 +1202,7 @@ struct win *group;
if (InitOverlayPage(sizeof(*wlistdata), &WListLf, 0))
return;
wlistdata = (struct wlistdata *)flayer->l_data;
+ wlistdata->list = calloc(maxwin, sizeof(int));
flayer->l_mode = 1;
flayer->l_x = 0;
flayer->l_y = flayer->l_height - 1;
@@ -1216,23 +1233,23 @@ wlistpage()
WListOrder(wlistdata, 0, -1, group);
pos = wlistdata->pos;
- if (pos == MAXWIN || !wtab[pos] || !WTAB_GROUP_MATCHES(pos))
+ if (pos == maxwin || !wtab[pos] || !WTAB_GROUP_MATCHES(pos))
{
if (wlistdata->order == WLIST_MRU)
pos = WListNext(wlistdata, -1, wlistdata->npos);
else
{
/* find new position */
- if (pos < MAXWIN)
- while(++pos < MAXWIN)
+ if (pos < maxwin)
+ while(++pos < maxwin)
if (wtab[pos] && WTAB_GROUP_MATCHES(pos))
break;
- if (pos == MAXWIN)
+ if (pos == maxwin)
while (--pos >= 0)
if (wtab[pos] && WTAB_GROUP_MATCHES(pos))
break;
if (pos == -1)
- pos = MAXWIN;
+ pos = maxwin;
}
}
wlistdata->pos = pos;
diff --git a/src/process.c b/src/process.c
index 70bb4fa..b67afd5 100644
--- a/src/process.c
+++ b/src/process.c
@@ -186,7 +186,7 @@ extern int nethackflag;
#endif
-struct win *wtab[MAXWIN]; /* window table, should be dynamic */
+extern struct win **wtab;
#ifdef MULTIUSER
extern char *multi;
@@ -586,7 +586,7 @@ InitKeytab()
args[1] = NULL;
SaveAction(ktab + '-', RC_SELECT, args, 0);
}
- for (i = 0; i < ((MAXWIN < 10) ? MAXWIN : 10); i++)
+ for (i = 0; i < ((maxwin < 10) ? maxwin : 10); i++)
{
char *args[2], arg1[10];
args[0] = arg1;
@@ -991,7 +991,7 @@ struct paster *pa;
int
FindCommnr(str)
-char *str;
+const char *str;
{
int x, m, l = 0, r = RC_LAST;
while (l <= r)
@@ -1588,7 +1588,7 @@ int key;
Msg(0, "%s: at '%s': no such window.\n", rc_name, args[0]);
break;
}
- else if (i < MAXWIN && (fore = wtab[i]))
+ else if (i < maxwin && (fore = wtab[i]))
{
args[0][n] = ch; /* must restore string in case of bind */
debug2("AT window %d (%s)\n", fore->w_number, fore->w_title);
@@ -4054,14 +4054,25 @@ int key;
Msg(0, "Will %sdo alternate screen switching", use_altscreen ? "" : "not ");
break;
case RC_MAXWIN:
+ if (!args[0])
+ {
+ Msg(0, "maximum windows allowed: %d", maxwin);
+ break;
+ }
if (ParseNum(act, &n))
break;
if (n < 1)
Msg(0, "illegal maxwin number specified");
- else if (n > maxwin)
- Msg(0, "may only decrease maxwin number");
+ else if (n > 2048)
+ Msg(0, "maximum 2048 windows allowed");
+ else if (n > maxwin && windows)
+ Msg(0, "may increase maxwin only when there's no window");
else
- maxwin = n;
+ {
+ if (!windows)
+ wtab = realloc(wtab, n * sizeof(struct win));
+ maxwin = n;
+ }
break;
case RC_BACKTICK:
if (ParseBase(act, *args, &n, 10, "decimal"))
@@ -4435,10 +4446,11 @@ char **argv;
int *argl;
{
struct action act;
+ const char *cmd = *argv;
- if ((act.nr = FindCommnr(*argv)) == RC_ILLEGAL)
+ if ((act.nr = FindCommnr(cmd)) == RC_ILLEGAL)
{
- Msg(0, "%s: unknown command '%s'", rc_name, *argv);
+ Msg(0, "%s: unknown command '%s'", rc_name, cmd);
return;
}
act.args = argv + 1;
@@ -4907,7 +4919,7 @@ char *str;
int i;
struct win *p;
- if ((i = WindowByNumber(str)) < 0 || i >= MAXWIN)
+ if ((i = WindowByNumber(str)) < 0 || i >= maxwin)
{
if ((p = WindowByName(str)))
return p->w_number;
@@ -5012,7 +5024,7 @@ int n;
struct win *p;
debug1("SwitchWindow %d\n", n);
- if (n < 0 || n >= MAXWIN)
+ if (n < 0 || n >= maxwin)
{
ShowWindows(-1);
return;
@@ -5116,12 +5128,12 @@ static int
NextWindow()
{
register struct win **pp;
- int n = fore ? fore->w_number : MAXWIN;
+ int n = fore ? fore->w_number : maxwin;
struct win *group = fore ? fore->w_group : 0;
for (pp = fore ? wtab + n + 1 : wtab; pp != wtab + n; pp++)
{
- if (pp == wtab + MAXWIN)
+ if (pp == wtab + maxwin)
pp = wtab;
if (*pp)
{
@@ -5144,7 +5156,7 @@ PreviousWindow()
for (pp = wtab + n - 1; pp != wtab + n; pp--)
{
if (pp == wtab - 1)
- pp = wtab + MAXWIN - 1;
+ pp = wtab + maxwin - 1;
if (*pp)
{
if (!fore || group == (*pp)->w_group)
@@ -5284,7 +5296,7 @@ int where;
*s = 0;
return ss;
}
- for (pp = ((flags & 4) && where >= 0) ? wtab + where + 1: wtab; pp < wtab + MAXWIN; pp++)
+ for (pp = ((flags & 4) && where >= 0) ? wtab + where + 1: wtab; pp < wtab + maxwin; pp++)
{
int rend = -1;
if (pp - wtab == where && ss == buf)
@@ -5921,7 +5933,7 @@ char *fn, **av;
if (*buf != '\0')
nwin.aka = buf;
num = atoi(*av);
- if (num < 0 || num > MAXWIN - 1)
+ if (num < 0 || num > maxwin - 1)
{
Msg(0, "%s: illegal screen number %d.", fn, num);
num = 0;
diff --git a/src/screen.c b/src/screen.c
index 212bee2..b1c3dfb 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -465,10 +465,10 @@ char **av;
screenlogfile = SaveStr("screenlog.%n");
logtstamp_string = SaveStr("-- %n:%t -- time-stamp -- %M/%d/%y %c:%s --\n");
hstatusstring = SaveStr("%h");
- captionstring = SaveStr("%3n %t");
+ captionstring = SaveStr("%4n %t");
timestring = SaveStr("%c:%s %M %d %H%? %l%?");
- wlisttit = SaveStr("Num Name%=Flags");
- wliststr = SaveStr("%3n %t%=%f");
+ wlisttit = SaveStr(" Num Name%=Flags");
+ wliststr = SaveStr("%4n %t%=%f");
#ifdef COPY_PASTE
BufferFile = SaveStr(DEFAULT_BUFFERFILE);
#endif
@@ -760,7 +760,7 @@ char **av;
eff_uid = geteuid();
eff_gid = getegid();
if (eff_uid != real_uid)
- {
+ {
/* if running with s-bit, we must install a special signal
* handler routine that resets the s-bit, so that we get a
* core file anyway.
diff --git a/src/socket.c b/src/socket.c
index 68a4258..cd7ef56 100644
--- a/src/socket.c
+++ b/src/socket.c
@@ -67,13 +67,14 @@ extern int ServerSocket, real_uid, real_gid, eff_uid, eff_gid;
extern int dflag, iflag, rflag, lsflag, quietflag, wipeflag, xflag;
extern char *attach_tty, *LoginName, HostName[];
extern struct display *display, *displays;
-extern struct win *fore, *wtab[], *console_window, *windows;
+extern struct win *fore, **wtab, *console_window, *windows;
extern struct layer *flayer;
extern struct layout *layout_attach, *layout_last, layout_last_marker;
extern struct NewWindow nwin_undef;
#ifdef MULTIUSER
extern char *multi;
#endif
+extern int maxwin;
extern char *getenv();
@@ -736,7 +737,7 @@ struct msg *mp;
if (*buf)
nwin.aka = buf;
num = atoi(p);
- if (num < 0 || num > MAXWIN - 1)
+ if (num < 0 || num > maxwin - 1)
num = 0;
nwin.StartAt = num;
p += l + 1;
diff --git a/src/window.c b/src/window.c
index aaad8ad..addd83b 100644
--- a/src/window.c
+++ b/src/window.c
@@ -41,7 +41,7 @@
#include "logfile.h" /* logfopen() */
extern struct display *displays, *display;
-extern struct win *windows, *fore, *wtab[], *console_window;
+extern struct win *windows, *fore, *console_window;
extern char *ShellArgs[];
extern char *ShellProg;
extern char screenterm[];
@@ -104,6 +104,7 @@ static int zmodem_parse __P((struct win *, char *, int));
#endif
+struct win **wtab; /* window table */
int VerboseCreate = 0; /* XXX move this to user.h */
@@ -553,6 +554,11 @@ struct NewWindow *newwin;
extern struct acluser *users;
#endif
+ if (!wtab)
+ {
+ wtab = calloc(maxwin, sizeof(struct win *));
+ }
+
debug1("NewWindow: StartAt %d\n", newwin->StartAt);
debug1("NewWindow: aka %s\n", newwin->aka?newwin->aka:"NULL");
debug1("NewWindow: dir %s\n", newwin->dir?newwin->dir:"NULL");