richb@sunaus.oz (Rich Burridge) (09/13/90)
Faces is a visual monitor for mail, jobs on a printer or users on a machine. There are graphical interfaces for X11, XView, NeWS and SunView. This is official patch #8 for faces v1.4. It makes the following changes: * From Mike Khaw <khaw@parcplace.com> From Rod Whitby <rwhitby@austek.oz.au> From John Pritchard <john@latcs1.lat.oz.au> faces v1.4.7 dumps core in make_iconname(). It's doing an strlen on facepath[i] when it could be NULL. This is probably caused when your FACEDIR directory doesn't have a misc./unknown subtree. * From Ian Darwin <ian@sq.com> The x11 driver does not set XA_WM_CLASS, so things that depend on CLASS to operate won't operate properly. * From Greg Rose <greg@softway.sw.oz.au> From Ken Wood <adl.austek.oz.au> faces with both the -MH and -a options together didn't work correctly. * The -v command line option now displays the usage message and exit. The new -? command line option is similar. The usage message is now upto date and also lists the keyboard accelerators. * From John Pritchard <john@latcs1.lat.oz.au> The file netdb.h was included twice if DNSLOOKUP is defined. * From Chris Maltby <chris@softway.sw.oz.au> The window attributes structure with the X11 driver is now zeroised before being used. * From Chris Maltby <chris@softway.sw.oz.au> With the X11 driver, if the icon position hasn't been specified with the -WP option, then the position defaults to the where the right end of the open window would appear. * From Steven M. Miller <miller@SCTC.COM> Under X, when faces is started up in iconic mode nothing is displayed in the icon until the icon is clicked on and opened and then closed again. * From Michael Schmidt <michael@uni-paderborn.de> Perhaps my configuration (SparcStation, SunOS4.0.3, X11R4, twm with ForceIcons, IconManager and IconRegion) is wierd, but... The icon is not placed in the IconRegion, but just at 0x0 (or 1x1, or so). Then I cannot deiconify the icon by a mouse click (all other icons deiconify on a left button click). * From Steven M. Miller <miller@SCTC.COM> faces now recognises -iconic (as well as -Wi) to specify iconic mode. Inverse mode is still -i. The manual page has been updated. * From Ian Darwin <ian@sq.com> faces uses -s <spoolfile> to indicate a different spool file to monitor. How about a -S <spooldir> to indicate a different spool directory? The manual page has been updated. * From Lindsay F. Marshall <Lindsay.Marshall%newcastle.ac.uk@munnari.oz> faces works incorrectly when either the -h <height> or the -w <width> options are given. The image area is not being cleared first. Apply this patch with Larry Walls' patch program, recompile and reinstall. See the README file for more details on how to install faces. faces v1.4 was posted to comp.sources.misc on 29th June 1990 at patchlevel 5. Patch 6 and 7 have been posted to comp.sources.[bugs,misc], but if you missed them then they can be obtained from the automatic mail archive server, by sending a message to rb-archive-server@Aus.Sun.COM containing the line: send faces patchn where n is the patch number you want. You can also include a path line in these requests to indicate the mail path that the archive server should use to send the files to you. Such a path line could be: path uunet.uu.net!hostname!user Note that this is uunet.uu.net and not just uunet. Sun.COM doesn't recognise just uunet. *IMPORTANT NOTE* I've received several more bug reports and enhancements. If I didn't include a fix in this patch or add it to the TODO file, it's simply because I ran out of time. Hopefully the fix or the enhancement will be included in the next patch. Rich Burridge, DOMAIN: richb@Aus.Sun.COM Sun Microsystems. ACSNET: richb@sunaus.sun.oz PHONE: +61 2 413 2666 UUCP: {uunet,mcvax,ukc}!munnari!sunaus.oz!richb ------CUT HERE------patch.8------CUT HERE------ ------- get.c ------- *** /tmp/da15167 Thu Sep 13 17:10:30 1990 --- get.c Thu Sep 13 14:28:57 1990 *************** *** 166,171 **** --- 166,175 ---- INC ; getparam(printer, argv, "-P needs printer name") ; break ; + case 'S' : INC ; /* Alternative spoolfile. */ + getparam(next, argv, "-s needs spool directory") ; + SPRINTF(spoolfile, "%s/%s", next, username) ; + break ; case 'U' : update++ ; /* Update faces database. */ break ; case 'a' : mtype = MONALL ; /* Monitor all of the spoolfile. */ *************** *** 173,179 **** case 'b' : if (argv[0][2] == 'g') { INC ; /* Background color. */ ! getparam(bgcolor, argv, "-bg specifies background color") ; break ; } INC ; /* Alternate background pattern. */ --- 177,184 ---- case 'b' : if (argv[0][2] == 'g') { INC ; /* Background color. */ ! getparam(bgcolor, argv, ! "-bg specifies background color") ; break ; } INC ; /* Alternate background pattern. */ *************** *** 217,223 **** imageheight = ICONHEIGHT ; } break ; ! case 'i' : invert = 1 ; /* Reverse video. */ break ; case 'n' : dontshowno = 1 ; /* Don't show number of messages. */ break ; --- 222,229 ---- imageheight = ICONHEIGHT ; } break ; ! case 'i' : if (!strncmp(&argv[0][1], "iconic", 6)) iconic = 1 ; ! else if (argv[0][2] == '\0') invert = 1 ; break ; case 'n' : dontshowno = 1 ; /* Don't show number of messages. */ break ; *************** *** 226,240 **** period = atoi(next) ; break ; case 's' : INC ; /* Alternative spoolfile. */ ! getparam(spoolfile, argv, "-s needs spool directory") ; break ; case 't' : dontshowtime = 1 ; /* Do not show timestamps. */ break ; case 'u' : dontshowuser = 1 ; /* Do not show usernames. */ break ; ! case 'v' : FPRINTF(stderr, "%s version 1.4.%1d\n", ! progname, PATCHLEVEL) ; ! exit(1) ; case 'w' : INC ; /* Face image width. */ getparam(next, argv, "-w needs width value") ; imagewidth = atoi(next) ; --- 232,245 ---- period = atoi(next) ; break ; case 's' : INC ; /* Alternative spoolfile. */ ! getparam(spoolfile, argv, "-s needs spool file") ; break ; case 't' : dontshowtime = 1 ; /* Do not show timestamps. */ break ; case 'u' : dontshowuser = 1 ; /* Do not show usernames. */ break ; ! case '?' : ! case 'v' : usage() ; case 'w' : INC ; /* Face image width. */ getparam(next, argv, "-w needs width value") ; imagewidth = atoi(next) ; *************** *** 282,287 **** --- 287,293 ---- getparam(next, argv, "-WP needs y coordinate") ; iy = atoi(next) ; + iconpos = 1 ; break ; case 's' : INC ; INC ; /* -Ws xnum ynum */ break ; *************** *** 534,542 **** usage() /* Print faces usage message. */ { ! FPRINTF(stderr, "Usage: %s [-MH] [-P printer] [-Wi] [-Wp x y] ", progname) ; ! FPRINTF(stderr, "[-WP x y] [-b background] [-bg background_color] ") ; ! FPRINTF(stderr, "[-d display] [-f facepath] [-fg foreground_color] ") ; ! FPRINTF(stderr, "[-g geometry] [-i] [-n] [-p period] [-s spoolfile] [-u] ") ; ! FPRINTF(stderr, "[-t] [-v]\n") ; } --- 540,556 ---- usage() /* Print faces usage message. */ { ! FPRINTF(stderr, "%s version 1.4.%1d\n\n", progname, PATCHLEVEL) ; ! FPRINTF(stderr, "Usage: %s [-H hostname] [-MH] [-P printer]\n", progname) ; ! FPRINTF(stderr, "\t[-S spooldir] [-U] [-Wi] [-Wp x y] [-WP x y] [-a]\n") ; ! FPRINTF(stderr, "\t[-b background] [-bg background_color] [-c columns]\n") ; ! FPRINTF(stderr, "\t[-d display] [-e progname] [-f facepath]\n") ; ! FPRINTF(stderr, "\t[-fg foreground_color] [-g geometry] [-h height]\n") ; ! FPRINTF(stderr, "\t[-i] [-iconic] [-n] [-p period] [-s spoolfile] [-t]\n") ; ! FPRINTF(stderr, "\t[-u] [-v] [-w width] [-?]\n\n") ; ! FPRINTF(stderr, "Keyboard accelerators:\n") ; ! FPRINTF(stderr, "\t^L - clear faces display.\n") ; ! FPRINTF(stderr, "\tdel - refresh faces display.\n") ; ! FPRINTF(stderr, "\tq - terminate faces display.\n") ; ! exit(1) ; } ------- main.c ------- *** /tmp/da15170 Thu Sep 13 17:10:31 1990 --- main.c Thu Sep 13 12:40:11 1990 *************** *** 29,35 **** #ifdef DNSLOOKUP #include <sys/socket.h> - #include <netdb.h> #endif /*DNSLOOKUP*/ #ifdef NISLOOKUP --- 29,34 ---- *************** *** 130,135 **** --- 129,135 ---- int height ; /* Height in pixels of faces display. */ int iconheight = ICONHEIGHT ; /* Height of an individual icon. */ + int iconpos = 0 ; /* Set if icon position given (-WP option). */ int iconwidth = ICONWIDTH ; /* Width of an individual icon. */ int iconic = 0 ; /* Faces window is closed if set. */ int imageheight = ICONHEIGHT ; /* Height of an individual face image. */ *************** *** 314,320 **** int i ; facepath[0] = FACEDIR ; /* Default path is single built-in directory. */ ! for (i = 1; i <= MAXPATHS; i++) facepath[i] = (char *) NULL ; STRCPY(display, "") ; /* X11 display type. */ STRCPY(geometry, "") ; /* X11 geometry information. */ --- 314,320 ---- int i ; facepath[0] = FACEDIR ; /* Default path is single built-in directory. */ ! for (i = 1; i <= MAXPATHS; i++) facepath[i] = "" ; STRCPY(display, "") ; /* X11 display type. */ STRCPY(geometry, "") ; /* X11 geometry information. */ *************** *** 505,511 **** IF_DEBUG( FPRINTF(stderr, "make_iconname: %s[%s] ", community, user) ; ) ! for (id = 0; strlen(facepath[id]) != 0; id++) for (iu = 0; strlen(iuser[iu]) != 0; iu++) for (ic = 0; strlen(icomm[ic]) != 0; ic++) for (cptr = icomm[ic]; cptr != NULL; cptr = index(cptr, '.')) --- 505,511 ---- IF_DEBUG( FPRINTF(stderr, "make_iconname: %s[%s] ", community, user) ; ) ! for (id = 0; facepath[id] && (strlen(facepath[id]) != 0); id++) for (iu = 0; strlen(iuser[iu]) != 0; iu++) for (ic = 0; strlen(icomm[ic]) != 0; ic++) for (cptr = icomm[ic]; cptr != NULL; cptr = index(cptr, '.')) ------- mon.c ------- *** /tmp/da15173 Thu Sep 13 17:10:33 1990 --- mon.c Thu Sep 13 11:11:06 1990 *************** *** 169,175 **** else make_display() ; /* Output icons and tidyup chain of records. */ return ; } ! if (buf.st_size > lastsize) newmail = 1 ; /* New mail found. */ if (!buf.st_size) add_face(DISP_ICON, NOMAIL, "") ; ubuf[0] = buf.st_atime ; /* Save for possible reset. */ --- 169,180 ---- else make_display() ; /* Output icons and tidyup chain of records. */ return ; } ! if (buf.st_size > lastsize || ! mhflag && buf.st_size < lastsize && buf.st_size != 0) ! { ! if (buf.st_size < lastsize) lastsize = 0 ; ! newmail = 1 ; /* New mail found. */ ! } if (!buf.st_size) add_face(DISP_ICON, NOMAIL, "") ; ubuf[0] = buf.st_atime ; /* Save for possible reset. */ *************** *** 177,193 **** if (mtype == MONNEW) if (buf.st_size <= lastsize) /* Is the size of mail folder bigger? */ ! if (mhflag && (buf.st_size < lastsize) && (buf.st_size != 0)) ! { ! lastsize = 0 ; /* User uses MH. Any shrinkage means new mail. */ ! newmail = 1 ; ! } ! else ! { ! lastsize = buf.st_size ; /* No: save new size and exit. */ ! show_display() ; ! return ; ! } if ((fp = fopen(spoolfile, "r")) == NULL) /* Open spoolfile. */ { --- 182,192 ---- if (mtype == MONNEW) if (buf.st_size <= lastsize) /* Is the size of mail folder bigger? */ ! { ! lastsize = buf.st_size ; /* No: save new size and return. */ ! show_display() ; ! return ; ! } if ((fp = fopen(spoolfile, "r")) == NULL) /* Open spoolfile. */ { ------- sunview.c ------- *** /tmp/da15176 Thu Sep 13 17:10:34 1990 --- sunview.c Thu Sep 13 17:03:11 1990 *************** *** 69,75 **** imageheight, PIX_SRC, pr[(int) dtype], 0, 0) ; PR_ROP(pr[(int) dtype], column*imagewidth, row*imageheight, ! imagewidth, imageheight, PIX_SRC, images[(int) itype], 0, 0) ; } --- 69,78 ---- imageheight, PIX_SRC, pr[(int) dtype], 0, 0) ; PR_ROP(pr[(int) dtype], column*imagewidth, row*imageheight, ! imagewidth, imageheight, PIX_CLR, ! pr[(int) dtype], column*imagewidth, row*imageheight) ; ! PR_ROP(pr[(int) dtype], column*imagewidth, row*imageheight, ! iconwidth, iconheight, PIX_SRC, images[(int) itype], 0, 0) ; } *************** *** 233,238 **** --- 236,242 ---- enum disp_type dtype ; { pr[(int) dtype] = mem_create(width, height, 1) ; + PR_ROP(pr[(int) dtype], 0, 0, width, height, PIX_CLR, pr[(int) dtype], 0, 0) ; } ------- extern.h ------- *** /tmp/da15179 Thu Sep 13 17:10:35 1990 --- extern.h Thu Sep 13 14:26:58 1990 *************** *** 60,65 **** --- 60,66 ---- extern char revtable[] ; /* Table for reversing the bits in a byte. */ extern char spoolfile[] ; /* Full pathname of users current mail. */ extern char update_alias[] ; /* Name of mail alias for database updates. */ + extern char *username ; /* This users name. */ extern char userprog[] ; /* User supplied program to run. */ extern int beeps ; /* Number of beeps for arrival of new mail. */ *************** *** 76,81 **** --- 77,83 ---- extern int froms_found ; /* Set if "From " line found during processing. */ extern int height ; /* Height in pixels of faces display. */ extern int iconheight ; /* Height of an individual icon. */ + extern int iconpos ; /* Set if icon position given (-WP option). */ extern int iconwidth ; /* Width of an individual icon. */ extern int iconic ; /* Start as an icon if set. */ extern int imageheight ; /* Height of an individual face image. */ ------- patchlevel.h ------- *** /tmp/da15182 Thu Sep 13 17:10:35 1990 --- patchlevel.h Thu Sep 13 09:47:49 1990 *************** *** 14,17 **** * reported to me then an attempt will be made to fix them. */ ! #define PATCHLEVEL 7 --- 14,17 ---- * reported to me then an attempt will be made to fix them. */ ! #define PATCHLEVEL 8 ------- README ------- *** /tmp/da15185 Thu Sep 13 17:10:36 1990 --- README Thu Sep 13 17:00:13 1990 *************** *** 300,307 **** Mullender, Cameron Humphries, Rick Gunderson, Rich McAllister, Hakon Lie, John Fong, Chris Maltby, Darryl K. Ramm, Steve Piette, Tony Landells, Pat Lashley, Dave Glowacki, Chris Steinbroner, Steven M. Miller, Bob Posert, ! Hugues Leroy, Graham Dumpleton, Michael Schmidt, Robert Adams and Rod ! Whitby for various bug reports, fixes and suggestions for improvement. ---------------------------------------------------------------------------- --- 300,308 ---- Mullender, Cameron Humphries, Rick Gunderson, Rich McAllister, Hakon Lie, John Fong, Chris Maltby, Darryl K. Ramm, Steve Piette, Tony Landells, Pat Lashley, Dave Glowacki, Chris Steinbroner, Steven M. Miller, Bob Posert, ! Hugues Leroy, Graham Dumpleton, Michael Schmidt, Robert Adams, Rod Whitby, ! Greg Rose, Mike Khaw, Ian Darwin, Ken Wood and Lindsay F. Marshall for ! various bug reports, fixes and suggestions for improvement. ---------------------------------------------------------------------------- ------- faces.1 ------- *** /tmp/da15188 Thu Sep 13 17:10:37 1990 --- faces.1 Thu Sep 13 14:34:29 1990 *************** *** 17,22 **** --- 17,26 ---- .I printer ] [ + .B \-S + .I spooldir + ] + [ .B \-U ] [ *************** *** 51,56 **** --- 55,63 ---- .I height ] [ + .B \-iconic + ] + [ .B \-i ] [ *************** *** 161,166 **** --- 168,181 ---- .B faces will monitor the print queue. .TP + .BI \-S " spooldir" + Specify an alternate mail spool directory. The folder that will be monitored + will then be + .BI spooldir/ username + where + .I username + is the name of the user currently logged in. + .TP .B \-U Automatically send mail to a special mail alias, to update the .I faces *************** *** 217,222 **** --- 232,242 ---- The height of each face image in pixels. Note that this is the height of the area allocated to each image, and not necessarily the height of the displayed image inside. + .TP + .B \-iconic + Start the + .B faces + program up in iconic form. .TP .B \-i Invert the faces images before displaying them. For use by people who ------- x11.c ------- *** /tmp/da15194 Thu Sep 13 17:10:39 1990 --- x11.c Thu Sep 13 16:49:19 1990 *************** *** 31,36 **** --- 31,37 ---- #define FONT "times-roman-10" #define FRAME_MASK (ButtonPressMask | ExposureMask | \ ButtonMotionMask | KeyPressMask) + #define ICON_MASK ExposureMask Atom protocol_atom, kill_atom ; Display *dpy ; *************** *** 47,52 **** --- 48,54 ---- Pixmap old_pr[2] = { NULL, NULL } ; /* Previous memory Pixmaps. */ Window frame[2] ; Window root ; + XClassHint class_hint = { "faces", "Faces" } ; XFontStruct *sfont ; XGCValues gc_val ; XSizeHints size ; *************** *** 76,83 **** XCopyArea(dpy, pr[(int) dtype], pr[(int) dtype], gc, 0, 0, (maxcols-1)*imagewidth, imageheight, imagewidth, 0) ; XCopyArea(dpy, images[(int) itype], pr[(int) dtype], gc, 0, 0, ! imagewidth, imageheight, column*imagewidth, row*imageheight) ; } --- 78,90 ---- XCopyArea(dpy, pr[(int) dtype], pr[(int) dtype], gc, 0, 0, (maxcols-1)*imagewidth, imageheight, imagewidth, 0) ; + XSetFunction(dpy, gc, GXclear) ; + XCopyArea(dpy, pr[(int) dtype], pr[(int) dtype], gc, + column*imagewidth, row*imagewidth, imagewidth, imageheight, + column*imagewidth, row*imagewidth) ; + XSetFunction(dpy, gc, GXcopy) ; XCopyArea(dpy, images[(int) itype], pr[(int) dtype], gc, 0, 0, ! iconwidth, iconwidth, column*imagewidth, row*imageheight) ; } *************** *** 158,164 **** XCopyArea(dpy, pr[(int) wdtype], frame[F_WINDOW], gc, 0, 0, (unsigned int) width, (unsigned int) height, 0, 0) ; XCopyArea(dpy, pr[(int) DISP_ICON], frame[F_ICON], gc, 0, 0, ! (unsigned int) width, (unsigned int) height, 0, 0) ; } --- 165,171 ---- XCopyArea(dpy, pr[(int) wdtype], frame[F_WINDOW], gc, 0, 0, (unsigned int) width, (unsigned int) height, 0, 0) ; XCopyArea(dpy, pr[(int) DISP_ICON], frame[F_ICON], gc, 0, 0, ! (unsigned int) imagewidth, (unsigned int) imageheight, 0, 0) ; } *************** *** 225,231 **** depth = DefaultDepth(dpy, screen) ; init_font() ; - gc_mask = GCFont | GCForeground | GCBackground | GCGraphicsExposures ; gc_val.font = sfont->fid ; gc_val.foreground = foregnd ; --- 232,237 ---- *************** *** 232,238 **** gc_val.background = backgnd ; gc_val.graphics_exposures = False ; gc = XCreateGC(dpy, root, gc_mask, &gc_val) ; ! tilegc = XCreateGC(dpy, root, gc_mask, &gc_val) ; if (depth == 1) XSetFillStyle(dpy, tilegc, FillOpaqueStippled) ; else XSetFillStyle(dpy, tilegc, FillTiled) ; --- 238,244 ---- gc_val.background = backgnd ; gc_val.graphics_exposures = False ; gc = XCreateGC(dpy, root, gc_mask, &gc_val) ; ! tilegc = XCreateGC(dpy, root, gc_mask, &gc_val) ; if (depth == 1) XSetFillStyle(dpy, tilegc, FillOpaqueStippled) ; else XSetFillStyle(dpy, tilegc, FillTiled) ; *************** *** 260,278 **** /*ARGSUSED*/ - static Bool - is_exposed(dpy, ev, window) /* Return True if window is being exposed */ - Display *dpy ; - XEvent *ev ; - char *window ; - { - if (ev->type == Expose && *((Window *) window) == ev->xkey.window) - return True ; - return False ; - } - - - /*ARGSUSED*/ load_icon(itype, sbuf, not_flipped) enum icon_type itype ; unsigned short sbuf[256] ; --- 266,271 ---- *************** *** 298,305 **** { pr[(int) dtype] = XCreatePixmap(dpy, root, (unsigned int) width, (unsigned int) height, depth) ; ! XSetFunction(dpy, gc, GXandInverted) ; ! XFillRectangle(dpy, pr[(int) dtype], gc, 0, 0, width, height) ; XSetFunction(dpy, gc, GXcopy) ; } --- 291,300 ---- { pr[(int) dtype] = XCreatePixmap(dpy, root, (unsigned int) width, (unsigned int) height, depth) ; ! XSetFunction(dpy, gc, GXclear) ; ! XCopyArea(dpy, pr[(int) dtype], pr[(int) dtype], gc, ! column*imagewidth, row*imagewidth, imagewidth, imageheight, ! column*imagewidth, row*imagewidth) ; XSetFunction(dpy, gc, GXcopy) ; } *************** *** 346,361 **** } } ! #ifdef WANTED ! frame[F_WINDOW] = XCreateSimpleWindow(dpy, root, ! size.x, size.y, size.width, size.height, ! FACES_BORDER_WIDTH, foregnd, backgnd) ; ! frame[F_ICON] = XCreateSimpleWindow(dpy, root, ! ix, iy, imagewidth, imageheight, ! FACES_BORDER_WIDTH, foregnd, backgnd) ; ! #endif /*WANTED*/ ! winattrs.background_pixel = backgnd ; winattrs.border_pixel = foregnd ; winattrs.event_mask = FRAME_MASK ; --- 341,353 ---- } } ! if (!iconpos) ! { ! ix = size.x + size.width - imagewidth ; ! iy = size.y ; ! } ! bzero((char *) &winattrs, sizeof(winattrs)) ; winattrs.background_pixel = backgnd ; winattrs.border_pixel = foregnd ; winattrs.event_mask = FRAME_MASK ; *************** *** 365,370 **** --- 357,364 ---- CopyFromParent, InputOutput, CopyFromParent, CWBackPixel | CWBorderPixel | CWEventMask, &winattrs) ; + winattrs.event_mask = ICON_MASK ; + frame[F_ICON] = XCreateWindow(dpy, root, ix, iy, imagewidth, imageheight, FACES_BORDER_WIDTH, CopyFromParent, InputOutput, CopyFromParent, *************** *** 388,395 **** wm_hints.flags |= StateHint ; } XSetWMHints(dpy, frame[F_WINDOW], &wm_hints) ; - /** XSetWMHints(dpy, frame[F_ICON], &wm_hints) ; **/ /* Equivalent of make_icon. */ if (mtype == MONPRINTER) adjust_image(DISP_ICON, NOPRINT, 0, 0) ; --- 382,392 ---- wm_hints.flags |= StateHint ; } XSetWMHints(dpy, frame[F_WINDOW], &wm_hints) ; + /* Set XA_WM_CLASS so things that depend on NAME work. */ + + XSetClassHint(dpy, frame[F_WINDOW], &class_hint) ; + /* Equivalent of make_icon. */ if (mtype == MONPRINTER) adjust_image(DISP_ICON, NOPRINT, 0, 0) ; *************** *** 401,406 **** --- 398,424 ---- {} + process_expose(event) + XExposeEvent *event ; + { + int doframe, doicon ; + + doframe = doicon = 0 ; + do + { + if (event->count == 0) + { + if (event->window == frame[F_WINDOW]) doframe++ ; + else if (event->window == frame[F_ICON]) doicon++ ; + } + } + while (XCheckMaskEvent(dpy, ExposureMask, event)) ; + + if (doframe) draw_screen(wdtype) ; + if (doicon) draw_screen(wdtype) ; + } + + repl_image(dtype, dest, width, height) enum disp_type dtype ; enum image_type dest ; *************** *** 433,440 **** { XSelectInput(dpy, frame[F_WINDOW], FRAME_MASK) ; XMapWindow(dpy, frame[F_WINDOW]) ; - XSync(dpy, 0) ; - XPeekIfEvent(dpy, &ev, is_exposed, (char *) &frame[F_WINDOW]) ; first_time = 0 ; } --- 451,456 ---- *************** *** 488,494 **** #endif /*SYSV32*/ do { ! XNextEvent(dpy, &event) ; /* ClientMessage: (catch ICCCM kill from WM). */ --- 504,511 ---- #endif /*SYSV32*/ do { ! if (!XCheckMaskEvent(dpy, ExposureMask, &event)) ! XNextEvent(dpy, &event) ; /* ClientMessage: (catch ICCCM kill from WM). */ *************** *** 502,512 **** /* Expose. */ ! else if (event.type == Expose && event.xexpose.count == 0) ! { ! while (XCheckTypedEvent(dpy, Expose, &event)) /* do nothing. */ ; ! draw_screen(wdtype) ; ! } /* ButtonPress. */ --- 519,525 ---- /* Expose. */ ! else if (event.type == Expose) process_expose(&event) ; /* ButtonPress. */ ------- TODO ------- *** /tmp/da15197 Thu Sep 13 17:10:40 1990 --- TODO Thu Sep 13 17:09:39 1990 *************** *** 106,146 **** determine at run-time whether the NeWS operations are available, or whether to stick to XView/X11 mechanisms. ! 21/ From Steven M. Miller <miller@SCTC.COM> ! I would like to use -iconic to specify iconic mode for X. This would ! require change -i to -I for inverse in get.c and having -i to set iconic=1. ! ! 22/ From Steven M. Miller <miller@SCTC.COM> ! Under X, when faces is started up in iconic mode nothing is displayed in ! the icon until the icon is clicked on and opened and then closed again. ! ! 23/ From Kee Hinckley <nazgul@alphalpha.com> Any possibility of changing that header to an RFC1154 (I think that's the number) conformant form? Namely an encoding field in the header (presumbably with a new name for the faces format, or using one of the existing ones (G3Fax uuencode would probably be good)). ! 24/ From Michael Schmidt <michael@uni-paderborn.de> ! Perhaps my configuration (SparcStation, SunOS4.0.3, X11R4, twm with ! ForceIcons, IconManager and IconRegion) is wierd, but... The icon is ! not placed in the IconRegion, but just at 0x0 (or 1x1, or so). Then I ! cannot deiconify the icon by a mouse click (all other icons deiconify ! on a left button click). ! ! 25/ Get the SunView, XView and NeWS drivers to use the -bg and -fg color options. ! 26/ From Ken Wood <kwood@adl.austek.oz.au> ! Sometimes the display gets stuck while changing from "No mail" to a ! single face or vice-versa. xfaces just displays a plain grey window. ! ! 27/ From Ken Wood <kwood@adl.austek.oz.au> ! Quite often, users who don't have a face file are shown as "unknown" ! with the unknown face, rather than putting the username with the unknown ! face. ! ! 28/ From Ken Wood <kwood@adl.austek.oz.au> Do you have any plans to get xfaces to read geometry etc from the database ? ! 29/ Optimise. --- 106,125 ---- determine at run-time whether the NeWS operations are available, or whether to stick to XView/X11 mechanisms. ! 21/ From Kee Hinckley <nazgul@alphalpha.com> Any possibility of changing that header to an RFC1154 (I think that's the number) conformant form? Namely an encoding field in the header (presumbably with a new name for the faces format, or using one of the existing ones (G3Fax uuencode would probably be good)). ! 22/ Get the SunView, XView and NeWS drivers to use the -bg and -fg color options. ! 23/ From Ken Wood <kwood@adl.austek.oz.au> Do you have any plans to get xfaces to read geometry etc from the database ? ! 24/ When the -w and/or -h options are used with the SunView version, the ! size of the icon created is incorrect. ! ! 25/ Optimise. ------- xview.c ------- *** /tmp/da15200 Thu Sep 13 17:10:40 1990 --- xview.c Thu Sep 13 16:31:27 1990 *************** *** 73,78 **** --- 73,83 ---- XCopyArea(dpy, pr[(int) dtype], pr[(int) dtype], gc, 0, 0, (maxcols-1)*imagewidth, imageheight, imagewidth, 0) ; + XSetFunction(dpy, gc, GXclear) ; + XCopyArea(dpy, pr[(int) dtype], pr[(int) dtype], gc, + column*imagewidth, row*imagewidth, imagewidth, imageheight, + column*imagewidth, row*imagewidth) ; + XSetFunction(dpy, gc, GXcopy) ; XCopyArea(dpy, images[(int) itype], pr[(int) dtype], gc, 0, 0, imagewidth, imageheight, column*imagewidth, row*imageheight) ; } *************** *** 276,283 **** { pr[(int) dtype] = XCreatePixmap(dpy, root, (unsigned int) width, (unsigned int) height, depth) ; ! XSetFunction(dpy, gc, GXandInverted) ; ! XFillRectangle(dpy, pr[(int) dtype], gc, 0, 0, width, height) ; XSetFunction(dpy, gc, GXcopy) ; } --- 281,290 ---- { pr[(int) dtype] = XCreatePixmap(dpy, root, (unsigned int) width, (unsigned int) height, depth) ; ! XSetFunction(dpy, gc, GXclear) ; ! XCopyArea(dpy, pr[(int) dtype], pr[(int) dtype], gc, ! column*imagewidth, row*imagewidth, imagewidth, imageheight, ! column*imagewidth, row*imagewidth) ; XSetFunction(dpy, gc, GXcopy) ; } ------- CHANGES ------- *** /tmp/da15203 Thu Sep 13 17:10:41 1990 --- CHANGES Thu Sep 13 14:41:35 1990 *************** *** 288,290 **** --- 288,349 ---- being followed by a line starting with the word "X-Face ". Faces now searches for "X-Face:" rather than "X-Face". This really needs to be tightened up some more. + + v1.4 - patchlevel 8 - 13th September 1990. + + * From Mike Khaw <khaw@parcplace.com> + From Rod Whitby <rwhitby@austek.oz.au> + From John Pritchard <john@latcs1.lat.oz.au> + faces v1.4.7 dumps core in make_iconname(). It's doing an strlen + on facepath[i] when it could be NULL. This is probably caused + when your FACEDIR directory doesn't have a misc./unknown subtree. + + * From Ian Darwin <ian@sq.com> + The x11 driver does not set XA_WM_CLASS, so things that depend + on CLASS to operate won't operate properly. + + * From Greg Rose <greg@softway.sw.oz.au> + From Ken Wood <adl.austek.oz.au> + faces with both the -MH and -a options together didn't work + correctly. + + * The -v command line option now displays the usage message and exit. + The new -? command line option is similar. The usage message is now + upto date and also lists the keyboard accelerators. + + * From John Pritchard <john@latcs1.lat.oz.au> + The file netdb.h was included twice if DNSLOOKUP is defined. + + * From Chris Maltby <chris@softway.sw.oz.au> + The window attributes structure with the X11 driver is now zeroised + before being used. + + * From Chris Maltby <chris@softway.sw.oz.au> + With the X11 driver, if the icon position hasn't been specified + with the -WP option, then the position defaults to the where the + right end of the open window would appear. + + * From Steven M. Miller <miller@SCTC.COM> + Under X, when faces is started up in iconic mode nothing is displayed + in the icon until the icon is clicked on and opened and then closed + again. + + * From Michael Schmidt <michael@uni-paderborn.de> + Perhaps my configuration (SparcStation, SunOS4.0.3, X11R4, twm with + ForceIcons, IconManager and IconRegion) is wierd, but... The icon is + not placed in the IconRegion, but just at 0x0 (or 1x1, or so). Then I + cannot deiconify the icon by a mouse click (all other icons deiconify + on a left button click). + + * From Steven M. Miller <miller@SCTC.COM> + faces now recognises -iconic (as well as -Wi) to specify iconic mode. + Inverse mode is still -i. The manual page has been updated. + + * From Ian Darwin <ian@sq.com> + faces uses -s <spoolfile> to indicate a different spool file to + monitor. How about a -S <spooldir> to indicate a different spool + directory? The manual page has been updated. + + * From Lindsay F. Marshall <Lindsay.Marshall%newcastle.ac.uk@munnari.oz> + faces works incorrectly when either the -h <height> or the -w <width> + options are given. The image area is not being cleared first.