Blame tests/lib/Geometry/geoShell.c

Packit b099d7
/* $XConsortium: geoShell.c /main/4 1995/07/15 21:13:36 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
#define SHELL
Packit b099d7
Packit b099d7
#ifndef DEFAULT_WM_TIMEOUT
Packit b099d7
#define DEFAULT_WM_TIMEOUT 5000
Packit b099d7
#endif
Packit b099d7
Packit b099d7
#include "IntrinsicI.h"
Packit b099d7
#include "StringDefs.h"
Packit b099d7
#include "Shell.h"
Packit b099d7
#include "ShellP.h"
Packit b099d7
#include "Vendor.h"
Packit b099d7
#include "VendorP.h"
Packit b099d7
#include <X11/Xatom.h>
Packit b099d7
#include <X11/Xlocale.h>
Packit b099d7
#include <stdio.h>
Packit b099d7
Packit b099d7
#include "geoTattler.h"
Packit b099d7
Packit b099d7
Packit b099d7
/***************************************************************************
Packit b099d7
 *
Packit b099d7
 * Note: per the Xt spec, the Shell geometry management assumes in
Packit b099d7
 * several places that there is only one managed child.  This is
Packit b099d7
 * *not* a bug.  Any subclass that assumes otherwise is broken.
Packit b099d7
 *
Packit b099d7
 ***************************************************************************/
Packit b099d7
Packit b099d7
#define WM_CONFIGURE_DENIED(w) (((WMShellWidget) (w))->wm.wm_configure_denied)
Packit b099d7
#define WM_MOVED(w) (((WMShellWidget) (w))->wm.wm_moved)
Packit b099d7
Packit b099d7
#define BIGSIZE ((Dimension)32767)
Packit b099d7
Packit b099d7
/***************************************************************************
Packit b099d7
 *
Packit b099d7
 * Default values for resource lists
Packit b099d7
 *
Packit b099d7
 ***************************************************************************/
Packit b099d7
Packit b099d7
#ifdef CRAY
Packit b099d7
void _XtShellDepth();
Packit b099d7
void _XtShellColormap();
Packit b099d7
void _XtShellAncestorSensitive();
Packit b099d7
void _XtTitleEncoding();
Packit b099d7
#else
Packit b099d7
static void _XtShellDepth();
Packit b099d7
static void _XtShellColormap();
Packit b099d7
static void _XtShellAncestorSensitive();
Packit b099d7
static void _XtTitleEncoding();
Packit b099d7
#endif
Packit b099d7
Packit b099d7
/***************************************************************************
Packit b099d7
 *
Packit b099d7
 * Shell class record
Packit b099d7
 *
Packit b099d7
 ***************************************************************************/
Packit b099d7
Packit b099d7
#define Offset(x)	(XtOffsetOf(ShellRec, x))
Packit b099d7
static XtResource shellResources[]=
Packit b099d7
{
Packit b099d7
	{XtNx, XtCPosition, XtRPosition, sizeof(Position),
Packit b099d7
	    Offset(core.x), XtRImmediate, (XtPointer)BIGSIZE},
Packit b099d7
	{XtNy, XtCPosition, XtRPosition, sizeof(Position),
Packit b099d7
	    Offset(core.y), XtRImmediate, (XtPointer)BIGSIZE},
Packit b099d7
	{ XtNdepth, XtCDepth, XtRInt, sizeof(int),
Packit b099d7
	    Offset(core.depth), XtRCallProc, (XtPointer) _XtShellDepth},
Packit b099d7
	{ XtNcolormap, XtCColormap, XtRColormap, sizeof(Colormap),
Packit b099d7
	    Offset(core.colormap), XtRCallProc, (XtPointer) _XtShellColormap},
Packit b099d7
	{ XtNancestorSensitive, XtCSensitive, XtRBoolean, sizeof(Boolean),
Packit b099d7
	    Offset(core.ancestor_sensitive), XtRCallProc,
Packit b099d7
	    (XtPointer) _XtShellAncestorSensitive},
Packit b099d7
	{ XtNallowShellResize, XtCAllowShellResize, XtRBoolean,
Packit b099d7
	    sizeof(Boolean), Offset(shell.allow_shell_resize),
Packit b099d7
	    XtRImmediate, (XtPointer)False},
Packit b099d7
	{ XtNgeometry, XtCGeometry, XtRString, sizeof(String), 
Packit b099d7
	    Offset(shell.geometry), XtRString, (XtPointer)NULL},
Packit b099d7
	{ XtNcreatePopupChildProc, XtCCreatePopupChildProc, XtRFunction,
Packit b099d7
	    sizeof(XtCreatePopupChildProc), Offset(shell.create_popup_child_proc),
Packit b099d7
	    XtRFunction, NULL},
Packit b099d7
	{ XtNsaveUnder, XtCSaveUnder, XtRBoolean, sizeof(Boolean),
Packit b099d7
	    Offset(shell.save_under), XtRImmediate, (XtPointer)False},
Packit b099d7
	{ XtNpopupCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList),
Packit b099d7
	    Offset(shell.popup_callback), XtRCallback, (XtPointer) NULL},
Packit b099d7
	{ XtNpopdownCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList),
Packit b099d7
	    Offset(shell.popdown_callback), XtRCallback, (XtPointer) NULL},
Packit b099d7
	{ XtNoverrideRedirect, XtCOverrideRedirect,
Packit b099d7
	    XtRBoolean, sizeof(Boolean), Offset(shell.override_redirect),
Packit b099d7
	    XtRImmediate, (XtPointer)False},
Packit b099d7
	{ XtNvisual, XtCVisual, XtRVisual, sizeof(Visual*),
Packit b099d7
	    Offset(shell.visual), XtRImmediate, CopyFromParent}
Packit b099d7
};
Packit b099d7
Packit b099d7
static void ClassPartInitialize(), Initialize();
Packit b099d7
static void Realize();
Packit b099d7
static void Resize();
Packit b099d7
static Boolean SetValues();
Packit b099d7
static void GetValuesHook();
Packit b099d7
static void ChangeManaged(); /* XXX */
Packit b099d7
static XtGeometryResult GeometryManager(), RootGeometryManager();
Packit b099d7
static void Destroy();
Packit b099d7
Packit b099d7
static ShellClassExtensionRec shellClassExtRec = {
Packit b099d7
    NULL,
Packit b099d7
    NULLQUARK,
Packit b099d7
    XtShellExtensionVersion,
Packit b099d7
    sizeof(ShellClassExtensionRec),
Packit b099d7
    RootGeometryManager
Packit b099d7
};
Packit b099d7
Packit b099d7
externaldef(shellclassrec) ShellClassRec shellClassRec = {
Packit b099d7
  {   /* Core */
Packit b099d7
    /* superclass	  */	(WidgetClass) &compositeClassRec,
Packit b099d7
    /* class_name	  */	"Shell",
Packit b099d7
    /* size		  */	sizeof(ShellRec),
Packit b099d7
    /* Class Initializer  */	NULL,
Packit b099d7
    /* class_part_initialize*/	ClassPartInitialize,
Packit b099d7
    /* Class init'ed ?	  */	FALSE,
Packit b099d7
    /* initialize	  */	Initialize,
Packit b099d7
    /* initialize_notify  */	NULL,		
Packit b099d7
    /* realize		  */	Realize,
Packit b099d7
    /* actions		  */	NULL,
Packit b099d7
    /* num_actions	  */	0,
Packit b099d7
    /* resources	  */	shellResources,
Packit b099d7
    /* resource_count	  */	XtNumber(shellResources),
Packit b099d7
    /* xrm_class	  */	NULLQUARK,
Packit b099d7
    /* compress_motion	  */	FALSE,
Packit b099d7
    /* compress_exposure  */	TRUE,
Packit b099d7
    /* compress_enterleave*/	FALSE,
Packit b099d7
    /* visible_interest	  */	FALSE,
Packit b099d7
    /* destroy		  */	Destroy,
Packit b099d7
    /* resize		  */	Resize,
Packit b099d7
    /* expose		  */	NULL,
Packit b099d7
    /* set_values	  */	SetValues,
Packit b099d7
    /* set_values_hook	  */	NULL,			
Packit b099d7
    /* set_values_almost  */	XtInheritSetValuesAlmost,  
Packit b099d7
    /* get_values_hook	  */	GetValuesHook,			
Packit b099d7
    /* accept_focus	  */	NULL,
Packit b099d7
    /* intrinsics version */	XtVersion,
Packit b099d7
    /* callback offsets	  */	NULL,
Packit b099d7
    /* tm_table		  */	NULL,
Packit b099d7
    /* query_geometry	  */	NULL,
Packit b099d7
    /* display_accelerator*/	NULL,
Packit b099d7
    /* extension	  */	NULL
Packit b099d7
  },{ /* Composite */
Packit b099d7
    /* geometry_manager	  */	GeometryManager,
Packit b099d7
    /* change_managed	  */	ChangeManaged,
Packit b099d7
    /* insert_child	  */	XtInheritInsertChild,
Packit b099d7
    /* delete_child	  */	XtInheritDeleteChild,
Packit b099d7
    /* extension	  */	NULL
Packit b099d7
  },{ /* Shell */
Packit b099d7
    /* extension	  */	(XtPointer)&shellClassExtRec
Packit b099d7
  }
Packit b099d7
};
Packit b099d7
Packit b099d7
externaldef(shellwidgetclass) WidgetClass shellWidgetClass = (WidgetClass) (&shellClassRec);
Packit b099d7
Packit b099d7
/***************************************************************************
Packit b099d7
 *
Packit b099d7
 * OverrideShell class record
Packit b099d7
 *
Packit b099d7
 ***************************************************************************/
Packit b099d7
Packit b099d7
static XtResource overrideResources[]=
Packit b099d7
{
Packit b099d7
	{ XtNoverrideRedirect, XtCOverrideRedirect,
Packit b099d7
	    XtRBoolean, sizeof(Boolean), Offset(shell.override_redirect),
Packit b099d7
	    XtRImmediate, (XtPointer)True},
Packit b099d7
	{ XtNsaveUnder, XtCSaveUnder, XtRBoolean, sizeof(Boolean),
Packit b099d7
	    Offset(shell.save_under), XtRImmediate, (XtPointer)True},
Packit b099d7
};
Packit b099d7
Packit b099d7
externaldef(overrideshellclassrec) OverrideShellClassRec overrideShellClassRec = {
Packit b099d7
  {
Packit b099d7
    /* superclass         */    (WidgetClass) &shellClassRec,
Packit b099d7
    /* class_name         */    "OverrideShell",
Packit b099d7
    /* size               */    sizeof(OverrideShellRec),
Packit b099d7
    /* Class Initializer  */	NULL,
Packit b099d7
    /* class_part_initialize*/	NULL,
Packit b099d7
    /* Class init'ed ?    */	FALSE,
Packit b099d7
    /* initialize         */    NULL,
Packit b099d7
    /* initialize_notify    */	NULL,		
Packit b099d7
    /* realize            */    XtInheritRealize,
Packit b099d7
    /* actions            */    NULL,
Packit b099d7
    /* num_actions        */    0,
Packit b099d7
    /* resources          */    overrideResources,
Packit b099d7
    /* resource_count     */	XtNumber(overrideResources),
Packit b099d7
    /* xrm_class          */    NULLQUARK,
Packit b099d7
    /* compress_motion    */    FALSE,
Packit b099d7
    /* compress_exposure  */    TRUE,
Packit b099d7
    /* compress_enterleave*/ 	FALSE,
Packit b099d7
    /* visible_interest   */    FALSE,
Packit b099d7
    /* destroy            */    NULL,
Packit b099d7
    /* resize             */    XtInheritResize,
Packit b099d7
    /* expose             */    NULL,
Packit b099d7
    /* set_values         */    NULL,
Packit b099d7
    /* set_values_hook      */	NULL,			
Packit b099d7
    /* set_values_almost    */	XtInheritSetValuesAlmost,  
Packit b099d7
    /* get_values_hook      */	NULL,			
Packit b099d7
    /* accept_focus       */    NULL,
Packit b099d7
    /* intrinsics version */	XtVersion,
Packit b099d7
    /* callback offsets   */    NULL,
Packit b099d7
    /* tm_table		    */  NULL,
Packit b099d7
    /* query_geometry	    */  NULL,
Packit b099d7
    /* display_accelerator  */  NULL,
Packit b099d7
    /* extension	    */  NULL
Packit b099d7
  },{
Packit b099d7
    /* geometry_manager   */    XtInheritGeometryManager,
Packit b099d7
    /* change_managed     */    XtInheritChangeManaged,
Packit b099d7
    /* insert_child	  */	XtInheritInsertChild,
Packit b099d7
    /* delete_child	  */	XtInheritDeleteChild,
Packit b099d7
    /* extension	    */  NULL
Packit b099d7
  },{
Packit b099d7
    /* extension	    */  NULL
Packit b099d7
  },{
Packit b099d7
    /* extension	    */  NULL
Packit b099d7
  }
Packit b099d7
};
Packit b099d7
Packit b099d7
externaldef(overrideshellwidgetclass) WidgetClass overrideShellWidgetClass = 
Packit b099d7
	(WidgetClass) (&overrideShellClassRec);
Packit b099d7
Packit b099d7
/***************************************************************************
Packit b099d7
 *
Packit b099d7
 * WMShell class record
Packit b099d7
 *
Packit b099d7
 ***************************************************************************/
Packit b099d7
Packit b099d7
#undef Offset
Packit b099d7
#define Offset(x)	(XtOffsetOf(WMShellRec, x))
Packit b099d7
Packit b099d7
static int default_unspecified_shell_int = XtUnspecifiedShellInt;
Packit b099d7
/*
Packit b099d7
 * Warning, casting XtUnspecifiedShellInt (which is -1) to an (XtPointer)
Packit b099d7
 * can result is loss of bits on some machines (i.e. crays)
Packit b099d7
 */
