[comp.windows.x] Popup of a popup BUG.

ephrem@oakhill.UUCP (Ephrem Chemaly) (12/11/90)

I have included a sample source code for a client that crashes.

Here is a brief description of the problem.

I create a motif widget called 'button'.  This widget pops up another widget
'popup1' and 'button' is set to insensitive.  'popup1' is a Selection widget.
If I push the help button in 'popup1', I popup the 'popup2' widget, and set
'popup1' to insensitive.  When I am done, I pop down popup2, and set popup1
to sensitive. Then if I popdown 'popup1' the application crashes.

Why is that?

I have included the source code.  There are two ways to compile this file.

cc -L/usr/local/lib -o learn learn.c -lXm -lXtm -lXmu -lXt -lX11

which works, and

cc -L/usr/local/lib -Dsensitive -o learn learn.c -lXm -lXtm -lXmu -lXt -lX11

which sets the preprocessor's 'sensitive' flag which I use with #ifdef to
compile some extra code.  This does not work.  I get the following error:
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:  0x70001d
  Serial number of failed request:  406
  Current serial number in output stream:  406
So the problem is isolated at the extra line compiled near #ifdef sensitive
which sets popup1 the insensitive.

I see this problem an my Sun 3/260 with X11R4, and A/UX with X11R3.

Please use the address below to reply by e-mail.

Regards,
Ephrem A. Chemaly

+=========================================================================+
| Motorola Inc.                            Ephrem A. Chemaly              |
|                                          6501 William Cannon Drive West |
|                                          Austin, Texas 78735 U.S.A.     |
|                                          Mail Drop: OE-21               |
|                                          (512) 891-2760                 |
|                                                                         |
| Internal Addr: ephrem@soleil-tx (or at) oakhill!soleil-tx!ephrem        |
| Internet Addr: ...!soleil-tx.sps.mot.com!ephrem                         |
| UUCP Address:  oakhill!soleil-tx!ephrem@cs.utexas.edu                   |
+=========================================================================+

----------- THIS IS THE SOURCE CODE BELOW -------------------------------------

/******************************************************************************
*
* Compilation (Method 1 that works):
*       cc -L/usr/local/lib -o learn learn.c -lXm -lXtm -lXmu -lXt -lX11
* Compilation (Method 2 that does not work):
*       cc -L/usr/local/lib -Dsensitive -o learn learn.c -lXm -lXtm -lXmu -lXt -lX11
*
******************************************************************************/

#include <Xm/Xm.h>
#include <Xm/MainW.h>
#include <Xm/Frame.h>
#include <Xm/Form.h>
#include <Xm/DialogS.h>
#include <Xm/RowColumn.h>
#include <Xm/PushB.h>
#include <Xm/SelectioB.h>
#include <Xm/MessageB.h>

Widget	popup1, popup2, button;

/*******************************************************************************
********** Kill2(): Kill the second level.						************
*******************************************************************************/

void Kill2(widget, closure, callData)
Widget widget;
caddr_t closure;		/* unused */
caddr_t callData;		/* unused */
{
XtDestroyWidget(popup2);

XtSetSensitive(popup1, TRUE);

}
/*******************************************************************************
********** Kill1(): Kill the first level.						************
*******************************************************************************/

void Kill1(widget, closure, callData)
Widget widget;
caddr_t closure;		/* unused */
caddr_t callData;		/* unused */
{
XtDestroyWidget(popup1);

XtSetSensitive(button, TRUE);

}
/*******************************************************************************
********** Popup2(): Popup the second level.						************
*******************************************************************************/

void Popup2(widget, closure, callData)
Widget widget;
caddr_t closure;		/* unused */
caddr_t callData;		/* unused */
{
Arg     args[10];
static  XtCallbackRec callback[2];
static	XtCallbackRec KillCallback[2];
int     n;

#ifdef sensitive
XtSetSensitive(widget, FALSE);
#endif

n = 0;
XtSetArg(args[n], XmNautoUnmanage, False); n++;
KillCallback[0].callback = Kill2;
KillCallback[0].closure = (caddr_t)NULL;
XtSetArg(args[n], XmNokCallback, KillCallback); n++;
XtSetArg(args[n], XmNcancelCallback, KillCallback); n++;
XtSetArg(args[n], XmNhelpCallback, KillCallback); n++;
popup2 = XmCreateInformationDialog(widget, "Popup1", args, n);
XtManageChild(popup2);
}
/*******************************************************************************
********** Popup1(): Popup the first level.							************
*******************************************************************************/

void Popup1(widget, closure, callData)
Widget widget;
caddr_t closure;		/* Widget */
caddr_t callData;
{
Arg		args[10];
static	XtCallbackRec HelpCallback[2];
static	XtCallbackRec KillCallback[2];
int		n;

XtSetSensitive(widget, FALSE);

n = 0;
XtSetArg(args[n], XmNautoUnmanage, False); n++;
HelpCallback[0].callback = Popup2;
HelpCallback[0].closure = (caddr_t)NULL;
XtSetArg(args[n], XmNhelpCallback, HelpCallback); n++;
KillCallback[0].callback = Kill1;
KillCallback[0].closure = (caddr_t)NULL;
XtSetArg(args[n], XmNokCallback, KillCallback); n++;
XtSetArg(args[n], XmNcancelCallback, KillCallback); n++;
popup1 = XmCreateSelectionDialog(widget, "Popup1", args, n);
XtManageChild(popup1);
}
/*******************************************************************************
********** main(): main function for this program.					************
*******************************************************************************/

void main(argc, argv)
unsigned int argc;
char **argv;
{
Widget	topLevel, BaseFrame, frame;
Arg		args[10];
static	XtCallbackRec callback[2];
int		n, i;

/* Initialize the X toolkit. */
topLevel = XtInitialize(argv[0], "Learn", NULL, NULL, &argc, argv);
n = 0;
BaseFrame = XtCreateManagedWidget(
			"clientBaseFrame",
			xmMainWindowWidgetClass,
			topLevel,
			args,
			n);

frame = XmCreateFrame(BaseFrame, "Frame", args, n);
XtManageChild(frame);

n = 0;
callback[0].callback = Popup1;
callback[0].closure = (caddr_t)NULL;
XtSetArg(args[n], XmNactivateCallback, callback); n++;
button = XmCreatePushButton(frame, "Button", args, n);
XtManageChild(button);

/* Display the widgets. */
XtRealizeWidget(topLevel);

/* Start the main event loop. */
XtMainLoop();
}

/*
Please use the address below to reply by e-mail.

Regards,
Ephrem A. Chemaly

+=========================================================================+
| Motorola Inc.                            Ephrem A. Chemaly              |
|                                          6501 William Cannon Drive West |
|                                          Austin, Texas 78735 U.S.A.     |
|                                          Mail Drop: OE-21               |
|                                          (512) 891-2760                 |
|                                                                         |
| Internal Addr: ephrem@soleil-tx (or at) oakhill!soleil-tx!ephrem        |
| Internet Addr: ...!soleil-tx.sps.mot.com!ephrem                         |
| UUCP Address:  oakhill!soleil-tx!ephrem@cs.utexas.edu                   |
+=========================================================================+
*/