[comp.sources.x] REPOST: v08i099: xmail, Patch2, Part04/05

michael@parns.nsc.com (Michael Wagnitz) (08/30/90)

Submitted-by: michael@parns.nsc.com (Michael Wagnitz)
Posting-number: Volume 8, Issue 99
Archive-name: xmail/patch2.04

#! /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 4 (of 5)."
# Contents:  Patch.02d
# Wrapped by michael@harley on Mon Aug 27 12:47:27 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'Patch.02d' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Patch.02d'\"
else
echo shar: Extracting \"'Patch.02d'\" \(52848 characters\)
sed "s/^X//" >'Patch.02d' <<'END_OF_FILE'
X!                                             markIndex(" ");
X                                             }
X                                          }
X  		                      break;
X--- 246,252 ----
X                                              sprintf(tmp, "%d", msgnum);
X                                              XtFree(msg);
X                                              msg = QueryMail(tmp);
X!                                             markIndex("> ");
X                                             }
X                                          }
X  		                      break;
X***************
X*** 256,268 ****
X                            markIndex("D");
X  		          num = msgnum;
X  		          msgnum = index_handler(++msgnum, 0); /* next msg */
X!                           if (msgnum != num) markIndex(" ");
X                           }
X                         if (*Command == 'u') {
X  		          c = QueryMail("=");
X  		          sscanf(c, "%d", &msgnum);
X  		          XtFree(c);
X!                           iw = WidgetOf(WidgetOf(toplevel, "topBox"),"indexWindow");
X                            if (TextGetLastPos(iw) < (XtTextPosition) 4) {
X                               c = QueryMail("h");
X                               writeText(iw, c, FALSE);
X--- 269,282 ----
X                            markIndex("D");
X  		          num = msgnum;
X  		          msgnum = index_handler(++msgnum, 0); /* next msg */
X!                           if (msgnum != num)
X!                              markIndex("> ");
X                           }
X                         if (*Command == 'u') {
X  		          c = QueryMail("=");
X  		          sscanf(c, "%d", &msgnum);
X  		          XtFree(c);
X!                           iw = WidgetOf(WidgetOf(toplevel, "topBox"), "indexWindow");
X                            if (TextGetLastPos(iw) < (XtTextPosition) 4) {
X                               c = QueryMail("h");
X                               writeText(iw, c, FALSE);
X***************
X*** 269,275 ****
X  		             XtFree(c);
X                              }
X  		          msgnum = index_handler(msgnum, 1);
X!                           markIndex(" ");
X                           }
X                         c = QueryMail("file");	/* resets current msg to 1 */
X                         (void) UpdateTitleBar(c);
X--- 283,289 ----
X  		             XtFree(c);
X                              }
X  		          msgnum = index_handler(msgnum, 1);
X!                           markIndex("> ");
X                           }
X                         c = QueryMail("file");	/* resets current msg to 1 */
X                         (void) UpdateTitleBar(c);
X***************
X*** 281,295 ****
X  /*
X  ** In response to a request to view new mail, first reset the mailbox flag.
X  ** If mail came back with an error, complain to the user.  Otherwise, clear
X! ** the Newmail command button highlighting, and (if it exists) destroy the
X! ** current folder popup list.  Then display any new mail text.
X  */
X      case C_NEWMAIL:
X  		    button = WidgetOf(WidgetOf(WidgetOf(toplevel, "topBox"),
X                                                       "commandPanel"), "Folder");
X  		    UnsetNewmail(button, NULL, NULL);
X- 		    if (popup = WidgetOf(button, "popupList"))
X- 		       XtDestroyWidget(popup);
X                      if (O_BELL == match(output_pattern, msg)) {
X                         if (strncmp(msg, "No mail for ", 12) == 0) {
X                            Bell("No mail in system mailbox\n");
X--- 295,306 ----
X  /*
X  ** In response to a request to view new mail, first reset the mailbox flag.
X  ** If mail came back with an error, complain to the user.  Otherwise, clear
X! ** the Newmail command button highlighting. Then display any new mail text.
X  */
X      case C_NEWMAIL:
X  		    button = WidgetOf(WidgetOf(WidgetOf(toplevel, "topBox"),
X                                                       "commandPanel"), "Folder");
X  		    UnsetNewmail(button, NULL, NULL);
X                      if (O_BELL == match(output_pattern, msg)) {
X                         if (strncmp(msg, "No mail for ", 12) == 0) {
X                            Bell("No mail in system mailbox\n");
X***************
X*** 316,322 ****
X                               sprintf(tmp, "%d", msgnum);
X                               XtFree(msg);
X                               msg = QueryMail(tmp);
X!                              markIndex(" ");	/* 'cause we just read it */
X                              }
X                           }
X                        }
X--- 327,333 ----
X                               sprintf(tmp, "%d", msgnum);
X                               XtFree(msg);
X                               msg = QueryMail(tmp);
X!                              markIndex("> ");	/* 'cause we just read it */
X                              }
X                           }
X                        }
X***************
X*** 419,424 ****
X--- 430,446 ----
X          if (strcmp(&output[j], MailPrompt) == 0) {
X             output[j] = '\0';		/* Drop prompt from end of text */
X             break;			/* and return from read routine */
X+           }
X+ 
X+         if (!strcmp(Command,"Start")) {	/* see if somehow missed the prompt */
X+            j = strlen(output) - 3;	/* no accidents allowed here either */
X+            if (j < 0) j = 0;		/* no string references before zero */
X+            if (strcmp(&output[j], "\n& ") == 0) { /* if default mail prompt */
X+               output[++j] = '\0';	/* drop prompt from end of string */
X+               XtFree(MailPrompt);	/* intended prompt is now bogus */
X+               MailPrompt = XtNewString("& ");	/* reset the mail prompt */
X+               break;			/* and return from read routine */
X+              }
X            }
X  
X          if (O_BELL == match(output_pattern,output) && !strcmp(Command,"Start"))
X*** ../v1.1/utils.c	Mon Jun  4 09:48:42 1990
X--- utils.c	Mon Aug 27 11:09:22 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   * The following software modules were created and are Copyrighted by National
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   * The following software modules were created and are Copyrighted by National
X***************
X*** 72,95 ****
X  char	*s;
X  {
X   XtTextBlock 	textblock;
X!  XtTextPosition	pos;
X   Widget		w = WidgetOf(WidgetOf(toplevel, "topBox"), "indexWindow");
X  
X  
X!  pos = XtTextGetInsertionPoint(w) + 1;
X  
X!  XtTextSetInsertionPoint(w, pos);
X  
X   textblock.firstPos = 0;
X!  textblock.length   = 1;
X   textblock.ptr      = s;
X   textblock.format   = FMT8BIT;
X  
X!  XtTextReplace(w, pos, pos + 1, &textblock);
X  
X   XtTextSetInsertionPoint(w, pos);
X- 
X-  SetSelect(w, NULL, NULL, NULL);
X  } /* markIndex */
X  
X  
X--- 72,110 ----
X  char	*s;
X  {
X   XtTextBlock 	textblock;
X!  XtTextPosition	pos, old;
X   Widget		w = WidgetOf(WidgetOf(toplevel, "topBox"), "indexWindow");
X+  char		*p;
X+  int		size = strlen(s);
X  
X  
X!  pos = XtTextGetInsertionPoint(w);
X  
X!  if (*s == '>')			/* first, remove any existing pointer */
X!     if (p = index(IndexBuf, '>')) {
X!        old = p - IndexBuf;
X!        XtTextSetInsertionPoint(w, old);
X!        textblock.firstPos = 0;
X!        textblock.length   = 1;
X!        textblock.ptr      = " ";
X!        textblock.format   = FMT8BIT;
X!        XtTextReplace(w, old, old + 1, &textblock);
X!       }
X  
X+  for (p = IndexBuf + pos; p > IndexBuf && *(p - 1) != '\n'; p--);
X+ 
X+  pos = (p - IndexBuf);
X+ 
X+  XtTextSetInsertionPoint(w, (*s == '>') ? pos : ++pos);
X+ 
X   textblock.firstPos = 0;
X!  textblock.length   = size;
X   textblock.ptr      = s;
X   textblock.format   = FMT8BIT;
X  
X!  XtTextReplace(w, pos, pos + size, &textblock);
X  
X   XtTextSetInsertionPoint(w, pos);
X  } /* markIndex */
X  
X  
X***************
X*** 186,192 ****
X  String	msg;
X  {
X   Arg	args[1];
X!  char	*p, *index();
X   char	buf[BUFSIZ];
X   int	worthy = 0;			/* only msgs with ending newline are */
X  
X--- 201,207 ----
X  String	msg;
X  {
X   Arg	args[1];
X!  char	*p;
X   char	buf[BUFSIZ];
X   int	worthy = 0;			/* only msgs with ending newline are */
X  
X*** ../v1.1/windows.c	Mon Jun  4 09:48:44 1990
X--- windows.c	Mon Aug 27 11:09:22 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   * The following software modules were created and are Copyrighted by National
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   * The following software modules were created and are Copyrighted by National
X***************
X*** 50,56 ****
X  
X  
X  #include "global.h"
X! #include "Mailwatch.h"
X  #include "patchlevel.h"
X  #include "icon.mail"
X  #include "national.bm"
X--- 50,56 ----
X  
X  
X  #include "global.h"
X! #include "MailwatchP.h"
X  #include "patchlevel.h"
X  #include "icon.mail"
X  #include "national.bm"
X***************
X*** 164,170 ****
X      XtSetArg(args[3], XtNtranslations, XtParseTranslationTable(b_Trans));
X      for (indx = 0; list[indx] != NULL; indx++) {
X          strcpy(tag, list[indx]->label);		/* set window name by label */
X!         if ((c = (char *)index(tag, ' '))) *c = '\0';	/* first word only */
X          sprintf(trans, "%-*.*s", j, j, list[indx]->label);
X          if (Labels[indx])			/* add accel. note if needed */
X             strcat(trans, Labels[indx]);
X--- 164,170 ----
X      XtSetArg(args[3], XtNtranslations, XtParseTranslationTable(b_Trans));
X      for (indx = 0; list[indx] != NULL; indx++) {
X          strcpy(tag, list[indx]->label);		/* set window name by label */
X!         if ((c = index(tag, ' '))) *c = '\0';	/* first word only */
X          sprintf(trans, "%-*.*s", j, j, list[indx]->label);
X          if (Labels[indx])			/* add accel. note if needed */
X             strcat(trans, Labels[indx]);
X***************
X*** 284,292 ****
X   b1.label = "Newmail"; b1.func = (XtCallbackProc) DoIt; b1.data = "file %";
X  #ifdef SUNOS_4
X   b2.label = "inc (no commit)"; b2.func = (XtCallbackProc) DoIt; b2.data = "inc";
X!  list[0] = &b1; list[1] = &b2; list[2] = NULL;
X  #else
X!  list[0] = &b1; list[1] = NULL;
X  #endif
X   AddButton(parent, "Newmail", "DoCmd", "file %", list, NewMail_Help_Text);
X  
X--- 284,294 ----
X   b1.label = "Newmail"; b1.func = (XtCallbackProc) DoIt; b1.data = "file %";
X  #ifdef SUNOS_4
X   b2.label = "inc (no commit)"; b2.func = (XtCallbackProc) DoIt; b2.data = "inc";
X!  b3.label = "Drop Folders"; b3.func = (XtCallbackProc) DropIt; b3.data = "drop";
X!  list[0] = &b1; list[1] = &b2; list[2] = &b3; list[3] = NULL;
X  #else
X!  b2.label = "Drop Folders"; b2.func = (XtCallbackProc) DropIt; b2.data = "drop";
X!  list[0] = &b1; list[1] = &b2; list[2] = NULL;
X  #endif
X   AddButton(parent, "Newmail", "DoCmd", "file %", list, NewMail_Help_Text);
X  
X***************
X*** 388,395 ****
X    <Key>BackSpace:	DeleteChar()\n\
X    <Key>Linefeed:	DoNothing()\n\
X    <Key>Return:		DoNothing()\n\
X!   <Key>:		CheckInsert() insert-char()";
X  
X   XtSetArg(args[0], XtNwidth, XMail.fileBoxWidth);
X   XtSetArg(args[1], XtNfont, TextFontStr);
X   XtSetArg(args[2], XtNborderWidth, 0);
X--- 390,400 ----
X    <Key>BackSpace:	DeleteChar()\n\
X    <Key>Linefeed:	DoNothing()\n\
X    <Key>Return:		DoNothing()\n\
X!   <Key>:		CheckInsert() insert-char()\n\
X!   <Btn1Down>:           select-start()\n\
X!   <Btn2Down>:           CheckInsert() insert-selection(PRIMARY, CUT_BUFFER0)";
X  
X+ 
X   XtSetArg(args[0], XtNwidth, XMail.fileBoxWidth);
X   XtSetArg(args[1], XtNfont, TextFontStr);
X   XtSetArg(args[2], XtNborderWidth, 0);
X***************
X*** 449,454 ****
X--- 454,461 ----
X   Arg	args[6];
X   Widget	w;
X  
X+  static String Trans = "#override\n\
X+ 			:<Key>Linefeed:	MenuPopdown(help)";
X  
X   XtSetArg(args[0], XtNborderWidth, 3);
X   w = XtCreatePopupShell("help", overrideShellWidgetClass, parent, args, 1);
X***************
X*** 458,464 ****
X   XtSetArg(args[2], XtNfont, HelpFontStr);
X   XtSetArg(args[3], XtNeditType, (XtArgVal) XttextRead);
X   XtSetArg(args[4], XtNtextOptions, wordBreak);
X!  XtCreateManagedWidget("helpWindow", asciiStringWidgetClass, w, args, 5);
X  } /* CreateHelpWindow */
X  
X  
X--- 465,472 ----
X   XtSetArg(args[2], XtNfont, HelpFontStr);
X   XtSetArg(args[3], XtNeditType, (XtArgVal) XttextRead);
X   XtSetArg(args[4], XtNtextOptions, wordBreak);
X!  XtSetArg(args[5], XtNtranslations, XtParseTranslationTable(Trans));
X!  XtCreateManagedWidget("helpWindow", asciiStringWidgetClass, w, args, 6);
X  } /* CreateHelpWindow */
X  
X  
X***************
X*** 470,482 ****
X  Widget parent;
X  {
X   Arg	args[8];
X   Widget	w;
X  
X!  static String translations =
X! 	"<Key>:		DoNothing() \n\
X! 	<Btn1Down>:	select-start() SetSelect() \n\
X! 	<Btn3Down>:	select-start() SetSelect() \n\
X! 	<Btn3Up>:	DoSelected(p)";
X  
X   XtSetArg(args[0], XtNheight, XMail.indexHeight);
X   XtSetArg(args[1], XtNfont, TextFontStr);
X--- 478,508 ----
X  Widget parent;
X  {
X   Arg	args[8];
X+  int	n;
X   Widget	w;
X  
X!  static String translations = "\
X! 	Ctrl<Key>L:		redraw-display() \n\
X! 	Ctrl<Key>V:		next-page() \n\
X! 	Ctrl<Key>Z:		scroll-one-line-up() \n\
X! 	Meta<Key>V:		previous-page() \n\
X! 	Meta<Key>Z:		scroll-one-line-down() \n\
X! 	Meta<Key>\<:		beginning-of-file() \n\
X! 	Meta<Key>\>:		end-of-file() \n\
X! 	None <Key>Return:	scroll-one-line-up() \n\
X! 	None <Key>space:	next-page() \n\
X! 	None <Key>G:		end-of-file() \n\
X! 	None <Key>b:		previous-page() \n\
X! 	None <Key>j:		scroll-one-line-up() \n\
X! 	None <Key>k:		scroll-one-line-down() \n\
X! 	None <Key>-:		scroll-one-line-down() \n\
X! 	None <Key>p:		beginning-of-file() \n\
X! 	None <Key>\':		beginning-of-file() \n\
X! 	<Btn1Down>:		select-start() SetSelect() \n\
X! 	<Btn1Motion>:		extend-adjust() \n\
X! 	<Btn1Up>:		extend-end(PRIMARY, CUT_BUFFER0) \n\
X! 	<Btn3Down>:		select-start() SetSelect() \n\
X! 	<Btn3Up>:		DoSelected(p)";
X  
X   XtSetArg(args[0], XtNheight, XMail.indexHeight);
X   XtSetArg(args[1], XtNfont, TextFontStr);
X***************
X*** 485,492 ****
X   XtSetArg(args[4], XtNeditType, (XtArgVal) XttextEdit);
X   XtSetArg(args[5], XtNtextOptions, scrollVertical | wordBreak);
X   XtSetArg(args[6], XtNtranslations, XtParseTranslationTable(translations));
X  
X!  w = XtCreateManagedWidget("indexWindow",asciiStringWidgetClass,parent,args,7);
X  
X   AddHelpText(w, "index", Index_Help_Text);
X  } /* CreateIndexWindow */
X--- 511,522 ----
X   XtSetArg(args[4], XtNeditType, (XtArgVal) XttextEdit);
X   XtSetArg(args[5], XtNtextOptions, scrollVertical | wordBreak);
X   XtSetArg(args[6], XtNtranslations, XtParseTranslationTable(translations));
X+  n = 7;
X+ #if XtSpecificationRelease >= 4
X+  XtSetArg(args[n], XtNdisplayCaret, (XtArgVal) False);		n++;
X+ #endif
X  
X!  w = XtCreateManagedWidget("indexWindow",asciiStringWidgetClass,parent,args,n);
X  
X   AddHelpText(w, "index", Index_Help_Text);
X  } /* CreateIndexWindow */
X***************
X*** 537,543 ****
X  {
X   Arg		args[4];
X   Widget		icon, mb, topbox;
X!  int		x, y, width, height;
X  /*
X  ** Special added actions
X  */
X--- 567,573 ----
X  {
X   Arg		args[4];
X   Widget		icon, mb, topbox;
X!  int		n, x, y;
X  /*
X  ** Special added actions
X  */
X***************
X*** 554,559 ****
X--- 584,590 ----
X  	{"SetMenu",		(XtActionProc) SetMenu},
X  	{"DoNothing",		(XtActionProc) DoNothing},
X  	{"DoSelected",		(XtActionProc) DoSelected},
X+ 	{"SavePos",		(XtActionProc) SavePos},
X  	{"SetAliases",		(XtActionProc) SetAliases},
X  	{"SetCursor",		(XtActionProc) SetCursor},
X  	{"SetDirectory",	(XtActionProc) SetDirectory},
X***************
X*** 566,571 ****
X--- 597,603 ----
X  	{"MyNotify",		(XtActionProc) MyNotify},
X  	{"NextField",		(XtActionProc) NextField},
X  	{"PrintMsg",		(XtActionProc) PrintMsg},
X+ 	{"SetPos",		(XtActionProc) SetPos},
X  	{"Quit",		(XtActionProc) Quit},
X          {NULL, NULL}
X        };
X***************
X*** 588,602 ****
X  /*
X  ** Create an icon window for the mailwatchWidget
X  */
X-  x = y = 0;
X-  if (XMail.iconGeometry)
X-     XParseGeometry(XMail.iconGeometry, &x, &y, &width, &height);
X- 
X   XtSetArg(args[0], XtNwidth, (XtArgVal) mail_width);
X   XtSetArg(args[1], XtNheight, (XtArgVal) mail_height);
X!  XtSetArg(args[2], XtNx, (XtArgVal) x);
X!  XtSetArg(args[3], XtNy, (XtArgVal) y);
X!  icon = XtCreateWidget("icon", applicationShellWidgetClass, toplevel, args, 4);
X   mb = XtCreateManagedWidget("mailbox", mailwatchWidgetClass, icon, NULL, 0);
X   XtAddCallback(mb, XtNcallback, SetNewmail, NULL);
X  } /* CreateSubWindows */ 
X--- 620,634 ----
X  /*
X  ** Create an icon window for the mailwatchWidget
X  */
X   XtSetArg(args[0], XtNwidth, (XtArgVal) mail_width);
X   XtSetArg(args[1], XtNheight, (XtArgVal) mail_height);
X!  n = 2;
X!  if (XMail.iconGeometry) {
X!     ParseIconGeometry(XMail.iconGeometry, &x, &y);
X!     XtSetArg(args[n], XtNx, (XtArgVal) x);		n++;
X!     XtSetArg(args[n], XtNy, (XtArgVal) y);		n++;
X!    }
X!  icon = XtCreateWidget("icon", applicationShellWidgetClass, toplevel, args, n);
X   mb = XtCreateManagedWidget("mailbox", mailwatchWidgetClass, icon, NULL, 0);
X   XtAddCallback(mb, XtNcallback, SetNewmail, NULL);
X  } /* CreateSubWindows */ 
X***************
X*** 609,625 ****
X  CreateTextWindow(parent)
X  Widget parent;
X  {
X!  Arg 	args[4];
X   Widget	tw;
X  
X  
X   XtSetArg(args[0], XtNmin, XMail.textMinHeight);
X   XtSetArg(args[1], XtNheight, XMail.textHeight);
X   XtSetArg(args[2], XtNfont, TextFontStr);
X   XtSetArg(args[3], XtNtextOptions, scrollVertical | wordBreak);
X!  tw = XtCreateManagedWidget("textWindow",asciiStringWidgetClass,parent,args,4);
X  
X   AddHelpText(tw, "text", Text_Help_Text);
X  } /* CreateTextWindow */
X  
X  
X--- 641,779 ----
X  CreateTextWindow(parent)
X  Widget parent;
X  {
X!  Arg 	args[5];
X!  int	indx;
X   Widget	tw;
X+ #ifndef SUNOS_4
X+  static String Trans = "\
X+ 	Ctrl <Key>L:		redraw-display() \n\
X+ 	Ctrl <Key>V:		next-page() \n\
X+ 	Ctrl <Key>Z:		scroll-one-line-up() \n\
X+ 	Meta <Key>V:		previous-page() \n\
X+ 	Meta <Key>Z:		scroll-one-line-down() \n\
X+ 	Meta <Key>\<:		beginning-of-file() \n\
X+ 	Meta <Key>\>:		end-of-file() \n\
X+         None <Key>Linefeed:	MenuPopdown(help) \n\
X+ 	None <Key>Return:	scroll-one-line-up() \n\
X+ 	None <Key>-:		scroll-one-line-down() \n\
X+ 	None <Key>\':		beginning-of-file() \n\
X+ 	None <Key>space:	next-page() \n\
X+ 	None <Key>a:		DoReply(a) \n\
X+ 	None <Key>b:		previous-page() \n\
X+  	None <Key>c:		DoSave(c) \n\
X+  	None <Key>d:		DoSelected(d) \n\
X+  	None <Key>f:		DoSelected(P) \n\
X+ 	None <Key>j:		scroll-one-line-up() \n\
X+ 	None <Key>k:		scroll-one-line-down() \n\
X+  	None <Key>m:		DoReply(s) \n\
X+  	None <Key>n:		DoSelected(n) \n\
X+  	None <Key>p:		DoSelected(-) \n\
X+  	None <Key>q:		Quit(q) \n\
X+  	None <Key>r:		DoSelected(p) \n\
X+  	None <Key>s:		DoSave(s) \n\
X+ 	None <Key>u:		DoSelected(u) \n\
X+  	None <Key>w:		DoSave(w) \n\
X+  	None <Key>x:		Quit(x) \n\
X+ 	     <Key>A:		DoReply(A) \n\
X+  	     <Key>C:		DoSave(C) \n\
X+ 	     <Key>F:		DoReply(S) \n\
X+ 	     <Key>G:		end-of-file() \n\
X+  	     <Key>M:		DoReply(r) \n\
X+  	     <Key>N:		DoCmd(file %) \n\
X+  	     <Key>P:		PrintMsg() \n\
X+ 	     <Key>R:		DoReply(R) \n\
X+  	     <Key>S:		DoSave(S) \n\
X+ 	<Key>?:			SetHelp(text2) \n\
X+ 	<Btn1Down>:		select-start() \n\
X+ 	<Btn1Motion>:		extend-adjust() \n\
X+ 	<Btn1Up>:		extend-end(PRIMARY, CUT_BUFFER0) \n\
X+ 	<Btn2Down>:		insert-selection(PRIMARY, CUT_BUFFER0) \n\
X+ 	<Btn3Down>:		extend-start() \n\
X+ 	<Btn3Motion>:		extend-adjust() \n\
X+ 	<Btn3Up>:		extend-end(PRIMARY, CUT_BUFFER0)";
X+ #else
X+  static String Trans = "\
X+ 	Ctrl <Key>L:		redraw-display() \n\
X+ 	Ctrl <Key>V:		next-page() \n\
X+ 	Ctrl <Key>Z:		scroll-one-line-up() \n\
X+ 	Meta <Key>V:		previous-page() \n\
X+ 	Meta <Key>Z:		scroll-one-line-down() \n\
X+ 	Meta <Key>\<:		beginning-of-file() \n\
X+ 	Meta <Key>\>:		end-of-file() \n\
X+ 	Shift <Key>A:		DoReply(A) \n\
X+  	Shift <Key>C:		DoSave(C) \n\
X+ 	Shift <Key>F:		DoReply(S) \n\
X+ 	Shift <Key>G:		end-of-file() \n\
X+  	Shift <Key>M:		DoReply(r) \n\
X+  	Shift <Key>N:		DoCmd(file %) \n\
X+  	Shift <Key>P:		PrintMsg() \n\
X+ 	Shift <Key>R:		DoReply(R) \n\
X+  	Shift <Key>S:		DoSave(S) \n\
X+         None <Key>Linefeed:	MenuPopdown(help) \n\
X+ 	None <Key>Return:	scroll-one-line-up() \n\
X+ 	None <Key>-:		scroll-one-line-down() \n\
X+ 	None <Key>\':		beginning-of-file() \n\
X+ 	None <Key>space:	next-page() \n\
X+ 	None <Key>a:		DoReply(a) \n\
X+ 	None <Key>b:		previous-page() \n\
X+  	None <Key>c:		DoSave(c) \n\
X+  	None <Key>d:		DoSelected(d) \n\
X+  	None <Key>f:		DoSelected(P) \n\
X+ 	None <Key>j:		scroll-one-line-up() \n\
X+ 	None <Key>k:		scroll-one-line-down() \n\
X+  	None <Key>m:		DoReply(s) \n\
X+  	None <Key>n:		DoSelected(n) \n\
X+  	None <Key>p:		DoSelected(-) \n\
X+  	None <Key>q:		Quit(q) \n\
X+  	None <Key>r:		DoSelected(p) \n\
X+  	None <Key>s:		DoSave(s) \n\
X+ 	None <Key>u:		DoSelected(u) \n\
X+  	None <Key>w:		DoSave(w) \n\
X+  	None <Key>x:		Quit(x) \n\
X+ 	<Key>?:			SetHelp(text2) \n\
X+ 	<Btn1Down>:		select-start() \n\
X+ 	<Btn1Motion>:		extend-adjust() \n\
X+ 	<Btn1Up>:		extend-end(PRIMARY, CUT_BUFFER0) \n\
X+ 	<Btn2Down>:		insert-selection(PRIMARY, CUT_BUFFER0) \n\
X+ 	<Btn3Down>:		extend-start() \n\
X+ 	<Btn3Motion>:		extend-adjust() \n\
X+ 	<Btn3Up>:		extend-end(PRIMARY, CUT_BUFFER0)";
X+ #endif
X  
X+ #if XtSpecificationRelease >= 4
X+  static String trans_2 = "#override \
X+ 	Ctrl <Key>R:		search(backward) \n\
X+ 	Ctrl <Key>S:		search(forward)";
X+ #endif
X  
X   XtSetArg(args[0], XtNmin, XMail.textMinHeight);
X   XtSetArg(args[1], XtNheight, XMail.textHeight);
X   XtSetArg(args[2], XtNfont, TextFontStr);
X   XtSetArg(args[3], XtNtextOptions, scrollVertical | wordBreak);
X!  XtSetArg(args[4], XtNtranslations, XtParseTranslationTable(Trans));
X!  tw = XtCreateManagedWidget("textWindow",asciiStringWidgetClass,parent,args,5);
X  
X+ #if XtSpecificationRelease >= 4
X+  XtOverrideTranslations(tw, XtParseTranslationTable(trans_2));
X+ #endif
X+ 
X+ #ifdef SUNOS_4
X+  XtOverrideTranslations(tw,
X+  XtParseTranslationTable("#override None<Key>i: DoCmd(inc)"));
X+ #endif
X+ 
X   AddHelpText(tw, "text", Text_Help_Text);
X+ 
X+  for (indx = 0; HelpNames[indx]; indx++)
X+      if (strcmp(HelpNames[indx], "text2") == 0) break;
X+ 
X+  if (HelpNames[indx]) {
X+     XtSetArg(args[0], XtNstring, (XtArgVal) Text2_Help_Text);
X+     XtSetArg(args[1], XtNlength, (XtArgVal) strlen(Text2_Help_Text));
X+     XtSetArg(args[2], XtNeditType, (XtArgVal) XttextRead);
X+ 
X+     HelpStrings[indx] = XtStringSourceCreate(WidgetOf(WidgetOf(WidgetOf(toplevel,"topBox"),"help"),"helpWindow"),args,3);
X+    }
X  } /* CreateTextWindow */
X  
X  
X***************
X*** 699,728 ****
X  {
X   Arg		args[12];
X   Cardinal 	n;
X  
X   static String trans = "#override \
X!   <Key>Delete: delete-previous-character() beginning-of-line() end-of-line()\n\
X!   <Key>BackSpace: delete-previous-character() beginning-of-line() end-of-line()\n\
X!   Ctrl<Key>H:  delete-previous-character() beginning-of-line() end-of-line()\n\
X!   Ctrl<Key>U:  beginning-of-line() kill-to-end-of-line() \n\
X!   Ctrl<Key>W:  delete-previous-word() beginning-of-line() end-of-line()\n\
X!   <Key>Return: NextField()";
X  
X   static String b_trans = "#override \
X!   <Btn3Down>:  SetAliases() MenuPopup(aliasList)\n\
X!   <Btn3Motion>: DoNothing()\n\
X!   <Btn3Up>:    DoNothing()\n\
X!   <Key>Delete: delete-previous-character() beginning-of-line() end-of-line()\n\
X!   <Key>BackSpace: delete-previous-character() beginning-of-line() end-of-line()\n\
X!   Ctrl<Key>H:  delete-previous-character() beginning-of-line() end-of-line()\n\
X!   Ctrl<Key>U:  beginning-of-line() kill-to-end-of-line() \n\
X!   Ctrl<Key>W:  delete-previous-word() beginning-of-line() end-of-line()\n\
X!   <Key>Return: NextField()";
X  
X   n  = XMail.shellWidth - 106;	/* - (scn + 2*(internal width + def.dist.)) */
X   n -= TEXTWIDTH * 9 - 6;	/* minus label text width less fudge factor */
X   XtSetArg(args[0], XtNwidth, n);
X- 
X   XtSetArg(args[1], XtNinput, True);
X   XtSetArg(args[2], XtNheight, XMail.buttonHeight);
X   XtSetArg(args[3], XtNfont, TextFontStr);
X--- 853,876 ----
X  {
X   Arg		args[12];
X   Cardinal 	n;
X+  Widget		w;
X  
X   static String trans = "#override \
X!   <Key>Delete:    delete-previous-character() SavePos() beginning-of-file() SetPos()\n\
X!   <Key>BackSpace: delete-previous-character() SavePos() beginning-of-file() SetPos()\n\
X!   Ctrl<Key>H:     delete-previous-character() SavePos() beginning-of-file() SetPos()\n\
X!   Ctrl<Key>U:     beginning-of-line() kill-to-end-of-line() \n\
X!   Ctrl<Key>W:     delete-previous-word() SavePos() beginning-of-file() SetPos()\n\
X!   <Key>Return:    NextField()";
X  
X   static String b_trans = "#override \
X!   <Btn3Down>:     SetAliases() MenuPopup(aliasList)\n\
X!   <Btn3Motion>:   DoNothing()\n\
X!   <Btn3Up>:       DoNothing()";
X  
X   n  = XMail.shellWidth - 106;	/* - (scn + 2*(internal width + def.dist.)) */
X   n -= TEXTWIDTH * 9 - 6;	/* minus label text width less fudge factor */
X   XtSetArg(args[0], XtNwidth, n);
X   XtSetArg(args[1], XtNinput, True);
X   XtSetArg(args[2], XtNheight, XMail.buttonHeight);
X   XtSetArg(args[3], XtNfont, TextFontStr);
X***************
X*** 731,742 ****
X   XtSetArg(args[6], XtNlength, len);
X   XtSetArg(args[7], XtNeditType, (XtArgVal) XttextEdit);
X   XtSetArg(args[8], XtNtextOptions, wordBreak);
X! 
X!  if (strcmp(name, "Subject") == 0) {
X!     XtSetArg(args[9], XtNtranslations, XtParseTranslationTable(trans));
X!    } else {
X!     XtSetArg(args[9], XtNtranslations, XtParseTranslationTable(b_trans));
X!    }
X   n = 10;
X  
X  #if XtSpecificationRelease >= 4
X--- 879,885 ----
X   XtSetArg(args[6], XtNlength, len);
X   XtSetArg(args[7], XtNeditType, (XtArgVal) XttextEdit);
X   XtSetArg(args[8], XtNtextOptions, wordBreak);
X!  XtSetArg(args[9], XtNtranslations, XtParseTranslationTable(trans));
X   n = 10;
X  
X  #if XtSpecificationRelease >= 4
X***************
X*** 743,747 ****
X   XtSetArg(args[n], XtNautoFill, True);					n++;
X  #endif
X  
X!  return( XtCreateManagedWidget(name,asciiStringWidgetClass,parent,args,n) );
X  } /* CreateInputWindow */
X--- 886,915 ----
X   XtSetArg(args[n], XtNautoFill, True);					n++;
X  #endif
X  
X!  w = XtCreateManagedWidget(name, asciiStringWidgetClass, parent, args, n);
X! 
X!  if (strcmp(name, "Subject") != 0)
X!     XtOverrideTranslations(w, XtParseTranslationTable(b_trans));
X! 
X!  return( w );
X  } /* CreateInputWindow */
X+ 
X+ /* 
X+ ** @(#)ParseIconGeometry() - Parse the icon geometry
X+ */
X+ void
X+ ParseIconGeometry(str, x, y)
X+ char	*str;
X+ int	*x, *y;
X+ {
X+  int		res;
X+  unsigned int	w, h;
X+ 
X+  *x = 0;
X+  *y = 0;
X+  res = XParseGeometry(str, x, y, &w, &h);
X+  if ((res & (XNegative|XValue)) == (XNegative|XValue))
X+     *x = RootWidth + *x - mail_width;
X+  if ((res & (YNegative|YValue)) == (YNegative|YValue))
X+     *y = RootHeight + *y - mail_height;
X+ } /* ParseIconGeometry */
X*** ../v1.1/xmail.c	Mon Jun  4 09:48:45 1990
X--- xmail.c	Mon Aug 27 11:09:22 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   * The following software modules were created and are Copyrighted by National
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   * The following software modules were created and are Copyrighted by National
X***************
X*** 48,57 ****
X  #include "global.h"
X  #include "Mailwatch.h"			/* use as icon and watch for newmail */
X  
X! #if XtSpecificationRelease >= 4
X! #include <X11/Xaw/CommandP.h>
X  #else
X! #include <X11/CommandP.h>
X  #endif
X  
X  #include "icon.nomail"			/* default icon pixmap source */
X--- 48,57 ----
X  #include "global.h"
X  #include "Mailwatch.h"			/* use as icon and watch for newmail */
X  
X! #if XtSpecificationRelease < 4
X! #include <X11/CommandP.h>		/* R3 */
X  #else
X! #include <X11/Xaw/CommandP.h>		/* R4 */
X  #endif
X  
X  #include "icon.nomail"			/* default icon pixmap source */
X***************
X*** 61,67 ****
X  #define Offset(field) (XtOffset(XmailResources *, field))
X  
X  static char what[] =
X!  "@(#)xmail.c 1.1 90/05/29 Copyright 1989 National Semiconductor Corp.";
X  
X  static XtResource resrcs[] = {
X      {XtNfont, XtCFont, XtRString, sizeof(char *),
X--- 61,67 ----
X  #define Offset(field) (XtOffset(XmailResources *, field))
X  
X  static char what[] =
X!  "@(#)xmail.c 1.2 90/08/14 Copyright 1989, 1990 National Semiconductor Corp.";
X  
X  static XtResource resrcs[] = {
X      {XtNfont, XtCFont, XtRString, sizeof(char *),
X***************
X*** 72,81 ****
X          Offset(iconGeometry), XtRString, (caddr_t) NULL},
X      {"MFileName", "MFileName", XtRString, sizeof(char *), 
X  	Offset(MFileName), XtRString, (caddr_t) NULL},
X-     {"iconic", "Iconic", XtRBoolean, sizeof(Boolean), 
X- 	Offset(iconic), XtRImmediate, (caddr_t) False},
X      {"bellRing", "BellRing", XtRBoolean, sizeof(Boolean), 
X  	Offset(bellRing), XtRImmediate, (caddr_t) True},
X      {"mailopt_n", "Mailopt_n", XtRBoolean, sizeof(Boolean), 
X  	Offset(mailopt_n), XtRImmediate, (caddr_t) False},
X      {"mailopt_U", "Mailopt_U", XtRBoolean, sizeof(Boolean), 
X--- 72,83 ----
X          Offset(iconGeometry), XtRString, (caddr_t) NULL},
X      {"MFileName", "MFileName", XtRString, sizeof(char *), 
X  	Offset(MFileName), XtRString, (caddr_t) NULL},
X      {"bellRing", "BellRing", XtRBoolean, sizeof(Boolean), 
X  	Offset(bellRing), XtRImmediate, (caddr_t) True},
X+     {"expert", "Expert", XtRBoolean, sizeof(Boolean), 
X+ 	Offset(expert), XtRImmediate, (caddr_t) False},
X+     {"iconic", "Iconic", XtRBoolean, sizeof(Boolean), 
X+ 	Offset(iconic), XtRImmediate, (caddr_t) False},
X      {"mailopt_n", "Mailopt_n", XtRBoolean, sizeof(Boolean), 
X  	Offset(mailopt_n), XtRImmediate, (caddr_t) False},
X      {"mailopt_U", "Mailopt_U", XtRBoolean, sizeof(Boolean), 
X***************
X*** 84,98 ****
X  	Offset(Show_Last), XtRImmediate, (caddr_t) True},
X  };
X  
X  static XrmOptionDescRec Opts[] = {
X!     {"-helpfont",	"*helpFont",	XrmoptionSepArg, (caddr_t) NULL},
X!     {"-iconGeometry",	"*iconGeometry", XrmoptionSepArg, (caddr_t) NULL},
X!     {"-iconic",		"*iconic",	XrmoptionNoArg, (caddr_t) "True"},
X!     {"-f",		"*MFileName",	XrmoptionSepArg, (caddr_t) NULL},
X!     {"-nb",		"*bellRing",	XrmoptionNoArg, (caddr_t) "False"},
X!     {"-n",		"*mailopt_n",	XrmoptionNoArg, (caddr_t) "True"},
X!     {"-U",		"*mailopt_U",	XrmoptionNoArg, (caddr_t) "True"},
X!     {"-ls",		"*Show_Last",	XrmoptionNoArg, (caddr_t) "False"},
X  };
X  
X  char	*IndexBuf;		/* buffer for index widget	*/
X--- 86,105 ----
X  	Offset(Show_Last), XtRImmediate, (caddr_t) True},
X  };
X  
X+ #undef Offset
X+ 
X  static XrmOptionDescRec Opts[] = {
X!     {"-e",		"expert",	XrmoptionNoArg, (caddr_t) "True"},
X!     {"-f",		"MFileName",	XrmoptionSepArg, (caddr_t) NULL},
X!     {"-helpfont",	"helpFont",	XrmoptionSepArg, (caddr_t) NULL},
X!     {"-iconGeometry",	"iconGeometry", XrmoptionSepArg, (caddr_t) NULL},
X!     {"-iconic",		"iconic",	XrmoptionNoArg, (caddr_t) "True"},
X!     {"-ls",		"Show_Last",	XrmoptionNoArg, (caddr_t) "False"},
X!     {"-nb",		"bellRing",	XrmoptionNoArg, (caddr_t) "False"},
X!     {"-n",		"mailopt_n",	XrmoptionNoArg, (caddr_t) "True"},
X!     {"-U",		"mailopt_U",	XrmoptionNoArg, (caddr_t) "True"},
X!     {"-u",		"icon*useName",	XrmoptionNoArg, (caddr_t) "True"},
X!     {"-rv",	"icon*reverseVideo",	XrmoptionNoArg, (caddr_t) "True"},
X  };
X  
X  char	*IndexBuf;		/* buffer for index widget	*/
X***************
X*** 105,111 ****
X  char 	BccBuf[BUFSIZ];		/* message Bcc list		*/
X  char 	tmpName[BUFSIZ];	/* message temporary filename	*/
X  char 	*MailPrompt;		/* mail program prompt string	*/
X! char	*HelpNames[24];		/* array of help window names	*/
X  char	**mailargv;		/* array passed to mail child	*/
X  
X  int	mailargc;		/* counter passed to mail child	*/
X--- 112,118 ----
X  char 	BccBuf[BUFSIZ];		/* message Bcc list		*/
X  char 	tmpName[BUFSIZ];	/* message temporary filename	*/
X  char 	*MailPrompt;		/* mail program prompt string	*/
X! char	*HelpNames[25];		/* array of help window names	*/
X  char	**mailargv;		/* array passed to mail child	*/
X  
X  int	mailargc;		/* counter passed to mail child	*/
X***************
X*** 119,125 ****
X  Widget  toplevel; 		/* top level shell widget */
X  
X  XmailResources 	XMail;		/* application resources of xmail */
X! XtTextSource	HelpStrings[23];
X  XFontStruct	*TextFontStr, *HelpFontStr;
X  
X  
X--- 126,132 ----
X  Widget  toplevel; 		/* top level shell widget */
X  
X  XmailResources 	XMail;		/* application resources of xmail */
X! XtTextSource	HelpStrings[24];
X  XFontStruct	*TextFontStr, *HelpFontStr;
X  
X  
X***************
X*** 173,181 ****
X   HelpNames[i++] = "read";	HelpNames[i++] = "reply";
X   HelpNames[i++] = "save";	HelpNames[i++] = "Send";
X   HelpNames[i++] = "status";	HelpNames[i++] = "Subject";
X!  HelpNames[i++] = "text";	HelpNames[i++] = "title";
X!  HelpNames[i++] = "To";		HelpNames[i++] = "Autograph";
X!  HelpNames[i]   = NULL;
X  
X   strcpy(Command, "Start");		/* let parser know we've started */
X   Recipient[0] = SubjBuf[0] = CcBuf[0] = BccBuf[0] = '\0';
X--- 180,188 ----
X   HelpNames[i++] = "read";	HelpNames[i++] = "reply";
X   HelpNames[i++] = "save";	HelpNames[i++] = "Send";
X   HelpNames[i++] = "status";	HelpNames[i++] = "Subject";
X!  HelpNames[i++] = "text";	HelpNames[i++] = "text2";
X!  HelpNames[i++] = "title";	HelpNames[i++] = "To";
X!  HelpNames[i++] = "Autograph";	HelpNames[i]   = NULL;
X  
X   strcpy(Command, "Start");		/* let parser know we've started */
X   Recipient[0] = SubjBuf[0] = CcBuf[0] = BccBuf[0] = '\0';
X***************
X*** 232,238 ****
X   XMail.buttonHeight	= TEXTHEIGHT + (TextFontStr->ascent / 2);
X   XMail.buttonWidth	= XTextWidth(TextFontStr, " Newmail ", 9);
X         buttonSpace      = XMail.buttonWidth + XMail.commandHSpace + 2;
X!  XMail.shellWidth       = (8 * buttonSpace) + 24;    /*  8 buttons per row */
X   XMail.fileBoxWidth     = (4 * buttonSpace) + XMail.buttonWidth + 2;
X   XMail.helpHeight       = HELPHEIGHT * 14;           /* 14 lines by 60 chars */
X   XMail.helpWidth        = XTextWidth(HelpFontStr, "X11Windows", 10) * 6;
X--- 239,245 ----
X   XMail.buttonHeight	= TEXTHEIGHT + (TextFontStr->ascent / 2);
X   XMail.buttonWidth	= XTextWidth(TextFontStr, " Newmail ", 9);
X         buttonSpace      = XMail.buttonWidth + XMail.commandHSpace + 2;
X!  XMail.shellWidth       = (8 * buttonSpace) + 26;    /*  8 buttons per row */
X   XMail.fileBoxWidth     = (4 * buttonSpace) + XMail.buttonWidth + 2;
X   XMail.helpHeight       = HELPHEIGHT * 14;           /* 14 lines by 60 chars */
X   XMail.helpWidth        = XTextWidth(HelpFontStr, "X11Windows", 10) * 6;
X***************
X*** 258,264 ****
X   Display	*dpy;
X   XSizeHints	size_hints;
X   XWMHints	wm_hints;
X!  int		scn, depth, x, y, width, height;
X   CommandWidget  nm = (CommandWidget)WidgetOf(WidgetOf(WidgetOf(toplevel, "topBox"), "commandPanel"), "Newmail");
X  
X  
X--- 265,271 ----
X   Display	*dpy;
X   XSizeHints	size_hints;
X   XWMHints	wm_hints;
X!  int		scn, depth, x, y;
X   CommandWidget  nm = (CommandWidget)WidgetOf(WidgetOf(WidgetOf(toplevel, "topBox"), "commandPanel"), "Newmail");
X  
X  
X***************
X*** 276,301 ****
X  /*
X  ** Notify the window manager about our icon window
X  */
X!  wm_hints.input = True;
X  
X!  wm_hints.initial_state = (XMail.iconic) ? IconicState : NormalState;
X  
X-  x = RootWidth - 58;			/* provide some reasonable defaults */
X-  y = 83;				/* slightly down the right side top */
X-  if (XMail.iconGeometry)
X-     XParseGeometry(XMail.iconGeometry, &x, &y, &width, &height);
X- 
X-  wm_hints.icon_x = x;
X-  wm_hints.icon_y = y;
X- 
X-  wm_hints.flags  = InputHint | StateHint | IconPositionHint;
X- 
X  #ifndef PIXMAP_ICON
X!  wm_hints.flags |= IconWindowHint;
X!  wm_hints.icon_window = XtWindow(XtNameToWidget(toplevel, "icon"));
X  #else
X!  wm_hints.flags |= IconPixmapHint;
X!  wm_hints.icon_pixmap = XCreateBitmapFromData(dpy, XtScreen(toplevel)->root,
X                                   no_mail_bits, no_mail_width, no_mail_height);
X  #endif
X  
X--- 283,305 ----
X  /*
X  ** Notify the window manager about our icon window
X  */
X!  wm_hints.input		= True;
X!  wm_hints.initial_state	= (XMail.iconic) ? IconicState : NormalState;
X!  wm_hints.flags		= InputHint | StateHint;
X  
X!  if (XMail.iconGeometry) {
X!     ParseIconGeometry(XMail.iconGeometry, &x, &y);
X!     wm_hints.icon_x	= x;
X!     wm_hints.icon_y	= y;
X!     wm_hints.flags	|= IconPositionHint;
X!    }
X  
X  #ifndef PIXMAP_ICON
X!  wm_hints.flags		|= IconWindowHint;
X!  wm_hints.icon_window	= XtWindow(XtNameToWidget(toplevel, "icon"));
X  #else
X!  wm_hints.flags		|= IconPixmapHint;
X!  wm_hints.icon_pixmap	= XCreateBitmapFromData(dpy, XtScreen(toplevel)->root,
X                                   no_mail_bits, no_mail_width, no_mail_height);
X  #endif
X  
X***************
X*** 350,355 ****
X--- 354,361 ----
X   SetHints();
X  
X   callMail(mailargc, mailargv);
X+ 
X+  XSync(XtDisplay(toplevel), False);
X  
X   XtMainLoop();
X  } /* main */
X*** ../v1.1/xmail.man	Mon Jun  4 09:48:46 1990
X--- xmail.man	Mon Aug 27 11:09:22 1990
X***************
X*** 1,5 ****
X  .\"
X! .\" @(#)xmail.l 1.1 90/05/29 NSC;
X  .\"
X  .\" Copyright 1990 by National Semiconductor Corporation.
X  .\"
X--- 1,5 ----
X  .\"
X! .\" @(#)xmail.l 1.2 90/09/14 NSC;
X  .\"
X  .\" Copyright 1990 by National Semiconductor Corporation.
X  .\"
X***************
X*** 30,36 ****
X  .if t .ds Q ``
X  .if t .ds U ''
X  .\"
X! .TH XMAIL 1 "May 29, 1990" "NSC"
X  .SH NAME
X  xmail \- X11 visual interface to the mail program
X  .SH SYNOPSIS
X--- 30,36 ----
X  .if t .ds Q ``
X  .if t .ds U ''
X  .\"
X! .TH XMAIL 1 "August 14, 19
X***************
X*** 345,350 ****
X--- 369,384 ----
X  and send/reply) to orient to that same starting location, rather than be
X  anchored to the intended window.
X  .TP 3
X+ \fB*expert: \fI<boolean>\fR
X+ This boolean defines whether the \*(xM user requires confirmation of
X+ folder commits or composed message deletions.  Whenever an action
X+ would make a permanent un-recoverable change to the \*(xM environment, a
X+ popup confirmation window will be presented for the user, to assure that
X+ the action should take place.  These confirmations include changing a
X+ folder when deletions have occurred, or deleting the text of a newly
X+ composed message instead of sending it.  Setting this resource to True
X+ eliminates those confirmation popups.
X+ .TP 3
X  \fB*iconic: \fI<boolean>\fR
X  This boolean defines whether the \*(xM application should be started in
X  iconic state or not.  It is highly recommended that only the application
X***************
X*** 353,359 ****
X  message entry windows to be started iconic, which could prove confusing
X  to the unaware user.
X  .TP 3
X! \fB*iconGeometry: \fI+XOff+YOff\fR
X  This resource defines an initial location for the icon, whenever the
X  \*(xM application is iconified.
X  .TP 3
X--- 387,393 ----
X  message entry windows to be started iconic, which could prove confusing
X  to the unaware user.
X  .TP 3
X! \fB*iconGeometry: \fI[+-]XOff[+-]YOff\fR
X  This resource defines an initial location for the icon, whenever the
X  \*(xM application is iconified.
X  .TP 3
X***************
X*** 383,392 ****
X  .TP 3
X  \fB*icon\fR
X  controls resources for the \fIicon\fR window.  In addition to 
X! specifications of foreground and background colors, it is possible
X! to also specify mailWatch widget resources, such as the following:
X  .RS
X  .TP 3
X  \fB*icon*reverseVideo: \fI<boolean>\fR
X  If set to true, reverses the foreground and background colors for the icon.
X  .TP 3
X--- 417,430 ----
X  .TP 3
X  \fB*icon\fR
X  controls resources for the \fIicon\fR window.  In addition to 
X! specifications of foreground and background colors, it is also possible
X! to specify the following mailWatch widget resources :
X  .RS
X  .TP 3
X+ \fB*icon*useName: \fI<Boolean>\fR
X+ If set to true, tells \*(xM to include the user login name in the icon window
X+ when displaying the icon.
X+ .TP 3
X  \fB*icon*reverseVideo: \fI<boolean>\fR
X  If set to true, reverses the foreground and background colors for the icon.
X  .TP 3
X***************
X*** 442,447 ****
X--- 480,556 ----
X  file \fB/usr/lib/X11/app-defaults/XMail\fR.  User's may wish to include
X  appropriate alternate definitions in their ~/.Xdefaults file, to tailor
X  preferences for colors and/or fonts.
X+ .SH "KEYBOARD ACCELERATORS"
X+ The index and text windows support two methods of scrolling displayable
X+ text.  The use of the mouse buttons in the scrollbar region is standard.
X+ In addition, keyboard keys have been defined in keeping with conventions
X+ used in text display programs such as \*Qmore\*U and \*Qless\*U.
X+ 
X+ The following table lists the key definitions and their respective actions.
X+ The abbreviation \*QCtrl\*U means to press down and hold the \fBControl\fR
X+ key while pressing the specified letter key.  \*QMeta\*U likewise refers
X+ to the \fBmeta\fR keys (\fIlabeled \*QLeft\*U and \*QRight\*U on some
X+ Sun keyboards\fR).
X+ .sp
X+ .RS
X+ .nf
X+ Key Name 		Action Taken
X+ --------		-----------------------------
X+  Ctrl V 		move to the next page
X+  space  		move to the next page
X+  Meta V 		move to the previous page
X+    b    		move to the previous page
X+  Ctrl Z 		scroll one line up
X+  Return 		scroll one line up
X+    j    		scroll one line up
X+  Meta Z 		scroll one line down
X+    k    		scroll one line down
X+    -    		scroll one line down
X+    \'    		move to the beginning of file
X+  Meta < 		move to the beginning of file
X+  Meta > 		move to the end of file
X+ Shift G 		move to the end of file
X+ .fi
X+ .RE
X+ .sp
X+ .LP
X+ In addition to the scroll key definitions, the \fItext\fR window also supports
X+ keyboard accelerators for most of the command buttons.  Where possible,
X+ these keyboard keys replicate the actual commands that would be typed
X+ if the user were running the native mail program.  Thus, to begin
X+ sending a mail message to some recipient, the user could press the \*Qm\*U key,
X+ and to delete a current message, the user could press the \*Qd\*U key.
X+ .sp
X+ .RS
X+ .nf
X+ Key Name 		Command Action Taken
X+ --------		-----------------------------
X+ Shift A 		reply to all, include the current message
X+ Shift C 		copy the message to the author's name
X+ Shift F 		forward the current mail message
X+ Shift M 		reply to a mail message
X+ Shift N 		bring new mail into your system folder
X+ Shift P 		send the current message to the printer
X+ Shift R 		include the current message in a reply
X+ Shift S 		save the message to the author's name
X+    a    		reply to all recipients of a message
X+    c    		copy the message to the indicated folder
X+    d    		delete the current message
X+    f    		read the full header of the message
X+    i    		incorporate new mail without commit
X+    m    		mail (compose) a new mail message
X+    n    		read the next mail message
X+    p    		read the previous mail message
X+    q    		quit xmail, committing any changes
X+    r    		read the current mail message
X+    s    		save current message in specified folder
X+    u    		undelete the most recently deleted message
X+    w    		writes the message to the indicated file
X+    x    		exit xmail, without committing changes
X+    ?    		displays help for these key definitions
X+  <LF>   		removes help for these key definitions
X+ .fi
X+ .RE
X  .SH "ENVIRONMENT"
X  Several process environment variables are of potential interest to \*(xM.
X  .sp
X***************
X*** 482,488 ****
X  path of the process (assumed to be at least \*Q/bin /usr/bin /usr/ucb\*U).
X  If need be, the XMAILER
X  environment variable can be used to provide a specific path to the Mail
X! program.  Note: \*(xM will not work correctly with any mail program
END_OF_FILE
if test 52848 -ne `wc -c <'Patch.02d'`; then
    echo shar: \"'Patch.02d'\" unpacked with wrong size!
fi
# end of 'Patch.02d'
fi
echo shar: End of archive 4 \(of 5\).
cp /dev/null ark4isdone
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.

michael@parns.nsc.com (Michael Wagnitz) (08/31/90)

Submitted-by: michael@parns.nsc.com (Michael Wagnitz)
Posting-number: Volume 8, Issue 99
Archive-name: xmail/patch2.04

Let's try this again...

#! /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 4 (of 5)."
# Contents:  Patch.02d
# Wrapped by michael@harley on Mon Aug 27 12:47:27 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'Patch.02d' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Patch.02d'\"
else
echo shar: Extracting \"'Patch.02d'\" \(52848 characters\)
sed "s/^X//" >'Patch.02d' <<'END_OF_FILE'
X!                                             markIndex(" ");
X                                             }
X                                          }
X  		                      break;
X--- 246,252 ----
X                                              sprintf(tmp, "%d", msgnum);
X                                              XtFree(msg);
X                                              msg = QueryMail(tmp);
X!                                             markIndex("> ");
X                                             }
X                                          }
X  		                      break;
X***************
X*** 256,268 ****
X                            markIndex("D");
X  		          num = msgnum;
X  		          msgnum = index_handler(++msgnum, 0); /* next msg */
X!                           if (msgnum != num) markIndex(" ");
X                           }
X                         if (*Command == 'u') {
X  		          c = QueryMail("=");
X  		          sscanf(c, "%d", &msgnum);
X  		          XtFree(c);
X!                           iw = WidgetOf(WidgetOf(toplevel, "topBox"),"indexWindow");
X                            if (TextGetLastPos(iw) < (XtTextPosition) 4) {
X                               c = QueryMail("h");
X                               writeText(iw, c, FALSE);
X--- 269,282 ----
X                            markIndex("D");
X  		          num = msgnum;
X  		          msgnum = index_handler(++msgnum, 0); /* next msg */
X!                           if (msgnum != num)
X!                              markIndex("> ");
X                           }
X                         if (*Command == 'u') {
X  		          c = QueryMail("=");
X  		          sscanf(c, "%d", &msgnum);
X  		          XtFree(c);
X!                           iw = WidgetOf(WidgetOf(toplevel, "topBox"), "indexWindow");
X                            if (TextGetLastPos(iw) < (XtTextPosition) 4) {
X                               c = QueryMail("h");
X                               writeText(iw, c, FALSE);
X***************
X*** 269,275 ****
X  		             XtFree(c);
X                              }
X  		          msgnum = index_handler(msgnum, 1);
X!                           markIndex(" ");
X                           }
X                         c = QueryMail("file");	/* resets current msg to 1 */
X                         (void) UpdateTitleBar(c);
X--- 283,289 ----
X  		             XtFree(c);
X                              }
X  		          msgnum = index_handler(msgnum, 1);
X!                           markIndex("> ");
X                           }
X                         c = QueryMail("file");	/* resets current msg to 1 */
X                         (void) UpdateTitleBar(c);
X***************
X*** 281,295 ****
X  /*
X  ** In response to a request to view new mail, first reset the mailbox flag.
X  ** If mail came back with an error, complain to the user.  Otherwise, clear
X! ** the Newmail command button highlighting, and (if it exists) destroy the
X! ** current folder popup list.  Then display any new mail text.
X  */
X      case C_NEWMAIL:
X  		    button = WidgetOf(WidgetOf(WidgetOf(toplevel, "topBox"),
X                                                       "commandPanel"), "Folder");
X  		    UnsetNewmail(button, NULL, NULL);
X- 		    if (popup = WidgetOf(button, "popupList"))
X- 		       XtDestroyWidget(popup);
X                      if (O_BELL == match(output_pattern, msg)) {
X                         if (strncmp(msg, "No mail for ", 12) == 0) {
X                            Bell("No mail in system mailbox\n");
X--- 295,306 ----
X  /*
X  ** In response to a request to view new mail, first reset the mailbox flag.
X  ** If mail came back with an error, complain to the user.  Otherwise, clear
X! ** the Newmail command button highlighting. Then display any new mail text.
X  */
X      case C_NEWMAIL:
X  		    button = WidgetOf(WidgetOf(WidgetOf(toplevel, "topBox"),
X                                                       "commandPanel"), "Folder");
X  		    UnsetNewmail(button, NULL, NULL);
X                      if (O_BELL == match(output_pattern, msg)) {
X                         if (strncmp(msg, "No mail for ", 12) == 0) {
X                            Bell("No mail in system mailbox\n");
X***************
X*** 316,322 ****
X                               sprintf(tmp, "%d", msgnum);
X                               XtFree(msg);
X                               msg = QueryMail(tmp);
X!                              markIndex(" ");	/* 'cause we just read it */
X                              }
X                           }
X                        }
X--- 327,333 ----
X                               sprintf(tmp, "%d", msgnum);
X                               XtFree(msg);
X                               msg = QueryMail(tmp);
X!                              markIndex("> ");	/* 'cause we just read it */
X                              }
X                           }
X                        }
X***************
X*** 419,424 ****
X--- 430,446 ----
X          if (strcmp(&output[j], MailPrompt) == 0) {
X             output[j] = '\0';		/* Drop prompt from end of text */
X             break;			/* and return from read routine */
X+           }
X+ 
X+         if (!strcmp(Command,"Start")) {	/* see if somehow missed the prompt */
X+            j = strlen(output) - 3;	/* no accidents allowed here either */
X+            if (j < 0) j = 0;		/* no string references before zero */
X+            if (strcmp(&output[j], "\n& ") == 0) { /* if default mail prompt */
X+               output[++j] = '\0';	/* drop prompt from end of string */
X+               XtFree(MailPrompt);	/* intended prompt is now bogus */
X+               MailPrompt = XtNewString("& ");	/* reset the mail prompt */
X+               break;			/* and return from read routine */
X+              }
X            }
X  
X          if (O_BELL == match(output_pattern,output) && !strcmp(Command,"Start"))
X*** ../v1.1/utils.c	Mon Jun  4 09:48:42 1990
X--- utils.c	Mon Aug 27 11:09:22 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   * The following software modules were created and are Copyrighted by National
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   * The following software modules were created and are Copyrighted by National
X***************
X*** 72,95 ****
X  char	*s;
X  {
X   XtTextBlock 	textblock;
X!  XtTextPosition	pos;
X   Widget		w = WidgetOf(WidgetOf(toplevel, "topBox"), "indexWindow");
X  
X  
X!  pos = XtTextGetInsertionPoint(w) + 1;
X  
X!  XtTextSetInsertionPoint(w, pos);
X  
X   textblock.firstPos = 0;
X!  textblock.length   = 1;
X   textblock.ptr      = s;
X   textblock.format   = FMT8BIT;
X  
X!  XtTextReplace(w, pos, pos + 1, &textblock);
X  
X   XtTextSetInsertionPoint(w, pos);
X- 
X-  SetSelect(w, NULL, NULL, NULL);
X  } /* markIndex */
X  
X  
X--- 72,110 ----
X  char	*s;
X  {
X   XtTextBlock 	textblock;
X!  XtTextPosition	pos, old;
X   Widget		w = WidgetOf(WidgetOf(toplevel, "topBox"), "indexWindow");
X+  char		*p;
X+  int		size = strlen(s);
X  
X  
X!  pos = XtTextGetInsertionPoint(w);
X  
X!  if (*s == '>')			/* first, remove any existing pointer */
X!     if (p = index(IndexBuf, '>')) {
X!        old = p - IndexBuf;
X!        XtTextSetInsertionPoint(w, old);
X!        textblock.firstPos = 0;
X!        textblock.length   = 1;
X!        textblock.ptr      = " ";
X!        textblock.format   = FMT8BIT;
X!        XtTextReplace(w, old, old + 1, &textblock);
X!       }
X  
X+  for (p = IndexBuf + pos; p > IndexBuf && *(p - 1) != '\n'; p--);
X+ 
X+  pos = (p - IndexBuf);
X+ 
X+  XtTextSetInsertionPoint(w, (*s == '>') ? pos : ++pos);
X+ 
X   textblock.firstPos = 0;
X!  textblock.length   = size;
X   textblock.ptr      = s;
X   textblock.format   = FMT8BIT;
X  
X!  XtTextReplace(w, pos, pos + size, &textblock);
X  
X   XtTextSetInsertionPoint(w, pos);
X  } /* markIndex */
X  
X  
X***************
X*** 186,192 ****
X  String	msg;
X  {
X   Arg	args[1];
X!  char	*p, *index();
X   char	buf[BUFSIZ];
X   int	worthy = 0;			/* only msgs with ending newline are */
X  
X--- 201,207 ----
X  String	msg;
X  {
X   Arg	args[1];
X!  char	*p;
X   char	buf[BUFSIZ];
X   int	worthy = 0;			/* only msgs with ending newline are */
X  
X*** ../v1.1/windows.c	Mon Jun  4 09:48:44 1990
X--- windows.c	Mon Aug 27 11:09:22 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   * The following software modules were created and are Copyrighted by National
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   * The following software modules were created and are Copyrighted by National
X***************
X*** 50,56 ****
X  
X  
X  #include "global.h"
X! #include "Mailwatch.h"
X  #include "patchlevel.h"
X  #include "icon.mail"
X  #include "national.bm"
X--- 50,56 ----
X  
X  
X  #include "global.h"
X! #include "MailwatchP.h"
X  #include "patchlevel.h"
X  #include "icon.mail"
X  #include "national.bm"
X***************
X*** 164,170 ****
X      XtSetArg(args[3], XtNtranslations, XtParseTranslationTable(b_Trans));
X      for (indx = 0; list[indx] != NULL; indx++) {
X          strcpy(tag, list[indx]->label);		/* set window name by label */
X!         if ((c = (char *)index(tag, ' '))) *c = '\0';	/* first word only */
X          sprintf(trans, "%-*.*s", j, j, list[indx]->label);
X          if (Labels[indx])			/* add accel. note if needed */
X             strcat(trans, Labels[indx]);
X--- 164,170 ----
X      XtSetArg(args[3], XtNtranslations, XtParseTranslationTable(b_Trans));
X      for (indx = 0; list[indx] != NULL; indx++) {
X          strcpy(tag, list[indx]->label);		/* set window name by label */
X!         if ((c = index(tag, ' '))) *c = '\0';	/* first word only */
X          sprintf(trans, "%-*.*s", j, j, list[indx]->label);
X          if (Labels[indx])			/* add accel. note if needed */
X             strcat(trans, Labels[indx]);
X***************
X*** 284,292 ****
X   b1.label = "Newmail"; b1.func = (XtCallbackProc) DoIt; b1.data = "file %";
X  #ifdef SUNOS_4
X   b2.label = "inc (no commit)"; b2.func = (XtCallbackProc) DoIt; b2.data = "inc";
X!  list[0] = &b1; list[1] = &b2; list[2] = NULL;
X  #else
X!  list[0] = &b1; list[1] = NULL;
X  #endif
X   AddButton(parent, "Newmail", "DoCmd", "file %", list, NewMail_Help_Text);
X  
X--- 284,294 ----
X   b1.label = "Newmail"; b1.func = (XtCallbackProc) DoIt; b1.data = "file %";
X  #ifdef SUNOS_4
X   b2.label = "inc (no commit)"; b2.func = (XtCallbackProc) DoIt; b2.data = "inc";
X!  b3.label = "Drop Folders"; b3.func = (XtCallbackProc) DropIt; b3.data = "drop";
X!  list[0] = &b1; list[1] = &b2; list[2] = &b3; list[3] = NULL;
X  #else
X!  b2.label = "Drop Folders"; b2.func = (XtCallbackProc) DropIt; b2.data = "drop";
X!  list[0] = &b1; list[1] = &b2; list[2] = NULL;
X  #endif
X   AddButton(parent, "Newmail", "DoCmd", "file %", list, NewMail_Help_Text);
X  
X***************
X*** 388,395 ****
X    <Key>BackSpace:	DeleteChar()\n\
X    <Key>Linefeed:	DoNothing()\n\
X    <Key>Return:		DoNothing()\n\
X!   <Key>:		CheckInsert() insert-char()";
X  
X   XtSetArg(args[0], XtNwidth, XMail.fileBoxWidth);
X   XtSetArg(args[1], XtNfont, TextFontStr);
X   XtSetArg(args[2], XtNborderWidth, 0);
X--- 390,400 ----
X    <Key>BackSpace:	DeleteChar()\n\
X    <Key>Linefeed:	DoNothing()\n\
X    <Key>Return:		DoNothing()\n\
X!   <Key>:		CheckInsert() insert-char()\n\
X!   <Btn1Down>:           select-start()\n\
X!   <Btn2Down>:           CheckInsert() insert-selection(PRIMARY, CUT_BUFFER0)";
X  
X+ 
X   XtSetArg(args[0], XtNwidth, XMail.fileBoxWidth);
X   XtSetArg(args[1], XtNfont, TextFontStr);
X   XtSetArg(args[2], XtNborderWidth, 0);
X***************
X*** 449,454 ****
X--- 454,461 ----
X   Arg	args[6];
X   Widget	w;
X  
X+  static String Trans = "#override\n\
X+ 			:<Key>Linefeed:	MenuPopdown(help)";
X  
X   XtSetArg(args[0], XtNborderWidth, 3);
X   w = XtCreatePopupShell("help", overrideShellWidgetClass, parent, args, 1);
X***************
X*** 458,464 ****
X   XtSetArg(args[2], XtNfont, HelpFontStr);
X   XtSetArg(args[3], XtNeditType, (XtArgVal) XttextRead);
X   XtSetArg(args[4], XtNtextOptions, wordBreak);
X!  XtCreateManagedWidget("helpWindow", asciiStringWidgetClass, w, args, 5);
X  } /* CreateHelpWindow */
X  
X  
X--- 465,472 ----
X   XtSetArg(args[2], XtNfont, HelpFontStr);
X   XtSetArg(args[3], XtNeditType, (XtArgVal) XttextRead);
X   XtSetArg(args[4], XtNtextOptions, wordBreak);
X!  XtSetArg(args[5], XtNtranslations, XtParseTranslationTable(Trans));
X!  XtCreateManagedWidget("helpWindow", asciiStringWidgetClass, w, args, 6);
X  } /* CreateHelpWindow */
X  
X  
X***************
X*** 470,482 ****
X  Widget parent;
X  {
X   Arg	args[8];
X   Widget	w;
X  
X!  static String translations =
X! 	"<Key>:		DoNothing() \n\
X! 	<Btn1Down>:	select-start() SetSelect() \n\
X! 	<Btn3Down>:	select-start() SetSelect() \n\
X! 	<Btn3Up>:	DoSelected(p)";
X  
X   XtSetArg(args[0], XtNheight, XMail.indexHeight);
X   XtSetArg(args[1], XtNfont, TextFontStr);
X--- 478,508 ----
X  Widget parent;
X  {
X   Arg	args[8];
X+  int	n;
X   Widget	w;
X  
X!  static String translations = "\
X! 	Ctrl<Key>L:		redraw-display() \n\
X! 	Ctrl<Key>V:		next-page() \n\
X! 	Ctrl<Key>Z:		scroll-one-line-up() \n\
X! 	Meta<Key>V:		previous-page() \n\
X! 	Meta<Key>Z:		scroll-one-line-down() \n\
X! 	Meta<Key>\<:		beginning-of-file() \n\
X! 	Meta<Key>\>:		end-of-file() \n\
X! 	None <Key>Return:	scroll-one-line-up() \n\
X! 	None <Key>space:	next-page() \n\
X! 	None <Key>G:		end-of-file() \n\
X! 	None <Key>b:		previous-page() \n\
X! 	None <Key>j:		scroll-one-line-up() \n\
X! 	None <Key>k:		scroll-one-line-down() \n\
X! 	None <Key>-:		scroll-one-line-down() \n\
X! 	None <Key>p:		beginning-of-file() \n\
X! 	None <Key>\':		beginning-of-file() \n\
X! 	<Btn1Down>:		select-start() SetSelect() \n\
X! 	<Btn1Motion>:		extend-adjust() \n\
X! 	<Btn1Up>:		extend-end(PRIMARY, CUT_BUFFER0) \n\
X! 	<Btn3Down>:		select-start() SetSelect() \n\
X! 	<Btn3Up>:		DoSelected(p)";
X  
X   XtSetArg(args[0], XtNheight, XMail.indexHeight);
X   XtSetArg(args[1], XtNfont, TextFontStr);
X***************
X*** 485,492 ****
X   XtSetArg(args[4], XtNeditType, (XtArgVal) XttextEdit);
X   XtSetArg(args[5], XtNtextOptions, scrollVertical | wordBreak);
X   XtSetArg(args[6], XtNtranslations, XtParseTranslationTable(translations));
X  
X!  w = XtCreateManagedWidget("indexWindow",asciiStringWidgetClass,parent,args,7);
X  
X   AddHelpText(w, "index", Index_Help_Text);
X  } /* CreateIndexWindow */
X--- 511,522 ----
X   XtSetArg(args[4], XtNeditType, (XtArgVal) XttextEdit);
X   XtSetArg(args[5], XtNtextOptions, scrollVertical | wordBreak);
X   XtSetArg(args[6], XtNtranslations, XtParseTranslationTable(translations));
X+  n = 7;
X+ #if XtSpecificationRelease >= 4
X+  XtSetArg(args[n], XtNdisplayCaret, (XtArgVal) False);		n++;
X+ #endif
X  
X!  w = XtCreateManagedWidget("indexWindow",asciiStringWidgetClass,parent,args,n);
X  
X   AddHelpText(w, "index", Index_Help_Text);
X  } /* CreateIndexWindow */
X***************
X*** 537,543 ****
X  {
X   Arg		args[4];
X   Widget		icon, mb, topbox;
X!  int		x, y, width, height;
X  /*
X  ** Special added actions
X  */
X--- 567,573 ----
X  {
X   Arg		args[4];
X   Widget		icon, mb, topbox;
X!  int		n, x, y;
X  /*
X  ** Special added actions
X  */
X***************
X*** 554,559 ****
X--- 584,590 ----
X  	{"SetMenu",		(XtActionProc) SetMenu},
X  	{"DoNothing",		(XtActionProc) DoNothing},
X  	{"DoSelected",		(XtActionProc) DoSelected},
X+ 	{"SavePos",		(XtActionProc) SavePos},
X  	{"SetAliases",		(XtActionProc) SetAliases},
X  	{"SetCursor",		(XtActionProc) SetCursor},
X  	{"SetDirectory",	(XtActionProc) SetDirectory},
X***************
X*** 566,571 ****
X--- 597,603 ----
X  	{"MyNotify",		(XtActionProc) MyNotify},
X  	{"NextField",		(XtActionProc) NextField},
X  	{"PrintMsg",		(XtActionProc) PrintMsg},
X+ 	{"SetPos",		(XtActionProc) SetPos},
X  	{"Quit",		(XtActionProc) Quit},
X          {NULL, NULL}
X        };
X***************
X*** 588,602 ****
X  /*
X  ** Create an icon window for the mailwatchWidget
X  */
X-  x = y = 0;
X-  if (XMail.iconGeometry)
X-     XParseGeometry(XMail.iconGeometry, &x, &y, &width, &height);
X- 
X   XtSetArg(args[0], XtNwidth, (XtArgVal) mail_width);
X   XtSetArg(args[1], XtNheight, (XtArgVal) mail_height);
X!  XtSetArg(args[2], XtNx, (XtArgVal) x);
X!  XtSetArg(args[3], XtNy, (XtArgVal) y);
X!  icon = XtCreateWidget("icon", applicationShellWidgetClass, toplevel, args, 4);
X   mb = XtCreateManagedWidget("mailbox", mailwatchWidgetClass, icon, NULL, 0);
X   XtAddCallback(mb, XtNcallback, SetNewmail, NULL);
X  } /* CreateSubWindows */ 
X--- 620,634 ----
X  /*
X  ** Create an icon window for the mailwatchWidget
X  */
X   XtSetArg(args[0], XtNwidth, (XtArgVal) mail_width);
X   XtSetArg(args[1], XtNheight, (XtArgVal) mail_height);
X!  n = 2;
X!  if (XMail.iconGeometry) {
X!     ParseIconGeometry(XMail.iconGeometry, &x, &y);
X!     XtSetArg(args[n], XtNx, (XtArgVal) x);		n++;
X!     XtSetArg(args[n], XtNy, (XtArgVal) y);		n++;
X!    }
X!  icon = XtCreateWidget("icon", applicationShellWidgetClass, toplevel, args, n);
X   mb = XtCreateManagedWidget("mailbox", mailwatchWidgetClass, icon, NULL, 0);
X   XtAddCallback(mb, XtNcallback, SetNewmail, NULL);
X  } /* CreateSubWindows */ 
X***************
X*** 609,625 ****
X  CreateTextWindow(parent)
X  Widget parent;
X  {
X!  Arg 	args[4];
X   Widget	tw;
X  
X  
X   XtSetArg(args[0], XtNmin, XMail.textMinHeight);
X   XtSetArg(args[1], XtNheight, XMail.textHeight);
X   XtSetArg(args[2], XtNfont, TextFontStr);
X   XtSetArg(args[3], XtNtextOptions, scrollVertical | wordBreak);
X!  tw = XtCreateManagedWidget("textWindow",asciiStringWidgetClass,parent,args,4);
X  
X   AddHelpText(tw, "text", Text_Help_Text);
X  } /* CreateTextWindow */
X  
X  
X--- 641,779 ----
X  CreateTextWindow(parent)
X  Widget parent;
X  {
X!  Arg 	args[5];
X!  int	indx;
X   Widget	tw;
X+ #ifndef SUNOS_4
X+  static String Trans = "\
X+ 	Ctrl <Key>L:		redraw-display() \n\
X+ 	Ctrl <Key>V:		next-page() \n\
X+ 	Ctrl <Key>Z:		scroll-one-line-up() \n\
X+ 	Meta <Key>V:		previous-page() \n\
X+ 	Meta <Key>Z:		scroll-one-line-down() \n\
X+ 	Meta <Key>\<:		beginning-of-file() \n\
X+ 	Meta <Key>\>:		end-of-file() \n\
X+         None <Key>Linefeed:	MenuPopdown(help) \n\
X+ 	None <Key>Return:	scroll-one-line-up() \n\
X+ 	None <Key>-:		scroll-one-line-down() \n\
X+ 	None <Key>\':		beginning-of-file() \n\
X+ 	None <Key>space:	next-page() \n\
X+ 	None <Key>a:		DoReply(a) \n\
X+ 	None <Key>b:		previous-page() \n\
X+  	None <Key>c:		DoSave(c) \n\
X+  	None <Key>d:		DoSelected(d) \n\
X+  	None <Key>f:		DoSelected(P) \n\
X+ 	None <Key>j:		scroll-one-line-up() \n\
X+ 	None <Key>k:		scroll-one-line-down() \n\
X+  	None <Key>m:		DoReply(s) \n\
X+  	None <Key>n:		DoSelected(n) \n\
X+  	None <Key>p:		DoSelected(-) \n\
X+  	None <Key>q:		Quit(q) \n\
X+  	None <Key>r:		DoSelected(p) \n\
X+  	None <Key>s:		DoSave(s) \n\
X+ 	None <Key>u:		DoSelected(u) \n\
X+  	None <Key>w:		DoSave(w) \n\
X+  	None <Key>x:		Quit(x) \n\
X+ 	     <Key>A:		DoReply(A) \n\
X+  	     <Key>C:		DoSave(C) \n\
X+ 	     <Key>F:		DoReply(S) \n\
X+ 	     <Key>G:		end-of-file() \n\
X+  	     <Key>M:		DoReply(r) \n\
X+  	     <Key>N:		DoCmd(file %) \n\
X+  	     <Key>P:		PrintMsg() \n\
X+ 	     <Key>R:		DoReply(R) \n\
X+  	     <Key>S:		DoSave(S) \n\
X+ 	<Key>?:			SetHelp(text2) \n\
X+ 	<Btn1Down>:		select-start() \n\
X+ 	<Btn1Motion>:		extend-adjust() \n\
X+ 	<Btn1Up>:		extend-end(PRIMARY, CUT_BUFFER0) \n\
X+ 	<Btn2Down>:		insert-selection(PRIMARY, CUT_BUFFER0) \n\
X+ 	<Btn3Down>:		extend-start() \n\
X+ 	<Btn3Motion>:		extend-adjust() \n\
X+ 	<Btn3Up>:		extend-end(PRIMARY, CUT_BUFFER0)";
X+ #else
X+  static String Trans = "\
X+ 	Ctrl <Key>L:		redraw-display() \n\
X+ 	Ctrl <Key>V:		next-page() \n\
X+ 	Ctrl <Key>Z:		scroll-one-line-up() \n\
X+ 	Meta <Key>V:		previous-page() \n\
X+ 	Meta <Key>Z:		scroll-one-line-down() \n\
X+ 	Meta <Key>\<:		beginning-of-file() \n\
X+ 	Meta <Key>\>:		end-of-file() \n\
X+ 	Shift <Key>A:		DoReply(A) \n\
X+  	Shift <Key>C:		DoSave(C) \n\
X+ 	Shift <Key>F:		DoReply(S) \n\
X+ 	Shift <Key>G:		end-of-file() \n\
X+  	Shift <Key>M:		DoReply(r) \n\
X+  	Shift <Key>N:		DoCmd(file %) \n\
X+  	Shift <Key>P:		PrintMsg() \n\
X+ 	Shift <Key>R:		DoReply(R) \n\
X+  	Shift <Key>S:		DoSave(S) \n\
X+         None <Key>Linefeed:	MenuPopdown(help) \n\
X+ 	None <Key>Return:	scroll-one-line-up() \n\
X+ 	None <Key>-:		scroll-one-line-down() \n\
X+ 	None <Key>\':		beginning-of-file() \n\
X+ 	None <Key>space:	next-page() \n\
X+ 	None <Key>a:		DoReply(a) \n\
X+ 	None <Key>b:		previous-page() \n\
X+  	None <Key>c:		DoSave(c) \n\
X+  	None <Key>d:		DoSelected(d) \n\
X+  	None <Key>f:		DoSelected(P) \n\
X+ 	None <Key>j:		scroll-one-line-up() \n\
X+ 	None <Key>k:		scroll-one-line-down() \n\
X+  	None <Key>m:		DoReply(s) \n\
X+  	None <Key>n:		DoSelected(n) \n\
X+  	None <Key>p:		DoSelected(-) \n\
X+  	None <Key>q:		Quit(q) \n\
X+  	None <Key>r:		DoSelected(p) \n\
X+  	None <Key>s:		DoSave(s) \n\
X+ 	None <Key>u:		DoSelected(u) \n\
X+  	None <Key>w:		DoSave(w) \n\
X+  	None <Key>x:		Quit(x) \n\
X+ 	<Key>?:			SetHelp(text2) \n\
X+ 	<Btn1Down>:		select-start() \n\
X+ 	<Btn1Motion>:		extend-adjust() \n\
X+ 	<Btn1Up>:		extend-end(PRIMARY, CUT_BUFFER0) \n\
X+ 	<Btn2Down>:		insert-selection(PRIMARY, CUT_BUFFER0) \n\
X+ 	<Btn3Down>:		extend-start() \n\
X+ 	<Btn3Motion>:		extend-adjust() \n\
X+ 	<Btn3Up>:		extend-end(PRIMARY, CUT_BUFFER0)";
X+ #endif
X  
X+ #if XtSpecificationRelease >= 4
X+  static String trans_2 = "#override \
X+ 	Ctrl <Key>R:		search(backward) \n\
X+ 	Ctrl <Key>S:		search(forward)";
X+ #endif
X  
X   XtSetArg(args[0], XtNmin, XMail.textMinHeight);
X   XtSetArg(args[1], XtNheight, XMail.textHeight);
X   XtSetArg(args[2], XtNfont, TextFontStr);
X   XtSetArg(args[3], XtNtextOptions, scrollVertical | wordBreak);
X!  XtSetArg(args[4], XtNtranslations, XtParseTranslationTable(Trans));
X!  tw = XtCreateManagedWidget("textWindow",asciiStringWidgetClass,parent,args,5);
X  
X+ #if XtSpecificationRelease >= 4
X+  XtOverrideTranslations(tw, XtParseTranslationTable(trans_2));
X+ #endif
X+ 
X+ #ifdef SUNOS_4
X+  XtOverrideTranslations(tw,
X+  XtParseTranslationTable("#override None<Key>i: DoCmd(inc)"));
X+ #endif
X+ 
X   AddHelpText(tw, "text", Text_Help_Text);
X+ 
X+  for (indx = 0; HelpNames[indx]; indx++)
X+      if (strcmp(HelpNames[indx], "text2") == 0) break;
X+ 
X+  if (HelpNames[indx]) {
X+     XtSetArg(args[0], XtNstring, (XtArgVal) Text2_Help_Text);
X+     XtSetArg(args[1], XtNlength, (XtArgVal) strlen(Text2_Help_Text));
X+     XtSetArg(args[2], XtNeditType, (XtArgVal) XttextRead);
X+ 
X+     HelpStrings[indx] = XtStringSourceCreate(WidgetOf(WidgetOf(WidgetOf(toplevel,"topBox"),"help"),"helpWindow"),args,3);
X+    }
X  } /* CreateTextWindow */
X  
X  
X***************
X*** 699,728 ****
X  {
X   Arg		args[12];
X   Cardinal 	n;
X  
X   static String trans = "#override \
X!   <Key>Delete: delete-previous-character() beginning-of-line() end-of-line()\n\
X!   <Key>BackSpace: delete-previous-character() beginning-of-line() end-of-line()\n\
X!   Ctrl<Key>H:  delete-previous-character() beginning-of-line() end-of-line()\n\
X!   Ctrl<Key>U:  beginning-of-line() kill-to-end-of-line() \n\
X!   Ctrl<Key>W:  delete-previous-word() beginning-of-line() end-of-line()\n\
X!   <Key>Return: NextField()";
X  
X   static String b_trans = "#override \
X!   <Btn3Down>:  SetAliases() MenuPopup(aliasList)\n\
X!   <Btn3Motion>: DoNothing()\n\
X!   <Btn3Up>:    DoNothing()\n\
X!   <Key>Delete: delete-previous-character() beginning-of-line() end-of-line()\n\
X!   <Key>BackSpace: delete-previous-character() beginning-of-line() end-of-line()\n\
X!   Ctrl<Key>H:  delete-previous-character() beginning-of-line() end-of-line()\n\
X!   Ctrl<Key>U:  beginning-of-line() kill-to-end-of-line() \n\
X!   Ctrl<Key>W:  delete-previous-word() beginning-of-line() end-of-line()\n\
X!   <Key>Return: NextField()";
X  
X   n  = XMail.shellWidth - 106;	/* - (scn + 2*(internal width + def.dist.)) */
X   n -= TEXTWIDTH * 9 - 6;	/* minus label text width less fudge factor */
X   XtSetArg(args[0], XtNwidth, n);
X- 
X   XtSetArg(args[1], XtNinput, True);
X   XtSetArg(args[2], XtNheight, XMail.buttonHeight);
X   XtSetArg(args[3], XtNfont, TextFontStr);
X--- 853,876 ----
X  {
X   Arg		args[12];
X   Cardinal 	n;
X+  Widget		w;
X  
X   static String trans = "#override \
X!   <Key>Delete:    delete-previous-character() SavePos() beginning-of-file() SetPos()\n\
X!   <Key>BackSpace: delete-previous-character() SavePos() beginning-of-file() SetPos()\n\
X!   Ctrl<Key>H:     delete-previous-character() SavePos() beginning-of-file() SetPos()\n\
X!   Ctrl<Key>U:     beginning-of-line() kill-to-end-of-line() \n\
X!   Ctrl<Key>W:     delete-previous-word() SavePos() beginning-of-file() SetPos()\n\
X!   <Key>Return:    NextField()";
X  
X   static String b_trans = "#override \
X!   <Btn3Down>:     SetAliases() MenuPopup(aliasList)\n\
X!   <Btn3Motion>:   DoNothing()\n\
X!   <Btn3Up>:       DoNothing()";
X  
X   n  = XMail.shellWidth - 106;	/* - (scn + 2*(internal width + def.dist.)) */
X   n -= TEXTWIDTH * 9 - 6;	/* minus label text width less fudge factor */
X   XtSetArg(args[0], XtNwidth, n);
X   XtSetArg(args[1], XtNinput, True);
X   XtSetArg(args[2], XtNheight, XMail.buttonHeight);
X   XtSetArg(args[3], XtNfont, TextFontStr);
X***************
X*** 731,742 ****
X   XtSetArg(args[6], XtNlength, len);
X   XtSetArg(args[7], XtNeditType, (XtArgVal) XttextEdit);
X   XtSetArg(args[8], XtNtextOptions, wordBreak);
X! 
X!  if (strcmp(name, "Subject") == 0) {
X!     XtSetArg(args[9], XtNtranslations, XtParseTranslationTable(trans));
X!    } else {
X!     XtSetArg(args[9], XtNtranslations, XtParseTranslationTable(b_trans));
X!    }
X   n = 10;
X  
X  #if XtSpecificationRelease >= 4
X--- 879,885 ----
X   XtSetArg(args[6], XtNlength, len);
X   XtSetArg(args[7], XtNeditType, (XtArgVal) XttextEdit);
X   XtSetArg(args[8], XtNtextOptions, wordBreak);
X!  XtSetArg(args[9], XtNtranslations, XtParseTranslationTable(trans));
X   n = 10;
X  
X  #if XtSpecificationRelease >= 4
X***************
X*** 743,747 ****
X   XtSetArg(args[n], XtNautoFill, True);					n++;
X  #endif
X  
X!  return( XtCreateManagedWidget(name,asciiStringWidgetClass,parent,args,n) );
X  } /* CreateInputWindow */
X--- 886,915 ----
X   XtSetArg(args[n], XtNautoFill, True);					n++;
X  #endif
X  
X!  w = XtCreateManagedWidget(name, asciiStringWidgetClass, parent, args, n);
X! 
X!  if (strcmp(name, "Subject") != 0)
X!     XtOverrideTranslations(w, XtParseTranslationTable(b_trans));
X! 
X!  return( w );
X  } /* CreateInputWindow */
X+ 
X+ /* 
X+ ** @(#)ParseIconGeometry() - Parse the icon geometry
X+ */
X+ void
X+ ParseIconGeometry(str, x, y)
X+ char	*str;
X+ int	*x, *y;
X+ {
X+  int		res;
X+  unsigned int	w, h;
X+ 
X+  *x = 0;
X+  *y = 0;
X+  res = XParseGeometry(str, x, y, &w, &h);
X+  if ((res & (XNegative|XValue)) == (XNegative|XValue))
X+     *x = RootWidth + *x - mail_width;
X+  if ((res & (YNegative|YValue)) == (YNegative|YValue))
X+     *y = RootHeight + *y - mail_height;
X+ } /* ParseIconGeometry */
X*** ../v1.1/xmail.c	Mon Jun  4 09:48:45 1990
X--- xmail.c	Mon Aug 27 11:09:22 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   * The following software modules were created and are Copyrighted by National
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   * The following software modules were created and are Copyrighted by National
X***************
X*** 48,57 ****
X  #include "global.h"
X  #include "Mailwatch.h"			/* use as icon and watch for newmail */
X  
X! #if XtSpecificationRelease >= 4
X! #include <X11/Xaw/CommandP.h>
X  #else
X! #include <X11/CommandP.h>
X  #endif
X  
X  #include "icon.nomail"			/* default icon pixmap source */
X--- 48,57 ----
X  #include "global.h"
X  #include "Mailwatch.h"			/* use as icon and watch for newmail */
X  
X! #if XtSpecificationRelease < 4
X! #include <X11/CommandP.h>		/* R3 */
X  #else
X! #include <X11/Xaw/CommandP.h>		/* R4 */
X  #endif
X  
X  #include "icon.nomail"			/* default icon pixmap source */
X***************
X*** 61,67 ****
X  #define Offset(field) (XtOffset(XmailResources *, field))
X  
X  static char what[] =
X!  "@(#)xmail.c 1.1 90/05/29 Copyright 1989 National Semiconductor Corp.";
X  
X  static XtResource resrcs[] = {
X      {XtNfont, XtCFont, XtRString, sizeof(char *),
X--- 61,67 ----
X  #define Offset(field) (XtOffset(XmailResources *, field))
X  
X  static char what[] =
X!  "@(#)xmail.c 1.2 90/08/14 Copyright 1989, 1990 National Semiconductor Corp.";
X  
X  static XtResource resrcs[] = {
X      {XtNfont, XtCFont, XtRString, sizeof(char *),
X***************
X*** 72,81 ****
X          Offset(iconGeometry), XtRString, (caddr_t) NULL},
X      {"MFileName", "MFileName", XtRString, sizeof(char *), 
X  	Offset(MFileName), XtRString, (caddr_t) NULL},
X-     {"iconic", "Iconic", XtRBoolean, sizeof(Boolean), 
X- 	Offset(iconic), XtRImmediate, (caddr_t) False},
X      {"bellRing", "BellRing", XtRBoolean, sizeof(Boolean), 
X  	Offset(bellRing), XtRImmediate, (caddr_t) True},
X      {"mailopt_n", "Mailopt_n", XtRBoolean, sizeof(Boolean), 
X  	Offset(mailopt_n), XtRImmediate, (caddr_t) False},
X      {"mailopt_U", "Mailopt_U", XtRBoolean, sizeof(Boolean), 
X--- 72,83 ----
X          Offset(iconGeometry), XtRString, (caddr_t) NULL},
X      {"MFileName", "MFileName", XtRString, sizeof(char *), 
X  	Offset(MFileName), XtRString, (caddr_t) NULL},
X      {"bellRing", "BellRing", XtRBoolean, sizeof(Boolean), 
X  	Offset(bellRing), XtRImmediate, (caddr_t) True},
X+     {"expert", "Expert", XtRBoolean, sizeof(Boolean), 
X+ 	Offset(expert), XtRImmediate, (caddr_t) False},
X+     {"iconic", "Iconic", XtRBoolean, sizeof(Boolean), 
X+ 	Offset(iconic), XtRImmediate, (caddr_t) False},
X      {"mailopt_n", "Mailopt_n", XtRBoolean, sizeof(Boolean), 
X  	Offset(mailopt_n), XtRImmediate, (caddr_t) False},
X      {"mailopt_U", "Mailopt_U", XtRBoolean, sizeof(Boolean), 
X***************
X*** 84,98 ****
X  	Offset(Show_Last), XtRImmediate, (caddr_t) True},
X  };
X  
X  static XrmOptionDescRec Opts[] = {
X!     {"-helpfont",	"*helpFont",	XrmoptionSepArg, (caddr_t) NULL},
X!     {"-iconGeometry",	"*iconGeometry", XrmoptionSepArg, (caddr_t) NULL},
X!     {"-iconic",		"*iconic",	XrmoptionNoArg, (caddr_t) "True"},
X!     {"-f",		"*MFileName",	XrmoptionSepArg, (caddr_t) NULL},
X!     {"-nb",		"*bellRing",	XrmoptionNoArg, (caddr_t) "False"},
X!     {"-n",		"*mailopt_n",	XrmoptionNoArg, (caddr_t) "True"},
X!     {"-U",		"*mailopt_U",	XrmoptionNoArg, (caddr_t) "True"},
X!     {"-ls",		"*Show_Last",	XrmoptionNoArg, (caddr_t) "False"},
X  };
X  
X  char	*IndexBuf;		/* buffer for index widget	*/
X--- 86,105 ----
X  	Offset(Show_Last), XtRImmediate, (caddr_t) True},
X  };
X  
X+ #undef Offset
X+ 
X  static XrmOptionDescRec Opts[] = {
X!     {"-e",		"expert",	XrmoptionNoArg, (caddr_t) "True"},
X!     {"-f",		"MFileName",	XrmoptionSepArg, (caddr_t) NULL},
X!     {"-helpfont",	"helpFont",	XrmoptionSepArg, (caddr_t) NULL},
X!     {"-iconGeometry",	"iconGeometry", XrmoptionSepArg, (caddr_t) NULL},
X!     {"-iconic",		"iconic",	XrmoptionNoArg, (caddr_t) "True"},
X!     {"-ls",		"Show_Last",	XrmoptionNoArg, (caddr_t) "False"},
X!     {"-nb",		"bellRing",	XrmoptionNoArg, (caddr_t) "False"},
X!     {"-n",		"mailopt_n",	XrmoptionNoArg, (caddr_t) "True"},
X!     {"-U",		"mailopt_U",	XrmoptionNoArg, (caddr_t) "True"},
X!     {"-u",		"icon*useName",	XrmoptionNoArg, (caddr_t) "True"},
X!     {"-rv",	"icon*reverseVideo",	XrmoptionNoArg, (caddr_t) "True"},
X  };
X  
X  char	*IndexBuf;		/* buffer for index widget	*/
X***************
X*** 105,111 ****
X  char 	BccBuf[BUFSIZ];		/* message Bcc list		*/
X  char 	tmpName[BUFSIZ];	/* message temporary filename	*/
X  char 	*MailPrompt;		/* mail program prompt string	*/
X! char	*HelpNames[24];		/* array of help window names	*/
X  char	**mailargv;		/* array passed to mail child	*/
X  
X  int	mailargc;		/* counter passed to mail child	*/
X--- 112,118 ----
X  char 	BccBuf[BUFSIZ];		/* message Bcc list		*/
X  char 	tmpName[BUFSIZ];	/* message temporary filename	*/
X  char 	*MailPrompt;		/* mail program prompt string	*/
X! char	*HelpNames[25];		/* array of help window names	*/
X  char	**mailargv;		/* array passed to mail child	*/
X  
X  int	mailargc;		/* counter passed to mail child	*/
X***************
X*** 119,125 ****
X  Widget  toplevel; 		/* top level shell widget */
X  
X  XmailResources 	XMail;		/* application resources of xmail */
X! XtTextSource	HelpStrings[23];
X  XFontStruct	*TextFontStr, *HelpFontStr;
X  
X  
X--- 126,132 ----
X  Widget  toplevel; 		/* top level shell widget */
X  
X  XmailResources 	XMail;		/* application resources of xmail */
X! XtTextSource	HelpStrings[24];
X  XFontStruct	*TextFontStr, *HelpFontStr;
X  
X  
X***************
X*** 173,181 ****
X   HelpNames[i++] = "read";	HelpNames[i++] = "reply";
X   HelpNames[i++] = "save";	HelpNames[i++] = "Send";
X   HelpNames[i++] = "status";	HelpNames[i++] = "Subject";
X!  HelpNames[i++] = "text";	HelpNames[i++] = "title";
X!  HelpNames[i++] = "To";		HelpNames[i++] = "Autograph";
X!  HelpNames[i]   = NULL;
X  
X   strcpy(Command, "Start");		/* let parser know we've started */
X   Recipient[0] = SubjBuf[0] = CcBuf[0] = BccBuf[0] = '\0';
X--- 180,188 ----
X   HelpNames[i++] = "read";	HelpNames[i++] = "reply";
X   HelpNames[i++] = "save";	HelpNames[i++] = "Send";
X   HelpNames[i++] = "status";	HelpNames[i++] = "Subject";
X!  HelpNames[i++] = "text";	HelpNames[i++] = "text2";
X!  HelpNames[i++] = "title";	HelpNames[i++] = "To";
X!  HelpNames[i++] = "Autograph";	HelpNames[i]   = NULL;
X  
X   strcpy(Command, "Start");		/* let parser know we've started */
X   Recipient[0] = SubjBuf[0] = CcBuf[0] = BccBuf[0] = '\0';
X***************
X*** 232,238 ****
X   XMail.buttonHeight	= TEXTHEIGHT + (TextFontStr->ascent / 2);
X   XMail.buttonWidth	= XTextWidth(TextFontStr, " Newmail ", 9);
X         buttonSpace      = XMail.buttonWidth + XMail.commandHSpace + 2;
X!  XMail.shellWidth       = (8 * buttonSpace) + 24;    /*  8 buttons per row */
X   XMail.fileBoxWidth     = (4 * buttonSpace) + XMail.buttonWidth + 2;
X   XMail.helpHeight       = HELPHEIGHT * 14;           /* 14 lines by 60 chars */
X   XMail.helpWidth        = XTextWidth(HelpFontStr, "X11Windows", 10) * 6;
X--- 239,245 ----
X   XMail.buttonHeight	= TEXTHEIGHT + (TextFontStr->ascent / 2);
X   XMail.buttonWidth	= XTextWidth(TextFontStr, " Newmail ", 9);
X         buttonSpace      = XMail.buttonWidth + XMail.commandHSpace + 2;
X!  XMail.shellWidth       = (8 * buttonSpace) + 26;    /*  8 buttons per row */
X   XMail.fileBoxWidth     = (4 * buttonSpace) + XMail.buttonWidth + 2;
X   XMail.helpHeight       = HELPHEIGHT * 14;           /* 14 lines by 60 chars */
X   XMail.helpWidth        = XTextWidth(HelpFontStr, "X11Windows", 10) * 6;
X***************
X*** 258,264 ****
X   Display	*dpy;
X   XSizeHints	size_hints;
X   XWMHints	wm_hints;
X!  int		scn, depth, x, y, width, height;
X   CommandWidget  nm = (CommandWidget)WidgetOf(WidgetOf(WidgetOf(toplevel, "topBox"), "commandPanel"), "Newmail");
X  
X  
X--- 265,271 ----
X   Display	*dpy;
X   XSizeHints	size_hints;
X   XWMHints	wm_hints;
X!  int		scn, depth, x, y;
X   CommandWidget  nm = (CommandWidget)WidgetOf(WidgetOf(WidgetOf(toplevel, "topBox"), "commandPanel"), "Newmail");
X  
X  
X***************
X*** 276,301 ****
X  /*
X  ** Notify the window manager about our icon window
X  */
X!  wm_hints.input = True;
X  
X!  wm_hints.initial_state = (XMail.iconic) ? IconicState : NormalState;
X  
X-  x = RootWidth - 58;			/* provide some reasonable defaults */
X-  y = 83;				/* slightly down the right side top */
X-  if (XMail.iconGeometry)
X-     XParseGeometry(XMail.iconGeometry, &x, &y, &width, &height);
X- 
X-  wm_hints.icon_x = x;
X-  wm_hints.icon_y = y;
X- 
X-  wm_hints.flags  = InputHint | StateHint | IconPositionHint;
X- 
X  #ifndef PIXMAP_ICON
X!  wm_hints.flags |= IconWindowHint;
X!  wm_hints.icon_window = XtWindow(XtNameToWidget(toplevel, "icon"));
X  #else
X!  wm_hints.flags |= IconPixmapHint;
X!  wm_hints.icon_pixmap = XCreateBitmapFromData(dpy, XtScreen(toplevel)->root,
X                                   no_mail_bits, no_mail_width, no_mail_height);
X  #endif
X  
X--- 283,305 ----
X  /*
X  ** Notify the window manager about our icon window
X  */
X!  wm_hints.input		= True;
X!  wm_hints.initial_state	= (XMail.iconic) ? IconicState : NormalState;
X!  wm_hints.flags		= InputHint | StateHint;
X  
X!  if (XMail.iconGeometry) {
X!     ParseIconGeometry(XMail.iconGeometry, &x, &y);
X!     wm_hints.icon_x	= x;
X!     wm_hints.icon_y	= y;
X!     wm_hints.flags	|= IconPositionHint;
X!    }
X  
X  #ifndef PIXMAP_ICON
X!  wm_hints.flags		|= IconWindowHint;
X!  wm_hints.icon_window	= XtWindow(XtNameToWidget(toplevel, "icon"));
X  #else
X!  wm_hints.flags		|= IconPixmapHint;
X!  wm_hints.icon_pixmap	= XCreateBitmapFromData(dpy, XtScreen(toplevel)->root,
X                                   no_mail_bits, no_mail_width, no_mail_height);
X  #endif
X  
X***************
X*** 350,355 ****
X--- 354,361 ----
X   SetHints();
X  
X   callMail(mailargc, mailargv);
X+ 
X+  XSync(XtDisplay(toplevel), False);
X  
X   XtMainLoop();
X  } /* main */
X*** ../v1.1/xmail.man	Mon Jun  4 09:48:46 1990
X--- xmail.man	Mon Aug 27 11:09:22 1990
X***************
X*** 1,5 ****
X  .\"
X! .\" @(#)xmail.l 1.1 90/05/29 NSC;
X  .\"
X  .\" Copyright 1990 by National Semiconductor Corporation.
X  .\"
X--- 1,5 ----
X  .\"
X! .\" @(#)xmail.l 1.2 90/09/14 NSC;
X  .\"
X  .\" Copyright 1990 by National Semiconductor Corporation.
X  .\"
X***************
X*** 30,36 ****
X  .if t .ds Q ``
X  .if t .ds U ''
X  .\"
X! .TH XMAIL 1 "May 29, 1990" "NSC"
X  .SH NAME
X  xmail \- X11 visual interface to the mail program
X  .SH SYNOPSIS
X--- 30,36 ----
X  .if t .ds Q ``
X  .if t .ds U ''
X  .\"
X! .TH XMAIL 1 "August 14, 1990" "NSC"
X  .SH NAME
X  xmail \- X11 visual interface to the mail program
X  .SH SYNOPSIS
X***************
X*** 68,77 ****
X  \*(xM also accepts the following additional options:
X  .RS
X  .TP
X! \fB-iconGeometry \fI+XOff+YOff\fR
X  provides a command line option for specifying the preferred geometry
X  location for the \*(xM icon window.  This overrides any \*(xM resource
X! specification for \*Q\fB*iconGeometry: \fI+XOff+YOff\fR\*U.
X  .TP
X  \fB\-nb\fR
X  tells \*(xM to \fBnot\fR ring the terminal bell when issuing status and
X--- 68,83 ----
X  \*(xM also accepts the following additional options:
X  .RS
X  .TP
X! \fB\-e\fR
X! Sets the \*(xM resource specification \*Q\fB*expert: \fITrue\fR\*U.  This
X! resource determines whether \*Q\fBconfirm\fR\*U popups will be presented
X! when commiting changes to a folder or deleting a new message composition.
X! By default the resource is False, which means confirm popups will be used.
X! .TP
X! \fB-iconGeometry \fI[+-]XOff[+-]YOff\fR
X  provides a command line option for specifying the preferred geometry
X  location for the \*(xM icon window.  This overrides any \*(xM resource
X! specification for \*Q\fB*iconGeometry: \fI[+-]XOff[+-]YOff\fR\*U.
X  .TP
X  \fB\-nb\fR
X  tells \*(xM to \fBnot\fR ring the terminal bell when issuing status and
X***************
X*** 89,94 ****
X--- 95,110 ----
X  The option can also be specified as an \*(xM resource
X  using the specification \*Q\fB*mailopt_n: \fITrue\fR\*U.
X  .TP
X+ \fB\-rv\fR
X+ tells \*(xM to reverse the foreground and background colors of the icon
X+ window when displaying the icon.  The option can also be specified as an
X+ \*(xM resource using the specification \*Q\fB*icon*reverseVideo: \fITrue\fR\*U.
X+ .TP
X+ \fB\-u\fR
X+ tells \*(xM to include the user login name in the icon window when displaying
X+ the icon.  The option can also be specified as an \*(xM resource
X+ using the specification \*Q\fB*icon*useName: \fITrue\fR\*U.
X+ .TP
X  \fB\-U\fR
X  tells Mail to convert internet style addresses into uucp format.
X  This option also is a Mail option, passed on to it during startup.
X***************
X*** 116,125 ****
X  
X  Immediately below the title bar, an index window
X  displays header information for the current mail folder.  Message selection
X! is indicated by highlight of the number of a particular message.
X  New and unread mail are prefixed with 'N' and 'U' characters.  Deleted
X  messages not yet removed from the index list have the letter 'D' preceding
X! the message number.
X  
X  Below the index
X  window, a status window displays status and error messages.  The terminal
X--- 132,143 ----
X  
X  Immediately below the title bar, an index window
X  displays header information for the current mail folder.  Message selection
X! is indicated by a \fIgreater-than\fR symbol '>' prefix to the number of a
X! particular message.
X  New and unread mail are prefixed with 'N' and 'U' characters.  Deleted
X  messages not yet removed from the index list have the letter 'D' preceding
X! the message number.  Keyboard keys can be used to scroll the index window,
X! in addition to the more traditional mouse on scrollbar mechanism.
X  
X  Below the index
X  window, a status window displays status and error messages.  The terminal
X***************
X*** 151,157 ****
X  
X  Message text is displayed in the bottom window of the \*(xM shell.
X  Like the index window above, scroll bars provide easy access to any portion of
X! the text.  Because the reading of a very large message can take more than a few
X  moments, \*(xM decides when starting Mail or changing folders that a
X  message longer
X  than 65,000 characters will \fBnot\fR be automatically displayed.
X--- 169,178 ----
X  
X  Message text is displayed in the bottom window of the \*(xM shell.
X  Like the index window above, scroll bars provide easy access to any portion of
X! the text.  Keyboard keys can also be used to scroll the text window.
X! In addition, the text window has keyboard definitions to supplant using the
X! mouse on the command buttons for normal \*(xM command operation.
X! Because the reading of a very large message can take more than a few
X  moments, \*(xM decides when starting Mail or changing folders that a
X  message longer
X  than 65,000 characters will \fBnot\fR be automatically displayed.
X***************
X*** 251,259 ****
X  Users may append their \fISign\fP or \fIsign\fP autograph (see \fBMail(1)\fR)
X  once only to the end of the message text.
X  Pressing the \fIDeliver\fR button causes the message
X! to be delivered, while the right mouse button displays a menu for the Deliver,
X! \fICancel\fR (and delete), and Cancel (and save in your dead.letter file)
X! commands.
X  
X  Mail forwarded to another user will be bracketed by a \*Q\fIBegin Forwarded
X  Message/End Forwarded Message\fR\*U string
X--- 272,280 ----
X  Users may append their \fISign\fP or \fIsign\fP autograph (see \fBMail(1)\fR)
X  once only to the end of the message text.
X  Pressing the \fIDeliver\fR button causes the message
X! to be delivered, while the right mouse button displays a menu for \fIDeliver,
X! ReEdit, Cancel\fR (and delete), and \fICancel\fR (and save in your dead.letter
X! file) commands.
X  
X  Mail forwarded to another user will be bracketed by a \*Q\fIBegin Forwarded
X  Message/End Forwarded Message\fR\*U string
X***************
X*** 267,273 ****
X  received.
X  .SH FOLDERS
X  If the right mouse button is pressed while the cursor is within the
X! command panel \fBfolder\fR button, \*(xM will display a menu of available
X  mail folders.
X  Dragging the cursor while still holding the right mouse button down will allow
X  the user to highlight a particular folder name.  Releasing the right button
X--- 288,294 ----
X  received.
X  .SH FOLDERS
X  If the right mouse button is pressed while the cursor is within the
X! command panel \fBFolder\fR button, \*(xM will display a menu of available
X  mail folders.
X  Dragging the cursor while still holding the right mouse button down will allow
X  the user to highlight a particular folder name.  Releasing the right button
X***************
X*** 292,301 ****
X  
X  The first request for the folder menu extracts (from Mail or the system) the
X  necessary information to create the menu.  Subsequent requests simply redisplay
X! that menu.  To force \*(xM to recalculate the folder menu content, press
X! the \fBNewmail\fR button, which causes \*(xM to destroy the current folder
X! menu and re-display your system mail folder.
X! This provides access to folders created after the start of \*(xM.
X  .SH FONTS
X  \*(xM now supports a wider variety of font styles, such as \fICourier\fR and 
X  \fInew century schoolbook\fR.
X--- 313,325 ----
X  
X  The first request for the folder menu extracts (from Mail or the system) the
X  necessary information to create the menu.  Subsequent requests simply redisplay
X! that menu.  To force \*(xM to recalculate the folder menu content, use the
X! \fBNewmail\fR button option which causes \*(xM to destroy the current folder
X! menu.  This provides for access to folders created after the start of \*(xM.
X! Pressing the right mouse button
X! on the Newmail command box will present the Newmail command menu, which has a
X! choice to drop the current folder list.  This same option is also available
X! using the accelerator key and the left mouse button on the Newmail command box.
X  .SH FONTS
X  \*(xM now supports a wider variety of font styles, such as \fICourier\fR and 
X  \fInew century schoolbook\fR.
X***************
X*** 337,343 ****
X  the following additional resource names are recognized:
X  .RS
X  .TP 3
X! \fB\&.geometry: \fI+XOff+YOff\fR
X  This resource defines the initial startup location for the \*(xM window.
X  Note the dot (.) just in front of the geometry resource name.
X  Users are cautioned to \fBnot\fR specify this resource with the
X--- 361,367 ----
X  the following additional resource names are recognized:
X  .RS
X  .TP 3
X! \fB\&.geometry: \fI[+-]XOff[+-]YOff\fR
X  This resource defines the initial startup location for the \*(xM window.
X  Note the dot (.) just in front of the geometry resource name.
X  Users are cautioned to \fBnot\fR specify this resource with the
X***************
X*** 345,350 ****
X--- 369,384 ----
X  and send/reply) to orient to that same starting location, rather than be
X  anchored to the intended window.
X  .TP 3
X+ \fB*expert: \fI<boolean>\fR
X+ This boolean defines whether the \*(xM user requires confirmation of
X+ folder commits or composed message deletions.  Whenever an action
X+ would make a permanent un-recoverable change to the \*(xM environment, a
X+ popup confirmation window will be presented for the user, to assure that
X+ the action should take place.  These confirmations include changing a
X+ folder when deletions have occurred, or deleting the text of a newly
X+ composed message instead of sending it.  Setting this resource to True
X+ eliminates those confirmation popups.
X+ .TP 3
X  \fB*iconic: \fI<boolean>\fR
X  This boolean defines whether the \*(xM application should be started in
X  iconic state or not.  It is highly recommended that only the application
X***************
X*** 353,359 ****
X  message entry windows to be started iconic, which could prove confusing
X  to the unaware user.
X  .TP 3
X! \fB*iconGeometry: \fI+XOff+YOff\fR
X  This resource defines an initial location for the icon, whenever the
X  \*(xM application is iconified.
X  .TP 3
X--- 387,393 ----
X  message entry windows to be started iconic, which could prove confusing
X  to the unaware user.
X  .TP 3
X! \fB*iconGeometry: \fI[+-]XOff[+-]YOff\fR
X  This resource defines an initial location for the icon, whenever the
X  \*(xM application is iconified.
X  .TP 3
X***************
X*** 383,392 ****
X  .TP 3
X  \fB*icon\fR
X  controls resources for the \fIicon\fR window.  In addition to 
X! specifications of foreground and background colors, it is possible
X! to also specify mailWatch widget resources, such as the following:
X  .RS
X  .TP 3
X  \fB*icon*reverseVideo: \fI<boolean>\fR
X  If set to true, reverses the foreground and background colors for the icon.
X  .TP 3
X--- 417,430 ----
X  .TP 3
X  \fB*icon\fR
X  controls resources for the \fIicon\fR window.  In addition to 
X! specifications of foreground and background colors, it is also possible
X! to specify the following mailWatch widget resources :
X  .RS
X  .TP 3
X+ \fB*icon*useName: \fI<Boolean>\fR
X+ If set to true, tells \*(xM to include the user login name in the icon window
X+ when displaying the icon.
X+ .TP 3
X  \fB*icon*reverseVideo: \fI<boolean>\fR
X  If set to true, reverses the foreground and background colors for the icon.
X  .TP 3
X***************
X*** 442,447 ****
X--- 480,556 ----
X  file \fB/usr/lib/X11/app-defaults/XMail\fR.  User's may wish to include
X  appropriate alternate definitions in their ~/.Xdefaults file, to tailor
X  preferences for colors and/or fonts.
X+ .SH "KEYBOARD ACCELERATORS"
X+ The index and text windows support two methods of scrolling displayable
X+ text.  The use of the mouse buttons in the scrollbar region is standard.
X+ In addition, keyboard keys have been defined in keeping with conventions
X+ used in text display programs such as \*Qmore\*U and \*Qless\*U.
X+ 
X+ The following table lists the key definitions and their respective actions.
X+ The abbreviation \*QCtrl\*U means to press down and hold the \fBControl\fR
X+ key while pressing the specified letter key.  \*QMeta\*U likewise refers
X+ to the \fBmeta\fR keys (\fIlabeled \*QLeft\*U and \*QRight\*U on some
X+ Sun keyboards\fR).
X+ .sp
X+ .RS
X+ .nf
X+ Key Name 		Action Taken
X+ --------		-----------------------------
X+  Ctrl V 		move to the next page
X+  space  		move to the next page
X+  Meta V 		move to the previous page
X+    b    		move to the previous page
X+  Ctrl Z 		scroll one line up
X+  Return 		scroll one line up
X+    j    		scroll one line up
X+  Meta Z 		scroll one line down
X+    k    		scroll one line down
X+    -    		scroll one line down
X+    \'    		move to the beginning of file
X+  Meta < 		move to the beginning of file
X+  Meta > 		move to the end of file
X+ Shift G 		move to the end of file
X+ .fi
X+ .RE
X+ .sp
X+ .LP
X+ In addition to the scroll key definitions, the \fItext\fR window also supports
X+ keyboard accelerators for most of the command buttons.  Where possible,
X+ these keyboard keys replicate the actual commands that would be typed
X+ if the user were running the native mail program.  Thus, to begin
X+ sending a mail message to some recipient, the user could press the \*Qm\*U key,
X+ and to delete a current message, the user could press the \*Qd\*U key.
X+ .sp
X+ .RS
X+ .nf
X+ Key Name 		Command Action Taken
X+ --------		-----------------------------
X+ Shift A 		reply to all, include the current message
X+ Shift C 		copy the message to the author's name
X+ Shift F 		forward the current mail message
X+ Shift M 		reply to a mail message
X+ Shift N 		bring new mail into your system folder
X+ Shift P 		send the current message to the printer
X+ Shift R 		include the current message in a reply
X+ Shift S 		save the message to the author's name
X+    a    		reply to all recipients of a message
X+    c    		copy the message to the indicated folder
X+    d    		delete the current message
X+    f    		read the full header of the message
X+    i    		incorporate new mail without commit
X+    m    		mail (compose) a new mail message
X+    n    		read the next mail message
X+    p    		read the previous mail message
X+    q    		quit xmail, committing any changes
X+    r    		read the current mail message
X+    s    		save current message in specified folder
X+    u    		undelete the most recently deleted message
X+    w    		writes the message to the indicated file
X+    x    		exit xmail, without committing changes
X+    ?    		displays help for these key definitions
X+  <LF>   		removes help for these key definitions
X+ .fi
X+ .RE
X  .SH "ENVIRONMENT"
X  Several process environment variables are of potential interest to \*(xM.
X  .sp
X***************
X*** 482,488 ****
X  path of the process (assumed to be at least \*Q/bin /usr/bin /usr/ucb\*U).
X  If need be, the XMAILER
X  environment variable can be used to provide a specific path to the Mail
X! program.  Note: \*(xM will not work correctly with any mail program
END_OF_FILE
if test 52848 -ne `wc -c <'Patch.02d'`; then
    echo shar: \"'Patch.02d'\" unpacked with wrong size!
fi
# end of 'Patch.02d'
fi
echo shar: End of archive 4 \(of 5\).
cp /dev/null ark4isdone
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.