Blame tests/lib/Geometry/geoManage.c

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