[comp.windows.x.motif] Possible Motif XmTextField bug?

andrew@epps.kodak.com (Andrew Lukasik) (03/12/91)

Does anyone have experiece changing XmTextField background and foreground
colors? I am getting "X Error or failed request" errors from deep down
in Motif.

My application is trying to do simple integer validation on an XmTextField
motionVerifyCallback. If the user enters a character into this field
I want to provide visual feeback of the error by briefly changing
the backround color to red and then back to it's original value.
I've gotten this to work nicely except that on occasion I get Xerrors
and die. The color will change to red and then back for me but when I
go to add the next valid character (an integer) I get an X error and croak.
This does not always happen on the first try. I've managed to isolate the
source of the error to somewhere down inside Motif by doing the following:

I've run my application in "-synchronous" mode and the error 
I get is:
 X Error of failed request:  BadDrawable (invalid Pixmap or Window parameter)
   Major opcode of failed request:  62 (X_CopyArea)
   Minor opcode of failed request:  0
   Resource id in failed request:  0x13000ad
   Serial number of failed request:  1756
   Current serial number in output stream:  1757

a breakpoint in 'exit()' allows me to reveal the following stack trace:
	(dbx) where
	exit(0x1) at 0xab11c
	_XDefaultError() at 0xa7005
	_XError(0x128b2c, 0xdfff07c) at 0xa7067
	_XReply() at 0xa64e1
	XSync(0x128b2c, 0x0) at 0xa497d
	_XSyncFunction(0x128b2c) at 0xa49c7
	XCopyArea(0x128b2c, 0x13000ad, 0x1300074, 0x16776c, 0x0, 0x0, 0x5, 0xe, 0x13, 0x4) at 0x9c5e1
	`TextF`PaintCursor() at 0x68051
	ChangeBlinkBehavior(0x179ba8, 0x0) at 0x68219
	TextFieldExpose(0x179ba8, 0xdfff610, 0x12a040) at 0x6d2b5
	SendExposureEvent() at 0x86071
	CompressExposures(0xdfff610, 0x179ba8, 0x12e8e0) at 0x85ffb
	DispatchEvent() at 0x85d49
	DecideToDispatch(0xdfff610) at 0x862b5
	XtDispatchEvent(0xdfff610) at 0x863e5
	XtAppMainLoop(0x127c34) at 0x86663
	XtMainLoop() at 0x8663b
	MainLoop__17DialogInterpreterFv(__0this = 0xe007e), line 290 in "DialogC.C"
	main(__0argc = 2, __0argv = 0xdfff6a8, 0xdfff6b4), line 87 in "Dialog.C"

I suspect from looking at this that there may be some bug in Motif's
handling of the exposure caused by the background repainting. If I turn the
text cursor off alltogether it works just fine, 'cept you can't see where
you're about to type :-(. I tried turning the cursor off before changing the 
background and on again after changing it back with limited success. This
seemd to work but when I complicated things more by posting an warning 
dialog after the third error the crash returned. I tried various
combinations of turning the cursor on and off from various places but
to no avail.

So, Is this a known bug?  Am I doing something dreadfully wrong? Anyone
else experience this problem? 

I've enclosed a snippet of code showing how I've attempted to do this.
I had to add the XtAppAddTimeOut() so server could grab a few cycles
to change the background color for me.  Could this be part of the problem??

  .
  .
  .
    XmTextVerifyCallbackStruct  *xmt;
    XmTextBlockRec              *tblk;

    xmt = (XmTextVerifyCallbackStruct *)call_data;
    tblk = (XmTextBlockRec *)xmt->text;

	.
	.
	.
	.

           if(!isdigit(*(tblk->ptr)))
           {
                // when we set the doit field to false this prevents
                // the character from being inserted into the widget
                xmt->doit = FALSE;
                errorCount++;
                if (errorCount >= errorThreshold)
                {
                    // if our error count passes the threshold value
                    // popup a warning,
                    // change the background and foreground color of
                    // the widget.
                    XtVaSetValues(widgetId, XmNbackground, warningColor,
                                            XmNforeground, bgColor, NULL);

                    // leave the colors inverted till the user takes
                    // down the warning
                    di.PopUpValidateIntegerWarning();
                }
                else
                {
                    // Just quickly change the background color
                    // so the user has visual feedback that he
                    // did something wrong.
                    XtVaSetValues(widgetId, XmNbackground, warningColor,
                                            XmNforeground, bgColor, NULL);


                    // Call a time out to let the color change
                    // take effect.
                    // rePaint will be called affter the timeout
                    // and will change the color back to default.
                    // Pass the widgetId so we can retreive ui widget
                    // id and use it to get the colors to restore.
                    XtAppAddTimeOut(XtWidgetToApplicationContext(widgetId),
                                   100,
                                   (XtTimerCallbackProc) rePaint,
                                   (XtPointer) widgetId);
                }

            } // end is not a good value (is not an integer)
  .
  .
  .


XtTimerCallbackProc rePaint(Widget w)
{
XtPointer   uiWidget;

    // Get the ui widget object id out of the motif widget
    XtVaGetValues(w, XmNuserData, &uiWidget, NULL);

    // The widget has the correct (original) color id's stored
    XtVaSetValues(w,
                  XmNbackground, ((GenericWidget *) uiWidget)->bgColor,
                  XmNforeground, ((GenericWidget *) uiWidget)->fgColor,
                  NULL);

}


Thanks in advance for any help. I will glady sumarize and post to the
net any responses.

Andrew
-- 
-------------------------------------------------------------------------
Andrew Lukasik <andrew@epps.kodak.com>                Voice: 508-670-4019
Atex Advanced Publishing Systems                        Fax: 508-670-4033
Atex, Inc; 165 Lexington St. MS 400/165L; Billerica MA 01821
--
-------------------------------------------------------------------------
Andrew Lukasik <andrew@epps.kodak.com>                Voice: 508-670-4019
Atex Advanced Publishing Systems                        Fax: 508-670-4033
Atex, Inc; 165 Lexington St. MS 400/165L; Billerica MA 01821