diff options
author | Sadrul Habib Chowdhury <sadrul@users.sourceforge.net> | 2010-01-26 15:15:24 -0500 |
---|---|---|
committer | Sadrul Habib Chowdhury <sadrul@users.sourceforge.net> | 2010-01-26 15:15:24 -0500 |
commit | f33e5cdecb7bf3b6ae8e4a5c0ca394dd5a06a416 (patch) | |
tree | d6baefed5981fd92167db29335bb67bab48ad2e0 | |
parent | a6eea7b4d6dd3e4385919b4a50a58688f9a6b52b (diff) | |
download | screen-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.h | 6 | ||||
-rw-r--r-- | src/acls.c | 2 | ||||
-rw-r--r-- | src/comm.c | 2 | ||||
-rw-r--r-- | src/doc/screen.1 | 3 | ||||
-rw-r--r-- | src/doc/screen.texinfo | 3 | ||||
-rw-r--r-- | src/extern.h | 2 | ||||
-rw-r--r-- | src/help.c | 87 | ||||
-rw-r--r-- | src/process.c | 44 | ||||
-rw-r--r-- | src/screen.c | 8 | ||||
-rw-r--r-- | src/socket.c | 5 | ||||
-rw-r--r-- | src/window.c | 8 |
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 @@ -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; @@ -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 *)); @@ -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"); |