Blame lib/Xm/Display.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 REV_INFO
Packit b099d7
#ifndef lint
Packit b099d7
static char rcsid[] = "$TOG: Display.c /main/23 1997/06/18 17:36:59 samborn $"
Packit b099d7
#endif
Packit b099d7
#endif
Packit b099d7
/* (c) Copyright 1990, 1991, 1992 HEWLETT-PACKARD COMPANY */
Packit b099d7
Packit b099d7
#ifdef HAVE_CONFIG_H
Packit b099d7
#include <config.h>
Packit b099d7
#endif
Packit b099d7
Packit b099d7
Packit b099d7
#include <stdio.h>
Packit b099d7
Packit b099d7
#include <X11/Intrinsic.h>
Packit b099d7
#include <X11/extensions/shape.h>
Packit b099d7
Packit b099d7
#include <X11/Xatom.h>
Packit b099d7
#include <Xm/AtomMgr.h>
Packit b099d7
#include <Xm/DisplayP.h>
Packit b099d7
#include <Xm/DropTransP.h>
Packit b099d7
#include <Xm/ScreenP.h>
Packit b099d7
#include <Xm/TransltnsP.h>
Packit b099d7
#include "XmI.h"
Packit b099d7
#include "DisplayI.h"
Packit b099d7
#include "DragBSI.h"
Packit b099d7
#include "DragCI.h"
Packit b099d7
#include "DragICCI.h"
Packit b099d7
#include "MessagesI.h"
Packit b099d7
#include "VirtKeysI.h"
Packit b099d7
#include "ColorObjI.h"
Packit b099d7
  
Packit b099d7
#define MESSAGE1 _XmMMsgDisplay_0001
Packit b099d7
#define MESSAGE2 _XmMMsgDisplay_0002
Packit b099d7
#define MESSAGE3 _XmMMsgDisplay_0003
Packit b099d7
Packit b099d7
#define TheDisplay(dd) (XtDisplayOfObject((Widget)dd))
Packit b099d7
#define TheScreen(dd) (XtScreen((Widget)dd))
Packit b099d7
Packit b099d7
#define Offset(x) (XtOffsetOf( struct _XmDisplayRec, x))
Packit b099d7
Packit b099d7
#define CHECK_TIME(dc, time) \
Packit b099d7
  ((dc->drag.dragStartTime <= time) && \
Packit b099d7
   ((dc->drag.dragFinishTime == 0) || (time <= dc->drag.dragFinishTime)))
Packit b099d7
Packit b099d7
#define INVALID_PROTOCOL_VALUE 255
Packit b099d7
Packit b099d7
Packit b099d7
/********    Static Function Declarations    ********/
Packit b099d7
Packit b099d7
static void DisplayClassPartInitialize( 
Packit b099d7
                        WidgetClass wc) ;
Packit b099d7
static void DisplayClassInitialize( void ) ;
Packit b099d7
static void SetDragReceiverInfo( 
Packit b099d7
                        Widget w,
Packit b099d7
                        XtPointer client_data,
Packit b099d7
                        XEvent *event,
Packit b099d7
                        Boolean *dontSwallow) ;
Packit b099d7
static void TreeUpdateHandler( 
Packit b099d7
                        Widget w,
Packit b099d7
                        XtPointer client,
Packit b099d7
                        XtPointer call) ;
Packit b099d7
static void DisplayInitialize( 
Packit b099d7
                        Widget requested_widget,
Packit b099d7
                        Widget new_widget,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
Packit b099d7
static void DisplayInsertChild( 
Packit b099d7
                        Widget w) ;
Packit b099d7
static void DisplayDeleteChild( 
Packit b099d7
                        Widget w) ;
Packit b099d7
static void DisplayDestroy( 
Packit b099d7
                        Widget w) ;
Packit b099d7
static XmDragContext FindDC( 
Packit b099d7
                        XmDisplay xmDisplay,
Packit b099d7
                        Time time,
Packit b099d7
#if NeedWidePrototypes
Packit b099d7
                        int sourceIsExternal) ;
Packit b099d7
#else
Packit b099d7
                        Boolean sourceIsExternal) ;
Packit b099d7
#endif /* NeedWidePrototypes */
Packit b099d7
static int isMine( 
Packit b099d7
                        Display *dpy,
Packit b099d7
                        register XEvent *event,
Packit b099d7
                        char *arg) ;
Packit b099d7
static void ReceiverShellExternalSourceHandler( 
Packit b099d7
                        Widget w,
Packit b099d7
                        XtPointer client_data,
Packit b099d7
                        XEvent *event,
Packit b099d7
                        Boolean *dontSwallow) ;
Packit b099d7
static Widget GetDisplay( 
Packit b099d7
                        Display *display) ;
