Blame lib/Xm/VendorS.c

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
#ifdef HAVE_CONFIG_H
Packit b099d7
#include <config.h>
Packit b099d7
#endif
Packit b099d7
Packit b099d7
Packit b099d7
#ifdef REV_INFO
Packit b099d7
#ifndef lint
Packit b099d7
static char rcsid[] = "$TOG: VendorS.c /main/21 1999/08/09 10:49:41 mgreess $"
Packit b099d7
#endif
Packit b099d7
#endif
Packit b099d7
/* (c) Copyright 1987, 1988, 1989, 1990, 1991, 1992 HEWLETT-PACKARD COMPANY */
Packit b099d7
/* (c) Copyright 1987, 1988, DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. */
Packit b099d7
/* (c) Copyright 1988 MASSACHUSETTS INSTITUTE OF TECHNOLOGY */
Packit b099d7
Packit b099d7
/* Make sure all wm properties can make it out of the resource manager */
Packit b099d7
Packit b099d7
#include <stdio.h>
Packit b099d7
#include <Xm/AccColorT.h>
Packit b099d7
#include <Xm/AtomMgr.h>
Packit b099d7
#include <Xm/DisplayP.h>
Packit b099d7
#include <Xm/LayoutT.h>
Packit b099d7
#include <Xm/MenuShell.h>
Packit b099d7
#include <Xm/ProtocolsP.h>
Packit b099d7
#include <Xm/ScreenP.h>
Packit b099d7
#include <Xm/SpecRenderT.h>
Packit b099d7
#include <Xm/TraitP.h>
Packit b099d7
#include <Xm/UnitTypeT.h>
Packit b099d7
#include <Xm/VendorSEP.h>
Packit b099d7
#include <Xm/VendorSP.h>
Packit b099d7
#include <Xm/XmosP.h>		/* for bzero */
Packit b099d7
#include <Xm/ToolTipCT.h>
Packit b099d7
#include "BaseClassI.h"
Packit b099d7
#include "CallbackI.h"
Packit b099d7
#include "ExtObjectI.h"
Packit b099d7
#include "MenuShellI.h"
Packit b099d7
#include "MessagesI.h"
Packit b099d7
#include "PixConvI.h"
Packit b099d7
#include "ProtocolsI.h"
Packit b099d7
#include "ResConverI.h"
Packit b099d7
#include "SyntheticI.h"
Packit b099d7
#include "TraitI.h"
Packit b099d7
#include "TravActI.h"
Packit b099d7
#include "TraversalI.h"
Packit b099d7
#include "XmImI.h"
Packit b099d7
#include "VendorSI.h"
Packit b099d7
#include "EditresComI.h"
Packit b099d7
#include "XmI.h"
Packit b099d7
Packit b099d7
#ifndef NO_MESSAGE_CATALOG
Packit b099d7
#if !defined(NL_CAT_LOCALE)
Packit b099d7
#define NL_CAT_LOCALE	0
Packit b099d7
#endif
Packit b099d7
#endif
Packit b099d7
Packit b099d7
Packit b099d7
/* #define DEBUG_GRABS */
Packit b099d7
Packit b099d7
#define MSG1	_XmMMsgVendor_0000
Packit b099d7
#define MSG2	_XmMMsgVendor_0001
Packit b099d7
#define MSG3	_XmMMsgVendor_0002
Packit b099d7
#define MSG4	_XmMMsgVendor_0003
Packit b099d7
Packit b099d7
#define DONT_CARE -1
Packit b099d7
Packit b099d7
typedef struct {   
Packit b099d7
    XmVendorShellExtObject ve ;
Packit b099d7
    Widget shell ;
Packit b099d7
    } XmDestroyGrabRec, *XmDestroyGrabList ;
Packit b099d7
Packit b099d7
Packit b099d7
/********    Static Function Declarations    ********/
Packit b099d7
Packit b099d7
static XtPointer BaseProc( 
Packit b099d7
                        Widget widget,
Packit b099d7
                        XtPointer client_data) ;
Packit b099d7
static Cardinal GetSecResData( 
Packit b099d7
                        WidgetClass w_class,
Packit b099d7
                        XmSecondaryResourceData **secResDataRtn) ;
Packit b099d7
static void ClassInitialize( void ) ;
Packit b099d7
static void ClassPartInitialize( 
Packit b099d7
                        WidgetClass wc) ;
Packit b099d7
static void SetMwmStuff( 
Packit b099d7
                        XmVendorShellExtObject ove,
Packit b099d7
                        XmVendorShellExtObject nve) ;
Packit b099d7
static void AddGrab( 
Packit b099d7
                        XmVendorShellExtObject ve,
Packit b099d7
                        Widget shell,
Packit b099d7
#if NeedWidePrototypes
Packit b099d7
                        int exclusive,
Packit b099d7
                        int springLoaded,
Packit b099d7
#else
Packit b099d7
                        Boolean exclusive,
Packit b099d7
                        Boolean springLoaded,
Packit b099d7
#endif /* NeedWidePrototypes */
Packit b099d7
                        XmVendorShellExtObject origKid) ;
Packit b099d7
static void RemoveGrab( 
Packit b099d7
                        XmVendorShellExtObject ve,
Packit b099d7
#if NeedWidePrototypes
Packit b099d7
                        int being_destroyed,
Packit b099d7
#else
Packit b099d7
                        Boolean being_destroyed,
Packit b099d7
#endif /* NeedWidePrototypes */
Packit b099d7
                        Widget shell) ;
Packit b099d7
static void RemoveGrabCallback( 
Packit b099d7
                        Widget w,
Packit b099d7
                        XtPointer client_data,
Packit b099d7
                        XtPointer call_data) ;
Packit b099d7
static void AddToGrabList( 
Packit b099d7
                        Widget parent,
Packit b099d7
                        Widget excludedKid,
Packit b099d7
                        Widget origKid) ;
Packit b099d7
static void AddCousinsToGrabList( 
Packit b099d7
                        Widget parent,
Packit b099d7
                        Widget excludedKid,
Packit b099d7
                        Widget origKid) ;
Packit b099d7
static Boolean IsPopupShell( 
Packit b099d7
                        Widget shell) ;
Packit b099d7
static void PopupCallback( 
Packit b099d7
                        Widget shellParent,
Packit b099d7
                        XtPointer closure,
Packit b099d7
                        XtPointer callData) ;
Packit b099d7
static void PopdownCallback( 
Packit b099d7
                        Widget shellParent,
Packit b099d7
                        XtPointer closure,
Packit b099d7
                        XtPointer callData) ;
Packit b099d7
static Widget GetNextShell( 
Packit b099d7
                        Widget vw) ;
