diff options
Diffstat (limited to 'src/window.c')
-rw-r--r-- | src/window.c | 103 |
1 files changed, 94 insertions, 9 deletions
diff --git a/src/window.c b/src/window.c index 5b15878..1716796 100644 --- a/src/window.c +++ b/src/window.c @@ -1,4 +1,7 @@ -/* Copyright (c) 2008 +/* Copyright (c) 2010 + * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) + * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) + * Copyright (c) 2008, 2009 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Micah Cowan (micah@cowan.name) @@ -41,7 +44,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[]; @@ -93,6 +96,7 @@ static void pseu_readev_fn __P((struct event *, char *)); static void pseu_writeev_fn __P((struct event *, char *)); #endif static void win_silenceev_fn __P((struct event *, char *)); +static void win_destroyev_fn __P((struct event *, char *)); static int OpenDevice __P((char **, int, int *, char **)); static int ForkWindow __P((struct win *, char **, char *)); @@ -103,6 +107,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 */ @@ -207,7 +212,8 @@ struct LayFuncs WinLf = WinClearLine, WinRewrite, WinResize, - WinRestore + WinRestore, + 0 }; static int @@ -280,8 +286,7 @@ int *lenp; debug2("window %d, user %s: ", fore->w_number, D_user->u_name); debug2("writelock %d (wlockuser %s)\n", fore->w_wlock, fore->w_wlockuser ? fore->w_wlockuser->u_name : "NULL"); - /* XXX FIXME only display !*/ - WBell(fore, visual_bell); + Msg(0, "write: permission denied (user %s)", D_user->u_name); *bufpp += *lenp; *lenp = 0; return; @@ -553,6 +558,13 @@ struct NewWindow *newwin; extern struct acluser *users; #endif + if (!wtab) + { + if (!maxwin) + maxwin = MAXWIN; + 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"); @@ -601,7 +613,7 @@ struct NewWindow *newwin; if ((p = (struct win *)calloc(1, sizeof(struct win))) == 0) { close(f); - Msg(0, strnomem); + Msg(0, "%s", strnomem); return -1; } @@ -637,7 +649,7 @@ struct NewWindow *newwin; { free((char *)p); close(f); - Msg(0, strnomem); + Msg(0, "%s", strnomem); return -1; } #endif @@ -840,6 +852,9 @@ struct NewWindow *newwin; SetTimeout(&p->w_silenceev, p->w_silencewait * 1000); evenq(&p->w_silenceev); } + p->w_destroyev.type = EV_TIMEOUT; + p->w_destroyev.data = 0; + p->w_destroyev.handler = win_destroyev_fn; SetForeWindow(p); Activate(p->w_norefresh); @@ -1019,6 +1034,7 @@ struct win *wp; wp->w_layer.l_cvlist = 0; if (flayer == &wp->w_layer) flayer = 0; + LayerCleanupMemory(&wp->w_layer); #ifdef MULTIUSER FreeWindowAcl(wp); @@ -1026,6 +1042,7 @@ struct win *wp; evdeq(&wp->w_readev); /* just in case */ evdeq(&wp->w_writeev); /* just in case */ evdeq(&wp->w_silenceev); + evdeq(&wp->w_destroyev); #ifdef COPY_PASTE FreePaster(&wp->w_paster); #endif @@ -1436,6 +1453,7 @@ char **args, *ttyn; return pid; } +#ifndef HAVE_EXECVPE void execvpe(prog, args, env) char *prog, **args, **env; @@ -1481,6 +1499,7 @@ char *prog, **args, **env; if (eaccess) errno = EACCES; } +#endif #ifdef PSEUDOS @@ -1511,7 +1530,7 @@ char **av; } if (!(pwin = (struct pseudowin *)calloc(1, sizeof(struct pseudowin)))) { - Msg(0, strnomem); + Msg(0, "%s", strnomem); return -1; } @@ -1906,7 +1925,11 @@ char *data; p->w_pwin->p_inlen += len; } #endif + + LayPause(&p->w_layer, 1); WriteString(p, bp, len); + LayPause(&p->w_layer, 0); + return; } @@ -2046,9 +2069,20 @@ char *data; continue; #endif Msg(0, "Window %d: silence for %d seconds", p->w_number, p->w_silencewait); + p->w_silence = SILENCE_FOUND; + WindowChanged(p, 'f'); } } +static void +win_destroyev_fn(ev, data) +struct event *ev; +char *data; +{ + struct win *p = (struct win *)ev->data; + WindowDied(p, p->w_exitstatus, 1); +} + #ifdef ZMODEM static int @@ -2099,7 +2133,7 @@ int len; D_readev.condpos = D_readev.condneg = 0; while (len-- > 0) AddChar(*bp++); - Flush(); + Flush(0); Activate(D_fore ? D_fore->w_norefresh : 0); return 1; } @@ -2233,3 +2267,54 @@ struct display *d; } #endif + +int +WindowChangeNumber(struct win *win, int n) +{ + struct win *p; + int old = win->w_number; + + if (n < 0 || n >= maxwin) + { + Msg(0, "Given window position is invalid."); + return 0; + } + + p = wtab[n]; + wtab[n] = win; + win->w_number = n; + wtab[old] = p; + if (p) + p->w_number = old; +#ifdef MULTIUSER + /* exchange the acls for these windows. */ + AclWinSwap(old, n); +#endif +#ifdef UTMPOK + /* exchange the utmp-slots for these windows */ + if ((win->w_slot != (slot_t) -1) && (win->w_slot != (slot_t) 0)) + { + RemoveUtmp(win); + SetUtmp(win); + } + 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 + RemoveUtmp(p); + SetUtmp(p); + } +#endif + + WindowChanged(win, 'n'); + WindowChanged((struct win *)0, 'w'); + WindowChanged((struct win *)0, 'W'); + WindowChanged((struct win *)0, 0); + return 1; +} + |