[comp.windows.x] Managing/Unmanaging children in a widget

ricks@shambhala.Berkeley.EDU (Rick L Spickelmier) (11/24/88)

Can a composite widget manage children that were not created
at the time the composite widget was realized?

Here are 2 senarios:

1.
- create a box widget
- create two buttons in the box (unmanaged)
- manage one of the buttons (button0)
- in the call back routine for button0, unmanage button0
    and manage button1


2.
- create a box widget
- create one button in the box (unmanaged)
- manage button0
- in the call back routine for button0, unmanage button0,
    and create and manage button1.


Senario 1 works as expected, senario 2 gives an XError in
'XtManageChild' (trying to Map a window with an invalid ID).
Below is an example of this (senario 2, senario 1 can
be realized by moving the button1 creation from the call back
routine to the main routine).


			Rick Spickelmier
			UC Berkeley
			ricks@berkeley.edu



#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
#include <X11/Command.h>
#include <X11/Box.h>

Widget topLevel;
Widget ModeButtonBox;
Widget Buttons[2];

static void
bob(w, c1, c2)
Widget w;
caddr_t c1, c2;
{
    static Arg args1[] = {
	{XtNlabel, (XtArgVal) "button 1"},
    };
    XtUnmanageChild(Buttons[0]);
    Buttons[1] = XtCreateWidget("command", commandWidgetClass,
						 ModeButtonBox,
						 args1, XtNumber(args1));
    XtManageChild(Buttons[1]);
}

main(argc, argv)
int argc;
char **argv;
{
    static Arg frameArgs[] = {
	{XtNx, (XtArgVal) 100},
	{XtNy, (XtArgVal) 100},
    };
    static Arg boxArgs[] = {
	{XtNallowResize, (XtArgVal) False},
    };
    static XtCallbackRec callbacks[] = {
	{bob, NULL},
	{NULL, NULL}
    };
    static Arg args0[] = {
	{XtNlabel, (XtArgVal) "button 0"},
	{XtNcallback, (XtArgVal) callbacks},
    };

    topLevel = XtInitialize("main", "test", 0, 0, &argc, argv);
    
    ModeButtonBox = XtCreateManagedWidget("box", boxWidgetClass, topLevel,
					  boxArgs, XtNumber(boxArgs));

    Buttons[0] = XtCreateWidget("command", commandWidgetClass,
						 ModeButtonBox,
						 args0, XtNumber(args0));
    XtManageChild(Buttons[0]);
    XtRealizeWidget(topLevel);
    XtMainLoop();
    exit(0);
}