[comp.windows.x] bug with TextWidget and scroll bar

envbvs@epb2.lbl.gov (Brian V. Smith) (06/22/89)

The following 'xtalk' program was posted by Yaser Doleh recently.
I tried to make the asciiStringWidgetClass  Text Widget use a vertical
scroll bar, but it seems to clobber the cursor in the window on the 
second display.  It dies with:

X Error:  BadCursor, invalid Cursor parameter
  Request Major code 1 ()
  Request Minor code
  ResourceID 0x170000a
  Error Serial #52
  Current Serial #68

When I remove the XtNtextOptions 'scrollVertical' then it works fine (without
a scrollbar of course).

Is there a known bug in using more than one display with the text widgets?
_____________________________________
Brian V. Smith    (bvsmith@lbl.gov)
Lawrence Berkeley Laboratory
We don't need no signatures!


/* file xtalk.c

        Written by : Yaser Doleh
        Kent State University
        email doleh@kent.edu
        March 15, 1980
*/

#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/IntrinsicP.h>
#include <X11/StringDefs.h>
#include <X11/Cardinals.h>
#include <X11/AsciiText.h>
#include <X11/Box.h>
#include <X11/Command.h>
#include <X11/Label.h>
#include <X11/Shell.h>
#include <X11/cursorfont.h>

#define MAXSIZE 4096
#define WIDTH   500
#define HEIGHT  200

Cursor          cursor1, cursor2;
Display         *dpy1, *dpy2;
Widget          toplevel1, toplevel2, top1, top2, box1, box2, send1, send2, rec1, rec2;
char            sbuf1[MAXSIZE], sbuf2[MAXSIZE], rbuf1[MAXSIZE], rbuf2[MAXSIZE];
XtAppContext    xtalk;

static void xtalk_exit()
{
        exit(0);
}

static  void Beep(w, event, params, nparams)
Widget  w;
XEvent  *event;
String  *params;
Cardinal *nparams;
{
        XBell(XtDisplay(w), 99);
}

