jkh@ardent.UUCP (Jordan K. Hubbard) (07/25/88)
And now a new record for the quickest 11th hour patch. This fixes a few problems created by patch #5 (and discovered after the mandatory 2 hour period had elapsed) and fixes some newly discovered ones along the way. It's only 7K, so you can let out that breath you've been holding... Jordan P.S. Patch #5 picked up enough header information to exceed the legal message size. Those who want it split had better ask quickly. A distribution of awm, patched up through #6, will be available on ucbvax.berkeley.edu by the time you receive this message (it will be dated sometime on July 25th). ----- Patch #6 ---- /* * CHANGES: * * Added CONSOLE #ifdef (see Imakefile and/or README for info) in awm.c * to allow output to be redirected to the console. * Changed Error.c so that "desktop" files (see -e flag) will still be invoked * even if awm bombs with an error. This allows users of -e to come up with * some semblance of normalcy in the event of an error that causes awm to * exit. It beats staring at a blank screen. Also fixed -e to invoke * any exec, not just shell scripts (an definate error). * Color resources for "foster parent" windows now allocated correctly. * GetPixel() changed to deal with worst-case scenarios. * Fixed border width problem for untitled windows. * * UPDATED: * * Error.c now rev 1.2 * Titlebar.c now rev 1.4 * awm.c now rev 1.4 * */ diff -c awm.dst/Error.c awm/Error.c *** awm.dst/Error.c Sat Jul 2 16:57:18 1988 --- awm/Error.c Mon Jul 25 01:46:30 1988 *************** *** 3,11 **** #ifndef lint ! static char *rcsid_Error_c = "$Header: Error.c,v 1.1 88/06/15 15:58:56 jkh Exp $"; #endif lint #include "X11/copyright.h" /* * --- 3,18 ---- #ifndef lint ! static char *rcsid_Error_c = "$Header: Error.c,v 1.2 88/07/24 01:58:56 jkh Exp $"; #endif lint + #if defined(vax) + #include <sys/file.h> + #else + #include <fcntl.h> + #endif /* vax */ + + #include <signal.h> #include "X11/copyright.h" /* * *************** *** 63,68 **** --- 70,79 ---- #endif #include "awm.h" + + extern Boolean desktop_execd; + extern char execfile[]; + /* * Default error reporting routine. Called when a random awm error * is encountered. *************** *** 73,78 **** --- 84,103 ---- Entry("Error") fprintf(stderr, "awm: %s\n", s); + if (!desktop_execd) { + if (access(execfile, X_OK) == 0) { + if (fork() == 0) { + setpgrp(0, 0); + signal(SIGHUP, SIG_IGN); + signal(SIGQUIT, SIG_IGN); + signal(SIGINT, SIG_IGN); + execl("/bin/sh", "sh", "-c", execfile, 0); + _exit(127); + } + else + desktop_execd = TRUE; + } + } Cleanup(); exit(1); } diff -c awm.dst/Icons.c awm/Icons.c *** awm.dst/Icons.c Sun Jul 24 18:31:24 1988 --- awm/Icons.c Sun Jul 24 18:25:04 1988 *************** *** 3,9 **** #ifndef lint ! static char *rcsid_Icons_c = "$Header: Iconify.c,v 1.3 88/07/23 17:24:56 jkh Exp $"; #endif lint #include "X11/copyright.h" --- 3,9 ---- #ifndef lint ! static char *rcsid_Icons_c = "$Header: Icons.c,v 1.3 88/07/23 17:24:56 jkh Exp $"; #endif lint #include "X11/copyright.h" diff -c awm.dst/Imakefile awm/Imakefile *** awm.dst/Imakefile Sun Jul 24 18:31:26 1988 --- awm/Imakefile Mon Jul 25 01:54:31 1988 *************** *** 7,12 **** --- 7,16 ---- YFLAGS = -d HFILES = awm.h neaten.def.h neaten.ext.h support.h + # Add the line -DCONSOLE to the appropriate DEFINES macro (see below) if + # you want output (stderr and stdout) to go to the system console. + # + # Use these macros if you want the RTL Neaten package. # Also make sure that NEATEN_LIB points to the right place. See the README # file for instructions (though you can just define this and give it a shot). diff -c awm.dst/Makefile awm/Makefile *** awm.dst/Makefile Sun Jul 24 18:31:28 1988 --- awm/Makefile Mon Jul 25 01:54:40 1988 *************** *** 103,108 **** --- 103,112 ---- YFLAGS = -d HFILES = awm.h neaten.def.h neaten.ext.h support.h + # Add the line -DCONSOLE to the appropriate DEFINES macro (see below) if + # you want output (stderr and stdout) to go to the system console. + # + # Use these macros if you want the RTL Neaten package. # Also make sure that NEATEN_LIB points to the right place. See the README # file for instructions (though you can just define this and give it a shot). diff -c awm.dst/README awm/README *** awm.dst/README Sat Jul 2 16:57:34 1988 --- awm/README Mon Jul 25 01:50:16 1988 *************** *** 38,43 **** --- 38,47 ---- I've heard that the fix is to include <sys/file.h> in exp_path.c and awm.c. + If you want awm's output to go to the console device (assumed to be + /dev/console), define CONSOLE in the I/Makefile (there are appropriate + comments that will show you what to do). + There's a file named XRdBitFD.c which contains a new Xlib routine called XReadBitmapFileData(). Awm uses this routine quite a bit, so you should install it as part of your Xlib before compiling awm. Just move the file named diff -c awm.dst/Titlebar.c awm/Titlebar.c *** awm.dst/Titlebar.c Sun Jul 24 18:31:49 1988 --- awm/Titlebar.c Mon Jul 25 01:46:42 1988 *************** *** 3,9 **** #ifndef lint ! static char *rcsid_TitleBar_c = "$Header: TitleBar.c,v 1.3 88/07/23 17:26:00 jkh Exp $"; #endif lint #include "X11/copyright.h" --- 3,9 ---- #ifndef lint ! static char *rcsid_TitleBar_c = "$Header: TitleBar.c,v 1.4 88/07/24 01:26:00 jkh Exp $"; #endif lint #include "X11/copyright.h" *************** *** 188,194 **** if (awi->frame && (awi->state & ST_DECORATED)) Leave((Window)NULL) ! if (awi->attrs & AT_BORDER && !Frame_res) Init_Frames(); if (awi->attrs & AT_TITLE && !Title_res) --- 188,194 ---- if (awi->frame && (awi->state & ST_DECORATED)) Leave((Window)NULL) ! if (!Frame_res) Init_Frames(); if (awi->attrs & AT_TITLE && !Title_res) *************** *** 274,279 **** --- 274,281 ---- XDefineCursor(dpy, foster, FrameCursor); XAddToSaveSet(dpy, awi->client); + XSetWindowBorderWidth(dpy, awi->client, + ((awi->attrs & AT_BORDER) ? 1 : 0)); XReparentWindow(dpy, awi->client, foster, clnt_x, clnt_y); XMapWindow(dpy, awi->client); XSync(dpy, FALSE); *************** *** 397,404 **** if (!awi->bold) Error("AddTitle: Can't create pixmap for bold background"); } - XSetWindowBorderWidth(dpy, awi->client, - ((awi->attrs & AT_BORDER) ? 1 : 0)); wc.sibling = awi->client; wc.stack_mode = Above; XConfigureWindow(dpy, title, CWSibling|CWStackMode, &wc); --- 399,404 ---- diff -c awm.dst/awm.c awm/awm.c *** awm.dst/awm.c Sun Jul 24 18:31:55 1988 --- awm/awm.c Mon Jul 25 01:46:54 1988 *************** *** 3,9 **** #ifndef lint ! static char *rcsid_awm_c = "$Header: awm.c,v 1.3 88/07/23 17:24:56 jkh Exp $"; #endif lint #include "X11/copyright.h" --- 3,9 ---- #ifndef lint ! static char *rcsid_awm_c = "$Header: awm.c,v 1.4 88/07/24 01:24:56 jkh Exp $"; #endif lint #include "X11/copyright.h" *************** *** 89,94 **** --- 89,95 ---- char *sfilename; char execfile[NAME_LEN]; /* Pointer to file to exec with -e */ Boolean Snatched; + Boolean desktop_execd = TRUE; extern FILE *yyin; extern int errorStatus; extern int ErrorHandler(); *************** *** 153,159 **** */ Argv = argv; Environ = environ; - execfile[0] = '\0'; local = nolocal = FALSE; argc--, argv++; /* --- 154,159 ---- *************** *** 180,185 **** --- 180,186 ---- argc--; argv++; if ((argc == 0) || (execfile[0] != '\0')) Usage(); + desktop_execd = FALSE; /* assume we have desktop to run */ strncpy(execfile, *argv, NAME_LEN); } /* Destroyed arg, skip over what used to be filename for -e */ *************** *** 198,204 **** Usage(); argc--, argv++; } ! /* Open the damn display */ if ((dpy = XOpenDisplay(display)) == NULL) { fprintf(stderr, "awm: Unable to open display\n"); --- 199,211 ---- Usage(); argc--, argv++; } ! ! #ifdef CONSOLE ! if (access("/dev/console", W_OK) == 0) { ! freopen("/dev/console", "w", stderr); ! freopen("/dev/console", "w", stdout); ! } ! #endif /* CONSOLE */ /* Open the damn display */ if ((dpy = XOpenDisplay(display)) == NULL) { fprintf(stderr, "awm: Unable to open display\n"); *************** *** 308,318 **** /* * check the gadgets. */ ! if (CheckGadgets()) { ! fprintf(stderr, "Error in gadget declarations. Exiting...\n"); ! Cleanup(); ! exit(1); ! } /* * Store all the cursors. --- 315,322 ---- /* * check the gadgets. */ ! if (CheckGadgets()) ! Error("Error in gadget declarations. Exiting...\n"); /* * Store all the cursors. *************** *** 334,344 **** OwnerGrabButtonMask : 0)); XChangeWindowAttributes(dpy, RootWindow(dpy, scr), CWEventMask, &swa); XSync(dpy, False); ! if (errorStatus == True) { ! fprintf(stderr, ! "Hmmm.. Looks like you're running another window manager!\n"); ! exit(1); ! } /* * Before we go creating more windows, we buzz through the ones that * are currently mapped and reparent and/or select on them as necessary --- 338,345 ---- OwnerGrabButtonMask : 0)); XChangeWindowAttributes(dpy, RootWindow(dpy, scr), CWEventMask, &swa); XSync(dpy, False); ! if (errorStatus) ! Error("Hmmm.. Looks like you're running another window manager!\n"); /* * Before we go creating more windows, we buzz through the ones that * are currently mapped and reparent and/or select on them as necessary *************** *** 435,441 **** /* * As our last "startup" task, invoke the execfile if was specified. */ ! if (execfile[0] != '\0') { if (access(execfile, X_OK) == 0) { if (fork() == 0) { setpgrp(0, 0); --- 436,442 ---- /* * As our last "startup" task, invoke the execfile if was specified. */ ! if (!desktop_execd) { if (access(execfile, X_OK) == 0) { if (fork() == 0) { setpgrp(0, 0); *************** *** 442,450 **** signal(SIGHUP, SIG_IGN); signal(SIGQUIT, SIG_IGN); signal(SIGINT, SIG_IGN); ! execl("/bin/sh", "sh", execfile, 0); _exit(127); } } } /* --- 443,453 ---- signal(SIGHUP, SIG_IGN); signal(SIGQUIT, SIG_IGN); signal(SIGINT, SIG_IGN); ! execl("/bin/sh", "sh", "-c", execfile, 0); _exit(127); } + else + desktop_execd = TRUE; } } /* *************** *** 1313,1322 **** Grab(mask, kiddies[i]); } } ! else { ! fprintf(stderr, "awm: Can't XQueryTree in GrabAll!\n"); ! exit(1); ! } Leave_void } --- 1316,1323 ---- Grab(mask, kiddies[i]); } } ! else ! Error("awm: Can't XQueryTree in GrabAll!\n"); Leave_void } diff -c awm.dst/gram.y awm/gram.y *** awm.dst/gram.y Sun Jul 24 18:32:08 1988 --- awm/gram.y Mon Jul 25 01:47:09 1988 *************** *** 59,65 **** #ifndef lint ! static char *rcsid_gram_y = "$Header: gram.y,v 1.3 88/07/23 18:01:04 jkh Exp $"; #endif lint #include "X11/Xlib.h" --- 59,65 ---- #ifndef lint ! static char *rcsid_gram_y = "$Header: gram.y,v 1.4 88/07/24 01:01:04 jkh Exp $"; #endif lint #include "X11/Xlib.h" *************** *** 571,576 **** --- 571,578 ---- Entry("GetPixel") + if (!string) + Leave((Pixel)0) if (!XAllocNamedColor(dpy, cmap, string, &vis_ret, &act_ret)) Leave((Pixel)0) Leave(vis_ret.pixel)