summaryrefslogtreecommitdiff
path: root/src/window.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/window.c')
-rw-r--r--src/window.c32
1 files changed, 29 insertions, 3 deletions
diff --git a/src/window.c b/src/window.c
index fb271d2..1826b33 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[];
@@ -93,6 +93,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 +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 */
@@ -280,8 +282,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 +554,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");
@@ -840,6 +848,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 +1030,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 +1038,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
@@ -1906,7 +1919,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;
}
@@ -2049,6 +2066,15 @@ char *data;
}
}
+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