|
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 |
}
|