|
Packit |
b099d7 |
/* $XConsortium: geoManage.c /main/4 1995/07/15 21:13:27 drk $ */
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Motif
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Copyright (c) 1987-2012, The Open Group. All rights reserved.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* These libraries and programs are free software; you can
|
|
Packit |
b099d7 |
* redistribute them and/or modify them under the terms of the GNU
|
|
Packit |
b099d7 |
* Lesser General Public License as published by the Free Software
|
|
Packit |
b099d7 |
* Foundation; either version 2 of the License, or (at your option)
|
|
Packit |
b099d7 |
* any later version.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* These libraries and programs are distributed in the hope that
|
|
Packit |
b099d7 |
* they will be useful, but WITHOUT ANY WARRANTY; without even the
|
|
Packit |
b099d7 |
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
Packit |
b099d7 |
* PURPOSE. See the GNU Lesser General Public License for more
|
|
Packit |
b099d7 |
* details.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit |
b099d7 |
* License along with these librararies and programs; if not, write
|
|
Packit |
b099d7 |
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
|
|
Packit |
b099d7 |
* Floor, Boston, MA 02110-1301 USA
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* HISTORY
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#include "IntrinsicI.h"
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#include "geoTattler.h"
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static String XtNinvalidChild = "invalidChild";
|
|
Packit |
b099d7 |
static String XtNxtUnmanageChildren = "xtUnmanageChildren";
|
|
Packit |
b099d7 |
static String XtNxtManageChildren = "xtManageChildren";
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void XtUnmanageChildren(children, num_children)
|
|
Packit |
b099d7 |
WidgetList children;
|
|
Packit |
b099d7 |
Cardinal num_children;
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
register CompositeWidget parent;
|
|
Packit |
b099d7 |
register Widget child;
|
|
Packit |
b099d7 |
register Cardinal num_unique_children, i;
|
|
Packit |
b099d7 |
XtWidgetProc change_managed;
|
|
Packit |
b099d7 |
Bool parent_realized;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (num_children == 0) return;
|
|
Packit |
b099d7 |
if (children[0] == NULL) {
|
|
Packit |
b099d7 |
XtWarningMsg(XtNinvalidChild,XtNxtUnmanageChildren,XtCXtToolkitError,
|
|
Packit |
b099d7 |
"Null child passed to XtUnmanageChildren",
|
|
Packit |
b099d7 |
(String *)NULL, (Cardinal *)NULL);
|
|
Packit |
b099d7 |
return;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
parent = (CompositeWidget) children[0]->core.parent;
|
|
Packit |
b099d7 |
if (parent->core.being_destroyed) return;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (XtIsComposite((Widget) parent)) {
|
|
Packit |
b099d7 |
change_managed = ((CompositeWidgetClass) parent->core.widget_class)
|
|
Packit |
b099d7 |
->composite_class.change_managed;
|
|
Packit |
b099d7 |
parent_realized = XtIsRealized((Widget)parent);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
num_unique_children = 0;
|
|
Packit |
b099d7 |
for (i = 0; i < num_children; i++) {
|
|
Packit |
b099d7 |
child = children[i];
|
|
Packit |
b099d7 |
if (child == NULL) {
|
|
Packit |
b099d7 |
XtAppWarningMsg(XtWidgetToApplicationContext((Widget)parent),
|
|
Packit |
b099d7 |
XtNinvalidChild,XtNxtUnmanageChildren,XtCXtToolkitError,
|
|
Packit |
b099d7 |
"Null child passed to XtUnmanageChildren",
|
|
Packit |
b099d7 |
(String *)NULL, (Cardinal *)NULL);
|
|
Packit |
b099d7 |
return;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if ((CompositeWidget) child->core.parent != parent) {
|
|
Packit |
b099d7 |
XtAppWarningMsg(XtWidgetToApplicationContext((Widget)parent),
|
|
Packit |
b099d7 |
"ambiguousParent",XtNxtUnmanageChildren,XtCXtToolkitError,
|
|
Packit |
b099d7 |
"Not all children have same parent in XtUnmanageChildren",
|
|
Packit |
b099d7 |
(String *)NULL, (Cardinal *)NULL);
|
|
Packit |
b099d7 |
} else
|
|
Packit |
b099d7 |
if (child->core.managed) {
|
|
Packit |
b099d7 |
num_unique_children++;
|
|
Packit |
b099d7 |
_GeoPrintTrace(child,"Child \"%s\" is marked unmanaged\n", XtName(child));
|
|
Packit |
b099d7 |
child->core.managed = FALSE;
|
|
Packit |
b099d7 |
if (XtIsWidget(child)
|
|
Packit |
b099d7 |
&& XtIsRealized(child)
|
|
Packit |
b099d7 |
&& child->core.mapped_when_managed)
|
|
Packit |
b099d7 |
XtUnmapWidget(child);
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
{ /* RectObj child */
|
|
Packit |
b099d7 |
Widget pw = child->core.parent;
|
|
Packit |
b099d7 |
RectObj r = (RectObj) child;
|
|
Packit |
b099d7 |
while ((pw!=NULL) && (!XtIsWidget(pw))) pw = pw->core.parent;
|
|
Packit |
b099d7 |
if ((pw!=NULL) && XtIsRealized (pw))
|
|
Packit |
b099d7 |
XClearArea (XtDisplay (pw), XtWindow (pw),
|
|
Packit |
b099d7 |
r->rectangle.x, r->rectangle.y,
|
|
Packit |
b099d7 |
r->rectangle.width + (r->rectangle.border_width << 1),
|
|
Packit |
b099d7 |
r->rectangle.height + (r->rectangle.border_width << 1),
|
|
Packit |
b099d7 |
TRUE);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (num_unique_children != 0 && change_managed != NULL && parent_realized) {
|
|
Packit |
b099d7 |
_GeoPrintTrace((Widget)parent,"Call parent: \"%s\"[%d,%d]'s changemanaged proc\n", XtName((Widget)parent),parent->core.width,parent->core.height);
|
|
Packit |
b099d7 |
(*change_managed) ((Widget)parent);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
} /* XtUnmanageChildren */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void XtUnmanageChild(child)
|
|
Packit |
b099d7 |
Widget child;
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XtUnmanageChildren(&child, (Cardinal)1);
|
|
Packit |
b099d7 |
} /* XtUnmanageChild */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void XtManageChildren(children, num_children)
|
|
Packit |
b099d7 |
WidgetList children;
|
|
Packit |
b099d7 |
Cardinal num_children;
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
#define MAXCHILDREN 100
|
|
Packit |
b099d7 |
register CompositeWidget parent;
|
|
Packit |
b099d7 |
register Widget child;
|
|
Packit |
b099d7 |
register Cardinal num_unique_children, i;
|
|
Packit |
b099d7 |
XtWidgetProc change_managed;
|
|
Packit |
b099d7 |
register WidgetList unique_children;
|
|
Packit |
b099d7 |
Widget cache[MAXCHILDREN];
|
|
Packit |
b099d7 |
Bool parent_realized;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (num_children == 0) return;
|
|
Packit |
b099d7 |
if (children[0] == NULL) {
|
|
Packit |
b099d7 |
XtWarningMsg(XtNinvalidChild,XtNxtManageChildren,XtCXtToolkitError,
|
|
Packit |
b099d7 |
"null child passed to XtManageChildren",
|
|
Packit |
b099d7 |
(String *)NULL, (Cardinal *)NULL);
|
|
Packit |
b099d7 |
return;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
parent = (CompositeWidget) children[0]->core.parent;
|
|
Packit |
b099d7 |
if (XtIsComposite((Widget) parent)) {
|
|
Packit |
b099d7 |
change_managed = ((CompositeWidgetClass) parent->core.widget_class)
|
|
Packit |
b099d7 |
->composite_class.change_managed;
|
|
Packit |
b099d7 |
parent_realized = XtIsRealized((Widget)parent);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
XtAppErrorMsg(XtWidgetToApplicationContext((Widget)parent),
|
|
Packit |
b099d7 |
"invalidParent",XtNxtManageChildren, XtCXtToolkitError,
|
|
Packit |
b099d7 |
"Attempt to manage a child when parent is not Composite",
|
|
Packit |
b099d7 |
(String *) NULL, (Cardinal *) NULL);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (parent->core.being_destroyed) return;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Construct new list of children that really need to be operated upon. */
|
|
Packit |
b099d7 |
if (num_children <= MAXCHILDREN) {
|
|
Packit |
b099d7 |
unique_children = cache;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
unique_children = (WidgetList) XtMalloc(num_children * sizeof(Widget));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
num_unique_children = 0;
|
|
Packit |
b099d7 |
for (i = 0; i < num_children; i++) {
|
|
Packit |
b099d7 |
child = children[i];
|
|
Packit |
b099d7 |
if (child == NULL) {
|
|
Packit |
b099d7 |
XtAppWarningMsg(XtWidgetToApplicationContext((Widget)parent),
|
|
Packit |
b099d7 |
XtNinvalidChild,XtNxtManageChildren,XtCXtToolkitError,
|
|
Packit |
b099d7 |
"null child passed to XtManageChildren",
|
|
Packit |
b099d7 |
(String *)NULL, (Cardinal *)NULL);
|
|
Packit |
b099d7 |
if (unique_children != cache) XtFree((char *) unique_children);
|
|
Packit |
b099d7 |
return;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
#ifdef DEBUG
|
|
Packit |
b099d7 |
if (!XtIsRectObj(child)) {
|
|
Packit |
b099d7 |
String params[2];
|
|
Packit |
b099d7 |
Cardinal num_params = 2;
|
|
Packit |
b099d7 |
params[0] = XtName(child);
|
|
Packit |
b099d7 |
params[1] = child->core.widget_class->core_class.class_name;
|
|
Packit |
b099d7 |
XtAppWarningMsg(XtWidgetToApplicationContext((Widget)parent),
|
|
Packit |
b099d7 |
"notRectObj",XtNxtManageChildren,XtCXtToolkitError,
|
|
Packit |
b099d7 |
"child \"%s\", class %s is not a RectObj",
|
|
Packit |
b099d7 |
params, &num_params);
|
|
Packit |
b099d7 |
continue;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
#endif /*DEBUG*/
|
|
Packit |
b099d7 |
if ((CompositeWidget) child->core.parent != parent) {
|
|
Packit |
b099d7 |
XtAppWarningMsg(XtWidgetToApplicationContext((Widget)parent),
|
|
Packit |
b099d7 |
"ambiguousParent",XtNxtManageChildren,XtCXtToolkitError,
|
|
Packit |
b099d7 |
"Not all children have same parent in XtManageChildren",
|
|
Packit |
b099d7 |
(String *)NULL, (Cardinal *)NULL);
|
|
Packit |
b099d7 |
} else if (! child->core.managed && !child->core.being_destroyed) {
|
|
Packit |
b099d7 |
unique_children[num_unique_children++] = child;
|
|
Packit |
b099d7 |
child->core.managed = TRUE;
|
|
Packit |
b099d7 |
_GeoPrintTrace(child,"Child \"%s\"[%d,%d] is marked managed\n", XtName(child),child->core.width,child->core.height);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (num_unique_children != 0 && parent_realized) {
|
|
Packit |
b099d7 |
/* Compute geometry of new managed set of children. */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (change_managed != NULL) {
|
|
Packit |
b099d7 |
_GeoPrintTrace((Widget)parent,"Call parent: \"%s\"[%d,%d]'s changemanaged\n", XtName((Widget)parent), parent->core.width,parent->core.height);
|
|
Packit |
b099d7 |
(*change_managed) ((Widget)parent);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Realize each child if necessary, then map if necessary */
|
|
Packit |
b099d7 |
for (i = 0; i < num_unique_children; i++) {
|
|
Packit |
b099d7 |
child = unique_children[i];
|
|
Packit |
b099d7 |
if (XtIsWidget(child)) {
|
|
Packit |
b099d7 |
if (! XtIsRealized(child)) {
|
|
Packit |
b099d7 |
XtRealizeWidget(child);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (child->core.mapped_when_managed) XtMapWidget(child);
|
|
Packit |
b099d7 |
} else { /* RectObj child */
|
|
Packit |
b099d7 |
Widget pw = child->core.parent;
|
|
Packit |
b099d7 |
RectObj r = (RectObj) child;
|
|
Packit |
b099d7 |
while ((pw!=NULL) && (!XtIsWidget(pw)))
|
|
Packit |
b099d7 |
pw = pw->core.parent;
|
|
Packit |
b099d7 |
if (pw != NULL)
|
|
Packit |
b099d7 |
XClearArea (XtDisplay (pw), XtWindow (pw),
|
|
Packit |
b099d7 |
r->rectangle.x, r->rectangle.y,
|
|
Packit |
b099d7 |
r->rectangle.width + (r->rectangle.border_width << 1),
|
|
Packit |
b099d7 |
r->rectangle.height + (r->rectangle.border_width << 1),
|
|
Packit |
b099d7 |
TRUE);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (unique_children != cache) XtFree((char *) unique_children);
|
|
Packit |
b099d7 |
} /* XtManageChildren */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void XtManageChild(child)
|
|
Packit |
b099d7 |
Widget child;
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XtManageChildren(&child, (Cardinal) 1);
|
|
Packit |
b099d7 |
} /* XtManageChild */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#if NeedFunctionPrototypes
|
|
Packit |
b099d7 |
void XtSetMappedWhenManaged(
|
|
Packit |
b099d7 |
register Widget widget,
|
|
Packit |
b099d7 |
_XtBoolean mapped_when_managed
|
|
Packit |
b099d7 |
)
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
void XtSetMappedWhenManaged(widget, mapped_when_managed)
|
|
Packit |
b099d7 |
register Widget widget;
|
|
Packit |
b099d7 |
Boolean mapped_when_managed;
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (widget->core.mapped_when_managed == mapped_when_managed) return;
|
|
Packit |
b099d7 |
widget->core.mapped_when_managed = mapped_when_managed;
|
|
Packit |
b099d7 |
if (! XtIsManaged(widget)) return;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (mapped_when_managed) {
|
|
Packit |
b099d7 |
/* Didn't used to be mapped when managed. */
|
|
Packit |
b099d7 |
if (XtIsRealized(widget)) XtMapWidget(widget);
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
/* Used to be mapped when managed. */
|
|
Packit |
b099d7 |
if (XtIsRealized(widget)) XtUnmapWidget(widget);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
} /* XtSetMappedWhenManaged */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|