ToolTalk User's Guide

Adding ToolTalk Code to the Xedit Files

The changes made to the Xedit files are described in "Modifying the Xedit Application".


Example B-1 Modify the Xedit.h File

 /*
 *	rcs_id[] = "$XConsortium: xedit.h,v 1.18 89/07/21 19:52:58 kit Exp $";
 */

...

 #include <X11/Xaw/Viewport.h>
 #include <X11/Xaw/Cardinals.h>

 /*
 * For the ToolTalk demonstration, add the following include line.
 */
 #include <desktop/tt_c.h>	
 /* ToolTalk header */

 extern struct _app_resources {
 Boolean enableBackups;
 char *backupNamePrefix;
 char *backupNameSuffix;

...

 /*	externals in xedit.c 	*/

 extern void Feep();
 /*
 * For the ToolTalk demonstration, add the following externals.
 */
 extern void processToolTalkMessage();	/* Process ToolTalk message */
 extern void dieFromToolTalkError();
		/* Fail if error occurs */
 extern Display *CurDpy;
  /* Display */

...

  /* externs in commands.c */

...

 extern void DoChangeFont();
 		/* Change font */


Example B-2 Modified Xedit.c File

#if (!defined(lint) && !defined(SABER)) \
 static char Xrcsid[] = "$XConsortium: \
 xedit.c,v 1.23 89/12/07 \
 19:19:17 kit Exp $";
 #endif 			/* lint && SABER */

...

 void main(argc, argv)
 int argc;
 char **argv;
 {
 Widget top;
 String filename = NULL;
 static void makeButtonsAndBoxes();

 /*
  * For the ToolTalk demonstration, 
    add the following lines:
  */
 int ttmark;
/* ToolTalk mark */
 int ttfd;
/* ToolTalk file descriptor */
 char *procid;	
/* Process identifier */
 Tt_status ttrc;
/* ToolTalk status */

 top = XtInitialize( "xedit", \ 
"Xedit", NULL, 0, &argc, argv);

...

XtRealizeWidget(top);
XDefineCursor(XtDisplay(top),XtWindow(top), \
XCreateFontCursor( XtDisplay(top), \ 
XC_left_ptr));
 /*
  * For the ToolTalk demonstration, 
  * add the following lines
  * to make the top of stack the ToolTalk
  * session and set
  * it to be the default session.
  */
 ttmark = tt_mark();
 ttrc = tt_default_session_set( 
	/* set the default session .. */
 tt_X_session( 	
	/* .. to the X session for .. */
 DisplayString( 
	/* .. the X server displaying ..*/
 XtDisplay(top))));
 /* .. our top window... */
	/*
 	* Fail if no default session
		*/
 dieFromToolTalkError( \
 "tt_default_session_set",ttrc); 
 procid = tt_open();	
		/* Initialize ToolTalk */
		/*
		 * Fail if no process identifier
		 */
 dieFromToolTalkError("tt_open" \
,tt_ptr_error(procid));
 ttfd = tt_fd();	
		/* ToolTalk file descriptor */
		/*
		 * Fail if no file descriptor
		 */
dieFromToolTalkError("tt_fd", \
tt_int_error(ttfd));
		/*
		 * Activate file descriptor
		 */
XtAddInput(ttfd, (XtPointer)XtInputReadMask, \
 processToolTalkMessage, 0);

 XtMainLoop();
 }

...

 MakeCommandButton(b_row, "load", DoLoad);
 /*
  * For the ToolTalk demonstration, add the 
  * next line to make
  * a button for the font change command:
  */
 MakeCommandButton(b_row, "changefont", \ 
 DoChangeFont);	
 filenamewindow = MakeStringBox(b_row, \ 
"filename", filename);
 }
 XtCreateManagedWidget("bc_label", 
 labelWidgetClass, outer, NULL, ZERO);

