Blame lib/Xm/Screen.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: Screen.c /main/16 1997/06/18 17:41:50 samborn $"
Packit b099d7
#endif
Packit b099d7
#endif
Packit b099d7
/* (c) Copyright 1987, 1988, 1989, 1990, 1991, 1992 HEWLETT-PACKARD COMPANY */
Packit b099d7
/* (c) Copyright 1987, 1988, DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. */
Packit b099d7
/* (c) Copyright 1988 MASSACHUSETTS INSTITUTE OF TECHNOLOGY */
Packit b099d7
Packit b099d7
#ifdef HAVE_CONFIG_H
Packit b099d7
#include <config.h>
Packit b099d7
#endif
Packit b099d7
Packit b099d7
Packit b099d7
#include <stdio.h>
Packit b099d7
#include <X11/Xatom.h>
Packit b099d7
#include <Xm/Xm.h>		/* To make cpp on Sun happy. CR 5943 */
Packit b099d7
#include <Xm/AtomMgr.h>
Packit b099d7
#include <Xm/DisplayP.h>
Packit b099d7
#include "DragIconI.h"
Packit b099d7
#include "HashI.h"
Packit b099d7
#include "ImageCachI.h"
Packit b099d7
#include "MessagesI.h"
Packit b099d7
#include "RepTypeI.h"
Packit b099d7
#include "ScreenI.h"
Packit b099d7
#include "PixConvI.h"
Packit b099d7
Packit b099d7
#define DEFAULT_QUAD_WIDTH 10
Packit b099d7
Packit b099d7
#define RESOURCE_DEFAULT  (-1)
Packit b099d7
Packit b099d7
#define MESSAGE1	_XmMMsgScreen_0000
Packit b099d7
#define MESSAGE2        _XmMMsgScreen_0001
Packit b099d7
Packit b099d7
Packit b099d7
/********    Static Function Declarations    ********/
Packit b099d7
Packit b099d7
static void ClassPartInitialize( 
Packit b099d7
                        WidgetClass wc) ;
Packit b099d7
static void ClassInitialize( void ) ;
Packit b099d7
static void GetUnitFromFont( 
Packit b099d7
                        Display *display,
Packit b099d7
                        XFontStruct *fst,
Packit b099d7
                        int *ph_unit,
Packit b099d7
                        int *pv_unit) ;
