michael@parns.nsc.com (Michael Wagnitz) (08/28/90)
Submitted-by: michael@parns.nsc.com (Michael Wagnitz) Posting-number: Volume 8, Issue 97 Archive-name: xmail/patch2.02 #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 2 (of 5)." # Contents: Patch.02b # Wrapped by michael@harley on Mon Aug 27 12:47:26 1990 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'Patch.02b' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Patch.02b'\" else echo shar: Extracting \"'Patch.02b'\" \(46178 characters\) sed "s/^X//" >'Patch.02b' <<'END_OF_FILE' X! cm.type = ClientMessage; X! cm.display = XtDisplay(w); X! cm.message_type = XInternAtom(XtDisplay(w), "KILL_SELECTION", FALSE); X! cm.window = XtWindow(w); X! cm.format = 32; X! cm.data.l[0] = XA_PRIMARY; X! X! XSendEvent(XtDisplay(w), cm.window, TRUE, NoEventMask, (XEvent *) &cm); X! X! for (; *s && !isdigit(*s); s++); X! left = s - IndexBuf; X! for (; *s && isdigit(*s); s++); X! right = s - IndexBuf; X! X! XtTextSetSelection(w, left, right); X! X! XtTextSetInsertionPoint(w, pos); X } /* SetSelect */ X X X--- 1120,1152 ---- X } /* SetPopup */ X X X+ /* X+ ** @(#)SetPos() - restore the saved insert position of the widget X+ */ X /* ARGSUSED */ X+ XtActionProc X+ SetPos(w, event, params, num_params) X+ Widget w; X+ XEvent *event; X+ String *params; X+ Cardinal *num_params; X+ { X+ XtTextSetInsertionPoint(w, SavedPos); X+ } /* SetPos */ X+ X+ X+ /* ARGSUSED */ X /* X! ** @(#)SetSelect() - flag the index number of the selected message X */ X XtActionProc X SetSelect(w, event, params, num_params) X! Widget w; /* unused */ X XEvent *event; /* unused */ X String *params; /* unused */ X Cardinal *num_params; /* unused */ X { X! markIndex(">"); X } /* SetSelect */ X X X*** ../v1.1/callMail.c Mon Jun 4 09:48:34 1990 X--- callMail.c Mon Aug 27 11:09:18 1990 X*************** X*** 32,38 **** X * EVENT SHALL NATIONAL SEMICONDUCTOR CORPORATION BE LIABLE FOR ANY SPECIAL, X * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM X * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE X! * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR X * PERFORMANCE OF THIS SOFTWARE. X * X * Author: Michael C. Wagnitz - National Semiconductor Corporation X--- 32,38 ---- X * EVENT SHALL NATIONAL SEMICONDUCTOR CORPORATION BE LIABLE FOR ANY SPECIAL, X * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM X * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE X! * OR OTHER TORTUOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR X * PERFORMANCE OF THIS SOFTWARE. X * X * Author: Michael C. Wagnitz - National Semiconductor Corporation X*************** X*** 132,145 **** X } else if (mailpid) { X /* X * Parent : close the slave side of pty X- * close stdin and stdout X * set the mail file descriptor to append mode X * register mail input with X X */ X close(slave); X- if (mail_fd != 0) /* if we're restarting, mail_fd IS 0 */ X- close(0); X- close(1); X fcntl(mail_fd, F_SETFL, FAPPEND); X mailInputId = XtAddInput(mail_fd, XtInputReadMask, readMail, NULL); X } else { X--- 132,141 ---- X*************** X*** 160,169 **** X argv[0] = Mailpgm; X execvp(Mailpgm, argv); X /* X! * If we fail to make contact, we must re-establish X! * access to the terminal screen that started us for X! * our error message, because we don't want to send X! * it up the xmail pipe. Also, terminate our parent. X */ X if ((slave = open("/dev/tty", O_RDWR)) != -1) { X dup2(slave, 1); X--- 156,165 ---- X argv[0] = Mailpgm; X execvp(Mailpgm, argv); X /* X! * If we fail to make contact, we must re-establish access to X! * the terminal screen that started us for our error message, X! * because we don't want to send it up the xmail pipe. X! * Also terminate our parent. X */ X if ((slave = open("/dev/tty", O_RDWR)) != -1) { X dup2(slave, 1); X*************** X*** 170,177 **** X dup2(slave, 2); X perror(Mailpgm); X } X! sprintf(buf, "kill -INT %s\n", &tmpName[10]); X! system(buf); X exit(1); X } X } /* callMail */ X--- 166,172 ---- X dup2(slave, 2); X perror(Mailpgm); X } X! kill(getppid(), SIGKILL); /* kill our parent */ X exit(1); X } X } /* callMail */ X*** ../v1.1/callbacks.c Mon Jun 4 09:48:36 1990 X--- callbacks.c Mon Aug 27 11:09:18 1990 X*************** X*** 19,25 **** X * EVENT SHALL NATIONAL SEMICONDUCTOR CORPORATION BE LIABLE FOR ANY SPECIAL, X * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM X * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE X! * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR X * PERFORMANCE OF THIS SOFTWARE. X * X * Author: Michael C. Wagnitz - National Semiconductor Corporation X--- 19,25 ---- X * EVENT SHALL NATIONAL SEMICONDUCTOR CORPORATION BE LIABLE FOR ANY SPECIAL, X * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM X * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE X! * OR OTHER TORTUOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR X * PERFORMANCE OF THIS SOFTWARE. X * X * Author: Michael C. Wagnitz - National Semiconductor Corporation X*************** X*** 28,37 **** X--- 28,41 ---- X X X #include "global.h" X+ #include "xmailregex.h" X #include <sys/wait.h> X #include <sys/stat.h> X+ #include <sys/types.h> X+ #include <sys/time.h> X #include <pwd.h> X X+ extern char otherBuf[BUFSIZ]; X X /* X ** @(#)Autograph() - Add user's Sign or sign autograph to outgoing mail X*************** X*** 56,62 **** X X strcpy(tmp, "Sign"); /* Default will be to use Sign autograph, */ X if (C && *C == 'a') /* but if asked use their sign autograph. */ X! strcpy(tmp, "sign"); X autograph = GetMailEnv(tmp); X if (autograph) { X for (n = 0; n < BUFSIZ - 2 && *autograph; autograph++) X--- 60,66 ---- X X strcpy(tmp, "Sign"); /* Default will be to use Sign autograph, */ X if (C && *C == 'a') /* but if asked use their sign autograph. */ X! tmp[0] = 's'; X autograph = GetMailEnv(tmp); X if (autograph) { X for (n = 0; n < BUFSIZ - 2 && *autograph; autograph++) X*************** X*** 80,85 **** X--- 84,91 ---- X X /* X ** @(#)Done() - Send composed message - if closure data says "Deliver" X+ ** Attempt to do the task as a forked child. Failing that, X+ ** deliver the message by system call(s). X */ X /* ARGSUSED */ X XtCallbackProc X*************** X*** 90,97 **** X { X Widget shell; X FILE *fp; X! char *p, *record, *folder, *getenv(); X! char From[BUFSIZ], Copy[BUFSIZ], s[BUFSIZ]; X int n; X struct stat st_buf; X X--- 96,104 ---- X { X Widget shell; X FILE *fp; X! char *ARGV[3]; X! char *p, *q, *record, *folder, *getenv(); X! char From[BUFSIZ], Copy[BUFSIZ], s[BUFSIZ], addressees[BUFSIZ]; X int n; X struct stat st_buf; X X*************** X*** 100,112 **** X strcmp(shell->core.name, "popup"); X shell = XtParent(shell)); X XtDestroyWidget(shell); /* remove our popup prompt box */ X /* X! ** first, prepare the header information (in a second temporary file) X */ X! strcat(tmpName, "_"); X! if ((fp = fopen(tmpName, "w")) != NULL) { X! if (*Recipient) X! fprintf(fp, "To: %s\n", alias(Recipient)); X X if (*SubjBuf) X fprintf(fp, "Subject: %s\n", SubjBuf); X--- 107,131 ---- X strcmp(shell->core.name, "popup"); X shell = XtParent(shell)); X XtDestroyWidget(shell); /* remove our popup prompt box */ X+ X+ st_buf.st_size = 0; /* (in case msg file does not exist) */ X+ stat(tmpName, &st_buf); X+ X+ if ((fp = fopen(tmpName, "a+")) != NULL) { /* (give cat something to do) */ X+ fprintf(fp, "\n"); /* ensure the last line is a blank */ X+ fclose(fp); X+ if (st_buf.st_size) /* don't count unless text was there */ X+ st_buf.st_size += 1; /* but try to be accurate for cancel */ X+ } X /* X! ** Prepare header information (in a second temporary file) X */ X! if ((fp = fopen((char *)sprintf(s, "%s_", tmpName), "w")) != NULL) { X! if (*Recipient) { X! strcpy(addressees, alias(Recipient)); X! if (*addressees) X! fprintf(fp, "To: %s\n", addressees); X! } X X if (*SubjBuf) X fprintf(fp, "Subject: %s\n", SubjBuf); X*************** X*** 114,140 **** X if (*InReply) X fprintf(fp, "%s\n", InReply); X X! if (*CcBuf) X! fprintf(fp, "Cc: %s\n", alias(CcBuf)); X X! if (*BccBuf) X! fprintf(fp, "Bcc: %s\n", alias(BccBuf)); X X! fprintf(fp, "\n"); /* separate header from text */ X fclose(fp); X } X- tmpName[strlen(tmpName) - 1] = '\0'; /* Drop our marker for now */ X X if (strcmp(closure, "Deliver") == 0) { X /* X ** mail header information and text in temporary file using sendmail X */ X! if (*Recipient && (*SubjBuf || X! (stat(tmpName, &st_buf) == 0 && st_buf.st_size))) { X if ((p = GetMailEnv("sendmail")) == NULL) X p = XtNewString("/usr/lib/sendmail"); X! sprintf(s, "cat %s_ %s | %s -toi -om 2> /dev/null", tmpName, tmpName, p); X! system(s); X XtFree(p); X /* X ** If user has set 'record' in their .mailrc, add a message copy to that file X--- 133,176 ---- X if (*InReply) X fprintf(fp, "%s\n", InReply); X X! if (*CcBuf) { X! p = alias(CcBuf); X! if (*p) X! fprintf(fp, "Cc: %s\n", p); X! } X X! if (*BccBuf) { X! p = alias(BccBuf); X! if (*p) X! fprintf(fp, "Bcc: %s\n", p); X! } X X! if ((*Recipient || *SubjBuf) && st_buf.st_size) X! fprintf(fp, "\n"); /* separate the header from any text */ X fclose(fp); X } X X+ fp = fopen((char *)sprintf(s, "%s=", tmpName), "w"); X+ if (fp) { /* try to keep user from overwriting these */ X+ fprintf(fp,"mv %s_ %s#_ 2> /dev/null\n", tmpName, tmpName); X+ fprintf(fp,"mv %s %s# 2> /dev/null\n", tmpName, tmpName); X+ } X+ X if (strcmp(closure, "Deliver") == 0) { X /* X ** mail header information and text in temporary file using sendmail X */ X! if (*addressees && (*SubjBuf || st_buf.st_size)) { X if ((p = GetMailEnv("sendmail")) == NULL) X p = XtNewString("/usr/lib/sendmail"); X! X! if (fp) X! fprintf(fp,"cat %s#_ %s# | %s -toi -om 2> /dev/null\n", tmpName, tmpName, p); X! else { X! sprintf(s,"cat %s_ %s | %s -toi -om 2> /dev/null", tmpName, tmpName, p); X! system(s); X! } X! X XtFree(p); X /* X ** If user has set 'record' in their .mailrc, add a message copy to that file X*************** X*** 141,211 **** X */ X if (record = GetMailEnv("record")) { X p = folder = NULL; X! if (*record == '/' || (p = GetMailEnv("outfolder")) == NULL || X (folder = GetMailEnv("folder")) == NULL) { X strcpy(Copy, record); X if (p) XtFree(p); X } else { X! if (*folder == '/') { X! if (*record != '+') X! sprintf(Copy, "%s/%s", folder, record); X! else X! sprintf(Copy, "%s/%s", folder, &record[1]); X! } else { X! if (*record != '+') X! sprintf(Copy, "%s/%s/%s", getenv("HOME"), folder, record); X! else X! sprintf(Copy,"%s/%s/%s",getenv("HOME"),folder,&record[1]); X! } X XtFree(folder); X XtFree(p); X } X- sprintf(From, "From %s `date`", getenv("USER")); X- sprintf(s, "echo \"%s\" >> %s;cat %s_ %s >> %s 2> /dev/null; echo \"\" >> %s", X- From, Copy, tmpName, tmpName, Copy, Copy); X- system(s); X XtFree(record); X! } X! } else { X if (! *Recipient) X Bell("No recipient specified\n"); X else X Bell("No subject and no message\n"); X } X! } else { X! if (*closure == 'c') { /* save any partial message in our dead file */ X! if ((record = GetMailEnv("DEAD")) == NULL) X! sprintf(Copy, "%s/dead.letter", getenv("HOME")); X! else { X! if (*record == '/') X! strcpy(Copy, record); X! else if (*record != '+') /* default path is home directory */ X! sprintf(Copy, "%s/%s", getenv("HOME"), record); X! else /* dead letters will never be legal mail messages */ X! sprintf(Copy, "%s/%s", getenv("HOME"), &record[1]); X! XtFree(record); X! } X! st_buf.st_size = 0; /* (in case msg file does not exist) */ X! if (*Recipient || *SubjBuf || X! (stat(tmpName, &st_buf) == 0 && st_buf.st_size)) { X! n = st_buf.st_size; /* remember num bytes in msg */ X! if (stat((char *)sprintf(s, "%s_", tmpName), &st_buf) == 0) X! n += st_buf.st_size; /* include bytes in header */ X st_buf.st_size = -1; /* see if our target exists */ X stat(Copy, &st_buf); X- sprintf(s, "cat %s_ %s >> %s 2> /dev/null", tmpName, tmpName, Copy); X- system(s); X sprintf(s, "\"%s\" [%s] (%d bytes)\n", Copy, X (st_buf.st_size >= 0) ? "Appended" : "New file", n); X Bell(s); X! } else Bell("Nothing to save in your dead letter box\n"); X } X } X /* X ** remove any message text that may have been created X */ X! sprintf(s, "rm -f %s_ %s", tmpName, tmpName); X! system(s); X } /* Done */ X X X--- 177,317 ---- X */ X if (record = GetMailEnv("record")) { X p = folder = NULL; X! if (*record != '+' || (p = GetMailEnv("outfolder")) == NULL || X (folder = GetMailEnv("folder")) == NULL) { X strcpy(Copy, record); X if (p) XtFree(p); X } else { X! if (*folder == '/') X! sprintf(Copy, "%s/%s", folder, &record[1]); X! else X! sprintf(Copy,"%s/%s/%s",getenv("HOME"),folder,&record[1]); X XtFree(folder); X XtFree(p); X } X XtFree(record); X! X! sprintf(From, "From %s `date`", getenv("USER")); X! if (fp) X! fprintf(fp,"echo \"%s\" >> %s\ncat %s#_ %s# >> %s 2> /dev/null\n", X! From, Copy, tmpName, tmpName, Copy); X! else { X! sprintf(s,"echo \"%s\" >> %s;cat %s_ %s >> %s 2> /dev/null", X! From, Copy, tmpName, tmpName, Copy); X! system(s); X! } X! } /* end - if record variable is set */ X! /* X! ** If there are other addresses, add copies to those files and or folders X! */ X! if (*otherBuf) { X! FILE *fp1; X! /* X! ** Prepare (aliased) header information (in a third temporary file) X! */ X! if ((fp1 = fopen((char *)sprintf(s, "%s$", tmpName), "w"))) { X! fprintf(fp1, "To: %s\n", Recipient); X! X! if (*SubjBuf) X! fprintf(fp1, "Subject: %s\n", SubjBuf); X! X! if (*InReply) X! fprintf(fp1, "%s\n", InReply); X! X! if (*CcBuf) X! fprintf(fp1, "Cc: %s\n", CcBuf); X! X! fprintf(fp1, "\n"); /* separate header from text */ X! fclose(fp1); X! } X! p = GetMailEnv("outfolder"); X! folder = GetMailEnv("folder"); X! for (record = otherBuf; *record;) { X! for (q = record; *q && *q != ','; q++); X! n = 0; X! if (*q == ',') { X! *q = '\0'; X! n = 1; X! } X! if (*record != '+' || p == NULL || folder == NULL) { X! strcpy(Copy, record); X! } else { X! if (*folder == '/') X! sprintf(Copy, "%s/%s", folder, &record[1]); X! else X! sprintf(Copy,"%s/%s/%s",getenv("HOME"),folder,&record[1]); X! } X! X! sprintf(From, "From %s `date`", getenv("USER")); X! if (fp) X! fprintf(fp,"echo \"%s\" >>%s\ncat %s$ %s# >>%s 2>/dev/null\n", X! From, Copy, tmpName, tmpName, Copy); X! else { X! sprintf(s,"echo \"%s\" >> %s\n;cat %s$ %s >> %s 2> /dev/null", X! From, Copy, tmpName, tmpName, Copy); X! system(s); X! } X! if (n) *q++ = ','; X! record = q; X! } /* end - for each record in otherBuf */ X! if (p) XtFree(p); X! if (folder) XtFree(folder); X! } /* end - if records in otherBuf */ X! } else { /* end - if something is there to deliver */ X if (! *Recipient) X Bell("No recipient specified\n"); X else X Bell("No subject and no message\n"); X } X! } else { /* do we want to save the message text in dead file */ X! n = st_buf.st_size; /* remember num bytes in msg text */ X! if (n == 0 && *closure == 'c') X! Bell("No text to save in your dead letter box\n"); X! else { X! if (n && (*closure == 'c' || ! Confirm("REALLY discard this text"))) { X! if ((record = GetMailEnv("DEAD")) == NULL) X! sprintf(Copy, "%s/dead.letter", getenv("HOME")); X! else { X! strcpy(Copy, record); /* take whatever is given */ X! XtFree(record); X! } X st_buf.st_size = -1; /* see if our target exists */ X stat(Copy, &st_buf); X sprintf(s, "\"%s\" [%s] (%d bytes)\n", Copy, X (st_buf.st_size >= 0) ? "Appended" : "New file", n); X Bell(s); X! if (fp) X! fprintf(fp,"cat %s# >> %s 2> /dev/null\n", tmpName, Copy); X! else { X! sprintf(s, "cat %s >> %s 2> /dev/null", tmpName, Copy); X! system(s); X! } X! } X } X } X /* X ** remove any message text that may have been created X */ X! if (! fp) { /* if we failed to make temp file */ X! sprintf(s, "rm -f %s_ %s %s$ &", tmpName, tmpName, tmpName); X! system(s); X! } else { /* try to fork this off to a child process */ X! fprintf(fp, "rm -f %s#_ %s# %s= %s$\n", tmpName,tmpName,tmpName,tmpName); X! fclose(fp); X! switch (fork()) { X! case -1: /* failed, so use old fashioned way */ X! sprintf(s, "/bin/sh %s= &", tmpName); X! system(s); X! break; X! case 0: /* fork succeeded - we are the child */ X! sprintf(s, "%s=", tmpName); X! ARGV[0] = "/bin/sh"; X! ARGV[1] = s; X! ARGV[2] = NULL; X! execv("/bin/sh", ARGV); X! break; X! } X! } X } /* Done */ X X X*************** X*** 215,233 **** X /* ARGSUSED */ X XtCallbackProc X DoIt(w, closure, call_data) X! Widget w; X! caddr_t closure; X! caddr_t call_data; X { X! int i, n; X X X! sprintf(Command, "%s\n", closure); X! if (mailpid) /* If connections are okay,... */ X! writeMail(Command); X! else if (strcmp(Command, "file %\n") != 0 && strcmp(Command, "inc\n") != 0) X Bell("No mail\n"); /* But if no new mail, complain */ X! else { X if (strcmp(mailargv[mailargc - 2], "-f") == 0) { X mailargc -= 2; /* throw away any folder argument */ X mailargv[mailargc] = NULL; /* and NULL end of argument list */ X--- 321,352 ---- X /* ARGSUSED */ X XtCallbackProc X DoIt(w, closure, call_data) X! Widget w; X! caddr_t closure; X! caddr_t call_data; X { X! int i, n; X! char buf[BUFSIZ]; X! Arg args[1]; X! LabelWidget lw = (LabelWidget) WidgetOf(WidgetOf(WidgetOf(toplevel, X! "topBox"), "titleBar"), "titleBar"); X X+ sprintf(Command, "%s\n", closure); X+ if (mailpid) { /* If connections are okay,... */ X+ if ((n = match(&command_pattern, Command)) != C_FILE && n != C_NEWMAIL) X+ writeMail(Command); X+ else { /* check for commit of any changes */ X+ XtSetArg(args[0], XtNlabel, (XtArgVal) NULL); X+ XtGetValues(lw, args, ONE); X+ strcpy(buf, (char *)args[0].value); X X! if (strcmp(&buf[strlen(buf) - 7], "deleted") || X! Confirm("COMMIT all changes to this folder")) X! writeMail(Command); X! } X! } else if (C_NEWMAIL != match(&command_pattern, Command)) X Bell("No mail\n"); /* But if no new mail, complain */ X! else { X if (strcmp(mailargv[mailargc - 2], "-f") == 0) { X mailargc -= 2; /* throw away any folder argument */ X mailargv[mailargc] = NULL; /* and NULL end of argument list */ X*************** X*** 235,241 **** X callMail(mailargc, mailargv); /* restart the mail connections */ X strcpy(Command, "Start"); /* Let em know we've re-started */ X UnsetNewmail(w, NULL, NULL); X! } X } /* DoIt */ X X X--- 354,360 ---- X callMail(mailargc, mailargv); /* restart the mail connections */ X strcpy(Command, "Start"); /* Let em know we've re-started */ X UnsetNewmail(w, NULL, NULL); X! } X } /* DoIt */ X X X*************** X*** 263,276 **** X caddr_t closure; X caddr_t call_data; X { X! union wait status; X Display *dpy = XtDisplay(toplevel); X X! if (mailpid) { X! sprintf(Command, "%s\n", closure); X! writeMail(Command); X! wait3(&status, WNOHANG, NULL); X } X XtDestroyWidget(toplevel); X XCloseDisplay(dpy); X exit(0); X--- 382,407 ---- X caddr_t closure; X caddr_t call_data; X { X! Arg args[1]; X Display *dpy = XtDisplay(toplevel); X+ LabelWidget lw = (LabelWidget) WidgetOf(WidgetOf(WidgetOf(toplevel, X+ "topBox"), "titleBar"), "titleBar"); X+ char buf[BUFSIZ]; X+ union wait status; X X! if (mailpid) { /* check for commit of any changes */ X! XtSetArg(args[0], XtNlabel, (XtArgVal) NULL); X! XtGetValues(lw, args, ONE); X! strcpy(buf, (char *)args[0].value); X! X! if (*closure != 'q' || strcmp(&buf[strlen(buf) - 7], "deleted") || X! Confirm("Changes in folder. REALLY quit")) { X! sprintf(Command, "%s\n", closure); X! writeMail(Command); X! wait3(&status, WNOHANG, NULL); X! } else return; X } X+ X XtDestroyWidget(toplevel); X XCloseDisplay(dpy); X exit(0); X*************** X*** 279,284 **** X--- 410,417 ---- X X /* X ** @(#)DoSet() - send specified set request to mail and destroy current menu. X+ ** To accommodate those systems (Sony?) whose mail cannot handle X+ ** 'set no' commands, convert 'set no's to unsets. X */ X /* ARGSUSED */ X XtCallbackProc X*************** X*** 293,302 **** X if (! mailpid) /* If connections are okay,... */ X Bell("No mail\n"); /* if no new mail, complain */ X else { X! sprintf(buf, "set %s", w->core.name); X! c = QueryMail(buf); X! XtFree(c); X X XtDestroyWidget(XtParent(XtParent(w))); X } X } /* DoSet */ X--- 426,444 ---- X if (! mailpid) /* If connections are okay,... */ X Bell("No mail\n"); /* if no new mail, complain */ X else { X! c = w->core.name; X! if (strcmp(&c[strlen(c) - 6], "expert") == 0) { X! XMail.expert = (*c == 'n') ? 0 : 1; X! } else { X! if (*c == 'n') X! sprintf(buf, "unset %s", &c[2]); X! else X! sprintf(buf, "set %s", c); X X+ c = QueryMail(buf); X+ XtFree(c); X+ } X+ X XtDestroyWidget(XtParent(XtParent(w))); X } X } /* DoSet */ X*************** X*** 313,325 **** X caddr_t call_data; X { X XtTextPosition pos; X int num; X X if (! mailpid) X Bell("No mail\n"); X else { X! pos = XtTextGetInsertionPoint(WidgetOf(WidgetOf(toplevel, "topBox"), "indexWindow")); X num = PositionToMsgNumber(pos); /* no current message returns zero */ X if (*client_data == 'u' && IndexBuf[pos + 1] != 'D') num = 0; X if (num) sprintf(Command, "%s %d\n", client_data, num); X else sprintf(Command, "%s \n", client_data); X--- 455,469 ---- X caddr_t call_data; X { X XtTextPosition pos; X+ Widget iw = WidgetOf(WidgetOf(toplevel, "topBox"), "indexWindow"); X int num; X X if (! mailpid) X Bell("No mail\n"); X else { X! pos = XtTextGetInsertionPoint(iw); X num = PositionToMsgNumber(pos); /* no current message returns zero */ X+ pos = XtTextGetInsertionPoint(iw); X if (*client_data == 'u' && IndexBuf[pos + 1] != 'D') num = 0; X if (num) sprintf(Command, "%s %d\n", client_data, num); X else sprintf(Command, "%s \n", client_data); X*************** X*** 328,334 **** X--- 472,495 ---- X } /* DoWith */ X X X+ /* ARGSUSED */ X /* X+ ** @(#)DropIt() - callback to destroy the current folder popup list(s) X+ */ X+ XtCallbackProc X+ DropIt(w, client_data, call_data) X+ Widget w; X+ caddr_t client_data; X+ caddr_t call_data; X+ { X+ Widget popup = WidgetOf(WidgetOf(WidgetOf(WidgetOf(toplevel, "topBox"), X+ "commandPanel"), "Folder"), "popupList"); X+ if (popup) X+ XtDestroyWidget(popup); X+ } /* DropIt */ X+ X+ X+ /* X ** @(#)GetAliasName() - retrieve alias name from button label X */ X /* ARGSUSED */ X*************** X*** 396,401 **** X--- 557,586 ---- X X X /* X+ ** @(#)ReEdit() - Call the editMail routine to re-edit a message X+ */ X+ /* ARGSUSED */ X+ XtCallbackProc X+ ReEdit(w, closure, call_data) X+ Widget w; X+ caddr_t closure; X+ caddr_t call_data; X+ { X+ Widget Popup = XtParent(XtParent(XtParent(XtParent(XtParent(w))))); X+ Widget To = WidgetOf(WidgetOf(Popup, "SubjCc"), "To"); X+ X+ X+ XtPopdown(XtParent(XtParent(w))); /* drop the sub-menu popup */ X+ XtPopdown(Popup); /* pop down the send popup */ X+ X+ editMail(); /* re-edit the message file */ X+ X+ XtPopup(Popup, XtGrabNone); /* pop back the send popup */ X+ XWarpPointer(XtDisplay(toplevel), None, XtWindow(To), 0, 0, 0, 0, 10, 5); X+ } /* ReEdit */ X+ X+ X+ /* X ** @(#)Reply() - send a reply to the author of the selected message X ** include its text and/or copy the other recipients, if asked. X */ X*************** X*** 411,416 **** X--- 596,602 ---- X Position pos; X String *params, p, q, r; X String txt, ccList, author, subject, others, date, reference, empty; X+ Widget sb = WidgetOf(WidgetOf(WidgetOf(toplevel,"topBox"),"commandPanel"),"Send"); X char *us, *getlogin(); X int erasable = 0; X int alwaysIgnore; X*************** X*** 425,434 **** X X if (p = GetMailEnv("alwaysignore")) { X XtFree(p); X! alwaysIgnore = 1; X } else alwaysIgnore = 0; X X! if (alwaysIgnore) /* use 'alwaysignore' to decide how we print */ X sprintf(Command, "p %d", PositionToMsgNumber(pos)); X else X sprintf(Command, "P %d", PositionToMsgNumber(pos)); X--- 611,620 ---- X X if (p = GetMailEnv("alwaysignore")) { X XtFree(p); X! alwaysIgnore = (index("SRA", *client_data)) ? 1 : 0; X } else alwaysIgnore = 0; X X! if (alwaysIgnore) /* do we need to include a limited copy? */ X sprintf(Command, "p %d", PositionToMsgNumber(pos)); X else X sprintf(Command, "P %d", PositionToMsgNumber(pos)); X*************** X*** 477,483 **** X for (p = txt; *p; p++) { X if (strcmp(p, empty) == 0 || strncmp(p, "Status:", 7) == 0) break; X X! if (strncmp(p, "Return-Path:", 12) == 0) { X author = p + 14; /* step over the opening '<' chevron */ X for (p = author; *p && *p != '>'; p++); X if (*p) *p++ = '\0'; X--- 663,680 ---- X for (p = txt; *p; p++) { X if (strcmp(p, empty) == 0 || strncmp(p, "Status:", 7) == 0) break; X X! if (strncmp(p, "From ", 5) == 0 ) { X! reference = p + 5; X! for (p = reference; *p && *p != '\n'; p++); X! while (*(p+1) && index(" \t", *(p+1))) { X! *p = ' '; /* change this newline to a space */ X! *(p+1) = ' '; /* change possible tab to a space */ X! for (p++; *p && *p != '\n'; p++); X! } X! if (*p) *p = '\0'; X! } X! X! else if (strncmp(p, "Return-Path:", 12) == 0) { X author = p + 14; /* step over the opening '<' chevron */ X for (p = author; *p && *p != '>'; p++); X if (*p) *p++ = '\0'; X*************** X*** 490,498 **** X if (*p) *p = '\0'; X } X X! else if (strncmp(p, "From:", 5) == 0) { X reference = p + 6; X for (p = reference; *p && *p != '\n'; p++); X if (*p) *p = '\0'; X } X X--- 687,700 ---- X if (*p) *p = '\0'; X } X X! else if (strncmp(p, "From:", 5) == 0 && ! *reference ) { X reference = p + 6; X for (p = reference; *p && *p != '\n'; p++); X+ while (*(p+1) && index(" \t", *(p+1))) { X+ *p = ' '; /* change this newline to a space */ X+ *(p+1) = ' '; /* change possible tab to a space */ X+ for (p++; *p && *p != '\n'; p++); X+ } X if (*p) *p = '\0'; X } X X*************** X*** 499,504 **** X--- 701,711 ---- X else if (strncmp(p, "To:", 3) == 0) { X others = p + 4; X for (p = others; *p && *p != '\n'; p++); X+ while (*(p+1) && index(" \t", *(p+1))) { X+ *p = ' '; /* change this newline to a space */ X+ *(p+1) = ' '; /* change possible tab to a space */ X+ for (p++; *p && *p != '\n'; p++); X+ } X if (*p) *p = '\0'; X } X X*************** X*** 505,510 **** X--- 712,722 ---- X else if (strncmp(p, "Subject:", 8) == 0) { X subject = p + 9; X for (p = subject; *p && *p != '\n'; p++); X+ while (*(p+1) && index(" \t", *(p+1))) { X+ *p = ' '; /* change this newline to a space */ X+ *(p+1) = ' '; /* change possible tab to a space */ X+ for (p++; *p && *p != '\n'; p++); X+ } X if (*p) *p = '\0'; X } X X*************** X*** 511,516 **** X--- 723,733 ---- X else if (strncmp(p, "Cc:", 3) == 0) { X ccList = p + 4; X for (p = ccList; *p && *p != '\n'; p++); X+ while (*(p+1) && index(" \t", *(p+1))) { X+ *p = ' '; /* change this newline to a space */ X+ *(p+1) = ' '; /* change possible tab to a space */ X+ for (p++; *p && *p != '\n'; p++); X+ } X if (*p) *p = '\0'; X } X else for (; *p && *p != '\n'; p++); X*************** X*** 575,581 **** X strcpy(InReply, empty); X if (*client_data != 's' && *reference && *date) { X r = (*client_data == 'S') ? "Forwarding" : "In-Reply-To"; X! sprintf(InReply, "%s: Mail from '%s' dated %s", r, reference, date); X } X X strcpy(SubjBuf, empty); X--- 792,798 ---- X strcpy(InReply, empty); X if (*client_data != 's' && *reference && *date) { X r = (*client_data == 'S') ? "Forwarding" : "In-Reply-To"; X! sprintf(InReply, "%s: Mail from '%s'\n\tdated %s", r, reference, date); X } X X strcpy(SubjBuf, empty); X*************** X*** 588,594 **** X strcpy(CcBuf, ccList); X strcpy(BccBuf, empty); X X! sendMail(w); X } /* Reply */ X X X--- 805,811 ---- X strcpy(CcBuf, ccList); X strcpy(BccBuf, empty); X X! sendMail(sb); X } /* Reply */ X X X*************** X*** 613,619 **** X pos = XtTextGetInsertionPoint(WidgetOf(WidgetOf(toplevel, "topBox"), "indexWindow")); X num = PositionToMsgNumber(pos); /* no current message returns zero */ X X! if (*cmd == 'C' || *cmd == 'S' || *cmd == 'W' || num == 0) { X if (num) { X sprintf(Command, "%s %d\n", cmd, num); X } else { X--- 830,836 ---- X pos = XtTextGetInsertionPoint(WidgetOf(WidgetOf(toplevel, "topBox"), "indexWindow")); X num = PositionToMsgNumber(pos); /* no current message returns zero */ X X! if (*cmd == 'C' || *cmd == 'S' || num == 0) { X if (num) { X sprintf(Command, "%s %d\n", cmd, num); X } else { X*** ../v1.1/confirm.c Mon Aug 13 12:56:26 1990 X--- confirm.c Mon Aug 27 11:09:18 1990 X*************** X*** 0 **** X--- 1,233 ---- X+ /* X+ * @(#)Confirm - a Yes/No confirmation window with optional prompt argument. X+ * X+ * From an idea contributed by Mitchell L. Model <mlm@odi.com> on 5-17-89 X+ * X+ * Copyright 1990 by National Semiconductor Corporation X+ * X+ * Permission to use, copy, modify, and distribute this software and its X+ * documentation for any purpose is hereby granted without fee, provided that X+ * the above copyright notice appear in all copies and that both that X+ * copyright notice and this permission notice appear in supporting X+ * documentation, and that the name of National Semiconductor Corporation not X+ * be used in advertising or publicity pertaining to distribution of the X+ * software without specific, written prior permission. X+ * X+ * NATIONAL SEMICONDUCTOR CORPORATION MAKES NO REPRESENTATIONS ABOUT THE X+ * SUITABILITY OF THIS SOFTWARE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" X+ * WITHOUT EXPRESS OR IMPLIED WARRANTY. NATIONAL SEMICONDUCTOR CORPORATION X+ * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED X+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO X+ * EVENT SHALL NATIONAL SEMICONDUCTOR CORPORATION BE LIABLE FOR ANY SPECIAL, X+ * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM X+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE X+ * OR OTHER TORTUOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR X+ * PERFORMANCE OF THIS SOFTWARE. X+ * X+ * Author: Michael C. Wagnitz - National Semiconductor Corporation X+ * X+ */ X+ #include "global.h" X+ X+ #define btnsepr 7 X+ X+ typedef struct _result { X+ Bool *popflg; X+ Bool *var; X+ Widget shell; X+ } *Result; X+ void X+ ProcessOneEvent(display) X+ Display *display; X+ { X+ static XEvent event; X+ X+ XNextEvent(display, &event); X+ XtDispatchEvent(&event); X+ } /* ProcessOneEvent */ X+ X+ X+ static Result X+ MakeResult(shell, popflg, resultvar) X+ Bool *popflg, *resultvar; X+ Widget shell; X+ { X+ Result rec = (Result) malloc(sizeof(struct _result)); X+ X+ rec->popflg = popflg; X+ rec->var = resultvar; X+ rec->shell = shell; X+ X+ return rec; X+ } /* MakeResult */ X+ X+ X+ /* ARGSUSED */ X+ /* X+ ** ClearConfirm - get rid of the confirmation box. X+ */ X+ void X+ ClearConfirm(w, val, result) X+ Widget w; X+ Bool val; X+ Result result; X+ { X+ Display *display = XtDisplay(w); X+ X+ XtPopdown(result->shell); X+ XtDestroyWidget(result->shell); X+ *result->popflg = False; X+ *result->var = val; X+ } /* ClearConfirm */ X+ X+ X+ /* ARGSUSED */ X+ static void X+ Yes(w, result, call_data) X+ Widget w; X+ Result result; X+ caddr_t call_data; /* unused */ X+ { X+ ClearConfirm(w, True, result); X+ } X+ X+ X+ /* ARGSUSED */ X+ static void X+ No(w, result, call_data) X+ Widget w; /* unused */ X+ Result result; X+ caddr_t call_data; X+ { X+ ClearConfirm(w, False, result); X+ } /* No */ X+ X+ X+ /* X+ * Confirm - put up a window asking for confirmation. X+ */ X+ Bool X+ Confirm(prompt) X+ char* prompt; X+ { X+ Arg args[4]; X+ Bool popped_up = False, result = False; X+ Result resultrec; X+ String Translations = "<BtnDown>,<BtnUp>:\n"; X+ Widget shell, form, label, yes, no; X+ Window root, child; X+ int root_x, root_y, child_x, child_y; X+ int nargs, buttons, labelwidth, yeswidth, btnborder, btnwidth; X+ char *query = NULL; X+ X+ /* X+ ** First, find out if expert flag is set. If so, just return True. X+ */ X+ if (XMail.expert) X+ return True; X+ /* X+ ** Find out where the mouse is, so we can put the confirmation X+ ** box right there. X+ */ X+ XQueryPointer(XtDisplay(toplevel), XtWindow(toplevel), &root, &child, X+ &root_x, &root_y, &child_x, &child_y, &buttons); X+ /* X+ ** Construct the confirmation box X+ */ X+ shell=XtCreatePopupShell("Confirm",transientShellWidgetClass,toplevel,args,0); X+ X+ XtSetArg(args[0], XtNtranslations, XtParseTranslationTable(Translations)); X+ XtSetArg(args[1], XtNborderWidth, (XtArgVal) 0); X+ form = XtCreateManagedWidget("form", formWidgetClass, shell, args, TWO); X+ X+ if (! prompt) label = NULL; X+ else { X+ if (query) XtFree(query); X+ query = NULL; X+ if (query = XtMalloc(strlen(prompt) + 2)) { X+ strcpy(query, prompt); X+ strcat(query, "?"); X+ } X+ XtSetArg(args[0], XtNlabel, (XtArgVal) query); X+ XtSetArg(args[1], XtNjustify, XtJustifyCenter); X+ XtSetArg(args[2], XtNborderWidth, (XtArgVal) 0); X+ label = XtCreateManagedWidget("prompt", labelWidgetClass, form, args, 3); X+ } X+ X+ nargs = 0; X+ XtSetArg(args[nargs], XtNhorizDistance, (XtArgVal) btnsepr); nargs++; X+ if (prompt) { X+ XtSetArg(args[nargs], XtNfromVert, (XtArgVal) label); nargs++; X+ XtSetArg(args[nargs], XtNvertDistance, (XtArgVal) 12); nargs++; X+ } X+ yes = XtCreateManagedWidget("yes", commandWidgetClass, form, args, nargs); X+ X+ nargs = 0; X+ XtSetArg(args[nargs], XtNfromHoriz, (XtArgVal) yes); nargs++; X+ XtSetArg(args[nargs], XtNhorizDistance, (XtArgVal) btnsepr); nargs++; X+ if (prompt) { X+ XtSetArg(args[nargs], XtNfromVert, (XtArgVal) label); nargs++; X+ XtSetArg(args[nargs], XtNvertDistance, (XtArgVal) 12); nargs++; X+ } X+ no = XtCreateManagedWidget("no", commandWidgetClass, form, args, nargs); X+ X+ if (! label) X+ labelwidth = 0; X+ else { X+ XtSetArg(args[0], XtNwidth, (XtArgVal) NULL); X+ XtGetValues(label, args, ONE); X+ labelwidth = args[0].value; X+ } X+ X+ XtSetArg(args[0], XtNwidth, (XtArgVal) NULL); X+ XtSetArg(args[1], XtNborder, (XtArgVal) NULL); X+ XtGetValues(yes, args, TWO); X+ X+ yeswidth = args[0].value; X+ btnborder = args[1].value; X+ X+ btnwidth = (labelwidth - btnsepr - (2 * btnborder)) / 2; X+ if (btnwidth < yeswidth) btnwidth = yeswidth; X+ X+ XtSetArg(args[0], XtNwidth, (XtArgVal) btnwidth); X+ XtSetValues(yes, args, ONE); X+ XtSetValues(no, args, ONE); X+ X+ XtRealizeWidget(shell); X+ X+ XtSetArg(args[0], XtNwidth, (XtArgVal) NULL); X+ XtSetArg(args[1], XtNheight, (XtArgVal) NULL); X+ XtGetValues(shell, args, TWO); X+ X+ root_x -= args[0].value / 2; X+ root_y -= args[1].value / 2; X+ /* X+ ** Keep confirm popup within root window borders (don't place it off-screen) X+ */ X+ if (root_x + args[0].value > RootWidth) X+ root_x = RootWidth - args[0].value; X+ if (root_x < 0) root_x = 0; X+ X+ if (root_y + args[0].value > RootHeight) X+ root_y = RootHeight - args[0].value; X+ if (root_y < 0) root_y = 0; X+ X+ XtSetArg(args[0], XtNx, (XtArgVal) root_x); X+ XtSetArg(args[1], XtNy, (XtArgVal) root_y); X+ XtSetValues(shell, args, TWO); X+ X+ resultrec = MakeResult(shell, &popped_up, &result); X+ XtAddCallback(yes, XtNcallback, Yes, resultrec); X+ XtAddCallback(no, XtNcallback, No, resultrec); X+ X+ if (XMail.bellRing) /* ring bell if not silenced by user */ X+ XBell (XtDisplay (toplevel), 33); X+ X+ XtPopup(shell, XtGrabExclusive); X+ X+ popped_up = True; X+ X+ while (popped_up) ProcessOneEvent(XtDisplay(shell)); X+ X+ return result; X+ } /* Confirm */ X*** ../v1.1/defs.h Mon Jun 4 09:48:36 1990 X--- defs.h Mon Aug 27 11:09:19 1990 X*************** X*** 32,38 **** X * EVENT SHALL NATIONAL SEMICONDUCTOR CORPORATION BE LIABLE FOR ANY SPECIAL, X * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM X * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE X! * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR X * PERFORMANCE OF THIS SOFTWARE. X * X * Author: Michael C. Wagnitz - National Semiconductor Corporation X--- 32,38 ---- X * EVENT SHALL NATIONAL SEMICONDUCTOR CORPORATION BE LIABLE FOR ANY SPECIAL, X * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM X * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE X! * OR OTHER TORTUOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR X * PERFORMANCE OF THIS SOFTWARE. X * X * Author: Michael C. Wagnitz - National Semiconductor Corporation X*************** X*** 49,67 **** X #include <X11/Shell.h> X #include <X11/Xatom.h> X X! #if XtSpecificationRelease >= 4 X! /* R4 */ X! #include <X11/Xaw/Cardinals.h> X! #include <X11/Xaw/VPaned.h> X! #include <X11/Xaw/Form.h> X! #include <X11/Xaw/AsciiText.h> X! #include <X11/Xaw/TextP.h> X! #include <X11/Xaw/Box.h> X! #include <X11/Xaw/List.h> X! #include <X11/Xaw/Command.h> X! #include <X11/Xaw/Dialog.h> X! #include <X11/Xaw/Label.h> X! #else X /* R3 */ X #include <X11/Cardinals.h> X #include <X11/VPaned.h> X--- 49,55 ---- X #include <X11/Shell.h> X #include <X11/Xatom.h> X X! #if XtSpecificationRelease < 4 X /* R3 */ X #include <X11/Cardinals.h> X #include <X11/VPaned.h> X*************** X*** 73,78 **** X--- 61,78 ---- X #include <X11/Command.h> X #include <X11/Dialog.h> X #include <X11/Label.h> X+ #else X+ /* R4 */ X+ #include <X11/Xaw/Cardinals.h> X+ #include <X11/Xaw/VPaned.h> X+ #include <X11/Xaw/Form.h> X+ #include <X11/Xaw/AsciiText.h> X+ #include <X11/Xaw/TextP.h> X+ #include <X11/Xaw/Box.h> X+ #include <X11/Xaw/List.h> X+ #include <X11/Xaw/Command.h> X+ #include <X11/Xaw/Dialog.h> X+ #include <X11/Xaw/Label.h> X #endif X X #define TITLE "xmail 1." /* program title and version string */ X*************** X*** 108,115 **** X Dimension helpY; /* help y offset from textWindow */ X Dimension menuX; /* menu x offset from parent */ X Dimension menuY; /* menu y offset from parent */ X- Boolean iconic; /* xmail starts in withdrawn state */ X Boolean bellRing; /* xmail audible bell option */ X Boolean mailopt_n; /* mail option -n */ X Boolean mailopt_U; /* mail option -U */ X Boolean Show_Last; /* xmail show latest option -ls */ X--- 108,116 ---- X Dimension helpY; /* help y offset from textWindow */ X Dimension menuX; /* menu x offset from parent */ X Dimension menuY; /* menu y offset from parent */ X Boolean bellRing; /* xmail audible bell option */ X+ Boolean expert; /* do not confirm destructive acts */ X+ Boolean iconic; /* xmail starts in withdrawn state */ X Boolean mailopt_n; /* mail option -n */ X Boolean mailopt_U; /* mail option -U */ X Boolean Show_Last; /* xmail show latest option -ls */ X*** ../v1.1/directory.c Mon Jun 4 09:48:36 1990 X--- directory.c Mon Aug 27 11:09:19 1990 X*************** X*** 19,25 **** X * EVENT SHALL NATIONAL SEMICONDUCTOR CORPORATION BE LIABLE FOR ANY SPECIAL, X * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM X * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE X! * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR X * PERFORMANCE OF THIS SOFTWARE. X * X * Author: Michael C. Wagnitz - National Semiconductor Corporation X--- 19,25 ---- X * EVENT SHALL NATIONAL SEMICONDUCTOR CORPORATION BE LIABLE FOR ANY SPECIAL, X * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM X * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE X! * OR OTHER TORTUOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR X * PERFORMANCE OF THIS SOFTWARE. X * X * Author: Michael C. Wagnitz - National Semiconductor Corporation X*************** X*** 46,56 **** X String *params; X Cardinal *num_params; X { X! Arg args[6]; X Cardinal label_width, path_length, n, depth, x, y; X DIR *new_dir, *dirp; X String name, path; X! Widget menu, layout, bw; X char *s, trans[BUFSIZ], tmp[BUFSIZ]; X X #ifdef SUNOS_4 X--- 46,56 ---- X String *params; X Cardinal *num_params; X { X! Arg args[7]; X Cardinal label_width, path_length, n, depth, x, y; X DIR *new_dir, *dirp; X String name, path; X! Widget menu, layout, bw, above, to_left; X char *s, trans[BUFSIZ], tmp[BUFSIZ]; X X #ifdef SUNOS_4 X*************** X*** 104,146 **** X label_width = (n=strlen(tmp)) ? XTextWidth(TextFontStr, tmp, n) + 12 : 0; X X if (label_width) { X! (void) sprintf(trans, b_Trans, depth, name); X X! XtSetArg(args[0], XtNwidth, label_width); X! XtSetArg(args[1], XtNfont, TextFontStr); X! XtSetArg(args[2], XtNcallback, callbacks); X! XtSetArg(args[3], XtNtranslations, XtParseTranslationTable(trans)); X /* X ** create the menu buttons X */ X! bw = NULL; X! for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) { X! if (strcmp(dp->d_name, ".") && strcmp(dp->d_name, "..")) { X /* X ** If this 'folder file' is also a directory, mark it with a trailing slash '/' X */ X! s = XtMalloc(path_length + strlen(dp->d_name) + 2); X! sprintf(s, "%s/%s", path, dp->d_name); X! if ((new_dir = opendir(s)) != NULL) { X! sprintf(tmp, "%s/", dp->d_name); X! XtSetArg(args[4], XtNlabel, tmp); X! } else X! XtSetArg(args[4], XtNlabel, dp->d_name); X! XtSetArg(args[5], XtNfromVert, bw); X! bw = XtCreateManagedWidget("menubutton",commandWidgetClass,layout,args,6); X /* X ** If this 'folder' is a directory, add a button popup menu of its files. X */ X! if (new_dir) { X! closedir(new_dir); X! sprintf(trans, dir_Trans, tmp, s, depth); X! XtOverrideTranslations(bw, XtParseTranslationTable(trans)); X } X- XtFree(s); X } X } X- closedir(dirp); X- } X /* X ** If no buttons were created for this menu, destroy the widget. X */ X--- 104,154 ---- X label_width = (n=strlen(tmp)) ? XTextWidth(TextFontStr, tmp, n) + 12 : 0; X X if (label_width) { X! (void) sprintf(trans, b_Trans, depth, name); X X! XtSetArg(args[0], XtNwidth, label_width); X! XtSetArg(args[1], XtNfont, TextFontStr); X! XtSetArg(args[2], XtNcallback, callbacks); X! XtSetArg(args[3], XtNtranslations, XtParseTranslationTable(trans)); X /* END_OF_FILE if test 46178 -ne `wc -c <'Patch.02b'`; then echo shar: \"'Patch.02b'\" unpacked with wrong size! fi # end of 'Patch.02b' fi echo shar: End of archive 2 \(of 5\). cp /dev/null ark2isdone MISSING="" for I in 1 2 3 4 5 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 5 archives. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0 dan ---------------------------------------------------- O'Reilly && Associates argv@sun.com / argv@ora.com Opinions expressed reflect those of the author only.