[comp.windows.x] Problem with XtManageChild and XtUnmanageChild

mikew@neptune.fx.COM (03/22/90)

VERSION:
    	R3/R4
	I tested this on with OSF's R3 Xt Intrinsics, but the R4 code
	doesn't appear to fix this problem.

CLIENT MACHINE and OPERATING SYSTEM:
    	Sun SparcStation, SunOS 4.0.3

DISPLAY TYPE:
    	CG6

WINDOW MANAGER:
    	mwm

AREA:
	Xt/X Protocol

SYNOPSIS:
	XtManageChild followed quickly by XtUnmanageChild fails.

DESCRIPTION:
	When XtManageChild(shell) is called and the XtUnmanageChild(shell) is
	called before the window manager has processed the MapRequest, the
	window remains mapped.

REPEAT BY:
	Here is a sample program complete with a work around that 
	demonstrates this failure. Although this program use Motif widgets
	a very similar program should demonstrate the failure with any widget
	set.
#include <Xm/Xm.h>
#include <Xm/PushB.h>
#include <Xm/Label.h>
#include <Xm/Form.h>


static Widget	popup;
static Widget	form;

static
void
callback(w, clientData, callData)
Widget	w;
caddr_t	clientData;
caddr_t	callData;
{
    XtManageChild(form);
    XtUnmanageChild(form);
    return;
}

void
mapNotify(w, clientData, event)
Widget	w;
caddr_t	clientData;
XEvent *event;
{
    if (event->type != MapNotify)
	return;
    if (XtIsManaged(w))
	return;
    XtUnmapWidget(w);
    return;
}

main(argc, argv)
int	argc;
char  **argv;
{
    Widget	shell;
    Arg		args[10];
    Cardinal	n;
    Widget	w;

    n = 0;
    shell = XtInitialize("test", "Test", args, n, &argc, argv);

    n = 0;
    w = XmCreatePushButton(shell, "Press Me", args, n);
    XtAddCallback(w, XmNactivateCallback, callback, (caddr_t) NULL);
    XtManageChild(w);

    n = 0;
    form = XmCreateFormDialog(shell, "form", args, n);
#ifdef WORK_AROUND
    XtAddEventHandler(XtParent(form), StructureNotifyMask, 
		      False, mapNotify, form);
#endif

    n = 0;
    w = XmCreateLabel(form, "label", args, n);
    XtManageChild(w);

    XtRealizeWidget(shell);
    XtMainLoop();
    return;
}

SAMPLE FIX:
	I can think of two possible fixes. Code similar to the above
	MapNotify funciton can be added to the Shell Widget's EventHandler
	function or an X extension could be designed, speced, reviewed,
	coded, approved and distributed. The X extension would support
	a UnmapWindow request that doesn't get thrown away if the window is 
	already unmapped and the requests are being redirectred with 
	SubStructureRedirect. Also a corresponding MapWindow request could 
	also be added. I would suggest the former as a short term fix and
	the latter as a long term fix.