...

 void Feep()
 {
 XBell(CurDpy, 0);
 /*
  * For the ToolTalk demonstration, add the 
  * following lines to receive and
  * process an incoming message:
  */
 }


 void processToolTalkMessage()
		/* Process ToolTalk message */
 {
 	int ttmark;				
  /* ToolTalk mark */
 	Tt_message incoming;						
		/* Incoming message */

 	ttmark = tt_mark();					
		/* ToolTalk mark */

 	incoming = tt_message_receive();
		/* Receive incoming message */
 	/*
 	 * The callback should process the 
   * message, so we should never
 	 * get a message returned.
 	 */
 	if (incoming == 0) return;	
		/* Return incoming message */

	if (tt_is_err(tt_ptr_error(incoming))) {
 		dieFromToolTalkError("tt_message_receive",
 				 tt_ptr_error(incoming));
 	}
 
 	/*
   * This is not a message we recognize.
 	 * If it is a request, or a notice that 
   * caused us to start, fail it.
 	 */

 	if (tt_message_class(incoming) == TT_REQUEST ||
 	 tt_message_status(incoming) ==
   TT_WRN_START_MESSAGE) {
 		tt_message_fail(incoming);
 	}
 	tt_message_destroy(incoming);								
			/* Destroy message */
 	tt_release(ttmark);						
			/* Free space */
 }

 void dieFromToolTalkError(procname, errid)
 char *procname;
 Tt_status errid;
		/* Fail if error occurs */
 {
 	/*
 	 * Don't die on warnings or TT_OK.
 	 */

 	if (tt_is_err(errid)) {
 		fprintf(stderr,"%s returned ToolTalk 
   error: %s\n",
 			procname, tt_status_message(errid));
 		exit(1);
 	}
 }


Example B-3 Modified commands.c File

#if (!defined(lint) && !defined(SABER))
static char Xrcsid[] = "$XConsortium: 
commands.c,v 1.27 89/12/10
					17:08:26 rws Exp $";
#endif /* lint && SABER */

...

#ifdef USG
int rename (from, to)
 char *from, *to;
{
 (void) unlink (to);
 if (link (from, to) == 0) {
 unlink (from);
 return 0;
 } else {
 return -1;
 }
}
#endif

/*
 * For the ToolTalk demonstration, add the
 * following lines to have Xfontsel
 * send a callback that the operation has either
 * completed or failed:
 */
static Tt_callback_action FinishChangeFont(m,p)/* ToolTalk message callback */
 Tt_message m;
		/* ToolTalk message */
 Tt_pattern p;	
		/* ToolTalk pattern */
{
	static XFontStruct *fs;
			/* Font structure */
	int ttmark;				
			/* ToolTalk mark */
	
	ttmark = tt_mark();	
			/* ToolTalk mark */
		/*
		 * If operation fails, notify user
		 */
	if (TT_FAILED==tt_message_state(m)) {
		XeditPrintf("Font change failed\n");
		tt_message_destroy(m);						
			/* Destroy message */
	} else if (TT_HANDLED==tt_message_state(m)) {
		XFontStruct *newfs;
		/* Try to load the new font */
		newfs = 
XLoadQueryFont(CurDpy,tt_message_arg_val(m,0));
		/* If the new font is OK, and there is an 
   * old font,
		 * unload the old font. Then use the new font
		 */
		if (newfs) {
			if (fs) {
				XUnloadFont(CurDpy, fs->fid);
			}
			XtVaSetValues(textwindow, XtNfont, newfs, 0);
			fs = newfs;
		}
		tt_message_destroy(m);	
			/* Destroy message */
	}
	tt_release(ttmark);	
				/* Release mark */
		/*
		 * Process callback to notify sender 
   * operation completed
		 */
	return TT_CALLBACK_PROCESSED;		
}

void
DoChangeFont()		
/* Change font */
{
	Tt_message m;
		/* ToolTalk message */
	Tt_status ttrc;			
		/* ToolTalk status */

		/*
		 * Create request
		 */
	m = tt_prequest_create(TT_SESSION, 
  "GetFontName");
		/*
		 * Add arguments to message
		 */
	tt_message_arg_add(m,TT_OUT,"string",
   (char *)NULL);
		/*
		 * Add callback to notify when change 
   * complete
		 */
	tt_message_callback_add(m,FinishChangeFont);
		/*
		 * Send message
		 */
	ttrc = tt_message_send(m);
		/*
		 * Fail if error occurs
		 */
	dieFromToolTalkError("tt_message_send",ttrc);
}



void DoSave()
{