Packit b099d7
Packit b099d7
/********    End Static Function Declarations    ********/
Packit b099d7
Packit b099d7
externaldef(displaymsg) String	_Xm_MOTIF_DRAG_AND_DROP_MESSAGE = NULL;
Packit b099d7
Packit b099d7
static XContext	displayContext = 0;
Packit b099d7
static WidgetClass curDisplayClass = NULL;
Packit b099d7
Packit b099d7
static XtResource resources[] = {
Packit b099d7
    {
Packit b099d7
	XmNdropSiteManagerClass, XmCDropSiteManagerClass, XmRWidgetClass,
Packit b099d7
	sizeof(WidgetClass), Offset(display.dropSiteManagerClass), 
Packit b099d7
	XmRImmediate, (XtPointer)&xmDropSiteManagerClassRec,
Packit b099d7
    },
Packit b099d7
    {
Packit b099d7
	XmNdropTransferClass, XmCDropTransferClass, XmRWidgetClass,
Packit b099d7
	sizeof(WidgetClass), Offset(display.dropTransferClass), 
Packit b099d7
	XmRImmediate, (XtPointer)&xmDropTransferClassRec,
Packit b099d7
    },
Packit b099d7
    {
Packit b099d7
	XmNdragContextClass, XmCDragContextClass, XmRWidgetClass,	
Packit b099d7
	sizeof(WidgetClass), Offset(display.dragContextClass), 
Packit b099d7
	XmRImmediate, (XtPointer)&xmDragContextClassRec,
Packit b099d7
    },
Packit b099d7
    {
Packit b099d7
	XmNdragInitiatorProtocolStyle, XmCDragInitiatorProtocolStyle,
Packit b099d7
	XmRDragInitiatorProtocolStyle, sizeof(unsigned char), 
Packit b099d7
	Offset(display.dragInitiatorProtocolStyle), 
Packit b099d7
	XmRImmediate, (XtPointer)XmDRAG_PREFER_RECEIVER,
Packit b099d7
    },
Packit b099d7
    {
Packit b099d7
	XmNdragReceiverProtocolStyle, XmCDragReceiverProtocolStyle,
Packit b099d7
	XmRDragReceiverProtocolStyle, sizeof(unsigned char), 
Packit b099d7
	Offset(display.dragReceiverProtocolStyle), 
Packit b099d7
	XmRImmediate, (XtPointer) XmDRAG_PREFER_PREREGISTER,
Packit b099d7
    },
Packit b099d7
    {
Packit b099d7
	XmNdefaultVirtualBindings, XmCDefaultVirtualBindings,
Packit b099d7
	XmRString, sizeof(String),
Packit b099d7
	Offset(display.bindingsString),
Packit b099d7
	XmRImmediate, (XtPointer)NULL,
Packit b099d7
    },
Packit b099d7
    {
Packit b099d7
        XmNuserData, XmCUserData, XmRPointer, 
Packit b099d7
        sizeof(XtPointer), Offset(display.user_data),
Packit b099d7
        XmRImmediate, (XtPointer) NULL
Packit b099d7
    },
Packit b099d7
    {
Packit b099d7
        XmNmotifVersion, XmCMotifVersion, XmRInt, 
Packit b099d7
        sizeof(int), Offset(display.motif_version),
Packit b099d7
        XmRImmediate, (XtPointer) XmVersion
Packit b099d7
    },
Packit b099d7
    {
Packit b099d7
        XmNenableWarp, XmCEnableWarp, XmREnableWarp, 
Packit b099d7
        sizeof(XtEnum), Offset(display.enable_warp),
Packit b099d7
        XmRImmediate, (XtPointer) True
Packit b099d7
    },
Packit b099d7
Packit b099d7
    {
Packit b099d7
        XmNdragStartCallback, XmCCallback,
Packit b099d7
 	XmRCallback, sizeof(XtCallbackList),
Packit b099d7
 	Offset(display.dragStartCallback),
Packit b099d7
        XmRImmediate, (XtPointer)NULL,
Packit b099d7
    },
Packit b099d7
Packit b099d7
    {
Packit b099d7
        XmNnoFontCallback, XmCCallback,
Packit b099d7
 	XmRCallback, sizeof(XtCallbackList),
Packit b099d7
 	Offset(display.noFontCallback),
Packit b099d7
        XmRImmediate, (XtPointer)NULL,
Packit b099d7
    },
Packit b099d7
Packit b099d7
    {
Packit b099d7
        XmNnoRenditionCallback, XmCCallback,
Packit b099d7
 	XmRCallback, sizeof(XtCallbackList),
Packit b099d7
 	Offset(display.noRenditionCallback),
Packit b099d7
        XmRImmediate, (XtPointer)NULL,
Packit b099d7
    },
Packit b099d7
Packit b099d7
    {   
Packit b099d7
        XmNenableBtn1Transfer, XmCEnableBtn1Transfer,
Packit b099d7
        XmREnableBtn1Transfer, sizeof(XtEnum),
Packit b099d7
	Offset(display.enable_btn1_transfer),
Packit b099d7
	XmRImmediate, (XtPointer) XmOFF
Packit b099d7
    },
Packit b099d7
Packit b099d7
    {
Packit b099d7
        XmNenableButtonTab, XmCEnableButtonTab,
Packit b099d7
	XmRBoolean, sizeof(Boolean),
Packit b099d7
	Offset(display.enable_button_tab),
Packit b099d7
	XmRImmediate, (XtPointer) False
Packit b099d7
    },
Packit b099d7
Packit b099d7
    {
Packit b099d7
        XmNenableEtchedInMenu, XmCEnableEtchedInMenu,
Packit b099d7
	XmRBoolean, sizeof(Boolean),
Packit b099d7
	Offset(display.enable_etched_in_menu),
Packit b099d7
	XmRImmediate, (XtPointer) False
Packit b099d7
    },
Packit b099d7
Packit b099d7
    {
Packit b099d7
        XmNdefaultButtonEmphasis, XmCDefaultButtonEmphasis,
Packit b099d7
	XmRDefaultButtonEmphasis, sizeof(XtEnum),
Packit b099d7
	Offset(display.default_button_emphasis),
Packit b099d7
	XmRImmediate, (XtPointer) XmEXTERNAL_HIGHLIGHT
Packit b099d7
    },
Packit b099d7
Packit b099d7
    {
Packit b099d7
        XmNenableToggleColor, XmCEnableToggleColor,
Packit b099d7
	XmRBoolean, sizeof(Boolean),
Packit b099d7
	Offset(display.enable_toggle_color),
Packit b099d7
	XmRImmediate, (XtPointer) False
Packit b099d7
    },
Packit b099d7
Packit b099d7
    {
Packit b099d7
        XmNenableToggleVisual, XmCEnableToggleVisual,
Packit b099d7
	XmRBoolean, sizeof(Boolean),
Packit b099d7
	Offset(display.enable_toggle_visual),
Packit b099d7
	XmRImmediate, (XtPointer) False
Packit b099d7
    },
Packit b099d7
Packit b099d7
    {
Packit b099d7
        XmNenableDragIcon, XmCEnableDragIcon,
Packit b099d7
	XmRBoolean, sizeof(Boolean),
Packit b099d7
	Offset(display.enable_drag_icon),
Packit b099d7
	XmRImmediate, (XtPointer) False
Packit b099d7
    },
Packit b099d7
Packit b099d7
    {
Packit b099d7
        XmNenableUnselectableDrag, XmCEnableUnselectableDrag,
Packit b099d7
	XmRBoolean, sizeof(Boolean),
Packit b099d7
	Offset(display.enable_unselectable_drag),
Packit b099d7
	XmRImmediate, (XtPointer) True
Packit b099d7
    },
Packit b099d7
Packit b099d7
    {
Packit b099d7
        XmNenableThinThickness, XmCEnableThinThickness,
Packit b099d7
	XmRBoolean, sizeof(Boolean),
Packit b099d7
	Offset(display.enable_thin_thickness),
Packit b099d7
	XmRImmediate, (XtPointer) False
Packit b099d7
    },
Packit b099d7
Packit b099d7
    {
Packit b099d7
        XmNenableMultiKeyBindings, XmCEnableMultiKeyBindings, 
Packit b099d7
	XmRBoolean, sizeof(Boolean), 
Packit b099d7
	Offset(display.enable_multi_key_bindings),
Packit b099d7
        XmRImmediate, (XtPointer) False
Packit b099d7
    },
Packit b099d7
Packit b099d7
    /* Force this resource to avoid loop in the pixmap conversion.
Packit b099d7
       XmDisplay is a VendorShell, so when iconPixmap is set in 
Packit b099d7
       a resource file, the VendorShell converter is called, but 
Packit b099d7
       since it needs an XmDisplay (via an XmScreen resource), it
Packit b099d7
       goes and create the XmDisplay, for which the iconPixmap is
Packit b099d7
       also converted: loop. By forcing it to Bitmap, the screen
Packit b099d7
       bitmapConversionModel is not needed and it works. This is a 
Packit b099d7
       small limitation in XmDisplay */
Packit b099d7
    {   XmNiconPixmap, XmCIconPixmap, XmRBitmap,
Packit b099d7
	sizeof(Pixmap),
Packit b099d7
	XtOffsetOf(WMShellRec, wm.wm_hints.icon_pixmap), 
Packit b099d7
	XmRImmediate, NULL
Packit b099d7
    }, 
Packit b099d7
};
Packit b099d7
Packit b099d7
#undef Offset
Packit b099d7
Packit b099d7
static XmBaseClassExtRec baseClassExtRec = {
Packit b099d7
    NULL,
Packit b099d7
    NULLQUARK,
Packit b099d7
    XmBaseClassExtVersion,
Packit b099d7
    sizeof(XmBaseClassExtRec),
Packit b099d7
    (XtInitProc)NULL,			/* InitializePrehook	*/
Packit b099d7
    (XtSetValuesFunc)NULL,		/* SetValuesPrehook	*/
Packit b099d7
    (XtInitProc)NULL,			/* InitializePosthook	*/
Packit b099d7
    (XtSetValuesFunc)NULL,		/* SetValuesPosthook	*/
Packit b099d7
    NULL,				/* secondaryObjectClass	*/
Packit b099d7
    (XtInitProc)NULL,			/* secondaryCreate	*/
Packit b099d7
    (XmGetSecResDataFunc)NULL,        	/* getSecRes data	*/
Packit b099d7
    { 0 },     				/* fastSubclass flags	*/
Packit b099d7
    (XtArgsProc)NULL,			/* getValuesPrehook	*/
Packit b099d7
    (XtArgsProc)NULL,			/* getValuesPosthook	*/
Packit b099d7
    (XtWidgetClassProc)NULL,               /* classPartInitPrehook */
Packit b099d7
    (XtWidgetClassProc)NULL,               /* classPartInitPosthook*/
Packit b099d7
    NULL,               /* ext_resources        */
Packit b099d7
    NULL,               /* compiled_ext_resources*/
Packit b099d7
    0,                  /* num_ext_resources    */
Packit b099d7
    FALSE,              /* use_sub_resources    */
Packit b099d7
    (XmWidgetNavigableProc)NULL,               /* widgetNavigable      */
Packit b099d7
    (XmFocusChangeProc)NULL,               /* focusChange          */
Packit b099d7
    (XmWrapperData)NULL	/* wrapperData		*/
Packit b099d7
};
Packit b099d7
Packit b099d7
Packit b099d7
externaldef(xmdisplayclassrec)
Packit b099d7
XmDisplayClassRec xmDisplayClassRec = {
Packit b099d7
    {	
Packit b099d7
	(WidgetClass) &applicationShellClassRec,	/* superclass		*/   
Packit b099d7
	"XmDisplay",			/* class_name 		*/   
Packit b099d7
	sizeof(XmDisplayRec),	 	/* size 		*/   
Packit b099d7
	DisplayClassInitialize,		/* Class Initializer 	*/   
Packit b099d7
	DisplayClassPartInitialize,	/* class_part_init 	*/ 
Packit b099d7
	FALSE, 				/* Class init'ed ? 	*/   
Packit b099d7
	DisplayInitialize,		/* initialize         	*/   
Packit b099d7
 	_XmColorObjCreate,		/* initialize_notify    */ 
Packit b099d7
	XtInheritRealize,		/* 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
	FALSE, 				/* compress_exposure  	*/   
Packit b099d7
	FALSE, 				/* compress_enterleave	*/   
Packit b099d7
	FALSE, 				/* visible_interest   	*/   
Packit b099d7
	DisplayDestroy,			/* destroy            	*/   
Packit b099d7
	(XtWidgetProc)NULL, 		/* resize             	*/   
Packit b099d7
	(XtExposeProc)NULL, 		/* expose             	*/   
Packit b099d7
	(XtSetValuesFunc)NULL, 		/* set_values         	*/   
Packit b099d7
	(XtArgsFunc)NULL, 		/* set_values_hook      */ 
Packit b099d7
	(XtAlmostProc)NULL,	 	/* set_values_almost    */ 
Packit b099d7
	(XtArgsProc)NULL,		/* get_values_hook      */ 
Packit b099d7
	(XtAcceptFocusProc)NULL, 	/* accept_focus       	*/   
Packit b099d7
	XtVersion, 			/* intrinsics version 	*/   
Packit b099d7
	NULL, 				/* callback offsets   	*/   
Packit b099d7
	NULL,				/* tm_table           	*/   
Packit b099d7
	(XtGeometryHandler)NULL, 	/* query_geometry       */ 
Packit b099d7
	(XtStringProc)NULL, 		/* display_accelerator  */ 
Packit b099d7
	(XtPointer)&baseClassExtRec, 	/* extension            */ 
Packit b099d7
    },	
Packit b099d7
    { 					/* composite class record */
Packit b099d7
	(XtGeometryHandler)NULL,	/* geometry_manager 	*/
Packit b099d7
	(XtWidgetProc)NULL,		/* change_managed	*/
Packit b099d7
	DisplayInsertChild,		/* insert_child		*/
Packit b099d7
	DisplayDeleteChild, 		/* from the shell 	*/
Packit b099d7
	NULL, 				/* extension record     */
Packit b099d7
    },
Packit b099d7
    { 					/* shell class record 	*/
Packit b099d7
	NULL, 				/* extension record     */
Packit b099d7
    },
Packit b099d7
    { 					/* wm shell class record */
Packit b099d7
	NULL, 				/* extension record     */
Packit b099d7
    },
Packit b099d7
    { 					/* vendor shell class record */
Packit b099d7
	NULL,				/* extension record     */
Packit b099d7
    },
Packit b099d7
    { 					/* toplevelclass record */
Packit b099d7
	NULL, 				/* extension record     */
Packit b099d7
    },
Packit b099d7
    { 					/* appShell record 	*/
Packit b099d7
	NULL, 				/* extension record     */
Packit b099d7
    },
Packit b099d7
    {					/* Display class	*/
Packit b099d7
	GetDisplay,			/* GetDisplay		*/
Packit b099d7
	NULL,				/* extension		*/
Packit b099d7
    },
Packit b099d7
};
Packit b099d7
Packit b099d7
externaldef(xmdisplayclass) WidgetClass 
Packit b099d7
      xmDisplayClass = (WidgetClass) (&xmDisplayClassRec);
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
static void 
Packit b099d7
DisplayClassPartInitialize(
Packit b099d7
	WidgetClass wc )