Packit b099d7
static void Initialize( 
Packit b099d7
                        Widget requested_widget,
Packit b099d7
                        Widget new_widget,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
Packit b099d7
static Boolean SetValues( 
Packit b099d7
                        Widget current,
Packit b099d7
                        Widget requested,
Packit b099d7
                        Widget new_w,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
Packit b099d7
static void Destroy( 
Packit b099d7
                        Widget widget) ;
Packit b099d7
static void InsertChild( 
Packit b099d7
                        Widget wid) ;
Packit b099d7
static void DeleteChild( 
Packit b099d7
                        Widget wid) ;
Packit b099d7
static Boolean MatchPixmap(XmHashKey, XmHashKey) ;
Packit b099d7
static XmHashValue HashPixmap(XmHashKey) ;
Packit b099d7
static Boolean FreePixmap(XmHashKey k, XtPointer p, XtPointer client_data) ;
Packit b099d7
Packit b099d7
/********    End Static Function Declarations    ********/
Packit b099d7
Packit b099d7
#define Offset(x) (XtOffsetOf(XmScreenRec, x))
Packit b099d7
Packit b099d7
static XtResource resources[] = {
Packit b099d7
    {
Packit b099d7
	XmNdarkThreshold, XmCDarkThreshold, XmRInt,
Packit b099d7
	sizeof(int), Offset(screen.darkThreshold), 
Packit b099d7
	XmRImmediate, (XtPointer)NULL, 
Packit b099d7
    },
Packit b099d7
    {
Packit b099d7
	XmNlightThreshold, XmCLightThreshold, XmRInt,
Packit b099d7
	sizeof(int), Offset(screen.lightThreshold), 
Packit b099d7
	XmRImmediate, (XtPointer)NULL, 
Packit b099d7
    },
Packit b099d7
    {
Packit b099d7
	XmNforegroundThreshold, XmCForegroundThreshold, XmRInt,
Packit b099d7
	sizeof(int), Offset(screen.foregroundThreshold), 
Packit b099d7
	XmRImmediate, (XtPointer)NULL, 
Packit b099d7
    },
Packit b099d7
    {
Packit b099d7
	XmNdefaultNoneCursorIcon, XmCDefaultNoneCursorIcon, XmRWidget,
Packit b099d7
	sizeof(Widget), Offset(screen.defaultNoneCursorIcon), 
Packit b099d7
	XmRImmediate, (XtPointer)NULL, 
Packit b099d7
    },
Packit b099d7
    {
Packit b099d7
	XmNdefaultValidCursorIcon, XmCDefaultValidCursorIcon,
Packit b099d7
	XmRWidget, sizeof(Widget), Offset(screen.defaultValidCursorIcon), 
Packit b099d7
	XmRImmediate, (XtPointer)NULL, 
Packit b099d7
    },
Packit b099d7
    {
Packit b099d7
	XmNdefaultInvalidCursorIcon, XmCDefaultInvalidCursorIcon, XmRWidget,
Packit b099d7
	sizeof(Widget), Offset(screen.defaultInvalidCursorIcon),
Packit b099d7
	XmRImmediate, (XtPointer)NULL, 
Packit b099d7
    },   
Packit b099d7
    {
Packit b099d7
	XmNdefaultMoveCursorIcon, XmCDefaultMoveCursorIcon, XmRWidget,
Packit b099d7
	sizeof(Widget), Offset(screen.defaultMoveCursorIcon), 
Packit b099d7
	XmRImmediate, (XtPointer)NULL, 
Packit b099d7
    },
Packit b099d7
    {
Packit b099d7
	XmNdefaultLinkCursorIcon, XmCDefaultLinkCursorIcon,
Packit b099d7
	XmRWidget, sizeof(Widget), Offset(screen.defaultLinkCursorIcon), 
Packit b099d7
	XmRImmediate, (XtPointer)NULL, 
Packit b099d7
    },
Packit b099d7
    {
Packit b099d7
	XmNdefaultCopyCursorIcon, XmCDefaultCopyCursorIcon, XmRWidget,
Packit b099d7
	sizeof(Widget), Offset(screen.defaultCopyCursorIcon),
Packit b099d7
	XmRImmediate, (XtPointer)NULL, 
Packit b099d7
    },   
Packit b099d7
    {
Packit b099d7
	XmNdefaultSourceCursorIcon, XmCDefaultSourceCursorIcon, XmRWidget,
Packit b099d7
	sizeof(Widget), Offset(screen.defaultSourceCursorIcon),
Packit b099d7
	XmRImmediate, (XtPointer)NULL, 
Packit b099d7
    },   
Packit b099d7
    {
Packit b099d7
	XmNmenuCursor, XmCCursor, XmRCursor,
Packit b099d7
	sizeof(Cursor), Offset(screen.menuCursor),
Packit b099d7
	XmRString, "arrow",
Packit b099d7
    },
Packit b099d7
    {
Packit b099d7
	XmNunpostBehavior, XmCUnpostBehavior, XmRUnpostBehavior,
Packit b099d7
	sizeof(unsigned char), Offset(screen.unpostBehavior),
Packit b099d7
	XmRImmediate, (XtPointer)XmUNPOST_AND_REPLAY,
Packit b099d7
    },
Packit b099d7
    {
Packit b099d7
	XmNfont, XmCFont, XmRFontStruct,
Packit b099d7
	sizeof(XFontStruct *), Offset(screen.font_struct),
Packit b099d7
	XmRString, XmDEFAULT_FONT,
Packit b099d7
    },
Packit b099d7
    {
Packit b099d7
	XmNhorizontalFontUnit, XmCHorizontalFontUnit, XmRInt,
Packit b099d7
	sizeof(int), Offset(screen.h_unit),
Packit b099d7
	XmRImmediate, (XtPointer) RESOURCE_DEFAULT,
Packit b099d7
    },
Packit b099d7
    {
Packit b099d7
	XmNverticalFontUnit, XmCVerticalFontUnit, XmRInt,
Packit b099d7
	sizeof(int), Offset(screen.v_unit),
Packit b099d7
	XmRImmediate, (XtPointer) RESOURCE_DEFAULT,
Packit b099d7
    },
Packit b099d7
    {
Packit b099d7
        XmNmoveOpaque, XmCMoveOpaque, XmRBoolean,
Packit b099d7
        sizeof(unsigned char), Offset(screen.moveOpaque),
Packit b099d7
        XmRImmediate, (XtPointer) False,
Packit b099d7
    },
Packit b099d7
    {
Packit b099d7
        XmNcolorCalculationProc, XmCColorCalculationProc, XmRProc,
Packit b099d7
        sizeof(XtProc), Offset(screen.color_calc_proc),
Packit b099d7
        XmRImmediate, (XtPointer) NULL,
Packit b099d7
    },
Packit b099d7
    {
Packit b099d7
        XmNcolorAllocationProc, XmCColorAllocationProc, XmRProc,
Packit b099d7
        sizeof(XtProc), Offset(screen.color_alloc_proc),
Packit b099d7
        XmRImmediate, (XtPointer) NULL,
Packit b099d7
    },
Packit b099d7
    {
Packit b099d7
        XmNbitmapConversionModel, XmCBitmapConversionModel, 
Packit b099d7
        XmRBitmapConversionModel,
Packit b099d7
        sizeof(XtEnum), Offset(screen.bitmap_conversion_model),
Packit b099d7
        XmRImmediate, (XtPointer) XmMATCH_DEPTH,
Packit b099d7
    },
Packit b099d7
    {
Packit b099d7
        XmNuserData, XmCUserData, XmRPointer, 
Packit b099d7
        sizeof(XtPointer), Offset(screen.user_data),
Packit b099d7
        XmRPointer, (XtPointer) NULL
Packit b099d7
    },
Packit b099d7
    {
Packit b099d7
	XmNinsensitiveStippleBitmap, XmCInsensitiveStippleBitmap,
Packit b099d7
	XmRNoScalingBitmap,
Packit b099d7
	sizeof(Pixmap), Offset(screen.insensitive_stipple_bitmap),
Packit b099d7
	XmRString, XmS50_foreground
Packit b099d7
    },
Packit b099d7
#ifdef DEFAULT_GLYPH_PIXMAP
Packit b099d7
    {
Packit b099d7
        XmNdefaultGlyphPixmap, XmCDefaultGlyphPixmap,
Packit b099d7
	/* if you move this one as a real pixmap,
Packit b099d7
	   change the code in the buttons as well, 
Packit b099d7
	   move the copyplane into a copyarea */
Packit b099d7
	XmRBitmap,
Packit b099d7
	sizeof (Pixmap), Offset(screen.default_glyph_pixmap),
Packit b099d7
	XmRImmediate, (XtPointer) XmUNSPECIFIED_PIXMAP
Packit b099d7
     },
Packit b099d7
#endif
Packit b099d7
		
Packit b099d7
};
Packit b099d7
Packit b099d7
#undef Offset
Packit b099d7
Packit b099d7
Packit b099d7
/***************************************************************************
Packit b099d7
 *
Packit b099d7
 * Class Record
Packit b099d7
 *
Packit b099d7
 ***************************************************************************/
Packit b099d7
Packit b099d7
/***************************************************************************
Packit b099d7
 *
Packit b099d7
 * Class Record
Packit b099d7
 *
Packit b099d7
 ***************************************************************************/
Packit b099d7
Packit b099d7
static XmBaseClassExtRec baseClassExtRec = {
Packit b099d7
    NULL,
Packit b099d7
    NULLQUARK,
Packit b099d7
    XmBaseClassExtVersion,
Packit b099d7
    sizeof(XmBaseClassExtRec),
Packit b099d7
    NULL,				/* InitializePrehook	*/
Packit b099d7
    NULL,				/* SetValuesPrehook	*/
Packit b099d7
    NULL,				/* InitializePosthook	*/
Packit b099d7
    NULL,				/* SetValuesPosthook	*/
Packit b099d7
    NULL,				/* secondaryObjectClass	*/
Packit b099d7
    NULL,				/* secondaryCreate	*/
Packit b099d7
    NULL,          		        /* getSecRes data	*/
Packit b099d7
    { 0 },     			        /* fastSubclass flags	*/
Packit b099d7
    NULL,				/* getValuesPrehook	*/
Packit b099d7
    NULL,				/* getValuesPosthook	*/
Packit b099d7
    NULL,               /* classPartInitPrehook */
Packit b099d7
    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
    NULL,               /* widgetNavigable      */
Packit b099d7
    NULL                /* focusChange          */
Packit b099d7
};
Packit b099d7
Packit b099d7
Packit b099d7
externaldef(xmscreenclassrec)
Packit b099d7
XmScreenClassRec xmScreenClassRec = {
Packit b099d7
    {	
Packit b099d7
	(WidgetClass) &coreClassRec, /* superclass		*/   
Packit b099d7
	"XmScreen",			/* class_name 		*/   
Packit b099d7
	sizeof(XmScreenRec), 		/* size 		*/   
Packit b099d7
	ClassInitialize,		/* Class Initializer 	*/   
Packit b099d7
	ClassPartInitialize,		/* class_part_init 	*/ 
Packit b099d7
	FALSE, 				/* Class init'ed ? 	*/   
Packit b099d7
	Initialize,		        /* initialize         	*/   
Packit b099d7
	NULL, 				/* initialize_notify    */ 
Packit b099d7
	NULL,	 			/* 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
	Destroy,			/* destroy            	*/   
Packit b099d7
	NULL,		 		/* resize             	*/   
Packit b099d7
	NULL, 				/* expose             	*/   
Packit b099d7
	SetValues, 		        /* set_values         	*/   
Packit b099d7
	NULL, 				/* set_values_hook      */ 
Packit b099d7
	NULL,			 	/* set_values_almost    */ 
Packit b099d7
	NULL,				/* get_values_hook      */ 
Packit b099d7
	NULL, 				/* accept_focus       	*/   
Packit b099d7
	XtVersion, 			/* intrinsics version 	*/   
Packit b099d7
	NULL, 				/* callback offsets   	*/   
Packit b099d7
	NULL,				/* tm_table           	*/   
Packit b099d7
	NULL, 				/* query_geometry       */ 
Packit b099d7
	NULL, 				/* screen_accelerator  */ 
Packit b099d7
	(XtPointer)&baseClassExtRec,	/* extension            */ 
Packit b099d7
    },	
Packit b099d7
    {					/* desktop		*/
Packit b099d7
	NULL,				/* child_class		*/
Packit b099d7
	InsertChild,		        /* insert_child		*/
Packit b099d7
	DeleteChild,		        /* delete_child		*/
Packit b099d7
	NULL,				/* extension		*/
Packit b099d7
    },
Packit b099d7
    {	
Packit b099d7
	NULL,
Packit b099d7
    },
Packit b099d7
};
Packit b099d7
Packit b099d7
externaldef(xmscreenclass) WidgetClass 
Packit b099d7
      xmScreenClass = (WidgetClass) (&xmScreenClassRec);
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
externaldef(xmscreenquark) XrmQuark	_XmInvalidCursorIconQuark = NULLQUARK;
Packit b099d7
externaldef(xmscreenquark) XrmQuark	_XmValidCursorIconQuark = NULLQUARK;
Packit b099d7
externaldef(xmscreenquark) XrmQuark	_XmNoneCursorIconQuark = NULLQUARK;
Packit b099d7
externaldef(xmscreenquark) XrmQuark	_XmDefaultDragIconQuark = NULLQUARK;
Packit b099d7
externaldef(xmscreenquark) XrmQuark	_XmMoveCursorIconQuark = NULLQUARK;
Packit b099d7
externaldef(xmscreenquark) XrmQuark	_XmCopyCursorIconQuark = NULLQUARK;
Packit b099d7
externaldef(xmscreenquark) XrmQuark	_XmLinkCursorIconQuark = NULLQUARK;
Packit b099d7
Packit b099d7
static void 
Packit b099d7
ClassInitialize( void )
Packit b099d7
{
Packit b099d7
  baseClassExtRec.record_type = XmQmotif;
Packit b099d7
Packit b099d7
  _XmInvalidCursorIconQuark = XrmPermStringToQuark("defaultInvalidCursorIcon");
Packit b099d7
  _XmValidCursorIconQuark = XrmPermStringToQuark("defaultValidCursorIcon");
Packit b099d7
  _XmNoneCursorIconQuark = XrmPermStringToQuark("defaultNoneCursorIcon");
Packit b099d7
  _XmDefaultDragIconQuark = XrmPermStringToQuark("defaultSourceCursorIcon"); 
Packit b099d7
  _XmMoveCursorIconQuark = XrmPermStringToQuark("defaultMoveCursorIcon"); 
Packit b099d7
  _XmCopyCursorIconQuark = XrmPermStringToQuark("defaultCopyCursorIcon"); 
Packit b099d7
  _XmLinkCursorIconQuark = XrmPermStringToQuark("defaultLinkCursorIcon"); 
Packit b099d7
}    
Packit b099d7
Packit b099d7
Packit b099d7
static void 
Packit b099d7
ClassPartInitialize( 
Packit b099d7
	WidgetClass wc )
Packit b099d7
{
Packit b099d7
    _XmFastSubclassInit(wc, XmSCREEN_BIT);
Packit b099d7
 
Packit b099d7
}    
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  GetUnitFromFont
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
static void 
Packit b099d7
GetUnitFromFont(
Packit b099d7
	Display * display,
Packit b099d7
	XFontStruct * fst,
Packit b099d7
	int * ph_unit,
Packit b099d7
	int * pv_unit)
Packit b099d7
{
Packit b099d7
    enum { XmAAVERAGE_WIDTH, XmAPIXEL_SIZE, XmARESOLUTION_Y, NUM_ATOMS };
Packit b099d7
    static char *atom_names[] = { 
Packit b099d7
      XmIAVERAGE_WIDTH, XmIPIXEL_SIZE, XmIRESOLUTION_Y };
Packit b099d7
    Atom atoms[XtNumber(atom_names)];
Packit b099d7
    unsigned long pixel_s, avg_w, point_s, resolution_y;
Packit b099d7
    unsigned long font_unit_return;
Packit b099d7
Packit b099d7
    if (fst) {
Packit b099d7
      assert(XtNumber(atom_names) == NUM_ATOMS);
Packit b099d7
      XInternAtoms(display, atom_names, XtNumber(atom_names), TRUE, atoms);
Packit b099d7
Packit b099d7
              /* Horizontal units */
Packit b099d7
      if (ph_unit) {
Packit b099d7
	  if (atoms[XmAAVERAGE_WIDTH] && 
Packit b099d7
	      XGetFontProperty(fst, atoms[XmAAVERAGE_WIDTH], &avg_w)) {
Packit b099d7
	      *ph_unit = (int) ((float) (avg_w / 10) + 0.5) ;
Packit b099d7
	  } else if (XGetFontProperty (fst, XA_QUAD_WIDTH, &font_unit_return)){
Packit b099d7
	      *ph_unit = font_unit_return ;
Packit b099d7
	  } else {
Packit b099d7
	      *ph_unit = (int) ((fst->min_bounds.width + 
Packit b099d7
				 fst-> max_bounds.width) / 2.3) + 0.5;
Packit b099d7
	  }
Packit b099d7
      }
Packit b099d7
Packit b099d7
              /* Vertical units */
Packit b099d7
      if (pv_unit) {
Packit b099d7
	  if (XGetFontProperty(fst, atoms[XmAPIXEL_SIZE], &pixel_s)) {
Packit b099d7
	      *pv_unit = (int) (((float) pixel_s) / 1.8) + 0.5;
Packit b099d7
	  } else if ((XGetFontProperty(fst, XA_POINT_SIZE, &point_s)) &&
Packit b099d7
		     (XGetFontProperty(fst, atoms[XmARESOLUTION_Y], 
Packit b099d7
				       &resolution_y))) {
Packit b099d7
	      float ps, ry, tmp;
Packit b099d7
Packit b099d7
	      ps = point_s;
Packit b099d7
	      ry = resolution_y;
Packit b099d7
Packit b099d7
	      tmp = (ps * ry) / 1400.0;
Packit b099d7
Packit b099d7
	      *pv_unit = (int) (tmp + 0.5) ;
Packit b099d7
	  } else {
Packit b099d7
	      *pv_unit = (int) ((float) (fst->max_bounds.ascent + 
Packit b099d7
					 fst->max_bounds.descent) / 2.2) + 0.5;
Packit b099d7
	  }
Packit b099d7
      }
Packit b099d7
Packit b099d7
    } else {  /* no X fontstruct */
Packit b099d7
      if (ph_unit) *ph_unit = DEFAULT_QUAD_WIDTH ;
Packit b099d7
      if (pv_unit) *pv_unit = DEFAULT_QUAD_WIDTH ;
Packit b099d7
    }
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  ScreenInitialize
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void 
Packit b099d7
Initialize(
Packit b099d7
        Widget requested_widget,
Packit b099d7
        Widget new_widget,
Packit b099d7
        ArgList args,
Packit b099d7
        Cardinal *num_args )
Packit b099d7
{
Packit b099d7
    XmScreen     xmScreen = (XmScreen)new_widget;
Packit b099d7
    Display      *display = XtDisplay(new_widget);
Packit b099d7
Packit b099d7
    xmScreen->screen.screenInfo = NULL;
Packit b099d7
Packit b099d7
    XQueryBestCursor(display,
Packit b099d7
		     RootWindowOfScreen(XtScreen(xmScreen)),
Packit b099d7
		     1024, 1024,
Packit b099d7
		     &xmScreen->screen.maxCursorWidth, 
Packit b099d7
		     &xmScreen->screen.maxCursorHeight);
Packit b099d7
Packit b099d7
    xmScreen->screen.nullCursor = None;
Packit b099d7
    xmScreen->screen.cursorCache = NULL;
Packit b099d7
    xmScreen->screen.scratchPixmaps = (XtPointer)
Packit b099d7
      _XmAllocHashTable(20, MatchPixmap, HashPixmap);
Packit b099d7
    xmScreen->screen.inUsePixmaps = (XtPointer) 
Packit b099d7
      _XmAllocHashTable(20, NULL, NULL);
Packit b099d7
    xmScreen->screen.xmStateCursorIcon = NULL;
Packit b099d7
    xmScreen->screen.xmMoveCursorIcon = NULL;
Packit b099d7
    xmScreen->screen.xmCopyCursorIcon = NULL;
Packit b099d7
    xmScreen->screen.xmLinkCursorIcon = NULL;
Packit b099d7
    xmScreen->screen.xmSourceCursorIcon = NULL;
Packit b099d7
    xmScreen->screen.mwmPresent = XmIsMotifWMRunning( new_widget) ;
Packit b099d7
    xmScreen->screen.numReparented = 0;
Packit b099d7
    xmScreen->desktop.num_children = 0;
Packit b099d7
    xmScreen->desktop.children = NULL;
Packit b099d7
    xmScreen->desktop.num_slots = 0;
Packit b099d7
Packit b099d7
    if(!XmRepTypeValidValue(XmRID_UNPOST_BEHAVIOR,
Packit b099d7
                          xmScreen->screen.unpostBehavior,
Packit b099d7
                          new_widget)) {
Packit b099d7
      xmScreen->screen.unpostBehavior = XmUNPOST_AND_REPLAY;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /* font unit stuff, priority to actual unit values, if they haven't
Packit b099d7
     been set yet, compute from the font, otherwise, stay unchanged */
Packit b099d7
Packit b099d7
    if (xmScreen->screen.h_unit == RESOURCE_DEFAULT) 
Packit b099d7
	GetUnitFromFont(display, xmScreen->screen.font_struct, 
Packit b099d7
			&xmScreen->screen.h_unit, NULL);
Packit b099d7
Packit b099d7
    if (xmScreen->screen.v_unit == RESOURCE_DEFAULT)
Packit b099d7
	GetUnitFromFont(display, xmScreen->screen.font_struct, 
Packit b099d7
			NULL, &xmScreen->screen.v_unit);
Packit b099d7
Packit b099d7
    xmScreen->screen.screenInfo = (XtPointer) XtNew(XmScreenInfo);
Packit b099d7
Packit b099d7
    ((XmScreenInfo *)(xmScreen->screen.screenInfo))->menu_state = 
Packit b099d7
		(XtPointer)NULL;
Packit b099d7
    ((XmScreenInfo *)(xmScreen->screen.screenInfo))->destroyCallbackAdded = 
Packit b099d7
		False;
Packit b099d7
Packit b099d7
    
Packit b099d7
#ifdef DEFAULT_GLYPH_PIXMAP
Packit b099d7
    if (xmScreen->screen.default_glyph_pixmap != XmUNSPECIFIED_PIXMAP) {
Packit b099d7
	(void) XmeGetPixmapData(XtScreen(new_widget),
Packit b099d7
			 xmScreen->screen.default_glyph_pixmap,
Packit b099d7
			 NULL, NULL, NULL, NULL, NULL, NULL, 
Packit b099d7
			 &(xmScreen->screen.default_glyph_pixmap_width), 
Packit b099d7
			 &(xmScreen->screen.default_glyph_pixmap_height));
Packit b099d7
    }
Packit b099d7
#endif
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  SetValues
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
/* ARGSUSED */
Packit b099d7
static Boolean
Packit b099d7
SetValues(
Packit b099d7
        Widget current,
Packit b099d7
        Widget requested,
Packit b099d7
        Widget new_w,
Packit b099d7
        ArgList args,
Packit b099d7
        Cardinal *num_args )
Packit b099d7
{
Packit b099d7
    XmScreen		newScr = (XmScreen)new_w;
Packit b099d7
    XmScreen		oldScr = (XmScreen)current;
Packit b099d7
    Display * display = XtDisplay( new_w);
Packit b099d7
Packit b099d7
    if(!XmRepTypeValidValue(XmRID_UNPOST_BEHAVIOR,
Packit b099d7
                          newScr->screen.unpostBehavior, new_w)) {
Packit b099d7
      newScr->screen.unpostBehavior = XmUNPOST_AND_REPLAY;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     *  If we are setting a default cursor icon, verify that
Packit b099d7
     *  it has the same screen as the new XmScreen.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    /* defaultNoneCursorIcon */
Packit b099d7
Packit b099d7
    if (newScr->screen.defaultNoneCursorIcon != 
Packit b099d7
	    oldScr->screen.defaultNoneCursorIcon &&
Packit b099d7
	newScr->screen.defaultNoneCursorIcon != NULL &&
Packit b099d7
	XtScreenOfObject (XtParent (newScr->screen.defaultNoneCursorIcon)) !=
Packit b099d7
	     XtScreen (newScr)) {
Packit b099d7
Packit b099d7
	XmeWarning( (Widget) new_w, MESSAGE1);
Packit b099d7
	newScr->screen.defaultNoneCursorIcon =
Packit b099d7
	    oldScr->screen.defaultNoneCursorIcon;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /* defaultValidCursorIcon */
Packit b099d7
Packit b099d7
    if (newScr->screen.defaultValidCursorIcon != 
Packit b099d7
	    oldScr->screen.defaultValidCursorIcon &&
Packit b099d7
	newScr->screen.defaultValidCursorIcon != NULL &&
Packit b099d7
	XtScreenOfObject (XtParent (newScr->screen.defaultValidCursorIcon)) !=
Packit b099d7
	     XtScreen (newScr)) {
Packit b099d7
Packit b099d7
	XmeWarning( (Widget) new_w, MESSAGE1);
Packit b099d7
	newScr->screen.defaultValidCursorIcon =
Packit b099d7
	    oldScr->screen.defaultValidCursorIcon;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /* defaultInvalidCursorIcon */
Packit b099d7
Packit b099d7
    if (newScr->screen.defaultInvalidCursorIcon != 
Packit b099d7
	    oldScr->screen.defaultInvalidCursorIcon &&
Packit b099d7
	newScr->screen.defaultInvalidCursorIcon != NULL &&
Packit b099d7
	XtScreenOfObject (XtParent (newScr->screen.defaultInvalidCursorIcon)) !=
Packit b099d7
	     XtScreen (newScr)) {
Packit b099d7
Packit b099d7
	XmeWarning( (Widget) new_w, MESSAGE1);
Packit b099d7
	newScr->screen.defaultInvalidCursorIcon =
Packit b099d7
	    oldScr->screen.defaultInvalidCursorIcon;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /* defaultMoveCursorIcon */
Packit b099d7
Packit b099d7
    if (newScr->screen.defaultMoveCursorIcon != 
Packit b099d7
	    oldScr->screen.defaultMoveCursorIcon &&
Packit b099d7
	newScr->screen.defaultMoveCursorIcon != NULL &&
Packit b099d7
	XtScreenOfObject (XtParent (newScr->screen.defaultMoveCursorIcon)) !=
Packit b099d7
	     XtScreen (newScr)) {
Packit b099d7
Packit b099d7
	XmeWarning( (Widget) new_w, MESSAGE1);
Packit b099d7
	newScr->screen.defaultMoveCursorIcon =
Packit b099d7
	    oldScr->screen.defaultMoveCursorIcon;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /* defaultCopyCursorIcon */
Packit b099d7
Packit b099d7
    if (newScr->screen.defaultCopyCursorIcon != 
Packit b099d7
	    oldScr->screen.defaultCopyCursorIcon &&
Packit b099d7
	newScr->screen.defaultCopyCursorIcon != NULL &&
Packit b099d7
	XtScreenOfObject (XtParent (newScr->screen.defaultCopyCursorIcon)) !=
Packit b099d7
	     XtScreen (newScr)) {
Packit b099d7
Packit b099d7
	XmeWarning( (Widget) new_w, MESSAGE1);
Packit b099d7
	newScr->screen.defaultCopyCursorIcon =
Packit b099d7
	    oldScr->screen.defaultCopyCursorIcon;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /* defaultLinkCursorIcon */
Packit b099d7
Packit b099d7
    if (newScr->screen.defaultLinkCursorIcon != 
Packit b099d7
	    oldScr->screen.defaultLinkCursorIcon &&
Packit b099d7
	newScr->screen.defaultLinkCursorIcon != NULL &&
Packit b099d7
	XtScreenOfObject (XtParent (newScr->screen.defaultLinkCursorIcon)) !=
Packit b099d7
	     XtScreen (newScr)) {
Packit b099d7
Packit b099d7
	XmeWarning( (Widget) new_w, MESSAGE1);
Packit b099d7
	newScr->screen.defaultLinkCursorIcon =
Packit b099d7
	    oldScr->screen.defaultLinkCursorIcon;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /* defaultSourceCursorIcon */
Packit b099d7
Packit b099d7
    if (newScr->screen.defaultSourceCursorIcon != 
Packit b099d7
	    oldScr->screen.defaultSourceCursorIcon &&
Packit b099d7
	newScr->screen.defaultSourceCursorIcon != NULL &&
Packit b099d7
	XtScreenOfObject (XtParent (newScr->screen.defaultSourceCursorIcon)) !=
Packit b099d7
	     XtScreen (newScr)) {
Packit b099d7
Packit b099d7
	XmeWarning( (Widget) new_w, MESSAGE1);
Packit b099d7
	newScr->screen.defaultSourceCursorIcon =
Packit b099d7
	    oldScr->screen.defaultSourceCursorIcon;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /* font unit stuff, priority to actual unit values, if the
Packit b099d7
       font has changed but not the unit values, report the change,
Packit b099d7
       otherwise, use the unit value - i.e do nothing */
Packit b099d7
Packit b099d7
    if (newScr->screen.font_struct->fid != 
Packit b099d7
	oldScr->screen.font_struct->fid) {
Packit b099d7
	
Packit b099d7
	if (newScr->screen.h_unit == oldScr->screen.h_unit) {
Packit b099d7
	    GetUnitFromFont(display, newScr->screen.font_struct, 
Packit b099d7
			    &newScr->screen.h_unit, NULL);
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if (newScr->screen.v_unit == oldScr->screen.v_unit) {
Packit b099d7
	    GetUnitFromFont(display, newScr->screen.font_struct, 
Packit b099d7
			    NULL, &newScr->screen.v_unit);
Packit b099d7
	}
Packit b099d7
    }    
Packit b099d7
	
Packit b099d7
    return FALSE ;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  Destroy
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void 
Packit b099d7
Destroy(
Packit b099d7
        Widget widget )
Packit b099d7
{
Packit b099d7
    XmScreen		xmScreen = (XmScreen)widget;
Packit b099d7
    XmDragCursorCache 	prevCache, cache;
Packit b099d7
    XmHashTable		tab;
Packit b099d7
Packit b099d7
    /* destroy any default icons created by Xm */
Packit b099d7
Packit b099d7
    if (xmScreen->screen.xmStateCursorIcon != NULL) {
Packit b099d7
	_XmDestroyDefaultDragIcon (xmScreen->screen.xmStateCursorIcon);
Packit b099d7
    }
Packit b099d7
    if (xmScreen->screen.xmMoveCursorIcon != NULL) {
Packit b099d7
	_XmDestroyDefaultDragIcon (xmScreen->screen.xmMoveCursorIcon);
Packit b099d7
    }
Packit b099d7
    if (xmScreen->screen.xmCopyCursorIcon != NULL) {
Packit b099d7
	_XmDestroyDefaultDragIcon (xmScreen->screen.xmCopyCursorIcon);
Packit b099d7
    }
Packit b099d7
    if (xmScreen->screen.xmLinkCursorIcon != NULL) {
Packit b099d7
	_XmDestroyDefaultDragIcon (xmScreen->screen.xmLinkCursorIcon);
Packit b099d7
    }
Packit b099d7
    if (xmScreen->screen.xmSourceCursorIcon != NULL) {
Packit b099d7
	_XmDestroyDefaultDragIcon (xmScreen->screen.xmSourceCursorIcon);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    XtFree((char *) xmScreen->desktop.children);
Packit b099d7
Packit b099d7
    /* free the cursorCache and the pixmapCache */
Packit b099d7
    cache = xmScreen->screen.cursorCache;
Packit b099d7
    while(cache) {
Packit b099d7
	prevCache = cache;
Packit b099d7
	if (cache->cursor)
Packit b099d7
	  XFreeCursor(XtDisplay(xmScreen), cache->cursor);
Packit b099d7
	cache = cache->next;
Packit b099d7
	XtFree((char *)prevCache);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    _XmProcessLock();
Packit b099d7
    tab = (XmHashTable) xmScreen->screen.scratchPixmaps;
Packit b099d7
    _XmMapHashTable(tab, FreePixmap, xmScreen);
Packit b099d7
    _XmFreeHashTable(tab);
Packit b099d7
    _XmFreeHashTable((XmHashTable) xmScreen->screen.inUsePixmaps);
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
Packit b099d7
    XtFree((char *) xmScreen->screen.screenInfo);
Packit b099d7
Packit b099d7
    /* need to remove pixmap and GC related to this screen */
Packit b099d7
    _XmCleanPixmapCache (XtScreen(widget), NULL);
Packit b099d7
}
Packit b099d7
Packit b099d7
static void 
Packit b099d7
InsertChild(
Packit b099d7
        Widget wid )
Packit b099d7
{
Packit b099d7
    XmDesktopObject w = (XmDesktopObject) wid ;
Packit b099d7
    register Cardinal	     	position;
Packit b099d7
    register Cardinal        	i;
Packit b099d7
    register XmScreen 	cw;
Packit b099d7
    register WidgetList      	children;
Packit b099d7
    
Packit b099d7
    cw = (XmScreen) w->desktop.parent;
Packit b099d7
    children = cw->desktop.children;
Packit b099d7
    
Packit b099d7
    position = cw->desktop.num_children;
Packit b099d7
    
Packit b099d7
    if (cw->desktop.num_children == cw->desktop.num_slots) {
Packit b099d7
	/* Allocate more space */
Packit b099d7
	cw->desktop.num_slots +=  (cw->desktop.num_slots / 2) + 2;
Packit b099d7
	cw->desktop.children = children = 
Packit b099d7
	  (WidgetList) XtRealloc((char *) children,
Packit b099d7
		(unsigned) (cw->desktop.num_slots) * sizeof(Widget));
Packit b099d7
    }
Packit b099d7
    /* Ripple children up one space from "position" */
Packit b099d7
    for (i = cw->desktop.num_children; i > position; i--) {
Packit b099d7
	children[i] = children[i-1];
Packit b099d7
    }
Packit b099d7
    children[position] = (Widget)w;
Packit b099d7
    cw->desktop.num_children++;
Packit b099d7
}
Packit b099d7
Packit b099d7
static void 
Packit b099d7
DeleteChild(
Packit b099d7
        Widget wid )
Packit b099d7
{
Packit b099d7
    XmDesktopObject w = (XmDesktopObject) wid ;
Packit b099d7
    register Cardinal	     	position;
Packit b099d7
    register Cardinal	     	i;
Packit b099d7
    register XmScreen 	cw;
Packit b099d7
    
Packit b099d7
    cw = (XmScreen) w->desktop.parent;
Packit b099d7
    
Packit b099d7
    for (position = 0; position < cw->desktop.num_children; position++) {
Packit b099d7
        if (cw->desktop.children[position] == (Widget)w) {
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
    if (position == cw->desktop.num_children) return;
Packit b099d7
    
Packit b099d7
    /* Ripple children down one space from "position" */
Packit b099d7
    cw->desktop.num_children--;
Packit b099d7
    for (i = position; i < cw->desktop.num_children; i++) {
Packit b099d7
        cw->desktop.children[i] = cw->desktop.children[i+1];
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  _XmScreenRemoveFromCursorCache
Packit b099d7
 *
Packit b099d7
 *  Mark any cursor cache reference to the specified icon as deallocated.
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
void 
Packit b099d7
_XmScreenRemoveFromCursorCache(
Packit b099d7
    XmDragIconObject	icon )
Packit b099d7
{
Packit b099d7
    XmScreen	       xmScreen = (XmScreen) XmGetXmScreen(XtScreen(icon));
Packit b099d7
    XmDragCursorCache  ptr = xmScreen->screen.cursorCache;
Packit b099d7
    XmDragCursorCache  previous = xmScreen->screen.cursorCache;
Packit b099d7
    XmDragCursorCache  next;
Packit b099d7
Packit b099d7
    while (ptr) {
Packit b099d7
	next = ptr->next;
Packit b099d7
Packit b099d7
	if ((ptr->sourceIcon == icon) ||
Packit b099d7
	    (ptr->stateIcon == icon) ||
Packit b099d7
	    (ptr->opIcon == icon))
Packit b099d7
	  {
Packit b099d7
	    if (ptr->cursor)
Packit b099d7
	      XFreeCursor (XtDisplay(icon), ptr->cursor);
Packit b099d7
Packit b099d7
	    if ( xmScreen->screen.cursorCache == ptr )
Packit b099d7
		xmScreen->screen.cursorCache = ptr->next;
Packit b099d7
	    else
Packit b099d7
		previous->next = ptr->next;
Packit b099d7
Packit b099d7
	    XtFree ((char*)ptr);
Packit b099d7
	  }
Packit b099d7
	else
Packit b099d7
	    previous = ptr;
Packit b099d7
Packit b099d7
	ptr = next;
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
static Boolean
Packit b099d7
FreePixmap(XmHashKey k, XtPointer p, XtPointer client_data) 
Packit b099d7
{
Packit b099d7
  XmScreen	xmScreen = (XmScreen) client_data;
Packit b099d7
Packit b099d7
  XtFree((char*) k);
Packit b099d7
  XFreePixmap(XtDisplay(xmScreen), (Pixmap) p);
Packit b099d7
Packit b099d7
  return False;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  _XmScreenGetOperationIcon ()
Packit b099d7
 *
Packit b099d7
 *  Returns one of the three XmScreen operation cursor types. These aren't
Packit b099d7
 *  created ahead of time in order to let the client specify its own.
Packit b099d7
 *  If they haven't by now (a drag is in process) then we create our
Packit b099d7
 *  own. The name of the OperatonIcon can cause the built-in cursor data
Packit b099d7
 *  to get loaded in (if not specified in the resource file).
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
XmDragIconObject 
Packit b099d7
_XmScreenGetOperationIcon(
Packit b099d7
        Widget w,
Packit b099d7
#if NeedWidePrototypes
Packit b099d7
        unsigned int operation )
Packit b099d7
#else
Packit b099d7
        unsigned char operation )
Packit b099d7
#endif /* NeedWidePrototypes */
Packit b099d7
{
Packit b099d7
    XmScreen		xmScreen = (XmScreen) XmGetXmScreen(XtScreenOfObject(w));
Packit b099d7
    XrmQuark		nameQuark = NULLQUARK;
Packit b099d7
    XmDragIconObject	*ptr = NULL;
Packit b099d7
    XmDragIconObject	*pt2 = NULL;
Packit b099d7
Packit b099d7
    switch ((int) operation) {
Packit b099d7
	case XmDROP_MOVE:
Packit b099d7
	    ptr = &xmScreen->screen.defaultMoveCursorIcon;
Packit b099d7
	    pt2 = &xmScreen->screen.xmMoveCursorIcon;
Packit b099d7
	    nameQuark = _XmMoveCursorIconQuark;
Packit b099d7
	    break;
Packit b099d7
Packit b099d7
	case XmDROP_COPY:
Packit b099d7
	    ptr = &xmScreen->screen.defaultCopyCursorIcon;
Packit b099d7
	    pt2 = &xmScreen->screen.xmCopyCursorIcon;
Packit b099d7
	    nameQuark = _XmCopyCursorIconQuark;
Packit b099d7
	    break;
Packit b099d7
Packit b099d7
	case XmDROP_LINK:
Packit b099d7
	    ptr = &xmScreen->screen.defaultLinkCursorIcon;
Packit b099d7
	    pt2 = &xmScreen->screen.xmLinkCursorIcon;
Packit b099d7
	    nameQuark = _XmLinkCursorIconQuark;
Packit b099d7
	    break;
Packit b099d7
Packit b099d7
	default:
Packit b099d7
	    return (NULL);
Packit b099d7
    }
Packit b099d7
    if (*ptr == NULL) {
Packit b099d7
	if (*pt2 == NULL) {
Packit b099d7
	    *pt2 = (XmDragIconObject)
Packit b099d7
	        XmCreateDragIcon ((Widget) xmScreen,
Packit b099d7
			          XrmQuarkToString(nameQuark), NULL, 0);
Packit b099d7
	}
Packit b099d7
	*ptr = *pt2;
Packit b099d7
    }
Packit b099d7
    return *ptr;
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  _XmScreenGetStateIcon ()
Packit b099d7
 *
Packit b099d7
 *  Returns one of the three XmScreen state cursor types. These aren't
Packit b099d7
 *  created ahead of time in order to let the client specify its own.
Packit b099d7
 *  If they haven't by now (a drag is in process) then we create our
Packit b099d7
 *  own. The name of the StateIcon can cause the built-in cursor data
Packit b099d7
 *  to get loaded in (if not specified in the resource file).
Packit b099d7
 *  The default state cursors are the same XmDragIcon object.
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
XmDragIconObject 
Packit b099d7
_XmScreenGetStateIcon(
Packit b099d7
        Widget w,
Packit b099d7
#if NeedWidePrototypes
Packit b099d7
        unsigned int state )
Packit b099d7
#else
Packit b099d7
        unsigned char state )
Packit b099d7
#endif /* NeedWidePrototypes */
Packit b099d7
{
Packit b099d7
    XmScreen		xmScreen = (XmScreen) XmGetXmScreen(XtScreenOfObject(w));
Packit b099d7
    XrmQuark		nameQuark = NULLQUARK;
Packit b099d7
    XmDragIconObject	icon = NULL;
Packit b099d7
Packit b099d7
    switch(state) {
Packit b099d7
	default:
Packit b099d7
	case XmNO_DROP_SITE:
Packit b099d7
	    icon = xmScreen->screen.defaultNoneCursorIcon;
Packit b099d7
	    nameQuark = _XmNoneCursorIconQuark;
Packit b099d7
	    break;
Packit b099d7
Packit b099d7
	case XmVALID_DROP_SITE:
Packit b099d7
	    icon = xmScreen->screen.defaultValidCursorIcon;
Packit b099d7
	    nameQuark = _XmValidCursorIconQuark;
Packit b099d7
	    break;
Packit b099d7
Packit b099d7
	case XmINVALID_DROP_SITE:
Packit b099d7
	    icon = xmScreen->screen.defaultInvalidCursorIcon;
Packit b099d7
	    nameQuark = _XmInvalidCursorIconQuark;
Packit b099d7
	    break;
Packit b099d7
    }
Packit b099d7
    if (icon == NULL) {
Packit b099d7
Packit b099d7
	/*
Packit b099d7
	 *  We need to create the default state icons.
Packit b099d7
	 *  Set all uncreated state icons to the same XmDragIcon object.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	if (xmScreen->screen.xmStateCursorIcon == NULL) {
Packit b099d7
	    xmScreen->screen.xmStateCursorIcon = (XmDragIconObject)
Packit b099d7
	        XmCreateDragIcon ((Widget) xmScreen,
Packit b099d7
			          XrmQuarkToString(nameQuark),
Packit b099d7
				  NULL, 0);
Packit b099d7
	}
Packit b099d7
	icon = xmScreen->screen.xmStateCursorIcon;
Packit b099d7
Packit b099d7
	if (xmScreen->screen.defaultNoneCursorIcon == NULL) {
Packit b099d7
	    xmScreen->screen.defaultNoneCursorIcon = icon;
Packit b099d7
	}
Packit b099d7
	if (xmScreen->screen.defaultValidCursorIcon == NULL) {
Packit b099d7
	    xmScreen->screen.defaultValidCursorIcon = icon;
Packit b099d7
	}
Packit b099d7
	if (xmScreen->screen.defaultInvalidCursorIcon == NULL) {
Packit b099d7
	    xmScreen->screen.defaultInvalidCursorIcon = icon;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
    return (icon);
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  _XmScreenGetSourceIcon ()
Packit b099d7
 *
Packit b099d7
 *  Returns the XmScreen source cursor types.  This isn't created ahead of
Packit b099d7
 *  time in order to let the client specify its own.  If it hasn't by now
Packit b099d7
 *  (a drag is in process) then we create our own.
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
XmDragIconObject 
Packit b099d7
_XmScreenGetSourceIcon(
Packit b099d7
        Widget w )
Packit b099d7
{
Packit b099d7
    XmScreen	xmScreen = (XmScreen) XmGetXmScreen(XtScreenOfObject(w));
Packit b099d7
Packit b099d7
    if (xmScreen->screen.defaultSourceCursorIcon == NULL) {
Packit b099d7
Packit b099d7
	if (xmScreen->screen.xmSourceCursorIcon == NULL) {
Packit b099d7
	    xmScreen->screen.xmSourceCursorIcon = (XmDragIconObject)
Packit b099d7
	        XmCreateDragIcon ((Widget) xmScreen,
Packit b099d7
			          XrmQuarkToString(_XmDefaultDragIconQuark),
Packit b099d7
			          NULL, 0);
Packit b099d7
	}
Packit b099d7
	xmScreen->screen.defaultSourceCursorIcon = 
Packit b099d7
	    xmScreen->screen.xmSourceCursorIcon;
Packit b099d7
    }
Packit b099d7
    return xmScreen->screen.defaultSourceCursorIcon;
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  _XmAllocScratchPixmap
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
static Boolean 
Packit b099d7
MatchPixmap(XmHashKey k1, XmHashKey k2)
Packit b099d7
{
Packit b099d7
  XmScratchPixmapKey key1 = (XmScratchPixmapKey) k1;
Packit b099d7
  XmScratchPixmapKey key2 = (XmScratchPixmapKey) k2;
Packit b099d7
Packit b099d7
  return(key1 -> height == key2 -> height &&
Packit b099d7
	 key1 -> width == key2 -> width &&
Packit b099d7
	 key1 -> depth == key2 -> depth);
Packit b099d7
}
Packit b099d7
Packit b099d7
static XmHashValue 
Packit b099d7
HashPixmap(XmHashKey k)
Packit b099d7
{
Packit b099d7
  XmScratchPixmapKey key = (XmScratchPixmapKey) k;
Packit b099d7
Packit b099d7
  return(key -> height + key -> width + key -> depth);
Packit b099d7
}
Packit b099d7
Packit b099d7
Pixmap 
Packit b099d7
_XmAllocScratchPixmap(
Packit b099d7
        XmScreen xmScreen,
Packit b099d7
#if NeedWidePrototypes
Packit b099d7
        unsigned int depth,
Packit b099d7
        int width,
Packit b099d7
        int height )
Packit b099d7
#else
Packit b099d7
        Cardinal depth,
Packit b099d7
        Dimension width,
Packit b099d7
        Dimension height )
Packit b099d7
#endif /* NeedWidePrototypes */
Packit b099d7
{
Packit b099d7
    XmHashTable		scratchTable =
Packit b099d7
      (XmHashTable) xmScreen->screen.scratchPixmaps;
Packit b099d7
    XmHashTable		inUseTable = 
Packit b099d7
      (XmHashTable) xmScreen->screen.inUsePixmaps;
Packit b099d7
    Pixmap		scratchPixmap = None;
Packit b099d7
    XmScratchPixmapKeyRec	key;
Packit b099d7
    XmScratchPixmapKey	returned_key;
Packit b099d7
Packit b099d7
    key.height = height;
Packit b099d7
    key.width = width;
Packit b099d7
    key.depth = depth;
Packit b099d7
Packit b099d7
    _XmProcessLock();
Packit b099d7
    scratchPixmap = (Pixmap) _XmGetHashEntry(scratchTable, &key);
Packit b099d7
Packit b099d7
    if (scratchPixmap != None) {
Packit b099d7
      /* remove from free table */
Packit b099d7
      returned_key = (XmScratchPixmapKey) 
Packit b099d7
	_XmRemoveHashEntry(scratchTable, &key);
Packit b099d7
    } else {
Packit b099d7
      returned_key = XtNew(XmScratchPixmapKeyRec);
Packit b099d7
      returned_key->width = width;
Packit b099d7
      returned_key->height = height;
Packit b099d7
      returned_key->depth = depth;
Packit b099d7
      scratchPixmap = XCreatePixmap (XtDisplay(xmScreen),
Packit b099d7
				     RootWindowOfScreen(XtScreen(xmScreen)),
Packit b099d7
				     width, height,
Packit b099d7
				     depth);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /* Place key in inUse table */
Packit b099d7
    _XmAddHashEntry(inUseTable, (XmHashKey) scratchPixmap, returned_key);
Packit b099d7
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
    return(scratchPixmap);
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  _XmFreeScratchPixmap
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
void 
Packit b099d7
_XmFreeScratchPixmap(
Packit b099d7
        XmScreen xmScreen,
Packit b099d7
        Pixmap pixmap )
Packit b099d7
{
Packit b099d7
    XmHashTable scratchTable = (XmHashTable) xmScreen->screen.scratchPixmaps;
Packit b099d7
    XmHashTable inUseTable   = (XmHashTable) xmScreen->screen.inUsePixmaps;
Packit b099d7
    XmScratchPixmapKey returned_key;
Packit b099d7
Packit b099d7
    _XmProcessLock();
Packit b099d7
    returned_key = (XmScratchPixmapKey) 
Packit b099d7
      _XmGetHashEntry(inUseTable, (XmHashKey) pixmap);
Packit b099d7
Packit b099d7
    if (returned_key == NULL) {
Packit b099d7
      /* Bad,  this pixmap wasn't in the cache,  return */
Packit b099d7
      _XmProcessUnlock();
Packit b099d7
      return;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    _XmRemoveHashEntry(inUseTable, (XmHashKey) pixmap);
Packit b099d7
Packit b099d7
    _XmAddHashEntry(scratchTable, returned_key, (XtPointer) pixmap);
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  _XmGetDragCursorCachePtr ()
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
XmDragCursorCache * 
Packit b099d7
_XmGetDragCursorCachePtr(
Packit b099d7
        XmScreen xmScreen )
Packit b099d7
{
Packit b099d7
    return &xmScreen->screen.cursorCache;
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  XmeQueryBestCursorSize()
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
void 
Packit b099d7
XmeQueryBestCursorSize(
Packit b099d7
        Widget w,
Packit b099d7
        Dimension *width,
Packit b099d7
        Dimension *height )
Packit b099d7
{
Packit b099d7
    XmScreen	xmScreen;
Packit b099d7
    _XmWidgetToAppContext(w);
Packit b099d7
Packit b099d7
    _XmAppLock(app);
Packit b099d7
    xmScreen = (XmScreen) XmGetXmScreen(XtScreenOfObject(w));
Packit b099d7
    *width = (Dimension)xmScreen->screen.maxCursorWidth;
Packit b099d7
    *height = (Dimension)xmScreen->screen.maxCursorHeight;
Packit b099d7
    _XmAppUnlock(app);
Packit b099d7
    return;
Packit b099d7
}
Packit b099d7
Packit b099d7
static XmConst char nullBits[] = 
Packit b099d7
{ 
Packit b099d7
    0x00, 0x00, 0x00, 0x00,
Packit b099d7
    0x00, 0x00, 0x00, 0x00,
Packit b099d7
    0x00, 0x00, 0x00, 0x00,
Packit b099d7
    0x00, 0x00, 0x00, 0x00,
Packit b099d7
};
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  XmeGetNullCursor ()
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
Cursor 
Packit b099d7
XmeGetNullCursor(
Packit b099d7
        Widget w )
Packit b099d7
{
Packit b099d7
    XmScreen		xmScreen;
Packit b099d7
    Pixmap		pixmap;
Packit b099d7
    Cursor		cursor;
Packit b099d7
    XColor		foreground;
Packit b099d7
    XColor		background;
Packit b099d7
    _XmWidgetToAppContext(w);
Packit b099d7
Packit b099d7
    _XmAppLock(app);
Packit b099d7
    xmScreen = (XmScreen) XmGetXmScreen(XtScreenOfObject(w));
Packit b099d7
    if (xmScreen->screen.nullCursor == None) {
Packit b099d7
	foreground.pixel =  
Packit b099d7
	  background.pixel = 0;
Packit b099d7
	pixmap =
Packit b099d7
	  XCreatePixmapFromBitmapData(XtDisplayOfObject(w), 
Packit b099d7
				      RootWindowOfScreen(XtScreenOfObject(w)),
Packit b099d7
				      (char*)nullBits,
Packit b099d7
				      4, 4,  
Packit b099d7
				      0, 0,
Packit b099d7
				      1);
Packit b099d7
	cursor =
Packit b099d7
	  XCreatePixmapCursor(XtDisplayOfObject(w),
Packit b099d7
			      pixmap,
Packit b099d7
			      pixmap,
Packit b099d7
			      &foreground, &background,
Packit b099d7
			      0, 0);
Packit b099d7
	XFreePixmap(XtDisplayOfObject(w), pixmap);
Packit b099d7
	xmScreen->screen.nullCursor = cursor;
Packit b099d7
    }
Packit b099d7
    cursor = xmScreen->screen.nullCursor;
Packit b099d7
    _XmAppUnlock(app);
Packit b099d7
    return cursor;
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * The following set of functions support the menu cursor functionality.
Packit b099d7
 * They have moved from MenuUtil to here.
Packit b099d7
 */
Packit b099d7
Packit b099d7
Packit b099d7
/* Obsolete global per-display menu cursor manipulation functions */
Packit b099d7
/* Programs have to use XtSet/GetValues on the XmScreen object instead */
Packit b099d7
void
Packit b099d7
XmSetMenuCursor(
Packit b099d7
        Display *display,
Packit b099d7
        Cursor cursorId )
Packit b099d7
{
Packit b099d7
    XmScreen          xmScreen;
Packit b099d7
    Screen            *scr;
Packit b099d7
    int i ;
Packit b099d7
    _XmDisplayToAppContext(display);
Packit b099d7
Packit b099d7
    /* This function has no screen parameter, so we have to set the
Packit b099d7
       menucursor for _all_ the xmscreen available on this display. why?
Packit b099d7
       because when RowColumn will be getting a menucursor for a particular
Packit b099d7
       screen, it will have to get what the application has set using
Packit b099d7
       this function, not the default for that particular screen (which is
Packit b099d7
       what will happen if we were only setting the default display here) */
Packit b099d7
Packit b099d7
    _XmAppLock(app);
Packit b099d7
    for (i=0, scr = ScreenOfDisplay(display, i); i < ScreenCount(display);
Packit b099d7
       i++, scr = ScreenOfDisplay(display, i)) {
Packit b099d7
Packit b099d7
      xmScreen = (XmScreen) XmGetXmScreen(scr);
Packit b099d7
      xmScreen->screen.menuCursor = cursorId ;
Packit b099d7
    }
Packit b099d7
    _XmAppUnlock(app);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Cursor
Packit b099d7
XmGetMenuCursor(
Packit b099d7
        Display *display )
Packit b099d7
{
Packit b099d7
   XmScreen           xmScreen;
Packit b099d7
   Cursor	      cursor;
Packit b099d7
   _XmDisplayToAppContext(display);
Packit b099d7
Packit b099d7
   /* get the default screen menuCursor since there is no
Packit b099d7
      other information available to this function */
Packit b099d7
   _XmAppLock(app);
Packit b099d7
   xmScreen = (XmScreen) XmGetXmScreen(DefaultScreenOfDisplay(display));
Packit b099d7
   cursor = xmScreen->screen.menuCursor;
Packit b099d7
   _XmAppUnlock(app);
Packit b099d7
   return cursor;
Packit b099d7
}
Packit b099d7
Packit b099d7
/* a convenience for RowColumn */
Packit b099d7
Cursor
Packit b099d7
_XmGetMenuCursorByScreen(
Packit b099d7
        Screen * screen  )
Packit b099d7
{
Packit b099d7
   XmScreen           xmScreen;
Packit b099d7
Packit b099d7
   xmScreen = (XmScreen) XmGetXmScreen(screen);
Packit b099d7
   return(xmScreen->screen.menuCursor);
Packit b099d7
}
Packit b099d7
Packit b099d7
Boolean
Packit b099d7
_XmGetMoveOpaqueByScreen(
Packit b099d7
        Screen * screen  )
Packit b099d7
{
Packit b099d7
   XmScreen           xmScreen;
Packit b099d7
Packit b099d7
   xmScreen = (XmScreen) XmGetXmScreen(screen);
Packit b099d7
   return(xmScreen->screen.moveOpaque);
Packit b099d7
}
Packit b099d7
Packit b099d7
/* a convenience for RowColumn */
Packit b099d7
unsigned char
Packit b099d7
_XmGetUnpostBehavior(
Packit b099d7
        Widget wid )
Packit b099d7
{
Packit b099d7
   XmScreen	xmScreen = (XmScreen) XmGetXmScreen(XtScreenOfObject(wid));
Packit b099d7
Packit b099d7
   return(xmScreen->screen.unpostBehavior);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/**********************************************************************
Packit b099d7
 **********************************************************************
Packit b099d7
Packit b099d7
      Font unit handling functions
Packit b099d7
Packit b099d7
 **********************************************************************
Packit b099d7
 **********************************************************************/
Packit b099d7
Packit b099d7
/**********************************************************************
Packit b099d7
 *
Packit b099d7
 *  XmSetFontUnits
Packit b099d7
 *    Set the font_unit value for all screens.  These values can
Packit b099d7
 *    then be used later to process the font unit conversions.
Packit b099d7
 *
Packit b099d7
 **********************************************************************/
Packit b099d7
void
Packit b099d7
XmSetFontUnits(
Packit b099d7
        Display *display,
Packit b099d7
        int h_value,
Packit b099d7
        int v_value )
Packit b099d7
{
Packit b099d7
    XmScreen          xmScreen;
Packit b099d7
    Screen            *scr;
Packit b099d7
    int i ;
Packit b099d7
    _XmDisplayToAppContext(display);
Packit b099d7
Packit b099d7
    /* This function has no screen parameter, so we have to set the
Packit b099d7
       fontunit for _all_ the xmscreen available on this display. why?
Packit b099d7
       because when someone will be getting fontunits for a particular
Packit b099d7
       screen, it will have to get what the application has set using
Packit b099d7
       this function, not the default for that particular screen (which is
Packit b099d7
       what will happen if we were only setting the default display here) */
Packit b099d7
Packit b099d7
    _XmAppLock(app);
Packit b099d7
    for (i=0, scr = ScreenOfDisplay(display, i); i < ScreenCount(display);
Packit b099d7
       i++, scr = ScreenOfDisplay(display, i)) {
Packit b099d7
Packit b099d7
      xmScreen = (XmScreen) XmGetXmScreen(scr);
Packit b099d7
      xmScreen->screen.h_unit =  h_value ;
Packit b099d7
      xmScreen->screen.v_unit =  v_value ;
Packit b099d7
    }
Packit b099d7
    _XmAppUnlock(app);
Packit b099d7
}
Packit b099d7
Packit b099d7
/* DEPRECATED */
Packit b099d7
void
Packit b099d7
XmSetFontUnit(
Packit b099d7
        Display *display,
Packit b099d7
        int value )
Packit b099d7
{
Packit b099d7
    XmSetFontUnits(display, value, value);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/**********************************************************************
Packit b099d7
 *
Packit b099d7
 *  _XmGetFontUnit
Packit b099d7
 *
Packit b099d7
 **********************************************************************/
Packit b099d7
int
Packit b099d7
_XmGetFontUnit(
Packit b099d7
        Screen *screen,
Packit b099d7
        int dimension )
Packit b099d7
{
Packit b099d7
    XmScreen          xmScreen;
Packit b099d7
Packit b099d7
    xmScreen = (XmScreen) XmGetXmScreen(screen);
Packit b099d7
    if (dimension == XmHORIZONTAL)
Packit b099d7
      return(xmScreen->screen.h_unit);
Packit b099d7
    else
Packit b099d7
      return(xmScreen->screen.v_unit);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/**********************************************************************
Packit b099d7
 *
Packit b099d7
 *  _XmGetColorCalculationProc
Packit b099d7
 *     Here there is no point of supporting the old function as
Packit b099d7
 *     place holder for the new color proc since the signature are
Packit b099d7
 *     different. The old color proc will still be managed by Visual.c
Packit b099d7
 *     in its own way.
Packit b099d7
 **********************************************************************/
Packit b099d7
XmScreenColorProc
Packit b099d7
_XmGetColorCalculationProc(
Packit b099d7
        Screen *screen)
Packit b099d7
{
Packit b099d7
    XmScreen          xmScreen;
Packit b099d7
Packit b099d7
    xmScreen = (XmScreen) XmGetXmScreen(screen);
Packit b099d7
    return(xmScreen->screen.color_calc_proc);
Packit b099d7
}
Packit b099d7
Packit b099d7
/**********************************************************************
Packit b099d7
 *
Packit b099d7
 *  _XmGetColorAllocationProc
Packit b099d7
 *
Packit b099d7
 **********************************************************************/
Packit b099d7
XmAllocColorProc
Packit b099d7
_XmGetColorAllocationProc(
Packit b099d7
        Screen *screen)
Packit b099d7
{
Packit b099d7
    XmScreen          xmScreen;
Packit b099d7
Packit b099d7
    xmScreen = (XmScreen) XmGetXmScreen(screen);
Packit b099d7
    return(xmScreen->screen.color_alloc_proc);
Packit b099d7
}
Packit b099d7
Packit b099d7
/**********************************************************************
Packit b099d7
 *
Packit b099d7
 *  _XmGetBitmapConversionModel
Packit b099d7
 *
Packit b099d7
 **********************************************************************/
Packit b099d7
Packit b099d7
XtEnum
Packit b099d7
_XmGetBitmapConversionModel(
Packit b099d7
        Screen *screen)
Packit b099d7
{
Packit b099d7
    XmScreen          xmScreen;
Packit b099d7
Packit b099d7
    xmScreen = (XmScreen) XmGetXmScreen(screen);
Packit b099d7
    return(xmScreen->screen.bitmap_conversion_model);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 * _XmGetInsensitiveStippleBitmap
Packit b099d7
 *
Packit b099d7
 * Returns the insensitive_stipple_bitmap field of the XmScreenPart
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
Pixmap
Packit b099d7
_XmGetInsensitiveStippleBitmap (Widget w)
Packit b099d7
{
Packit b099d7
    XmScreen    xmScreen = (XmScreen) XmGetXmScreen(XtScreen(w));
Packit b099d7
Packit b099d7
    return(xmScreen->screen.insensitive_stipple_bitmap);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
#ifdef DEFAULT_GLYPH_PIXMAP
Packit b099d7
/**********************************************************************
Packit b099d7
 *
Packit b099d7
 *  _XmGetDefaultGlyphPixmap
Packit b099d7
 *
Packit b099d7
 **********************************************************************/
Packit b099d7
Pixmap
Packit b099d7
_XmGetDefaultGlyphPixmap(
Packit b099d7
        Screen *screen,
Packit b099d7
        unsigned int * width,
Packit b099d7
        unsigned int  *height)
Packit b099d7
{
Packit b099d7
    XmScreen          xmScreen;
Packit b099d7
Packit b099d7
    xmScreen = (XmScreen) XmGetXmScreen(screen);
Packit b099d7
Packit b099d7
    if (width) *width = xmScreen->screen.default_glyph_pixmap_width ;
Packit b099d7
    if (height) *height = xmScreen->screen.default_glyph_pixmap_height ;
Packit b099d7
Packit b099d7
    return(xmScreen->screen.default_glyph_pixmap);
Packit b099d7
}
Packit b099d7
#endif
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/*********************************************************************
Packit b099d7
 *
Packit b099d7
 *  XmGetXmScreen
Packit b099d7
 *
Packit b099d7
 *********************************************************************/
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
Widget 
Packit b099d7
XmGetXmScreen(
Packit b099d7
        Screen *screen )
Packit b099d7
{ 
Packit b099d7
    XmDisplay	xmDisplay;
Packit b099d7
    WidgetList	children;
Packit b099d7
    Widget 	widget;
Packit b099d7
    int	num_children;
Packit b099d7
    Arg args[5];
Packit b099d7
    int i;
Packit b099d7
    Screen *scr;
Packit b099d7
    char name[25];
Packit b099d7
    _XmDisplayToAppContext(DisplayOfScreen(screen));
Packit b099d7
Packit b099d7
    _XmAppLock(app);
Packit b099d7
    if ((xmDisplay = (XmDisplay) 
Packit b099d7
	 XmGetXmDisplay(DisplayOfScreen(screen))) == NULL)
Packit b099d7
	{
Packit b099d7
		XmeWarning(NULL, MESSAGE2);
Packit b099d7
		_XmAppUnlock(app);
Packit b099d7
		return(NULL);
Packit b099d7
	}
Packit b099d7
Packit b099d7
	children = xmDisplay->composite.children;
Packit b099d7
	num_children = xmDisplay->composite.num_children;
Packit b099d7
Packit b099d7
	for (i=0; i < num_children; i++)
Packit b099d7
	{
Packit b099d7
		Widget child = children[i];
Packit b099d7
		if ((XmIsScreen(child)) &&
Packit b099d7
			(screen == XtScreen(child))) {
Packit b099d7
			_XmAppUnlock(app);
Packit b099d7
			return(child);
Packit b099d7
		}
Packit b099d7
	}
Packit b099d7
Packit b099d7
	/* Not found; have to do an implied creation */
Packit b099d7
	for (scr = ScreenOfDisplay(XtDisplay(xmDisplay), i);
Packit b099d7
		i < ScreenCount(XtDisplay(xmDisplay));
Packit b099d7
		i++, scr = ScreenOfDisplay(XtDisplay(xmDisplay), i))
Packit b099d7
	{
Packit b099d7
		if (scr == screen)
Packit b099d7
			break;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	sprintf(name, "screen%d", i);
Packit b099d7
Packit b099d7
	i = 0;
Packit b099d7
	XtSetArg(args[i], XmNscreen, screen); i++;
Packit b099d7
	widget = XtCreateWidget(name, xmScreenClass, (Widget)xmDisplay,
Packit b099d7
		args, i);
Packit b099d7
	_XmAppUnlock(app);
Packit b099d7
	return widget;
Packit b099d7
}