[comp.windows.x] X Protocol Problems

skertic@sal-sun55.usc.edu (Robert Skertic) (07/13/89)

Dear X-Community:

We have a protocol problem in our attempt to create 
asciiStringWidgets on two different displays.  When 
we run the program the following error occurs:

Please see X Protocol error:  BadCursor, invalid Cursor parameter
  Major opcode of failed request:  1 (X_CreateWindow)
  Minor opcode of failed request:  0
  Resource id in failed request:  0x90000a
  Serial number of failed request:  42
  Current serial number in output stream:  49

NOTE: If we do not include asciiStringWidgets or textWidgets,
then we do NOT have a problem.

How do we find out what causes this error?  
A Sample Program follows which does create the error.
NOTE:  You must set "xhost" on the terminal you are trying to
connect to.  Compile with, "cc -g -o exm exm.c 
-I/usr/public/X11/include -L/usr/public/X11/lib 
-lXaw -lXmu -lXt -lX11" and execute with 
"exm <bogusfilename> host1:0 host2:0"

Thanks for taking your time to read and answer our
desparate request....Bob Skertic and Duc Truong

REPLY TO:  skertic@merlin.usc.edu
           truong@merlin.usc.edu

NOTE: Documentation Limited Due to Distribution.
--------------Program Follows-------------------
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <X11/Xlib.h>
#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
#include <X11/Xatom.h>
#include <X11/Shell.h>
#include "AsciiText.h"
#include "Command.h"
#include "Box.h"

Widget toplevel1, box1, quit1, showbuf1,
  toplevel2, box2, quit2, showbuf2;

Widget AsciiText1, AsciiText2;

char *filename, *Disp1, *Disp2;
char buffer1[1024], buffer2[1024]; /* strings for the text widgets */

static XrmOptionDescRec flags[] = {
{"-label", "*quit.label", XrmoptionSepArg, NULL}
};

void Msg_Handler()
{
     return;
   }

Syntax(call)
     char *call;
{
  fprintf(stderr, "Bogus flag, hoser: %s\n", call);
}

void Quit(w, client_data, call_data)
     Widget w;
     caddr_t client_data, call_data;
{
  printf("quit called; button data: %s buffer: %s\n", 
	 (char *)client_data, buffer1);
  exit();
}

void DisplayBuffer(w, client_data, call_data)
     Widget w;
     caddr_t client_data, call_data;
{
  XtTextBlock contents;

  printf("button called; button data: %s\n buffer: %s\n", 
	 (char *)client_data, buffer1);

#define geek 1
#ifdef geek
  contents.firstPos = 0;
  contents.length = strlen(buffer1);
  contents.ptr = buffer1;
  contents.format = FMT8BIT;
  XtTextReplace(AsciiText2, 0, strlen(buffer1), &contents);
#endif
}
 
main(argc, argv)
     unsigned int argc;
     char *argv[];
{

  static XtCallbackRec callbacks[] = {
    {Quit, (caddr_t) "some data"}, /* proc name, string to return */
    {NULL, NULL}
  };				/* must be NULL terminated */

  Arg args[25];
  int n = 0;
  XtAppContext context;		/* this test's application context */
  Display *disp1, *disp2;	/* the two displays 
                                   we will connect to  */

  filename = (char *)malloc(1000);
  Disp1 = (char *)malloc(100);
  Disp2 = (char *)malloc(100);
  strcpy(filename, argv[1]);
  strcpy(Disp1, argv[2]);
  strcpy(Disp2, argv[3]);
  XtSetWarningMsgHandler(Msg_Handler);
  XtToolkitInitialize();
  context = XtCreateApplicationContext();
  disp1 = XtOpenDisplay(context, Disp1, "dtest", "Dtest", 
                        NULL, 0, &argc, argv);
  disp2 = XtOpenDisplay(context, Disp2, "dtest", "Dtest", 
                        NULL, 0, &argc, argv);
  toplevel1 = XtAppCreateShell("dtest", "Dtest", 
     applicationShellWidgetClass, disp1, NULL, 0);
  toplevel2 = XtAppCreateShell("dtest", "Dtest", 
     applicationShellWidgetClass, disp2, NULL, 0);
  if(argc != 1) Syntax(filename);
  n = 0;
  box1 = 
    XtCreateManagedWidget("box1", boxWidgetClass, toplevel1,
			  args, n);
  n = 0;
  XtSetArg(args[n], XtNlabel, "quit"); n++;
  XtSetArg(args[n], XtNheight, 100); n++;
  XtSetArg(args[n], XtNwidth, 100); n++;
  quit1 = 
    XtCreateManagedWidget("quit1", commandWidgetClass, box1,
			  args, n);
  XtSetArg(args[n], XtNlabel, "display buffer contents"); n++;
  showbuf1 = 
    XtCreateManagedWidget("showbuf1", commandWidgetClass, box1,
			  args, n);

/*HERE IS PROBLEM CODE, take this out and you can get two displays

  n = 0;
  XtSetArg(args[n], XtNeditType, XttextEdit); n++;
  XtSetArg(args[n], XtNstring, buffer1); n++;
  XtSetArg(args[n], XtNlength, 1000);  n++; 
  XtSetArg(args[n], XtNwidth, 500); n++;
  XtSetArg(args[n], XtNheight, 30); n++;
  XtSetArg(args[n], XtNtextOptions, scrollVertical|scrollOnOverflow);
     n++;
  XtSetArg(args[n], XtNsensitive, True); n++;
  AsciiText1 = 
    XtCreateManagedWidget("text1", asciiStringWidgetClass, box1,
  			  args, n);           

/*Here is the end of PROBLEM CODE*/

  XtAddCallback(quit1, XtNcallback, Quit, "some data");
  XtAddCallback(showbuf1, XtNcallback, DisplayBuffer, "me");
  /* 
   * Create the layout for Display #2
   */
  n = 0;
  box2 = 
    XtCreateManagedWidget("box2", boxWidgetClass, toplevel2,
			  args, n);
  n = 0;
  XtSetArg(args[n], XtNlabel, "quit"); n++;
  XtSetArg(args[n], XtNheight, 100); n++;
  XtSetArg(args[n], XtNwidth, 100); n++;
  quit2 = 
    XtCreateManagedWidget("quit2", commandWidgetClass, box2,
			  args, n);
  XtSetArg(args[n], XtNlabel, "display buffer contents"); n++;
  showbuf2 = 
    XtCreateManagedWidget("showbuf2", commandWidgetClass, box2,
			  args, n);
/*HERE IS PROBLEM CODE, Take this out and you can get two displays
  n = 0;
  XtSetArg(args[n], XtNeditType, XttextEdit); n++;
  XtSetArg(args[n], XtNstring, buffer1); n++;
  XtSetArg(args[n], XtNlength, 1024);  n++; 
  XtSetArg(args[n], XtNwidth, 500); n++;
  XtSetArg(args[n], XtNheight, 30); n++;
  XtSetArg(args[n], XtNtextOptions, scrollVertical|scrollOnOverflow);
     n++;
  XtSetArg(args[n], XtNsensitive, True); n++;
  AsciiText2 = 
    XtCreateManagedWidget("text2", asciiStringWidgetClass, box2,
			  args, n);    
/*HERE is the end of the PROBLEM CODE*/
  XtAddCallback(quit2, XtNcallback, Quit, "some data");
  XtAddCallback(showbuf2, XtNcallback, DisplayBuffer, "him");
  XtRealizeWidget(toplevel1);
  XtRealizeWidget(toplevel2);
  XtAppMainLoop(context);
}