Packit b099d7
static XmDesktopObject GetShellDesktopParent( 
Packit b099d7
                        VendorShellWidget vw,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
Packit b099d7
static void SecondaryObjectCreate( 
Packit b099d7
                        Widget req,
Packit b099d7
                        Widget new_w,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
Packit b099d7
static void InitializePrehook( 
Packit b099d7
                        Widget req,
Packit b099d7
                        Widget new_w,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
Packit b099d7
static void VendorExtInitialize( 
Packit b099d7
                        Widget req,
Packit b099d7
                        Widget new_w,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
Packit b099d7
static void MotifWarningHandler (
Packit b099d7
                        String name,
Packit b099d7
                        String type, 
Packit b099d7
                        String s_class, 
Packit b099d7
                        String message,
Packit b099d7
                        String * params,
Packit b099d7
                        Cardinal* num_params);
Packit b099d7
static void Initialize( 
Packit b099d7
                        Widget req,
Packit b099d7
                        Widget new_w,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
Packit b099d7
static void InitializePosthook( 
Packit b099d7
                        Widget req,
Packit b099d7
                        Widget new_w,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
Packit b099d7
static Boolean SetValuesPrehook( 
Packit b099d7
                        Widget old,
Packit b099d7
                        Widget ref,
Packit b099d7
                        Widget new_w,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
Packit b099d7
static Boolean VendorExtSetValues( 
Packit b099d7
                        Widget old,
Packit b099d7
                        Widget ref,
Packit b099d7
                        Widget new_w,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
Packit b099d7
static Boolean SetValues( 
Packit b099d7
                        Widget current,
Packit b099d7
                        Widget req,
Packit b099d7
                        Widget new_w,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
Packit b099d7
static Boolean SetValuesPosthook( 
Packit b099d7
                        Widget current,
Packit b099d7
                        Widget req,
Packit b099d7
                        Widget new_w,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
Packit b099d7
static void GetValuesPrehook( 
Packit b099d7
                        Widget w,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
Packit b099d7
static void GetValuesHook( 
Packit b099d7
                        Widget w,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
Packit b099d7
static void GetValuesPosthook( 
Packit b099d7
                        Widget w,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
Packit b099d7
static void PendingTransientDestroyed( 
Packit b099d7
                        Widget vw,
Packit b099d7
                        XtPointer cl_data,
Packit b099d7
                        XtPointer ca_data) ;
Packit b099d7
static void SetTransientFor( 
Packit b099d7
                        Widget w,
Packit b099d7
                        XtPointer closure,
Packit b099d7
                        XtPointer call_data) ;
Packit b099d7
static void Resize( 
Packit b099d7
                        Widget w) ;
Packit b099d7
static void ChangeManaged( 
Packit b099d7
                        Widget wid) ;
Packit b099d7
static void UpdateCoreGeometry( 
Packit b099d7
                        VendorShellWidget vw,
Packit b099d7
                        XmVendorShellExtObject vendorExt) ;
Packit b099d7
static void Realize( 
Packit b099d7
                        Widget wid,
Packit b099d7
                        XtValueMask *vmask,
Packit b099d7
                        XSetWindowAttributes *attr) ;
Packit b099d7
static XtGeometryResult GeometryManager( 
Packit b099d7
                        Widget wid,
Packit b099d7
                        XtWidgetGeometry *request,
Packit b099d7
                        XtWidgetGeometry *reply) ;
Packit b099d7
static XtGeometryResult RootGeometryManager( 
Packit b099d7
                        Widget wid,
Packit b099d7
                        XtWidgetGeometry *request,
Packit b099d7
                        XtWidgetGeometry *reply) ;
Packit b099d7
static void SetMwmHints( 
Packit b099d7
                        XmVendorShellExtObject ve) ;
Packit b099d7
static void SetMwmMenu( 
Packit b099d7
                        XmVendorShellExtObject ve) ;
Packit b099d7
static void VendorExtRealize( 
Packit b099d7
                        Widget w,
Packit b099d7
                        XtPointer closure,
Packit b099d7
                        XtPointer call_data) ;
Packit b099d7
Packit b099d7
static void AddDLEntry( 
Packit b099d7
                        XmVendorShellExtObject ve,
Packit b099d7
                        Widget shell) ;
Packit b099d7
static void RemoveDLEntry( 
Packit b099d7
                        unsigned pos) ;
Packit b099d7
static void Destroy( 
Packit b099d7
                        Widget wid) ;
Packit b099d7
static void Redisplay( 
Packit b099d7
                        Widget wid,
Packit b099d7
                        XEvent *event,
Packit b099d7
                        Region region) ;
Packit b099d7
static XmFontList GetTable(Widget wid,
Packit b099d7
			   XtEnum type);
Packit b099d7
static XmDirection GetDirection(Widget);
Packit b099d7
static void GetColors(Widget widget, 
Packit b099d7
		      XmAccessColorData color_data);
Packit b099d7
static unsigned char GetUnitType(Widget);
Packit b099d7
Packit b099d7
/********    End Static Function Declarations    ********/
Packit b099d7
Packit b099d7
#ifdef DEBUG_GRABS
Packit b099d7
Packit b099d7
Packit b099d7
static void PrintModal(
Packit b099d7
                        XmModalData modal) ;
Packit b099d7
static void PrintXmGrabs(
Packit b099d7
                        Widget wid) ;
Packit b099d7
Packit b099d7
Packit b099d7
#endif /* DEBUG_GRABS */
Packit b099d7
Packit b099d7
char _XmVersionString[] = XmVERSION_STRING ;
Packit b099d7
Packit b099d7
static XmDestroyGrabList destroy_list ;
Packit b099d7
static unsigned short destroy_list_size ;
Packit b099d7
static unsigned short destroy_list_cnt ;
Packit b099d7
Packit b099d7
static Display * _XmDisplayHandle = NULL ;
Packit b099d7
static XtErrorMsgHandler previousWarningHandler = NULL;
Packit b099d7
Packit b099d7
/***************************************************************************
Packit b099d7
 *
Packit b099d7
 * Vendor shell class record
Packit b099d7
 *
Packit b099d7
 ***************************************************************************/
Packit b099d7
Packit b099d7
#define Offset(field) (XtOffsetOf(WMShellRec, field))
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 resources[] =
Packit b099d7
{
Packit b099d7
    {
Packit b099d7
	XmNx, XmCPosition, XmRHorizontalPosition, sizeof(Position),
Packit b099d7
	XtOffsetOf(WidgetRec, core.x), XmRImmediate, (XtPointer) 0,
Packit b099d7
    },
Packit b099d7
    
Packit b099d7
    {
Packit b099d7
	XmNy, XmCPosition, XmRVerticalPosition, sizeof(Position),
Packit b099d7
	XtOffsetOf(WidgetRec, core.y), XmRImmediate, (XtPointer) 0,
Packit b099d7
    },
Packit b099d7
    
Packit b099d7
    {
Packit b099d7
	XmNwidth, XmCDimension, XmRHorizontalDimension, sizeof(Dimension),
Packit b099d7
	XtOffsetOf(WidgetRec, core.width), XmRImmediate, (XtPointer) 0,
Packit b099d7
    },
Packit b099d7
    
Packit b099d7
    {
Packit b099d7
	XmNheight, XmCDimension, XmRVerticalDimension, sizeof(Dimension),
Packit b099d7
	XtOffsetOf(WidgetRec, core.height), XmRImmediate, (XtPointer) 0,
Packit b099d7
    },
Packit b099d7
    
Packit b099d7
    {
Packit b099d7
	XmNborderWidth, XmCBorderWidth, XmRHorizontalDimension, 
Packit b099d7
	sizeof(Dimension),
Packit b099d7
	XtOffsetOf(WidgetRec, core.border_width), XmRImmediate, (XtPointer) 0,
Packit b099d7
    },
Packit b099d7
    
Packit b099d7
    /* size_hints minus things stored in core */
Packit b099d7
    { XmNbaseWidth, XmCBaseWidth, XmRHorizontalInt, sizeof(int),
Packit b099d7
	Offset(wm.base_width),
Packit b099d7
	XmRHorizontalInt, (XtPointer) &default_unspecified_shell_int},
Packit b099d7
    { XmNbaseHeight, XmCBaseHeight, XmRVerticalInt, sizeof(int),
Packit b099d7
	Offset(wm.base_height),
Packit b099d7
	XmRVerticalInt, (XtPointer) &default_unspecified_shell_int},
Packit b099d7
    { XmNminWidth, XmCMinWidth, XmRHorizontalInt, sizeof(int),
Packit b099d7
	Offset(wm.size_hints.min_width),
Packit b099d7
	XmRHorizontalInt, (XtPointer) &default_unspecified_shell_int},
Packit b099d7
    { XmNminHeight, XmCMinHeight, XmRVerticalInt, sizeof(int),
Packit b099d7
	Offset(wm.size_hints.min_height),
Packit b099d7
	XmRVerticalInt, (XtPointer) &default_unspecified_shell_int},
Packit b099d7
    { XmNmaxWidth, XmCMaxWidth, XmRHorizontalInt, sizeof(int),
Packit b099d7
	Offset(wm.size_hints.max_width),
Packit b099d7
	XmRHorizontalInt, (XtPointer) &default_unspecified_shell_int},
Packit b099d7
    { XmNmaxHeight, XmCMaxHeight, XmRVerticalInt, sizeof(int),
Packit b099d7
	Offset(wm.size_hints.max_height),
Packit b099d7
	XmRVerticalInt, (XtPointer) &default_unspecified_shell_int},
Packit b099d7
    { XmNwidthInc, XmCWidthInc, XmRHorizontalInt, sizeof(int),
Packit b099d7
	Offset(wm.size_hints.width_inc),
Packit b099d7
	XmRHorizontalInt, (XtPointer) &default_unspecified_shell_int},
Packit b099d7
    { XmNheightInc, XmCHeightInc, XmRVerticalInt, sizeof(int),
Packit b099d7
	Offset(wm.size_hints.height_inc),
Packit b099d7
	XmRVerticalInt, (XtPointer) &default_unspecified_shell_int},
Packit b099d7
    { XmNminAspectX, XmCMinAspectX, XmRHorizontalInt, sizeof(int),
Packit b099d7
	Offset(wm.size_hints.min_aspect.x),
Packit b099d7
	XmRHorizontalInt, (XtPointer) &default_unspecified_shell_int},
Packit b099d7
    { XmNminAspectY, XmCMinAspectY, XmRVerticalInt, sizeof(int),
Packit b099d7
	Offset(wm.size_hints.min_aspect.y),
Packit b099d7
	XmRVerticalInt, (XtPointer) &default_unspecified_shell_int},
Packit b099d7
    { XmNmaxAspectX, XmCMaxAspectX, XmRHorizontalInt, sizeof(int),
Packit b099d7
	Offset(wm.size_hints.max_aspect.x),
Packit b099d7
	XmRHorizontalInt, (XtPointer) &default_unspecified_shell_int},
Packit b099d7
    { XmNmaxAspectY, XmCMaxAspectY, XmRVerticalInt, sizeof(int),
Packit b099d7
	Offset(wm.size_hints.max_aspect.y),
Packit b099d7
	XmRVerticalInt, (XtPointer) &default_unspecified_shell_int},
Packit b099d7
    /* wm_hints */
Packit b099d7
    { XmNiconPixmap, XmCIconPixmap, XmRDynamicPixmap, sizeof(Pixmap),
Packit b099d7
	Offset(wm.wm_hints.icon_pixmap), XmRPixmap, NULL},
Packit b099d7
    { XmNiconX, XmCIconX, XmRHorizontalInt, sizeof(int),
Packit b099d7
	Offset(wm.wm_hints.icon_x),
Packit b099d7
	XmRHorizontalInt, (XtPointer) &default_unspecified_shell_int},
Packit b099d7
    { XmNiconY, XmCIconY, XmRVerticalInt, sizeof(int),
Packit b099d7
	Offset(wm.wm_hints.icon_y),
Packit b099d7
	XmRVerticalInt, (XtPointer) &default_unspecified_shell_int},
Packit b099d7
Packit b099d7
    { /* override dec default */
Packit b099d7
	XmNinput, XmCInput, XmRBool, 
Packit b099d7
	sizeof(Bool), Offset(wm.wm_hints.input), 
Packit b099d7
	XmRImmediate, (XtPointer) TRUE,
Packit b099d7
    },
Packit b099d7
    { /* override incorrect default in Shell.c */
Packit b099d7
	XmNwindowGroup, XmCWindowGroup, XmRWindow, sizeof(Window),
Packit b099d7
	Offset(wm.wm_hints.window_group),
Packit b099d7
	XmRImmediate, (XtPointer)XtUnspecifiedWindowGroup,
Packit b099d7
    },
Packit b099d7
   {  /* default visual dynamically, see _XmDefaultVisualResources */    
Packit b099d7
       XtNvisual, XtCVisual, 
Packit b099d7
       XtRVisual, sizeof(Visual*),
Packit b099d7
       XtOffsetOf(ShellRec, shell.visual), 
Packit b099d7
       XtRImmediate, (XtPointer)INVALID_VISUAL
Packit b099d7
   },
Packit b099d7
};	
Packit b099d7
#undef Offset
Packit b099d7
Packit b099d7
static XtResource subresources[] =
Packit b099d7
{
Packit b099d7
    {
Packit b099d7
        XmNtoolTipPostDelay, XmCToolTipPostDelay, XmRInt,
Packit b099d7
        sizeof(unsigned int), XtOffsetOf(XmToolTipConfigTraitRec, post_delay),
Packit b099d7
        XmRImmediate, (XtPointer) 5000,
Packit b099d7
    },
Packit b099d7
    {
Packit b099d7
        XmNtoolTipPostDuration, XmCToolTipPostDuration, XmRInt,
Packit b099d7
        sizeof(unsigned int), XtOffsetOf(XmToolTipConfigTraitRec, post_duration),
Packit b099d7
        XmRImmediate, (XtPointer) 5000,
Packit b099d7
    },
Packit b099d7
    {
Packit b099d7
        XmNtoolTipEnable, XmCToolTipEnable, XmRBoolean,
Packit b099d7
        sizeof(Boolean), XtOffsetOf(XmToolTipConfigTraitRec, enable),
Packit b099d7
        XmRImmediate, (XtPointer) False,
Packit b099d7
    },
Packit b099d7
};
Packit b099d7
Packit b099d7
static CompositeClassExtensionRec compositeClassExtRec = {
Packit b099d7
    NULL,
Packit b099d7
    NULLQUARK,
Packit b099d7
    XtCompositeExtensionVersion,
Packit b099d7
    sizeof(CompositeClassExtensionRec),
Packit b099d7
    TRUE,
Packit b099d7
};
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
static XmBaseClassExtRec baseClassExtRec = {
Packit b099d7
    NULL,
Packit b099d7
    NULLQUARK,
Packit b099d7
    XmBaseClassExtVersion,
Packit b099d7
    sizeof(XmBaseClassExtRec),
Packit b099d7
    InitializePrehook,				/* init prehook		*/
Packit b099d7
    SetValuesPrehook,				/* setval prehook	*/
Packit b099d7
    InitializePosthook,				/* init posthook	*/
Packit b099d7
    SetValuesPosthook,				/* setval posthook	*/
Packit b099d7
    (WidgetClass)&xmVendorShellExtClassRec,	/* secondary class	*/
Packit b099d7
    SecondaryObjectCreate,	        /* secondary create	*/
Packit b099d7
    GetSecResData,		                /* getSecRes data       */
Packit b099d7
    {0},					/* class flags		*/
Packit b099d7
    GetValuesPrehook,				/* get_values_prehook	*/
Packit b099d7
    GetValuesPosthook,				/* get_values_posthook  */
Packit b099d7
};
Packit b099d7
Packit b099d7
externaldef(vendorshellclassrec)
Packit b099d7
VendorShellClassRec vendorShellClassRec = {
Packit b099d7
    {	
Packit b099d7
	(WidgetClass) &wmShellClassRec, /* superclass 		*/   
Packit b099d7
	"VendorShell", 			/* class_name 		*/   
Packit b099d7
	sizeof(VendorShellRec), 	/* size 		*/   
Packit b099d7
	ClassInitialize, 		/* Class Initializer 	*/   
Packit b099d7
	ClassPartInitialize, 		/* class_part_init 	*/ 
Packit b099d7
	FALSE, 				/* Class init'ed ? 	*/   
Packit b099d7
	Initialize, 			/* initialize         	*/   
Packit b099d7
	NULL, 				/* initialize_hook	*/ 
Packit b099d7
	Realize, 			/* realize            	*/   
Packit b099d7
	NULL,	 			/* actions            	*/   
Packit b099d7
	0,				/* num_actions        	*/   
Packit b099d7
	resources, 			/* resources          	*/   
Packit b099d7
	XtNumber(resources), 		/* resource_count     	*/   
Packit b099d7
	NULLQUARK, 			/* xrm_class          	*/   
Packit b099d7
	FALSE, 				/* compress_motion    	*/   
Packit b099d7
	XtExposeCompressSeries, 	/* compress_exposure  	*/   
Packit b099d7
	FALSE, 				/* compress_enterleave	*/   
Packit b099d7
	FALSE, 				/* visible_interest   	*/   
Packit b099d7
	Destroy,			/* destroy            	*/   
Packit b099d7
	Resize,		 		/* resize             	*/   
Packit b099d7
	NULL,				/* expose             	*/   
Packit b099d7
	SetValues,	 		/* set_values         	*/   
Packit b099d7
	NULL, 				/* set_values_hook      */ 
Packit b099d7
	XtInheritSetValuesAlmost, 	/* set_values_almost    */ 
Packit b099d7
	GetValuesHook,			/* get_values_hook      */ 
Packit b099d7
	NULL, 				/* accept_focus       	*/   
Packit b099d7
	XtVersion, 			/* intrinsics version 	*/   
Packit b099d7
	NULL, 				/* callback offsets   	*/   
Packit b099d7
	NULL,				/* tm_table           	*/   
Packit b099d7
	NULL, 				/* query_geometry       */ 
Packit b099d7
	NULL, 				/* display_accelerator  */ 
Packit b099d7
	(XtPointer)&baseClassExtRec,	/* extension		*/ 
Packit b099d7
    },	
Packit b099d7
    { 					/* composite_class	*/
Packit b099d7
	GeometryManager,		/* geometry_manager 	*/   
Packit b099d7
	ChangeManaged,		 	/* change_managed 	*/   
Packit b099d7
	XtInheritInsertChild, 		/* insert_child 	*/   
Packit b099d7
	XtInheritDeleteChild, 		/* delete_child 	*/   
Packit b099d7
	(XtPointer)&compositeClassExtRec,/* extension            */ 
Packit b099d7
    },                           
Packit b099d7
    {                            	/* shell class		*/
Packit b099d7
	(XtPointer)&shellClassExtRec,	/* extension 		*/ 
Packit b099d7
    }, 
Packit b099d7
    {                            	/* wmshell class	*/
Packit b099d7
	NULL, 				/* extension            */ 
Packit b099d7
    }, 	
Packit b099d7
    {   				/* vendorshell class	*/
Packit b099d7
	NULL, 				/* extension            */ 
Packit b099d7
    }                            
Packit b099d7
};	   
Packit b099d7
Packit b099d7
externaldef(vendorshellwidgetclass) WidgetClass 
Packit b099d7
  vendorShellWidgetClass = (WidgetClass) (&vendorShellClassRec);
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/* Trait record for VendorS specify render table */
Packit b099d7
Packit b099d7
static XmConst XmSpecRenderTraitRec vsSRT = {
Packit b099d7
  0,		/* version */
Packit b099d7
  GetTable,
Packit b099d7
};
Packit b099d7
Packit b099d7
/* Trait record for VendorS specify layout direction  */
Packit b099d7
Packit b099d7
static XmConst XmSpecifyLayoutDirectionTraitRec vsLDT = {
Packit b099d7
  0,			/* version */
Packit b099d7
  GetDirection
Packit b099d7
};
Packit b099d7
Packit b099d7
Packit b099d7
/* Access Colors Trait record for vendor shell */
Packit b099d7
Packit b099d7
static XmConst XmAccessColorsTraitRec vsACT = {
Packit b099d7
  0,			/* version */
Packit b099d7
  GetColors
Packit b099d7
};
Packit b099d7
Packit b099d7
/* Unit Type Trait record for VendorShell */
Packit b099d7
Packit b099d7
static XmConst XmSpecUnitTypeTraitRec vsUTT = {
Packit b099d7
  0,			/* version */
Packit b099d7
  GetUnitType
Packit b099d7
};
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  BaseProc
Packit b099d7
 *    This function can be used to check if the widget has actually
Packit b099d7
 *    been initialize (vs in the process of creation, like a conversion)
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static XtPointer 
Packit b099d7
BaseProc(
Packit b099d7
        Widget widget,
Packit b099d7
        XtPointer client_data )	/* unused */
Packit b099d7
{   
Packit b099d7
   XmWidgetExtData	extData;
Packit b099d7
   Widget		secObj = NULL;
Packit b099d7
   _XmWidgetToAppContext(widget);
Packit b099d7
Packit b099d7
   _XmAppLock(app);
Packit b099d7
Packit b099d7
    
Packit b099d7
    if ((extData = _XmGetWidgetExtData(widget, XmSHELL_EXTENSION)))
Packit b099d7
    {
Packit b099d7
	secObj = extData->widget;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    _XmAppUnlock(app);
Packit b099d7
    return secObj;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  GetSecResData
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
static Cardinal 
Packit b099d7
GetSecResData(
Packit b099d7
        WidgetClass w_class,
Packit b099d7
        XmSecondaryResourceData **secResDataRtn )
Packit b099d7
{
Packit b099d7
    XmBaseClassExt	*bcePtr;
Packit b099d7
    int arrayCount = 0;
Packit b099d7
    String  resource_class, resource_name;
Packit b099d7
    XtPointer  client_data;
Packit b099d7
Packit b099d7
    _XmProcessLock();
Packit b099d7
    if ((bcePtr = _XmGetBaseClassExtPtr(w_class, XmQmotif)) &&
Packit b099d7
	(bcePtr) && (*bcePtr) &&
Packit b099d7
	((*bcePtr)->secondaryObjectClass))
Packit b099d7
    {
Packit b099d7
      client_data = NULL;
Packit b099d7
      resource_class = NULL;
Packit b099d7
      resource_name = NULL;
Packit b099d7
      arrayCount =
Packit b099d7
        _XmSecondaryResourceData ( *bcePtr, secResDataRtn, client_data,  
Packit b099d7
                                   resource_name, resource_class,
Packit b099d7
			           BaseProc) ;
Packit b099d7
Packit b099d7
    }
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
    return arrayCount;
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  ClassInitialize
Packit b099d7
 *    Initialize the vendorShell class structure.  This is called only
Packit b099d7
 *    the first time a vendorShell widget is created.  It registers the
Packit b099d7
 *    resource type converters unique to this class.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
static void 
Packit b099d7
ClassInitialize( void )
Packit b099d7
{
Packit b099d7
  Cardinal                    wc_num_res, sc_num_res;
Packit b099d7
  XtResource                  *merged_list;
Packit b099d7
  int                         i, j;
Packit b099d7
  XtResourceList              uncompiled;
Packit b099d7
  Cardinal                    num;
Packit b099d7
Packit b099d7
/**************************************************************************
Packit b099d7
   ShellExt's and VendorShellExt's resource lists are being merged into one
Packit b099d7
   and assigned to xmVendorShellExtObjectClassRec. This is for performance
Packit b099d7
   reasons, since, instead of two calls to XtGetSubResources() XtGetSubvaluse()
Packit b099d7
   and XtSetSubvalues() for both the superclass and the widget class, now
Packit b099d7
   we have just one call with a merged resource list.
Packit b099d7
   NOTE: At this point the resource lists for ShellExt and VendorShellExt do
Packit b099d7
         have unique entries, but if there are resources in the superclass
Packit b099d7
         that are being overwritten by the subclass then the merged_lists
Packit b099d7
         need to be created differently.
Packit b099d7
****************************************************************************/
Packit b099d7
Packit b099d7
  _XmProcessLock();
Packit b099d7
  wc_num_res = xmVendorShellExtClassRec.object_class.num_resources;
Packit b099d7
Packit b099d7
  sc_num_res = xmShellExtClassRec.object_class.num_resources;
Packit b099d7
Packit b099d7
  merged_list = (XtResource *)XtMalloc((sizeof(XtResource) * (wc_num_res +
Packit b099d7
                                                                 sc_num_res)));
Packit b099d7
Packit b099d7
  _XmTransformSubResources(xmShellExtClassRec.object_class.resources,
Packit b099d7
                           sc_num_res, &uncompiled, &num);
Packit b099d7
Packit b099d7
  for (i = 0; i < num; i++)
Packit b099d7
  {
Packit b099d7
Packit b099d7
  merged_list[i] = uncompiled[i];
Packit b099d7
Packit b099d7
  }
Packit b099d7
  _XmProcessUnlock();
Packit b099d7
Packit b099d7
  _XmProcessLock();
Packit b099d7
  for (i = 0, j = num; i < wc_num_res; i++, j++)
Packit b099d7
  {
Packit b099d7
   merged_list[j] =
Packit b099d7
        xmVendorShellExtClassRec.object_class.resources[i];
Packit b099d7
  }
Packit b099d7
  _XmProcessUnlock();
Packit b099d7
Packit b099d7
  _XmProcessLock();
Packit b099d7
  xmVendorShellExtClassRec.object_class.resources = merged_list;
Packit b099d7
  xmVendorShellExtClassRec.object_class.num_resources = wc_num_res + sc_num_res ;
Packit b099d7
  _XmProcessUnlock();
Packit b099d7
Packit b099d7
  _XmRegisterConverters();
Packit b099d7
  _XmRegisterPixmapConverters();
Packit b099d7
Packit b099d7
  _XmInitializeExtensions();
Packit b099d7
  _XmInitializeTraits();
Packit b099d7
Packit b099d7
{
Packit b099d7
   XtProc class_initialize;
Packit b099d7
   _XmProcessLock();
Packit b099d7
   class_initialize = xmVendorShellExtObjectClass->core_class.class_initialize;
Packit b099d7
   _XmProcessUnlock();
Packit b099d7
   
Packit b099d7
   (*class_initialize) ();
Packit b099d7
}
Packit b099d7
   baseClassExtRec.record_type = XmQmotif;
Packit b099d7
Packit b099d7
   _XmBuildExtResources((WidgetClass) baseClassExtRec.secondaryObjectClass);
Packit b099d7
Packit b099d7
    _XmProcessLock();
Packit b099d7
Packit b099d7
   if (((XmShellExtObjectClass)baseClassExtRec.secondaryObjectClass)->desktop_class.insert_child ==
Packit b099d7
          XtInheritInsertChild)
Packit b099d7
       ((XmShellExtObjectClass)baseClassExtRec.secondaryObjectClass)->desktop_class.insert_child =
Packit b099d7
        ((XmShellExtObjectClass) xmDesktopClass)->desktop_class.insert_child;
Packit b099d7
Packit b099d7
   if (((XmShellExtObjectClass)baseClassExtRec.secondaryObjectClass)->desktop_class.delete_child ==
Packit b099d7
          XtInheritDeleteChild)
Packit b099d7
       ((XmShellExtObjectClass)baseClassExtRec.secondaryObjectClass)->desktop_class.delete_child =
Packit b099d7
        ((XmShellExtObjectClass) xmDesktopClass)->desktop_class.delete_child;
Packit b099d7
Packit b099d7
   if (((XmShellExtObjectClass)baseClassExtRec.secondaryObjectClass)->shell_class.structureNotifyHandler ==
Packit b099d7
          XmInheritEventHandler)
Packit b099d7
       ((XmShellExtObjectClass)baseClassExtRec.secondaryObjectClass)->shell_class.structureNotifyHandler =
Packit b099d7
        ((XmShellExtObjectClass) xmShellExtObjectClass)->shell_class.structureNotifyHandler;
Packit b099d7
Packit b099d7
   if (((XmVendorShellExtObjectClass)baseClassExtRec.secondaryObjectClass)->vendor_class.offset_handler ==
Packit b099d7
          XmInheritProtocolHandler)
Packit b099d7
       ((XmVendorShellExtObjectClass)baseClassExtRec.secondaryObjectClass)->vendor_class.offset_handler =
Packit b099d7
        ((XmVendorShellExtObjectClass) xmVendorShellExtObjectClass)->vendor_class.offset_handler;
Packit b099d7
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
Packit b099d7
Packit b099d7
   XtFree((char *)uncompiled);
Packit b099d7
Packit b099d7
#ifndef NO_MESSAGE_CATALOG
Packit b099d7
    Xm_catd = catopen("Xm", NL_CAT_LOCALE);    
Packit b099d7
#endif
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  ClassPartInitialize
Packit b099d7
 *    Set up the inheritance mechanism for the routines exported by
Packit b099d7
 *    vendorShells class part.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
static void 
Packit b099d7
ClassPartInitialize(
Packit b099d7
        WidgetClass wc )
Packit b099d7
{
Packit b099d7
    CompositeWidgetClass	compWc = (CompositeWidgetClass)wc;
Packit b099d7
Packit b099d7
    CompositeClassExtensionRec 	**compExtPtr;
Packit b099d7
    XmBaseClassExt		*wcePtr, *scePtr;
Packit b099d7
    XmVendorShellWidgetClass    vc = (XmVendorShellWidgetClass) wc; 
Packit b099d7
Packit b099d7
    CompositeWidgetClass	superWc;
Packit b099d7
    _XmProcessLock();
Packit b099d7
    superWc = (CompositeWidgetClass)wc->core_class.superclass;
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
    
Packit b099d7
    wcePtr = _XmGetBaseClassExtPtr(wc, XmQmotif);
Packit b099d7
Packit b099d7
    _XmProcessLock();
Packit b099d7
    scePtr = _XmGetBaseClassExtPtr(wc->core_class.superclass, XmQmotif);
Packit b099d7
Packit b099d7
    if ( (vc != (XmVendorShellWidgetClass)vendorShellWidgetClass) && 
Packit b099d7
	scePtr && *scePtr && 
Packit b099d7
	(*wcePtr)->secondaryObjectClass != NULL &&
Packit b099d7
	((*scePtr)->secondaryObjectClass != (*wcePtr)->secondaryObjectClass)){
Packit b099d7
	XmVendorShellExtObjectClass  wceClass, sceClass;
Packit b099d7
Packit b099d7
	wceClass = (XmVendorShellExtObjectClass)(*wcePtr)->
Packit b099d7
	    secondaryObjectClass;
Packit b099d7
	sceClass = (XmVendorShellExtObjectClass)(*scePtr)->
Packit b099d7
	    secondaryObjectClass;
Packit b099d7
	_XmBuildExtResources((WidgetClass) (*wcePtr)->secondaryObjectClass);
Packit b099d7
Packit b099d7
	if (wceClass->desktop_class.insert_child == XtInheritInsertChild)
Packit b099d7
	    wceClass->desktop_class.insert_child = 
Packit b099d7
		sceClass->desktop_class.insert_child;
Packit b099d7
      
Packit b099d7
	if (wceClass->desktop_class.delete_child == XtInheritDeleteChild)
Packit b099d7
	    wceClass->desktop_class.delete_child =
Packit b099d7
		sceClass->desktop_class.delete_child;
Packit b099d7
      
Packit b099d7
	if (wceClass->shell_class.structureNotifyHandler == 
Packit b099d7
	    XmInheritEventHandler)
Packit b099d7
	    wceClass->shell_class.structureNotifyHandler =
Packit b099d7
		sceClass->shell_class.structureNotifyHandler;
Packit b099d7
      
Packit b099d7
	if (wceClass->vendor_class.offset_handler == XmInheritProtocolHandler)
Packit b099d7
	    wceClass->vendor_class.offset_handler = 
Packit b099d7
		sceClass->vendor_class.offset_handler;
Packit b099d7
      }
Packit b099d7
    
Packit b099d7
    compExtPtr = (CompositeClassExtensionRec **) 
Packit b099d7
	&(compWc->composite_class.extension);
Packit b099d7
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
Packit b099d7
    compExtPtr = (CompositeClassExtensionRec **)
Packit b099d7
	_XmGetClassExtensionPtr( (XmGenericClassExt *) compExtPtr, NULLQUARK);
Packit b099d7
Packit b099d7
    if (*compExtPtr == NULL) {
Packit b099d7
	CompositeClassExtensionRec 	**superExtPtr;
Packit b099d7
	
Packit b099d7
    _XmProcessLock();
Packit b099d7
	superExtPtr = (CompositeClassExtensionRec **) &(superWc->composite_class.extension);
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
Packit b099d7
	superExtPtr = (CompositeClassExtensionRec **)
Packit b099d7
                  _XmGetClassExtensionPtr(
Packit b099d7
                      (XmGenericClassExt *) superExtPtr,
Packit b099d7
                      NULLQUARK);
Packit b099d7
Packit b099d7
	*compExtPtr = XtNew(CompositeClassExtensionRec);
Packit b099d7
	memcpy((char*)*compExtPtr, (char*)*superExtPtr, 
Packit b099d7
	       sizeof(CompositeClassExtensionRec));
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /* Do this here because of bug in Xt */
Packit b099d7
    _XmProcessLock();
Packit b099d7
    wc->core_class.expose = Redisplay;
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
Packit b099d7
   /* Install the render table trait for all subclasses as well. */
Packit b099d7
    XmeTraitSet((XtPointer)wc, XmQTspecifyRenderTable, (XtPointer)&vsSRT);
Packit b099d7
Packit b099d7
   /* Install the direction trait for all subclasses as well. */
Packit b099d7
    XmeTraitSet((XtPointer)wc, XmQTspecifyLayoutDirection, (XtPointer)&vsLDT);
Packit b099d7
Packit b099d7
   /* Install the accessColors trait for all subclasses as well. */
Packit b099d7
    XmeTraitSet((XtPointer)wc, XmQTaccessColors, (XtPointer)&vsACT);
Packit b099d7
Packit b099d7
   /* Install the unit type trait for all subclasses as well. */
Packit b099d7
    XmeTraitSet((XtPointer)wc, XmQTspecifyUnitType, (XtPointer)&vsUTT);
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  SetMwmStuff
Packit b099d7
 *     ov will be null when called from Initialize
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
static void 
Packit b099d7
SetMwmStuff(
Packit b099d7
        XmVendorShellExtObject ove,
Packit b099d7
        XmVendorShellExtObject nve )
Packit b099d7
{
Packit b099d7
    Boolean		changed = FALSE;
Packit b099d7
    Widget		extParent = nve->ext.logicalParent;
Packit b099d7
Packit b099d7
    if (!ove || (ove->vendor.mwm_menu != nve->vendor.mwm_menu))
Packit b099d7
      {
Packit b099d7
	  /* make mwm_menu local */
Packit b099d7
	  if (ove && ove->vendor.mwm_menu) 
Packit b099d7
	    XtFree(ove->vendor.mwm_menu);
Packit b099d7
	  if (nve->vendor.mwm_menu)
Packit b099d7
	    nve->vendor.mwm_menu = XtNewString(nve->vendor.mwm_menu);
Packit b099d7
	  if (XtIsRealized(extParent))
Packit b099d7
	    SetMwmMenu(nve);
Packit b099d7
      }
Packit b099d7
    
Packit b099d7
    if (!ove || (ove->vendor.mwm_hints.functions != nve->vendor.mwm_hints.functions))
Packit b099d7
      {
Packit b099d7
	  if (nve->vendor.mwm_hints.functions == DONT_CARE)
Packit b099d7
	    nve->vendor.mwm_hints.flags &= ~MWM_HINTS_FUNCTIONS;
Packit b099d7
	  else
Packit b099d7
	    nve->vendor.mwm_hints.flags |= MWM_HINTS_FUNCTIONS;
Packit b099d7
	  changed |= TRUE;
Packit b099d7
      }
Packit b099d7
    
Packit b099d7
    if (!ove || (ove->vendor.mwm_hints.decorations != nve->vendor.mwm_hints.decorations))
Packit b099d7
      {
Packit b099d7
	  if (nve->vendor.mwm_hints.decorations == DONT_CARE)
Packit b099d7
	    nve->vendor.mwm_hints.flags &= ~MWM_HINTS_DECORATIONS;
Packit b099d7
	  else
Packit b099d7
	    nve->vendor.mwm_hints.flags |= MWM_HINTS_DECORATIONS;
Packit b099d7
	  changed |= TRUE;
Packit b099d7
      }
Packit b099d7
    
Packit b099d7
    if (!ove || (ove->vendor.mwm_hints.input_mode != nve->vendor.mwm_hints.input_mode))
Packit b099d7
      {
Packit b099d7
	  if (nve->vendor.mwm_hints.input_mode == DONT_CARE)
Packit b099d7
	    nve->vendor.mwm_hints.flags &= ~MWM_HINTS_INPUT_MODE;
Packit b099d7
	  else
Packit b099d7
	    nve->vendor.mwm_hints.flags |= MWM_HINTS_INPUT_MODE;
Packit b099d7
	  changed |= TRUE;
Packit b099d7
      }
Packit b099d7
    
Packit b099d7
    if (changed && XtIsRealized(extParent))
Packit b099d7
      SetMwmHints(nve);
Packit b099d7
}
Packit b099d7
Packit b099d7
/* The AddGrab and RemoveGrab routines manage a virtual Xt modal
Packit b099d7
 * cascade that allows us to remove entries in the list without
Packit b099d7
 * flushing out the grabs of all following entries. 
Packit b099d7
 */
Packit b099d7
void
Packit b099d7
_XmAddGrab(
Packit b099d7
        Widget wid,
Packit b099d7
#if NeedWidePrototypes
Packit b099d7
        int exclusive,
Packit b099d7
        int spring_loaded)
Packit b099d7
#else
Packit b099d7
        Boolean exclusive,
Packit b099d7
        Boolean spring_loaded)
Packit b099d7
#endif /* NeedWidePrototypes */
Packit b099d7
{   
Packit b099d7
  AddGrab( NULL, wid, exclusive, spring_loaded, NULL) ;
Packit b099d7
} 
Packit b099d7
Packit b099d7
void
Packit b099d7
_XmRemoveGrab(
Packit b099d7
        Widget wid)
Packit b099d7
{   
Packit b099d7
  RemoveGrab( NULL, FALSE, wid) ;
Packit b099d7
} 
Packit b099d7
Packit b099d7
static void 
Packit b099d7
AddGrab(
Packit b099d7
        XmVendorShellExtObject ve,
Packit b099d7
        Widget shell,
Packit b099d7
#if NeedWidePrototypes
Packit b099d7
        int exclusive,
Packit b099d7
        int springLoaded,
Packit b099d7
#else
Packit b099d7
        Boolean exclusive,
Packit b099d7
        Boolean springLoaded,
Packit b099d7
#endif /* NeedWidePrototypes */
Packit b099d7
        XmVendorShellExtObject origKid )
Packit b099d7
{
Packit b099d7
    Cardinal		     	position;
Packit b099d7
    XmModalData			modals;
Packit b099d7
    XmDisplay			xmDisplay;
Packit b099d7
Packit b099d7
    if(    shell == NULL    )
Packit b099d7
      {
Packit b099d7
        shell = ve->ext.logicalParent ;
Packit b099d7
      } 
Packit b099d7
    xmDisplay = (XmDisplay) XmGetXmDisplay(XtDisplay(shell));
Packit b099d7
Packit b099d7
    modals = xmDisplay->display.modals;
Packit b099d7
    
Packit b099d7
    position = xmDisplay->display.numModals;
Packit b099d7
    
Packit b099d7
    if (xmDisplay->display.numModals == xmDisplay->display.maxModals) {
Packit b099d7
	/* Allocate more space */
Packit b099d7
	xmDisplay->display.maxModals +=  (xmDisplay->display.maxModals / 2) + 2;
Packit b099d7
	xmDisplay->display.modals = modals = (XmModalData) 
Packit b099d7
	  XtRealloc((char *) modals, (unsigned) 
Packit b099d7
		    ((xmDisplay->display.maxModals) * sizeof(XmModalDataRec)));
Packit b099d7
    }
Packit b099d7
    modals[position].wid = shell;
Packit b099d7
    modals[position].ve = ve;
Packit b099d7
    modals[position].grabber = origKid;
Packit b099d7
    modals[position].exclusive = exclusive;
Packit b099d7
    modals[position].springLoaded = springLoaded;
Packit b099d7
    xmDisplay->display.numModals++;
Packit b099d7
    XtAddGrab((Widget) shell,
Packit b099d7
	      exclusive,
Packit b099d7
	      springLoaded);
Packit b099d7
#ifdef DEBUG_GRABS
Packit b099d7
    printf( "AddGrab: XtAddGrab( %s, excl: %d, spring: %d); grabber: %s\n",
Packit b099d7
                  shell->core.name, exclusive, springLoaded,
Packit b099d7
                    origKid ? origKid->ext.logicalParent->core.name : "NULL") ;
Packit b099d7
#endif
Packit b099d7
Packit b099d7
    /* If the shell gets destroyed, we don't have to worry about removing
Packit b099d7
     * the Xt grab, but we do have to remove the ve from the list of modals.
Packit b099d7
     * Should the client_data be ve or origKid?
Packit b099d7
     */
Packit b099d7
    XtAddCallback((Widget) shell, XmNdestroyCallback, RemoveGrabCallback,(XtPointer)ve);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * we add a new argument here, being_destroyed.  If true, it means that
Packit b099d7
 * we are being called from a callback triggered by the destruction of a
Packit b099d7
 * shell.  If it is true, we should remove shells from the list of modals,
Packit b099d7
 * but we should not call XtRemoveGrab on them, because the intrinsics
Packit b099d7
 * already handle that.
Packit b099d7
 */
Packit b099d7
static void 
Packit b099d7
RemoveGrab(
Packit b099d7
        XmVendorShellExtObject ve,
Packit b099d7
#if NeedWidePrototypes
Packit b099d7
        int being_destroyed,
Packit b099d7
#else
Packit b099d7
	Boolean being_destroyed,
Packit b099d7
#endif /* NeedWidePrototypes */
Packit b099d7
	Widget shell)
Packit b099d7
{
Packit b099d7
    XmDisplay			xmDisplay;
Packit b099d7
    Cardinal		     	incr, i, numRemoves, numModals;
Packit b099d7
    XmModalData			modals;
Packit b099d7
Packit b099d7
    if(    !being_destroyed    )
Packit b099d7
      {   
Packit b099d7
        /* The "shell" argument of this routine is required when the
Packit b099d7
         * "being_destroyed" argument is TRUE, since the vendor
Packit b099d7
         * extension record may be already de-allocated before the
Packit b099d7
         * RemoveGrabCallback is called, and thus cannot be de-referenced
Packit b099d7
         * to get the shell logical parent.  We will assume that the
Packit b099d7
         * shell argument is ignored by callers when the "being_destroyed"
Packit b099d7
         * argument is FALSE.
Packit b099d7
         */
Packit b099d7
        if(    shell == NULL    )
Packit b099d7
          {
Packit b099d7
            shell = ve->ext.logicalParent ;
Packit b099d7
          } 
Packit b099d7
        XtRemoveCallback( shell, XmNdestroyCallback, RemoveGrabCallback,
Packit b099d7
                                                              (XtPointer) ve) ;
Packit b099d7
      } 
Packit b099d7
#ifdef DEBUG_GRABS
Packit b099d7
    printf( "\n**** Entering RemoveGrab on %s (0x%x) ****\n", 
Packit b099d7
	    shell->core.name, ve) ;
Packit b099d7
    PrintXmGrabs( (Widget) shell) ;
Packit b099d7
#endif
Packit b099d7
Packit b099d7
    xmDisplay = (XmDisplay) XmGetXmDisplay(XtDisplay(shell));
Packit b099d7
    modals = xmDisplay->display.modals;
Packit b099d7
    numModals = xmDisplay->display.numModals;
Packit b099d7
Packit b099d7
    for (i = 0, numRemoves = 0;
Packit b099d7
	 i < numModals; 
Packit b099d7
	 i++) 
Packit b099d7
      {
Packit b099d7
	  if(    (modals[i].wid == shell)  &&  (modals[i].ve == ve)    )
Packit b099d7
	    numRemoves++;
Packit b099d7
      }
Packit b099d7
#ifdef DEBUG_GRABS
Packit b099d7
    printf( "RemoveGrab: numRemoves: %d\n", numRemoves) ;
Packit b099d7
#endif
Packit b099d7
    if (numRemoves == 0) return;
Packit b099d7
Packit b099d7
    if (!being_destroyed)
Packit b099d7
       for (i = 0; i < numRemoves; i++)
Packit b099d7
         {   
Packit b099d7
	   XtRemoveGrab((Widget) shell);
Packit b099d7
#ifdef DEBUG_GRABS
Packit b099d7
           printf( "RemoveGrab: XtRemoveGrab( %s)\n", 
Packit b099d7
                                                  ((Widget)shell)->core.name) ;
Packit b099d7
#endif
Packit b099d7
         } 
Packit b099d7
Packit b099d7
    /* Add back all the grabs that were flushed by the removes */
Packit b099d7
    /* 
Packit b099d7
     ** What this piece of code is trying to do is to iterate over the list,
Packit b099d7
     ** and for each item to be removed, skip ahead and find a good one to
Packit b099d7
     ** replace it with. "incr" being set below indicates that a replacement
Packit b099d7
     ** in fact was found.
Packit b099d7
     ** However, the code is not obviously replacing items that are to be 
Packit b099d7
     ** discarded; rather, it's simply letting them fall off the end via 
Packit b099d7
     ** the magic of the combination of i, incr, numRemoves, and numModals 
Packit b099d7
     ** incr should probably be absolute w.r.t. the front of the list and
Packit b099d7
     ** should not double as a marker.
Packit b099d7
     ** It's easy to know where the first removed item was, and 
Packit b099d7
     ** to add the grabs back in to later widgets.
Packit b099d7
     ** As is, it's not obvious when modals[i] is to be overwritten.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    for (i = 0, incr = 0; 
Packit b099d7
	 (i + numRemoves) < numModals;
Packit b099d7
	 i++) 
Packit b099d7
      {
Packit b099d7
	  /* We remove both the shell that's being pulled off the
Packit b099d7
	   * cascade and any raw mode shells that we've added. These
Packit b099d7
	   * should only be the app shells ?!
Packit b099d7
	   */
Packit b099d7
	  for (/*EMPTY*/;
Packit b099d7
	       ((i + incr) < numModals);
Packit b099d7
	       incr++)
Packit b099d7
	    {
Packit b099d7
	        Widget incrWid = modals[i+incr].wid;
Packit b099d7
		/* if it's not the shell, or it is the shell but some 
Packit b099d7
		   other entry for another grab */
Packit b099d7
		if ( (incrWid != shell) || (modals[i+incr].ve != ve) )    
Packit b099d7
		  {
Packit b099d7
		      if  ((ve != NULL) && (modals[i+incr].grabber == ve))
Packit b099d7
                        {   
Packit b099d7
                          /* Avoid re-adding to the grab list widgets
Packit b099d7
                           * that were non-exclusives associated with
Packit b099d7
                           * the shell grab being removed.
Packit b099d7
                           */
Packit b099d7
			  numRemoves++;
Packit b099d7
                        } 
Packit b099d7
		      else
Packit b099d7
			break;
Packit b099d7
		  }
Packit b099d7
	    }
Packit b099d7
	  if (incr && ((i+incr) < numModals))
Packit b099d7
	    {
Packit b099d7
              modals[i] = modals[i+incr];
Packit b099d7
	      if (!(modals[i].wid->core.being_destroyed))
Packit b099d7
	      {
Packit b099d7
		  XtAddGrab( modals[i].wid, modals[i].exclusive,
Packit b099d7
                                                      modals[i].springLoaded) ;
Packit b099d7
#ifdef DEBUG_GRABS
Packit b099d7
		  printf( "RemoveGrab: XtAddGrab( %s, excl: %d, spring: %d)\n",
Packit b099d7
			  modals[i].wid->core.name,
Packit b099d7
			  modals[i].exclusive, modals[i].springLoaded) ;
Packit b099d7
#endif
Packit b099d7
	      }
Packit b099d7
	    }
Packit b099d7
      }
Packit b099d7
    xmDisplay->display.numModals -= numRemoves ;
Packit b099d7
Packit b099d7
#ifdef DEBUG_GRABS
Packit b099d7
    printf( "\n**** Leaving RemoveGrab on %s (0x%x) ****\n", 
Packit b099d7
	    shell->core.name, ve) ;
Packit b099d7
    PrintXmGrabs( (Widget) shell) ;
Packit b099d7
#endif
Packit b099d7
}
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void 
Packit b099d7
RemoveGrabCallback(
Packit b099d7
	Widget w,
Packit b099d7
	XtPointer client_data,
Packit b099d7
	XtPointer call_data )
Packit b099d7
{
Packit b099d7
  if(    XmIsVendorShell( w)    )
Packit b099d7
    {   
Packit b099d7
      /* For VendorShells, defer the removal of the grab until after
Packit b099d7
       *   all destroy callbacks are completed, since the order of
Packit b099d7
       *   these callbacks can result in a situation where an
Packit b099d7
       *   Xt-invoked grab removal can strip "new" grabs which are
Packit b099d7
       *   installed in the RemoveGrab routine.
Packit b099d7
       */
Packit b099d7
      AddDLEntry( (XmVendorShellExtObject) client_data, w) ;
Packit b099d7
    } 
Packit b099d7
  else
Packit b099d7
    {   
Packit b099d7
      /* Nested calls to _XmAddGrab of non-VendorShell widgets
Packit b099d7
       *   are problematic, since the use of the Destroy method
Packit b099d7
       *   to ensure that the XtRemoveGrabs are completed before
Packit b099d7
       *   the Xm RemoveGrabs, cannot be employed for these widgets.
Packit b099d7
       */
Packit b099d7
      RemoveGrab( (XmVendorShellExtObject) client_data, TRUE, w) ;
Packit b099d7
    } 
Packit b099d7
}
Packit b099d7
Packit b099d7
static void 
Packit b099d7
AddToGrabList(
Packit b099d7
        Widget  parent,
Packit b099d7
        Widget  excludedKid,
Packit b099d7
        Widget  origKid )
Packit b099d7
{
Packit b099d7
    Widget		*currKid;
Packit b099d7
    Widget		*children;
Packit b099d7
    Cardinal		numChildren;
Packit b099d7
    Cardinal		i;
Packit b099d7
Packit b099d7
    if (!parent)
Packit b099d7
      return;
Packit b099d7
    else if (XmIsScreen(parent)) {
Packit b099d7
	XmScreen	xmScreen = (XmScreen)parent;
Packit b099d7
	children = xmScreen->desktop.children;
Packit b099d7
	numChildren = xmScreen->desktop.num_children;
Packit b099d7
    }
Packit b099d7
    else if (XmIsDisplay(parent)) {
Packit b099d7
	XmDisplay	xmDisplay = (XmDisplay)parent;
Packit b099d7
	children = (Widget *)xmDisplay->composite.children;
Packit b099d7
	numChildren = xmDisplay->composite.num_children;
Packit b099d7
    }
Packit b099d7
    else {
Packit b099d7
	XmDesktopObject	deskObj = (XmDesktopObject)parent;
Packit b099d7
	children = (Widget *)deskObj->desktop.children;
Packit b099d7
	numChildren = deskObj->desktop.num_children;
Packit b099d7
    }
Packit b099d7
    for (i = 0, currKid = children; i < numChildren; currKid++, i++) {	 
Packit b099d7
	  if (*currKid != excludedKid) {
Packit b099d7
	      if (!XmIsDisplay(parent)) {
Packit b099d7
		  ShellWidget shell;
Packit b099d7
		  shell = (ShellWidget)
Packit b099d7
		    ((XmDesktopObject)(*currKid))->ext.logicalParent;
Packit b099d7
Packit b099d7
		  if(    shell->shell.popped_up
Packit b099d7
                     || (    XtIsRealized((Widget)shell)
Packit b099d7
                          && !IsPopupShell( (Widget) shell))    )
Packit b099d7
		    AddGrab((XmVendorShellExtObject)*currKid, NULL,
Packit b099d7
			   (Boolean)False, (Boolean)False,
Packit b099d7
			   (XmVendorShellExtObject)origKid);
Packit b099d7
	      }
Packit b099d7
	      else if (!XmIsScreen(*currKid))
Packit b099d7
		  /*
Packit b099d7
		   * Don't traverse down non-Screen children of 
Packit b099d7
		   * XmDisplay widgets.
Packit b099d7
		   */
Packit b099d7
		  continue;
Packit b099d7
Packit b099d7
	      AddToGrabList(*currKid, NULL, origKid);
Packit b099d7
	  }
Packit b099d7
      }
Packit b099d7
}
Packit b099d7
Packit b099d7
static void 
Packit b099d7
AddCousinsToGrabList(
Packit b099d7
        Widget parent,
Packit b099d7
        Widget excludedKid,
Packit b099d7
        Widget origKid )
Packit b099d7
{
Packit b099d7
    
Packit b099d7
    Widget	grandParent;
Packit b099d7
    
Packit b099d7
    if (!parent)
Packit b099d7
      return;
Packit b099d7
    else if (XmIsScreen(parent)) {
Packit b099d7
	XmScreen	xmScreen = (XmScreen)parent;
Packit b099d7
	grandParent = XtParent(xmScreen);
Packit b099d7
    }
Packit b099d7
    else if (XmIsDisplay(parent)) {
Packit b099d7
	grandParent = NULL;
Packit b099d7
    }
Packit b099d7
    else {
Packit b099d7
	XmDesktopObject	deskObj = (XmDesktopObject)parent;
Packit b099d7
	grandParent = deskObj->desktop.parent;
Packit b099d7
    }
Packit b099d7
    AddToGrabList(parent, excludedKid, origKid);
Packit b099d7
    AddCousinsToGrabList(grandParent, parent, origKid);
Packit b099d7
}
Packit b099d7
Packit b099d7
static Boolean
Packit b099d7
IsPopupShell(
Packit b099d7
        Widget shell)
Packit b099d7
{   
Packit b099d7
  Widget parent = XtParent( shell) ;
Packit b099d7
Packit b099d7
  if(    parent != NULL    )
Packit b099d7
    {   
Packit b099d7
      Widget *ps_list = parent->core.popup_list ;
Packit b099d7
      unsigned n_psl = parent->core.num_popups ;
Packit b099d7
Packit b099d7
      while(    n_psl--    )
Packit b099d7
        {   
Packit b099d7
          if(    ps_list[n_psl] == shell    )
Packit b099d7
            {   
Packit b099d7
              return TRUE ;
Packit b099d7
            } 
Packit b099d7
        } 
Packit b099d7
    } 
Packit b099d7
  return FALSE ;
Packit b099d7
} 
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *     PopupCallback
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
PopupCallback(
Packit b099d7
        Widget shellParent,
Packit b099d7
        XtPointer closure,
Packit b099d7
        XtPointer callData )	/* unused */
Packit b099d7
{
Packit b099d7
    XmVendorShellExtObject	ve = (XmVendorShellExtObject)closure;
Packit b099d7
    XtGrabKind			grab_kind = XtGrabNone; 
Packit b099d7
    Boolean			grabCousins = False;
Packit b099d7
    XmScreen			xmScreen;
Packit b099d7
Packit b099d7
    xmScreen = (XmScreen) XmGetXmScreen(XtScreen(shellParent));
Packit b099d7
Packit b099d7
    ve->vendor.xAtMap = shellParent->core.x;
Packit b099d7
    ve->vendor.yAtMap = shellParent->core.y;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * work around broken Xt spec ordering for realize and popup callback
Packit b099d7
     */
Packit b099d7
    if (!XtIsRealized(shellParent))
Packit b099d7
      XtRealizeWidget(shellParent);
Packit b099d7
    
Packit b099d7
    /* 
Packit b099d7
     * get the request num + 1 Since it's a map raised. This will
Packit b099d7
     * only work when the hierarchy is already realized, i.e. after
Packit b099d7
     * first time
Packit b099d7
     */
Packit b099d7
    
Packit b099d7
    ve->vendor.lastMapRequest = NextRequest(XtDisplay(shellParent)) + 1;
Packit b099d7
    
Packit b099d7
Packit b099d7
    switch (ve->vendor.mwm_hints.input_mode)
Packit b099d7
      {
Packit b099d7
	case DONT_CARE:
Packit b099d7
	case MWM_INPUT_MODELESS:
Packit b099d7
          grab_kind = XtGrabNonexclusive;
Packit b099d7
          break ;
Packit b099d7
	case MWM_INPUT_PRIMARY_APPLICATION_MODAL:
Packit b099d7
	  /*
Packit b099d7
	   * if we're not running mwm then this becomes full app modal
Packit b099d7
	   */
Packit b099d7
	  if (xmScreen->screen.mwmPresent)
Packit b099d7
	    grabCousins = True;
Packit b099d7
	  grab_kind = XtGrabExclusive;
Packit b099d7
	  break;
Packit b099d7
	case MWM_INPUT_SYSTEM_MODAL:
Packit b099d7
	case MWM_INPUT_FULL_APPLICATION_MODAL:
Packit b099d7
	  grab_kind = XtGrabExclusive;
Packit b099d7
	  break;
Packit b099d7
	default:
Packit b099d7
	  break;
Packit b099d7
      }
Packit b099d7
Packit b099d7
    if (grab_kind == XtGrabExclusive)
Packit b099d7
    {
Packit b099d7
	Cardinal	numModals;
Packit b099d7
        XmModalData	modals;
Packit b099d7
        XmDisplay	xmDisplay;
Packit b099d7
	int		i;
Packit b099d7
Packit b099d7
        xmDisplay = (XmDisplay) XmGetXmDisplay(XtDisplay(shellParent));
Packit b099d7
        modals = xmDisplay->display.modals;
Packit b099d7
	numModals = xmDisplay->display.numModals;
Packit b099d7
        for (i=0; i
Packit b099d7
      	{
Packit b099d7
	   if (xmMenuShellWidgetClass == XtClass((Widget) modals[i].wid))
Packit b099d7
	     (*(((XmMenuShellClassRec *)xmMenuShellWidgetClass)->
Packit b099d7
		 menu_shell_class.popdownOne))(modals[i].wid, NULL, NULL, NULL);
Packit b099d7
	   else if (xmDragContextClass == XtClass((Widget) modals[i].wid))
Packit b099d7
	     XmDragCancel((Widget) modals[i].wid);
Packit b099d7
      	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (grab_kind != XtGrabNone)
Packit b099d7
      AddGrab(ve, NULL,
Packit b099d7
	      (grab_kind == XtGrabExclusive), 
Packit b099d7
	      False, 
Packit b099d7
	      ve);
Packit b099d7
Packit b099d7
    ve->vendor.grab_kind = grab_kind;
Packit b099d7
    
Packit b099d7
    if (grabCousins)
Packit b099d7
      AddCousinsToGrabList((Widget)ve->desktop.parent,  
Packit b099d7
			   (Widget)ve,
Packit b099d7
			   (Widget)ve);
Packit b099d7
#ifdef DEBUG_GRABS
Packit b099d7
    printf( "\n**** After popup: ****\n") ;
Packit b099d7
    PrintXmGrabs( shellParent) ;
Packit b099d7
#endif
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *     PopdownCallback
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
PopdownCallback(
Packit b099d7
        Widget shellParent,	/* unused */
Packit b099d7
        XtPointer closure,
Packit b099d7
        XtPointer callData )	/* unused */
Packit b099d7
{
Packit b099d7
    XmVendorShellExtObject	ve = (XmVendorShellExtObject)closure;
Packit b099d7
    
Packit b099d7
    if (ve->vendor.grab_kind != XtGrabNone)
Packit b099d7
      RemoveGrab(ve, False, NULL);
Packit b099d7
#ifdef DEBUG_GRABS
Packit b099d7
    printf( "\n**** After popdown: ****\n" ) ;
Packit b099d7
    PrintXmGrabs( shellParent) ;
Packit b099d7
#endif
Packit b099d7
}
Packit b099d7
Packit b099d7
static Widget 
Packit b099d7
GetNextShell(
Packit b099d7
        Widget vw )
Packit b099d7
{
Packit b099d7
    Widget 	parent;
Packit b099d7
    
Packit b099d7
    parent = XtParent(vw);
Packit b099d7
    while (parent && !XmIsVendorShell(parent))
Packit b099d7
      parent = XtParent(parent);
Packit b099d7
Packit b099d7
    return parent;
Packit b099d7
}
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static XmDesktopObject 
Packit b099d7
GetShellDesktopParent(
Packit b099d7
        VendorShellWidget vw,
Packit b099d7
        ArgList args,		/* unused */
Packit b099d7
        Cardinal *num_args )	/* unused */
Packit b099d7
{
Packit b099d7
	Widget			transientParent = NULL;
Packit b099d7
	XmDesktopObject		desktopParent = NULL;
Packit b099d7
Packit b099d7
Packit b099d7
	if (vw->wm.transient)
Packit b099d7
	{
Packit b099d7
		if (XtIsSubclass((Widget) vw, transientShellWidgetClass))
Packit b099d7
		{
Packit b099d7
			TransientShellWidget tw = (TransientShellWidget)vw;
Packit b099d7
Packit b099d7
			if (!(transientParent = tw->transient.transient_for))
Packit b099d7
			{
Packit b099d7
				tw->transient.transient_for =
Packit b099d7
					transientParent = GetNextShell( (Widget) vw);
Packit b099d7
			}
Packit b099d7
		}
Packit b099d7
		else
Packit b099d7
		{
Packit b099d7
			transientParent = GetNextShell((Widget) vw);
Packit b099d7
		}
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if (transientParent)
Packit b099d7
	{
Packit b099d7
		XmWidgetExtData	extData;
Packit b099d7
Packit b099d7
		if (XmIsVendorShell(transientParent))
Packit b099d7
		{
Packit b099d7
			extData = _XmGetWidgetExtData(transientParent, XmSHELL_EXTENSION);
Packit b099d7
            if(extData == NULL)
Packit b099d7
            {
Packit b099d7
#ifdef DEBUG
Packit b099d7
                XmeWarning(NULL, "_XmGetWidgetExtData() returned NULL pointer.");
Packit b099d7
#endif
Packit b099d7
                return desktopParent;
Packit b099d7
            }
Packit b099d7
            else
Packit b099d7
            {
Packit b099d7
    			desktopParent = (XmDesktopObject)extData->widget;
Packit b099d7
            }
Packit b099d7
		}
Packit b099d7
	}
Packit b099d7
	else if (!XmIsDisplay((Widget)vw))
Packit b099d7
	{
Packit b099d7
		desktopParent =
Packit b099d7
		    (XmDesktopObject) XmGetXmScreen(XtScreen((Widget)vw));
Packit b099d7
	}
Packit b099d7
	return desktopParent;
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *     DisplayClosedCallback
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
DisplayClosedCallback(
Packit b099d7
        Widget shellParent,	/* unused */
Packit b099d7
        XtPointer closure,
Packit b099d7
        XtPointer callData )	/* unused */
Packit b099d7
{
Packit b099d7
  _XmProcessLock();
Packit b099d7
  _XmDisplayHandle = NULL;
Packit b099d7
  _XmProcessUnlock();
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  SecondaryObjectCreate
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void 
Packit b099d7
SecondaryObjectCreate(
Packit b099d7
        Widget req,
Packit b099d7
        Widget new_w,
Packit b099d7
        ArgList args,
Packit b099d7
        Cardinal *num_args )
Packit b099d7
{
Packit b099d7
    XmBaseClassExt		*pePtr;
Packit b099d7
    WidgetClass			vec;
Packit b099d7
    XmDesktopObject		desktopParent;
Packit b099d7
    Cardinal                    size;
Packit b099d7
    XtPointer                   newSec, reqSec;
Packit b099d7
    XmWidgetExtData             extData;
Packit b099d7
Packit b099d7
    _XmProcessLock();
Packit b099d7
    if (!_XmDisplayHandle)
Packit b099d7
      {
Packit b099d7
	XmDisplay xmDisplay;
Packit b099d7
Packit b099d7
	if ((xmDisplay = (XmDisplay)XmGetXmDisplay(XtDisplay(new_w))) != NULL)
Packit b099d7
	  XtAddCallback((Widget)xmDisplay, XmNdestroyCallback,
Packit b099d7
			DisplayClosedCallback, NULL); 
Packit b099d7
      }
Packit b099d7
    _XmDisplayHandle = XtDisplay(new_w);
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
Packit b099d7
    desktopParent = GetShellDesktopParent( (VendorShellWidget) new_w,
Packit b099d7
                                                    args, num_args) ;
Packit b099d7
    if (desktopParent) {
Packit b099d7
	
Packit b099d7
	/*
Packit b099d7
	 * if the secondary object is using sub_resources then
Packit b099d7
	 * create it as a child of the shell. Otherwise try to
Packit b099d7
	 * create it as a sibling in order to fake out resource path
Packit b099d7
	 */
Packit b099d7
	_XmProcessLock();
Packit b099d7
	pePtr = _XmGetBaseClassExtPtr(XtClass(new_w), XmQmotif);
Packit b099d7
	vec = (*pePtr)->secondaryObjectClass;
Packit b099d7
Packit b099d7
    _XmProcessLock();
Packit b099d7
	size = vec->core_class.widget_size;
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
Packit b099d7
	newSec = XtMalloc(size);
Packit b099d7
	reqSec = _XmExtObjAlloc(size);
Packit b099d7
	_XmProcessUnlock();
Packit b099d7
Packit b099d7
	extData = (XmWidgetExtData) XtCalloc(1, sizeof(XmWidgetExtDataRec));
Packit b099d7
	extData->widget = (Widget)newSec;
Packit b099d7
	extData->reqWidget = (Widget)reqSec;
Packit b099d7
Packit b099d7
	((XmVendorShellExtObject)newSec)->ext.extensionType = 
Packit b099d7
	    XmSHELL_EXTENSION;
Packit b099d7
	((XmVendorShellExtObject)newSec)->ext.logicalParent = new_w;
Packit b099d7
	((XmVendorShellExtObject)newSec)->desktop.parent = 
Packit b099d7
	    (Widget) desktopParent;
Packit b099d7
Packit b099d7
    _XmProcessLock();
Packit b099d7
	((XmVendorShellExtObject)newSec)->object.widget_class = vec; 
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
Packit b099d7
	((XmVendorShellExtObject)newSec)->object.parent = new_w;
Packit b099d7
Packit b099d7
	_XmPushWidgetExtData(new_w, extData,
Packit b099d7
                         ((XmVendorShellExtObject)newSec)->ext.extensionType);
Packit b099d7
Packit b099d7
	/*
Packit b099d7
	 * fetch the resources in superclass to subclass order
Packit b099d7
	 */
Packit b099d7
	_XmProcessLock();
Packit b099d7
	XtGetSubresources(new_w,
Packit b099d7
			  newSec,
Packit b099d7
			  NULL, NULL,
Packit b099d7
			  vec->core_class.resources,
Packit b099d7
			  vec->core_class.num_resources,
Packit b099d7
			  args, *num_args );
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
Packit b099d7
	memcpy(reqSec, newSec, size);
Packit b099d7
   
Packit b099d7
	_XmExtImportArgs((Widget)newSec, args, num_args); 
Packit b099d7
Packit b099d7
	{
Packit b099d7
	   XtInitProc initialize;
Packit b099d7
	   _XmProcessLock();
Packit b099d7
	   initialize = xmDesktopClass->core_class.initialize;
Packit b099d7
	   _XmProcessUnlock();
Packit b099d7
	   (*initialize)((Widget)reqSec, (Widget)newSec, args, num_args);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  InitializePrehook
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void 
Packit b099d7
InitializePrehook(
Packit b099d7
        Widget req,
Packit b099d7
        Widget new_w,
Packit b099d7
        ArgList args,
Packit b099d7
        Cardinal *num_args )
Packit b099d7
{
Packit b099d7
    XmBaseClassExt		*cePtr;
Packit b099d7
    XtInitProc         		secondaryCreate;
Packit b099d7
    XmToolTipConfigTrait        ttp;           /* ToolTip pointer */
Packit b099d7
    XmToolTipConfigTraitRec     base;
Packit b099d7
Packit b099d7
    ttp = (XmToolTipConfigTrait) XmeTraitGet (new_w, XmQTtoolTipConfig);
Packit b099d7
Packit b099d7
    if (ttp == NULL)
Packit b099d7
    {
Packit b099d7
        ttp = (XmToolTipConfigTrait) XtMalloc (sizeof (XmToolTipConfigTraitRec));
Packit b099d7
Packit b099d7
        ttp->post_delay = 5000;
Packit b099d7
        ttp->post_duration = 5000;
Packit b099d7
        ttp->enable = False;
Packit b099d7
        ttp->timer = (int) NULL;
Packit b099d7
        ttp->duration_timer = (int) NULL;
Packit b099d7
        ttp->leave_time = 0;
Packit b099d7
        ttp->slider = ttp->label = NULL;
Packit b099d7
 
Packit b099d7
        XtGetSubresources(new_w, &base, NULL, NULL,
Packit b099d7
 		subresources, XtNumber(subresources),
Packit b099d7
 		args, *num_args);
Packit b099d7
 
Packit b099d7
        ttp->post_delay = base.post_delay;
Packit b099d7
        ttp->post_duration = base.post_duration;
Packit b099d7
        ttp->enable = base.enable;
Packit b099d7
 
Packit b099d7
        XmeTraitSet ((XtPointer) new_w, XmQTtoolTipConfig, (XtPointer) ttp);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    cePtr = _XmGetBaseClassExtPtr(XtClass(new_w), XmQmotif);
Packit b099d7
Packit b099d7
    if ((secondaryCreate = (*cePtr)->secondaryObjectCreate) != NULL)
Packit b099d7
	(*secondaryCreate)(req, new_w, args, num_args);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *     VendorExtInitialize
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
VendorExtInitialize(
Packit b099d7
        Widget req,
Packit b099d7
        Widget new_w,
Packit b099d7
        ArgList args,		/* unused */
Packit b099d7
        Cardinal *num_args )	/* unused */
Packit b099d7
{
Packit b099d7
    enum { XmA_MOTIF_WM_OFFSET, XmA_MOTIF_WM_MESSAGES,
Packit b099d7
	   XmAWM_DELETE_WINDOW, NUM_ATOMS };
Packit b099d7
    static char *atom_names[] = { _XA_MOTIF_WM_OFFSET, _XA_MOTIF_WM_MESSAGES,
Packit b099d7
	 XmIWM_DELETE_WINDOW };
Packit b099d7
Packit b099d7
    XmFontList                  defaultFont;
Packit b099d7
    XmVendorShellExtObject	ve;
Packit b099d7
    XmVendorShellExtObject	req_ve;
Packit b099d7
    XmVendorShellExtObjectClass	vec = (XmVendorShellExtObjectClass) XtClass(new_w);
Packit b099d7
    Atom			atoms[XtNumber(atom_names)];
Packit b099d7
    XtCallbackProc		delete_window_handler;
Packit b099d7
    Widget			extParent;
Packit b099d7
    XmShellExtObjectClass	sec = (XmShellExtObjectClass) XtClass(new_w);
Packit b099d7
    XtEventHandler		handler;
Packit b099d7
Packit b099d7
    ve  = (XmVendorShellExtObject) new_w;
Packit b099d7
    req_ve  = (XmVendorShellExtObject) req;
Packit b099d7
Packit b099d7
    ve->shell.lastConfigureRequest = 0;
Packit b099d7
	
Packit b099d7
    extParent = ve->ext.logicalParent;
Packit b099d7
Packit b099d7
    /* add the handler for tracking whether the hierarchy has focus */
Packit b099d7
Packit b099d7
    XtInsertEventHandler(extParent, 
Packit b099d7
			 (EventMask)FocusChangeMask | EnterWindowMask | LeaveWindowMask,
Packit b099d7
			 FALSE,
Packit b099d7
			 _XmTrackShellFocus, 
Packit b099d7
			 (XtPointer)new_w,
Packit b099d7
			 XtListHead);
Packit b099d7
Packit b099d7
    _XmProcessLock();
Packit b099d7
    handler = sec->shell_class.structureNotifyHandler;
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
Packit b099d7
    if (handler)
Packit b099d7
      {
Packit b099d7
	  XtInsertEventHandler(extParent, 
Packit b099d7
			       (EventMask) StructureNotifyMask,
Packit b099d7
			       TRUE, 
Packit b099d7
			       handler, 
Packit b099d7
			       (XtPointer)new_w,
Packit b099d7
			       XtListHead);
Packit b099d7
      }
Packit b099d7
#ifdef DEBUG
Packit b099d7
    else
Packit b099d7
      XtError("No structure notify handler for shell");
Packit b099d7
#endif /* DEBUG */
Packit b099d7
Packit b099d7
    ve->vendor.lastOffsetSerial =
Packit b099d7
      ve->vendor.lastMapRequest = 0;
Packit b099d7
Packit b099d7
    ve->vendor.xAtMap =
Packit b099d7
      ve->vendor.yAtMap =
Packit b099d7
	ve->vendor.xOffset =
Packit b099d7
	  ve->vendor.yOffset = 0;
Packit b099d7
Packit b099d7
    _XmAddCallback((InternalCallbackList *) &(ve->vendor.realize_callback),
Packit b099d7
		   VendorExtRealize, NULL);
Packit b099d7
Packit b099d7
    ve->vendor.externalReposition = False;
Packit b099d7
    extParent = ve->ext.logicalParent;
Packit b099d7
Packit b099d7
    ve->vendor.focus_data = (XmFocusData) _XmCreateFocusData();
Packit b099d7
Packit b099d7
    switch (ve->vendor.delete_response){
Packit b099d7
      case XmUNMAP:
Packit b099d7
      case XmDESTROY:
Packit b099d7
      case XmDO_NOTHING:
Packit b099d7
	break;
Packit b099d7
      default:
Packit b099d7
	XmeWarning(new_w, MSG1);
Packit b099d7
	ve->vendor.delete_response = XmDESTROY;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    XtAddCallback(extParent, XmNpopupCallback, PopupCallback,(XtPointer)new_w); 
Packit b099d7
    XtAddCallback(extParent, XmNpopdownCallback, PopdownCallback,(XtPointer)new_w); 
Packit b099d7
Packit b099d7
    assert(XtNumber(atom_names) == NUM_ATOMS);
Packit b099d7
    XInternAtoms(XtDisplay(extParent), atom_names,
Packit b099d7
		 XtNumber(atom_names), FALSE, atoms); 
Packit b099d7
Packit b099d7
    XmAddWMProtocols(extParent, &atoms[XmA_MOTIF_WM_MESSAGES], 1);
Packit b099d7
Packit b099d7
    XmAddProtocols(extParent,
Packit b099d7
		   atoms[XmA_MOTIF_WM_MESSAGES],
Packit b099d7
		   &atoms[XmA_MOTIF_WM_OFFSET], 1);
Packit b099d7
Packit b099d7
    _XmProcessLock();
Packit b099d7
    XmAddProtocolCallback( extParent,
Packit b099d7
			  atoms[XmA_MOTIF_WM_MESSAGES], 
Packit b099d7
			  atoms[XmA_MOTIF_WM_OFFSET],
Packit b099d7
			  vec->vendor_class.offset_handler,
Packit b099d7
			  (XtPointer) ve);
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
    /*
Packit b099d7
     * add deleteWindow stuff
Packit b099d7
     */
Packit b099d7
    XmAddWMProtocols(extParent, &atoms[XmAWM_DELETE_WINDOW], 1);
Packit b099d7
Packit b099d7
    /* add a post hook for delete response */
Packit b099d7
Packit b099d7
    _XmProcessLock();
Packit b099d7
    delete_window_handler = vec->vendor_class.delete_window_handler;
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
Packit b099d7
    XmSetWMProtocolHooks( extParent, 
Packit b099d7
			 atoms[XmAWM_DELETE_WINDOW], NULL, NULL, 
Packit b099d7
			 delete_window_handler, (XtPointer) ve);
Packit b099d7
Packit b099d7
Packit b099d7
    /* initialize the old_managed field for focus change tracking */
Packit b099d7
Packit b099d7
    ve->vendor.old_managed = NULL;
Packit b099d7
Packit b099d7
    /* initialize the mwm_hints flags */
Packit b099d7
    ve->vendor.mwm_hints.flags = 0;
Packit b099d7
    
Packit b099d7
    SetMwmStuff( NULL, (XmVendorShellExtObject) new_w);
Packit b099d7
Packit b099d7
    if ((ve->vendor.focus_policy != XmEXPLICIT) &&
Packit b099d7
	(ve->vendor.focus_policy != XmPOINTER))
Packit b099d7
      {
Packit b099d7
	  ve->vendor.focus_policy = XmEXPLICIT;
Packit b099d7
      }
Packit b099d7
    
Packit b099d7
    /* initialize input manager resources */
Packit b099d7
Packit b099d7
    ve->vendor.input_method_string = 
Packit b099d7
			XtNewString(req_ve->vendor.input_method_string);
Packit b099d7
    ve->vendor.preedit_type_string = 
Packit b099d7
			XtNewString(req_ve->vendor.preedit_type_string);
Packit b099d7
    defaultFont =  ve->vendor.button_font_list;
Packit b099d7
    if ( !defaultFont )
Packit b099d7
      {
Packit b099d7
	defaultFont =  ve->vendor.default_font_list; /* backward compatibility */
Packit b099d7
	if ( !defaultFont )
Packit b099d7
	  defaultFont = XmeGetDefaultRenderTable( (Widget) extParent, XmBUTTON_FONTLIST);
Packit b099d7
      }
Packit b099d7
     ve->vendor.button_font_list = XmFontListCopy (defaultFont);
Packit b099d7
    
Packit b099d7
     defaultFont =  ve->vendor.label_font_list;
Packit b099d7
     if ( !defaultFont )
Packit b099d7
       {      
Packit b099d7
	 defaultFont =  ve->vendor.default_font_list; /* backward compatibility */
Packit b099d7
	 if ( !defaultFont )
Packit b099d7
	   defaultFont = XmeGetDefaultRenderTable( (Widget) extParent, XmLABEL_FONTLIST);
Packit b099d7
     }
Packit b099d7
     ve->vendor.label_font_list = XmFontListCopy (defaultFont);
Packit b099d7
Packit b099d7
     defaultFont =  ve->vendor.text_font_list;
Packit b099d7
     if ( !defaultFont )
Packit b099d7
       {       
Packit b099d7
	 defaultFont =  ve->vendor.default_font_list; /* backward compatibility */
Packit b099d7
	 if ( !defaultFont )
Packit b099d7
	     defaultFont = XmeGetDefaultRenderTable( (Widget) extParent, XmTEXT_FONTLIST);
Packit b099d7
     }
Packit b099d7
    ve->vendor.text_font_list = XmFontListCopy (defaultFont);
Packit b099d7
    ve->vendor.im_height = 0;
Packit b099d7
    ve->vendor.im_vs_height_set = False;
Packit b099d7
    ve->vendor.im_info = NULL;
Packit b099d7
    ve->vendor.label = NULL;
Packit b099d7
    ve->vendor.slider = NULL; 
Packit b099d7
    ve->vendor.timer = (XtIntervalId)0;
Packit b099d7
    ve->vendor.duration_timer = (XtIntervalId)0;
Packit b099d7
    ve->vendor.leave_time = (Time)0;
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *  MotifWarningHandler
Packit b099d7
 *    Build up a warning message and print it
Packit b099d7
 *    Code which used to be directly in _XmWarning.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
static void 
Packit b099d7
MotifWarningHandler (String name,
Packit b099d7
		     String type, 
Packit b099d7
		     String s_class, 
Packit b099d7
		     String message,
Packit b099d7
		     String * params,
Packit b099d7
		     Cardinal* num_params)
Packit b099d7
{
Packit b099d7
   char buf[1024], buf2[1024], header[200], *bp, *newline_pos;
Packit b099d7
   int pos;
Packit b099d7
Packit b099d7
   if (!(params && num_params && (*num_params > 0) && 
Packit b099d7
	 (params[*num_params-1] == XME_WARNING)) &&
Packit b099d7
       previousWarningHandler) {
Packit b099d7
     
Packit b099d7
     /* We assume it is not coming from our XmeWarning function */
Packit b099d7
     /* call the previous Warning handler */
Packit b099d7
     (*previousWarningHandler) (name, type, s_class, message, 
Packit b099d7
				params, num_params); 
Packit b099d7
     return;
Packit b099d7
   }
Packit b099d7
Packit b099d7
   XtGetErrorDatabaseText(name, type, s_class, message, buf2, 1024);
Packit b099d7
   XtGetErrorDatabaseText("motif", "header", "Motif", 
Packit b099d7
			  _XmMMsgMotif_0000, header, 200);  
Packit b099d7
Packit b099d7
   sprintf(buf, header, name, s_class);
Packit b099d7
   if (num_params && *num_params > 1) {
Packit b099d7
     int i = *num_params-1;
Packit b099d7
     char *par[10];
Packit b099d7
     if (i > 10) i = 10;
Packit b099d7
     memcpy((char*)par, (char*)params, i * sizeof(String));
Packit b099d7
     bzero((char *)&par[i], (10-i) * sizeof(String));
Packit b099d7
     (void) sprintf(&buf[strlen(buf)], buf2, par[0], par[1], par[2], par[3],
Packit b099d7
		    par[4], par[5], par[6], par[7], par[8], par[9]);
Packit b099d7
   } else
Packit b099d7
     strcat(buf, buf2);
Packit b099d7
Packit b099d7
   pos = 0;
Packit b099d7
   bp = buf;
Packit b099d7
   do {
Packit b099d7
     newline_pos = strchr (bp, '\n');
Packit b099d7
     if (newline_pos == NULL) {
Packit b099d7
       strcpy (&buf2[pos], bp);
Packit b099d7
       pos += strlen (bp);
Packit b099d7
     } else {
Packit b099d7
       strncpy (&buf2[pos], bp, (int) (newline_pos - bp + 1));
Packit b099d7
       pos +=  (int) (newline_pos - bp + 1);
Packit b099d7
       bp  +=  (int) (newline_pos - bp + 1);
Packit b099d7
       strcpy (&buf2[pos], "    ");
Packit b099d7
       pos += 4;
Packit b099d7
     }
Packit b099d7
   } while (newline_pos != NULL);
Packit b099d7
   
Packit b099d7
   buf2[pos] = '\n'; buf2[++pos] = '\0';
Packit b099d7
Packit b099d7
   XtWarning(buf2);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  Initialize
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void 
Packit b099d7
Initialize(
Packit b099d7
	 Widget req,
Packit b099d7
	 Widget new_w,
Packit b099d7
	 ArgList args,
Packit b099d7
	 Cardinal *num_args )
Packit b099d7
{
Packit b099d7
    VendorShellWidget		vw = (VendorShellWidget)new_w;
Packit b099d7
    XmWidgetExtData		extData;
Packit b099d7
Packit b099d7
    if ((extData = _XmGetWidgetExtData((Widget)vw, XmSHELL_EXTENSION)) != NULL)
Packit b099d7
      {
Packit b099d7
	   VendorExtInitialize(extData->reqWidget,
Packit b099d7
			       extData->widget,
Packit b099d7
			       args,
Packit b099d7
			       num_args);
Packit b099d7
      }
Packit b099d7
Packit b099d7
    /* get reasonable defaults for visual, depth and colormap */
Packit b099d7
    _XmDefaultVisualResources(new_w);
Packit b099d7
Packit b099d7
    /* Keep count of the number of VendorShells. When it reaches zero
Packit b099d7
     * we will destroy the XmDisplay object in Destroy()
Packit b099d7
     */
Packit b099d7
    if (!XmIsDisplay(new_w)) {
Packit b099d7
	 XmDisplay xmDisplay = (XmDisplay) XmGetXmDisplay (XtDisplay(new_w));
Packit b099d7
Packit b099d7
	 xmDisplay->display.shellCount += 1;
Packit b099d7
Packit b099d7
#ifdef HAVE_LIBXMU
Packit b099d7
	XtAddEventHandler(new_w, (EventMask)0, True, (XtEventHandler)_XmEditResCheckMessages, NULL);
Packit b099d7
#endif
Packit b099d7
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /* install the Motif warning handler that works with XmeWarning */
Packit b099d7
    _XmProcessLock();
Packit b099d7
    if (!previousWarningHandler)
Packit b099d7
      previousWarningHandler = 
Packit b099d7
	XtAppSetWarningMsgHandler(XtWidgetToApplicationContext(new_w),
Packit b099d7
				  MotifWarningHandler);
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  InitializePosthook
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void 
Packit b099d7
InitializePosthook(
Packit b099d7
	 Widget req,
Packit b099d7
	 Widget new_w,
Packit b099d7
	 ArgList args,
Packit b099d7
	 Cardinal *num_args )
Packit b099d7
{
Packit b099d7
    XmWidgetExtData	ext;
Packit b099d7
Packit b099d7
    if ((ext = _XmGetWidgetExtData(new_w, XmSHELL_EXTENSION)) != NULL) {
Packit b099d7
	 _XmProcessLock();
Packit b099d7
	 _XmExtObjFree((XtPointer) ext->reqWidget);
Packit b099d7
	 ext->reqWidget = NULL;
Packit b099d7
	 _XmProcessUnlock();
Packit b099d7
	 /* extData gets freed at destroy */
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  SetValuesPrehook
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
/* ARGSUSED */
Packit b099d7
static Boolean 
Packit b099d7
SetValuesPrehook(
Packit b099d7
	 Widget old,
Packit b099d7
	 Widget ref,
Packit b099d7
	 Widget new_w,
Packit b099d7
	 ArgList args,
Packit b099d7
	 Cardinal *num_args )
Packit b099d7
{
Packit b099d7
    XmWidgetExtData	oldExtData, newExtData;
Packit b099d7
    XmBaseClassExt      *cePtr;
Packit b099d7
    WidgetClass         ec;
Packit b099d7
    Cardinal            extSize;
Packit b099d7
Packit b099d7
    cePtr = _XmGetBaseClassExtPtr(XtClass(new_w), XmQmotif);
Packit b099d7
    ec = (*cePtr)->secondaryObjectClass;
Packit b099d7
Packit b099d7
    _XmProcessLock();
Packit b099d7
    extSize = ec->core_class.widget_size;
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
Packit b099d7
    oldExtData = _XmGetWidgetExtData(new_w, XmSHELL_EXTENSION);
Packit b099d7
    newExtData = (XmWidgetExtData) XtCalloc(1, sizeof(XmWidgetExtDataRec));
Packit b099d7
Packit b099d7
    if (oldExtData && newExtData) {
Packit b099d7
	 _XmPushWidgetExtData(new_w, newExtData, XmSHELL_EXTENSION);
Packit b099d7
Packit b099d7
    newExtData->widget = oldExtData->widget;
Packit b099d7
Packit b099d7
    _XmProcessLock();
Packit b099d7
    newExtData->oldWidget = (Widget) _XmExtObjAlloc(extSize);
Packit b099d7
    memcpy((char *)newExtData->oldWidget, (char *)oldExtData->widget, extSize);
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
Packit b099d7
    _XmProcessLock();
Packit b099d7
    XtSetSubvalues(oldExtData->widget,
Packit b099d7
		    ec->core_class.resources,
Packit b099d7
		    ec->core_class.num_resources,
Packit b099d7
		    args, *num_args);
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
Packit b099d7
    _XmProcessLock();
Packit b099d7
    newExtData->reqWidget = (Widget) _XmExtObjAlloc(extSize);
Packit b099d7
    memcpy((char *)newExtData->reqWidget, (char *)oldExtData->widget, extSize);
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
Packit b099d7
    /*  Convert the necessary fields from unit values to pixel values  */
Packit b099d7
     _XmProcessLock();
Packit b099d7
     oldExtData->widget->core.widget_class = ec;
Packit b099d7
     _XmProcessUnlock();
Packit b099d7
    _XmExtImportArgs(oldExtData->widget, args, num_args);
Packit b099d7
Packit b099d7
    }
Packit b099d7
    return FALSE;
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  SetValues
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
/* ARGSUSED */
Packit b099d7
static Boolean 
Packit b099d7
VendorExtSetValues(
Packit b099d7
	 Widget old,
Packit b099d7
	 Widget ref,
Packit b099d7
	 Widget new_w,
Packit b099d7
	 ArgList args,
Packit b099d7
	 Cardinal *num_args )
Packit b099d7
{
Packit b099d7
  XmVendorShellExtPartPtr ove, nve;
Packit b099d7
  XmVendorShellExtObject  ov = (XmVendorShellExtObject) old;
Packit b099d7
  XmVendorShellExtObject  nv = (XmVendorShellExtObject) new_w;
Packit b099d7
  XmFontList		  defaultFont;
Packit b099d7
  
Packit b099d7
  ove = (XmVendorShellExtPartPtr) &(ov->vendor);
Packit b099d7
  nve = (XmVendorShellExtPartPtr) &(nv->vendor);
Packit b099d7
  
Packit b099d7
  switch (nve->delete_response)
Packit b099d7
    {
Packit b099d7
    case XmUNMAP:
Packit b099d7
    case XmDESTROY:
Packit b099d7
    case XmDO_NOTHING:
Packit b099d7
      break;
Packit b099d7
    default:
Packit b099d7
      XmeWarning(new_w, MSG1);
Packit b099d7
      nve->delete_response = XmDESTROY;
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if ((nve->focus_policy != XmEXPLICIT) &&
Packit b099d7
      (nve->focus_policy != XmPOINTER))
Packit b099d7
    {
Packit b099d7
      nve->focus_policy = ove->focus_policy;
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if (nve->focus_policy != ove->focus_policy)
Packit b099d7
    {
Packit b099d7
      _XmFocusModelChanged( nv->ext.logicalParent, NULL, 
Packit b099d7
			   (XtPointer)(unsigned long)nve->focus_policy );
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  SetMwmStuff(ov, nv);
Packit b099d7
  
Packit b099d7
  if (nve->input_method_string != ove->input_method_string)
Packit b099d7
    {
Packit b099d7
      XtFree(ove->input_method_string);
Packit b099d7
      nve->input_method_string = XtNewString(nve->input_method_string);
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if (nve->preedit_type_string != ove->preedit_type_string)
Packit b099d7
    {
Packit b099d7
      XtFree(ove->preedit_type_string);
Packit b099d7
      nve->preedit_type_string = XtNewString(nve->preedit_type_string);
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if (nve->button_font_list != ove->button_font_list)
Packit b099d7
    {
Packit b099d7
      XmFontListFree(ove->button_font_list);
Packit b099d7
      defaultFont = nve->button_font_list;
Packit b099d7
      if (!defaultFont)
Packit b099d7
	{
Packit b099d7
	  defaultFont = nve->default_font_list;
Packit b099d7
	  if (!defaultFont )
Packit b099d7
	    defaultFont = XmeGetDefaultRenderTable( (Widget) new_w,
Packit b099d7
						XmBUTTON_FONTLIST);
Packit b099d7
	}
Packit b099d7
      nve->button_font_list = XmFontListCopy (defaultFont);
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if (nve->label_font_list != ove->label_font_list)
Packit b099d7
    {
Packit b099d7
      XmFontListFree(ove->label_font_list);
Packit b099d7
      defaultFont = nve->label_font_list;
Packit b099d7
      if (!defaultFont)
Packit b099d7
	{
Packit b099d7
	  defaultFont = nve->default_font_list;
Packit b099d7
	  if (!defaultFont )
Packit b099d7
	    defaultFont = XmeGetDefaultRenderTable( (Widget) new_w,
Packit b099d7
						XmLABEL_FONTLIST);
Packit b099d7
	}
Packit b099d7
      nve->label_font_list = XmFontListCopy (defaultFont);
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if (nve->text_font_list != ove->text_font_list)
Packit b099d7
    {
Packit b099d7
      XmFontListFree(ove->text_font_list);
Packit b099d7
      defaultFont = nve->text_font_list;
Packit b099d7
      if (!defaultFont)
Packit b099d7
	{
Packit b099d7
	  defaultFont = nve->default_font_list;
Packit b099d7
	  if (!defaultFont )
Packit b099d7
	    defaultFont = XmeGetDefaultRenderTable( (Widget) new_w,
Packit b099d7
						XmTEXT_FONTLIST);
Packit b099d7
	}
Packit b099d7
      nve->text_font_list = XmFontListCopy (defaultFont);
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if (nve->input_policy != ove->input_policy)
Packit b099d7
    {
Packit b099d7
      switch (nve->input_policy)
Packit b099d7
	{
Packit b099d7
	case XmPER_SHELL:
Packit b099d7
	case XmPER_WIDGET:
Packit b099d7
	  break;
Packit b099d7
	default:
Packit b099d7
	  XmeWarning(new_w, MSG2);
Packit b099d7
	  nve->input_policy = ove->input_policy;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
    if (nve->layout_direction != ove->layout_direction)
Packit b099d7
      {
Packit b099d7
	XmeWarning(new_w, MSG3);
Packit b099d7
	nve->layout_direction = ove->layout_direction;
Packit b099d7
      }
Packit b099d7
Packit b099d7
  return FALSE;
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  SetValues
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
static Boolean 
Packit b099d7
SetValues(
Packit b099d7
	 Widget current,
Packit b099d7
	 Widget req,
Packit b099d7
	 Widget new_w,
Packit b099d7
	 ArgList args,
Packit b099d7
	 Cardinal *num_args )
Packit b099d7
{
Packit b099d7
Packit b099d7
    VendorShellWidget		vw = (VendorShellWidget)new_w;
Packit b099d7
    XmWidgetExtData		extData;
Packit b099d7
    XmVendorShellExtObject	vse;
Packit b099d7
    int i;
Packit b099d7
    XmToolTipConfigTrait ttp;
Packit b099d7
Packit b099d7
    ttp = (XmToolTipConfigTrait) XmeTraitGet (new_w, XmQTtoolTipConfig);
Packit b099d7
    if (ttp != NULL)
Packit b099d7
    {
Packit b099d7
        _XmProcessLock ();
Packit b099d7
        for (i = 0; i < *num_args; i++)
Packit b099d7
        {
Packit b099d7
            if (strcmp (args[i].name, XmNtoolTipPostDelay) == 0)
Packit b099d7
            {
Packit b099d7
                ttp->post_delay = args[i].value;
Packit b099d7
            }
Packit b099d7
            else if (strcmp (args[i].name, XmNtoolTipPostDuration) == 0)
Packit b099d7
            {
Packit b099d7
                ttp->post_duration = args[i].value;
Packit b099d7
            }
Packit b099d7
            else if (strcmp (args[i].name, XmNtoolTipEnable) == 0)
Packit b099d7
            {
Packit b099d7
                ttp->enable = (Boolean) args[i].value;
Packit b099d7
            }
Packit b099d7
        }
Packit b099d7
        _XmProcessUnlock ();
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if ((extData = _XmGetWidgetExtData( (Widget) vw, XmSHELL_EXTENSION)) &&
Packit b099d7
	 (vse = (XmVendorShellExtObject) extData->widget))
Packit b099d7
      {
Packit b099d7
	   VendorExtSetValues(extData->oldWidget,
Packit b099d7
			      extData->reqWidget,
Packit b099d7
			      extData->widget,
Packit b099d7
			      args,
Packit b099d7
			      num_args);
Packit b099d7
Packit b099d7
	     vse = (XmVendorShellExtObject) extData->widget;
Packit b099d7
	     if (req->core.height != current->core.height)
Packit b099d7
		 vse->vendor.im_vs_height_set = True;
Packit b099d7
Packit b099d7
      }
Packit b099d7
Packit b099d7
	 return(FALSE);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  SetValuesPosthook
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static Boolean 
Packit b099d7
SetValuesPosthook(
Packit b099d7
	 Widget current,	/* unused */
Packit b099d7
	 Widget req,		/* unused */
Packit b099d7
	 Widget new_w,
Packit b099d7
	 ArgList args,		/* unused */
Packit b099d7
	 Cardinal *num_args )	/* unused */
Packit b099d7
{
Packit b099d7
    XmWidgetExtData	ext;
Packit b099d7
Packit b099d7
    _XmPopWidgetExtData(new_w, &ext, XmSHELL_EXTENSION);
Packit b099d7
Packit b099d7
    if (ext) {
Packit b099d7
	 _XmProcessLock();
Packit b099d7
	 _XmExtObjFree( (XtPointer) ext->reqWidget);
Packit b099d7
	 _XmExtObjFree( (XtPointer) ext->oldWidget);
Packit b099d7
	 _XmProcessUnlock();
Packit b099d7
	 XtFree((char *) ext);
Packit b099d7
    }
Packit b099d7
	 return(FALSE);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  GetValuesPrehook
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
GetValuesPrehook(
Packit b099d7
	 Widget w,
Packit b099d7
	 ArgList args,		/* unused */
Packit b099d7
	 Cardinal *num_args )	/* unused */
Packit b099d7
{
Packit b099d7
    XmWidgetExtData	oldExtData, newExtData;
Packit b099d7
Packit b099d7
    if ((oldExtData = _XmGetWidgetExtData(w, XmSHELL_EXTENSION)) != NULL) {
Packit b099d7
	 newExtData = (XmWidgetExtData) XtCalloc(1, sizeof(XmWidgetExtDataRec));
Packit b099d7
	 newExtData->widget = oldExtData->widget;
Packit b099d7
	 _XmPushWidgetExtData(w, newExtData, XmSHELL_EXTENSION);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
static void 
Packit b099d7
GetValuesHook(
Packit b099d7
	 Widget w,
Packit b099d7
	 ArgList args,
Packit b099d7
	 Cardinal *num_args )
Packit b099d7
{
Packit b099d7
    XmWidgetExtData	ext;
Packit b099d7
    XmBaseClassExt      *cePtr;
Packit b099d7
    WidgetClass         ec;
Packit b099d7
    int i;
Packit b099d7
    int *ip;
Packit b099d7
    Boolean *bp;
Packit b099d7
    XmToolTipConfigTrait ttp;
Packit b099d7
Packit b099d7
    ttp = (XmToolTipConfigTrait) XmeTraitGet (w, XmQTtoolTipConfig);
Packit b099d7
Packit b099d7
    if (ttp != NULL)
Packit b099d7
    {
Packit b099d7
        _XmProcessLock ();
Packit b099d7
        for (i = 0; i < *num_args; i++)
Packit b099d7
        {
Packit b099d7
            if (strcmp (args[i].name, XmNtoolTipPostDelay) == 0)
Packit b099d7
            {
Packit b099d7
                ip = (int *) args[i].value;
Packit b099d7
                *ip = ttp->post_delay;
Packit b099d7
            }
Packit b099d7
            else if (strcmp (args[i].name, XmNtoolTipPostDuration) == 0)
Packit b099d7
            {
Packit b099d7
                ip = (int *) args[i].value;
Packit b099d7
                *ip = ttp->post_duration;
Packit b099d7
            }
Packit b099d7
            else if (strcmp (args[i].name, XmNtoolTipEnable) == 0)
Packit b099d7
            {
Packit b099d7
                bp = (Boolean *) args[i].value;
Packit b099d7
                *bp = ttp->enable;
Packit b099d7
            }
Packit b099d7
        }
Packit b099d7
        _XmProcessUnlock ();
Packit b099d7
    }
Packit b099d7
Packit b099d7
    cePtr = _XmGetBaseClassExtPtr(XtClass(w), XmQmotif);
Packit b099d7
    ec = (*cePtr)->secondaryObjectClass;
Packit b099d7
Packit b099d7
    if ((ext = _XmGetWidgetExtData(w, XmSHELL_EXTENSION)) != NULL)
Packit b099d7
    {
Packit b099d7
      _XmProcessLock();
Packit b099d7
      XtGetSubvalues(ext->widget,
Packit b099d7
		      ec->core_class.resources,
Packit b099d7
		      ec->core_class.num_resources,
Packit b099d7
		      args, *num_args);
Packit b099d7
      _XmProcessUnlock();
Packit b099d7
      _XmExtGetValuesHook( ext->widget, args, num_args );
Packit b099d7
    }
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
GetValuesPosthook(
Packit b099d7
	 Widget w,
Packit b099d7
	 ArgList args,		/* unused */
Packit b099d7
	 Cardinal *num_args )	/* unused */
Packit b099d7
{
Packit b099d7
    XmWidgetExtData	ext = NULL;
Packit b099d7
Packit b099d7
    _XmPopWidgetExtData(w, &ext, XmSHELL_EXTENSION);
Packit b099d7
    if (ext)
Packit b099d7
      XtFree((char *) ext);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * This handles the case where the secondary shells is waiting for the
Packit b099d7
 * primary to get mapped and is destroyed in the interim.
Packit b099d7
 */
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
PendingTransientDestroyed(
Packit b099d7
	 Widget vw,
Packit b099d7
	 XtPointer cl_data,
Packit b099d7
	 XtPointer ca_data )	/* unused */
Packit b099d7
{
Packit b099d7
	 XmExtObject ancestorExtObj = (XmExtObject) cl_data ;
Packit b099d7
	 Widget ancestor = ancestorExtObj->ext.logicalParent ;
Packit b099d7
Packit b099d7
    if(    !ancestor->core.being_destroyed    )
Packit b099d7
    {   
Packit b099d7
/*
Packit b099d7
	 XtRemoveCallback( (Widget) ancestorExtObj, XmNrealizeCallback, 
Packit b099d7
					      SetTransientFor, (XtPointer) vw) ;
Packit b099d7
*/
Packit b099d7
        _XmRemoveCallback((InternalCallbackList *) &(((XmVendorShellExtObject)ancestorExtObj)->vendor.realize_callback),
Packit b099d7
			  SetTransientFor, (XtPointer) vw) ;
Packit b099d7
	 } 
Packit b099d7
    return ;
Packit b099d7
    }
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Handle having the application shell realized after the secondary shells
Packit b099d7
 */
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
SetTransientFor(
Packit b099d7
	 Widget w,
Packit b099d7
	 XtPointer closure,
Packit b099d7
	 XtPointer call_data)	/* unused */
Packit b099d7
{   
Packit b099d7
	 VendorShellWidget vw = (VendorShellWidget) closure ;
Packit b099d7
	 Widget ancestor = ((XmExtObject) w)->ext.logicalParent ;
Packit b099d7
	 Arg args[2] ;
Packit b099d7
	 Cardinal i = 0 ;
Packit b099d7
Packit b099d7
    if(    !XtIsRealized( ancestor)    )
Packit b099d7
    {   
Packit b099d7
	 XtRealizeWidget( ancestor) ;
Packit b099d7
	 } 
Packit b099d7
    XtSetArg( args[i], XtNwindowGroup, XtWindow( ancestor)) ; i++ ;
Packit b099d7
Packit b099d7
    if(    XtIsTransientShell( (Widget) vw)    )
Packit b099d7
    {   
Packit b099d7
	 /* because Shell.c is broken force the code */
Packit b099d7
	 ((TransientShellWidget) vw)->transient.transient_for = NULL ;
Packit b099d7
Packit b099d7
	 XtSetArg( args[i], XtNtransientFor, ancestor) ; i++ ;
Packit b099d7
	 }
Packit b099d7
    XtSetValues( (Widget) vw, args, i) ;
Packit b099d7
/*
Packit b099d7
    XtRemoveCallback( w, XmNrealizeCallback, SetTransientFor, (XtPointer) vw) ;
Packit b099d7
*/
Packit b099d7
Packit b099d7
    _XmRemoveCallback((InternalCallbackList *) &(((XmVendorShellExtObject)w)->vendor.realize_callback),
Packit b099d7
			   SetTransientFor, (XtPointer) vw) ;
Packit b099d7
Packit b099d7
    XtRemoveCallback( (Widget) vw, XmNdestroyCallback, 
Packit b099d7
				     PendingTransientDestroyed, (XtPointer) w) ;
Packit b099d7
    return ;
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  Resize
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
static void 
Packit b099d7
Resize(
Packit b099d7
	 Widget w )
Packit b099d7
{
Packit b099d7
    register ShellWidget sw = (ShellWidget)w;    
Packit b099d7
    Widget childwid;
Packit b099d7
    int i;
Packit b099d7
    int y;
Packit b099d7
    XmVendorShellExtObject vendorExt;
Packit b099d7
    XmWidgetExtData	extData;
Packit b099d7
Packit b099d7
    extData = _XmGetWidgetExtData((Widget)sw, XmSHELL_EXTENSION);
Packit b099d7
if(extData == NULL)
Packit b099d7
{
Packit b099d7
#ifdef DEBUG
Packit b099d7
        XmeWarning(NULL, "_XmGetWidgetExtData() returned NULL pointer.");
Packit b099d7
#endif
Packit b099d7
}
Packit b099d7
    vendorExt = (XmVendorShellExtObject) extData->widget;
Packit b099d7
Packit b099d7
    _XmImResize((Widget)sw);
Packit b099d7
    y = sw->core.height - vendorExt->vendor.im_height;
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
	     XmeConfigureObject(childwid,
Packit b099d7
				childwid->core.x, childwid->core.y,
Packit b099d7
				sw->core.width, y,
Packit b099d7
				childwid->core.border_width);
Packit b099d7
	 }
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  ChangeManaged
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
static void 
Packit b099d7
ChangeManaged(
Packit b099d7
	 Widget wid )
Packit b099d7
{
Packit b099d7
    VendorShellWidget vw = (VendorShellWidget) wid ;
Packit b099d7
    WMShellWidgetClass	super = (WMShellWidgetClass)wmShellWidgetClass;
Packit b099d7
    Widget		firstManaged = NULL;
Packit b099d7
    Cardinal		i;
Packit b099d7
    XmVendorShellExtObject vendorExt;
Packit b099d7
    XmWidgetExtData	extData;
Packit b099d7
    XtWidgetProc 	change_managed;
Packit b099d7
Packit b099d7
    extData = _XmGetWidgetExtData((Widget)vw, XmSHELL_EXTENSION);
Packit b099d7
Packit b099d7
if(extData == NULL)
Packit b099d7
{
Packit b099d7
#ifdef DEBUG
Packit b099d7
        XmeWarning(NULL, "_XmGetWidgetExtData() returned NULL pointer.");
Packit b099d7
#endif
Packit b099d7
}
Packit b099d7
Packit b099d7
    vendorExt = (XmVendorShellExtObject) extData->widget;
Packit b099d7
Packit b099d7
    for (i= 0; i < vw->composite.num_children; i++)
Packit b099d7
      if (XtIsManaged(vw->composite.children[i]))
Packit b099d7
	 firstManaged = vw->composite.children[i];
Packit b099d7
Packit b099d7
    /* Danger! Danger! Ugly Code Warning! Since the shell's
Packit b099d7
     * change Managed routine in the intrinsics will always
Packit b099d7
     * configure the child to be the size of the parent, if
Packit b099d7
     * there is any im_height we must subtract it here and
Packit b099d7
     * add it back in after this call.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    vw->core.height -= vendorExt->vendor.im_height;
Packit b099d7
    _XmProcessLock();
Packit b099d7
    change_managed = super->composite_class.change_managed;
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
    (*change_managed) ((Widget) vw);
Packit b099d7
    vw->core.height += vendorExt->vendor.im_height;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * make sure that there is a reasonable initial focus path. This
Packit b099d7
     * is especially important for making sure the event handler is
Packit b099d7
     * there.
Packit b099d7
     */
Packit b099d7
    XtSetKeyboardFocus((Widget)vw, (Widget)firstManaged);
Packit b099d7
Packit b099d7
    XmeNavigChangeManaged((Widget)vw);
Packit b099d7
}
Packit b099d7
Packit b099d7
static void 
Packit b099d7
UpdateCoreGeometry(
Packit b099d7
	 VendorShellWidget vw,
Packit b099d7
	 XmVendorShellExtObject vendorExt )
Packit b099d7
{
Packit b099d7
	 /* ||| check if geometry was user specified and convert if it was */
Packit b099d7
	 if (vw->shell.geometry && vendorExt)
Packit b099d7
	 {
Packit b099d7
		 if (vendorExt->vendor.unit_type != XmPIXELS)
Packit b099d7
		 {
Packit b099d7
			 if (vw->wm.size_hints.flags & USPosition)
Packit b099d7
			 {
Packit b099d7
				 vw->core.x = (Position) XmCvtToHorizontalPixels(
Packit b099d7
					 vw->core.screen, (int) vw->core.x,
Packit b099d7
					 vendorExt->vendor.unit_type);
Packit b099d7
				 vw->core.y = (Position) XmCvtToVerticalPixels(
Packit b099d7
					 vw->core.screen, (int) vw->core.y,
Packit b099d7
					 vendorExt->vendor.unit_type);
Packit b099d7
			 }
Packit b099d7
			 if (vw->wm.size_hints.flags & USSize)
Packit b099d7
			 {
Packit b099d7
				 vw->core.width = (Dimension) XmCvtToHorizontalPixels(
Packit b099d7
					 vw->core.screen, (int) vw->core.width,
Packit b099d7
					 vendorExt->vendor.unit_type);
Packit b099d7
				 vw->core.height = (Dimension) XmCvtToVerticalPixels(
Packit b099d7
					 vw->core.screen, (int) vw->core.height,
Packit b099d7
					 vendorExt->vendor.unit_type);
Packit b099d7
			 }
Packit b099d7
		 }
Packit b099d7
	 }
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  Realize
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
static void 
Packit b099d7
Realize(
Packit b099d7
	 Widget wid,
Packit b099d7
	 XtValueMask *vmask,
Packit b099d7
	 XSetWindowAttributes *attr )
Packit b099d7
{
Packit b099d7
    VendorShellWidget vw = (VendorShellWidget) wid ;
Packit b099d7
    WMShellWidgetClass	super = (WMShellWidgetClass)wmShellWidgetClass;
Packit b099d7
    XmVendorShellExtObject vendorExt;
Packit b099d7
    XmWidgetExtData	extData;
Packit b099d7
Packit b099d7
    if ((extData = _XmGetWidgetExtData((Widget)vw, XmSHELL_EXTENSION)) != NULL)
Packit b099d7
      {
Packit b099d7
	 vendorExt = (XmVendorShellExtObject) extData->widget;
Packit b099d7
	 _XmImChangeManaged((Widget)vw);
Packit b099d7
      }
Packit b099d7
    else
Packit b099d7
      vendorExt = NULL;
Packit b099d7
Packit b099d7
    UpdateCoreGeometry(vw, vendorExt);
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Set nearest shell as transientFor so Mwm will be able to build tree.
Packit b099d7
     */
Packit b099d7
    if (vendorExt && XmIsShellExt(vendorExt->desktop.parent))
Packit b099d7
      {  
Packit b099d7
	   Widget ancestor = ((XmExtObject)(vendorExt->desktop.parent))
Packit b099d7
							   ->ext.logicalParent ;
Packit b099d7
	   /* try to have WMShell do the work */
Packit b099d7
	   if (XtIsRealized(ancestor))
Packit b099d7
	     vw->wm.wm_hints.window_group = XtWindow(ancestor);
Packit b099d7
	   else
Packit b099d7
	     {
Packit b099d7
	       XmWidgetExtData ancestorExtData = _XmGetWidgetExtData( ancestor,
Packit b099d7
							    XmSHELL_EXTENSION) ;
Packit b099d7
	       if(    ancestorExtData && ancestorExtData->widget    )
Packit b099d7
		 {   
Packit b099d7
		   _XmAddCallback((InternalCallbackList *) &(((XmVendorShellExtObject)ancestorExtData->widget)->vendor.realize_callback),
Packit b099d7
		    SetTransientFor,
Packit b099d7
		      (XtPointer) vw);
Packit b099d7
Packit b099d7
		   XtAddCallback( (Widget) vw, XmNdestroyCallback, 
Packit b099d7
					PendingTransientDestroyed,
Packit b099d7
					  (XtPointer) ancestorExtData->widget) ;
Packit b099d7
		 } 
Packit b099d7
	     }
Packit b099d7
      }
Packit b099d7
Packit b099d7
    /*	Make sure height and width are not zero, without warning, since
Packit b099d7
	 we change the internal behavior of BB and DA and we don't want
Packit b099d7
	 to change the external one.
Packit b099d7
    */
Packit b099d7
   if (!XtWidth(wid)) XtWidth(wid) = 1 ;
Packit b099d7
   if (!XtHeight(wid)) XtHeight(wid) = 1 ;
Packit b099d7
Packit b099d7
    /* Make my superclass do all the dirty work */
Packit b099d7
    {
Packit b099d7
	XtRealizeProc realize;
Packit b099d7
	_XmProcessLock();
Packit b099d7
	realize = super->core_class.realize;
Packit b099d7
	_XmProcessUnlock();
Packit b099d7
    	(*realize)((Widget) vw, vmask, attr);
Packit b099d7
    }
Packit b099d7
    if (vendorExt)
Packit b099d7
      _XmImRealize((Widget)vw);
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  GeometryManager
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static XtGeometryResult 
Packit b099d7
GeometryManager(
Packit b099d7
	 Widget wid,
Packit b099d7
	 XtWidgetGeometry *request,
Packit b099d7
	 XtWidgetGeometry *reply ) /* unused */
Packit b099d7
{
Packit b099d7
    ShellWidget 	shell = (ShellWidget)(wid->core.parent);
Packit b099d7
    XtWidgetGeometry 	my_request;
Packit b099d7
    XmVendorShellExtObject ve;
Packit b099d7
    XmWidgetExtData   extData;
Packit b099d7
    XtGeometryResult res ;
Packit b099d7
Packit b099d7
    if (!(extData = _XmGetWidgetExtData((Widget)shell,
Packit b099d7
					 XmSHELL_EXTENSION)))
Packit b099d7
      return XtGeometryNo;
Packit b099d7
Packit b099d7
    ve = (XmVendorShellExtObject) extData->widget;
Packit b099d7
Packit b099d7
    if(!(shell->shell.allow_shell_resize) && XtIsRealized(wid) &&
Packit b099d7
	(request->request_mode & (CWWidth | CWHeight | CWBorderWidth)))
Packit b099d7
      return(XtGeometryNo);
Packit b099d7
Packit b099d7
    my_request.request_mode = 0;
Packit b099d7
    /* %%% worry about XtCWQueryOnly */
Packit b099d7
    if (request->request_mode & XtCWQueryOnly)
Packit b099d7
      my_request.request_mode |= XtCWQueryOnly;
Packit b099d7
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 + ve->vendor.im_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
Packit b099d7
  if (request->request_mode & CWX) {
Packit b099d7
    my_request.x = request->x;
Packit b099d7
    my_request.request_mode |= CWX;
Packit b099d7
  }
Packit b099d7
  if (request->request_mode & CWY) {
Packit b099d7
    my_request.y = request->y;
Packit b099d7
    my_request.request_mode |= CWY;
Packit b099d7
  }
Packit b099d7
Packit b099d7
    res = XtMakeGeometryRequest((Widget)shell, &my_request, NULL) ;
Packit b099d7
Packit b099d7
    if (res == XtGeometryYes)
Packit b099d7
      {
Packit b099d7
	   _XmImResize((Widget)shell);
Packit b099d7
	   if (!(request->request_mode & XtCWQueryOnly))
Packit b099d7
	     {
Packit b099d7
		 if (request->request_mode & CWWidth)
Packit b099d7
			 wid->core.width = shell->core.width;
Packit b099d7
		 if (request->request_mode & CWHeight)
Packit b099d7
			 wid->core.height = shell->core.height -
Packit b099d7
						 ve->vendor.im_height;
Packit b099d7
		   if (request->request_mode & CWX) 
Packit b099d7
			       wid->core.x = 0;
Packit b099d7
		   if (request->request_mode & CWY) 
Packit b099d7
			       wid->core.y = 0;
Packit b099d7
	     }
Packit b099d7
	   return XtGeometryYes;
Packit b099d7
      } 
Packit b099d7
    else 
Packit b099d7
      return XtGeometryNo;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  RootGeometryManager
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static XtGeometryResult 
Packit b099d7
RootGeometryManager(
Packit b099d7
	 Widget w,
Packit b099d7
	 XtWidgetGeometry *request,
Packit b099d7
	 XtWidgetGeometry *reply )
Packit b099d7
{
Packit b099d7
    XtGeometryHandler	wmGeoHandler;
Packit b099d7
    ShellWidgetClass	swc = (ShellWidgetClass)wmShellWidgetClass;
Packit b099d7
    ShellClassExtensionRec **scExtPtr;
Packit b099d7
    XtGeometryResult	returnVal = XtGeometryNo;
Packit b099d7
    WMShellWidget	wmShell = (WMShellWidget)w;
Packit b099d7
    XmShellExtObject	se;
Packit b099d7
Packit b099d7
    XmWidgetExtData	extData = _XmGetWidgetExtData(w, XmSHELL_EXTENSION);
Packit b099d7
Packit b099d7
    if(extData == NULL)
Packit b099d7
    {
Packit b099d7
#ifdef DEBUG
Packit b099d7
        XmeWarning(NULL, "_XmGetWidgetExtData() returned NULL pointer.");
Packit b099d7
#endif
Packit b099d7
        return XtGeometryNo;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    se = (XmShellExtObject)extData->widget;
Packit b099d7
Packit b099d7
Packit b099d7
    if (se)
Packit b099d7
      {
Packit b099d7
	   se->shell.lastConfigureRequest = NextRequest(XtDisplay(w));
Packit b099d7
      }
Packit b099d7
#ifdef DEBUG
Packit b099d7
    else
Packit b099d7
      XtError("no extension object");
Packit b099d7
#endif /* DEBUG */
Packit b099d7
Packit b099d7
    _XmProcessLock();
Packit b099d7
    scExtPtr = (ShellClassExtensionRec **)
Packit b099d7
                    _XmGetClassExtensionPtr(
Packit b099d7
                        (XmGenericClassExt *) &(swc->shell_class.extension),
Packit b099d7
                        NULLQUARK);
Packit b099d7
    _XmProcessUnlock();    
Packit b099d7
Packit b099d7
    if (request->request_mode & XtCWQueryOnly)
Packit b099d7
      {
Packit b099d7
	   if (!(wmShell->shell.allow_shell_resize) &&
Packit b099d7
	       (request->request_mode & 
Packit b099d7
		(CWWidth | CWHeight | CWBorderWidth)))
Packit b099d7
	     return XtGeometryNo;
Packit b099d7
	   /*
Packit b099d7
	    * we should switch on useAsyncGeometry but we won't |||
Packit b099d7
	    */
Packit b099d7
	   else 
Packit b099d7
	     return XtGeometryYes;
Packit b099d7
      }
Packit b099d7
Packit b099d7
    if (se->shell.useAsyncGeometry)
Packit b099d7
      {
Packit b099d7
	   /* make wait_for_wm = FALSE to force desired behaviour */
Packit b099d7
	   wmShell->wm.wait_for_wm = FALSE;
Packit b099d7
	   /* FIX for 1684: remove the timeout = 0 line, not
Packit b099d7
	      needed and introduced a bug if not saved/restore together
Packit b099d7
	      with useAsync change - wait_for_wm will be later reset
Packit b099d7
	      by Shell in Xt */
Packit b099d7
      }
Packit b099d7
    _XmProcessLock();
Packit b099d7
    wmGeoHandler = (*scExtPtr)->root_geometry_manager;
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
    if (wmGeoHandler != NULL)
Packit b099d7
      {
Packit b099d7
	   returnVal =  (*wmGeoHandler)(w, request, reply);
Packit b099d7
	   if (se->shell.useAsyncGeometry) {
Packit b099d7
	       /* X configure was sent to the server, while this is happening,
Packit b099d7
		  let's everybody think it's a success (which is true
Packit b099d7
		  most of the time): set the shell size to what it wants
Packit b099d7
		  to be and return Yes */
Packit b099d7
	       if (request->request_mode & CWWidth)
Packit b099d7
		   w->core.width = request->width;
Packit b099d7
	       if (request->request_mode & CWHeight)
Packit b099d7
		   w->core.height = request->height ;
Packit b099d7
	       if (request->request_mode & CWBorderWidth)
Packit b099d7
		   w->core.border_width = request->border_width ;
Packit b099d7
	       if (request->request_mode & CWX) 
Packit b099d7
		   w->core.x = request->x;
Packit b099d7
	       if (request->request_mode & CWY) 
Packit b099d7
		   w->core.y = request->y;
Packit b099d7
Packit b099d7
	       returnVal = XtGeometryYes;
Packit b099d7
	   }
Packit b099d7
      }
Packit b099d7
    return returnVal;
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  SetMwmHints
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
static void 
Packit b099d7
SetMwmHints(
Packit b099d7
	 XmVendorShellExtObject ve )
Packit b099d7
{
Packit b099d7
    PropMwmHints	prop;
Packit b099d7
    Atom		mwm_hints_atom;
Packit b099d7
    Widget		shell = ve->ext.logicalParent;
Packit b099d7
Packit b099d7
    mwm_hints_atom = XInternAtom(XtDisplay(shell),
Packit b099d7
				   _XA_MWM_HINTS, 
Packit b099d7
				   FALSE);
Packit b099d7
Packit b099d7
#define SET(field) prop.field = ve->vendor.mwm_hints.field
Packit b099d7
    SET(flags);
Packit b099d7
    SET(functions);
Packit b099d7
    SET(decorations);
Packit b099d7
    prop.inputMode = ve->vendor.mwm_hints.input_mode;
Packit b099d7
    SET(status);
Packit b099d7
#undef SET
Packit b099d7
Packit b099d7
    XChangeProperty (XtDisplay(shell), 
Packit b099d7
		      XtWindow(shell),
Packit b099d7
		      mwm_hints_atom,mwm_hints_atom, 
Packit b099d7
		      32, PropModeReplace, 
Packit b099d7
		      (unsigned char *) &prop, PROP_MWM_HINTS_ELEMENTS);
Packit b099d7
}	
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  SetMwmMenu
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
static void 
Packit b099d7
SetMwmMenu(
Packit b099d7
	 XmVendorShellExtObject ve )
Packit b099d7
{
Packit b099d7
    Widget	  shell = ve->ext.logicalParent;
Packit b099d7
    Atom	  mwm_menu_atom;
Packit b099d7
    XTextProperty text_prop;
Packit b099d7
    int		  status;
Packit b099d7
Packit b099d7
Packit b099d7
    mwm_menu_atom = XInternAtom(XtDisplay(shell),
Packit b099d7
				_XA_MWM_MENU, 
Packit b099d7
				FALSE);
Packit b099d7
Packit b099d7
    text_prop.value = NULL;
Packit b099d7
    status = XmbTextListToTextProperty(XtDisplay(shell),
Packit b099d7
				       &ve->vendor.mwm_menu, 1,
Packit b099d7
				       XStdICCTextStyle,
Packit b099d7
				       &text_prop);
Packit b099d7
Packit b099d7
    if (status == Success || status > 0)
Packit b099d7
      {
Packit b099d7
	XSetTextProperty(XtDisplay(shell), XtWindow(shell),
Packit b099d7
			 &text_prop, mwm_menu_atom);
Packit b099d7
Packit b099d7
	if (text_prop.value != NULL) XFree((char*)text_prop.value);
Packit b099d7
      }
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
VendorExtRealize(
Packit b099d7
	 Widget w,
Packit b099d7
	 XtPointer closure,	/* unused */
Packit b099d7
	 XtPointer call_data )	/* unused */
Packit b099d7
{
Packit b099d7
    XmVendorShellExtObject	ve = (XmVendorShellExtObject)w;
Packit b099d7
    VendorShellWidget		vw;
Packit b099d7
Packit b099d7
    vw = (VendorShellWidget)ve->ext.logicalParent;
Packit b099d7
    if (ve->vendor.mwm_hints.flags)
Packit b099d7
      SetMwmHints(ve);
Packit b099d7
Packit b099d7
    if (ve->vendor.mwm_menu)
Packit b099d7
      SetMwmMenu(ve);
Packit b099d7
Packit b099d7
    _XmInstallProtocols(ve->ext.logicalParent);
Packit b099d7
Packit b099d7
    if(    !IsPopupShell( (Widget) vw)    )
Packit b099d7
      {   
Packit b099d7
	 /* Non-popup shells are allowed input as soon as
Packit b099d7
	  * they are realized, since they don't use XtPopup.
Packit b099d7
	  */
Packit b099d7
	 AddGrab(ve, NULL, FALSE, FALSE, ve);
Packit b099d7
      } 
Packit b099d7
}
Packit b099d7
Packit b099d7
static void
Packit b099d7
AddDLEntry(
Packit b099d7
	 XmVendorShellExtObject ve,
Packit b099d7
	 Widget shell)
Packit b099d7
{
Packit b099d7
  unsigned short i = 0 ;
Packit b099d7
Packit b099d7
  _XmProcessLock();
Packit b099d7
  while(    i < destroy_list_cnt    )
Packit b099d7
    {
Packit b099d7
      if(    destroy_list[i].shell == shell    )
Packit b099d7
	 {   
Packit b099d7
	   /* Already on list; once is enough.
Packit b099d7
	   */
Packit b099d7
	   _XmProcessUnlock();
Packit b099d7
	   return ;
Packit b099d7
	 } 
Packit b099d7
      ++i ;
Packit b099d7
    } 
Packit b099d7
  if(    destroy_list_cnt == destroy_list_size    )
Packit b099d7
    {
Packit b099d7
      destroy_list_size += 2 ;
Packit b099d7
      destroy_list = (XmDestroyGrabList) XtRealloc( (char *) destroy_list,
Packit b099d7
				destroy_list_size * sizeof( XmDestroyGrabRec)) ;
Packit b099d7
    } 
Packit b099d7
  destroy_list[i].shell = shell ;
Packit b099d7
  destroy_list[i].ve = ve ;
Packit b099d7
  ++destroy_list_cnt ;
Packit b099d7
  _XmProcessUnlock();
Packit b099d7
} 
Packit b099d7
Packit b099d7
static void
Packit b099d7
RemoveDLEntry(
Packit b099d7
	 unsigned pos)
Packit b099d7
{
Packit b099d7
  _XmProcessLock();
Packit b099d7
  while(    ++pos < destroy_list_cnt    )
Packit b099d7
    {
Packit b099d7
      destroy_list[pos-1].shell = destroy_list[pos].shell ;
Packit b099d7
      destroy_list[pos-1].ve = destroy_list[pos].ve ;
Packit b099d7
    }
Packit b099d7
  --destroy_list_cnt ;
Packit b099d7
  _XmProcessUnlock();
Packit b099d7
} 
Packit b099d7
Packit b099d7
static void 
Packit b099d7
Destroy(
Packit b099d7
	 Widget wid)
Packit b099d7
{
Packit b099d7
  XmWidgetExtData ext;
Packit b099d7
  XmVendorShellExtObject ve;
Packit b099d7
  unsigned short n = 0 ;
Packit b099d7
Packit b099d7
  _XmProcessLock();
Packit b099d7
  while(    n < destroy_list_cnt    )
Packit b099d7
  {
Packit b099d7
    if(    destroy_list[n].shell == wid    )
Packit b099d7
      { 
Packit b099d7
	 RemoveGrab( destroy_list[n].ve, TRUE, destroy_list[n].shell) ;
Packit b099d7
	 RemoveDLEntry( n) ;
Packit b099d7
	 break ;
Packit b099d7
      } 
Packit b099d7
    ++n ;
Packit b099d7
  } 
Packit b099d7
  _XmProcessUnlock();
Packit b099d7
Packit b099d7
    _XmPopWidgetExtData(wid, &ext, XmSHELL_EXTENSION);
Packit b099d7
    if (ext != NULL) {
Packit b099d7
	 if ((ve = (XmVendorShellExtObject) ext->widget) != NULL) {
Packit b099d7
	     if (ve->vendor.mwm_menu)
Packit b099d7
		 XtFree(ve->vendor.mwm_menu);
Packit b099d7
	     if (ve->vendor.input_method_string)
Packit b099d7
		 XtFree(ve->vendor.input_method_string);
Packit b099d7
	     if (ve->vendor.preedit_type_string)
Packit b099d7
		 XtFree(ve->vendor.preedit_type_string);
Packit b099d7
	     if (ve->vendor.button_font_list)
Packit b099d7
		 XmFontListFree(ve->vendor.button_font_list);
Packit b099d7
	     if (ve->vendor.label_font_list)
Packit b099d7
		 XmFontListFree(ve->vendor.label_font_list);
Packit b099d7
	     if (ve->vendor.text_font_list)
Packit b099d7
		 XmFontListFree(ve->vendor.text_font_list);
Packit b099d7
	     if (ve->vendor.im_info)
Packit b099d7
	         _XmImFreeShellData(wid, &ve->vendor.im_info);
Packit b099d7
Packit b099d7
	     _XmDestroyFocusData(ve->vendor.focus_data);
Packit b099d7
Packit b099d7
	     _XmRemoveAllCallbacks((InternalCallbackList *)
Packit b099d7
				 &(ve->vendor.realize_callback));
Packit b099d7
	     _XmRemoveAllCallbacks((InternalCallbackList *)
Packit b099d7
				 &(ve->vendor.focus_moved_callback));
Packit b099d7
Packit b099d7
         {
Packit b099d7
         XtWidgetProc destroy;
Packit b099d7
         _XmProcessLock();
Packit b099d7
         destroy = xmDesktopClass->core_class.destroy;
Packit b099d7
         _XmProcessUnlock();
Packit b099d7
	     (*destroy) ((Widget) ve);
Packit b099d7
         }
Packit b099d7
	     XtFree((char *) ve);
Packit b099d7
	 }
Packit b099d7
	 XtFree((char *) ext);
Packit b099d7
    }
Packit b099d7
Packit b099d7
#ifdef FIX_1388
Packit b099d7
    {
Packit b099d7
        XmToolTipConfigTrait        ttp;           /* ToolTip pointer */
Packit b099d7
Packit b099d7
        if ((ttp = XmeTraitGet((XtPointer) wid, XmQTtoolTipConfig)) != NULL)
Packit b099d7
        {
Packit b099d7
            XmeTraitSet((XtPointer) wid, XmQTtoolTipConfig, (XtPointer) NULL);
Packit b099d7
            XtFree((char *)ttp);
Packit b099d7
        }
Packit b099d7
    }
Packit b099d7
#endif
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * If all VendorShells have been destroyed, destroy the XmDisplay object
Packit b099d7
     * in order to reset any per-display and per-screen data. This is
Packit b099d7
     * necessary, since the application may be about to call XtCloseDisplay.
Packit b099d7
     */
Packit b099d7
    if (!XmIsDisplay (wid)) {
Packit b099d7
	 XmDisplay xmDisplay = (XmDisplay) XmGetXmDisplay (XtDisplay(wid));
Packit b099d7
Packit b099d7
	 xmDisplay->display.shellCount -= 1;
Packit b099d7
	 if (xmDisplay->display.shellCount == 0) {
Packit b099d7
	     XmImCloseXIM (wid);
Packit b099d7
	     XtDestroyWidget ((Widget)xmDisplay);
Packit b099d7
	 }
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
Redisplay(
Packit b099d7
	 Widget wid,
Packit b099d7
	 XEvent *event,		/* unused */
Packit b099d7
	 Region region )	/* unused */
Packit b099d7
{
Packit b099d7
    _XmImRedisplay(wid);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/****************************************************************
Packit b099d7
 *
Packit b099d7
 * Trait method for specify render table 
Packit b099d7
 *
Packit b099d7
 **************************************************************/
Packit b099d7
static XmFontList 
Packit b099d7
GetTable(
Packit b099d7
	  Widget wid,
Packit b099d7
	  XtEnum type)
Packit b099d7
{
Packit b099d7
    XmWidgetExtData   extData;
Packit b099d7
    XmVendorShellExtObject ve;
Packit b099d7
    
Packit b099d7
    if ((extData = _XmGetWidgetExtData(wid, XmSHELL_EXTENSION)) &&
Packit b099d7
	(ve = (XmVendorShellExtObject) extData->widget))
Packit b099d7
	{
Packit b099d7
	    switch(type) {
Packit b099d7
	    case XmLABEL_RENDER_TABLE : return ve->vendor.label_font_list ;
Packit b099d7
	    case XmBUTTON_RENDER_TABLE : return ve->vendor.button_font_list ;
Packit b099d7
	    case XmTEXT_RENDER_TABLE : return ve->vendor.text_font_list ;
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
  
Packit b099d7
    return NULL ;
Packit b099d7
}
Packit b099d7
Packit b099d7
/****************************************************************
Packit b099d7
 *
Packit b099d7
 * Trait method for specify layout direction
Packit b099d7
 *
Packit b099d7
 **************************************************************/
Packit b099d7
static XmDirection 
Packit b099d7
GetDirection(Widget w)
Packit b099d7
{
Packit b099d7
  XmWidgetExtData extData;
Packit b099d7
  XmVendorShellExtObject vendorExt;
Packit b099d7
Packit b099d7
  extData = _XmGetWidgetExtData(w, XmSHELL_EXTENSION);
Packit b099d7
Packit b099d7
  if(extData == NULL)
Packit b099d7
  {
Packit b099d7
#ifdef DEBUG
Packit b099d7
    XmeWarning(NULL, "_XmGetWidgetExtData() returned NULL pointer.");
Packit b099d7
#endif
Packit b099d7
    return XmRIGHT_TO_LEFT;
Packit b099d7
  }
Packit b099d7
Packit b099d7
  vendorExt = (XmVendorShellExtObject) extData->widget;
Packit b099d7
  return vendorExt->vendor.layout_direction;
Packit b099d7
}
Packit b099d7
Packit b099d7
static unsigned char
Packit b099d7
GetUnitType(Widget w)
Packit b099d7
{
Packit b099d7
    XmWidgetExtData extData;
Packit b099d7
    XmVendorShellExtObject vendorExt;
Packit b099d7
Packit b099d7
    if ((extData = _XmGetWidgetExtData(w, XmSHELL_EXTENSION)) &&
Packit b099d7
	(vendorExt = (XmVendorShellExtObject) extData->widget))
Packit b099d7
	return vendorExt->vendor.unit_type ;
Packit b099d7
    else 
Packit b099d7
	/* cannot fetch unit type yet, the VendorShell is 
Packit b099d7
	   being created, so force pixel... */
Packit b099d7
	return XmPIXELS ;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
static void
Packit b099d7
GetColors(Widget w, 
Packit b099d7
	  XmAccessColorData color_data)
Packit b099d7
{
Packit b099d7
    /* cannot use XmGetColors to generate the other for
Packit b099d7
       it ends up in a loop since XmGetColors creates a XmScreen,
Packit b099d7
       which needs an XmDisplay, which is a VendorS. */
Packit b099d7
    
Packit b099d7
   color_data->valueMask = AccessForeground | AccessBackgroundPixel |
Packit b099d7
       AccessHighlightColor | AccessTopShadowColor | 
Packit b099d7
	   AccessBottomShadowColor ;
Packit b099d7
   color_data->background = w->core.background_pixel;
Packit b099d7
   color_data->foreground = BlackPixelOfScreen(XtScreen(w)) ;
Packit b099d7
   color_data->highlight_color = 
Packit b099d7
       color_data->top_shadow_color = 
Packit b099d7
	   color_data->bottom_shadow_color = XmUNSPECIFIED_PIXEL ;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  _XmGetDefaultDisplay
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
Display *
Packit b099d7
_XmGetDefaultDisplay(void)
Packit b099d7
{
Packit b099d7
    Display *theDisplay = NULL;
Packit b099d7
Packit b099d7
    _XmProcessLock();
Packit b099d7
    if (_XmDisplayHandle) 
Packit b099d7
	theDisplay =  _XmDisplayHandle ;
Packit b099d7
    else {
Packit b099d7
      XtWarning(MSG4);
Packit b099d7
    }
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
Packit b099d7
    return theDisplay;
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  _XmDefaultVisualResources
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
void 
Packit b099d7
_XmDefaultVisualResources(
Packit b099d7
        Widget widget )
Packit b099d7
{
Packit b099d7
   /* Default the Shell visual resources (visual, depth and colormap)
Packit b099d7
      from the nearest shell. See CR 5459 */
Packit b099d7
	
Packit b099d7
    ShellWidget next_shell, this_shell = (ShellWidget)widget;
Packit b099d7
Packit b099d7
    /* go find the next shell ancestor, which might be widget itself
Packit b099d7
       in the case of a root shell. Looking for the next widget with 
Packit b099d7
       a "visual" resource is too expensive, remember this is going to be done 
Packit b099d7
       99.999999% of the time */
Packit b099d7
    next_shell = (ShellWidget) this_shell;
Packit b099d7
    if (XtParent((Widget)next_shell)) 
Packit b099d7
	do {
Packit b099d7
	    next_shell = (ShellWidget) XtParent((Widget)next_shell);
Packit b099d7
	} while (!XtIsShell((Widget)next_shell));
Packit b099d7
Packit b099d7
    /* now default the 3 visual resources */
Packit b099d7
    if (this_shell->shell.visual == INVALID_VISUAL) {
Packit b099d7
	/* next_shell might be self, still invalid, but in this case, 
Packit b099d7
	 we know it is a root shell: take regular Xt default */
Packit b099d7
Packit b099d7
	if (this_shell == next_shell) {
Packit b099d7
	    this_shell->shell.visual = CopyFromParent ;
Packit b099d7
	    this_shell->core.depth = DefaultDepthOfScreen(XtScreen(widget));
Packit b099d7
	    this_shell->core.colormap = DefaultColormapOfScreen(XtScreen(widget));
Packit b099d7
	} else {
Packit b099d7
	    this_shell->shell.visual = next_shell->shell.visual;
Packit b099d7
	    this_shell->core.depth = next_shell->core.depth;
Packit b099d7
	    this_shell->core.colormap = next_shell->core.colormap;
Packit b099d7
	} 
Packit b099d7
    }
Packit b099d7
   
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
#ifdef DEBUG_GRABS
Packit b099d7
Packit b099d7
static void
Packit b099d7
PrintModal(
Packit b099d7
        XmModalData modal)
Packit b099d7
{   
Packit b099d7
  printf( "log_p: %s, grabber: %s, excl: %d, spring: %d, ve: 0x%x\n",
Packit b099d7
	  modal->wid->core.name,
Packit b099d7
	  (modal->grabber
Packit b099d7
	     ? modal->grabber->ext.logicalParent->core.name : "NULL"),
Packit b099d7
	  modal->exclusive,
Packit b099d7
          modal->springLoaded, 
Packit b099d7
	  modal->ve) ;
Packit b099d7
}
Packit b099d7
Packit b099d7
static void
Packit b099d7
PrintXmGrabs(
Packit b099d7
        Widget wid)
Packit b099d7
{   
Packit b099d7
  XmDisplay disp = (XmDisplay) XmGetXmDisplay( XtDisplay( wid));
Packit b099d7
  XmModalData modals = disp->display.modals ;
Packit b099d7
  Cardinal nmodals = disp->display.numModals ;
Packit b099d7
  Cardinal cnt = 0 ;    
Packit b099d7
Packit b099d7
  while(    cnt < nmodals    )
Packit b099d7
    {   
Packit b099d7
      PrintModal( &(modals[cnt])) ;
Packit b099d7
      ++cnt ;
Packit b099d7
    } 
Packit b099d7
}
Packit b099d7
Packit b099d7
#endif /* DEBUG_GRABS */