Geometry.c revision 249c3046
1444c061aSmrg/***********************************************************
2249c3046SmrgCopyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
31477040fSmrg
41477040fSmrgPermission is hereby granted, free of charge, to any person obtaining a
51477040fSmrgcopy of this software and associated documentation files (the "Software"),
61477040fSmrgto deal in the Software without restriction, including without limitation
71477040fSmrgthe rights to use, copy, modify, merge, publish, distribute, sublicense,
81477040fSmrgand/or sell copies of the Software, and to permit persons to whom the
91477040fSmrgSoftware is furnished to do so, subject to the following conditions:
101477040fSmrg
111477040fSmrgThe above copyright notice and this permission notice (including the next
121477040fSmrgparagraph) shall be included in all copies or substantial portions of the
131477040fSmrgSoftware.
141477040fSmrg
151477040fSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
161477040fSmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
171477040fSmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
181477040fSmrgTHE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
191477040fSmrgLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
201477040fSmrgFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
211477040fSmrgDEALINGS IN THE SOFTWARE.
221477040fSmrg
231477040fSmrgCopyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
24444c061aSmrg
25444c061aSmrg                        All Rights Reserved
26444c061aSmrg
27444c061aSmrgPermission to use, copy, modify, and distribute this software and its
28444c061aSmrgdocumentation for any purpose and without fee is hereby granted,
29444c061aSmrgprovided that the above copyright notice appear in all copies and that
30444c061aSmrgboth that copyright notice and this permission notice appear in
311477040fSmrgsupporting documentation, and that the name of Digital not be
32444c061aSmrgused in advertising or publicity pertaining to distribution of the
33444c061aSmrgsoftware without specific, written prior permission.
34444c061aSmrg
35444c061aSmrgDIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
36444c061aSmrgALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
37444c061aSmrgDIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
38444c061aSmrgANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
39444c061aSmrgWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
40444c061aSmrgARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
41444c061aSmrgSOFTWARE.
42444c061aSmrg
43444c061aSmrg******************************************************************/
44444c061aSmrg
45444c061aSmrg/*
46444c061aSmrg
47444c061aSmrgCopyright 1987, 1988, 1994, 1998  The Open Group
48444c061aSmrg
49444c061aSmrgPermission to use, copy, modify, distribute, and sell this software and its
50444c061aSmrgdocumentation for any purpose is hereby granted without fee, provided that
51444c061aSmrgthe above copyright notice appear in all copies and that both that
52444c061aSmrgcopyright notice and this permission notice appear in supporting
53444c061aSmrgdocumentation.
54444c061aSmrg
55444c061aSmrgThe above copyright notice and this permission notice shall be included in
56444c061aSmrgall copies or substantial portions of the Software.
57444c061aSmrg
58444c061aSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
59444c061aSmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
60444c061aSmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
61444c061aSmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
62444c061aSmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
63444c061aSmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
64444c061aSmrg
65444c061aSmrgExcept as contained in this notice, the name of The Open Group shall not be
66444c061aSmrgused in advertising or otherwise to promote the sale, use or other dealings
67444c061aSmrgin this Software without prior written authorization from The Open Group.
68444c061aSmrg
69444c061aSmrg*/
70444c061aSmrg
71444c061aSmrg#ifdef HAVE_CONFIG_H
72444c061aSmrg#include <config.h>
73444c061aSmrg#endif
74444c061aSmrg#include "IntrinsicI.h"
75444c061aSmrg#include "ShellP.h"
76444c061aSmrg#include "ShellI.h"
77444c061aSmrg
78444c061aSmrgstatic void ClearRectObjAreas(
79444c061aSmrg    RectObj r,
80444c061aSmrg    XWindowChanges* old)
81444c061aSmrg{
82444c061aSmrg    Widget pw = _XtWindowedAncestor((Widget)r);
83444c061aSmrg    int bw2;
84444c061aSmrg
85444c061aSmrg    bw2 = old->border_width << 1;
86444c061aSmrg    XClearArea( XtDisplay(pw), XtWindow(pw),
87444c061aSmrg		old->x, old->y,
88444c061aSmrg		old->width + bw2, old->height + bw2,
89444c061aSmrg		TRUE );
90444c061aSmrg
91444c061aSmrg    bw2 = r->rectangle.border_width << 1;
92444c061aSmrg    XClearArea( XtDisplay(pw), XtWindow(pw),
93444c061aSmrg		(int)r->rectangle.x, (int)r->rectangle.y,
94444c061aSmrg		(unsigned int)(r->rectangle.width + bw2),
95444c061aSmrg	        (unsigned int)(r->rectangle.height + bw2),
96444c061aSmrg		TRUE );
97444c061aSmrg}
98444c061aSmrg
99444c061aSmrg/*
100444c061aSmrg * Internal function used by XtMakeGeometryRequest and XtSetValues.
101444c061aSmrg * Returns more data than the public interface.  Does not convert
102444c061aSmrg * XtGeometryDone to XtGeometryYes.
103444c061aSmrg *
104444c061aSmrg * clear_rect_obj - *** RETURNED ***
105444c061aSmrg *		    TRUE if the rect obj has been cleared, false otherwise.
106444c061aSmrg */
107444c061aSmrg
108444c061aSmrgXtGeometryResult
109444c061aSmrg_XtMakeGeometryRequest (
110444c061aSmrg    Widget widget,
111444c061aSmrg    XtWidgetGeometry *request,
112444c061aSmrg    XtWidgetGeometry *reply,
113444c061aSmrg    Boolean * clear_rect_obj)
114444c061aSmrg{
115444c061aSmrg    XtWidgetGeometry    junk;
116444c061aSmrg    XtGeometryHandler manager = (XtGeometryHandler) NULL;
117444c061aSmrg    XtGeometryResult returnCode;
118444c061aSmrg    Widget parent = widget->core.parent;
119444c061aSmrg    Boolean managed, parentRealized, rgm = False;
120444c061aSmrg    XtConfigureHookDataRec req;
121444c061aSmrg    Widget hookobj;
122444c061aSmrg
123444c061aSmrg    *clear_rect_obj = FALSE;
124444c061aSmrg
125444c061aSmrg    CALLGEOTAT(_XtGeoTrace(widget,
126444c061aSmrg	"\"%s\" is making a %sgeometry request to its parent \"%s\".\n",
127444c061aSmrg		   XtName(widget),
128444c061aSmrg		   ((request->request_mode & XtCWQueryOnly))? "query only ":"",
129444c061aSmrg		   (XtParent(widget))?XtName(XtParent(widget)):"Root"));
130444c061aSmrg    CALLGEOTAT(_XtGeoTab(1));
131444c061aSmrg
132444c061aSmrg    if (XtIsShell(widget)) {
133444c061aSmrg	ShellClassExtension ext;
134444c061aSmrg	LOCK_PROCESS;
135444c061aSmrg	for (ext = (ShellClassExtension)((ShellWidgetClass)XtClass(widget))
136444c061aSmrg		   ->shell_class.extension;
137444c061aSmrg	     ext != NULL && ext->record_type != NULLQUARK;
138444c061aSmrg	     ext = (ShellClassExtension)ext->next_extension);
139444c061aSmrg
140444c061aSmrg	if (ext != NULL) {
141444c061aSmrg	    if (  ext->version == XtShellExtensionVersion
142444c061aSmrg		  && ext->record_size == sizeof(ShellClassExtensionRec)) {
143444c061aSmrg		manager = ext->root_geometry_manager;
144444c061aSmrg		rgm = True;
145444c061aSmrg	    } else {
146444c061aSmrg		String params[1];
147444c061aSmrg		Cardinal num_params = 1;
148444c061aSmrg		params[0] = XtClass(widget)->core_class.class_name;
149444c061aSmrg		XtAppErrorMsg(XtWidgetToApplicationContext(widget),
150444c061aSmrg		     "invalidExtension", "xtMakeGeometryRequest",
151444c061aSmrg		     XtCXtToolkitError,
152444c061aSmrg		     "widget class %s has invalid ShellClassExtension record",
153444c061aSmrg		     params, &num_params);
154444c061aSmrg	    }
155444c061aSmrg	} else {
156444c061aSmrg	    XtAppErrorMsg(XtWidgetToApplicationContext(widget),
157444c061aSmrg			  "internalError", "xtMakeGeometryRequest",
158444c061aSmrg			  XtCXtToolkitError,
159444c061aSmrg			  "internal error; ShellClassExtension is NULL",
160444c061aSmrg			  NULL, NULL);
161444c061aSmrg	}
162444c061aSmrg	managed = True;
163444c061aSmrg	parentRealized = TRUE;
164444c061aSmrg	UNLOCK_PROCESS;
165444c061aSmrg    } else /* not shell */ {
166444c061aSmrg	if (parent == NULL)
167444c061aSmrg	    XtAppErrorMsg(XtWidgetToApplicationContext(widget),
168444c061aSmrg			  "invalidParent","xtMakeGeometryRequest",
169444c061aSmrg			  XtCXtToolkitError,
170444c061aSmrg			  "non-shell has no parent in XtMakeGeometryRequest",
171444c061aSmrg			  (String *)NULL, (Cardinal *)NULL);
172444c061aSmrg
173444c061aSmrg	managed = XtIsManaged(widget);
174444c061aSmrg	parentRealized = XtIsRealized(parent);
175444c061aSmrg	if (XtIsComposite(parent))
176444c061aSmrg	{
177444c061aSmrg	    LOCK_PROCESS;
178444c061aSmrg	    manager = ((CompositeWidgetClass) (parent->core.widget_class))
179444c061aSmrg		      ->composite_class.geometry_manager;
180444c061aSmrg	    UNLOCK_PROCESS;
181444c061aSmrg	}
182444c061aSmrg    }
183444c061aSmrg
184444c061aSmrg#if 0
185444c061aSmrg    /*
186444c061aSmrg     * The Xt spec says that these conditions must generate
187444c061aSmrg     * error messages (not warnings), but many Xt applications
188444c061aSmrg     * and toolkits (including parts of Xaw, Motif and Netscape)
189444c061aSmrg     * depend on the previous Xt behaviour.  Thus, these tests
190444c061aSmrg     * should probably remain disabled.
191444c061aSmrg     */
192444c061aSmrg    if (parentRealized && managed) {
193444c061aSmrg	if (parent && !XtIsComposite(parent))
194444c061aSmrg	{
195444c061aSmrg	    /*
196444c061aSmrg	     * This shouldn't ever happen, we only test for this to pass
197444c061aSmrg	     * VSW5.  Normally managing the widget will catch this, but VSW5
198444c061aSmrg	     * does some really screwy stuff to get here.
199444c061aSmrg	     */
200444c061aSmrg	    XtAppErrorMsg(XtWidgetToApplicationContext(widget),
201444c061aSmrg			  "invalidParent", "xtMakeGeometryRequest",
202444c061aSmrg			  XtCXtToolkitError,
203444c061aSmrg			  "XtMakeGeometryRequest - parent not composite",
204444c061aSmrg			  (String *)NULL, (Cardinal *)NULL);
205444c061aSmrg	}
206444c061aSmrg	else if (manager == (XtGeometryHandler) NULL)
207444c061aSmrg	{
208444c061aSmrg	    XtAppErrorMsg(XtWidgetToApplicationContext(widget),
209444c061aSmrg			  "invalidGeometryManager","xtMakeGeometryRequest",
210444c061aSmrg			  XtCXtToolkitError,
211444c061aSmrg			  "XtMakeGeometryRequest - parent has no geometry manager",
212444c061aSmrg			  (String *)NULL, (Cardinal *)NULL);
213444c061aSmrg	}
214444c061aSmrg    }
215444c061aSmrg#else
216444c061aSmrg    if (!manager)
217444c061aSmrg	managed = False;
218444c061aSmrg#endif
219444c061aSmrg
220444c061aSmrg    if (widget->core.being_destroyed) {
221444c061aSmrg	CALLGEOTAT(_XtGeoTab(-1));
222444c061aSmrg	CALLGEOTAT(_XtGeoTrace(widget,
223444c061aSmrg		       "It is being destroyed, just return XtGeometryNo.\n"));
224444c061aSmrg	return XtGeometryNo;
225444c061aSmrg    }
226444c061aSmrg
227444c061aSmrg    /* see if requesting anything to change */
228444c061aSmrg    req.changeMask = 0;
229444c061aSmrg    if (request->request_mode & CWStackMode
230444c061aSmrg	&& request->stack_mode != XtSMDontChange) {
231444c061aSmrg	    req.changeMask |= CWStackMode;
232444c061aSmrg	    CALLGEOTAT(_XtGeoTrace(widget,
233444c061aSmrg				   "Asking for a change in StackMode!\n"));
234444c061aSmrg	    if (request->request_mode & CWSibling) {
235444c061aSmrg		XtCheckSubclass(request->sibling, rectObjClass,
236444c061aSmrg				"XtMakeGeometryRequest");
237444c061aSmrg		req.changeMask |= CWSibling;
238444c061aSmrg	    }
239444c061aSmrg    }
240444c061aSmrg    if (request->request_mode & CWX
241444c061aSmrg	&& widget->core.x != request->x) {
242444c061aSmrg	CALLGEOTAT(_XtGeoTrace(widget,
243444c061aSmrg			       "Asking for a change in x: from %d to %d.\n",
244444c061aSmrg			       widget->core.x, request->x));
245444c061aSmrg	req.changeMask |= CWX;
246444c061aSmrg    }
247444c061aSmrg    if (request->request_mode & CWY
248444c061aSmrg	&& widget->core.y != request->y) {
249444c061aSmrg	CALLGEOTAT(_XtGeoTrace(widget,
250444c061aSmrg			       "Asking for a change in y: from %d to %d.\n",
251444c061aSmrg			       widget->core.y, request->y));
252444c061aSmrg	req.changeMask |= CWY;
253444c061aSmrg    }
254444c061aSmrg    if (request->request_mode & CWWidth
255444c061aSmrg	&& widget->core.width != request->width) {
256444c061aSmrg	CALLGEOTAT(_XtGeoTrace(widget,"Asking for a change in width: from %d to %d.\n",
257444c061aSmrg		       widget->core.width, request->width));
258444c061aSmrg	req.changeMask |= CWWidth;
259444c061aSmrg    }
260444c061aSmrg    if (request->request_mode & CWHeight
261444c061aSmrg	&& widget->core.height != request->height) {
262444c061aSmrg	CALLGEOTAT(_XtGeoTrace(widget,
263444c061aSmrg			    "Asking for a change in height: from %d to %d.\n",
264444c061aSmrg			       widget->core.height, request->height));
265444c061aSmrg	req.changeMask |= CWHeight;
266444c061aSmrg    }
267444c061aSmrg    if (request->request_mode & CWBorderWidth
268444c061aSmrg	&& widget->core.border_width != request->border_width){
269444c061aSmrg	CALLGEOTAT(_XtGeoTrace(widget,
270444c061aSmrg		       "Asking for a change in border_width: from %d to %d.\n",
271444c061aSmrg		       widget->core.border_width, request->border_width));
272444c061aSmrg	req.changeMask |= CWBorderWidth;
273444c061aSmrg    }
274444c061aSmrg    if (! req.changeMask) {
275444c061aSmrg	CALLGEOTAT(_XtGeoTrace(widget,
276444c061aSmrg		       "Asking for nothing new,\n"));
277444c061aSmrg	CALLGEOTAT(_XtGeoTab(-1));
278444c061aSmrg	CALLGEOTAT(_XtGeoTrace(widget,
279444c061aSmrg		       "just return XtGeometryYes.\n"));
280444c061aSmrg	return XtGeometryYes;
281444c061aSmrg    }
282444c061aSmrg    req.changeMask |= (request->request_mode & XtCWQueryOnly);
283444c061aSmrg
284444c061aSmrg    if ( !(req.changeMask & XtCWQueryOnly) && XtIsRealized(widget) ) {
285444c061aSmrg	/* keep record of the current geometry so we know what's changed */
286444c061aSmrg	req.changes.x = widget->core.x ;
287444c061aSmrg	req.changes.y = widget->core.y ;
288444c061aSmrg	req.changes.width = widget->core.width ;
289444c061aSmrg	req.changes.height = widget->core.height ;
290444c061aSmrg	req.changes.border_width = widget->core.border_width ;
291444c061aSmrg    }
292444c061aSmrg
293444c061aSmrg    if (!managed || !parentRealized) {
294444c061aSmrg	CALLGEOTAT(_XtGeoTrace(widget,
295444c061aSmrg			       "Not Managed or Parent not realized.\n"));
296444c061aSmrg	/* Don't get parent's manager involved--assume the answer is yes */
297444c061aSmrg	if (req.changeMask & XtCWQueryOnly) {
298444c061aSmrg	    /* He was just asking, don't change anything, just tell him yes */
299444c061aSmrg	    CALLGEOTAT(_XtGeoTrace(widget,"QueryOnly request\n"));
300444c061aSmrg	    CALLGEOTAT(_XtGeoTab(-1));
301444c061aSmrg	    CALLGEOTAT(_XtGeoTrace(widget,"just return XtGeometryYes.\n"));
302444c061aSmrg	    return XtGeometryYes;
303444c061aSmrg	} else {
304444c061aSmrg	    CALLGEOTAT(_XtGeoTrace(widget,
305444c061aSmrg				   "Copy values from request to widget.\n"));
306444c061aSmrg	    /* copy values from request to widget */
307444c061aSmrg	    if (request->request_mode & CWX)
308444c061aSmrg		widget->core.x = request->x;
309444c061aSmrg	    if (request->request_mode & CWY)
310444c061aSmrg		widget->core.y = request->y;
311444c061aSmrg	    if (request->request_mode & CWWidth)
312444c061aSmrg		widget->core.width = request->width;
313444c061aSmrg	    if (request->request_mode & CWHeight)
314444c061aSmrg		widget->core.height = request->height;
315444c061aSmrg	    if (request->request_mode & CWBorderWidth)
316444c061aSmrg		widget->core.border_width = request->border_width;
317444c061aSmrg	    if (!parentRealized) {
318444c061aSmrg		CALLGEOTAT(_XtGeoTab(-1));
319444c061aSmrg		CALLGEOTAT(_XtGeoTrace(widget,"and return XtGeometryYes.\n"));
320444c061aSmrg		return XtGeometryYes;
321444c061aSmrg	    }
322444c061aSmrg	    else returnCode = XtGeometryYes;
323444c061aSmrg	}
324444c061aSmrg    } else {
325444c061aSmrg	/* go ask the widget's geometry manager */
326444c061aSmrg	CALLGEOTAT(_XtGeoTrace(widget,
327444c061aSmrg			       "Go ask the parent geometry manager.\n"));
328444c061aSmrg	if (reply == (XtWidgetGeometry *) NULL) {
329444c061aSmrg	    returnCode = (*manager)(widget, request, &junk);
330444c061aSmrg	} else {
331444c061aSmrg	    returnCode = (*manager)(widget, request, reply);
332444c061aSmrg	}
333444c061aSmrg    }
334444c061aSmrg
335444c061aSmrg    /*
336444c061aSmrg     * If Unrealized, not a XtGeometryYes, or a query-only then we are done.
337444c061aSmrg     */
338444c061aSmrg
339444c061aSmrg    if ((returnCode != XtGeometryYes) ||
340444c061aSmrg	(req.changeMask & XtCWQueryOnly) || !XtIsRealized(widget)) {
341444c061aSmrg
342444c061aSmrg#ifdef XT_GEO_TATTLER
343444c061aSmrg	switch(returnCode){
344444c061aSmrg	case XtGeometryNo:
345444c061aSmrg	    CALLGEOTAT(_XtGeoTab(-1));
346444c061aSmrg	    CALLGEOTAT(_XtGeoTrace(widget,"\"%s\" returns XtGeometryNo.\n",
347444c061aSmrg			  (XtParent(widget))?XtName(XtParent(widget)):"Root"));
348444c061aSmrg            /* check for no change */
349444c061aSmrg            break ;
350444c061aSmrg	case XtGeometryDone:
351444c061aSmrg	    CALLGEOTAT(_XtGeoTab(-1));
352444c061aSmrg	    CALLGEOTAT(_XtGeoTrace(widget,"\"%s\" returns XtGeometryDone.\n",
353444c061aSmrg		        (XtParent(widget))?XtName(XtParent(widget)):"Root"));
354444c061aSmrg            /* check for no change in queryonly */
355444c061aSmrg            break ;
356444c061aSmrg	case XtGeometryAlmost:
357444c061aSmrg	    CALLGEOTAT(_XtGeoTab(-1));
358444c061aSmrg	    CALLGEOTAT(_XtGeoTrace(widget,"\"%s\" returns XtGeometryAlmost.\n",
359444c061aSmrg			 (XtParent(widget))?XtName(XtParent(widget)):"Root"));
360444c061aSmrg	    CALLGEOTAT(_XtGeoTab(1));
361444c061aSmrg	    CALLGEOTAT(_XtGeoTrace(widget,"Proposal: width %d height %d.\n",
362444c061aSmrg			   (reply)?reply->width:junk.width,
363444c061aSmrg			   (reply)?reply->height:junk.height));
364444c061aSmrg	    CALLGEOTAT(_XtGeoTab(-1));
365444c061aSmrg
366444c061aSmrg            /* check for no change */
367444c061aSmrg            break ;
368444c061aSmrg	case XtGeometryYes:
369444c061aSmrg	    if (req.changeMask & XtCWQueryOnly) {
370444c061aSmrg		CALLGEOTAT(_XtGeoTrace(widget,
371444c061aSmrg				"QueryOnly specified, no configuration.\n"));
372444c061aSmrg	    }
373444c061aSmrg            if (!XtIsRealized(widget)) {
374444c061aSmrg		CALLGEOTAT(_XtGeoTrace(widget,
375444c061aSmrg				 "\"%s\" not realized, no configuration.\n",
376444c061aSmrg				 XtName(widget)));
377444c061aSmrg	    }
378444c061aSmrg	    CALLGEOTAT(_XtGeoTab(-1));
379444c061aSmrg            CALLGEOTAT(_XtGeoTrace(widget,"\"%s\" returns XtGeometryYes.\n",
380444c061aSmrg                         (XtParent(widget))?XtName(XtParent(widget)):"Root"));
381444c061aSmrg	    break ;
382444c061aSmrg	}
383444c061aSmrg#endif
384444c061aSmrg	return returnCode;
385444c061aSmrg    }
386444c061aSmrg
387444c061aSmrg    CALLGEOTAT(_XtGeoTab(-1));
388444c061aSmrg    CALLGEOTAT(_XtGeoTrace(widget,"\"%s\" returns XtGeometryYes.\n",
389444c061aSmrg		   (XtParent(widget))?XtName(XtParent(widget)):"Root"));
390444c061aSmrg
391444c061aSmrg    if (XtIsWidget(widget)) {	/* reconfigure the window (if needed) */
392444c061aSmrg
393444c061aSmrg	if (rgm) return returnCode;
394444c061aSmrg
395444c061aSmrg	if (req.changes.x != widget->core.x) {
396444c061aSmrg 	    req.changeMask |= CWX;
397444c061aSmrg 	    req.changes.x = widget->core.x;
398444c061aSmrg	    CALLGEOTAT(_XtGeoTrace(widget,
399444c061aSmrg				   "x changing to %d\n",widget->core.x));
400444c061aSmrg 	}
401444c061aSmrg 	if (req.changes.y != widget->core.y) {
402444c061aSmrg 	    req.changeMask |= CWY;
403444c061aSmrg 	    req.changes.y = widget->core.y;
404444c061aSmrg	    CALLGEOTAT(_XtGeoTrace(widget,
405444c061aSmrg				   "y changing to %d\n",widget->core.y));
406444c061aSmrg 	}
407444c061aSmrg 	if (req.changes.width != widget->core.width) {
408444c061aSmrg 	    req.changeMask |= CWWidth;
409444c061aSmrg 	    req.changes.width = widget->core.width;
410444c061aSmrg	    CALLGEOTAT(_XtGeoTrace(widget,
411444c061aSmrg				 "width changing to %d\n",widget->core.width));
412444c061aSmrg 	}
413444c061aSmrg 	if (req.changes.height != widget->core.height) {
414444c061aSmrg 	    req.changeMask |= CWHeight;
415444c061aSmrg 	    req.changes.height = widget->core.height;
416444c061aSmrg	    CALLGEOTAT(_XtGeoTrace(widget,
417444c061aSmrg                               "height changing to %d\n",widget->core.height));
418444c061aSmrg 	}
419444c061aSmrg 	if (req.changes.border_width != widget->core.border_width) {
420444c061aSmrg 	    req.changeMask |= CWBorderWidth;
421444c061aSmrg 	    req.changes.border_width = widget->core.border_width;
422444c061aSmrg	    CALLGEOTAT(_XtGeoTrace(widget,
423444c061aSmrg				   "border_width changing to %d\n",
424444c061aSmrg				   widget->core.border_width));
425444c061aSmrg 	}
426444c061aSmrg	if (req.changeMask & CWStackMode) {
427444c061aSmrg	    req.changes.stack_mode = request->stack_mode;
428444c061aSmrg	    CALLGEOTAT(_XtGeoTrace(widget,"stack_mode changing\n"));
429444c061aSmrg	    if (req.changeMask & CWSibling) {
430444c061aSmrg		if (XtIsWidget(request->sibling))
431444c061aSmrg		    req.changes.sibling = XtWindow(request->sibling);
432444c061aSmrg		else
433444c061aSmrg		    req.changeMask &= ~(CWStackMode | CWSibling);
434444c061aSmrg	    }
435444c061aSmrg	}
436444c061aSmrg
437444c061aSmrg#ifdef XT_GEO_TATTLER
438444c061aSmrg        if (req.changeMask) {
439444c061aSmrg	    CALLGEOTAT(_XtGeoTrace(widget,
440444c061aSmrg				   "XConfigure \"%s\"'s window.\n",
441444c061aSmrg				   XtName(widget)));
442444c061aSmrg	} else {
443444c061aSmrg	    CALLGEOTAT(_XtGeoTrace(widget,
444444c061aSmrg			     "No window configuration needed for \"%s\".\n",
445444c061aSmrg			     XtName(widget)));
446444c061aSmrg	}
447444c061aSmrg#endif
448444c061aSmrg
449444c061aSmrg	XConfigureWindow(XtDisplay(widget), XtWindow(widget),
450444c061aSmrg			 req.changeMask, &req.changes);
451444c061aSmrg    }
452444c061aSmrg    else {			/* RectObj child of realized Widget */
453444c061aSmrg	*clear_rect_obj = TRUE;
454444c061aSmrg	CALLGEOTAT(_XtGeoTrace(widget,
455444c061aSmrg			       "ClearRectObj on \"%s\".\n",XtName(widget)));
456444c061aSmrg
457444c061aSmrg	ClearRectObjAreas((RectObj)widget, &req.changes);
458444c061aSmrg    }
459444c061aSmrg    hookobj = XtHooksOfDisplay(XtDisplayOfObject(widget));;
460444c061aSmrg    if (XtHasCallbacks(hookobj, XtNconfigureHook) == XtCallbackHasSome) {
461444c061aSmrg	req.type = XtHconfigure;
462444c061aSmrg	req.widget = widget;
463444c061aSmrg	XtCallCallbackList(hookobj,
464444c061aSmrg		((HookObject)hookobj)->hooks.confighook_callbacks,
465444c061aSmrg		(XtPointer)&req);
466444c061aSmrg    }
467444c061aSmrg
468444c061aSmrg    return returnCode;
469444c061aSmrg} /* _XtMakeGeometryRequest */
470444c061aSmrg
471444c061aSmrg
472444c061aSmrg/* Public routines */
473444c061aSmrg
474444c061aSmrgXtGeometryResult XtMakeGeometryRequest (
475444c061aSmrg    Widget         widget,
476444c061aSmrg    XtWidgetGeometry *request,
477444c061aSmrg    XtWidgetGeometry *reply)
478444c061aSmrg{
479444c061aSmrg    Boolean junk;
480444c061aSmrg    XtGeometryResult r;
481444c061aSmrg    XtGeometryHookDataRec call_data;
482444c061aSmrg    Widget hookobj = XtHooksOfDisplay(XtDisplayOfObject(widget));
483444c061aSmrg    WIDGET_TO_APPCON(widget);
484444c061aSmrg
485444c061aSmrg    LOCK_APP(app);
486444c061aSmrg    if (XtHasCallbacks(hookobj, XtNgeometryHook) == XtCallbackHasSome) {
487444c061aSmrg	call_data.type = XtHpreGeometry;
488444c061aSmrg	call_data.widget = widget;
489444c061aSmrg	call_data.request = request;
490444c061aSmrg	XtCallCallbackList(hookobj,
491444c061aSmrg		((HookObject)hookobj)->hooks.geometryhook_callbacks,
492444c061aSmrg		(XtPointer)&call_data);
493444c061aSmrg	call_data.result = r =
494444c061aSmrg	    _XtMakeGeometryRequest(widget, request, reply, &junk);
495444c061aSmrg	call_data.type = XtHpostGeometry;
496444c061aSmrg	call_data.reply = reply;
497444c061aSmrg	XtCallCallbackList(hookobj,
498444c061aSmrg		((HookObject)hookobj)->hooks.geometryhook_callbacks,
499444c061aSmrg		(XtPointer)&call_data);
500444c061aSmrg    } else {
501444c061aSmrg	r = _XtMakeGeometryRequest(widget, request, reply, &junk);
502444c061aSmrg    }
503444c061aSmrg    UNLOCK_APP(app);
504444c061aSmrg
505444c061aSmrg    return ((r == XtGeometryDone) ? XtGeometryYes : r);
506444c061aSmrg}
507444c061aSmrg
508444c061aSmrgXtGeometryResult
509444c061aSmrgXtMakeResizeRequest(
510444c061aSmrg    Widget	widget,
511444c061aSmrg    _XtDimension width,
512444c061aSmrg    _XtDimension height,
513444c061aSmrg    Dimension	*replyWidth,
514444c061aSmrg    Dimension	*replyHeight)
515444c061aSmrg{
516444c061aSmrg    XtWidgetGeometry request, reply;
517444c061aSmrg    XtGeometryResult r;
518444c061aSmrg    XtGeometryHookDataRec call_data;
519444c061aSmrg    Boolean junk;
520444c061aSmrg    Widget hookobj = XtHooksOfDisplay(XtDisplayOfObject(widget));
521444c061aSmrg    WIDGET_TO_APPCON(widget);
522444c061aSmrg
523444c061aSmrg    LOCK_APP(app);
524444c061aSmrg    request.request_mode = CWWidth | CWHeight;
525444c061aSmrg    request.width = width;
526444c061aSmrg    request.height = height;
527444c061aSmrg
528444c061aSmrg    if (XtHasCallbacks(hookobj, XtNgeometryHook) == XtCallbackHasSome) {
529444c061aSmrg	call_data.type = XtHpreGeometry;
530444c061aSmrg	call_data.widget = widget;
531444c061aSmrg	call_data.request = &request;
532444c061aSmrg	XtCallCallbackList(hookobj,
533444c061aSmrg		((HookObject)hookobj)->hooks.geometryhook_callbacks,
534444c061aSmrg		(XtPointer)&call_data);
535444c061aSmrg	call_data.result = r =
536444c061aSmrg	    _XtMakeGeometryRequest(widget, &request, &reply, &junk);
537444c061aSmrg	call_data.type = XtHpostGeometry;
538444c061aSmrg	call_data.reply = &reply;
539444c061aSmrg	XtCallCallbackList(hookobj,
540444c061aSmrg		((HookObject)hookobj)->hooks.geometryhook_callbacks,
541444c061aSmrg		(XtPointer)&call_data);
542444c061aSmrg    } else {
543444c061aSmrg	r = _XtMakeGeometryRequest(widget, &request, &reply, &junk);
544444c061aSmrg    }
545444c061aSmrg    if (replyWidth != NULL) {
546444c061aSmrg	if (r == XtGeometryAlmost && reply.request_mode & CWWidth)
547444c061aSmrg	    *replyWidth = reply.width;
548444c061aSmrg	else
549444c061aSmrg	    *replyWidth = width;
550444c061aSmrg    }
551444c061aSmrg    if (replyHeight != NULL) {
552444c061aSmrg	if (r == XtGeometryAlmost && reply.request_mode & CWHeight)
553444c061aSmrg	    *replyHeight = reply.height;
554444c061aSmrg	else
555444c061aSmrg	    *replyHeight = height;
556444c061aSmrg    }
557444c061aSmrg    UNLOCK_APP(app);
558444c061aSmrg    return ((r == XtGeometryDone) ? XtGeometryYes : r);
559444c061aSmrg} /* XtMakeResizeRequest */
560444c061aSmrg
561444c061aSmrgvoid XtResizeWindow(
562444c061aSmrg    Widget w)
563444c061aSmrg{
564444c061aSmrg    XtConfigureHookDataRec req;
565444c061aSmrg    Widget hookobj;
566444c061aSmrg    WIDGET_TO_APPCON(w);
567444c061aSmrg
568444c061aSmrg    LOCK_APP(app);
569444c061aSmrg    if (XtIsRealized(w)) {
570444c061aSmrg	req.changes.width = w->core.width;
571444c061aSmrg	req.changes.height = w->core.height;
572444c061aSmrg	req.changes.border_width = w->core.border_width;
573444c061aSmrg	req.changeMask = CWWidth | CWHeight | CWBorderWidth;
574444c061aSmrg	XConfigureWindow(XtDisplay(w), XtWindow(w),
575444c061aSmrg	    (unsigned) req.changeMask, &req.changes);
576444c061aSmrg	hookobj = XtHooksOfDisplay(XtDisplayOfObject(w));;
577444c061aSmrg	if (XtHasCallbacks(hookobj, XtNconfigureHook) == XtCallbackHasSome) {
578444c061aSmrg	    req.type = XtHconfigure;
579444c061aSmrg	    req.widget = w;
580444c061aSmrg	    XtCallCallbackList(hookobj,
581444c061aSmrg			((HookObject)hookobj)->hooks.confighook_callbacks,
582444c061aSmrg			(XtPointer)&req);
583444c061aSmrg	}
584444c061aSmrg    }
585444c061aSmrg    UNLOCK_APP(app);
586444c061aSmrg} /* XtResizeWindow */
587444c061aSmrg
588444c061aSmrgvoid XtResizeWidget(
589444c061aSmrg    Widget w,
590444c061aSmrg    _XtDimension width,
591444c061aSmrg    _XtDimension height,
592444c061aSmrg    _XtDimension borderWidth)
593444c061aSmrg{
594444c061aSmrg    XtConfigureWidget(w, w->core.x, w->core.y, width, height, borderWidth);
595444c061aSmrg} /* XtResizeWidget */
596444c061aSmrg
597444c061aSmrgvoid XtConfigureWidget(
598444c061aSmrg    Widget w,
599444c061aSmrg    _XtPosition x,
600444c061aSmrg    _XtPosition y,
601444c061aSmrg    _XtDimension width,
602444c061aSmrg    _XtDimension height,
603444c061aSmrg    _XtDimension borderWidth)
604444c061aSmrg{
605444c061aSmrg    XtConfigureHookDataRec req;
606444c061aSmrg    Widget hookobj;
607444c061aSmrg    XWindowChanges old;
608444c061aSmrg    WIDGET_TO_APPCON(w);
609444c061aSmrg
610444c061aSmrg    CALLGEOTAT(_XtGeoTrace(w,
611444c061aSmrg                   "\"%s\" is being configured by its parent \"%s\"\n",
612444c061aSmrg		   XtName(w),
613444c061aSmrg		   (XtParent(w))?XtName(XtParent(w)):"Root"));
614444c061aSmrg    CALLGEOTAT(_XtGeoTab(1));
615444c061aSmrg
616444c061aSmrg    LOCK_APP(app);
617444c061aSmrg    req.changeMask = 0;
618444c061aSmrg    if ((old.x = w->core.x) != x) {
619444c061aSmrg	CALLGEOTAT(_XtGeoTrace(w,"x move from %d to %d\n",w->core.x, x));
620444c061aSmrg	req.changes.x = w->core.x = x;
621444c061aSmrg	req.changeMask |= CWX;
622444c061aSmrg    }
623444c061aSmrg
624444c061aSmrg    if ((old.y = w->core.y) != y) {
625444c061aSmrg	CALLGEOTAT(_XtGeoTrace(w,"y move from %d to %d\n",w->core.y, y));
626444c061aSmrg	req.changes.y = w->core.y = y;
627444c061aSmrg	req.changeMask |= CWY;
628444c061aSmrg    }
629444c061aSmrg
630444c061aSmrg    if ((old.width = w->core.width) != width) {
631444c061aSmrg	CALLGEOTAT(_XtGeoTrace(w,
632444c061aSmrg			 "width move from %d to %d\n",w->core.width, width));
633444c061aSmrg	req.changes.width = w->core.width = width;
634444c061aSmrg	req.changeMask |= CWWidth;
635444c061aSmrg    }
636444c061aSmrg
637444c061aSmrg    if ((old.height = w->core.height) != height) {
638444c061aSmrg	CALLGEOTAT(_XtGeoTrace(w,
639444c061aSmrg		       "height move from %d to %d\n",w->core.height, height));
640444c061aSmrg	req.changes.height = w->core.height = height;
641444c061aSmrg	req.changeMask |= CWHeight;
642444c061aSmrg    }
643444c061aSmrg
644444c061aSmrg    if ((old.border_width = w->core.border_width) != borderWidth) {
645444c061aSmrg	CALLGEOTAT(_XtGeoTrace(w,"border_width move from %d to %d\n",
646444c061aSmrg		    w->core.border_width,borderWidth ));
647444c061aSmrg	req.changes.border_width = w->core.border_width = borderWidth;
648444c061aSmrg	req.changeMask |= CWBorderWidth;
649444c061aSmrg    }
650444c061aSmrg
651444c061aSmrg    if (req.changeMask != 0) {
652444c061aSmrg	if (XtIsRealized(w)) {
653444c061aSmrg	    if (XtIsWidget(w)) {
654444c061aSmrg		CALLGEOTAT(_XtGeoTrace(w,
655444c061aSmrg                                  "XConfigure \"%s\"'s window\n",XtName(w)));
656444c061aSmrg		XConfigureWindow(XtDisplay(w), XtWindow(w),
657444c061aSmrg				 req.changeMask, &req.changes);
658444c061aSmrg	    } else {
659444c061aSmrg		CALLGEOTAT(_XtGeoTrace(w,
660444c061aSmrg			       "ClearRectObj called on \"%s\"\n",XtName(w)));
661444c061aSmrg		ClearRectObjAreas((RectObj)w, &old);
662444c061aSmrg	    }
663444c061aSmrg	}
664444c061aSmrg	hookobj = XtHooksOfDisplay(XtDisplayOfObject(w));;
665444c061aSmrg	if (XtHasCallbacks(hookobj, XtNconfigureHook) == XtCallbackHasSome) {
666444c061aSmrg	    req.type = XtHconfigure;
667444c061aSmrg	    req.widget = w;
668444c061aSmrg	    XtCallCallbackList(hookobj,
669444c061aSmrg			((HookObject)hookobj)->hooks.confighook_callbacks,
670444c061aSmrg			(XtPointer)&req);
671444c061aSmrg	}
672444c061aSmrg	{
673444c061aSmrg	XtWidgetProc resize;
674444c061aSmrg
675444c061aSmrg	LOCK_PROCESS;
676444c061aSmrg	resize = XtClass(w)->core_class.resize;
677444c061aSmrg	UNLOCK_PROCESS;
678444c061aSmrg	if ((req.changeMask & (CWWidth | CWHeight)) &&
679444c061aSmrg	    resize != (XtWidgetProc) NULL) {
680444c061aSmrg	    CALLGEOTAT(_XtGeoTrace(w,"Resize proc is called.\n"));
681444c061aSmrg	    (*resize)(w);
682444c061aSmrg	 }
683444c061aSmrg	}
684444c061aSmrg    } else {
685444c061aSmrg	CALLGEOTAT(_XtGeoTrace(w,"No change in configuration\n"));
686444c061aSmrg    }
687444c061aSmrg
688444c061aSmrg    CALLGEOTAT(_XtGeoTab(-1));
689444c061aSmrg    UNLOCK_APP(app);
690444c061aSmrg} /* XtConfigureWidget */
691444c061aSmrg
692444c061aSmrgvoid XtMoveWidget(
693444c061aSmrg    Widget w,
694444c061aSmrg    _XtPosition x,
695444c061aSmrg    _XtPosition y)
696444c061aSmrg{
697444c061aSmrg    XtConfigureWidget(w, x, y, w->core.width, w->core.height,
698444c061aSmrg		      w->core.border_width);
699444c061aSmrg} /* XtMoveWidget */
700444c061aSmrg
701444c061aSmrgvoid XtTranslateCoords(
702444c061aSmrg    register Widget w,
703444c061aSmrg    _XtPosition x,
704444c061aSmrg    _XtPosition y,
705444c061aSmrg    register Position *rootx,	/* return */
706444c061aSmrg    register Position *rooty)	/* return */
707444c061aSmrg{
708444c061aSmrg    Position garbagex, garbagey;
709444c061aSmrg    XtAppContext app = XtWidgetToApplicationContext(w);
710444c061aSmrg
711444c061aSmrg    LOCK_APP(app);
712444c061aSmrg    if (rootx == NULL) rootx = &garbagex;
713444c061aSmrg    if (rooty == NULL) rooty = &garbagey;
714444c061aSmrg
715444c061aSmrg    *rootx = x;
716444c061aSmrg    *rooty = y;
717444c061aSmrg
718444c061aSmrg    for (; w != NULL && ! XtIsShell(w); w = w->core.parent) {
719444c061aSmrg	*rootx += w->core.x + w->core.border_width;
720444c061aSmrg	*rooty += w->core.y + w->core.border_width;
721444c061aSmrg    }
722444c061aSmrg
723444c061aSmrg    if (w == NULL)
724444c061aSmrg        XtAppWarningMsg(app,
725444c061aSmrg		"invalidShell","xtTranslateCoords",XtCXtToolkitError,
726444c061aSmrg                "Widget has no shell ancestor",
727444c061aSmrg		(String *)NULL, (Cardinal *)NULL);
728444c061aSmrg    else {
729444c061aSmrg	Position x, y;
730444c061aSmrg	_XtShellGetCoordinates( w, &x, &y );
731444c061aSmrg	*rootx += x + w->core.border_width;
732444c061aSmrg	*rooty += y + w->core.border_width;
733444c061aSmrg    }
734444c061aSmrg    UNLOCK_APP(app);
735444c061aSmrg}
736444c061aSmrg
737444c061aSmrgXtGeometryResult XtQueryGeometry(
738444c061aSmrg    Widget widget,
739444c061aSmrg    register XtWidgetGeometry *intended, /* parent's changes; may be NULL */
740444c061aSmrg    XtWidgetGeometry *reply)	/* child's preferred geometry; never NULL */
741444c061aSmrg{
742444c061aSmrg    XtWidgetGeometry null_intended;
743444c061aSmrg    XtGeometryHandler query;
744444c061aSmrg    XtGeometryResult result;
745444c061aSmrg    WIDGET_TO_APPCON(widget);
746444c061aSmrg
747444c061aSmrg    CALLGEOTAT(_XtGeoTrace(widget,
748444c061aSmrg		     "\"%s\" is asking its preferred geometry to \"%s\".\n",
749444c061aSmrg		     (XtParent(widget))?XtName(XtParent(widget)):"Root",
750444c061aSmrg		     XtName(widget)));
751444c061aSmrg    CALLGEOTAT(_XtGeoTab(1));
752444c061aSmrg
753444c061aSmrg    LOCK_APP(app);
754444c061aSmrg    LOCK_PROCESS;
755444c061aSmrg    query = XtClass(widget)->core_class.query_geometry;
756444c061aSmrg    UNLOCK_PROCESS;
757444c061aSmrg    reply->request_mode = 0;
758444c061aSmrg    if (query != NULL) {
759444c061aSmrg	if (intended == NULL) {
760444c061aSmrg	    null_intended.request_mode = 0;
761444c061aSmrg	    intended = &null_intended;
762444c061aSmrg#ifdef XT_GEO_TATTLER
763444c061aSmrg	    CALLGEOTAT(_XtGeoTrace(widget,"without any constraint.\n"));
764444c061aSmrg	} else {
765444c061aSmrg	    CALLGEOTAT(_XtGeoTrace(widget,
766444c061aSmrg				   "with the following constraints:\n"));
767444c061aSmrg
768444c061aSmrg	    if (intended->request_mode & CWX) {
769444c061aSmrg		CALLGEOTAT(_XtGeoTrace(widget," x = %d\n",intended->x));
770444c061aSmrg	    }
771444c061aSmrg	    if (intended->request_mode & CWY) {
772444c061aSmrg		CALLGEOTAT(_XtGeoTrace(widget," y = %d\n",intended->y));
773444c061aSmrg	    }
774444c061aSmrg	    if (intended->request_mode & CWWidth) {
775444c061aSmrg		CALLGEOTAT(_XtGeoTrace(widget,
776444c061aSmrg				       " width = %d\n",intended->width));
777444c061aSmrg	    }
778444c061aSmrg	    if (intended->request_mode & CWHeight) {
779444c061aSmrg		CALLGEOTAT(_XtGeoTrace(widget,
780444c061aSmrg				       " height = %d\n",intended->height));
781444c061aSmrg	    }
782444c061aSmrg	    if (intended->request_mode & CWBorderWidth) {
783444c061aSmrg		CALLGEOTAT(_XtGeoTrace(widget,
784444c061aSmrg			       " border_width = %d\n",intended->border_width));
785444c061aSmrg	    }
786444c061aSmrg#endif
787444c061aSmrg	}
788444c061aSmrg
789444c061aSmrg	result = (*query) (widget, intended, reply);
790444c061aSmrg    }
791444c061aSmrg    else {
792444c061aSmrg	CALLGEOTAT(_XtGeoTrace(widget,"\"%s\" has no QueryGeometry proc, return the current state\n",XtName(widget)));
793444c061aSmrg
794444c061aSmrg	result = XtGeometryYes;
795444c061aSmrg    }
796444c061aSmrg
797444c061aSmrg#ifdef XT_GEO_TATTLER
798444c061aSmrg#define FillIn(mask, field) \
799444c061aSmrg	if (!(reply->request_mode & mask)) {\
800444c061aSmrg	      reply->field = widget->core.field;\
801444c061aSmrg	      _XtGeoTrace(widget," using core %s = %d.\n","field",\
802444c061aSmrg			                               widget->core.field);\
803444c061aSmrg	} else {\
804444c061aSmrg	      _XtGeoTrace(widget," replied %s = %d\n","field",\
805444c061aSmrg			                           reply->field);\
806444c061aSmrg	}
807444c061aSmrg#else
808444c061aSmrg#define FillIn(mask, field) \
809444c061aSmrg	if (!(reply->request_mode & mask)) reply->field = widget->core.field;
810444c061aSmrg#endif
811444c061aSmrg
812444c061aSmrg    FillIn(CWX, x);
813444c061aSmrg    FillIn(CWY, y);
814444c061aSmrg    FillIn(CWWidth, width);
815444c061aSmrg    FillIn(CWHeight, height);
816444c061aSmrg    FillIn(CWBorderWidth, border_width);
817444c061aSmrg
818444c061aSmrg    CALLGEOTAT(_XtGeoTab(-1));
819444c061aSmrg#undef FillIn
820444c061aSmrg
821444c061aSmrg    if (!(reply->request_mode & CWStackMode))
822444c061aSmrg	reply->stack_mode = XtSMDontChange;
823444c061aSmrg    UNLOCK_APP(app);
824444c061aSmrg    return result;
825444c061aSmrg}
826