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); }