Packit b099d7
Packit b099d7
static XtResource wmResources[]=
Packit b099d7
{
Packit b099d7
	{ XtNtitle, XtCTitle, XtRString, sizeof(String),
Packit b099d7
	    Offset(wm.title), XtRString, NULL},
Packit b099d7
	{ XtNtitleEncoding, XtCTitleEncoding, XtRAtom, sizeof(Atom),
Packit b099d7
	    Offset(wm.title_encoding),
Packit b099d7
	    XtRCallProc, (XtPointer) _XtTitleEncoding},
Packit b099d7
	{ XtNwmTimeout, XtCWmTimeout, XtRInt, sizeof(int),
Packit b099d7
	    Offset(wm.wm_timeout), XtRImmediate,(XtPointer)DEFAULT_WM_TIMEOUT},
Packit b099d7
	{ XtNwaitForWm, XtCWaitForWm, XtRBoolean, sizeof(Boolean),
Packit b099d7
	    Offset(wm.wait_for_wm), XtRImmediate, (XtPointer)True},
Packit b099d7
	{ XtNtransient, XtCTransient, XtRBoolean, sizeof(Boolean),
Packit b099d7
	    Offset(wm.transient), XtRImmediate, (XtPointer)False},
Packit b099d7
/* size_hints minus things stored in core */
Packit b099d7
	{ XtNbaseWidth, XtCBaseWidth, XtRInt, sizeof(int),
Packit b099d7
	    Offset(wm.base_width),
Packit b099d7
	    XtRInt, (XtPointer) &default_unspecified_shell_int},
Packit b099d7
	{ XtNbaseHeight, XtCBaseHeight, XtRInt, sizeof(int),
Packit b099d7
	    Offset(wm.base_height),
Packit b099d7
	    XtRInt, (XtPointer) &default_unspecified_shell_int},
Packit b099d7
	{ XtNwinGravity, XtCWinGravity, XtRInt, sizeof(int),
Packit b099d7
	    Offset(wm.win_gravity),
Packit b099d7
	    XtRInt, (XtPointer) &default_unspecified_shell_int},
Packit b099d7
	{ XtNminWidth, XtCMinWidth, XtRInt, sizeof(int),
Packit b099d7
	    Offset(wm.size_hints.min_width),
Packit b099d7
	    XtRInt, (XtPointer) &default_unspecified_shell_int},
Packit b099d7
	{ XtNminHeight, XtCMinHeight, XtRInt, sizeof(int),
Packit b099d7
	    Offset(wm.size_hints.min_height),
Packit b099d7
	    XtRInt, (XtPointer) &default_unspecified_shell_int},
Packit b099d7
	{ XtNmaxWidth, XtCMaxWidth, XtRInt, sizeof(int),
Packit b099d7
	    Offset(wm.size_hints.max_width),
Packit b099d7
	    XtRInt, (XtPointer) &default_unspecified_shell_int},
Packit b099d7
	{ XtNmaxHeight, XtCMaxHeight, XtRInt, sizeof(int),
Packit b099d7
	    Offset(wm.size_hints.max_height),
Packit b099d7
	    XtRInt, (XtPointer) &default_unspecified_shell_int},
Packit b099d7
	{ XtNwidthInc, XtCWidthInc, XtRInt, sizeof(int),
Packit b099d7
	    Offset(wm.size_hints.width_inc),
Packit b099d7
	    XtRInt, (XtPointer) &default_unspecified_shell_int},
Packit b099d7
	{ XtNheightInc, XtCHeightInc, XtRInt, sizeof(int),
Packit b099d7
	    Offset(wm.size_hints.height_inc),
Packit b099d7
	    XtRInt, (XtPointer) &default_unspecified_shell_int},
Packit b099d7
	{ XtNminAspectX, XtCMinAspectX, XtRInt, sizeof(int),
Packit b099d7
	    Offset(wm.size_hints.min_aspect.x),
Packit b099d7
	    XtRInt, (XtPointer) &default_unspecified_shell_int},
Packit b099d7
	{ XtNminAspectY, XtCMinAspectY, XtRInt, sizeof(int),
Packit b099d7
	    Offset(wm.size_hints.min_aspect.y),
Packit b099d7
	    XtRInt, (XtPointer) &default_unspecified_shell_int},
Packit b099d7
	{ XtNmaxAspectX, XtCMaxAspectX, XtRInt, sizeof(int),
Packit b099d7
	    Offset(wm.size_hints.max_aspect.x),
Packit b099d7
	    XtRInt, (XtPointer) &default_unspecified_shell_int},
Packit b099d7
	{ XtNmaxAspectY, XtCMaxAspectY, XtRInt, sizeof(int),
Packit b099d7
	    Offset(wm.size_hints.max_aspect.y),
Packit b099d7
	    XtRInt, (XtPointer) &default_unspecified_shell_int},
Packit b099d7
/* wm_hints */
Packit b099d7
	{ XtNinput, XtCInput, XtRBool, sizeof(Bool),
Packit b099d7
	    Offset(wm.wm_hints.input), XtRImmediate, (XtPointer)False},
Packit b099d7
	{ XtNinitialState, XtCInitialState, XtRInitialState, sizeof(int),
Packit b099d7
	    Offset(wm.wm_hints.initial_state),
Packit b099d7
	    XtRImmediate, (XtPointer)NormalState},
Packit b099d7
	{ XtNiconPixmap, XtCIconPixmap, XtRBitmap, sizeof(Pixmap),
Packit b099d7
	    Offset(wm.wm_hints.icon_pixmap), XtRPixmap, NULL},
Packit b099d7
	{ XtNiconWindow, XtCIconWindow, XtRWindow, sizeof(Window),
Packit b099d7
	    Offset(wm.wm_hints.icon_window), XtRWindow,   (XtPointer) NULL},
Packit b099d7
	{ XtNiconX, XtCIconX, XtRInt, sizeof(int),
Packit b099d7
	    Offset(wm.wm_hints.icon_x),
Packit b099d7
	    XtRInt, (XtPointer) &default_unspecified_shell_int},
Packit b099d7
	{ XtNiconY, XtCIconY, XtRInt, sizeof(int),
Packit b099d7
	    Offset(wm.wm_hints.icon_y),
Packit b099d7
	    XtRInt, (XtPointer) &default_unspecified_shell_int},
Packit b099d7
	{ XtNiconMask, XtCIconMask, XtRBitmap, sizeof(Pixmap),
Packit b099d7
	    Offset(wm.wm_hints.icon_mask), XtRPixmap, NULL},
Packit b099d7
	{ XtNwindowGroup, XtCWindowGroup, XtRWindow, sizeof(Window),
Packit b099d7
	    Offset(wm.wm_hints.window_group),
Packit b099d7
	    XtRImmediate, (XtPointer)XtUnspecifiedWindow}
Packit b099d7
};
Packit b099d7
Packit b099d7
static void WMInitialize();
Packit b099d7
static void WMInitialize();
Packit b099d7
static Boolean WMSetValues();
Packit b099d7
static void WMDestroy();
Packit b099d7
Packit b099d7
externaldef(wmshellclassrec) WMShellClassRec wmShellClassRec = {
Packit b099d7
  {
Packit b099d7
    /* superclass         */    (WidgetClass) &shellClassRec,
Packit b099d7
    /* class_name         */    "WMShell",
Packit b099d7
    /* size               */    sizeof(WMShellRec),
Packit b099d7
    /* Class Initializer  */	NULL,
Packit b099d7
    /* class_part_initialize*/	NULL,
Packit b099d7
    /* Class init'ed ?    */	FALSE,
Packit b099d7
    /* initialize         */    WMInitialize,
Packit b099d7
    /* initialize_notify    */	NULL,		
Packit b099d7
    /* realize            */    XtInheritRealize,
Packit b099d7
    /* actions            */    NULL,
Packit b099d7
    /* num_actions        */    0,
Packit b099d7
    /* resources          */    wmResources,
Packit b099d7
    /* resource_count     */	XtNumber(wmResources),
Packit b099d7
    /* xrm_class          */    NULLQUARK,
Packit b099d7
    /* compress_motion    */    FALSE,
Packit b099d7
    /* compress_exposure  */    TRUE,
Packit b099d7
    /* compress_enterleave*/	FALSE,
Packit b099d7
    /* visible_interest   */    FALSE,
Packit b099d7
    /* destroy            */    WMDestroy,
Packit b099d7
    /* resize             */    XtInheritResize,
Packit b099d7
    /* expose             */    NULL,
Packit b099d7
    /* set_values         */    WMSetValues,
Packit b099d7
    /* set_values_hook      */	NULL,			
Packit b099d7
    /* set_values_almost    */	XtInheritSetValuesAlmost,  
Packit b099d7
    /* get_values_hook      */	NULL,			
Packit b099d7
    /* accept_focus       */    NULL,
Packit b099d7
    /* intrinsics version */	XtVersion,
Packit b099d7
    /* callback offsets   */    NULL,
Packit b099d7
    /* tm_table		    */  NULL,
Packit b099d7
    /* query_geometry	    */  NULL,
Packit b099d7
    /* display_accelerator  */  NULL,
Packit b099d7
    /* extension	    */  NULL
Packit b099d7
  },{
Packit b099d7
    /* geometry_manager   */    XtInheritGeometryManager,
Packit b099d7
    /* change_managed     */    XtInheritChangeManaged,
Packit b099d7
    /* insert_child	  */	XtInheritInsertChild,
Packit b099d7
    /* delete_child	  */	XtInheritDeleteChild,
Packit b099d7
    /* extension	    */  NULL
Packit b099d7
  },{
Packit b099d7
    /* extension	    */  NULL
Packit b099d7
  },{
Packit b099d7
    /* extension	    */  NULL
Packit b099d7
  }
Packit b099d7
};
Packit b099d7
Packit b099d7
externaldef(wmshellwidgetclass) WidgetClass wmShellWidgetClass = (WidgetClass) (&wmShellClassRec);
Packit b099d7
Packit b099d7
/***************************************************************************
Packit b099d7
 *
Packit b099d7
 * TransientShell class record
Packit b099d7
 *
Packit b099d7
 ***************************************************************************/
Packit b099d7
Packit b099d7
#undef Offset
Packit b099d7
#define Offset(x)	(XtOffsetOf(TransientShellRec, x))
Packit b099d7
Packit b099d7
static XtResource transientResources[]=
Packit b099d7
{
Packit b099d7
	{ XtNtransient, XtCTransient, XtRBoolean, sizeof(Boolean),
Packit b099d7
	    Offset(wm.transient), XtRImmediate, (XtPointer)True},
Packit b099d7
	{ XtNtransientFor, XtCTransientFor, XtRWidget, sizeof(Widget),
Packit b099d7
	    Offset(transient.transient_for), XtRWidget, NULL},
Packit b099d7
	{ XtNsaveUnder, XtCSaveUnder, XtRBoolean, sizeof(Boolean),
Packit b099d7
	    Offset(shell.save_under), XtRImmediate, (XtPointer)True},
Packit b099d7
};
Packit b099d7
Packit b099d7
static void TransientRealize();
Packit b099d7
static Boolean TransientSetValues();
Packit b099d7
Packit b099d7
externaldef(transientshellclassrec) TransientShellClassRec transientShellClassRec = {
Packit b099d7
  {
Packit b099d7
    /* superclass	  */	(WidgetClass) &vendorShellClassRec,
Packit b099d7
    /* class_name	  */	"TransientShell",
Packit b099d7
    /* size		  */	sizeof(TransientShellRec),
Packit b099d7
    /* Class Initializer  */	NULL,
Packit b099d7
    /* class_part_initialize*/	NULL,
Packit b099d7
    /* Class init'ed ?	  */	FALSE,
Packit b099d7
    /* initialize	  */	NULL,
Packit b099d7
    /* initialize_notify  */	NULL,		
Packit b099d7
    /* realize		  */	TransientRealize,
Packit b099d7
    /* actions		  */	NULL,
Packit b099d7
    /* num_actions	  */	0,
Packit b099d7
    /* resources	  */	transientResources,
Packit b099d7
    /* resource_count	  */	XtNumber(transientResources),
Packit b099d7
    /* xrm_class	  */	NULLQUARK,
Packit b099d7
    /* compress_motion	  */	FALSE,
Packit b099d7
    /* compress_exposure  */	TRUE,
Packit b099d7
    /* compress_enterleave*/	FALSE,
Packit b099d7
    /* visible_interest	  */	FALSE,
Packit b099d7
    /* destroy		  */	NULL,
Packit b099d7
    /* resize		  */	XtInheritResize,
Packit b099d7
    /* expose		  */	NULL,
Packit b099d7
    /* set_values	  */	TransientSetValues,
Packit b099d7
    /* set_values_hook	  */	NULL,			
Packit b099d7
    /* set_values_almost  */	XtInheritSetValuesAlmost,  
Packit b099d7
    /* get_values_hook	  */	NULL,			
Packit b099d7
    /* accept_focus	  */	NULL,
Packit b099d7
    /* intrinsics version */	XtVersion,
Packit b099d7
    /* callback offsets	  */	NULL,
Packit b099d7
    /* tm_table		  */	XtInheritTranslations,
Packit b099d7
    /* query_geometry	  */	NULL,
Packit b099d7
    /* display_accelerator*/	NULL,
Packit b099d7
    /* extension	  */	NULL
Packit b099d7
  },{
Packit b099d7
    /* geometry_manager	  */	XtInheritGeometryManager,
Packit b099d7
    /* change_managed	  */	XtInheritChangeManaged,
Packit b099d7
    /* insert_child	  */	XtInheritInsertChild,
Packit b099d7
    /* delete_child	  */	XtInheritDeleteChild,
Packit b099d7
    /* extension	  */	NULL
Packit b099d7
  },{
Packit b099d7
    /* extension	  */	NULL
Packit b099d7
  },{
Packit b099d7
    /* extension	  */	NULL
Packit b099d7
  },{
Packit b099d7
    /* extension	  */	NULL
Packit b099d7
  },{
Packit b099d7
    /* extension	  */	NULL
Packit b099d7
  }
Packit b099d7
};
Packit b099d7
Packit b099d7
externaldef(transientshellwidgetclass) WidgetClass transientShellWidgetClass =
Packit b099d7
	(WidgetClass) (&transientShellClassRec);
Packit b099d7
Packit b099d7
/***************************************************************************
Packit b099d7
 *
Packit b099d7
 * TopLevelShell class record
Packit b099d7
 *
Packit b099d7
 ***************************************************************************/
