Sun Microsystems, Inc.
spacerspacer
spacer www.sun.com docs.sun.com |
spacer
black dot
 
 
B.  A Simple Demonstration of How the ToolTalk Service Works Adding ToolTalk Code to the Demonstration Applications Adding ToolTalk Code to the Xedit Files  Previous   Contents   Next 
   
 

Adding ToolTalk Code to the Xfontsel Files

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


Example B-4 Modified Xfontsel.c File

#ifndef lint
static char Xrcsid[] = "$XConsortium:
 xfontsel.c,v 1.16 89/12/12 14:10:48 rws
 Exp $";
#endif

...

#include <X11/Xaw/Viewport.h>
#include <X11/Xmu/Atoms.h>

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

#define MIN_APP_DEFAULTS_VERSION 1

...

void SetCurrentFont();
Boolean IsXLFDFontName();

/*
 * For the ToolTalk demonstration, add the 
 * following lines to tell
 * Xfontsel how to handle a ToolTalk message:
 */
void dieFromToolTalkError();	
 /* Fail if error occurs */
void processToolTalkMessage();
 /* Process ToolTalk message */
void ReplyToMessage();	
		/* Reply to ToolTalk message */
Tt_message replymsg;											

typedef void (*XtProc)();

...

int matchingFontCount;
static Boolean anyDisabled = False;
Widget ownButton;
/*
 * For the ToolTalk demonstration, add the 
 * next line to add
 * the apply button to change the font:
 */
Widget applyButton;
		/* Add apply button */
Widget fieldBox;
/*
 * For the ToolTalk demonstration, add 
 * the next line to add
 * a command box to make the font change:
 */
Widget commandBox;		
		/* Make commandBox global */
Widget countLabel;

...

void main(argc, argv)
 unsigned int argc;
 char **argv;
{
 Widget topLevel, pane;

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

 topLevel = XtInitialize( NULL, 
 "XFontSel", options, XtNumber(options),
			 &argc, argv );

...

 pane = XtCreateManagedWidget("pane"
,panedWidgetClass,topLevel,NZ);
 {
/*
 * For the ToolTalk demonstration, 
 * make the command box widget
 * global; change the line
 * Widget commandBox, 
 * fieldBox, currentFontName, viewPort;
 * as follows:
 */
	Widget
 /* commandBox, fieldBox, currentFontName,*/ viewPort;

	commandBox = XtCreateManagedWidget("commandBox
 ",formWidgetClass,pane,NZ);
	{

...

	 ownButton =
		XtCreateManagedWidget("ownButton"
,toggleWidgetClass,commandBox,NZ);
/*
 * For the ToolTalk demonstration, add the 
 * following lines to create
 * an apply button for the font change:
 */
	 applyButton =		
	 XtVaCreateManagedWidget("applyButton",
					commandWidgetClass,
					commandBox,
					XtNlabel, "apply",
					XtNfromHoriz, ownButton,
					XtNleft, XtChainLeft,
					XtNright, XtChainLeft,
					0);

	 countLabel =
		XtCreateManagedWidget("countLabel"
,labelWidgetClass,commandBox,NZ);

	 XtAddCallback(quitButton, XtNcallback, Quit,
 NULL);
	 XtAddCallback(ownButton,XtNcallback,
  OwnSelection,(XtPointer)True);
/*
 * For the ToolTalk demonstration, add the 
 * following line to notify
 * Xedit when the apply button has been pressed:
 */
	 XtAddCallback(applyButton, 
  XtNcallback,ReplyToMessage, NULL);
	}

	fieldBox = XtCreateManagedWidget("fieldBox",
 boxWidgetClass, pane, NZ);

...

 {
	int f;
	for (f = 0; f < FIELD_COUNT; f++) 
currentFont.value_index[f] = -1;
 }

 /*
  * 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();
	/*
	 * Fail if no proces identifier
	 */
 dieFromToolTalkError("tt_open"
,tt_ptr_error(procid));
 ttfd = tt_fd();
	/*
	 * Fail if no ToolTalk file descriptor
	 */
 dieFromToolTalkError("tt_fd"
,tt_int_error(ttfd));
 ttrc = tt_ptype_declare("xfontsel");
	/*
	 * Fail if ptype not declared
	 */
 dieFromToolTalkError("tt_ptype_declare"
,tt_int_error(ttfd));
 ttrc = tt_session_join(tt_default_session());
	/*
	 * Fail if unable to join session
	 */
 dieFromToolTalkError("tt_session_join",ttrc);
	/*
 	 * Add input
	 */
 XtAddInput(ttfd, (XtPointer)XtInputReadMask,
 processToolTalkMessage, 0);

 XtAppMainLoop(appCtx);							

 tt_close();						
			/* End ToolTalk session */
 tt_release(ttmark);									
			/* Free space */
}

...
		Boolean field_bits[FIELD_COUNT];
		int max_field;
		if (*fontName == DELIM) field++;
/*
 *
 * For the ToolTalk demonstration, 
 * use the standard routines
 * instead of BSD; change the line
 * bzero( field_bits, sizeof(field_bits) );
 * to read as follows:
 *
 */
		memset( field_bits, 0, sizeof(field_bits) );
		if (Matches(pattern, fontName++, field_bits, 
   &max_field)) {

...

	 XtDisownSelection(w, XA_PRIMARY, time);
	XtSetSensitive(currentFontName, False);
 }

/*
 * For the ToolTalk Demonstration, 
 * add the following lines:
 */
}

void dieFromToolTalkError(procname, errid)		/* Fail if error occurs */
 char *procname;					
		/* Process name */
 Tt_status errid;							
		/* Error identifier */
{
	/*
	 * 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);
	}
}

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

	ttmark = tt_mark();

	incoming = tt_message_receive();
	/* Receive message */
	/*
	 * It's possible that the file descriptor 
  * may become active but
	 * there's not actually a ToolTalk message 
  * for us.
	 */
	if (incoming == 0) return;

	if (tt_is_err(tt_ptr_error(incoming))) {
		dieFromToolTalkError("tt_message_receive",
				 tt_ptr_error(incoming));
	}
	
	if (0==strcmp(tt_message_op(incoming),"
  GetFontName")) {
		/*
		 * This is the message we expected. 
   * If we're already
		 * busy, reject it. Otherwise activate 
   * the "apply" button.
		 */
		if (replymsg) {
			tt_message_reject(incoming);
			tt_message_destroy(incoming);
			tt_release(ttmark);
			return;
		}
		XtVaSetValues(applyButton, XtNsensitive, 
   TRUE, 0);
		replymsg = incoming;
		tt_release(ttmark);
		return;
	}

	/*
	 * This is not a message we recognize.
	 * If it's 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);
	tt_release(ttmark);
}

/*
 * Called when the Apply button is pressed. 
 * Replies to the outstanding
 * message and turn off the Apply button.
 */

/* ARGSUSED */
void ReplyToMessage(w, msg, wdata)
 Widget w;
 caddr_t msg;
 caddr_t wdata;
{

	tt_message_arg_val_set(replymsg, 0, 
currentFontNameString);
	tt_message_reply(replymsg);
	tt_message_destroy(replymsg);
	replymsg = 0;
	XtVaSetValues(applyButton, XtNsensitive, FALSE,
 0);
}

 
 
 
  Previous   Contents   Next