Packit b099d7
{
Packit b099d7
	_XmFastSubclassInit(wc, XmDISPLAY_BIT);
Packit b099d7
}
Packit b099d7
Packit b099d7
static void 
Packit b099d7
DisplayClassInitialize( void )
Packit b099d7
{
Packit b099d7
	baseClassExtRec.record_type = XmQmotif;
Packit b099d7
    _Xm_MOTIF_DRAG_AND_DROP_MESSAGE =
Packit b099d7
		XmMakeCanonicalString("_MOTIF_DRAG_AND_DROP_MESSAGE");
Packit b099d7
}    
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
SetDragReceiverInfo(
Packit b099d7
        Widget w,
Packit b099d7
        XtPointer client_data,
Packit b099d7
        XEvent *event,
Packit b099d7
        Boolean *dontSwallow )
Packit b099d7
{
Packit b099d7
    XmDisplay	dd = (XmDisplay) XmGetXmDisplay(XtDisplay(w));
Packit b099d7
Packit b099d7
    if (XtIsRealized(w)) {
Packit b099d7
	_XmSetDragReceiverInfo(dd, (Widget)client_data);
Packit b099d7
	XtRemoveEventHandler(w, StructureNotifyMask, False,
Packit b099d7
			     SetDragReceiverInfo,
Packit b099d7
			     client_data);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * this routine is registered on the XmNtreeUpdateProc resource of the
Packit b099d7
 * dropSiteManager.  It is called whenever the tree is changed.
Packit b099d7
 */
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
TreeUpdateHandler(
Packit b099d7
        Widget w,
Packit b099d7
        XtPointer client,
Packit b099d7
        XtPointer call )
Packit b099d7
{
Packit b099d7
    XmAnyCallbackStruct	    	*anyCB = (XmAnyCallbackStruct *)call;
Packit b099d7
    XmDisplay	  	dd = (XmDisplay) XmGetXmDisplay(XtDisplay(w));
Packit b099d7
Packit b099d7
    if (dd->display.dragReceiverProtocolStyle == XmDRAG_NONE)
Packit b099d7
		return;
Packit b099d7
Packit b099d7
    switch(anyCB->reason) {
Packit b099d7
      case XmCR_DROP_SITE_TREE_ADD:
Packit b099d7
	{
Packit b099d7
	    XmDropSiteTreeAddCallback cb =
Packit b099d7
	      (XmDropSiteTreeAddCallback)anyCB;
Packit b099d7
Packit b099d7
	    if (XtIsRealized(cb->rootShell)) {
Packit b099d7
		_XmSetDragReceiverInfo(dd, cb->rootShell);
Packit b099d7
	    }
Packit b099d7
	    else {
Packit b099d7
		XtAddEventHandler(cb->rootShell, 
Packit b099d7
				  StructureNotifyMask, False,
Packit b099d7
				  SetDragReceiverInfo,
Packit b099d7
				  (XtPointer)cb->rootShell);
Packit b099d7
	    }
Packit b099d7
	    /*
Packit b099d7
	     * ClientMessages are not maskable so all we have to
Packit b099d7
	     * do is indicate interest in non-maskable events.
Packit b099d7
	     */
Packit b099d7
	    XtAddEventHandler(cb->rootShell, NoEventMask, True,
Packit b099d7
			      ReceiverShellExternalSourceHandler,
Packit b099d7
			      (XtPointer)dd);
Packit b099d7
	}
Packit b099d7
	break;
Packit b099d7
      case XmCR_DROP_SITE_TREE_REMOVE:
Packit b099d7
	{
Packit b099d7
	    XmDropSiteTreeRemoveCallback cb =
Packit b099d7
	      (XmDropSiteTreeRemoveCallback)anyCB;
Packit b099d7
	    XtRemoveEventHandler(cb->rootShell, NoEventMask, True,
Packit b099d7
				 ReceiverShellExternalSourceHandler,
Packit b099d7
				 (XtPointer)dd);
Packit b099d7
	    if (XtIsRealized(cb->rootShell))
Packit b099d7
	      _XmClearDragReceiverInfo(cb->rootShell);
Packit b099d7
	}
Packit b099d7
	break;
Packit b099d7
      default:
Packit b099d7
	break;
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  DisplayInitialize
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void 
Packit b099d7
DisplayInitialize(
Packit b099d7
        Widget requested_widget,
Packit b099d7
        Widget new_widget,
Packit b099d7
        ArgList args,
Packit b099d7
        Cardinal *num_args )
Packit b099d7
{
Packit b099d7
    static char *atom_names[] = {	
Packit b099d7
      "Customize Data:0",	/* XmSCUSTOMIZE_DATA + "0" */
Packit b099d7
      XmIATOM_PAIR, XmIAVERAGE_WIDTH, XmIPIXEL_SIZE, XmIRESOLUTION_Y,
Packit b099d7
      XmIWM_DELETE_WINDOW, XmI_MOTIF_DRAG_ATOMS,
Packit b099d7
      XmI_MOTIF_DRAG_INITIATOR_INFO, XmI_MOTIF_DRAG_PROXY_WINDOW,
Packit b099d7
      XmI_MOTIF_DRAG_RECEIVER_INFO, XmI_MOTIF_DRAG_TARGETS,
Packit b099d7
      XmI_MOTIF_DRAG_WINDOW, 
Packit b099d7
      XmSCLIPBOARD, XmSCLIP_TEMPORARY, XmSCOMPOUND_TEXT, XmSDELETE,
Packit b099d7
      XmSINCR, XmSINSERT_SELECTION, XmSLENGTH, XmSLINK_SELECTION, 
Packit b099d7
      XmSMULTIPLE, XmSNULL, XmSTARGETS, XmSTEXT, XmSTIMESTAMP,
Packit b099d7
      XmSTRANSFER_FAILURE, XmSTRANSFER_SUCCESS, XmSWM_STATE,
Packit b099d7
      XmS_MOTIF_ATOM_0, XmS_MOTIF_CLIP_DATA_DELETE,
Packit b099d7
      XmS_MOTIF_CLIP_DATA_REQUEST, XmS_MOTIF_CLIP_HEADER,
Packit b099d7
      XmS_MOTIF_CLIP_LOCK_ACCESS_VALID, XmS_MOTIF_CLIP_MESSAGE,
Packit b099d7
      XmS_MOTIF_CLIP_NEXT_ID, XmS_MOTIF_CLIP_TIME,
Packit b099d7
      XmS_MOTIF_CLIPBOARD_TARGETS, XmS_MOTIF_DESTINATION,
Packit b099d7
      XmS_MOTIF_DRAG_OFFSET, XmS_MOTIF_DEFERRED_CLIPBOARD_TARGETS,
Packit b099d7
      XmS_MOTIF_DROP, XmS_MOTIF_EXPORT_TARGETS, XmS_MOTIF_LOSE_SELECTION, 
Packit b099d7
      _XA_MOTIF_BINDINGS, _XA_MOTIF_WM_HINTS, _XA_MOTIF_WM_INFO,
Packit b099d7
      _XA_MOTIF_WM_MENU, _XA_MOTIF_WM_MESSAGES, _XA_MOTIF_WM_OFFSET,
Packit b099d7
      "WM_PROTOCOLS"
Packit b099d7
    };
Packit b099d7
Packit b099d7
    Atom	atoms[XtNumber(atom_names)];
Packit b099d7
    XmDisplay	xmDisplay = (XmDisplay)new_widget;
Packit b099d7
    int		dummy1, dummy2;
Packit b099d7
    XContext 	context;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Pre-load the Xlib atom cache with atoms we are likely to use,
Packit b099d7
     * similar to the way _XmInitAtomPairs() did in  Motif 1.2.x.
Packit b099d7
     */
Packit b099d7
    XInternAtoms(XtDisplay(xmDisplay), atom_names, XtNumber(atom_names),
Packit b099d7
		 False, atoms); 
Packit b099d7
Packit b099d7
    xmDisplay->display.shellCount = 0;
Packit b099d7
Packit b099d7
    xmDisplay->display.numModals = 0;
Packit b099d7
    xmDisplay->display.modals = NULL;
Packit b099d7
    xmDisplay->display.maxModals = 0;
Packit b099d7
    xmDisplay->display.userGrabbed = False;
Packit b099d7
    xmDisplay->display.activeDC = NULL;
Packit b099d7
    xmDisplay->display.dsm = (XmDropSiteManagerObject) NULL;
Packit b099d7
Packit b099d7
    xmDisplay->display.proxyWindow =
Packit b099d7
      _XmGetDragProxyWindow(XtDisplay(xmDisplay));
Packit b099d7
Packit b099d7
    _XmInitByteOrderChar();
Packit b099d7
    xmDisplay->display.xmim_info = NULL;
Packit b099d7
Packit b099d7
    xmDisplay->display.displayInfo = (XtPointer) XtNew(XmDisplayInfo);
Packit b099d7
    ((XmDisplayInfo *)(xmDisplay->display.displayInfo))->SashCursor = 0L;
Packit b099d7
    ((XmDisplayInfo *)(xmDisplay->display.displayInfo))->TearOffCursor = 0L;
Packit b099d7
    ((XmDisplayInfo *)(xmDisplay->display.displayInfo))->UniqueStamp = 0L;
Packit b099d7
    ((XmDisplayInfo *)(xmDisplay->display.displayInfo))->destinationWidget= 
Packit b099d7
	(Widget)NULL;
Packit b099d7
    ((XmDisplayInfo *)(xmDisplay->display.displayInfo))->excParentPane.pane =
Packit b099d7
	(Widget *)NULL;
Packit b099d7
    ((XmDisplayInfo *)(xmDisplay->display.displayInfo))->excParentPane.pane_list_size = 0;
Packit b099d7
    ((XmDisplayInfo *)(xmDisplay->display.displayInfo))->excParentPane.num_panes= 0;
Packit b099d7
    ((XmDisplayInfo *)(xmDisplay->display.displayInfo))->resetFocusFlag = 0;
Packit b099d7
    ((XmDisplayInfo *)(xmDisplay->display.displayInfo))->traversal_in_progress=
Packit b099d7
	FALSE;
Packit b099d7
Packit b099d7
    xmDisplay->display.displayHasShapeExtension = 
Packit b099d7
      XShapeQueryExtension(XtDisplay(xmDisplay), &dummy1, &dummy2);
Packit b099d7
Packit b099d7
    /* Handle dynamic default of receiver protocol style */
Packit b099d7
    if (xmDisplay->display.dragReceiverProtocolStyle == 
Packit b099d7
	INVALID_PROTOCOL_VALUE) {
Packit b099d7
      if (xmDisplay->display.displayHasShapeExtension)
Packit b099d7
	xmDisplay->display.dragReceiverProtocolStyle = XmDRAG_PREFER_DYNAMIC;
Packit b099d7
      else
Packit b099d7
	xmDisplay->display.dragReceiverProtocolStyle =
Packit b099d7
	  XmDRAG_PREFER_PREREGISTER;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    _XmVirtKeysInitialize (new_widget);
Packit b099d7
Packit b099d7
    _XmProcessLock();
Packit b099d7
    if (displayContext == 0)
Packit b099d7
      displayContext = XUniqueContext();
Packit b099d7
    context = displayContext;
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
	
Packit b099d7
	if (! XFindContext(XtDisplay(xmDisplay), None, context,
Packit b099d7
		(char **) &xmDisplay))
Packit b099d7
	{
Packit b099d7
		/*
Packit b099d7
		 * There's one already created for this display.
Packit b099d7
		 * What should we do?  If we destroy the previous one, we may
Packit b099d7
		 * wreak havoc with shell modality and screen objects.  BUT,
Packit b099d7
		 * Xt doesn't really give us a way to abort a create.  We'll
Packit b099d7
		 * just let the new one dangle.
Packit b099d7
		 */
Packit b099d7
Packit b099d7
		XmeWarning((Widget) xmDisplay, MESSAGE1);
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
		XSaveContext(XtDisplayOfObject((Widget)xmDisplay),
Packit b099d7
			 None,
Packit b099d7
			 context,
Packit b099d7
			 (char *)xmDisplay);
Packit b099d7
	}
Packit b099d7
Packit b099d7
    if (xmDisplay->display.enable_multi_key_bindings) {
Packit b099d7
	Display * display = XtDisplay(new_widget);
Packit b099d7
	int i, num_screens = ScreenCount(display);
Packit b099d7
	XrmDatabase new_db;
Packit b099d7
Packit b099d7
	for (i = 0; i < num_screens; i++)  {
Packit b099d7
	    Screen * screen = ScreenOfDisplay(display, i);
Packit b099d7
	    XrmDatabase db = XtScreenDatabase(screen);
Packit b099d7
	    new_db = XrmGetStringDatabase(_XmDisplay_baseTranslations);
Packit b099d7
	    XrmCombineDatabase(new_db, &db, False);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  DisplayInsertChild
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
static void 
Packit b099d7
DisplayInsertChild(
Packit b099d7
        Widget w )
Packit b099d7
{
Packit b099d7
	if (XtIsRectObj(w)) {
Packit b099d7
		XtWidgetProc insert_child;
Packit b099d7
Packit b099d7
		_XmProcessLock();
Packit b099d7
		insert_child = ((CompositeWidgetClass)compositeWidgetClass)
Packit b099d7
				->composite_class.insert_child;
Packit b099d7
		_XmProcessUnlock();
Packit b099d7
		(*insert_child)(w);
Packit b099d7
	}
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  DisplayDeleteChild
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
static void 
Packit b099d7
DisplayDeleteChild(
Packit b099d7
        Widget w )
Packit b099d7
{
Packit b099d7
	if (XtIsRectObj(w)) {
Packit b099d7
		XtWidgetProc delete_child;
Packit b099d7
Packit b099d7
		_XmProcessLock();
Packit b099d7
		delete_child = ((CompositeWidgetClass)compositeWidgetClass)
Packit b099d7
				->composite_class.delete_child;
Packit b099d7
		_XmProcessUnlock();	
Packit b099d7
		(*delete_child)(w);
Packit b099d7
	}
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  DisplayDestroy
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void 
Packit b099d7
DisplayDestroy(
Packit b099d7
        Widget w )
Packit b099d7
{
Packit b099d7
    XmDisplay dd = (XmDisplay) w ;
Packit b099d7
    XContext context;
Packit b099d7
Packit b099d7
    _XmProcessLock();
Packit b099d7
    context = displayContext;
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
Packit b099d7
Packit b099d7
    XtFree((char *) dd->display.modals);
Packit b099d7
Packit b099d7
    if (((XmDisplayInfo *)(dd->display.displayInfo))
Packit b099d7
		->excParentPane.pane != (Widget *)NULL)
Packit b099d7
	XtFree((char *) ((XmDisplayInfo *)(dd->display.displayInfo))
Packit b099d7
		->excParentPane.pane);
Packit b099d7
    XtFree((char *) dd->display.displayInfo);
Packit b099d7
Packit b099d7
    /* Destroy the DropSiteManager object. */
Packit b099d7
    if (dd->display.dsm != NULL)
Packit b099d7
	XtDestroyWidget((Widget) dd->display.dsm);
Packit b099d7
Packit b099d7
    _XmClearDisplayTables(XtDisplay(w));
Packit b099d7
Packit b099d7
    _XmVirtKeysDestroy (w);
Packit b099d7
Packit b099d7
    XDeleteContext( XtDisplay( w), None, context) ;
Packit b099d7
}
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
XmDropSiteManagerObject 
Packit b099d7
_XmGetDropSiteManagerObject(
Packit b099d7
        XmDisplay xmDisplay )
Packit b099d7
{
Packit b099d7
  /* Defer the creation of the XmDisplayObject's DropSiteManager until
Packit b099d7
   *   it is referenced, since the converters of some DSM resources
Packit b099d7
   *   (animationPixmap, for instance) depend on the presence of the
Packit b099d7
   *   Display/Screen objects, and a circular recursive creation loop
Packit b099d7
   *   results if the DSM is created during DisplayInitialize.
Packit b099d7
   */
Packit b099d7
  if(    xmDisplay->display.dsm == NULL    )
Packit b099d7
    {   
Packit b099d7
      Arg lclArgs[1] ;
Packit b099d7
Packit b099d7
      XtSetArg( lclArgs[0], XmNtreeUpdateProc, TreeUpdateHandler) ;
Packit b099d7
      xmDisplay->display.dsm = (XmDropSiteManagerObject) XtCreateWidget( "dsm",
Packit b099d7
                                       xmDisplay->display.dropSiteManagerClass,
Packit b099d7
                                              (Widget) xmDisplay, lclArgs, 1) ;
Packit b099d7
    } 
Packit b099d7
  return( xmDisplay->display.dsm);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
unsigned char 
Packit b099d7
_XmGetDragProtocolStyle(
Packit b099d7
        Widget w )
Packit b099d7
{
Packit b099d7
    XmDisplay		xmDisplay;
Packit b099d7
    unsigned char	style;
Packit b099d7
Packit b099d7
    xmDisplay = (XmDisplay) XmGetXmDisplay(XtDisplay(w));
Packit b099d7
Packit b099d7
    switch(xmDisplay->display.dragReceiverProtocolStyle) {
Packit b099d7
	  case XmDRAG_NONE:
Packit b099d7
	  case XmDRAG_DROP_ONLY:
Packit b099d7
	    style = XmDRAG_NONE;
Packit b099d7
	    break;
Packit b099d7
	  case XmDRAG_DYNAMIC:
Packit b099d7
	    style = XmDRAG_DYNAMIC;
Packit b099d7
	    break;
Packit b099d7
	  case XmDRAG_PREFER_DYNAMIC:
Packit b099d7
	  case XmDRAG_PREFER_PREREGISTER:
Packit b099d7
	  case XmDRAG_PREREGISTER:
Packit b099d7
	    style = XmDRAG_PREREGISTER;
Packit b099d7
	    break;
Packit b099d7
	  default:
Packit b099d7
	    style = XmDRAG_NONE;
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
    return style;
Packit b099d7
}
Packit b099d7
Packit b099d7
Widget 
Packit b099d7
XmGetDragContext(
Packit b099d7
        Widget w,
Packit b099d7
        Time time )
Packit b099d7
{
Packit b099d7
	XmDisplay		xmDisplay;
Packit b099d7
	XmDragContext	matchedDC = NULL, dc = NULL;
Packit b099d7
	Cardinal		i;
Packit b099d7
Packit b099d7
	_XmWidgetToAppContext(w);
Packit b099d7
	_XmAppLock(app);
Packit b099d7
Packit b099d7
	xmDisplay = (XmDisplay)XmGetXmDisplay(XtDisplay(w));
Packit b099d7
	for(i = 0; i < xmDisplay->composite.num_children; i++)
Packit b099d7
	{
Packit b099d7
		dc = (XmDragContext)(xmDisplay->composite.children[i]);
Packit b099d7
		if ((XmIsDragContext((Widget) dc)) && (CHECK_TIME(dc, time)) &&
Packit b099d7
			((!matchedDC) ||
Packit b099d7
				(matchedDC->drag.dragStartTime
Packit b099d7
					< dc->drag.dragStartTime)) &&
Packit b099d7
			!dc->core.being_destroyed)
Packit b099d7
			matchedDC = dc;
Packit b099d7
	}
Packit b099d7
	_XmAppUnlock(app);
Packit b099d7
	return((Widget)matchedDC);
Packit b099d7
}
Packit b099d7
Packit b099d7
Widget 
Packit b099d7
_XmGetDragContextFromHandle(
Packit b099d7
        Widget w,
Packit b099d7
        Atom iccHandle )
Packit b099d7
{
Packit b099d7
	XmDisplay		xmDisplay;
Packit b099d7
	XmDragContext	dc;
Packit b099d7
	Cardinal		i;
Packit b099d7
Packit b099d7
	xmDisplay = (XmDisplay)XmGetXmDisplay(XtDisplay(w));
Packit b099d7
Packit b099d7
	for(i = 0; i < xmDisplay->composite.num_children; i++)
Packit b099d7
	{
Packit b099d7
		dc = (XmDragContext)(xmDisplay->composite.children[i]);
Packit b099d7
		if ((XmIsDragContext((Widget) dc)) && 
Packit b099d7
			(dc->drag.iccHandle == iccHandle) &&
Packit b099d7
			!dc->core.being_destroyed)
Packit b099d7
			return((Widget)dc);
Packit b099d7
	}
Packit b099d7
	return(NULL);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
static XmDragContext 
Packit b099d7
FindDC(
Packit b099d7
        XmDisplay xmDisplay,
Packit b099d7
        Time time,
Packit b099d7
#if NeedWidePrototypes
Packit b099d7
        int sourceIsExternal )
Packit b099d7
#else
Packit b099d7
        Boolean sourceIsExternal )
Packit b099d7
#endif /* NeedWidePrototypes */
Packit b099d7
{
Packit b099d7
	XmDragContext	dc = NULL;
Packit b099d7
	Cardinal			i;
Packit b099d7
Packit b099d7
	for(i = 0; i < xmDisplay->composite.num_children; i++)
Packit b099d7
	{
Packit b099d7
		dc = (XmDragContext)(xmDisplay->composite.children[i]);
Packit b099d7
		if ((XmIsDragContext((Widget) dc)) &&
Packit b099d7
			(CHECK_TIME(dc, time)) &&
Packit b099d7
			(dc->drag.sourceIsExternal == sourceIsExternal) &&
Packit b099d7
			!dc->core.being_destroyed)
Packit b099d7
			return(dc);
Packit b099d7
	}
Packit b099d7
	return(NULL);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static int 
Packit b099d7
isMine(
Packit b099d7
        Display *dpy,
Packit b099d7
        register XEvent *event,
Packit b099d7
        char *arg )
Packit b099d7
{
Packit b099d7
	XmDisplayEventQueryStruct 	*q = (XmDisplayEventQueryStruct *) arg;
Packit b099d7
	XmICCCallbackStruct		callback, *cb = &callback;
Packit b099d7
Packit b099d7
	/* Once we have a drop start we must stop looking at the queue */
Packit b099d7
	if (q->hasDropStart)
Packit b099d7
		return(False);
Packit b099d7
Packit b099d7
	if (!_XmICCEventToICCCallback((XClientMessageEvent *)event, 
Packit b099d7
			cb, XmICC_INITIATOR_EVENT))
Packit b099d7
		return(False);
Packit b099d7
Packit b099d7
	if ((cb->any.reason == XmCR_DROP_SITE_ENTER) ||
Packit b099d7
		(cb->any.reason == XmCR_DROP_SITE_LEAVE))
Packit b099d7
	{
Packit b099d7
		/*
Packit b099d7
		 * We must assume this to be a dangling set of messages, so
Packit b099d7
		 * we will quietly consume it in the interest of hygene.
Packit b099d7
		 */
Packit b099d7
		return(True);
Packit b099d7
	}
Packit b099d7
Packit b099d7
Packit b099d7
	if (!q->dc)
Packit b099d7
		q->dc = FindDC(q->dd, cb->any.timeStamp, True);
Packit b099d7
	/*
Packit b099d7
	 * if we can find a dc then we have already processed
Packit b099d7
	 * an enter for this shell.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	switch(cb->any.reason)
Packit b099d7
	{
Packit b099d7
		case XmCR_TOP_LEVEL_ENTER:
Packit b099d7
			q->hasLeave = False;
Packit b099d7
			if (q->dc == NULL)
Packit b099d7
			{
Packit b099d7
				*(q->enterCB) = *(XmTopLevelEnterCallbackStruct *)cb;
Packit b099d7
				q->hasEnter = True;
Packit b099d7
			}
Packit b099d7
		break;
Packit b099d7
		case XmCR_TOP_LEVEL_LEAVE:
Packit b099d7
			if (q->dc != NULL)
Packit b099d7
			{
Packit b099d7
				*(q->leaveCB) = *(XmTopLevelLeaveCallbackStruct *)cb;
Packit b099d7
				q->hasLeave = True;
Packit b099d7
				q->hasMotion = False;
Packit b099d7
			}
Packit b099d7
			else
Packit b099d7
			{
Packit b099d7
			  /*
Packit b099d7
			   * hasEnter is true if we are missing a 
Packit b099d7
			   * drag context because an enter got compressed.
Packit b099d7
			   * In that case, all is OK, and no warning is 
Packit b099d7
			   * needed. ??? Is a warning ever needed ???
Packit b099d7
			   */
Packit b099d7
			  if (!q->hasEnter)
Packit b099d7
			    XmeWarning((Widget) q->dd, MESSAGE2);
Packit b099d7
			}
Packit b099d7
			q->hasEnter = False;
Packit b099d7
		break;
Packit b099d7
		case XmCR_DRAG_MOTION:
Packit b099d7
			*(q->motionCB) = *(XmDragMotionCallbackStruct *)cb;
Packit b099d7
			q->hasMotion = True;
Packit b099d7
		break;
Packit b099d7
		case XmCR_DROP_START:
Packit b099d7
			*(q->dropStartCB) = *(XmDropStartCallbackStruct *)cb;
Packit b099d7
			q->hasDropStart = True;
Packit b099d7
		break;
Packit b099d7
		default:
Packit b099d7
		break;
Packit b099d7
	}
Packit b099d7
	return True;
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * this handler is used to catch messages from external drag
Packit b099d7
 * contexts that want to map motion or drop events
Packit b099d7
 */
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
ReceiverShellExternalSourceHandler(
Packit b099d7
        Widget w,
Packit b099d7
        XtPointer client_data,
Packit b099d7
        XEvent *event,
Packit b099d7
        Boolean *dontSwallow )
Packit b099d7
{
Packit b099d7
    XmDragTopLevelClientDataStruct 	topClientData;
Packit b099d7
    XmTopLevelEnterCallbackStruct	enterCB;
Packit b099d7
    XmTopLevelLeaveCallbackStruct	leaveCB;
Packit b099d7
    XmDropStartCallbackStruct		dropStartCB;
Packit b099d7
    XmDragMotionCallbackStruct		motionCB;
Packit b099d7
    XmDisplayEventQueryStruct		 		q;	
Packit b099d7
    Widget	  			shell = w;
Packit b099d7
    XmDisplay			dd = (XmDisplay) XmGetXmDisplay(XtDisplay(w));
Packit b099d7
    XmDragContext			dc;
Packit b099d7
    XmDropSiteManagerObject		dsm = _XmGetDropSiteManagerObject( dd);
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * If dd has an active dc then we are the initiator.  We shouldn't
Packit b099d7
     * do receiver processing as the initiator, so bail out.
Packit b099d7
     */
Packit b099d7
    if (dd->display.activeDC != NULL)
Packit b099d7
	return;
Packit b099d7
Packit b099d7
    q.dd = dd;
Packit b099d7
    q.dc = (XmDragContext)NULL;
Packit b099d7
    q.enterCB = &enterCB;
Packit b099d7
    q.leaveCB = &leaveCB;
Packit b099d7
    q.motionCB = &motionCB;
Packit b099d7
    q.dropStartCB = &dropStartCB;
Packit b099d7
    q.hasEnter =
Packit b099d7
      q.hasDropStart = 
Packit b099d7
	q.hasLeave = 
Packit b099d7
	  q.hasMotion = False;
Packit b099d7
    /*
Packit b099d7
     * Since this event handler gets called for all non-maskable events,
Packit b099d7
     * we want to bail out now with don't swallow if we don't want this
Packit b099d7
     * event.  Otherwise we'll swallow it.
Packit b099d7
     */
Packit b099d7
    
Packit b099d7
     /*
Packit b099d7
	  * process the event that fired this event handler.
Packit b099d7
	  * If it's not a Receiver DND event, bail out.
Packit b099d7
	  */
Packit b099d7
    if (!isMine(XtDisplayOfObject(w), event, (char*)&q))
Packit b099d7
		return;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * swallow all the pending messages inline except the last motion
Packit b099d7
     */
Packit b099d7
    while (XCheckIfEvent( XtDisplayOfObject(w), event, isMine, (char*)&q))
Packit b099d7
      /*EMPTY*/;
Packit b099d7
Packit b099d7
    dc = q.dc;
Packit b099d7
Packit b099d7
    if (q.hasEnter || q.hasMotion || q.hasDropStart || q.hasLeave) {
Packit b099d7
	/*
Packit b099d7
	 * handle a dangling leave first
Packit b099d7
	 */
Packit b099d7
	if (q.hasLeave) 
Packit b099d7
	  {
Packit b099d7
	      XmTopLevelLeaveCallback	callback = &leaveCB;
Packit b099d7
	      
Packit b099d7
	      topClientData.destShell = shell;
Packit b099d7
	      topClientData.xOrigin = shell->core.x;
Packit b099d7
	      topClientData.yOrigin = shell->core.y;
Packit b099d7
	      topClientData.sourceIsExternal = True;
Packit b099d7
	      topClientData.iccInfo = NULL;
Packit b099d7
	      topClientData.window = XtWindow(w);
Packit b099d7
	      topClientData.dragOver = NULL;
Packit b099d7
	      
Packit b099d7
	      _XmDSMUpdate(dsm, 
Packit b099d7
			   (XtPointer)&topClientData, 
Packit b099d7
			   (XtPointer)callback);
Packit b099d7
	      /* destroy it if no drop. otherwise done in dropTransfer */
Packit b099d7
	      if (!q.hasDropStart)
Packit b099d7
	      {
Packit b099d7
		XtDestroyWidget((Widget)dc);
Packit b099d7
		q.dc = dc = NULL;
Packit b099d7
	      }
Packit b099d7
	  }
Packit b099d7
	/*
Packit b099d7
	 * check for a dropStart from a preregister client or an enter
Packit b099d7
	 * either of which require a dc to be alloced
Packit b099d7
	 */
Packit b099d7
	if (q.hasEnter || q.hasDropStart) {
Packit b099d7
	    if (!q.dc) {
Packit b099d7
		Arg		args[4];
Packit b099d7
		Cardinal	i = 0;
Packit b099d7
		Time		timeStamp;
Packit b099d7
		Window		window;
Packit b099d7
		Atom		iccHandle;
Packit b099d7
Packit b099d7
		if (q.hasDropStart) {
Packit b099d7
		    XmDropStartCallback	dsCallback = &dropStartCB;
Packit b099d7
		    
Packit b099d7
		    timeStamp = dsCallback->timeStamp;
Packit b099d7
		    window = dsCallback->window;
Packit b099d7
		    iccHandle = dsCallback->iccHandle;
Packit b099d7
		}
Packit b099d7
		else {
Packit b099d7
		    XmTopLevelEnterCallback teCallback = &enterCB;	    
Packit b099d7
		    
Packit b099d7
		    timeStamp = teCallback->timeStamp;
Packit b099d7
		    window = teCallback->window;
Packit b099d7
		    iccHandle = teCallback->iccHandle;
Packit b099d7
		}
Packit b099d7
		XtSetArg(args[i], XmNsourceWindow, window);i++;
Packit b099d7
		XtSetArg(args[i], XmNsourceIsExternal,True);i++;
Packit b099d7
		XtSetArg(args[i], XmNstartTime, timeStamp);i++;
Packit b099d7
		XtSetArg(args[i], XmNiccHandle, iccHandle);i++;
Packit b099d7
		dc = (XmDragContext) XtCreateWidget("dragContext", 
Packit b099d7
			dd->display.dragContextClass, (Widget)dd, args, i);
Packit b099d7
		_XmReadInitiatorInfo((Widget)dc);
Packit b099d7
		/*
Packit b099d7
		 * force in value for dropTransfer to use in selection
Packit b099d7
		 * calls.
Packit b099d7
		 */
Packit b099d7
		dc->drag.currReceiverInfo =
Packit b099d7
		  _XmAllocReceiverInfo(dc);
Packit b099d7
		dc->drag.currReceiverInfo->shell = shell;
Packit b099d7
                dc->drag.currReceiverInfo->dragProtocolStyle = 
Packit b099d7
			                  dd->display.dragReceiverProtocolStyle;
Packit b099d7
	    }
Packit b099d7
	    topClientData.destShell = shell;
Packit b099d7
	    topClientData.xOrigin = XtX(shell);
Packit b099d7
	    topClientData.yOrigin = XtY(shell);
Packit b099d7
	    topClientData.width = XtWidth(shell);
Packit b099d7
	    topClientData.height = XtHeight(shell);
Packit b099d7
	    topClientData.sourceIsExternal = True;
Packit b099d7
	    topClientData.iccInfo = NULL;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if (!dc) return;
Packit b099d7
Packit b099d7
	if (q.hasDropStart) {
Packit b099d7
	    dc->drag.dragFinishTime = dropStartCB.timeStamp;
Packit b099d7
	    _XmDSMUpdate(dsm,
Packit b099d7
			 (XtPointer)&topClientData, 
Packit b099d7
			 (XtPointer)&dropStartCB);
Packit b099d7
	}
Packit b099d7
	/* 
Packit b099d7
	 * we only see enters if they're not matched with a leave
Packit b099d7
	 */
Packit b099d7
	if (q.hasEnter) {
Packit b099d7
	    _XmDSMUpdate(dsm,
Packit b099d7
			 (XtPointer)&topClientData, 
Packit b099d7
			 (XtPointer)&enterCB);
Packit b099d7
	}
Packit b099d7
	if (q.hasMotion) {
Packit b099d7
	    XmDragMotionCallback	callback = &motionCB;
Packit b099d7
	    XmDragMotionClientDataStruct	motionData;
Packit b099d7
	    
Packit b099d7
	    motionData.window = XtWindow(w);
Packit b099d7
	    motionData.dragOver = NULL;
Packit b099d7
	    _XmDSMUpdate(dsm, (XtPointer)&motionData, (XtPointer)callback);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
static Widget 
Packit b099d7
GetDisplay(
Packit b099d7
        Display *display )
Packit b099d7
{
Packit b099d7
	XmDisplay	xmDisplay = NULL;
Packit b099d7
	XContext        context;
Packit b099d7
	Arg args[3];
Packit b099d7
	int n;
Packit b099d7
Packit b099d7
	_XmProcessLock();
Packit b099d7
	context = displayContext;
Packit b099d7
	_XmProcessUnlock();
Packit b099d7
Packit b099d7
	if ((context == 0) ||
Packit b099d7
		(XFindContext(display, None, context,
Packit b099d7
			(char **) &xmDisplay)))
Packit b099d7
	{
Packit b099d7
		String	name, w_class;
Packit b099d7
Packit b099d7
		XtGetApplicationNameAndClass(display, &name, &w_class);
Packit b099d7
Packit b099d7
		n = 0;
Packit b099d7
		XtSetArg(args[n], XmNmappedWhenManaged, False); n++;
Packit b099d7
		XtSetArg(args[n], XmNwidth, 1); n++;
Packit b099d7
		XtSetArg(args[n], XmNheight, 1); n++;
Packit b099d7
		xmDisplay = (XmDisplay) XtAppCreateShell(name, w_class,
Packit b099d7
			xmDisplayClass, display, args, n);
Packit b099d7
	}
Packit b099d7
Packit b099d7
	/* We need a window to be useful */
Packit b099d7
	if (!XtIsRealized((Widget)xmDisplay))
Packit b099d7
	  {
Packit b099d7
	    XtRealizeWidget((Widget)xmDisplay);
Packit b099d7
Packit b099d7
	    /*
Packit b099d7
	     * Got the resources - get rid of name-type properties.
Packit b099d7
	     * Otherwise, clients (ie: xwd) may get the wrong window
Packit b099d7
	     * using the -name option.
Packit b099d7
	     */
Packit b099d7
	    XDeleteProperty(display, XtWindow(xmDisplay), XA_WM_NAME);
Packit b099d7
	    XDeleteProperty(display, XtWindow(xmDisplay), XA_WM_ICON_NAME);
Packit b099d7
	    XDeleteProperty(display, XtWindow(xmDisplay), XA_WM_CLASS);
Packit b099d7
	  }
Packit b099d7
Packit b099d7
	return ((Widget)xmDisplay);
Packit b099d7
}
Packit b099d7
Packit b099d7
Widget
Packit b099d7
XmGetXmDisplay(
Packit b099d7
        Display *display )
Packit b099d7
{
Packit b099d7
	XmDisplayClass dC;
Packit b099d7
	Widget w;
Packit b099d7
	_XmDisplayToAppContext(display);
Packit b099d7
Packit b099d7
	/*
Packit b099d7
	 * We have a chicken and egg problem here; we'd like to get
Packit b099d7
	 * the display via a class function, but we don't know which
Packit b099d7
	 * class to use.  Hence the magic functions _XmGetXmDisplayClass
Packit b099d7
	 * and _XmSetXmDisplayClass.
Packit b099d7
	 */
Packit b099d7
	
Packit b099d7
	_XmAppLock(app);
Packit b099d7
	_XmProcessLock();
Packit b099d7
	dC = (XmDisplayClass) _XmGetXmDisplayClass();
Packit b099d7
	w = (*(dC->display_class.GetDisplay))(display);
Packit b099d7
	_XmProcessUnlock();
Packit b099d7
	_XmAppUnlock(app);
Packit b099d7
Packit b099d7
	return w;
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * It would be nice if the next two functions were methods, but
Packit b099d7
 * for obvious reasons they're not.
Packit b099d7
 */
Packit b099d7
Packit b099d7
WidgetClass
Packit b099d7
_XmGetXmDisplayClass( void )
Packit b099d7
{
Packit b099d7
	WidgetClass class;
Packit b099d7
Packit b099d7
	_XmProcessLock();
Packit b099d7
	if (curDisplayClass == NULL)
Packit b099d7
		curDisplayClass = xmDisplayClass;
Packit b099d7
	class = curDisplayClass;
Packit b099d7
	_XmProcessUnlock();
Packit b099d7
	return class;
Packit b099d7
}
Packit b099d7
Packit b099d7
WidgetClass
Packit b099d7
_XmSetXmDisplayClass(
Packit b099d7
	WidgetClass wc )
Packit b099d7
{
Packit b099d7
	WidgetClass oldDisplayClass;
Packit b099d7
	WidgetClass sc = wc;
Packit b099d7
Packit b099d7
	_XmProcessLock();
Packit b099d7
	oldDisplayClass = curDisplayClass;
Packit b099d7
	/*
Packit b099d7
	 * We aren't going to let folks just set any old class in as the
Packit b099d7
	 * display class.  They will have to use subclasses of xmDisplay.
Packit b099d7
	 */
Packit b099d7
	while ((sc != NULL) && (sc != xmDisplayClass))
Packit b099d7
		sc = sc->core_class.superclass;
Packit b099d7
Packit b099d7
	if (sc != NULL)
Packit b099d7
		curDisplayClass = wc;
Packit b099d7
	else
Packit b099d7
		XmeWarning(NULL, MESSAGE3);
Packit b099d7
Packit b099d7
	_XmProcessUnlock();
Packit b099d7
	return(oldDisplayClass);
Packit b099d7
}
Packit b099d7
Packit b099d7
/**********************************************************************
Packit b099d7
 *
Packit b099d7
 * _XmSetThickness
Packit b099d7
 * This procedure is called as the resource default XtRCallProc
Packit b099d7
 * to default the shadow and highlight thickness resources.  If
Packit b099d7
 * enablethinThickness is true (CDE apps), the value is "1 pixel",
Packit b099d7
 * else defaults to "2".  
Packit b099d7
 **********************************************************************/
Packit b099d7
void 
Packit b099d7
_XmSetThickness(
Packit b099d7
        Widget widget,
Packit b099d7
        int offset,
Packit b099d7
        XrmValue *value )
Packit b099d7
{
Packit b099d7
	XmDisplay	 xmDisplay;
Packit b099d7
	static Dimension thickness;
Packit b099d7
Packit b099d7
	xmDisplay = (XmDisplay)XmGetXmDisplay(XtDisplay(widget));
Packit b099d7
Packit b099d7
	if (xmDisplay->display.enable_thin_thickness) {
Packit b099d7
		thickness = 1;
Packit b099d7
	}
Packit b099d7
	else {
Packit b099d7
		thickness = 2;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	value->addr = (XPointer)&thickness;
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
/**********************************************************************
Packit b099d7
 *
Packit b099d7
 * _XmSetThicknessDefault0
Packit b099d7
 * This procedure is called as the resource default XtRCallProc
Packit b099d7
 * to default the shadow and highlight thickness resources.  If
Packit b099d7
 * enablethinThickness is true (CDE apps), the value is "1 pixel",
Packit b099d7
 * else defaults to "0".  
Packit b099d7
 **********************************************************************/
Packit b099d7
void 
Packit b099d7
_XmSetThicknessDefault0(
Packit b099d7
        Widget widget,
Packit b099d7
        int offset,
Packit b099d7
        XrmValue *value )
Packit b099d7
{
Packit b099d7
	XmDisplay	 xmDisplay;
Packit b099d7
	static Dimension thickness;
Packit b099d7
Packit b099d7
	xmDisplay = (XmDisplay)XmGetXmDisplay(XtDisplay(widget));
Packit b099d7
Packit b099d7
	if (xmDisplay->display.enable_thin_thickness) {
Packit b099d7
		thickness = 1;
Packit b099d7
	}
Packit b099d7
	else {
Packit b099d7
		thickness = 0;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	value->addr = (XPointer)&thickness;
Packit b099d7
Packit b099d7
}