Packit b099d7
Packit b099d7
#undef Offset
Packit b099d7
#define Offset(x)	(XtOffsetOf(TopLevelShellRec, x))
Packit b099d7
Packit b099d7
static XtResource topLevelResources[]=
Packit b099d7
{
Packit b099d7
	{ XtNiconName, XtCIconName, XtRString, sizeof(String),
Packit b099d7
	    Offset(topLevel.icon_name), XtRString, (XtPointer) NULL},
Packit b099d7
	{ XtNiconNameEncoding, XtCIconNameEncoding, XtRAtom, sizeof(Atom),
Packit b099d7
	    Offset(topLevel.icon_name_encoding),
Packit b099d7
	    XtRCallProc, (XtPointer) _XtTitleEncoding},
Packit b099d7
	{ XtNiconic, XtCIconic, XtRBoolean, sizeof(Boolean),
Packit b099d7
	    Offset(topLevel.iconic), XtRImmediate, (XtPointer)False}
Packit b099d7
};
Packit b099d7
Packit b099d7
static void TopLevelInitialize();
Packit b099d7
static Boolean TopLevelSetValues();
Packit b099d7
static void TopLevelDestroy();
Packit b099d7
Packit b099d7
externaldef(toplevelshellclassrec) TopLevelShellClassRec topLevelShellClassRec = {
Packit b099d7
  {
Packit b099d7
    /* superclass         */    (WidgetClass) &vendorShellClassRec,
Packit b099d7
    /* class_name         */    "TopLevelShell",
Packit b099d7
    /* size               */    sizeof(TopLevelShellRec),
Packit b099d7
    /* Class Initializer  */	NULL,
Packit b099d7
    /* class_part_initialize*/	NULL,
Packit b099d7
    /* Class init'ed ?    */	FALSE,
Packit b099d7
    /* initialize         */    TopLevelInitialize,
Packit b099d7
    /* initialize_notify    */	NULL,		
Packit b099d7
    /* realize            */    XtInheritRealize,
Packit b099d7
    /* actions            */    NULL,
Packit b099d7
    /* num_actions        */    0,
Packit b099d7
    /* resources          */    topLevelResources,
Packit b099d7
    /* resource_count     */	XtNumber(topLevelResources),
Packit b099d7
    /* xrm_class          */    NULLQUARK,
Packit b099d7
    /* compress_motion    */    FALSE,
Packit b099d7
    /* compress_exposure  */    TRUE,
Packit b099d7
    /* compress_enterleave*/ 	FALSE,
Packit b099d7
    /* visible_interest   */    FALSE,
Packit b099d7
    /* destroy            */    TopLevelDestroy,
Packit b099d7
    /* resize             */    XtInheritResize,
Packit b099d7
    /* expose             */    NULL,
Packit b099d7
    /* set_values         */    TopLevelSetValues,
Packit b099d7
    /* set_values_hook      */	NULL,			
Packit b099d7
    /* set_values_almost    */	XtInheritSetValuesAlmost,  
Packit b099d7
    /* get_values_hook      */	NULL,			
Packit b099d7
    /* accept_focus       */    NULL,
Packit b099d7
    /* intrinsics version */	XtVersion,
Packit b099d7
    /* callback offsets   */    NULL,
Packit b099d7
    /* tm_table		    */  XtInheritTranslations,
Packit b099d7
    /* query_geometry	    */  NULL,
Packit b099d7
    /* display_accelerator  */  NULL,
Packit b099d7
    /* extension	    */  NULL
Packit b099d7
  },{
Packit b099d7
    /* geometry_manager   */    XtInheritGeometryManager,
Packit b099d7
    /* change_managed     */    XtInheritChangeManaged,
Packit b099d7
    /* insert_child	  */	XtInheritInsertChild,
Packit b099d7
    /* delete_child	  */	XtInheritDeleteChild,
Packit b099d7
    /* extension	    */  NULL
Packit b099d7
  },{
Packit b099d7
    /* extension	    */  NULL
Packit b099d7
  },{
Packit b099d7
    /* extension	    */  NULL
Packit b099d7
  },{
Packit b099d7
    /* extension	    */  NULL
Packit b099d7
  },{
Packit b099d7
    /* extension	    */  NULL
Packit b099d7
  }
Packit b099d7
};
Packit b099d7
Packit b099d7
externaldef(toplevelshellwidgetclass) WidgetClass topLevelShellWidgetClass =
Packit b099d7
	(WidgetClass) (&topLevelShellClassRec);
Packit b099d7
Packit b099d7
/***************************************************************************
Packit b099d7
 *
Packit b099d7
 * ApplicationShell class record
Packit b099d7
 *
Packit b099d7
 ***************************************************************************/
Packit b099d7
Packit b099d7
#undef Offset
Packit b099d7
#define Offset(x)	(XtOffsetOf(ApplicationShellRec, x))
Packit b099d7
Packit b099d7
static XtResource applicationResources[]=
Packit b099d7
{
Packit b099d7
	{ XtNargc, XtCArgc, XtRInt, sizeof(int),
Packit b099d7
	    Offset(application.argc), XtRImmediate, (XtPointer)0}, 
Packit b099d7
	{ XtNargv, XtCArgv, XtRStringArray, sizeof(String*),
Packit b099d7
	    Offset(application.argv), XtRPointer, (XtPointer) NULL}
Packit b099d7
};
Packit b099d7
Packit b099d7
static void ApplicationInitialize();
Packit b099d7
static void ApplicationDestroy();
Packit b099d7
static void ApplicationShellInsertChild();
Packit b099d7
Packit b099d7
static CompositeClassExtensionRec compositeClassExtension = {
Packit b099d7
    /* next_extension	*/	NULL,
Packit b099d7
    /* record_type	*/	NULLQUARK,
Packit b099d7
    /* version		*/	XtCompositeExtensionVersion,
Packit b099d7
    /* record_size	*/	sizeof(CompositeClassExtensionRec),
Packit b099d7
    /* accepts_objects	*/	TRUE
Packit b099d7
};
Packit b099d7
Packit b099d7
Packit b099d7
externaldef(applicationshellclassrec) ApplicationShellClassRec applicationShellClassRec = {
Packit b099d7
  {
Packit b099d7
    /* superclass         */    (WidgetClass) &topLevelShellClassRec,
Packit b099d7
    /* class_name         */    "ApplicationShell",
Packit b099d7
    /* size               */    sizeof(ApplicationShellRec),
Packit b099d7
    /* Class Initializer  */	NULL,
Packit b099d7
    /* class_part_initialize*/	NULL,
Packit b099d7
    /* Class init'ed ?    */	FALSE,
Packit b099d7
    /* initialize         */    ApplicationInitialize,
Packit b099d7
    /* initialize_notify  */	NULL,		
Packit b099d7
    /* realize            */    XtInheritRealize,
Packit b099d7
    /* actions            */    NULL,
Packit b099d7
    /* num_actions        */    0,
Packit b099d7
    /* resources          */    applicationResources,
Packit b099d7
    /* resource_count     */	XtNumber(applicationResources),
Packit b099d7
    /* xrm_class          */    NULLQUARK,
Packit b099d7
    /* compress_motion    */    FALSE,
Packit b099d7
    /* compress_exposure  */    TRUE,
Packit b099d7
    /* compress_enterleave*/    FALSE,
Packit b099d7
    /* visible_interest   */    FALSE,
Packit b099d7
    /* destroy            */    ApplicationDestroy,
Packit b099d7
    /* resize             */    XtInheritResize,
Packit b099d7
    /* expose             */    NULL,
Packit b099d7
    /* set_values         */    NULL,
Packit b099d7
    /* set_values_hook    */	NULL,			
Packit b099d7
    /* set_values_almost  */	XtInheritSetValuesAlmost,
Packit b099d7
    /* get_values_hook    */	NULL,			
Packit b099d7
    /* accept_focus       */    NULL,
Packit b099d7
    /* intrinsics version */	XtVersion,
Packit b099d7
    /* callback offsets   */    NULL,
Packit b099d7
    /* tm_table		  */	XtInheritTranslations,
Packit b099d7
    /* query_geometry	  */	NULL,
Packit b099d7
    /* display_accelerator*/	NULL,
Packit b099d7
    /* extension	  */	NULL
Packit b099d7
  },{
Packit b099d7
    /* geometry_manager   */    XtInheritGeometryManager,
Packit b099d7
    /* change_managed     */    XtInheritChangeManaged,
Packit b099d7
    /* insert_child	  */	ApplicationShellInsertChild,
Packit b099d7
    /* delete_child	  */	XtInheritDeleteChild,
Packit b099d7
    /* extension	  */	(XtPointer)&compositeClassExtension
Packit b099d7
  },{
Packit b099d7
    /* extension	  */	NULL
Packit b099d7
  },{
Packit b099d7
    /* extension	  */	NULL
Packit b099d7
  },{
Packit b099d7
    /* extension	  */	NULL
Packit b099d7
  },{
Packit b099d7
    /* extension	  */	NULL
Packit b099d7
  },{
Packit b099d7
    /* extension	  */	NULL
Packit b099d7
  }
Packit b099d7
};
Packit b099d7
Packit b099d7
externaldef(applicationshellwidgetclass) WidgetClass applicationShellWidgetClass =
Packit b099d7
	(WidgetClass) (&applicationShellClassRec);
Packit b099d7
Packit b099d7
/****************************************************************************
Packit b099d7
 * Whew!
Packit b099d7
 ****************************************************************************/
Packit b099d7
Packit b099d7
static void ComputeWMSizeHints(w, hints)
Packit b099d7
    WMShellWidget w;
Packit b099d7
    XSizeHints *hints;
Packit b099d7
{
Packit b099d7
    register long flags;
Packit b099d7
    hints->flags = flags = w->wm.size_hints.flags;
Packit b099d7
#define copy(field) hints->field = w->wm.size_hints.field
Packit b099d7
    if (flags & (USPosition | PPosition)) {
Packit b099d7
	copy(x);
Packit b099d7
	copy(y);
Packit b099d7
    }
Packit b099d7
    if (flags & (USSize | PSize)) {
Packit b099d7
	copy(width);
Packit b099d7
	copy(height);
Packit b099d7
    }
Packit b099d7
    if (flags & PMinSize) {
Packit b099d7
	copy(min_width);
Packit b099d7
	copy(min_height);
Packit b099d7
    }
Packit b099d7
    if (flags & PMaxSize) {
Packit b099d7
	copy(max_width);
Packit b099d7
	copy(max_height);
Packit b099d7
    }
Packit b099d7
    if (flags & PResizeInc) {
Packit b099d7
	copy(width_inc);
Packit b099d7
	copy(height_inc);
Packit b099d7
    }
Packit b099d7
    if (flags & PAspect) {
Packit b099d7
	copy(min_aspect.x);
Packit b099d7
	copy(min_aspect.y);
Packit b099d7
	copy(max_aspect.x);
Packit b099d7
	copy(max_aspect.y);
Packit b099d7
    }
Packit b099d7
#undef copy
Packit b099d7
#define copy(field) hints->field = w->wm.field
Packit b099d7
    if (flags & PBaseSize) {
Packit b099d7
	copy(base_width);
Packit b099d7
	copy(base_height);
Packit b099d7
    }
Packit b099d7
    if (flags & PWinGravity)
Packit b099d7
	copy(win_gravity);
Packit b099d7
#undef copy
Packit b099d7
}
Packit b099d7
Packit b099d7
static void _SetWMSizeHints(w)
Packit b099d7
    WMShellWidget w;
Packit b099d7
{
Packit b099d7
    XSizeHints *size_hints = XAllocSizeHints();
Packit b099d7
Packit b099d7
    if (size_hints == NULL) _XtAllocError("XAllocSizeHints");
Packit b099d7
    ComputeWMSizeHints(w, size_hints);
Packit b099d7
    XSetWMNormalHints(XtDisplay((Widget)w), XtWindow((Widget)w), size_hints);
Packit b099d7
    XFree((char*)size_hints);
Packit b099d7
}
Packit b099d7
Packit b099d7
static ShellClassExtension _FindClassExtension(widget_class)
Packit b099d7
    WidgetClass widget_class;
