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