main(argc,argv)
int     argc;
char    *argv[];
{
        Arg     args[10];
        char    dpy2name[100];
        int     num_args;
        static XtCallbackRec    callback[][2]={
                                { xtalk_exit, NULL },
                                { NULL, NULL },
                        };

        XtTranslations  trans;
        static char trans_string[] = "<Key>: beep()\n";

        static XtActionsRec actionsList[] = {
                { "beep", Beep },
                { NULL, NULL },
        };

        XtToolkitInitialize();
        xtalk = XtCreateApplicationContext();
        dpy1 = XtOpenDisplay(NULL, NULL, NULL, "XTalk", NULL, 0, &argc, argv);
        if (argc > 1)   /* open second display */
                {
                strcpy(dpy2name,argv[1]);
                if (strchr(dpy2name,':')==NULL)
                        strcat(dpy2name,":0");
                dpy2 = XtOpenDisplay(NULL, dpy2name, NULL, "XTalk", NULL, 0,
                                        &argc, argv);
                if (dpy2 == NULL)
                        {
                        fprintf(stderr,"%s: Can't open display %s\n",argv[0],dpy2name);
                        exit(1);
                        }
                XBell(dpy2, 99);
                XBell(dpy2, 99);
                XFlush(dpy2);
                }
        else
                dpy2 = dpy1;

        XtSetArg( args[0], XtNscreen, DefaultScreenOfDisplay(dpy1));
        num_args=1;
        toplevel1 = XtAppCreateShell("xtalk", "XTalk"  applicationShellWidgetClass,
                        dpy1, args, num_args);

        XtSetArg( args[0], XtNscreen, DefaultScreenOfDisplay(dpy2));
        num_args=1;
        toplevel2 = XtAppCreateShell("xtalk", "XTalk", applicationShellWidgetClass,
                        dpy2, args, num_args);

        top1 = XtCreatePopupShell("xtalk", topLevelShellWidgetClass, toplevel1,
                                NULL, 0);
        top2 = XtCreatePopupShell("xtalk", topLevelShellWidgetClass, toplevel2,
                                NULL, 0);
        box1 = XtCreateWidget("Box1", boxWidgetClass, top1, NULL, 0);
        box2 = XtCreateWidget("Box2", boxWidgetClass, top2, NULL, 0);

        XtSetArg( args[0], XtNborderWidth, 0);
        XtCreateManagedWidget("USER 1", labelWidgetClass, box1, args, 1);
        XtCreateManagedWidget("USER 2", labelWidgetClass, box2, args, 1);

        XtSetArg( args[0], XtNlabel, " Place pointer in top window and type ");
        XtSetArg( args[1], XtNborderWidth, 0);
        XtCreateManagedWidget("label1", labelWidgetClass, box1, args, 2);
        XtCreateManagedWidget("label2", labelWidgetClass, box2, args, 2);

        XtSetArg( args[0], XtNlabel, " EXIT ");
        XtSetArg( args[1], XtNcallback, callback);
        XtSetArg( args[2], XtNborderWidth, 2);
        XtSetArg( args[3], XtNinternalHeight, 3);
        XtCreateManagedWidget("exit 1", commandWidgetClass, box1, args, 4);
        XtCreateManagedWidget("exit 2", commandWidgetClass, box2, args, 4);

        cursor1 = XCreateFontCursor(dpy1, XC_xterm);
        cursor2 = XCreateFontCursor(dpy2, XC_xterm);

        num_args=0;
        XtSetArg( args[num_args], XtNstring, sbuf1); num_args++;
        XtSetArg( args[num_args], XtNwidth, WIDTH); num_args++;
        XtSetArg( args[num_args], XtNheight, HEIGHT);  num_args++;
        XtSetArg( args[num_args], XtNeditType, XttextEdit);   num_args++;
        XtSetArg( args[num_args], XtNlength, MAXSIZE);   num_args++;
        XtSetArg( args[num_args], XtNcursor, cursor1); num_args++;
        XtSetArg( args[num_args], XtNtextOptions, wordBreak); num_args++;
/*****************************************************************************/
/* The following seems to cause the cursor in the window on the second display
    to become invalid.  */

        XtSetArg( args[num_args], XtNtextOptions, scrollVertical); num_args++;
/*****************************************************************************/

        send1 = XtCreateManagedWidget("send1", asciiStringWidgetClass,
                                box1, args, num_args);

        XtSetArg( args[0], XtNstring, rbuf1);
        rec1 = XtCreateManagedWidget("rec1", asciiStringWidgetClass,
                                box1, args, num_args);

        XtSetArg( args[0], XtNstring, sbuf2);
        XtSetArg( args[5], XtNcursor, cursor2);
        send2 = XtCreateManagedWidget("send2", asciiStringWidgetClass,
                                box2, args, num_args);

        XtSetArg( args[0], XtNstring, rbuf2);
        rec2 = XtCreateManagedWidget("rec2", asciiStringWidgetClass,
                                box2, args, num_args);

        XtManageChild(box1);
        XtManageChild(box2);
        XtRealizeWidget(top1);
        XtRealizeWidget(top2);
        XtPopup(top1, XtGrabNonexclusive);
        XtPopup(top2, XtGrabNonexclusive);

        XtAddActions(actionsList, XtNumber(actionsList));
        trans = XtParseTranslationTable(trans_string);
        XtOverrideTranslations(rec1, trans);
        XtOverrideTranslations(rec2, trans);

        while(1) {
                XEvent  event;
                XtTextBlock     text;

                XtNextEvent(&event);
                XtDispatchEvent(&event);
                text.firstPos = 0;
                text.ptr = sbuf1;
                text.length = strlen(sbuf1);
                XtTextReplace(rec2, 0, text.length, &text);
                text.firstPos = 0;
                text.ptr = sbuf2;
                text.length = strlen(sbuf2);
                XtTextReplace(rec1, 0, text.length, &text);
        }



}

swick@ATHENA.MIT.EDU (Ralph R. Swick) (06/23/89)

> Is there a known bug in using more than one display with the text widgets?

Actually, the bug is in XmuCvtStringToCursor; somewhere just before R3
an edit got lost that causes this routine to return the same Cursor
resource for two different servers - definitely a no-no.
(The version in Xt works).