Packit b099d7
{
Packit b099d7
    ShellClassExtension ext;
Packit b099d7
    for (ext = (ShellClassExtension)((ShellWidgetClass)widget_class)
Packit b099d7
	       ->shell_class.extension;
Packit b099d7
	 ext != NULL && ext->record_type != NULLQUARK;
Packit b099d7
	 ext = (ShellClassExtension)ext->next_extension);
Packit b099d7
Packit b099d7
    if (ext != NULL) {
Packit b099d7
	if (  ext->version == XtShellExtensionVersion
Packit b099d7
	      && ext->record_size == sizeof(ShellClassExtensionRec)) {
Packit b099d7
	    /* continue */
Packit b099d7
	} else {
Packit b099d7
	    String params[1];
Packit b099d7
	    Cardinal num_params = 1;
Packit b099d7
	    params[0] = widget_class->core_class.class_name;
Packit b099d7
	    XtErrorMsg( "invalidExtension", "shellClassPartInitialize",
Packit b099d7
		        XtCXtToolkitError,
Packit b099d7
		 "widget class %s has invalid ShellClassExtension record",
Packit b099d7
		 params, &num_params);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
    return ext;
Packit b099d7
}
Packit b099d7
Packit b099d7
static void ClassPartInitialize(widget_class)
Packit b099d7
    WidgetClass widget_class;
Packit b099d7
{
Packit b099d7
    ShellClassExtension ext = _FindClassExtension(widget_class);
Packit b099d7
    if (ext != NULL) {
Packit b099d7
	if (ext->root_geometry_manager == XtInheritRootGeometryManager) {
Packit b099d7
	    ext->root_geometry_manager =
Packit b099d7
		_FindClassExtension(widget_class->core_class.superclass)
Packit b099d7
		    ->root_geometry_manager;
Packit b099d7
	}
Packit b099d7
    } else {
Packit b099d7
	/* if not found, spec requires XtInheritRootGeometryManager */
Packit b099d7
	XtPointer *extP
Packit b099d7
	    = &((ShellWidgetClass)widget_class)->shell_class.extension;
Packit b099d7
	ext = XtNew(ShellClassExtensionRec);
Packit b099d7
	bcopy((char*)_FindClassExtension(widget_class->core_class.superclass),
Packit b099d7
	      (char*)ext,
Packit b099d7
	      sizeof(ShellClassExtensionRec));
Packit b099d7
	ext->next_extension = *extP;
Packit b099d7
	*extP = (XtPointer)ext;
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
static void EventHandler();
Packit b099d7
static void _popup_set_prop();
Packit b099d7
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void XtCopyDefaultDepth(widget, offset, value)
Packit b099d7
    Widget      widget;
Packit b099d7
    int		offset;
Packit b099d7
    XrmValue    *value;
Packit b099d7
{
Packit b099d7
    value->addr = (XPointer)(&DefaultDepthOfScreen(XtScreenOfObject(widget)));
Packit b099d7
}
Packit b099d7
Packit b099d7
#ifndef CRAY
Packit b099d7
static
Packit b099d7
#endif
Packit b099d7
void _XtShellDepth(widget,closure,value)
Packit b099d7
    Widget widget;
Packit b099d7
    int closure;
Packit b099d7
    XrmValue *value;
Packit b099d7
{
Packit b099d7
   if (widget->core.parent == NULL) XtCopyDefaultDepth(widget,closure,value);
Packit b099d7
   else _XtCopyFromParent (widget,closure,value);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void XtCopyDefaultColormap(widget, offset, value)
Packit b099d7
    Widget      widget;
Packit b099d7
    int		offset;
Packit b099d7
    XrmValue    *value;
Packit b099d7
{
Packit b099d7
    value->addr = (XPointer)(&DefaultColormapOfScreen(XtScreenOfObject(widget)));
Packit b099d7
}
Packit b099d7
Packit b099d7
#ifndef CRAY
Packit b099d7
static
Packit b099d7
#endif
Packit b099d7
void _XtShellColormap(widget,closure,value)
Packit b099d7
    Widget widget;
Packit b099d7
    int closure;
Packit b099d7
    XrmValue *value;
Packit b099d7
{
Packit b099d7
   if (widget->core.parent == NULL)
Packit b099d7
	   XtCopyDefaultColormap(widget,closure,value);
Packit b099d7
   else _XtCopyFromParent (widget,closure,value);
Packit b099d7
}
Packit b099d7
Packit b099d7
#ifndef CRAY
Packit b099d7
static
Packit b099d7
#endif
Packit b099d7
void _XtShellAncestorSensitive(widget,closure,value)
Packit b099d7
    Widget widget;
Packit b099d7
    int closure;
Packit b099d7
    XrmValue *value;
Packit b099d7
{
Packit b099d7
   static Boolean true = True;
Packit b099d7
   if (widget->core.parent == NULL) value->addr = (XPointer)(&true);
Packit b099d7
   else _XtCopyFromParent (widget,closure,value);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
#ifndef CRAY
Packit b099d7
static
Packit b099d7
#endif
Packit b099d7
void _XtTitleEncoding(widget, offset, value)
Packit b099d7
    Widget widget;
Packit b099d7
    int offset;
Packit b099d7
    XrmValue *value;
Packit b099d7
{
Packit b099d7
    static Atom atom;
Packit b099d7
    if (XtWidgetToApplicationContext(widget)->langProcRec.proc) atom = None;
Packit b099d7
    else atom = XA_STRING;
Packit b099d7
    value->addr = (XPointer) &ato;;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void Initialize(req, new, args, num_args)
Packit b099d7
	Widget req, new;
Packit b099d7
	ArgList args;		/* unused */
Packit b099d7
	Cardinal *num_args;	/* unused */
Packit b099d7
{
Packit b099d7
	ShellWidget w = (ShellWidget) new;
Packit b099d7
Packit b099d7
	w->shell.popped_up = FALSE;
Packit b099d7
	w->shell.client_specified =
Packit b099d7
	    _XtShellNotReparented | _XtShellPositionValid;
Packit b099d7
Packit b099d7
	if (w->core.x == BIGSIZE) {
Packit b099d7
	    w->core.x = 0;
Packit b099d7
	    if (w->core.y == BIGSIZE) w->core.y = 0;
Packit b099d7
	} else {
Packit b099d7
	    if (w->core.y == BIGSIZE) w->core.y = 0;
Packit b099d7
	    else w->shell.client_specified |= _XtShellPPositionOK;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	XtAddEventHandler(new, (EventMask) StructureNotifyMask,
Packit b099d7
		TRUE, EventHandler, (XtPointer) NULL);
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void WMInitialize(req, new, args, num_args)
Packit b099d7
	Widget req,new;
Packit b099d7
	ArgList args;		/* unused */
Packit b099d7
	Cardinal *num_args;	/* unused */
Packit b099d7
{
Packit b099d7
	WMShellWidget w = (WMShellWidget) new;
Packit b099d7
	TopLevelShellWidget tls = (TopLevelShellWidget) new;	/* maybe */
Packit b099d7
Packit b099d7
	if(w->wm.title == NULL) {
Packit b099d7
	    if (XtIsTopLevelShell(new) &&
Packit b099d7
		    tls->topLevel.icon_name != NULL &&
Packit b099d7
		    strlen(tls->topLevel.icon_name) != 0) {
Packit b099d7
		w->wm.title = XtNewString(tls->topLevel.icon_name);
Packit b099d7
	    } else {
Packit b099d7
		w->wm.title = XtNewString(w->core.name);
Packit b099d7
	    }
Packit b099d7
	} else {
Packit b099d7
	    w->wm.title = XtNewString(w->wm.title);
Packit b099d7
	}
Packit b099d7
	w->wm.size_hints.flags = 0;
Packit b099d7
	w->wm.wm_hints.flags = 0;
Packit b099d7
Packit b099d7
	/* Find the values of the atoms, somewhere... */
Packit b099d7
Packit b099d7
	for (new = new->core.parent;
Packit b099d7
		new != NULL && !XtIsWMShell(new);
Packit b099d7
		new = new->core.parent) {}
Packit b099d7
	if (new == NULL) {
Packit b099d7
	    w->wm.wm_configure_denied =
Packit b099d7
		    XInternAtom(XtDisplay(w), "WM_CONFIGURE_DENIED", FALSE);
Packit b099d7
	    w->wm.wm_moved = XInternAtom(XtDisplay(w), "WM_MOVED", FALSE);
Packit b099d7
	} else {
Packit b099d7
	    w->wm.wm_configure_denied = WM_CONFIGURE_DENIED(new);
Packit b099d7
	    w->wm.wm_moved = WM_MOVED(new);
Packit b099d7
	}
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void TopLevelInitialize(req, new, args, num_args)
Packit b099d7
	Widget req, new;
Packit b099d7
	ArgList args;		/* unused */
Packit b099d7
	Cardinal *num_args;	/* unused */
Packit b099d7
{
Packit b099d7
	TopLevelShellWidget w = (TopLevelShellWidget) new;
Packit b099d7
Packit b099d7
	if (w->topLevel.icon_name == NULL) {
Packit b099d7
	    w->topLevel.icon_name = XtNewString(w->core.name);
Packit b099d7
	} else {
Packit b099d7
	    w->topLevel.icon_name = XtNewString(w->topLevel.icon_name);
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if (w->topLevel.iconic)
Packit b099d7
	    w->wm.wm_hints.initial_state = IconicState;
Packit b099d7
}
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void ApplicationInitialize(req, new, args, num_args)
Packit b099d7
    Widget req, new;
Packit b099d7
    ArgList args;		/* unused */
Packit b099d7
    Cardinal *num_args;		/* unused */
Packit b099d7
{
Packit b099d7
    ApplicationShellWidget w = (ApplicationShellWidget)new;
Packit b099d7
    /* copy the argv if passed */
Packit b099d7
    if (w->application.argc > 0) {
Packit b099d7
	int i = w->application.argc;
Packit b099d7
	char **argv = (char**)XtMalloc( (unsigned)i*sizeof(char*) );
Packit b099d7
	char **argp = w->application.argv + i;
Packit b099d7
	while (--i >= 0) {
Packit b099d7
	    argv[i] = *--argp;
Packit b099d7
	}
Packit b099d7
	w->application.argv = argv;
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
static void Resize(w)
Packit b099d7
    Widget w;
Packit b099d7
{
Packit b099d7
    register ShellWidget sw = (ShellWidget)w;    
Packit b099d7
    Widget childwid;
Packit b099d7
    int i;
Packit b099d7
    for(i = 0; i < sw->composite.num_children; i++) {
Packit b099d7
        if (XtIsManaged(sw->composite.children[i])) {
Packit b099d7
             childwid = sw->composite.children[i];
Packit b099d7
             XtResizeWidget(childwid, sw->core.width, sw->core.height,
Packit b099d7
                           childwid->core.border_width);
Packit b099d7
	     break;		/* can only be one managed child */
Packit b099d7
        }
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
static void GetGeometry();
Packit b099d7
Packit b099d7
static void Realize(wid, vmask, attr)
Packit b099d7
	Widget wid;
Packit b099d7
	Mask *vmask;
Packit b099d7
	XSetWindowAttributes *attr;
Packit b099d7
{
Packit b099d7
	ShellWidget w = (ShellWidget) wid;
Packit b099d7
        Mask mask = *vmask;
Packit b099d7
Packit b099d7
	if (! (w->shell.client_specified & _XtShellGeometryParsed)) {
Packit b099d7
	    /* we'll get here only if there was no child the first
Packit b099d7
	       time we were realized.  If the shell was Unrealized
Packit b099d7
	       and then re-Realized, we probably don't want to
Packit b099d7
	       re-evaluate the defaults anyway.
Packit b099d7
	     */
Packit b099d7
	    GetGeometry(wid, (Widget)NULL);
Packit b099d7
	}
Packit b099d7
	else if (w->core.background_pixmap == XtUnspecifiedPixmap) {
Packit b099d7
	    /* I attempt to inherit my child's background to avoid screen flash
Packit b099d7
	     * if there is latency between when I get resized and when my child
Packit b099d7
	     * is resized.  Background=None is not satisfactory, as I want the
Packit b099d7
	     * user to get immediate feedback on the new dimensions (most
Packit b099d7
	     * particularly in the case of a non-reparenting wm).  It is
Packit b099d7
	     * especially important to have the server clear any old cruft
Packit b099d7
	     * from the display when I am resized larger.
Packit b099d7
	     */
Packit b099d7
	    register Widget *childP = w->composite.children;
Packit b099d7
	    int i;
Packit b099d7
	    for (i = w->composite.num_children; i; i--, childP++) {
Packit b099d7
		if (XtIsWidget(*childP) && XtIsManaged(*childP)) {
Packit b099d7
		    if ((*childP)->core.background_pixmap
Packit b099d7
			    != XtUnspecifiedPixmap) {
Packit b099d7
			mask &= ~(CWBackPixel);
Packit b099d7
			mask |= CWBackPixmap;
Packit b099d7
			attr->background_pixmap =
Packit b099d7
			    w->core.background_pixmap =
Packit b099d7
				(*childP)->core.background_pixmap;
Packit b099d7
		    } else {
Packit b099d7
			attr->background_pixel = 
Packit b099d7
			    w->core.background_pixel = 
Packit b099d7
				(*childP)->core.background_pixel;
Packit b099d7
		    }
Packit b099d7
		    break;
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if(w->shell.save_under) {
Packit b099d7
		mask |= CWSaveUnder;
Packit b099d7
		attr->save_under = TRUE;
Packit b099d7
	}
Packit b099d7
	if(w->shell.override_redirect) {
Packit b099d7
		mask |= CWOverrideRedirect;
Packit b099d7
		attr->override_redirect = TRUE;
Packit b099d7
	}
Packit b099d7
	if (wid->core.width == 0 || wid->core.height == 0) {
Packit b099d7
	    Cardinal count = 1;
Packit b099d7
	    XtErrorMsg("invalidDimension", "shellRealize", XtCXtToolkitError,
Packit b099d7
		       "Shell widget %s has zero width and/or height",
Packit b099d7
		       &wid->core.name, &count);
Packit b099d7
	}
Packit b099d7
	wid->core.window = XCreateWindow(XtDisplay(wid),
Packit b099d7
		wid->core.screen->root, (int)wid->core.x, (int)wid->core.y,
Packit b099d7
		(unsigned int)wid->core.width, (unsigned int)wid->core.height,
Packit b099d7
		(unsigned int)wid->core.border_width, (int) wid->core.depth,
Packit b099d7
		(unsigned int) InputOutput, w->shell.visual,
Packit b099d7
		mask, attr);
Packit b099d7
Packit b099d7
	_popup_set_prop(w);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
static void _SetTransientForHint(w, delete)
Packit b099d7
     TransientShellWidget w;
Packit b099d7
     Boolean delete;
Packit b099d7
{
Packit b099d7
    Window window_group;
Packit b099d7
Packit b099d7
    if (w->wm.transient) {
Packit b099d7
	if (w->transient.transient_for != NULL
Packit b099d7
	    && XtIsRealized(w->transient.transient_for))
Packit b099d7
	    window_group = XtWindow(w->transient.transient_for);
Packit b099d7
	else if ((window_group = w->wm.wm_hints.window_group)
Packit b099d7
		 == XtUnspecifiedWindowGroup) {
Packit b099d7
	    if (delete)
Packit b099d7
		XDeleteProperty( XtDisplay((Widget)w),
Packit b099d7
				 XtWindow((Widget)w),
Packit b099d7
				 XA_WM_TRANSIENT_FOR
Packit b099d7
				);
Packit b099d7
	    return;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	XSetTransientForHint( XtDisplay((Widget)w),
Packit b099d7
			      XtWindow((Widget)w),
Packit b099d7
			      window_group
Packit b099d7
			     );
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
static void TransientRealize(w, vmask, attr)
Packit b099d7
     Widget w;
Packit b099d7
     Mask *vmask;
Packit b099d7
     XSetWindowAttributes *attr;
Packit b099d7
{
Packit b099d7
    (*transientShellWidgetClass->core_class.superclass->
Packit b099d7
     core_class.realize) (w, vmask, attr);
Packit b099d7
Packit b099d7
    _SetTransientForHint((TransientShellWidget)w, False);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
static void EvaluateWMHints(w)
Packit b099d7
    WMShellWidget w;
Packit b099d7
{
Packit b099d7
	XWMHints *hintp = &w->wm.wm_hints;
Packit b099d7
Packit b099d7
	hintp->flags = StateHint | InputHint;
Packit b099d7
Packit b099d7
	if (hintp->icon_x == XtUnspecifiedShellInt)
Packit b099d7
	    hintp->icon_x = -1;
Packit b099d7
	else
Packit b099d7
	    hintp->flags |= IconPositionHint;
Packit b099d7
Packit b099d7
	if (hintp->icon_y == XtUnspecifiedShellInt)
Packit b099d7
	    hintp->icon_y = -1;
Packit b099d7
	else
Packit b099d7
	    hintp->flags |= IconPositionHint;
Packit b099d7
Packit b099d7
	if (hintp->icon_pixmap != None) hintp->flags |= IconPixmapHint;
Packit b099d7
	if (hintp->icon_mask != None)   hintp->flags |= IconMaskHint;
Packit b099d7
	if (hintp->icon_window != None) hintp->flags |= IconWindowHint;
Packit b099d7
Packit b099d7
	if (hintp->window_group == XtUnspecifiedWindow) {
Packit b099d7
	    if(w->core.parent) {
Packit b099d7
		Widget p;
Packit b099d7
		for (p = w->core.parent; p->core.parent; p = p->core.parent);
Packit b099d7
		if (XtIsRealized(p)) {
Packit b099d7
		    hintp->window_group = XtWindow(p);
Packit b099d7
		    hintp->flags |=  WindowGroupHint;
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
	} else if (hintp->window_group != XtUnspecifiedWindowGroup)
Packit b099d7
	    hintp->flags |=  WindowGroupHint;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
static void EvaluateSizeHints(w)
Packit b099d7
    WMShellWidget w;
Packit b099d7
{
Packit b099d7
	struct _OldXSizeHints *sizep = &w->wm.size_hints;
Packit b099d7
Packit b099d7
	sizep->x = w->core.x;
Packit b099d7
	sizep->y = w->core.y;
Packit b099d7
	sizep->width = w->core.width;
Packit b099d7
	sizep->height = w->core.height;
Packit b099d7
Packit b099d7
	if (sizep->flags & USSize) {
Packit b099d7
	    if (sizep->flags & PSize) sizep->flags &= ~PSize;
Packit b099d7
	} else
Packit b099d7
	    sizep->flags |= PSize;
Packit b099d7
Packit b099d7
	if (sizep->flags & USPosition) {
Packit b099d7
	    if (sizep->flags & PPosition) sizep->flags &= ~PPosition;
Packit b099d7
	} else if (w->shell.client_specified & _XtShellPPositionOK)
Packit b099d7
	    sizep->flags |= PPosition;
Packit b099d7
Packit b099d7
	if (sizep->min_aspect.x != XtUnspecifiedShellInt
Packit b099d7
	    || sizep->min_aspect.y != XtUnspecifiedShellInt
Packit b099d7
	    || sizep->max_aspect.x != XtUnspecifiedShellInt
Packit b099d7
	    || sizep->max_aspect.y != XtUnspecifiedShellInt) {
Packit b099d7
	    sizep->flags |= PAspect;
Packit b099d7
	}
Packit b099d7
	if(w->wm.base_width != XtUnspecifiedShellInt
Packit b099d7
	   || w->wm.base_height != XtUnspecifiedShellInt) {
Packit b099d7
	    sizep->flags |= PBaseSize;
Packit b099d7
	    if (w->wm.base_width == XtUnspecifiedShellInt)
Packit b099d7
		w->wm.base_width = 0;
Packit b099d7
	    if (w->wm.base_height == XtUnspecifiedShellInt)
Packit b099d7
		w->wm.base_height = 0;
Packit b099d7
	}
Packit b099d7
	if (sizep->width_inc != XtUnspecifiedShellInt
Packit b099d7
	    || sizep->height_inc != XtUnspecifiedShellInt) {
Packit b099d7
	    if (sizep->width_inc < 1) sizep->width_inc = 1;
Packit b099d7
	    if (sizep->height_inc < 1) sizep->height_inc = 1;
Packit b099d7
	    sizep->flags |= PResizeInc;
Packit b099d7
	}
Packit b099d7
	if (sizep->max_width != XtUnspecifiedShellInt
Packit b099d7
	    || sizep->max_height != XtUnspecifiedShellInt) {
Packit b099d7
	    sizep->flags |= PMaxSize;
Packit b099d7
	    if (sizep->max_width == XtUnspecifiedShellInt)
Packit b099d7
		sizep->max_width = BIGSIZE;
Packit b099d7
	    if (sizep->max_height == XtUnspecifiedShellInt)
Packit b099d7
		sizep->max_height = BIGSIZE;
Packit b099d7
	}
Packit b099d7
	if(sizep->min_width != XtUnspecifiedShellInt
Packit b099d7
	   || sizep->min_height != XtUnspecifiedShellInt) {
Packit b099d7
	    sizep->flags |= PMinSize;
Packit b099d7
	    if (sizep->min_width == XtUnspecifiedShellInt)
Packit b099d7
		sizep->min_width = 1;
Packit b099d7
	    if (sizep->min_height == XtUnspecifiedShellInt)
Packit b099d7
		sizep->min_height = 1;
Packit b099d7
	}
Packit b099d7
}
Packit b099d7
Packit b099d7
static void _popup_set_prop(w)
Packit b099d7
	ShellWidget w;
Packit b099d7
{
Packit b099d7
	Widget p;
Packit b099d7
	WMShellWidget wmshell = (WMShellWidget) w;
Packit b099d7
	TopLevelShellWidget tlshell = (TopLevelShellWidget) w;
Packit b099d7
	ApplicationShellWidget appshell = (ApplicationShellWidget) w;
Packit b099d7
	XTextProperty icon_name;
Packit b099d7
	XTextProperty window_name;
Packit b099d7
	char **argv;
Packit b099d7
	int argc;
Packit b099d7
	XSizeHints *size_hints;
Packit b099d7
	Window window_group;
Packit b099d7
	XClassHint classhint;
Packit b099d7
	Boolean copied_iname, copied_wname;
Packit b099d7
Packit b099d7
	if (!XtIsWMShell((Widget)w) || w->shell.override_redirect) return;
Packit b099d7
Packit b099d7
	if ((size_hints = XAllocSizeHints()) == NULL)
Packit b099d7
	    _XtAllocError("XAllocSizeHints");
Packit b099d7
Packit b099d7
	copied_iname = copied_wname = False;
Packit b099d7
        if (wmshell->wm.title_encoding == None &&
Packit b099d7
	    XmbTextListToTextProperty(XtDisplay((Widget)w),
Packit b099d7
				      (char**)&wmshell->wm.title,
Packit b099d7
				      1, XStdICCTextStyle,
Packit b099d7
				      &window_name) >= Success) {
Packit b099d7
	    copied_wname = True;
Packit b099d7
	} else {
Packit b099d7
	    window_name.value = (unsigned char*)wmshell->wm.title;
Packit b099d7
	    window_name.encoding = wmshell->wm.title_encoding;
Packit b099d7
	    window_name.format = 8;
Packit b099d7
	    window_name.nitems = strlen((char *)window_name.value);
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if (XtIsTopLevelShell((Widget)w)) {
Packit b099d7
            if (tlshell->topLevel.icon_name_encoding == None &&
Packit b099d7
		XmbTextListToTextProperty(XtDisplay((Widget)w),
Packit b099d7
					  (char**)&tlshell->topLevel.icon_name,
Packit b099d7
					  1, XStdICCTextStyle,
Packit b099d7
					  &icon_name) >= Success) {
Packit b099d7
		copied_iname = True;
Packit b099d7
	    } else {
Packit b099d7
		icon_name.value = (unsigned char*)tlshell->topLevel.icon_name;
Packit b099d7
		icon_name.encoding = tlshell->topLevel.icon_name_encoding;
Packit b099d7
		icon_name.format = 8;
Packit b099d7
		icon_name.nitems = strlen((char *)icon_name.value);
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
Packit b099d7
	EvaluateWMHints(wmshell);
Packit b099d7
	EvaluateSizeHints(wmshell);
Packit b099d7
	ComputeWMSizeHints(wmshell, size_hints);
Packit b099d7
Packit b099d7
	if (wmshell->wm.transient
Packit b099d7
	    && !XtIsTransientShell((Widget)w)
Packit b099d7
	    && (window_group = wmshell->wm.wm_hints.window_group)
Packit b099d7
	       != XtUnspecifiedWindowGroup) {
Packit b099d7
Packit b099d7
	    XSetTransientForHint(XtDisplay((Widget)w),
Packit b099d7
				 XtWindow((Widget)w),
Packit b099d7
				 window_group
Packit b099d7
				 );
Packit b099d7
	}
Packit b099d7
Packit b099d7
	classhint.res_name = w->core.name;
Packit b099d7
	/* For the class, look up to the top of the tree */
Packit b099d7
	for (p = (Widget)w; p->core.parent != NULL; p = p->core.parent);
Packit b099d7
	if (XtIsApplicationShell(p)) {
Packit b099d7
	    classhint.res_class =
Packit b099d7
		((ApplicationShellWidget)p)->application.class;
Packit b099d7
	} else classhint.res_class = XtClass(p)->core_class.class_name;
Packit b099d7
Packit b099d7
	if (XtIsApplicationShell((Widget)w)
Packit b099d7
	    && (argc = appshell->application.argc) != -1)
Packit b099d7
	    argv = (char**)appshell->application.argv;
Packit b099d7
	else {
Packit b099d7
	    argv = NULL;
Packit b099d7
	    argc = 0;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	XSetWMProperties(XtDisplay((Widget)w), XtWindow((Widget)w),
Packit b099d7
			 &window_name,
Packit b099d7
			 (XtIsTopLevelShell((Widget)w)) ? &icon_name : NULL,
Packit b099d7
			 argv, argc,
Packit b099d7
			 size_hints,
Packit b099d7
			 &wmshell->wm.wm_hints,
Packit b099d7
			 &classhint);
Packit b099d7
	XFree((char*)size_hints);
Packit b099d7
	if (copied_wname)
Packit b099d7
	    XFree((XPointer)window_name.value);
Packit b099d7
	if (copied_iname)
Packit b099d7
	    XFree((XPointer)icon_name.value);
Packit b099d7
Packit b099d7
	if (XtWidgetToApplicationContext((Widget)w)->langProcRec.proc) {
Packit b099d7
	    char *locale = setlocale(LC_CTYPE, (char *)NULL);
Packit b099d7
	    if (locale)
Packit b099d7
		XChangeProperty(XtDisplay((Widget)w), XtWindow((Widget)w),
Packit b099d7
				XInternAtom(XtDisplay((Widget)w),
Packit b099d7
					    "WM_LOCALE_NAME", False),
Packit b099d7
				XA_STRING, 8, PropModeReplace,
Packit b099d7
				(unsigned char *)locale, strlen(locale));
Packit b099d7
	}
Packit b099d7
}
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void EventHandler(wid, closure, event, continue_to_dispatch)
Packit b099d7
	Widget wid;
Packit b099d7
	XtPointer closure;	/* unused */
Packit b099d7
	XEvent *event;
Packit b099d7
        Boolean *continue_to_dispatch; /* unused */
Packit b099d7
{
Packit b099d7
	register ShellWidget w = (ShellWidget) wid;
Packit b099d7
	WMShellWidget wmshell = (WMShellWidget) w;
Packit b099d7
	Boolean  sizechanged = FALSE;
Packit b099d7
	unsigned int width, height, border_width, tmpdepth;
Packit b099d7
	int tmpx, tmpy, tmp2x, tmp2y;
Packit b099d7
	Window tmproot, tmpchild;
Packit b099d7
Packit b099d7
	if(w->core.window != event->xany.window) {
Packit b099d7
		XtAppErrorMsg(XtWidgetToApplicationContext(wid),
Packit b099d7
			"invalidWindow","eventHandler",XtCXtToolkitError,
Packit b099d7
                        "Event with wrong window",
Packit b099d7
			(String *)NULL, (Cardinal *)NULL);
Packit b099d7
		return;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	switch(event->type) {
Packit b099d7
	    case ConfigureNotify:
Packit b099d7
	        if (w->core.window != event->xconfigure.window)
Packit b099d7
		    return;  /* in case of SubstructureNotify */
Packit b099d7
#define NEQ(x)	( w->core.x != event->xconfigure.x )
Packit b099d7
		if( NEQ(width) || NEQ(height) || NEQ(border_width) ) {
Packit b099d7
			sizechanged = TRUE;
Packit b099d7
#undef NEQ
Packit b099d7
			w->core.width = event->xconfigure.width;
Packit b099d7
			w->core.height = event->xconfigure.height;
Packit b099d7
			w->core.border_width = event->xconfigure.border_width;
Packit b099d7
		}
Packit b099d7
		if (event->xany.send_event /* ICCCM compliant synthetic ev */
Packit b099d7
		    /* || w->shell.override_redirect */
Packit b099d7
		    || w->shell.client_specified & _XtShellNotReparented)
Packit b099d7
	        {
Packit b099d7
		    w->core.x = event->xconfigure.x;
Packit b099d7
		    w->core.y = event->xconfigure.y;
Packit b099d7
		    w->shell.client_specified |= _XtShellPositionValid;
Packit b099d7
		}
Packit b099d7
		else w->shell.client_specified &= ~_XtShellPositionValid;
Packit b099d7
		if (XtIsWMShell(wid) && !wmshell->wm.wait_for_wm) {
Packit b099d7
		    /* Consider trusting the wm again */
Packit b099d7
		    register struct _OldXSizeHints *hintp
Packit b099d7
			= &wmshell->wm.size_hints;
Packit b099d7
#define EQ(x) (hintp->x == w->core.x)
Packit b099d7
		    if (EQ(x) && EQ(y) && EQ(width) && EQ(height)) {
Packit b099d7
			wmshell->wm.wait_for_wm = TRUE;
Packit b099d7
		    }
Packit b099d7
#undef EQ
Packit b099d7
		}		    
Packit b099d7
		break;
Packit b099d7
Packit b099d7
	    case ClientMessage:
Packit b099d7
		if( event->xclient.message_type == WM_CONFIGURE_DENIED(wid)
Packit b099d7
		    && XtIsWMShell(wid)) {
Packit b099d7
Packit b099d7
		    /* 
Packit b099d7
		     * UT Oh! the window manager has come back alive
Packit b099d7
		     * This means either I didn't wait long enough or
Packit b099d7
		     * The WM is sick.
Packit b099d7
		     * Query my real size and position, and adjust my child
Packit b099d7
		     * it needs be.
Packit b099d7
		     */
Packit b099d7
Packit b099d7
		    if(wmshell->wm.wait_for_wm) {
Packit b099d7
			XtAppWarningMsg(XtWidgetToApplicationContext(wid),
Packit b099d7
				"communicationError","windowManager",
Packit b099d7
                                  XtCXtToolkitError,
Packit b099d7
                                  "Window Manager is confused",
Packit b099d7
				  (String *)NULL, (Cardinal *)NULL);
Packit b099d7
		    }
Packit b099d7
		    wmshell->wm.wait_for_wm = TRUE;
Packit b099d7
		    (void) XGetGeometry(XtDisplay(w), XtWindow(w), &tmproot,
Packit b099d7
			    &tmpx, &tmpy, &width, &height, &border_width,
Packit b099d7
			    &tmpdepth);
Packit b099d7
		    (void) XTranslateCoordinates(XtDisplay(w), XtWindow(w), 
Packit b099d7
			    tmproot, (int) tmpx, (int) tmpy,
Packit b099d7
			    &tmp2x, &tmp2y, &tmpchild);
Packit b099d7
		    w->core.x = tmp2x;
Packit b099d7
		    w->core.y = tmp2y;
Packit b099d7
		    if( width != w->core.width || height != w->core.height
Packit b099d7
		       || border_width != w->core.border_width ) {
Packit b099d7
			    w->core.width = width;
Packit b099d7
			    w->core.height = height;
Packit b099d7
			    w->core.border_width = border_width;
Packit b099d7
			    sizechanged = TRUE;
Packit b099d7
		    }
Packit b099d7
Packit b099d7
		    break;
Packit b099d7
		}
Packit b099d7
		if(event->xclient.message_type == WM_MOVED(wid)) {
Packit b099d7
		    w->core.x = event->xclient.data.s[0];
Packit b099d7
		    w->core.y  = event->xclient.data.s[1];
Packit b099d7
		    if (XtIsWMShell((Widget)w)) {
Packit b099d7
			WMShellWidget wmshell = (WMShellWidget) w;
Packit b099d7
			/* Any window manager which sends this must be 
Packit b099d7
			   good guy.  Let's reset our flag. */
Packit b099d7
			wmshell->wm.wait_for_wm = TRUE;
Packit b099d7
		    }
Packit b099d7
		}
Packit b099d7
		break;
Packit b099d7
Packit b099d7
	      case ReparentNotify:
Packit b099d7
		if (event->xreparent.window == XtWindow(w)) {
Packit b099d7
		   if (event->xreparent.parent != RootWindowOfScreen(XtScreen(w)))
Packit b099d7
		       w->shell.client_specified &= ~_XtShellNotReparented;
Packit b099d7
		   else
Packit b099d7
		       w->shell.client_specified |= _XtShellNotReparented;
Packit b099d7
		   w->shell.client_specified &= ~_XtShellPositionValid;
Packit b099d7
	        }
Packit b099d7
		return;
Packit b099d7
 	      case UnmapNotify:
Packit b099d7
 		{
Packit b099d7
 		    XtPerDisplayInput	pdi;
Packit b099d7
 		    XtDevice		device;
Packit b099d7
 		    Widget		p;
Packit b099d7
 
Packit b099d7
 		    pdi = _XtGetPerDisplayInput(event->xunmap.display);
Packit b099d7
 
Packit b099d7
 		    device = &pdi->pointer;
Packit b099d7
 		    if (device->grabType == XtPassiveServerGrab) {
Packit b099d7
 			p = device->grab.widget;
Packit b099d7
 			while (p && !(XtIsShell(p)))
Packit b099d7
 			    p = p->core.parent;
Packit b099d7
 			if (p == wid)
Packit b099d7
 			    device->grabType = XtNoServerGrab;
Packit b099d7
 		    }
Packit b099d7
 
Packit b099d7
 		    device = &pdi->keyboard;
Packit b099d7
 		    if (IsEitherPassiveGrab(device->grabType)) {
Packit b099d7
 			p = device->grab.widget;
Packit b099d7
 			while (p && !(XtIsShell(p)))
Packit b099d7
 			    p = p->core.parent;
Packit b099d7
 			if (p == wid) {
Packit b099d7
 			    device->grabType = XtNoServerGrab;
Packit b099d7
 			    pdi->activatingKey = 0;
Packit b099d7
 			}
Packit b099d7
 		    }
Packit b099d7
 
Packit b099d7
 		    return;
Packit b099d7
 		}
Packit b099d7
Packit b099d7
	      default:
Packit b099d7
		 return;
Packit b099d7
	 } 
Packit b099d7
Packit b099d7
	 if (sizechanged && 
Packit b099d7
                 XtClass(wid)->core_class.resize != (XtWidgetProc) NULL) {
Packit b099d7
	     _GeoPrintTrace((Widget)w,"Shell \"%s\" is being resized to %d %d.\n", XtName(wid), wid->core.width, wid->core.height );
Packit b099d7
	     (*(XtClass(wid)->core_class.resize))(wid);
Packit b099d7
	 }
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
static void Destroy(wid)
Packit b099d7
	Widget wid;
Packit b099d7
{
Packit b099d7
	if (XtIsRealized(wid))
Packit b099d7
	    XDestroyWindow( XtDisplay(wid), XtWindow(wid) );
Packit b099d7
}
Packit b099d7
Packit b099d7
static void WMDestroy(wid)
Packit b099d7
	Widget wid;
Packit b099d7
{
Packit b099d7
	WMShellWidget w = (WMShellWidget) wid;
Packit b099d7
Packit b099d7
	XtFree((char *) w->wm.title);
Packit b099d7
}
Packit b099d7
Packit b099d7
static void TopLevelDestroy(wid)
Packit b099d7
	Widget wid;
Packit b099d7
{
Packit b099d7
	TopLevelShellWidget w = (TopLevelShellWidget) wid;
Packit b099d7
Packit b099d7
	XtFree((char *) w->topLevel.icon_name);
Packit b099d7
}
Packit b099d7
Packit b099d7
static void ApplicationDestroy(wid)
Packit b099d7
	Widget wid;
Packit b099d7
{
Packit b099d7
	ApplicationShellWidget w = (ApplicationShellWidget) wid;
Packit b099d7
Packit b099d7
	if(w->application.argv != NULL) XtFree((char *) w->application.argv);
Packit b099d7
	w->application.argv = NULL;
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * If the Shell has a width and a height which are zero, and as such
Packit b099d7
 * suspect, and it has not yet been realized then it will grow to
Packit b099d7
 * match the child before parsing the geometry resource.
Packit b099d7
 *
Packit b099d7
 */
Packit b099d7
static void GetGeometry(W, child)
Packit b099d7
    Widget W, child;
Packit b099d7
{
Packit b099d7
    register ShellWidget w = (ShellWidget)W;
Packit b099d7
    Boolean is_wmshell = XtIsWMShell(W);
Packit b099d7
    int x, y, width, height, win_gravity = -1, flag;
Packit b099d7
    XSizeHints hints;
Packit b099d7
Packit b099d7
    if (child != NULL) {
Packit b099d7
	/* we default to our child's size */
Packit b099d7
	if (is_wmshell && (w->core.width == 0 || w->core.height == 0))
Packit b099d7
	    ((WMShellWidget)W)->wm.size_hints.flags |= PSize;
Packit b099d7
	if (w->core.width == 0)	    w->core.width = child->core.width;
Packit b099d7
	if (w->core.height == 0)    w->core.height = child->core.height;
Packit b099d7
    }
Packit b099d7
    if(w->shell.geometry != NULL) {
Packit b099d7
	char def_geom[64];
Packit b099d7
	x = w->core.x;
Packit b099d7
	y = w->core.y;
Packit b099d7
	width = w->core.width;
Packit b099d7
	height = w->core.height;
Packit b099d7
	if (is_wmshell) {
Packit b099d7
	    WMShellPart* wm = &((WMShellWidget)w)->wm;
Packit b099d7
	    EvaluateSizeHints((WMShellWidget)w);
Packit b099d7
	    bcopy((char*)&wm->size_hints, (char*)&hints,
Packit b099d7
		  sizeof(struct _OldXSizeHints));
Packit b099d7
	    hints.win_gravity = wm->win_gravity;
Packit b099d7
	    if (wm->size_hints.flags & PBaseSize) {
Packit b099d7
		width -= wm->base_width;
Packit b099d7
		height -= wm->base_height;
Packit b099d7
		hints.base_width = wm->base_width;
Packit b099d7
		hints.base_height = wm->base_height;
Packit b099d7
	    }
Packit b099d7
	    else if (wm->size_hints.flags & PMinSize) {
Packit b099d7
		width -= wm->size_hints.min_width;
Packit b099d7
		height -= wm->size_hints.min_height;
Packit b099d7
	    }
Packit b099d7
	    if (wm->size_hints.flags & PResizeInc) {
Packit b099d7
		width /= wm->size_hints.width_inc;
Packit b099d7
		height /= wm->size_hints.height_inc;
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
	else hints.flags = 0;
Packit b099d7
Packit b099d7
	sprintf( def_geom, "%dx%d+%d+%d", width, height, x, y );
Packit b099d7
	flag = XWMGeometry( XtDisplay(W),
Packit b099d7
			    XScreenNumberOfScreen(XtScreen(W)),
Packit b099d7
			    w->shell.geometry, def_geom,
Packit b099d7
			    (unsigned int)w->core.border_width,
Packit b099d7
			    &hints, &x, &y, &width, &height,
Packit b099d7
			    &win_gravity
Packit b099d7
			   );
Packit b099d7
	if (flag) {
Packit b099d7
	    if (flag & XValue) w->core.x = (Position)x;
Packit b099d7
	    if (flag & YValue) w->core.y = (Position)y;
Packit b099d7
	    if (flag & WidthValue) w->core.width = (Dimension)width;
Packit b099d7
	    if (flag & HeightValue) w->core.height = (Dimension)height;
Packit b099d7
	}
Packit b099d7
	else {
Packit b099d7
	    String params[2];
Packit b099d7
	    Cardinal num_params = 2;
Packit b099d7
	    params[0] = XtName(W);
Packit b099d7
	    params[1] = w->shell.geometry;
Packit b099d7
	    XtAppWarningMsg(XtWidgetToApplicationContext(W),
Packit b099d7
       "badGeometry", "shellRealize", XtCXtToolkitError,
Packit b099d7
       "Shell widget \"%s\" has an invalid geometry specification: \"%s\"",
Packit b099d7
			    params, &num_params);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
	flag = 0;
Packit b099d7
Packit b099d7
    if (is_wmshell) {
Packit b099d7
	WMShellWidget wmshell = (WMShellWidget) w;
Packit b099d7
	if (wmshell->wm.win_gravity == XtUnspecifiedShellInt) {
Packit b099d7
	    if (win_gravity != -1)
Packit b099d7
		wmshell->wm.win_gravity = win_gravity;
Packit b099d7
	    else
Packit b099d7
		wmshell->wm.win_gravity = NorthWestGravity;
Packit b099d7
	}
Packit b099d7
	wmshell->wm.size_hints.flags |= PWinGravity;
Packit b099d7
	if ((flag & (XValue|YValue)) == (XValue|YValue))
Packit b099d7
	    wmshell->wm.size_hints.flags |= USPosition;
Packit b099d7
	if ((flag & (WidthValue|HeightValue)) == (WidthValue|HeightValue))
Packit b099d7
	    wmshell->wm.size_hints.flags |= USSize;
Packit b099d7
    }
Packit b099d7
    w->shell.client_specified |= _XtShellGeometryParsed;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
static void ChangeManaged(wid)
Packit b099d7
    Widget wid;
Packit b099d7
{
Packit b099d7
    ShellWidget w = (ShellWidget) wid;
Packit b099d7
    Widget child = NULL;
Packit b099d7
    int i;
Packit b099d7
Packit b099d7
    for (i = 0; i < w->composite.num_children; i++) {
Packit b099d7
	if (XtIsManaged(w->composite.children[i])) {
Packit b099d7
	    child = w->composite.children[i];
Packit b099d7
	    break;		/* there can only be one of them! */
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
        
Packit b099d7
    if (!XtIsRealized (wid))	/* then we're about to be realized... */
Packit b099d7
	GetGeometry(wid, child);
Packit b099d7
Packit b099d7
/* we're already realized and allowShellResize is True, so
Packit b099d7
   pay attention to our child preferred size and ask the RGM
Packit b099d7
   to become this size ------------
Packit b099d7
Packit b099d7
	    else if (w->shell.allow_shell_resize && child) {
Packit b099d7
Packit b099d7
	XtWidgetGeometry child_reply;
Packit b099d7
Packit b099d7
	(void) XtQueryGeometry (child, NULL, &child_reply);
Packit b099d7
	(void) XtMakeResizeRequest(w, child_reply.width, child_reply.height, 
Packit b099d7
				   NULL, NULL);
Packit b099d7
    }
Packit b099d7
*/
Packit b099d7
    if (child != NULL)
Packit b099d7
	XtConfigureWidget (child, (Position)0, (Position)0,
Packit b099d7
			   w->core.width, w->core.height, (Dimension)0 );
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * This is gross, I can't wait to see if the change happened so I will ask
Packit b099d7
 * the window manager to change my size and do the appropriate X work.
Packit b099d7
 * I will then tell the requester that he can.  Care must be taken because
Packit b099d7
 * it is possible that some time in the future the request will be
Packit b099d7
 * asynchronusly denied and the window reverted to it's old size/shape.
Packit b099d7
 */
Packit b099d7
 
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static XtGeometryResult GeometryManager( wid, request, reply )
Packit b099d7
	Widget wid;
Packit b099d7
	XtWidgetGeometry *request;
Packit b099d7
	XtWidgetGeometry *reply;
Packit b099d7
{
Packit b099d7
	ShellWidget shell = (ShellWidget)(wid->core.parent);
Packit b099d7
	XtWidgetGeometry my_request;
Packit b099d7
Packit b099d7
	if(shell->shell.allow_shell_resize == FALSE && XtIsRealized(wid))
Packit b099d7
		return(XtGeometryNo);
Packit b099d7
Packit b099d7
	if (request->request_mode & (CWX | CWY))
Packit b099d7
	    return(XtGeometryNo);
Packit b099d7
Packit b099d7
	/* %%% worry about XtCWQueryOnly */
Packit b099d7
	my_request.request_mode = 0;
Packit b099d7
	if (request->request_mode & CWWidth) {
Packit b099d7
	    my_request.width = request->width;
Packit b099d7
	    my_request.request_mode |= CWWidth;
Packit b099d7
	}
Packit b099d7
	if (request->request_mode & CWHeight) {
Packit b099d7
	    my_request.height = request->height;
Packit b099d7
	    my_request.request_mode |= CWHeight;
Packit b099d7
	}
Packit b099d7
	if (request->request_mode & CWBorderWidth) {
Packit b099d7
	    my_request.border_width = request->border_width;
Packit b099d7
	    my_request.request_mode |= CWBorderWidth;
Packit b099d7
	}
Packit b099d7
	if (XtMakeGeometryRequest((Widget)shell, &my_request, NULL)
Packit b099d7
		== XtGeometryYes) {
Packit b099d7
	    /* assert: if (request->request_mode & CWWidth) then
Packit b099d7
	     * 		  shell->core.width == request->width
Packit b099d7
	     * assert: if (request->request_mode & CWHeight) then
Packit b099d7
	     * 		  shell->core.height == request->height
Packit b099d7
	     *
Packit b099d7
	     * so, whatever the WM sized us to (if the Shell requested
Packit b099d7
	     * only one of the two) is now the correct child size
Packit b099d7
	     */
Packit b099d7
	    
Packit b099d7
	    wid->core.width = shell->core.width;
Packit b099d7
	    wid->core.height = shell->core.height;
Packit b099d7
	    if (request->request_mode & CWBorderWidth) {
Packit b099d7
		wid->core.x = wid->core.y = -request->border_width;
Packit b099d7
	    }
Packit b099d7
	    return XtGeometryYes;
Packit b099d7
	} else return XtGeometryNo;
Packit b099d7
}
Packit b099d7
Packit b099d7
typedef struct {
Packit b099d7
	Widget  w;
Packit b099d7
	unsigned long request_num;
Packit b099d7
	Boolean done;
Packit b099d7
} QueryStruct;
Packit b099d7
Packit b099d7
static Bool isMine(dpy, event, arg)
Packit b099d7
	Display *dpy;
Packit b099d7
	register XEvent  *event;
Packit b099d7
	char *arg;
Packit b099d7
{
Packit b099d7
	QueryStruct *q = (QueryStruct *) arg;
Packit b099d7
	register Widget w = q->w;
Packit b099d7
Packit b099d7
	if ( (dpy != XtDisplay(w)) || (event->xany.window != XtWindow(w)) ) {
Packit b099d7
	    return FALSE;
Packit b099d7
	}
Packit b099d7
	if (event->xany.serial >= q->request_num) {
Packit b099d7
	    if (event->type == ConfigureNotify) {
Packit b099d7
                q->done = TRUE;
Packit b099d7
		return TRUE;
Packit b099d7
	    } else
Packit b099d7
		/* This is draft-ICCCM stuff; here for compatibility */
Packit b099d7
		if (event->type == ClientMessage &&
Packit b099d7
		    (event->xclient.message_type == WM_CONFIGURE_DENIED(w) ||
Packit b099d7
		     event->xclient.message_type == WM_MOVED(w))) {
Packit b099d7
		    q->done = TRUE;
Packit b099d7
		    return TRUE;
Packit b099d7
		}
Packit b099d7
	}
Packit b099d7
	else if (event->type == ConfigureNotify ||
Packit b099d7
		 (event->type == ClientMessage &&
Packit b099d7
		  (event->xclient.message_type == WM_CONFIGURE_DENIED(w) ||
Packit b099d7
		   event->xclient.message_type == WM_MOVED(w)))) {
Packit b099d7
	    return TRUE;	/* flush old events */
Packit b099d7
}
Packit b099d7
	if (event->type == ReparentNotify
Packit b099d7
		 && event->xreparent.window == XtWindow(w)) {
Packit b099d7
	    /* we might get ahead of this event, so just in case someone
Packit b099d7
	     * asks for coordinates before this event is dispatched...
Packit b099d7
	     */
Packit b099d7
	    register ShellWidget s = (ShellWidget)w;
Packit b099d7
	    if (event->xreparent.parent != RootWindowOfScreen(XtScreen(w)))
Packit b099d7
		s->shell.client_specified &= ~_XtShellNotReparented;
Packit b099d7
	    else
Packit b099d7
		s->shell.client_specified |= _XtShellNotReparented;
Packit b099d7
	}
Packit b099d7
	return FALSE;
Packit b099d7
}
Packit b099d7
Packit b099d7
static _wait_for_response(w, event, request_num)
Packit b099d7
	ShellWidget	w;
Packit b099d7
	XEvent		*event;
Packit b099d7
        unsigned long	request_num;
Packit b099d7
{
Packit b099d7
	XtAppContext app = XtWidgetToApplicationContext((Widget) w);
Packit b099d7
	QueryStruct q;
Packit b099d7
	unsigned long timeout;
Packit b099d7
Packit b099d7
	if (XtIsWMShell((Widget)w))
Packit b099d7
	    timeout = ((WMShellWidget)w)->wm.wm_timeout;
Packit b099d7
	else
Packit b099d7
	    timeout = DEFAULT_WM_TIMEOUT;
Packit b099d7
Packit b099d7
	XFlush(XtDisplay(w));
Packit b099d7
	q.w = (Widget) w;
Packit b099d7
	q.request_num = request_num;
Packit b099d7
	q.done = FALSE;
Packit b099d7
	
Packit b099d7
	for(;;) {
Packit b099d7
 	    /*
Packit b099d7
 	     * look for match event and discard all prior configures
Packit b099d7
 	     */
Packit b099d7
	    if (XCheckIfEvent( XtDisplay(w), event, isMine, (char*)&q)) {
Packit b099d7
		if (q.done)
Packit b099d7
		    return TRUE;
Packit b099d7
		else
Packit b099d7
		    continue;	/* flush old events */
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	    if (_XtwaitForSomething(TRUE, TRUE, FALSE, TRUE, &timeout, app)
Packit b099d7
		!= -1) continue;
Packit b099d7
	    if (timeout == 0)
Packit b099d7
		return FALSE;
Packit b099d7
	}
Packit b099d7
}
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static XtGeometryResult RootGeometryManager(gw, request, reply)
Packit b099d7
    Widget gw;
Packit b099d7
    XtWidgetGeometry *request, *reply;
Packit b099d7
{
Packit b099d7
    register ShellWidget w = (ShellWidget)gw;
Packit b099d7
    XWindowChanges values;
Packit b099d7
    unsigned int mask = request->request_mode;
Packit b099d7
    XEvent event;
Packit b099d7
    Boolean wm;
Packit b099d7
    register struct _OldXSizeHints *hintp;
Packit b099d7
    int oldx, oldy, oldwidth, oldheight, oldborder_width;
Packit b099d7
    unsigned long request_num;
Packit b099d7
Packit b099d7
    _GeoTabTrace();
Packit b099d7
    
Packit b099d7
    if (XtIsWMShell(gw)) {
Packit b099d7
	wm = True;
Packit b099d7
	hintp = &((WMShellWidget)w)->wm.size_hints;
Packit b099d7
	/* for draft-ICCCM wm's, need to make sure hints reflect
Packit b099d7
	   (current) reality so client can move and size separately. */
Packit b099d7
  	hintp->x = w->core.x;
Packit b099d7
  	hintp->y = w->core.y;
Packit b099d7
  	hintp->width = w->core.width;
Packit b099d7
   	hintp->height = w->core.height;
Packit b099d7
    } else
Packit b099d7
	wm = False;
Packit b099d7
    
Packit b099d7
    oldx = w->core.x;
Packit b099d7
    oldy = w->core.y;
Packit b099d7
    oldwidth = w->core.width;
Packit b099d7
    oldheight = w->core.height;
Packit b099d7
    oldborder_width = w->core.border_width;
Packit b099d7
Packit b099d7
#define PutBackGeometry() \
Packit b099d7
	{ w->core.x = oldx; \
Packit b099d7
	  w->core.y = oldy; \
Packit b099d7
	  w->core.width = oldwidth; \
Packit b099d7
	  w->core.height = oldheight; \
Packit b099d7
	  w->core.border_width = oldborder_width; }
Packit b099d7
Packit b099d7
    if (mask & CWX) {
Packit b099d7
	    if (w->core.x == request->x) mask &= ~CWX;
Packit b099d7
	    else {
Packit b099d7
		w->core.x = values.x = request->x;
Packit b099d7
		if (wm) {
Packit b099d7
		    hintp->flags &= ~USPosition;
Packit b099d7
		    hintp->flags |= PPosition;
Packit b099d7
		    hintp->x = values.x;
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
    }
Packit b099d7
    if (mask & CWY) {
Packit b099d7
	    if (w->core.y == request->y) mask &= ~CWY;
Packit b099d7
	    else {
Packit b099d7
		w->core.y = values.y = request->y;
Packit b099d7
		if (wm) {
Packit b099d7
		    hintp->flags &= ~USPosition;
Packit b099d7
		    hintp->flags |= PPosition;
Packit b099d7
		    hintp->y = values.y;
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
    }
Packit b099d7
    if (mask & CWBorderWidth) {
Packit b099d7
	    if (w->core.border_width == request->border_width) {
Packit b099d7
		    mask &= ~CWBorderWidth;
Packit b099d7
	    } else
Packit b099d7
		w->core.border_width =
Packit b099d7
		    values.border_width =
Packit b099d7
			request->border_width;
Packit b099d7
    }
Packit b099d7
    if (mask & CWWidth) {
Packit b099d7
	    if (w->core.width == request->width) mask &= ~CWWidth;
Packit b099d7
	    else {
Packit b099d7
		w->core.width = values.width = request->width;
Packit b099d7
		if (wm) {
Packit b099d7
		    hintp->flags &= ~USSize;
Packit b099d7
		    hintp->flags |= PSize;
Packit b099d7
		    hintp->width = values.width;
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
    }
Packit b099d7
    if (mask & CWHeight) {
Packit b099d7
	    if (w->core.height == request->height) mask &= ~CWHeight;
Packit b099d7
	    else {
Packit b099d7
		w->core.height = values.height = request->height;
Packit b099d7
		if (wm) {
Packit b099d7
		    hintp->flags &= ~USSize;
Packit b099d7
		    hintp->flags |= PSize;
Packit b099d7
		    hintp->height = values.height;
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
    }
Packit b099d7
    if (mask & CWStackMode) {
Packit b099d7
	values.stack_mode = request->stack_mode;
Packit b099d7
	if (mask & CWSibling)
Packit b099d7
	    values.sibling = XtWindow(request->sibling);
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
    if (!XtIsRealized((Widget)w)) {
Packit b099d7
Packit b099d7
	_GeoPrintTrace((Widget)w,
Packit b099d7
		       "Shell \"%s\" is not realized, return XtGeometryYes.\n", 
Packit b099d7
		       XtName((Widget)w));
Packit b099d7
    	_GeoUnTabTrace();
Packit b099d7
	return XtGeometryYes;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    request_num = NextRequest(XtDisplay(w));
Packit b099d7
Packit b099d7
    _GeoPrintTrace((Widget)w,"XConfiguring the Shell X window :\n");
Packit b099d7
    _GeoTabTrace();
Packit b099d7
    if (mask & CWX) { _GeoPrintTrace((Widget)w,"x = %d\n",values.x);}
Packit b099d7
    if (mask & CWY) { _GeoPrintTrace((Widget)w,"y = %d\n",values.y);}
Packit b099d7
    if (mask & CWWidth) { _GeoPrintTrace((Widget)w,"width = %d\n",values.width);}
Packit b099d7
    if (mask & CWHeight) { _GeoPrintTrace((Widget)w,"height = %d\n",values.height);}
Packit b099d7
    if (mask & CWBorderWidth) { _GeoPrintTrace((Widget)w,"border_width = %d\n",values.border_width);}
Packit b099d7
    _GeoUnTabTrace();
Packit b099d7
    
Packit b099d7
Packit b099d7
    XConfigureWindow(XtDisplay((Widget)w), XtWindow((Widget)w), mask,&values);
Packit b099d7
Packit b099d7
    if (wm && !w->shell.override_redirect
Packit b099d7
	&& mask & (CWX | CWY | CWWidth | CWHeight | CWBorderWidth)) {
Packit b099d7
	_SetWMSizeHints((WMShellWidget)w);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (w->shell.override_redirect) {
Packit b099d7
	_GeoPrintTrace((Widget)w,"Shell \"%s\" is override redirect, return XtGeometryYes.\n", XtName((Widget)w));
Packit b099d7
    	_GeoUnTabTrace();
Packit b099d7
	return XtGeometryYes;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /* If no non-stacking bits are set, there's no way to tell whether
Packit b099d7
       or not this worked, so assume it did */
Packit b099d7
Packit b099d7
    if (!(mask & ~(CWStackMode | CWSibling))) return XtGeometryYes;
Packit b099d7
Packit b099d7
    if (wm && ((WMShellWidget)w)->wm.wait_for_wm == FALSE) {
Packit b099d7
	    /* the window manager is sick
Packit b099d7
	     * so I will do the work and 
Packit b099d7
	     * say no so if a new WM starts up,
Packit b099d7
	     * or the current one recovers
Packit b099d7
	     * my size requests will be visible
Packit b099d7
	     */
Packit b099d7
	_GeoPrintTrace((Widget)w,"Shell \"%s\" has wait_for_wm == FALSE, return XtGeometryNo.\n", XtName((Widget)w));
Packit b099d7
    	_GeoUnTabTrace();
Packit b099d7
Packit b099d7
	PutBackGeometry();
Packit b099d7
	return XtGeometryNo;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (_wait_for_response(w, &event, request_num)) {
Packit b099d7
	/* got an event */
Packit b099d7
	if (event.type == ConfigureNotify) {
Packit b099d7
Packit b099d7
#define NEQ(x, msk) ((mask & msk) && (values.x != event.xconfigure.x))	
Packit b099d7
	    if (NEQ(x, CWX) ||
Packit b099d7
		NEQ(y, CWY) ||
Packit b099d7
		NEQ(width, CWWidth) ||
Packit b099d7
		NEQ(height, CWHeight) ||
Packit b099d7
		NEQ(border_width, CWBorderWidth)) {
Packit b099d7
Packit b099d7
		if (NEQ(x, CWX)) {
Packit b099d7
		    _GeoPrintTrace((Widget)w,"received Configure X %d\n", 
Packit b099d7
					event.xconfigure.x);}
Packit b099d7
		if (NEQ(y, CWY)) {
Packit b099d7
		    _GeoPrintTrace((Widget)w,"received Configure Y %d\n", 
Packit b099d7
					event.xconfigure.y);}
Packit b099d7
		if (NEQ(width, CWWidth)) {
Packit b099d7
		    _GeoPrintTrace((Widget)w,"received Configure Width %d\n", 
Packit b099d7
					event.xconfigure.width);}
Packit b099d7
		if (NEQ(height, CWHeight)) {
Packit b099d7
		    _GeoPrintTrace((Widget)w,"received Configure Height %d\n", 
Packit b099d7
					event.xconfigure.height);}
Packit b099d7
		if (NEQ(border_width, CWBorderWidth)) {
Packit b099d7
		    _GeoPrintTrace((Widget)w,"received Configure BorderWidth %d\n", 
Packit b099d7
					event.xconfigure.border_width);}
Packit b099d7
		
Packit b099d7
#undef NEQ
Packit b099d7
		XPutBackEvent(XtDisplay(w), &event);
Packit b099d7
		PutBackGeometry();
Packit b099d7
		/*
Packit b099d7
		 * We just potentially re-ordered the event queue
Packit b099d7
		 * w.r.t. ConfigureNotifies with some trepidation.
Packit b099d7
		 * But this is probably a Good Thing because we
Packit b099d7
		 * will know the new true state of the world sooner
Packit b099d7
		 * this way.
Packit b099d7
		 */
Packit b099d7
		_GeoPrintTrace((Widget)w,"ConfigureNotify failed, return XtGeometryNo.\n");
Packit b099d7
		_GeoUnTabTrace();
Packit b099d7
Packit b099d7
		return XtGeometryNo;
Packit b099d7
	    }
Packit b099d7
	    else {
Packit b099d7
		w->core.width = event.xconfigure.width;
Packit b099d7
		w->core.height = event.xconfigure.height;
Packit b099d7
		w->core.border_width = event.xconfigure.border_width;
Packit b099d7
		if (event.xany.send_event || /* ICCCM compliant synth */
Packit b099d7
		    w->shell.client_specified & _XtShellNotReparented) {
Packit b099d7
Packit b099d7
		    w->core.x = event.xconfigure.x;
Packit b099d7
		    w->core.y = event.xconfigure.y;
Packit b099d7
		    w->shell.client_specified |= _XtShellPositionValid;
Packit b099d7
		}
Packit b099d7
		else w->shell.client_specified &= ~_XtShellPositionValid;
Packit b099d7
Packit b099d7
		_GeoPrintTrace((Widget)w,"ConfigureNotify succeed, return XtGeometryYes.\n");
Packit b099d7
		_GeoUnTabTrace();
Packit b099d7
		return XtGeometryYes;
Packit b099d7
	    }
Packit b099d7
	} else if (!wm ||
Packit b099d7
		   (event.type == ClientMessage &&
Packit b099d7
		    event.xclient.message_type == WM_CONFIGURE_DENIED(w))) {
Packit b099d7
	    PutBackGeometry();
Packit b099d7
Packit b099d7
	    _GeoPrintTrace((Widget)w,"No ConfigureNotify event, return XtGeometryNo.\n");
Packit b099d7
	    _GeoUnTabTrace();
Packit b099d7
Packit b099d7
	    return XtGeometryNo;
Packit b099d7
	} else if (event.type == ClientMessage &&
Packit b099d7
		    event.xclient.message_type == WM_MOVED(w)) {
Packit b099d7
	    w->core.x = event.xclient.data.s[0];
Packit b099d7
	    w->core.y = event.xclient.data.s[1];
Packit b099d7
	    w->shell.client_specified |= _XtShellPositionValid;
Packit b099d7
	    _GeoPrintTrace((Widget)w,"ClientMessage ok, return XtGeometryYes.\n");
Packit b099d7
	    _GeoUnTabTrace();
Packit b099d7
	    return XtGeometryYes;
Packit b099d7
	} else XtAppWarningMsg(XtWidgetToApplicationContext((Widget)w),
Packit b099d7
			       "internalError", "shell", XtCXtToolkitError,
Packit b099d7
			       "Shell's window manager interaction is broken",
Packit b099d7
			       (String *)NULL, (Cardinal *)NULL);
Packit b099d7
    } else if (wm) { /* no event */ 
Packit b099d7
	((WMShellWidget)w)->wm.wait_for_wm = FALSE; /* timed out; must be broken */
Packit b099d7
    }
Packit b099d7
    PutBackGeometry();
Packit b099d7
#undef PutBackGeometry
Packit b099d7
Packit b099d7
    _GeoPrintTrace((Widget)w,"Timeout passed?, return XtGeometryNo.\n");
Packit b099d7
    _GeoUnTabTrace();
Packit b099d7
Packit b099d7
    return XtGeometryNo;
Packit b099d7
}
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static Boolean SetValues(old, ref, new, args, num_args)
Packit b099d7
	Widget old, ref, new;
Packit b099d7
	ArgList args;		/* unused */
Packit b099d7
	Cardinal *num_args;	/* unused */
Packit b099d7
{
Packit b099d7
	ShellWidget nw = (ShellWidget) new;
Packit b099d7
	ShellWidget ow = (ShellWidget) old;
Packit b099d7
	Mask mask = 0;
Packit b099d7
	XSetWindowAttributes attr;
Packit b099d7
Packit b099d7
	if (ow->shell.save_under != nw->shell.save_under) {
Packit b099d7
	    mask = CWSaveUnder;
Packit b099d7
	    attr.save_under = nw->shell.save_under;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if (ow->shell.override_redirect != nw->shell.override_redirect) {
Packit b099d7
	    mask |= CWOverrideRedirect;
Packit b099d7
	    attr.override_redirect = nw->shell.override_redirect;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if (mask && XtIsRealized(new)) {
Packit b099d7
	    XChangeWindowAttributes(XtDisplay(new),XtWindow(new), mask, &attr);
Packit b099d7
	    if ((mask & CWOverrideRedirect) && !nw->shell.override_redirect)
Packit b099d7
		_popup_set_prop(nw);
Packit b099d7
	}
Packit b099d7
	return FALSE;
Packit b099d7
}
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static Boolean WMSetValues(old, ref, new, args, num_args)
Packit b099d7
	Widget old, ref, new;
Packit b099d7
	ArgList args;		/* unused */
Packit b099d7
	Cardinal *num_args;	/* unused */
Packit b099d7
{
Packit b099d7
	WMShellWidget nwmshell = (WMShellWidget) new;
Packit b099d7
	WMShellWidget owmshell = (WMShellWidget) old;
Packit b099d7
	Boolean set_prop
Packit b099d7
	    = XtIsRealized(new) && !nwmshell->shell.override_redirect;
Packit b099d7
	Boolean title_changed;
Packit b099d7
Packit b099d7
	EvaluateSizeHints(nwmshell);
Packit b099d7
Packit b099d7
#define NEQ(f) (nwmshell->wm.size_hints.f != owmshell->wm.size_hints.f)
Packit b099d7
Packit b099d7
	if (set_prop
Packit b099d7
	    && (NEQ(flags) || NEQ(min_width) || NEQ(min_height)
Packit b099d7
		|| NEQ(max_width) || NEQ(max_height)
Packit b099d7
		|| NEQ(width_inc) || NEQ(height_inc)
Packit b099d7
		|| NEQ(min_aspect.x) || NEQ(min_aspect.y)
Packit b099d7
		|| NEQ(max_aspect.x) || NEQ(max_aspect.y)
Packit b099d7
#undef NEQ
Packit b099d7
#define NEQ(f) (nwmshell->wm.f != owmshell->wm.f)
Packit b099d7
Packit b099d7
		|| NEQ(base_width) || NEQ(base_height) || NEQ(win_gravity))) {
Packit b099d7
	    _SetWMSizeHints(nwmshell);
Packit b099d7
	}
Packit b099d7
#undef NEQ
Packit b099d7
Packit b099d7
	if (nwmshell->wm.title != owmshell->wm.title) {
Packit b099d7
	    XtFree(owmshell->wm.title);
Packit b099d7
	    if (! nwmshell->wm.title) nwmshell->wm.title = "";
Packit b099d7
	    nwmshell->wm.title = XtNewString(nwmshell->wm.title);
Packit b099d7
	    title_changed = True;
Packit b099d7
	} else
Packit b099d7
	    title_changed = False;
Packit b099d7
Packit b099d7
	if (set_prop
Packit b099d7
	    && (title_changed ||
Packit b099d7
		nwmshell->wm.title_encoding != owmshell->wm.title_encoding)) {
Packit b099d7
Packit b099d7
	    XTextProperty title;
Packit b099d7
	    Boolean copied = False;
Packit b099d7
Packit b099d7
            if (nwmshell->wm.title_encoding == None &&
Packit b099d7
		XmbTextListToTextProperty(XtDisplay(new),
Packit b099d7
					  (char**)&nwmshell->wm.title,
Packit b099d7
					  1, XStdICCTextStyle,
Packit b099d7
					  &title) >= Success) {
Packit b099d7
		copied = True;
Packit b099d7
	    } else {
Packit b099d7
		title.value = (unsigned char*)nwmshell->wm.title;
Packit b099d7
		title.encoding = nwmshell->wm.title_encoding;
Packit b099d7
		title.format = 8;
Packit b099d7
		title.nitems = strlen(nwmshell->wm.title);
Packit b099d7
	    }
Packit b099d7
	    XSetWMName(XtDisplay(new), XtWindow(new), &title);
Packit b099d7
	    if (copied)
Packit b099d7
		XFree((XPointer)title.value);
Packit b099d7
	}
Packit b099d7
Packit b099d7
	EvaluateWMHints(nwmshell);
Packit b099d7
Packit b099d7
#define NEQ(f)	(nwmshell->wm.wm_hints.f != owmshell->wm.wm_hints.f)
Packit b099d7
Packit b099d7
	if (set_prop
Packit b099d7
	    && (NEQ(flags) || NEQ(input) || NEQ(initial_state)
Packit b099d7
		|| NEQ(icon_x) || NEQ(icon_y)
Packit b099d7
		|| NEQ(icon_pixmap) || NEQ(icon_mask) || NEQ(icon_window)
Packit b099d7
		|| NEQ(window_group))) {
Packit b099d7
Packit b099d7
	    XSetWMHints(XtDisplay(new), XtWindow(new), &nwmshell->wm.wm_hints);
Packit b099d7
	}
Packit b099d7
#undef NEQ
Packit b099d7
Packit b099d7
 	if (set_prop && nwmshell->wm.transient != owmshell->wm.transient) {
Packit b099d7
 	    if (nwmshell->wm.transient) {
Packit b099d7
		if (!XtIsTransientShell(new) &&
Packit b099d7
		    nwmshell->wm.wm_hints.window_group != 
Packit b099d7
		       XtUnspecifiedWindowGroup)
Packit b099d7
		    XSetTransientForHint(XtDisplay(new), XtWindow(new),
Packit b099d7
					 nwmshell->wm.wm_hints.window_group);
Packit b099d7
	    }
Packit b099d7
 	    else XDeleteProperty(XtDisplay(new), XtWindow(new),
Packit b099d7
 				 XA_WM_TRANSIENT_FOR);
Packit b099d7
 	}
Packit b099d7
	
Packit b099d7
	return FALSE;
Packit b099d7
}
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static Boolean TransientSetValues(oldW, refW, newW, args, num_args)
Packit b099d7
     Widget oldW, refW, newW;
Packit b099d7
     ArgList args;		/* unused */
Packit b099d7
     Cardinal *num_args;	/* unused */
Packit b099d7
{
Packit b099d7
    TransientShellWidget old = (TransientShellWidget)oldW;
Packit b099d7
    TransientShellWidget new = (TransientShellWidget)newW;
Packit b099d7
    
Packit b099d7
    if (XtIsRealized(newW)
Packit b099d7
	&& ((new->transient.transient_for != old->transient.transient_for)
Packit b099d7
	    || (new->transient.transient_for == NULL
Packit b099d7
		&& (new->wm.wm_hints.window_group
Packit b099d7
		    != old->wm.wm_hints.window_group)))) {
Packit b099d7
Packit b099d7
	_SetTransientForHint(new, True);
Packit b099d7
    }
Packit b099d7
    return False;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static Boolean TopLevelSetValues(oldW, refW, newW, args, num_args)
Packit b099d7
     Widget oldW, refW, newW;
Packit b099d7
     ArgList args;		/* unused */
Packit b099d7
     Cardinal *num_args;	/* unused */
Packit b099d7
{
Packit b099d7
    TopLevelShellWidget old = (TopLevelShellWidget)oldW;
Packit b099d7
    TopLevelShellWidget new = (TopLevelShellWidget)newW;
Packit b099d7
    Boolean name_changed;
Packit b099d7
Packit b099d7
    if (old->topLevel.icon_name != new->topLevel.icon_name) {
Packit b099d7
	XtFree((XtPointer)old->topLevel.icon_name);
Packit b099d7
	if (! new->topLevel.icon_name) new->topLevel.icon_name = "";
Packit b099d7
	new->topLevel.icon_name = XtNewString(new->topLevel.icon_name);
Packit b099d7
	name_changed = True;
Packit b099d7
    } else
Packit b099d7
	name_changed = False;
Packit b099d7
Packit b099d7
    if (XtIsRealized(newW)) {
Packit b099d7
	if (new->topLevel.iconic != old->topLevel.iconic) {
Packit b099d7
	    if (new->topLevel.iconic)
Packit b099d7
		XIconifyWindow(XtDisplay(newW),
Packit b099d7
			       XtWindow(newW),
Packit b099d7
			       XScreenNumberOfScreen(XtScreen(newW))
Packit b099d7
			       );
Packit b099d7
	    else {
Packit b099d7
		Boolean map = new->shell.popped_up;
Packit b099d7
		XtPopup(newW, XtGrabNone);
Packit b099d7
		if (map) XMapWindow(XtDisplay(newW), XtWindow(newW));
Packit b099d7
 	    }
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if (!new->shell.override_redirect &&
Packit b099d7
	    (name_changed ||
Packit b099d7
	     (old->topLevel.icon_name_encoding
Packit b099d7
	      != new->topLevel.icon_name_encoding))) {
Packit b099d7
Packit b099d7
	    XTextProperty icon_name;
Packit b099d7
	    Boolean copied = False;
Packit b099d7
Packit b099d7
            if (new->topLevel.icon_name_encoding == None &&
Packit b099d7
		XmbTextListToTextProperty(XtDisplay(newW),
Packit b099d7
					  (char**) &new->topLevel.icon_name,
Packit b099d7
					  1, XStdICCTextStyle,
Packit b099d7
					  &icon_name) >= Success) {
Packit b099d7
		copied = True;
Packit b099d7
	    } else {
Packit b099d7
		icon_name.value = (unsigned char *)new->topLevel.icon_name;
Packit b099d7
		icon_name.encoding = new->topLevel.icon_name_encoding;
Packit b099d7
		icon_name.format = 8;
Packit b099d7
		icon_name.nitems = strlen((char *)icon_name.value);
Packit b099d7
	    }
Packit b099d7
	    XSetWMIconName(XtDisplay(newW), XtWindow(newW), &icon_name);
Packit b099d7
	    if (copied)
Packit b099d7
		XFree((XPointer)icon_name.value);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
    return False;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
void _XtShellGetCoordinates( widget, x, y)
Packit b099d7
    Widget widget;
Packit b099d7
    Position* x;
Packit b099d7
    Position* y;
Packit b099d7
{
Packit b099d7
    ShellWidget w = (ShellWidget)widget;
Packit b099d7
    if (!(w->shell.client_specified & _XtShellPositionValid)) {
Packit b099d7
	int tmpx, tmpy;
Packit b099d7
	Window tmpchild;
Packit b099d7
	(void) XTranslateCoordinates(XtDisplay(w), XtWindow(w), 
Packit b099d7
				     RootWindowOfScreen(XtScreen(w)),
Packit b099d7
				     (int) -w->core.border_width,
Packit b099d7
				     (int) -w->core.border_width,
Packit b099d7
				     &tmpx, &tmpy, &tmpchild);
Packit b099d7
	w->core.x = tmpx;
Packit b099d7
	w->core.y = tmpy;
Packit b099d7
	w->shell.client_specified |= _XtShellPositionValid;
Packit b099d7
    }
Packit b099d7
    *x = w->core.x;
Packit b099d7
    *y = w->core.y;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
static void GetValuesHook(widget, args, num_args)
Packit b099d7
    Widget	widget;
Packit b099d7
    ArgList	args;
Packit b099d7
    Cardinal*	num_args;
Packit b099d7
{
Packit b099d7
    ShellWidget w = (ShellWidget) widget;
Packit b099d7
    extern void _XtCopyToArg();
Packit b099d7
Packit b099d7
    /* x and y resource values may be invalid after a shell resize */
Packit b099d7
    if (! (w->shell.client_specified & _XtShellPositionValid)) {
Packit b099d7
	Cardinal	n;
Packit b099d7
	Position	x, y;
Packit b099d7
Packit b099d7
	for (n = *num_args; n; n--, args++) {
Packit b099d7
	    if (strcmp(XtNx, args->name) == 0) {
Packit b099d7
		 if (! (w->shell.client_specified & _XtShellPositionValid))
Packit b099d7
		     _XtShellGetCoordinates(widget, &x, &y);
Packit b099d7
		_XtCopyToArg((char *) &x, &args->value, sizeof(Position));
Packit b099d7
	    } else if (strcmp(XtNy, args->name) == 0) {
Packit b099d7
		 if (! (w->shell.client_specified & _XtShellPositionValid))
Packit b099d7
		     _XtShellGetCoordinates(widget, &x, &y);
Packit b099d7
		_XtCopyToArg((char *) &y, &args->value, sizeof(Position));
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
  
Packit b099d7
static void ApplicationShellInsertChild(widget)
Packit b099d7
    Widget widget;
Packit b099d7
{
Packit b099d7
    if (! XtIsWidget(widget) && XtIsRectObj(widget)) {
Packit b099d7
	XtAppWarningMsg(XtWidgetToApplicationContext(widget),
Packit b099d7
	       "invalidClass", "applicationShellInsertChild", XtCXtToolkitError,
Packit b099d7
	       "ApplicationShell does not accept RectObj children; ignored",
Packit b099d7
	       (String*)NULL, (Cardinal*)NULL);
Packit b099d7
    }
Packit b099d7
    else {
Packit b099d7
	(*((CompositeWidgetClass)applicationShellClassRec.core_class.
Packit b099d7
	   superclass)->composite_class.insert_child) (widget);
Packit b099d7
    }
Packit b099d7
}