Blame lib/Xm/IconG.c

Packit b099d7
/* $TOG: IconG.c /main/28 1999/01/26 15:30:46 mgreess $ */
Packit b099d7
/*
Packit b099d7
 * Motif
Packit b099d7
 *
Packit b099d7
 * Copyright (c) 1987-2012, The Open Group. All rights reserved.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are free software; you can
Packit b099d7
 * redistribute them and/or modify them under the terms of the GNU
Packit b099d7
 * Lesser General Public License as published by the Free Software
Packit b099d7
 * Foundation; either version 2 of the License, or (at your option)
Packit b099d7
 * any later version.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are distributed in the hope that
Packit b099d7
 * they will be useful, but WITHOUT ANY WARRANTY; without even the
Packit b099d7
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
Packit b099d7
 * PURPOSE. See the GNU Lesser General Public License for more
Packit b099d7
 * details.
Packit b099d7
 *
Packit b099d7
 * You should have received a copy of the GNU Lesser General Public
Packit b099d7
 * License along with these librararies and programs; if not, write
Packit b099d7
 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
Packit b099d7
 * Floor, Boston, MA 02110-1301 USA
Packit b099d7
 */
Packit b099d7
/*
Packit b099d7
 * HISTORY
Packit b099d7
 */
Packit b099d7
Packit b099d7
#ifdef HAVE_CONFIG_H
Packit b099d7
#include <config.h>
Packit b099d7
#endif
Packit b099d7
Packit b099d7
Packit b099d7
#include <Xm/AccColorT.h>
Packit b099d7
#include <Xm/CareVisualT.h>
Packit b099d7
#include <Xm/ContItemT.h>
Packit b099d7
#include <Xm/ContainerT.h>
Packit b099d7
#include <Xm/PointInT.h>
Packit b099d7
#include <Xm/DrawP.h>
Packit b099d7
#include <Xm/IconGP.h>
Packit b099d7
#include <Xm/TraitP.h>		/* for XmeTraitSet */
Packit b099d7
#include <Xm/XmosP.h>
Packit b099d7
#include <Xm/VaSimpleP.h>
Packit b099d7
#include "BaseClassI.h"
Packit b099d7
#include "CacheI.h"
Packit b099d7
#include "ColorI.h"
Packit b099d7
#include "DrawI.h"
Packit b099d7
#include "ExtObjectI.h"
Packit b099d7
#include "ImageCachI.h"
Packit b099d7
#include "MessagesI.h"
Packit b099d7
#include "PixConvI.h"
Packit b099d7
#include "RepTypeI.h"
Packit b099d7
#include "ScreenI.h"
Packit b099d7
#include "SyntheticI.h"
Packit b099d7
#include "TravActI.h"
Packit b099d7
#include "XmI.h"
Packit b099d7
#include "XmTabListI.h"
Packit b099d7
#include "XmosI.h"
Packit b099d7
#include "IconGI.h"
Packit b099d7
#include <Xm/XmP.h>
Packit b099d7
Packit b099d7
Packit b099d7
/* spacing between the line and the detail string.
Packit b099d7
   Those could be moved as plain resources later. */
Packit b099d7
#define DEFAULT_LABEL_MARGIN_WIDTH	2 
Packit b099d7
#define DEFAULT_LABEL_MARGIN_HEIGHT	2 
Packit b099d7
#define DEFAULT_HOR_SPACING		4 
Packit b099d7
Packit b099d7
/* This macro should probably be put in XmI.h and used everywhere */
Packit b099d7
#define PIXMAP_VALID(pix) \
Packit b099d7
    (pix != XmUNSPECIFIED_PIXMAP && pix != None)
Packit b099d7
Packit b099d7
#define SHOW_DETAIL(wid, container_data) \
Packit b099d7
    (IG_Detail(wid) && IG_DetailCount(wid) && \
Packit b099d7
     (container_data)->detail_order_count)
Packit b099d7
Packit b099d7
#define INVALID_DIMENSION ((Dimension)-1)
Packit b099d7
Packit b099d7
/********    Static Function Declarations    ********/
Packit b099d7
       /* XmRCallProcs */
Packit b099d7
static void 			CheckSetRenderTable(
Packit b099d7
					Widget 		wid,
Packit b099d7
					int		offset, 
Packit b099d7
					XrmValue 	*value); 
Packit b099d7
       /* Converters */
Packit b099d7
static Boolean CvtStringToIconPixmap( 
Packit b099d7
                        Display *dpy,
Packit b099d7
                        XrmValue *args,
Packit b099d7
                        Cardinal *numArgs,
Packit b099d7
                        XrmValue *fromVal,
Packit b099d7
                        XrmValue *toVal,
Packit b099d7
                        XtPointer *closure_ret) ;
Packit b099d7
Packit b099d7
        /* Hooks */
Packit b099d7
static	void			GetLabelString(
Packit b099d7
					Widget		wid,
Packit b099d7
					int		offset,
Packit b099d7
					XtArgVal	*value);
Packit b099d7
	/* BaseClass methods */
Packit b099d7
static void SecondaryObjectCreate( 
Packit b099d7
                        Widget req,
Packit b099d7
                        Widget new_w,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
Packit b099d7
static void InitializePosthook( 
Packit b099d7
                        Widget req,
Packit b099d7
                        Widget new_w,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
Packit b099d7
static Boolean SetValuesPrehook( 
Packit b099d7
                        Widget oldParent,
Packit b099d7
                        Widget refParent,
Packit b099d7
                        Widget newParent,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
Packit b099d7
static void GetValuesPrehook( 
Packit b099d7
                        Widget newParent,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
Packit b099d7
static void GetValuesPosthook( 
Packit b099d7
                        Widget new_w,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
Packit b099d7
static Boolean SetValuesPosthook( 
Packit b099d7
                        Widget current,
Packit b099d7
                        Widget req,
Packit b099d7
                        Widget new_w,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
Packit b099d7
static int IconGCacheCompare( 
Packit b099d7
                        XtPointer A,
Packit b099d7
                        XtPointer B) ;
Packit b099d7
static Cardinal GetIconGClassSecResData( 
Packit b099d7
                        WidgetClass w_class,
Packit b099d7
                        XmSecondaryResourceData **data_rtn) ;
Packit b099d7
static XtPointer GetIconGClassSecResBase( 
Packit b099d7
                        Widget widget,
Packit b099d7
                        XtPointer client_data) ;
Packit b099d7
	/* RectObj methods */
Packit b099d7
static	void			ClassInitialize( void );
Packit b099d7
static	void			ClassPartInitialize(
Packit b099d7
					WidgetClass	wc);
Packit b099d7
static	void			Initialize(
Packit b099d7
					Widget		rw,
Packit b099d7
					Widget          nw,
Packit b099d7
					ArgList         args,
Packit b099d7
					Cardinal        *num_args);
Packit b099d7
static	void			Destroy(
Packit b099d7
					Widget  wid);
Packit b099d7
static	void			Redisplay(
Packit b099d7
					Widget		wid,
Packit b099d7
					XEvent		*event,
Packit b099d7
					Region		region);
Packit b099d7
static	Boolean			SetValues(
Packit b099d7
					Widget		cw,
Packit b099d7
					Widget		rw,
Packit b099d7
					Widget		nw,
Packit b099d7
					ArgList		args,
Packit b099d7
					Cardinal	*num_args);
Packit b099d7
static	XtGeometryResult	QueryGeometry(
Packit b099d7
					Widget		wid,
Packit b099d7
					XtWidgetGeometry *intended,
Packit b099d7
					XtWidgetGeometry *reply);
Packit b099d7
	/* XmGadget methods */
Packit b099d7
static  void 			HighlightBorder( 
Packit b099d7
						Widget w) ;
Packit b099d7
static  void 			UnhighlightBorder( 
Packit b099d7
						Widget w) ;
Packit b099d7
static	void			InputDispatch(
Packit b099d7
					Widget		wid,
Packit b099d7
					XEvent		*event,
Packit b099d7
					Mask		event_mask);
Packit b099d7
static	Boolean			GetBaselines(
Packit b099d7
					Widget		wid,
Packit b099d7
					Dimension	**baselines,
Packit b099d7
					int		*line_count);
Packit b099d7
static	void			MarginsProc(
Packit b099d7
					Widget		w,
Packit b099d7
				        XmBaselineMargins *margins_rec);
Packit b099d7
static	Boolean			GetDisplayRect(
Packit b099d7
					Widget		wid,
Packit b099d7
					XRectangle	*displayrect);
Packit b099d7
	/* XmIconGadget methods */
Packit b099d7
	/* Action procs */
Packit b099d7
	/* Internal functions */
Packit b099d7
static	void                    GetLabelXY(
Packit b099d7
					   Widget		wid,
Packit b099d7
					   Position * x_ret,
Packit b099d7
					   Position * y_ret);
Packit b099d7
static	Position                GetLargeIconX(
Packit b099d7
					      Widget		wid);
Packit b099d7
static	Position                GetSmallIconY(
Packit b099d7
					      Widget		wid);
Packit b099d7
static	Dimension		GetIconLabelWidth(
Packit b099d7
					Widget		wid);
Packit b099d7
static	Dimension		GetIconLabelHeight(
Packit b099d7
					Widget		wid);
Packit b099d7
static Cardinal                 GetShapeInfo(
Packit b099d7
					     Widget wid,
Packit b099d7
					     Position large_icon_x,
Packit b099d7
					     Position small_icon_y,
Packit b099d7
					     Position label_x,
Packit b099d7
					     Position label_y,
Packit b099d7
					     Dimension first_column_width,
Packit b099d7
					     Dimension ht,
Packit b099d7
					     XPoint * points);
Packit b099d7
static  void                    GetContainerData(
Packit b099d7
					Widget wid,
Packit b099d7
					XmContainerData container_data);
Packit b099d7
static	void			ChangeHighlightGC(
Packit b099d7
						  Widget	wid,
Packit b099d7
						  XtEnum selection_mode,
Packit b099d7
						  int    line_width);
Packit b099d7
static	void			UpdateSelectGCs(
Packit b099d7
						Widget		wid,
Packit b099d7
						Pixel select_color);
Packit b099d7
static	void			UpdateGCs(
Packit b099d7
					Widget		wid);
Packit b099d7
static	XmStringTable           GetStringTableReOrdered(
Packit b099d7
							XmStringTable st,
Packit b099d7
							Cardinal st_count,
Packit b099d7
							Cardinal * order,
Packit b099d7
							Cardinal order_count);
Packit b099d7
static	void                    GetStringTableExtent(
Packit b099d7
						     Screen * screen,
Packit b099d7
						     XmStringTable st,
Packit b099d7
						     Cardinal st_count,
Packit b099d7
						     XmRenderTable render_table,
Packit b099d7
						     XmTabList tab_list,
Packit b099d7
						     Dimension hor_spacing, 
Packit b099d7
						     Dimension * width_ret,
Packit b099d7
						     Dimension * height_ret,
Packit b099d7
						     Position * baseline_ret);
Packit b099d7
static	void			GetSize(
Packit b099d7
					Widget		wid,
Packit b099d7
					Dimension	*ideal_width,
Packit b099d7
					Dimension	*ideal_height);
Packit b099d7
Packit b099d7
	/* Trait methods */
Packit b099d7
static	void ContItemSetValues(Widget w, 
Packit b099d7
			       XmContainerItemData contItemData);
Packit b099d7
Packit b099d7
static	void ContItemGetValues(Widget w, 
Packit b099d7
			       XmContainerItemData contItemData);
Packit b099d7
Packit b099d7
static  Boolean HandleRedraw (Widget kid, 
Packit b099d7
			      Widget cur_parent,
Packit b099d7
			      Widget new_parent,
Packit b099d7
			      Mask visual_flag);
Packit b099d7
static  void GetColors(Widget widget, 
Packit b099d7
		       XmAccessColorData color_data);
Packit b099d7
Packit b099d7
static  Boolean PointIn(Widget widget, 
Packit b099d7
		        Position x, Position y);
Packit b099d7
Packit b099d7
/********    End Static Function Declarations    ********/
Packit b099d7

Packit b099d7
Packit b099d7

Packit b099d7
/*** Xt trivia: How do you manage a flag that tells you that something 
Packit b099d7
     happened during a resource conversion ?
Packit b099d7
     We need a association outside the widget instance for the
Packit b099d7
     OwnIconMask flag. This is because the converter sets this flag
Packit b099d7
     and the widget Initialize cannot initialize it afterward without
Packit b099d7
     overiding it.
Packit b099d7
     So we use the XContext manager for that. 
Packit b099d7
     (I could probably have used private resource too...)  ***/
Packit b099d7
Packit b099d7
/* those are created in ClassInitialize and filled by the
Packit b099d7
   IconConverter. */
Packit b099d7
static XContext 	largeIconContext = (XContext) NULL;
Packit b099d7
static XContext		smallIconContext = (XContext) NULL;
Packit b099d7
Packit b099d7
static XPointer dummy;
Packit b099d7
#define OwnLargeMask(widget) \
Packit b099d7
        (XFindContext(XtDisplay(widget),  \
Packit b099d7
		     (Window) widget,   \
Packit b099d7
		     largeIconContext,  \
Packit b099d7
		     &dummy) == 0)
Packit b099d7
#define OwnSmallMask(widget) \
Packit b099d7
        (XFindContext(XtDisplay(widget),  \
Packit b099d7
		     (Window) widget,   \
Packit b099d7
		     smallIconContext,  \
Packit b099d7
		     &dummy) == 0)
Packit b099d7
Packit b099d7
Packit b099d7
#define MESSAGE0	_XmMMsgPixConv_0000
Packit b099d7
Packit b099d7
/***** The resources of this class */
Packit b099d7
static	XtResource		resources[] = 
Packit b099d7
{
Packit b099d7
    /* The following hackery is a way in Xt to see if a
Packit b099d7
       widget has been initialized. We need to know whether or not 
Packit b099d7
       the gadget cache is valid. We use "." in the name so that
Packit b099d7
       an end user cannot access it from a resource file.
Packit b099d7
       With that in place, we just need to check IG_Cache(w) != NULL
Packit b099d7
       to see if the gadget has been initialized. */
Packit b099d7
    {
Packit b099d7
	XmNdotCache, XmCDotCache, XmRPointer, sizeof(XtPointer),
Packit b099d7
	XtOffset(XmIconGadget, icong.cache), 
Packit b099d7
	XtRImmediate, (XtPointer) NULL},
Packit b099d7
    {
Packit b099d7
	XmNlabelString,XmCXmString,XmRXmString,sizeof(XmString),
Packit b099d7
	XtOffset(XmIconGadget,icong.label_string),
Packit b099d7
	XmRImmediate,(XtPointer)NULL},
Packit b099d7
    {
Packit b099d7
	XmNlargeIconMask,XmCIconMask,XmRBitmap,sizeof(Pixmap),
Packit b099d7
	XtOffset(XmIconGadget,icong.large_icon_mask),
Packit b099d7
	XmRImmediate,(XtPointer)XmUNSPECIFIED_PIXMAP},
Packit b099d7
    {
Packit b099d7
	XmNlargeIconPixmap,XmCIconPixmap,XmRLargeIconPixmap,sizeof(Pixmap),
Packit b099d7
	XtOffset(XmIconGadget,icong.large_icon_pixmap),
Packit b099d7
	XmRImmediate,(XtPointer)XmUNSPECIFIED_PIXMAP},
Packit b099d7
    {
Packit b099d7
	XmNsmallIconMask,XmCIconMask,XmRBitmap,sizeof(Pixmap),
Packit b099d7
	XtOffset(XmIconGadget,icong.small_icon_mask),
Packit b099d7
	XmRImmediate,(XtPointer)XmUNSPECIFIED_PIXMAP},
Packit b099d7
    {
Packit b099d7
	XmNsmallIconPixmap,XmCIconMask,XmRSmallIconPixmap,sizeof(Pixmap),
Packit b099d7
	XtOffset(XmIconGadget,icong.small_icon_pixmap),
Packit b099d7
	XmRImmediate,(XtPointer)XmUNSPECIFIED_PIXMAP},
Packit b099d7
    {
Packit b099d7
	XmNviewType,XmCViewType,XmRViewType,sizeof(unsigned char),
Packit b099d7
	XtOffset(XmIconGadget,icong.viewtype),
Packit b099d7
	XmRImmediate,(XtPointer)XmLARGE_ICON},
Packit b099d7
    {
Packit b099d7
	XmNvisualEmphasis,XmCVisualEmphasis,XmRVisualEmphasis,
Packit b099d7
	sizeof(unsigned char),
Packit b099d7
	XtOffset(XmIconGadget,icong.visual_emphasis),
Packit b099d7
	XmRImmediate,(XtPointer)XmNOT_SELECTED},
Packit b099d7
    {
Packit b099d7
	XmNdetail,XmCDetail,XmRXmStringTable,
Packit b099d7
	sizeof(XmStringTable),
Packit b099d7
	XtOffset(XmIconGadget,icong.detail),
Packit b099d7
	XmRImmediate,(XtPointer)NULL},
Packit b099d7
    {
Packit b099d7
	XmNdetailCount,XmCDetailCount,XmRCardinal,sizeof(Cardinal),
Packit b099d7
	XtOffset(XmIconGadget,icong.detail_count),
Packit b099d7
	XmRImmediate,(XtPointer)0},
Packit b099d7
   {
Packit b099d7
	"pri.vate","Pri.vate",XmRBoolean,
Packit b099d7
	sizeof(Boolean), 
Packit b099d7
	XtOffset(XmIconGadget, icong.check_set_render_table),
Packit b099d7
	XmRImmediate, (XtPointer) False},
Packit b099d7
};
Packit b099d7
Packit b099d7
Packit b099d7
static XtResource cache_resources[] = 
Packit b099d7
{
Packit b099d7
   {
Packit b099d7
     XmNfontList, XmCFontList, XmRFontList,
Packit b099d7
     sizeof(XmRenderTable),
Packit b099d7
     XtOffsetOf(XmIconGCacheObjRec, icon_cache.render_table),
Packit b099d7
     XmRCallProc,(XtPointer)CheckSetRenderTable
Packit b099d7
   },
Packit b099d7
   {
Packit b099d7
     XmNrenderTable, XmCRenderTable, XmRRenderTable,
Packit b099d7
     sizeof(XmRenderTable),
Packit b099d7
     XtOffsetOf(XmIconGCacheObjRec, icon_cache.render_table),
Packit b099d7
     XmRCallProc,(XtPointer)CheckSetRenderTable
Packit b099d7
   },
Packit b099d7
   {
Packit b099d7
     XmNbackground, XmCBackground, XmRPixel, 
Packit b099d7
     sizeof (Pixel), 
Packit b099d7
     XtOffsetOf(XmIconGCacheObjRec, icon_cache.background),
Packit b099d7
     XmRCallProc, (XtPointer) _XmBackgroundColorDefault
Packit b099d7
   },
Packit b099d7
   {
Packit b099d7
     XmNforeground, XmCForeground, XmRPixel, 
Packit b099d7
     sizeof (Pixel),
Packit b099d7
     XtOffsetOf(XmIconGCacheObjRec, icon_cache.foreground),
Packit b099d7
     XmRCallProc, (XtPointer) _XmForegroundColorDefault
Packit b099d7
   },
Packit b099d7
   {
Packit b099d7
     XmNtopShadowColor, XmCTopShadowColor, XmRPixel, 
Packit b099d7
     sizeof (Pixel),
Packit b099d7
     XtOffsetOf(XmIconGCacheObjRec, icon_cache.top_shadow_color),
Packit b099d7
     XmRCallProc, (XtPointer) _XmTopShadowColorDefault
Packit b099d7
   },
Packit b099d7
   {
Packit b099d7
     XmNbottomShadowColor, XmCBottomShadowColor, XmRPixel, 
Packit b099d7
     sizeof (Pixel),
Packit b099d7
     XtOffsetOf(XmIconGCacheObjRec, icon_cache.bottom_shadow_color),
Packit b099d7
     XmRCallProc, (XtPointer) _XmBottomShadowColorDefault
Packit b099d7
   },
Packit b099d7
   {
Packit b099d7
     XmNhighlightColor, XmCHighlightColor, XmRPixel, 
Packit b099d7
     sizeof (Pixel),
Packit b099d7
     XtOffsetOf(XmIconGCacheObjRec, icon_cache.highlight_color),
Packit b099d7
     XmRCallProc, (XtPointer) _XmHighlightColorDefault
Packit b099d7
   },
Packit b099d7
   {
Packit b099d7
     XmNbackgroundPixmap, XmCBackgroundPixmap, XmRPixmap,
Packit b099d7
     sizeof (Pixmap),
Packit b099d7
     XtOffsetOf(XmIconGCacheObjRec, icon_cache.background_pixmap),
Packit b099d7
     XmRImmediate, (XtPointer) XmUNSPECIFIED_PIXMAP
Packit b099d7
   },
Packit b099d7
   {
Packit b099d7
     XmNtopShadowPixmap, XmCTopShadowPixmap, XmRTopShadowPixmap,
Packit b099d7
     sizeof (Pixmap),
Packit b099d7
     XtOffsetOf(XmIconGCacheObjRec, icon_cache.top_shadow_pixmap),
Packit b099d7
     XmRCallProc, (XtPointer) _XmTopShadowPixmapDefault
Packit b099d7
   },
Packit b099d7
   {
Packit b099d7
     XmNbottomShadowPixmap, XmCBottomShadowPixmap, XmRBottomShadowPixmap,
Packit b099d7
     sizeof (Pixmap),
Packit b099d7
     XtOffsetOf(XmIconGCacheObjRec, icon_cache.bottom_shadow_pixmap),
Packit b099d7
     XmRImmediate, (XtPointer) XmUNSPECIFIED_PIXMAP
Packit b099d7
   },
Packit b099d7
   {
Packit b099d7
     XmNhighlightPixmap, XmCHighlightPixmap, XmRHighlightPixmap,
Packit b099d7
     sizeof (Pixmap),
Packit b099d7
     XtOffsetOf(XmIconGCacheObjRec, icon_cache.highlight_pixmap),
Packit b099d7
     XmRCallProc, (XtPointer) _XmHighlightPixmapDefault
Packit b099d7
   },
Packit b099d7
   {
Packit b099d7
     XmNalignment, XmCAlignment, XmRAlignment, sizeof(unsigned char),
Packit b099d7
     XtOffsetOf(XmIconGCacheObjRec, icon_cache.alignment),
Packit b099d7
     XmRImmediate, (XtPointer) XmALIGNMENT_CENTER
Packit b099d7
   },
Packit b099d7
   {
Packit b099d7
     XmNspacing, XmCSpacing, XmRHorizontalDimension, sizeof(Dimension),
Packit b099d7
     XtOffsetOf(XmIconGCacheObjRec, icon_cache.spacing),
Packit b099d7
     XmRImmediate, (XtPointer) 4
Packit b099d7
   },
Packit b099d7
   {
Packit b099d7
     XmNmarginWidth, XmCMarginWidth, XmRHorizontalDimension, 
Packit b099d7
     sizeof(Dimension),
Packit b099d7
     XtOffsetOf(XmIconGCacheObjRec, icon_cache.margin_width), 
Packit b099d7
     XmRImmediate, (XtPointer) 2
Packit b099d7
   },
Packit b099d7
   {
Packit b099d7
     XmNmarginHeight, XmCMarginHeight, XmRVerticalDimension, 
Packit b099d7
     sizeof(Dimension),
Packit b099d7
     XtOffsetOf(XmIconGCacheObjRec, icon_cache.margin_height),
Packit b099d7
     XmRImmediate, (XtPointer) 2
Packit b099d7
   },
Packit b099d7
};
Packit b099d7
Packit b099d7
static	XmSyntheticResource	syn_resources[] =
Packit b099d7
{
Packit b099d7
    {
Packit b099d7
	XmNlabelString,sizeof(XmString),
Packit b099d7
	XtOffset(XmIconGadget,icong.label_string),GetLabelString,NULL
Packit b099d7
	},
Packit b099d7
};
Packit b099d7
Packit b099d7
static	XmSyntheticResource	cache_syn_resources[] =
Packit b099d7
{
Packit b099d7
    { 
Packit b099d7
      XmNspacing, sizeof(Dimension),
Packit b099d7
      XtOffsetOf(XmIconGCacheObjRec, icon_cache.spacing), 
Packit b099d7
      XmeFromHorizontalPixels, XmeToHorizontalPixels 
Packit b099d7
    },
Packit b099d7
    { 
Packit b099d7
      XmNmarginWidth, sizeof(Dimension),
Packit b099d7
      XtOffsetOf(XmIconGCacheObjRec, icon_cache.margin_width), 
Packit b099d7
      XmeFromHorizontalPixels, XmeToHorizontalPixels 
Packit b099d7
    },
Packit b099d7
    { 
Packit b099d7
      XmNmarginHeight, sizeof(Dimension),
Packit b099d7
      XtOffsetOf(XmIconGCacheObjRec, icon_cache.margin_height),
Packit b099d7
      XmeFromVerticalPixels, XmeToVerticalPixels 
Packit b099d7
    },
Packit b099d7
};
Packit b099d7
Packit b099d7
Packit b099d7
/* ext rec static initialization */
Packit b099d7
externaldef(xmicongcacheobjclassrec)
Packit b099d7
XmIconGCacheObjClassRec xmIconGCacheObjClassRec =
Packit b099d7
{
Packit b099d7
  {
Packit b099d7
    /* superclass         */    (WidgetClass) &xmExtClassRec,
Packit b099d7
    /* class_name         */    "XmIconGadget",
Packit b099d7
    /* widget_size        */    sizeof(XmIconGCacheObjRec),
Packit b099d7
    /* class_initialize   */    NULL,
Packit b099d7
    /* chained class init */    NULL,
Packit b099d7
    /* class_inited       */    False,
Packit b099d7
    /* initialize         */    NULL,
Packit b099d7
    /* initialize hook    */    NULL,
Packit b099d7
    /* realize            */    NULL,
Packit b099d7
    /* actions            */    NULL,
Packit b099d7
    /* num_actions        */    0,
Packit b099d7
    /* resources          */    cache_resources,
Packit b099d7
    /* num_resources      */    XtNumber(cache_resources),
Packit b099d7
    /* xrm_class          */    NULLQUARK,
Packit b099d7
    /* compress_motion    */    False,
Packit b099d7
    /* compress_exposure  */    False,
Packit b099d7
    /* compress enter/exit*/    False,
Packit b099d7
    /* visible_interest   */    False,
Packit b099d7
    /* destroy            */    NULL,
Packit b099d7
    /* resize             */    NULL,
Packit b099d7
    /* expose             */    NULL,
Packit b099d7
    /* set_values         */    NULL,
Packit b099d7
    /* set values hook    */    NULL,
Packit b099d7
    /* set values almost  */    NULL,
Packit b099d7
    /* get values hook    */    NULL,
Packit b099d7
    /* accept_focus       */    NULL,
Packit b099d7
    /* version            */    XtVersion,
Packit b099d7
    /* callback offsetlst */    NULL,
Packit b099d7
    /* default trans      */    NULL,
Packit b099d7
    /* query geo proc     */    NULL,
Packit b099d7
    /* display accelerator*/    NULL,
Packit b099d7
    /* extension record   */    NULL,
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    /* synthetic resources */   cache_syn_resources,
Packit b099d7
    /* num_syn_resources   */   XtNumber(cache_syn_resources),
Packit b099d7
    /* extension           */   NULL,
Packit b099d7
  }
Packit b099d7
};
Packit b099d7
Packit b099d7
static XmBaseClassExtRec   iconGBaseClassExtRec = {
Packit b099d7
    NULL,    					/* next_extension        */
Packit b099d7
    NULLQUARK,					/* record_typ            */
Packit b099d7
    XmBaseClassExtVersion,			/* version               */
Packit b099d7
    sizeof(XmBaseClassExtRec),			/* record_size           */
Packit b099d7
    XmInheritInitializePrehook,			/* initializePrehook     */
Packit b099d7
    SetValuesPrehook,				/* setValuesPrehook      */
Packit b099d7
    InitializePosthook,				/* initializePosthook    */
Packit b099d7
    SetValuesPosthook,				/* setValuesPosthook     */
Packit b099d7
    (WidgetClass)&xmIconGCacheObjClassRec,	/* secondaryObjectClass  */
Packit b099d7
    SecondaryObjectCreate,		        /* secondaryObjectCreate */
Packit b099d7
    GetIconGClassSecResData,	                /* getSecResData */
Packit b099d7
    {0},			                /* Other Flags           */
Packit b099d7
    GetValuesPrehook,				/* getValuesPrehook      */
Packit b099d7
    GetValuesPosthook,				/* 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
    XmInheritWidgetNavigable,                   /* widgetNavigable      */
Packit b099d7
    XmInheritFocusChange,                       /* focusChange          */
Packit b099d7
};
Packit b099d7
Packit b099d7
static XmCacheClassPart IconGClassCachePart = {
Packit b099d7
    {NULL, 0, 0},        /* head of class cache list */
Packit b099d7
    _XmCacheCopy,       /* Copy routine     */
Packit b099d7
    _XmCacheDelete,     /* Delete routine   */
Packit b099d7
    IconGCacheCompare,    /* Comparison routine   */
Packit b099d7
};
Packit b099d7
Packit b099d7
Packit b099d7
static XmGadgetClassExtRec GadClassExtRec = {
Packit b099d7
    NULL,
Packit b099d7
    NULLQUARK,
Packit b099d7
    XmGadgetClassExtVersion,
Packit b099d7
    sizeof(XmGadgetClassExtRec),
Packit b099d7
    GetBaselines,			/* widget_baseline */
Packit b099d7
    GetDisplayRect,			/* widget_display_rect */
Packit b099d7
    MarginsProc,                        /* widget_margins */
Packit b099d7
};
Packit b099d7
Packit b099d7

Packit b099d7
externaldef( xmicongadgetclassrec) XmIconGadgetClassRec	xmIconGadgetClassRec =
Packit b099d7
{	/* RectObjClassPart */
Packit b099d7
    {	
Packit b099d7
	(WidgetClass) &xmGadgetClassRec, /* superclass		*/
Packit b099d7
	"XmIconGadget",			/* class_name		*/
Packit b099d7
	sizeof (XmIconGadgetRec),	/* widget_size		*/
Packit b099d7
	ClassInitialize,		/* class_initialize	*/
Packit b099d7
	ClassPartInitialize,		/* class_part_initialize*/
Packit b099d7
	False,				/* class_inited		*/
Packit b099d7
	Initialize,			/* initialize		*/
Packit b099d7
	NULL,				/* initialize_hook	*/
Packit b099d7
	NULL,				/* realize		*/
Packit b099d7
	NULL,				/* actions		*/
Packit b099d7
	0,				/* num_actions		*/
Packit b099d7
	resources,			/* resources		*/
Packit b099d7
	XtNumber (resources),		/* num_resources	*/
Packit b099d7
	NULLQUARK,			/* xrm_class		*/
Packit b099d7
	True,				/* compress_motion	*/
Packit b099d7
	True,				/* compress_exposure	*/
Packit b099d7
	True,				/* compress_enterleave	*/
Packit b099d7
	False,				/* visible_interest	*/	
Packit b099d7
	Destroy,		 	/* destroy		*/	
Packit b099d7
	NULL,				/* resize		*/
Packit b099d7
	Redisplay,			/* expose		*/	
Packit b099d7
	SetValues,			/* set_values		*/	
Packit b099d7
	NULL,				/* set_values_hook	*/
Packit b099d7
	XtInheritSetValuesAlmost,	/* set_values_almost	*/
Packit b099d7
	NULL,				/* get_values_hook	*/
Packit b099d7
	NULL,				/* accept_focus		*/	
Packit b099d7
	XtVersion,			/* version		*/
Packit b099d7
	NULL,				/* callback private	*/
Packit b099d7
	NULL,				/* tm_table		*/
Packit b099d7
	QueryGeometry,			/* query_geometry	*/
Packit b099d7
	NULL,				/* display_accelerator	*/
Packit b099d7
	(XtPointer)&iconGBaseClassExtRec,	/* extension	*/
Packit b099d7
    },
Packit b099d7
    
Packit b099d7
    /* XmGadget Class Part */
Packit b099d7
    {
Packit b099d7
	HighlightBorder,		        /* border_highlight	*/
Packit b099d7
	UnhighlightBorder,		        /* border_unhighlight	*/
Packit b099d7
	NULL,					/* arm_and_activate	*/
Packit b099d7
	InputDispatch,				/* input_dispatch	*/
Packit b099d7
	NULL,				        /* visual_change	*/
Packit b099d7
	syn_resources,				/* get_resources	*/
Packit b099d7
	XtNumber(syn_resources),		/* num_get_resources	*/
Packit b099d7
	&IconGClassCachePart,		        /* class_cache_part	*/
Packit b099d7
	(XtPointer)&GadClassExtRec,	        /* extension		*/
Packit b099d7
    },
Packit b099d7
Packit b099d7
	/* XmIconGadget Class Part */
Packit b099d7
    {
Packit b099d7
	NULL,		/* get_container_parent	*/
Packit b099d7
	NULL,		/* extension	*/
Packit b099d7
    },
Packit b099d7
};
Packit b099d7
Packit b099d7
externaldef(xmicongadgetclass) WidgetClass
Packit b099d7
	xmIconGadgetClass=(WidgetClass)&xmIconGadgetClassRec;
Packit b099d7

Packit b099d7
Packit b099d7
Packit b099d7
/* ContainerItem Trait record for IconGadget */
Packit b099d7
Packit b099d7
static XmConst XmContainerItemTraitRec iconCIT = {
Packit b099d7
  0,		/* version */
Packit b099d7
  ContItemSetValues,
Packit b099d7
  ContItemGetValues,
Packit b099d7
};
Packit b099d7
Packit b099d7
/* CareVisual Trait record for IconGadget */
Packit b099d7
Packit b099d7
static XmConst XmCareVisualTraitRec iconCVT = {
Packit b099d7
    0,		/* version */
Packit b099d7
    HandleRedraw,
Packit b099d7
};
Packit b099d7
Packit b099d7
/* Access Colors Trait record for IconGadget */
Packit b099d7
Packit b099d7
static XmConst XmAccessColorsTraitRec iconACT = {
Packit b099d7
  0,			/* version */
Packit b099d7
  GetColors
Packit b099d7
};
Packit b099d7
Packit b099d7
/* Point In Trait record for IconGadget */
Packit b099d7
Packit b099d7
static XmConst XmPointInTraitRec iconPIT = {
Packit b099d7
  0,			/* version */
Packit b099d7
  PointIn,
Packit b099d7
};
Packit b099d7
Packit b099d7
/******** for the special IconPixmap/Mask converter */
Packit b099d7
static XtConvertArgRec largeIconArgs[] =
Packit b099d7
{
Packit b099d7
   { XtBaseOffset, (XtPointer) 0, sizeof (int) },
Packit b099d7
   { XtAddress, (XtPointer)(int)XmLARGE_ICON, 0}
Packit b099d7
};
Packit b099d7
Packit b099d7
static XtConvertArgRec smallIconArgs[] =
Packit b099d7
{
Packit b099d7
   { XtBaseOffset, (XtPointer) 0, sizeof (int) },
Packit b099d7
   { XtAddress, (XtPointer)(int)XmSMALL_ICON, 0}
Packit b099d7
};
Packit b099d7
Packit b099d7

Packit b099d7
/*** XmRCallProcs ***/
Packit b099d7
/*
Packit b099d7
 * XmRCallProc routine for checking icon_cache.render_table before setting 
Packit b099d7
 * it to NULL. If "check_set_render_table" is True, then function has 
Packit b099d7
 * been called twice on same widget, thus resource needs to be set NULL, 
Packit b099d7
 * otherwise leave it alone.
Packit b099d7
 */
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
CheckSetRenderTable(Widget wid,
Packit b099d7
		    int offset,
Packit b099d7
		    XrmValue *value)
Packit b099d7
{
Packit b099d7
  XmIconGadget ig = (XmIconGadget)wid;
Packit b099d7
Packit b099d7
  /* Check if been here before */
Packit b099d7
  if (ig->icong.check_set_render_table)
Packit b099d7
      value->addr = NULL;
Packit b099d7
  else {
Packit b099d7
      ig->icong.check_set_render_table = True;
Packit b099d7
      value->addr = (char*)&(IG_RenderTable(ig));
Packit b099d7
  }
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  FetchPixmap
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
FetchPixmap(
Packit b099d7
        Widget widget,
Packit b099d7
        String image_name,
Packit b099d7
        unsigned char res_type,
Packit b099d7
        Pixmap * pixmap)	
Packit b099d7
{
Packit b099d7
   int depth ;
Packit b099d7
   XtPointer mask_addr ;
Packit b099d7
   XmAccessColorDataRec acc_color_rec;
Packit b099d7
   XmAccessColorsTrait access_colors_trait ;
Packit b099d7
Packit b099d7
   depth = - XtParent(widget)->core.depth;
Packit b099d7
   /* this is the convention used by XmGetPixmapByDepth, pass
Packit b099d7
      a negative depth means do bitmap if you can */
Packit b099d7
Packit b099d7
   /* always called when the cache is valid and the colors
Packit b099d7
      can be returned */
Packit b099d7
   access_colors_trait = (XmAccessColorsTrait) 
Packit b099d7
       XmeTraitGet((XtPointer)XtClass(widget), XmQTaccessColors) ;
Packit b099d7
   access_colors_trait->getColors(widget, &acc_color_rec);
Packit b099d7
Packit b099d7
   *pixmap = _XmGetScaledPixmap (XtScreen(widget), widget,
Packit b099d7
				 image_name, &acc_color_rec, 
Packit b099d7
				 depth, FALSE, 0);
Packit b099d7
Packit b099d7
   if (*pixmap == XmUNSPECIFIED_PIXMAP) {
Packit b099d7
       return ;   
Packit b099d7
   }
Packit b099d7
Packit b099d7
   /* now we see if a mask is to be fetched too */
Packit b099d7
Packit b099d7
   if (res_type == XmLARGE_ICON) {
Packit b099d7
       mask_addr = (XtPointer)&(IG_LargeIconMask(widget)) ;
Packit b099d7
   } else {
Packit b099d7
       mask_addr = (XtPointer)&(IG_SmallIconMask(widget)) ;
Packit b099d7
   }	   
Packit b099d7
Packit b099d7
   /* fetch only if a mask has not been specified in the resource slot */
Packit b099d7
   if (*(Pixmap *)mask_addr == XmUNSPECIFIED_PIXMAP) {
Packit b099d7
       char mask_name[255] ;
Packit b099d7
Packit b099d7
       /* Fetch the mask out of image_name and ask for it.
Packit b099d7
	  ImageCache:
Packit b099d7
	  The mask_name returned is the same as the one used by the 
Packit b099d7
	  ImageCache reader to cache the mask associated with an XPM file, 
Packit b099d7
	  so we will get it from the cache if an XPM file with a mask was
Packit b099d7
	  specified for image_name. When an XPM file with a mask 
Packit b099d7
	  in it is read, the mask is cached with mask_name. */
Packit b099d7
Packit b099d7
       _XmOSGenerateMaskName(image_name, mask_name) ;
Packit b099d7
Packit b099d7
       *(Pixmap*)mask_addr = (Pixmap) XmGetScaledPixmap(widget,
Packit b099d7
							mask_name,
Packit b099d7
							1, 0, 1, 0);
Packit b099d7
       /* mark that we have to destroy the mask */
Packit b099d7
       if (*(Pixmap *)mask_addr != XmUNSPECIFIED_PIXMAP) {
Packit b099d7
	   if (res_type == XmLARGE_ICON) {
Packit b099d7
	       XSaveContext(XtDisplay(widget), 
Packit b099d7
			    (Window) widget, 
Packit b099d7
			    largeIconContext, 
Packit b099d7
			    (XPointer) True);
Packit b099d7
	   } else {
Packit b099d7
	       XSaveContext(XtDisplay(widget), 
Packit b099d7
			    (Window) widget, 
Packit b099d7
			    smallIconContext, 
Packit b099d7
			    (XPointer) True);
Packit b099d7
	   }	   
Packit b099d7
       }
Packit b099d7
   }
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
 /************************************************************************
Packit b099d7
 *
Packit b099d7
 *  CvtStringToIconPixmap
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static Boolean 
Packit b099d7
CvtStringToIconPixmap(
Packit b099d7
        Display *dpy,
Packit b099d7
        XrmValue *args,
Packit b099d7
        Cardinal *numArgs,
Packit b099d7
        XrmValue *fromVal,
Packit b099d7
        XrmValue *toVal,
Packit b099d7
        XtPointer *closure_ret)	/* unused */
Packit b099d7
{
Packit b099d7
   Pixmap pixmap = XmUNSPECIFIED_PIXMAP;
Packit b099d7
   String image_name = (String) (fromVal->addr);
Packit b099d7
   Widget widget ;
Packit b099d7
   unsigned char res_type;
Packit b099d7
Packit b099d7
Packit b099d7
   if (*numArgs != 2) {
Packit b099d7
       XtAppWarningMsg (XtDisplayToApplicationContext(dpy),
Packit b099d7
			"wrongParameters", "cvtStringToPixmap",
Packit b099d7
			"XtToolkitError", MESSAGE0,
Packit b099d7
			(String *) NULL, (Cardinal *)NULL);
Packit b099d7
       return False;
Packit b099d7
   }
Packit b099d7
Packit b099d7
   /* CR 7568: Set widget before we use it. */
Packit b099d7
   widget = *((Widget *) args[0].addr);
Packit b099d7
   /* get back the resource type: LARGE or SMALL_ICON */
Packit b099d7
   res_type = (unsigned char) (int) (long) args[1].addr;
Packit b099d7
Packit b099d7
   if (XmeNamesAreEqual(image_name, "none")) {
Packit b099d7
       pixmap = None ;
Packit b099d7
       _XM_CONVERTER_DONE ( toVal, Pixmap, pixmap, 
Packit b099d7
	     XmDestroyPixmap(XtScreen(widget), pixmap) ;)
Packit b099d7
   }
Packit b099d7
       
Packit b099d7
   if (XmeNamesAreEqual(image_name, XmSunspecified_pixmap)) {
Packit b099d7
       pixmap = XmUNSPECIFIED_PIXMAP ;
Packit b099d7
       _XM_CONVERTER_DONE ( toVal, Pixmap, pixmap, 
Packit b099d7
	     XmDestroyPixmap(XtScreen(widget), pixmap) ;)
Packit b099d7
   }
Packit b099d7
       
Packit b099d7
   /* First we have to check if the gadget has been initialized
Packit b099d7
      before trying to create the pixmap. We need the colors
Packit b099d7
      and if the cache is not yet created, we have to delay
Packit b099d7
      the conversion. */
Packit b099d7
   if (!IG_Cache(widget)) {
Packit b099d7
       pixmap = XmDELAYED_PIXMAP;
Packit b099d7
       /* we need to stach away the name of the pixmap resource,
Packit b099d7
	  since we'll need it in Initialize, when XmDELAYED_PIXMAP is
Packit b099d7
	  treated, and XtGetSubResources is not going to work for
Packit b099d7
	  XtVaTypeArg time resource, which are not in the database. */
Packit b099d7
       if (res_type == XmLARGE_ICON)
Packit b099d7
	   IG_LargePixmapName(widget) = image_name ;
Packit b099d7
       else
Packit b099d7
	   IG_SmallPixmapName(widget) = image_name ;
Packit b099d7
Packit b099d7
       _XM_CONVERTER_DONE ( toVal, Pixmap, pixmap, 
Packit b099d7
	     XmDestroyPixmap(XtScreen(widget), pixmap) ;)
Packit b099d7
   }
Packit b099d7
Packit b099d7
   /* fetch the pixmap */
Packit b099d7
   FetchPixmap(widget, image_name, res_type, &pixmap);
Packit b099d7
Packit b099d7
   if (pixmap == XmUNSPECIFIED_PIXMAP) {
Packit b099d7
       XtDisplayStringConversionWarning(dpy, image_name, 
Packit b099d7
					"Large/SmallIconPixmap");
Packit b099d7
       return False;   
Packit b099d7
   }
Packit b099d7
Packit b099d7
Packit b099d7
   _XM_CONVERTER_DONE ( toVal, Pixmap, pixmap, 
Packit b099d7
		       XmDestroyPixmap(XtScreen(widget), pixmap) ;)
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 * GetLabelString
Packit b099d7
 ************************************************************************/
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static	void
Packit b099d7
GetLabelString(
Packit b099d7
	Widget		wid,
Packit b099d7
	int		offset,	/* unused */
Packit b099d7
	XtArgVal	*value)
Packit b099d7
{
Packit b099d7
    XmString	string = NULL;
Packit b099d7
Packit b099d7
    if (IG_LabelString(wid)) 
Packit b099d7
	string = XmStringCopy(IG_LabelString(wid));
Packit b099d7
    *value = (XtArgVal)string;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
*
Packit b099d7
*  SecondaryObjectCreate
Packit b099d7
*
Packit b099d7
************************************************************************/
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void 
Packit b099d7
SecondaryObjectCreate(
Packit b099d7
        Widget req,
Packit b099d7
        Widget new_w,
Packit b099d7
        ArgList args,
Packit b099d7
        Cardinal *num_args )
Packit b099d7
{
Packit b099d7
  XmBaseClassExt              *cePtr;
Packit b099d7
  XmWidgetExtData             extData;
Packit b099d7
  WidgetClass                 wc;
Packit b099d7
  Cardinal                    size;
Packit b099d7
  XtPointer                   newSec, reqSec;
Packit b099d7
Packit b099d7
  cePtr = _XmGetBaseClassExtPtr(XtClass(new_w), XmQmotif);
Packit b099d7
Packit b099d7
  wc = (*cePtr)->secondaryObjectClass;
Packit b099d7
  size = wc->core_class.widget_size;
Packit b099d7
Packit b099d7
  newSec = _XmExtObjAlloc(size);
Packit b099d7
  reqSec = _XmExtObjAlloc(size);
Packit b099d7
Packit b099d7
  
Packit b099d7
/*
Packit b099d7
 *  Update pointers in instance records now so references to resources
Packit b099d7
 * in the cache record will be valid for use in CallProcs.
Packit b099d7
 */
Packit b099d7
 
Packit b099d7
  IG_Cache(new_w) = &(((XmIconGCacheObject)newSec)->icon_cache);
Packit b099d7
  IG_Cache(req) = &(((XmIconGCacheObject)reqSec)->icon_cache);
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * fetch the resources in superclass to subclass order
Packit b099d7
     */
Packit b099d7
  XtGetSubresources(new_w,
Packit b099d7
                    newSec,
Packit b099d7
                    NULL, NULL,
Packit b099d7
                    wc->core_class.resources,
Packit b099d7
                    wc->core_class.num_resources,
Packit b099d7
                    args, *num_args );
Packit b099d7
Packit b099d7
  extData = (XmWidgetExtData) XtCalloc(1, sizeof(XmWidgetExtDataRec));
Packit b099d7
  extData->widget = (Widget)newSec;
Packit b099d7
  extData->reqWidget = (Widget)reqSec;
Packit b099d7
Packit b099d7
  ((XmIconGCacheObject)newSec)->ext.extensionType = XmCACHE_EXTENSION;
Packit b099d7
  ((XmIconGCacheObject)newSec)->ext.logicalParent = new_w;
Packit b099d7
Packit b099d7
  _XmPushWidgetExtData(new_w, extData,
Packit b099d7
                      ((XmIconGCacheObject)newSec)->ext.extensionType);
Packit b099d7
   memcpy(reqSec, newSec, size);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  InitializePosthook
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void 
Packit b099d7
InitializePosthook(
Packit b099d7
        Widget req,
Packit b099d7
        Widget new_w,
Packit b099d7
        ArgList args,
Packit b099d7
        Cardinal *num_args )
Packit b099d7
{
Packit b099d7
    XmWidgetExtData     ext;
Packit b099d7
    XmIconGadget sw = (XmIconGadget)new_w;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * - register parts in cache.
Packit b099d7
     * - update cache pointers
Packit b099d7
     * - and free req
Packit b099d7
     */
Packit b099d7
    
Packit b099d7
    _XmProcessLock();
Packit b099d7
    IG_Cache(sw) = (XmIconGCacheObjPart *)
Packit b099d7
      _XmCachePart( IG_ClassCachePart(sw),
Packit b099d7
                    (XtPointer) IG_Cache(sw),
Packit b099d7
                    sizeof(XmIconGCacheObjPart));
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * might want to break up into per-class work that gets explicitly
Packit b099d7
     * chained. For right now, each class has to replicate all
Packit b099d7
     * superclass logic in hook routine
Packit b099d7
     */
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * free the req subobject used for comparisons
Packit b099d7
     */
Packit b099d7
    _XmPopWidgetExtData((Widget) sw, &ext, XmCACHE_EXTENSION);
Packit b099d7
    _XmExtObjFree((XtPointer) ext->widget);
Packit b099d7
    _XmExtObjFree((XtPointer) ext->reqWidget);
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
    XtFree( (char *) ext);
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  SetValuesPrehook
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
/* ARGSUSED */
Packit b099d7
static Boolean 
Packit b099d7
SetValuesPrehook(
Packit b099d7
        Widget oldParent,
Packit b099d7
        Widget refParent,
Packit b099d7
        Widget newParent,
Packit b099d7
        ArgList args,
Packit b099d7
        Cardinal *num_args )
Packit b099d7
{
Packit b099d7
    XmWidgetExtData             extData;
Packit b099d7
    XmBaseClassExt              *cePtr;
Packit b099d7
    WidgetClass                 ec;
Packit b099d7
    XmIconGCacheObject     newSec, reqSec;
Packit b099d7
    Cardinal                    size;
Packit b099d7
Packit b099d7
    _XmProcessLock();
Packit b099d7
    cePtr = _XmGetBaseClassExtPtr(XtClass(newParent), XmQmotif);
Packit b099d7
    ec = (*cePtr)->secondaryObjectClass;
Packit b099d7
    size = ec->core_class.widget_size;
Packit b099d7
    newSec = (XmIconGCacheObject)_XmExtObjAlloc(size);
Packit b099d7
    reqSec = (XmIconGCacheObject)_XmExtObjAlloc(size);
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
Packit b099d7
    newSec->object.self = (Widget)newSec;
Packit b099d7
    newSec->object.widget_class = ec;
Packit b099d7
    newSec->object.parent = XtParent(newParent);
Packit b099d7
    newSec->object.xrm_name = newParent->core.xrm_name;
Packit b099d7
    newSec->object.being_destroyed = False;
Packit b099d7
    newSec->object.destroy_callbacks = NULL;
Packit b099d7
    newSec->object.constraints = NULL;
Packit b099d7
Packit b099d7
    newSec->ext.logicalParent = newParent;
Packit b099d7
    newSec->ext.extensionType = XmCACHE_EXTENSION;
Packit b099d7
Packit b099d7
    memcpy( &(newSec->icon_cache),
Packit b099d7
            IG_Cache(newParent),
Packit b099d7
            sizeof(XmIconGCacheObjPart));
Packit b099d7
Packit b099d7
    extData = (XmWidgetExtData) XtCalloc(1, sizeof(XmWidgetExtDataRec));
Packit b099d7
    extData->widget = (Widget)newSec;
Packit b099d7
    extData->reqWidget = (Widget)reqSec;
Packit b099d7
    _XmPushWidgetExtData(newParent, extData, XmCACHE_EXTENSION);
Packit b099d7
Packit b099d7
    XtSetSubvalues((XtPointer)newSec,
Packit b099d7
                   ec->core_class.resources,
Packit b099d7
                   ec->core_class.num_resources,
Packit b099d7
                   args, *num_args);
Packit b099d7
Packit b099d7
    memcpy((XtPointer)reqSec, (XtPointer)newSec, size);
Packit b099d7
Packit b099d7
    IG_Cache(newParent) = &(((XmIconGCacheObject)newSec)->icon_cache);
Packit b099d7
    IG_Cache(refParent) =
Packit b099d7
	      &(((XmIconGCacheObject)extData->reqWidget)->icon_cache);
Packit b099d7
Packit b099d7
    _XmExtImportArgs((Widget)newSec, args, num_args);
Packit b099d7
Packit b099d7
    return FALSE;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  GetValuesPrehook
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void 
Packit b099d7
GetValuesPrehook(
Packit b099d7
        Widget newParent,
Packit b099d7
        ArgList args,
Packit b099d7
        Cardinal *num_args )
Packit b099d7
{
Packit b099d7
    XmWidgetExtData             extData;
Packit b099d7
    XmBaseClassExt              *cePtr;
Packit b099d7
    WidgetClass                 ec;
Packit b099d7
    XmIconGCacheObject     newSec;
Packit b099d7
    Cardinal                    size;
Packit b099d7
Packit b099d7
    cePtr = _XmGetBaseClassExtPtr(XtClass(newParent), XmQmotif);
Packit b099d7
    ec = (*cePtr)->secondaryObjectClass;
Packit b099d7
    size = ec->core_class.widget_size;
Packit b099d7
Packit b099d7
    _XmProcessLock();
Packit b099d7
    newSec = (XmIconGCacheObject)_XmExtObjAlloc(size);
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
Packit b099d7
    newSec->object.self = (Widget)newSec;
Packit b099d7
    newSec->object.widget_class = ec;
Packit b099d7
    newSec->object.parent = XtParent(newParent);
Packit b099d7
    newSec->object.xrm_name = newParent->core.xrm_name;
Packit b099d7
    newSec->object.being_destroyed = False;
Packit b099d7
    newSec->object.destroy_callbacks = NULL;
Packit b099d7
    newSec->object.constraints = NULL;
Packit b099d7
Packit b099d7
    newSec->ext.logicalParent = newParent;
Packit b099d7
    newSec->ext.extensionType = XmCACHE_EXTENSION;
Packit b099d7
Packit b099d7
    memcpy( &(newSec->icon_cache), 
Packit b099d7
            IG_Cache(newParent),
Packit b099d7
            sizeof(XmIconGCacheObjPart));
Packit b099d7
Packit b099d7
    extData = (XmWidgetExtData) XtCalloc(1, sizeof(XmWidgetExtDataRec));
Packit b099d7
    extData->widget = (Widget)newSec;
Packit b099d7
    _XmPushWidgetExtData(newParent, extData, XmCACHE_EXTENSION);
Packit b099d7
Packit b099d7
    XtGetSubvalues((XtPointer)newSec,
Packit b099d7
                   ec->core_class.resources,
Packit b099d7
                   ec->core_class.num_resources,
Packit b099d7
                   args, *num_args);
Packit b099d7
Packit b099d7
    _XmExtGetValuesHook((Widget)newSec, args, num_args);
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  GetValuesPosthook
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void 
Packit b099d7
GetValuesPosthook(
Packit b099d7
        Widget new_w,
Packit b099d7
        ArgList args,
Packit b099d7
        Cardinal *num_args )
Packit b099d7
{
Packit b099d7
    XmWidgetExtData ext;
Packit b099d7
Packit b099d7
    _XmPopWidgetExtData(new_w, &ext, XmCACHE_EXTENSION);
Packit b099d7
Packit b099d7
    _XmProcessLock();
Packit b099d7
    _XmExtObjFree((XtPointer) ext->widget);
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
    XtFree( (char *) ext);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  SetValuesPosthook
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static Boolean 
Packit b099d7
SetValuesPosthook(
Packit b099d7
        Widget current,
Packit b099d7
        Widget req,
Packit b099d7
        Widget new_w,
Packit b099d7
        ArgList args,
Packit b099d7
        Cardinal *num_args )
Packit b099d7
{
Packit b099d7
    XmWidgetExtData             ext;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * - register parts in cache.
Packit b099d7
     * - update cache pointers
Packit b099d7
     * - and free req
Packit b099d7
     */
Packit b099d7
Packit b099d7
    /* assign if changed! */
Packit b099d7
    _XmProcessLock();
Packit b099d7
    if (!IconGCacheCompare((XtPointer) IG_Cache(new_w),
Packit b099d7
			  (XtPointer) IG_Cache(current)))
Packit b099d7
    {
Packit b099d7
          /* delete the old one */
Packit b099d7
	_XmCacheDelete( (XtPointer) IG_Cache(current));  
Packit b099d7
Packit b099d7
	IG_Cache(new_w) = (XmIconGCacheObjPart *)
Packit b099d7
            _XmCachePart(IG_ClassCachePart(new_w),
Packit b099d7
                         (XtPointer) IG_Cache(new_w),
Packit b099d7
                         sizeof(XmIconGCacheObjPart));
Packit b099d7
     } else
Packit b099d7
	 IG_Cache(new_w) = IG_Cache(current);
Packit b099d7
Packit b099d7
    _XmPopWidgetExtData(new_w, &ext, XmCACHE_EXTENSION);
Packit b099d7
Packit b099d7
    _XmExtObjFree((XtPointer) ext->widget);
Packit b099d7
    _XmExtObjFree((XtPointer) ext->reqWidget);
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
Packit b099d7
    XtFree( (char *) ext);
Packit b099d7
Packit b099d7
    return FALSE;
Packit b099d7
}
Packit b099d7
Packit b099d7
/*----------------
Packit b099d7
| RectObj methods |
Packit b099d7
----------------*/
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 * ClassInitialize
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
static void
Packit b099d7
ClassInitialize( void )
Packit b099d7
{
Packit b099d7
    iconGBaseClassExtRec.record_type = XmQmotif;
Packit b099d7
Packit b099d7
   /* Install the special converters for pixmap/mask */
Packit b099d7
    XtSetTypeConverter (XmRString, XmRLargeIconPixmap,
Packit b099d7
			CvtStringToIconPixmap, 
Packit b099d7
			largeIconArgs, XtNumber(largeIconArgs),
Packit b099d7
			(XtCacheNone | XtCacheRefCount), NULL);
Packit b099d7
	
Packit b099d7
    XtSetTypeConverter (XmRString, XmRSmallIconPixmap,
Packit b099d7
			CvtStringToIconPixmap, 
Packit b099d7
			smallIconArgs, XtNumber(smallIconArgs),
Packit b099d7
			(XtCacheNone | XtCacheRefCount), NULL);
Packit b099d7
	
Packit b099d7
    largeIconContext = XUniqueContext();
Packit b099d7
    smallIconContext = XUniqueContext();
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 * ClassPartInitialize
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
static void
Packit b099d7
ClassPartInitialize(
Packit b099d7
	WidgetClass	wc)
Packit b099d7
{
Packit b099d7
    _XmFastSubclassInit(wc, XmICONGADGET_BIT);
Packit b099d7
Packit b099d7
    /* Install the containerItem trait for me and all subclasses */
Packit b099d7
    XmeTraitSet((XtPointer) wc, XmQTcontainerItem, (XtPointer)&iconCIT);
Packit b099d7
Packit b099d7
    /* Install the care Visual trait for me and all subclasses */
Packit b099d7
    XmeTraitSet((XtPointer) wc, XmQTcareParentVisual, (XtPointer)&iconCVT);
Packit b099d7
Packit b099d7
   /* Install the accessColors trait for all subclasses as well. */
Packit b099d7
    XmeTraitSet((XtPointer) wc, XmQTaccessColors, (XtPointer)&iconACT);
Packit b099d7
Packit b099d7
   /* Install the pointIn trait for all subclasses as well. */
Packit b099d7
    XmeTraitSet((XtPointer) wc, XmQTpointIn, (XtPointer)&iconPIT);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 * Initialize
Packit b099d7
 ************************************************************************/
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static	void
Packit b099d7
Initialize(
Packit b099d7
	Widget		rw,
Packit b099d7
	Widget		nw,
Packit b099d7
	ArgList		args,	/* unused */
Packit b099d7
	Cardinal	*num_args) /* unused */
Packit b099d7
{
Packit b099d7
    XmIconGadget	new_ig = (XmIconGadget)nw;
Packit b099d7
    unsigned int w = 0, h = 0;
Packit b099d7
    Cardinal i ;
Packit b099d7
Packit b099d7
    /* XmNviewType */
Packit b099d7
    if (!XmRepTypeValidValue(XmRID_VIEW_TYPE,IG_ViewType(nw),nw))
Packit b099d7
	IG_ViewType(nw) = XmLARGE_ICON;
Packit b099d7
Packit b099d7
Packit b099d7
    /* XmNvisualEmphasis */
Packit b099d7
    if (!XmRepTypeValidValue(XmRID_VISUAL_EMPHASIS,
Packit b099d7
			     IG_VisualEmphasis(nw),nw))
Packit b099d7
	IG_VisualEmphasis(nw) = XmNOT_SELECTED;
Packit b099d7
Packit b099d7
Packit b099d7
    /* XmNalignment */
Packit b099d7
    if (!XmRepTypeValidValue(XmRID_ALIGNMENT, IG_Alignment(nw), nw))
Packit b099d7
	IG_Alignment(nw) = XmALIGNMENT_CENTER;
Packit b099d7
Packit b099d7
Packit b099d7
    /* XmNrenderTable */
Packit b099d7
    if (IG_RenderTable(nw) == NULL) {
Packit b099d7
	XmRenderTable	defaultRT = NULL;
Packit b099d7
		
Packit b099d7
	XtVaGetValues(XtParent(nw), XmNrenderTable, &defaultRT, NULL);
Packit b099d7
	if (defaultRT == NULL)
Packit b099d7
	    defaultRT = XmeGetDefaultRenderTable(nw, XmLABEL_FONTLIST);
Packit b099d7
	IG_RenderTable(nw) = XmRenderTableCopy(defaultRT, NULL, 0);
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
	IG_RenderTable(nw) = XmRenderTableCopy(IG_RenderTable(nw), NULL, 0);
Packit b099d7
Packit b099d7
Packit b099d7
    /* XmNlabelString */
Packit b099d7
    if (!IG_LabelString(nw)) {
Packit b099d7
	IG_LabelString(nw) =  XmeGetLocalizedString (
Packit b099d7
				(char *) NULL, nw, XmNlabelString,
Packit b099d7
				XrmQuarkToString(new_ig->object.xrm_name));
Packit b099d7
    } else 
Packit b099d7
	IG_LabelString(nw) = XmStringCopy(IG_LabelString(nw));
Packit b099d7
Packit b099d7
	
Packit b099d7
Packit b099d7
    /* XmNdetail */
Packit b099d7
    if (IG_Detail(nw) && IG_DetailCount(nw)) {
Packit b099d7
	IG_Detail(nw) = (XmStringTable) 
Packit b099d7
	    XtMalloc(IG_DetailCount(nw) * sizeof(XmString));
Packit b099d7
Packit b099d7
	for (i=0; i
Packit b099d7
	    IG_Detail(nw)[i] = XmStringCopy(IG_Detail(rw)[i]);
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
    /* get the label size */
Packit b099d7
    if (!XmStringEmpty(IG_LabelString(nw)))
Packit b099d7
	XmStringExtent(IG_RenderTable(nw), IG_LabelString(nw),
Packit b099d7
		       &(IG_LabelRectWidth(nw)),
Packit b099d7
		       &(IG_LabelRectHeight(nw)));
Packit b099d7
    else {
Packit b099d7
	IG_LabelRectWidth(nw) = 0 ;
Packit b099d7
	IG_LabelRectHeight(nw) = 0 ;
Packit b099d7
    }
Packit b099d7
    /* put the margins in the label size, we'll remove them when
Packit b099d7
       it's time to draw the label */
Packit b099d7
    IG_LabelRectWidth(nw) += 2*DEFAULT_LABEL_MARGIN_WIDTH ;
Packit b099d7
    IG_LabelRectHeight(nw) += 2*DEFAULT_LABEL_MARGIN_HEIGHT  ;
Packit b099d7
Packit b099d7
Packit b099d7
    /* before doing anything with the pixmap, check if we have to
Packit b099d7
       re-ask for a conversion */
Packit b099d7
    if (IG_LargeIconPixmap(nw) == XmDELAYED_PIXMAP) {
Packit b099d7
	/* this test means that a conversion was asked for
Packit b099d7
	   but failed because the colors were not accessible
Packit b099d7
	   prior to Initialize, because the cache wasn't there yet.
Packit b099d7
	   We have to try again from here. */
Packit b099d7
	FetchPixmap(nw, IG_LargePixmapName(nw), XmLARGE_ICON,
Packit b099d7
		    &(IG_LargeIconPixmap(nw)));
Packit b099d7
	if (IG_LargeIconPixmap(nw) == XmUNSPECIFIED_PIXMAP) {
Packit b099d7
	    XtDisplayStringConversionWarning(XtDisplay(nw), 
Packit b099d7
					     IG_LargePixmapName(nw),
Packit b099d7
					     "Large/SmallIconPixmap");
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
    if (IG_SmallIconPixmap(nw) == XmDELAYED_PIXMAP) {
Packit b099d7
	FetchPixmap(nw, IG_SmallPixmapName(nw), XmSMALL_ICON,
Packit b099d7
		    &(IG_SmallIconPixmap(nw)));
Packit b099d7
	if (IG_SmallIconPixmap(nw) == XmUNSPECIFIED_PIXMAP) {
Packit b099d7
	    XtDisplayStringConversionWarning(XtDisplay(nw), 
Packit b099d7
					     IG_SmallPixmapName(nw),
Packit b099d7
					     "Large/SmallIconPixmap");
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
    /* get the large icon size */
Packit b099d7
    if (PIXMAP_VALID(IG_LargeIconPixmap(nw)))
Packit b099d7
	XmeGetPixmapData(XtScreen(nw),
Packit b099d7
			 IG_LargeIconPixmap(nw),
Packit b099d7
			 NULL,    
Packit b099d7
			 NULL,
Packit b099d7
			 NULL, NULL,
Packit b099d7
			 NULL, NULL,
Packit b099d7
			 &w, &h); 
Packit b099d7
    else {
Packit b099d7
	w = h = 0 ;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    IG_LargeIconRectWidth(nw)  = (Dimension)w;
Packit b099d7
    IG_LargeIconRectHeight(nw) = (Dimension)h;
Packit b099d7
Packit b099d7
    /* get the small icon size */
Packit b099d7
    if (PIXMAP_VALID(IG_SmallIconPixmap(nw)))
Packit b099d7
	XmeGetPixmapData(XtScreen(nw),
Packit b099d7
			 IG_SmallIconPixmap(nw),
Packit b099d7
			 NULL,    
Packit b099d7
			 NULL,
Packit b099d7
			 NULL, NULL,
Packit b099d7
			 NULL, NULL,
Packit b099d7
			 &w, &h); 
Packit b099d7
    else {
Packit b099d7
	w = h = 0 ;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    IG_SmallIconRectWidth(nw)  = (Dimension)w;
Packit b099d7
    IG_SmallIconRectHeight(nw) = (Dimension)h;
Packit b099d7
Packit b099d7
    /* turn None in unspecified, since it is the only value
Packit b099d7
       Container supports */
Packit b099d7
    if (IG_LargeIconPixmap(nw) == None) 
Packit b099d7
	IG_LargeIconPixmap(nw) = XmUNSPECIFIED_PIXMAP ;
Packit b099d7
    if (IG_SmallIconPixmap(nw) == None) 
Packit b099d7
	IG_SmallIconPixmap(nw) = XmUNSPECIFIED_PIXMAP ;
Packit b099d7
Packit b099d7
    /*****
Packit b099d7
      we want the mask to act as a max for the size of the
Packit b099d7
      overall pixmap .
Packit b099d7
      We need to get the mask sizes first.
Packit b099d7
Packit b099d7
    if (IG_LargeMaskWidth(nw))
Packit b099d7
	IG_LargeIconRectWidth(nw)  = MIN(IG_LargeIconRectWidth(nw),
Packit b099d7
					 IG_LargeMaskWidth(nw)) ;
Packit b099d7
Packit b099d7
    if (IG_LargeMaskHeight(nw))
Packit b099d7
	IG_LargeIconRectHeight(nw)  = MIN(IG_LargeIconRectHeight(nw),
Packit b099d7
					  IG_LargeMaskHeight(nw)) ;
Packit b099d7
Packit b099d7
    if (IG_SmallMaskWidth(nw))
Packit b099d7
	IG_SmallIconRectWidth(nw)  = MIN(IG_SmallIconRectWidth(nw),
Packit b099d7
					 IG_SmallMaskWidth(nw)) ;
Packit b099d7
Packit b099d7
    if (IG_SmallMaskHeight(nw))
Packit b099d7
	IG_SmallIconRectHeight(nw)  = MIN(IG_SmallIconRectHeight(nw),
Packit b099d7
					  IG_SmallMaskHeight(nw)) ;
Packit b099d7
	*****/
Packit b099d7
Packit b099d7
    /* undo our superclass size check */
Packit b099d7
    if (((XmGadget)rw)->rectangle.width == 0)
Packit b099d7
	new_ig->rectangle.width = 0;
Packit b099d7
Packit b099d7
    if (((XmGadget)rw)->rectangle.height == 0)
Packit b099d7
	new_ig->rectangle.height = 0;
Packit b099d7
Packit b099d7
    /* if a size has been specified (not 0), it won't be altered 
Packit b099d7
       by the GetSize function */
Packit b099d7
    GetSize(nw, &new_ig->rectangle.width, &new_ig->rectangle.height);
Packit b099d7
Packit b099d7
Packit b099d7
    IG_NormalGC(nw) = NULL;
Packit b099d7
    IG_BackgroundGC(nw) = NULL;
Packit b099d7
    IG_InsensitiveGC(nw) = NULL;
Packit b099d7
#ifdef FIX_1381
Packit b099d7
    IG_ShadowGC(nw) = NULL;
Packit b099d7
#endif
Packit b099d7
    IG_TopShadowGC(nw) = NULL;
Packit b099d7
    IG_BottomShadowGC(nw) = NULL;
Packit b099d7
    IG_HighlightGC(nw) = NULL;
Packit b099d7
    IG_InverseGC(nw) = NULL;  
Packit b099d7
    IG_SelectedGC(nw) = NULL;  /* otherwize UpdateGCs frees them */
Packit b099d7
    UpdateGCs(nw);
Packit b099d7
Packit b099d7
Packit b099d7
    new_ig->gadget.event_mask =  XmHELP_EVENT |
Packit b099d7
        XmFOCUS_IN_EVENT | XmFOCUS_OUT_EVENT | XmENTER_EVENT | XmLEAVE_EVENT ;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 * Destroy
Packit b099d7
 ************************************************************************/
Packit b099d7
static	void
Packit b099d7
Destroy(
Packit b099d7
	Widget	wid)
Packit b099d7
{
Packit b099d7
    Cardinal i ;
Packit b099d7
Packit b099d7
    if (IG_RenderTable(wid) != NULL) XmRenderTableFree(IG_RenderTable(wid));
Packit b099d7
Packit b099d7
    if (IG_LabelString(wid) != NULL) XmStringFree(IG_LabelString(wid));
Packit b099d7
Packit b099d7
    if (IG_Detail(wid) && IG_DetailCount(wid)) {
Packit b099d7
	for (i=0; i
Packit b099d7
	    XmStringFree(IG_Detail(wid)[i]);
Packit b099d7
	XtFree((char*)IG_Detail(wid));
Packit b099d7
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (OwnLargeMask(wid)) {
Packit b099d7
	if (PIXMAP_VALID(IG_LargeIconMask(wid)) )
Packit b099d7
	    XmDestroyPixmap(XtScreen(wid),IG_LargeIconMask(wid));
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (OwnSmallMask(wid)) {
Packit b099d7
	if (PIXMAP_VALID(IG_SmallIconMask(wid)))
Packit b099d7
	    XmDestroyPixmap(XtScreen(wid),IG_SmallIconMask(wid));
Packit b099d7
    }
Packit b099d7
    /* the IconPixmap is freed by the converter destructor */
Packit b099d7
Packit b099d7
    XtReleaseGC(XtParent(wid),IG_NormalGC(wid));
Packit b099d7
    XtReleaseGC(XtParent(wid),IG_InsensitiveGC(wid));
Packit b099d7
#ifdef FIX_1381
Packit b099d7
    XtReleaseGC(XtParent(wid),IG_ShadowGC(wid));
Packit b099d7
#endif
Packit b099d7
    XtReleaseGC(XtParent(wid),IG_BackgroundGC(wid));
Packit b099d7
    XtReleaseGC(XtParent(wid),IG_SelectedGC(wid));
Packit b099d7
    if (IG_InverseGC(wid)) XtReleaseGC(XtParent(wid),IG_InverseGC(wid));
Packit b099d7
    XtReleaseGC(XtParent(wid),IG_TopShadowGC(wid));
Packit b099d7
    XtReleaseGC(XtParent(wid),IG_BottomShadowGC(wid));
Packit b099d7
    XtReleaseGC(XtParent(wid),IG_HighlightGC(wid));
Packit b099d7
Packit b099d7
    _XmProcessLock();
Packit b099d7
    _XmCacheDelete((XtPointer) IG_Cache(wid));
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
  
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
    
Packit b099d7
/************************************************************************
Packit b099d7
 * GetLabelXY
Packit b099d7
 *  from origin of gadget
Packit b099d7
 ************************************************************************/
Packit b099d7
static	void
Packit b099d7
GetLabelXY(
Packit b099d7
	Widget		wid,
Packit b099d7
	Position * x_ret,
Packit b099d7
        Position * y_ret)
Packit b099d7
{
Packit b099d7
    Dimension ist = IG_ShadowThickness(wid);
Packit b099d7
    Position label_x = ist;
Packit b099d7
    Position label_y = ist;
Packit b099d7
Packit b099d7
#define HAS_PIXMAP(wid) \
Packit b099d7
    (((IG_ViewType(wid) == XmLARGE_ICON) && \
Packit b099d7
      (PIXMAP_VALID(IG_LargeIconPixmap(wid)))) || \
Packit b099d7
     ((IG_ViewType(wid) == XmSMALL_ICON) && \
Packit b099d7
      (PIXMAP_VALID(IG_SmallIconPixmap(wid)))))
Packit b099d7
Packit b099d7
#define SPACING(wid) (HAS_PIXMAP(wid) ? IG_Spacing(wid) : 0)
Packit b099d7
Packit b099d7
#define HAS_MASK(wid) \
Packit b099d7
    (((IG_ViewType(wid) == XmSMALL_ICON) && \
Packit b099d7
      (PIXMAP_VALID(IG_SmallIconMask(wid)))) ||\
Packit b099d7
     ((IG_ViewType(wid) == XmLARGE_ICON) && \
Packit b099d7
      (PIXMAP_VALID(IG_LargeIconMask(wid)))))
Packit b099d7
	    
Packit b099d7
    if (IG_ViewType(wid) == XmLARGE_ICON) {
Packit b099d7
Packit b099d7
	if ((IG_Alignment(wid) == XmALIGNMENT_CENTER) && !HAS_MASK(wid) &&
Packit b099d7
	    (IG_LargeIconRectWidth(wid) > IG_LabelRectWidth(wid)))
Packit b099d7
	    label_x += (IG_LargeIconRectWidth(wid) - IG_LabelRectWidth(wid))/2;
Packit b099d7
	else if ((IG_Alignment(wid) == XmALIGNMENT_CENTER) && HAS_MASK(wid) &&
Packit b099d7
		 (IG_LargeIconRectWidth(wid) > IG_LabelRectWidth(wid) + 2*ist))
Packit b099d7
	    label_x += (IG_LargeIconRectWidth(wid) -
Packit b099d7
			IG_LabelRectWidth(wid) - 2*ist)/2;
Packit b099d7
	else if ((IG_Alignment(wid) == XmALIGNMENT_END) && !HAS_MASK(wid) &&
Packit b099d7
		 (IG_LargeIconRectWidth(wid) > IG_LabelRectWidth(wid)))
Packit b099d7
	    label_x += IG_LargeIconRectWidth(wid) - IG_LabelRectWidth(wid);
Packit b099d7
	else if ((IG_Alignment(wid) == XmALIGNMENT_END) && HAS_MASK(wid) &&
Packit b099d7
		 (IG_LargeIconRectWidth(wid) > IG_LabelRectWidth(wid) + 2*ist))
Packit b099d7
	    label_x +=
Packit b099d7
		IG_LargeIconRectWidth(wid) - IG_LabelRectWidth(wid) - 2*ist;
Packit b099d7
Packit b099d7
	label_y += IG_LargeIconRectHeight(wid) + SPACING(wid);
Packit b099d7
Packit b099d7
    } else { /* XmSMALL_ICON */
Packit b099d7
Packit b099d7
	label_x += IG_SmallIconRectWidth(wid) + SPACING(wid);
Packit b099d7
Packit b099d7
	if (!HAS_MASK(wid) &&
Packit b099d7
	    (IG_SmallIconRectHeight(wid) > IG_LabelRectHeight(wid)))
Packit b099d7
	    label_y += (IG_SmallIconRectHeight(wid) -
Packit b099d7
			IG_LabelRectHeight(wid))/2 ;
Packit b099d7
	else if (HAS_MASK(wid) &&
Packit b099d7
	       (IG_SmallIconRectHeight(wid) > IG_LabelRectHeight(wid) + 2*ist))
Packit b099d7
	    label_y += (IG_SmallIconRectHeight(wid) -
Packit b099d7
			IG_LabelRectHeight(wid) - 2*ist)/2 ;
Packit b099d7
    }
Packit b099d7
    label_x += IG_MarginWidth(wid);
Packit b099d7
    /* test LayoutIsRtoLG(wid) here */
Packit b099d7
    if (LayoutIsRtoLG(wid)) {
Packit b099d7
	label_x = XtWidth(wid) - label_x - IG_LabelRectWidth(wid) 
Packit b099d7
	    - IG_HLThickness(wid);
Packit b099d7
    } else {
Packit b099d7
	label_x += IG_HLThickness(wid) ;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (x_ret) *x_ret = label_x;
Packit b099d7
    if (y_ret) *y_ret = label_y + IG_HLThickness(wid) + IG_MarginHeight(wid);
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 * GetLargeIconX
Packit b099d7
 ************************************************************************/
Packit b099d7
static	Position
Packit b099d7
GetLargeIconX(
Packit b099d7
	Widget		wid)
Packit b099d7
{
Packit b099d7
    /* no test LayoutIsRtoLG(wid) here */
Packit b099d7
    Dimension ist = IG_ShadowThickness(wid);
Packit b099d7
    Position large_x = IG_HLThickness(wid) + IG_MarginWidth(wid);
Packit b099d7
Packit b099d7
    if ((IG_Alignment(wid) == XmALIGNMENT_CENTER) && !HAS_MASK(wid) &&
Packit b099d7
	(IG_LabelRectWidth(wid) > IG_LargeIconRectWidth(wid)))
Packit b099d7
	large_x += (IG_LabelRectWidth(wid) - IG_LargeIconRectWidth(wid)) /2;
Packit b099d7
    else if ((IG_Alignment(wid) == XmALIGNMENT_CENTER) && HAS_MASK(wid) &&
Packit b099d7
	     (IG_LabelRectWidth(wid) + 2*ist > IG_LargeIconRectWidth(wid)))
Packit b099d7
	large_x +=
Packit b099d7
	    (IG_LabelRectWidth(wid) + 2*ist - IG_LargeIconRectWidth(wid)) /2;
Packit b099d7
    else if ((IG_Alignment(wid) == XmALIGNMENT_END) && !HAS_MASK(wid) &&
Packit b099d7
	     (IG_LargeIconRectWidth(wid) < IG_LabelRectWidth(wid)))
Packit b099d7
	large_x += IG_LabelRectWidth(wid) - IG_LargeIconRectWidth(wid);
Packit b099d7
    else if ((IG_Alignment(wid) == XmALIGNMENT_END) && HAS_MASK(wid) &&
Packit b099d7
	     (IG_LargeIconRectWidth(wid) < IG_LabelRectWidth(wid) + 2*ist))
Packit b099d7
	large_x += IG_LabelRectWidth(wid) + 2*ist - IG_LargeIconRectWidth(wid);
Packit b099d7
Packit b099d7
    if (!HAS_MASK(wid))
Packit b099d7
	large_x += ist;
Packit b099d7
Packit b099d7
    return large_x;
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 * GetLargeIconY
Packit b099d7
 ************************************************************************/
Packit b099d7
/* the shadow thickness is only incorporated when there is no mask */
Packit b099d7
#define GetLargeIconY(wid) (IG_HLThickness(wid) + IG_MarginHeight(wid) + \
Packit b099d7
			    (HAS_MASK(wid) ? 0 : IG_ShadowThickness(wid)))
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 * GetSmallIconX
Packit b099d7
 ************************************************************************/
Packit b099d7
/* the shadow thickness is only incorporated when there is no mask */
Packit b099d7
#define GetSmallIconX(wid) (IG_HLThickness(wid) + IG_MarginWidth(wid) + \
Packit b099d7
			    (HAS_MASK(wid) ? 0 : IG_ShadowThickness(wid)))
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 * GetSmallIconY
Packit b099d7
 ************************************************************************/
Packit b099d7
static	Position
Packit b099d7
GetSmallIconY(
Packit b099d7
	Widget		wid)
Packit b099d7
{
Packit b099d7
    Dimension ist = IG_ShadowThickness(wid);
Packit b099d7
    Position small_y = IG_HLThickness(wid) + IG_MarginHeight(wid);
Packit b099d7
Packit b099d7
    if (!HAS_MASK(wid) &&
Packit b099d7
	(IG_LabelRectHeight(wid) > IG_SmallIconRectHeight(wid)))
Packit b099d7
	small_y += (IG_LabelRectHeight(wid) - IG_SmallIconRectHeight(wid))/2;
Packit b099d7
    else if (HAS_MASK(wid) &&
Packit b099d7
	     (IG_LabelRectHeight(wid) + 2*ist > IG_SmallIconRectHeight(wid)))
Packit b099d7
	small_y += (IG_LabelRectHeight(wid) + 2*ist -
Packit b099d7
		    IG_SmallIconRectHeight(wid))/2;
Packit b099d7
    if (!HAS_MASK(wid))
Packit b099d7
	small_y += ist;
Packit b099d7
Packit b099d7
    return small_y;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 * GetIconLabelWidth
Packit b099d7
 *  including the shadows, the spacing, and the margin
Packit b099d7
 ************************************************************************/
Packit b099d7
static	Dimension
Packit b099d7
GetIconLabelWidth(
Packit b099d7
	Widget		wid)
Packit b099d7
{
Packit b099d7
    Dimension width = 2*IG_MarginWidth(wid);
Packit b099d7
Packit b099d7
    if (IG_ViewType(wid) == XmLARGE_ICON) {
Packit b099d7
	if (!HAS_MASK(wid))
Packit b099d7
	    width += MAX(IG_LargeIconRectWidth(wid),
Packit b099d7
			 IG_LabelRectWidth(wid)) + 2*IG_ShadowThickness(wid);
Packit b099d7
	else
Packit b099d7
	    width += MAX(IG_LargeIconRectWidth(wid),
Packit b099d7
			 IG_LabelRectWidth(wid) + 2*IG_ShadowThickness(wid));
Packit b099d7
    } else { /* XmSMALL_ICON */
Packit b099d7
	width += IG_SmallIconRectWidth(wid) + IG_LabelRectWidth(wid) +
Packit b099d7
	    2*IG_ShadowThickness(wid) + SPACING(wid);
Packit b099d7
    }
Packit b099d7
    return width;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 * GetIconLabelHeight
Packit b099d7
 *  including the shadows, the possible spacing, and the margin
Packit b099d7
 ************************************************************************/
Packit b099d7
static	Dimension
Packit b099d7
GetIconLabelHeight(
Packit b099d7
	Widget		wid)
Packit b099d7
{
Packit b099d7
    Dimension height = 2*IG_MarginHeight(wid);
Packit b099d7
Packit b099d7
    if (IG_ViewType(wid) == XmLARGE_ICON) {
Packit b099d7
	height += IG_LargeIconRectHeight(wid) + IG_LabelRectHeight(wid) +
Packit b099d7
	    2*IG_ShadowThickness(wid) + SPACING(wid);
Packit b099d7
    } else {
Packit b099d7
	if (!HAS_MASK(wid))
Packit b099d7
	    height += MAX(IG_SmallIconRectHeight(wid),
Packit b099d7
			  IG_LabelRectHeight(wid)) + 2*IG_ShadowThickness(wid);
Packit b099d7
	else
Packit b099d7
	    height += MAX(IG_SmallIconRectHeight(wid),
Packit b099d7
			  IG_LabelRectHeight(wid) + 2*IG_ShadowThickness(wid));
Packit b099d7
    }
Packit b099d7
    return height;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/***********
Packit b099d7
 * GetShapeInfo.
Packit b099d7
 *  This return the points that defines the shadow rectangle.
Packit b099d7
 *  Since this function is used for both shadow and highlight,
Packit b099d7
 *  the ht parameter is used to differentiate both case. It is -1
Packit b099d7
 *  for the highlight case and the real highlightthickness for
Packit b099d7
 *  the shadow case.
Packit b099d7
 *  The coordinates passed in should not have integrate any RtoL
Packit b099d7
 *  layout yet, since the function is doing mirroring at the end.
Packit b099d7
 *
Packit b099d7
 * The function returns the number of valid points (8 points in 
Packit b099d7
 *  the generic case or only 2 points for a rectangle).
Packit b099d7
 *
Packit b099d7
 **********/
Packit b099d7
static Cardinal
Packit b099d7
GetShapeInfo(
Packit b099d7
        Widget wid,
Packit b099d7
        Position large_icon_x,
Packit b099d7
        Position small_icon_y,
Packit b099d7
        Position label_x,
Packit b099d7
        Position label_y,
Packit b099d7
        Dimension first_column_width,
Packit b099d7
        Dimension ht,
Packit b099d7
        XPoint * points)
Packit b099d7
{
Packit b099d7
    Dimension ist = IG_ShadowThickness(wid), rht = IG_HLThickness(wid);
Packit b099d7
    Cardinal i, n = 8;
Packit b099d7
    XmIconGadget ig = (XmIconGadget) wid ;
Packit b099d7
    Boolean highlight_case ;
Packit b099d7
    Dimension mh, mw, rmh = IG_MarginHeight(wid), rmw = IG_MarginWidth(wid);
Packit b099d7
    Dimension maxX;
Packit b099d7
Packit b099d7
    if (ht == INVALID_DIMENSION) { 
Packit b099d7
	/* If we're doing the highlight case, mark the dimension
Packit b099d7
	   as zero but remember it so that the shadow is not drawn
Packit b099d7
	   later on in this routine */
Packit b099d7
	ht = 0 ;
Packit b099d7
	highlight_case = True ;
Packit b099d7
	mw = mh = 0;
Packit b099d7
    } else {
Packit b099d7
	highlight_case = False ;
Packit b099d7
	mw = rmw;
Packit b099d7
	mh = rmh;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /* then first treat the simple case where either the pixmap or 
Packit b099d7
       the label is missing */
Packit b099d7
    points[0].x = ht + mw;
Packit b099d7
    points[0].y = ht + mh;
Packit b099d7
    points[1].x = 2*ist + 2*rht - ht + 2*rmw - mw;
Packit b099d7
    points[1].y = 2*ist + 2*rht - ht + 2*rmh - mh;
Packit b099d7
Packit b099d7
    if (XmStringEmpty(IG_LabelString(wid))) { /* no label */
Packit b099d7
	if ((IG_ViewType(wid) == XmLARGE_ICON) && 
Packit b099d7
	    (PIXMAP_VALID(IG_LargeIconPixmap(wid)))) {
Packit b099d7
	    points[1].x += IG_LargeIconRectWidth(wid) ;
Packit b099d7
	    points[1].y += IG_LargeIconRectHeight(wid) ;
Packit b099d7
	}
Packit b099d7
	if ((IG_ViewType(wid) == XmSMALL_ICON) && 
Packit b099d7
	    (PIXMAP_VALID(IG_SmallIconPixmap(wid)))) {
Packit b099d7
	    points[1].x += IG_SmallIconRectWidth(wid) ;
Packit b099d7
	    points[1].y += IG_SmallIconRectHeight(wid) ;
Packit b099d7
	}
Packit b099d7
	n = 2 ;
Packit b099d7
    } else  {/* a label */
Packit b099d7
	if (!HAS_PIXMAP(wid)) { /* but no pixmap */
Packit b099d7
	    points[1].x += IG_LabelRectWidth(wid) ;
Packit b099d7
	    points[1].y += IG_LabelRectHeight(wid) ;
Packit b099d7
	    n = 2 ;
Packit b099d7
	}	
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (n == 8 && IG_ViewType(wid) == XmLARGE_ICON) {
Packit b099d7
	/* point #0 is top left corner of label */
Packit b099d7
	points[0].x = label_x - ist - rht + ht - rmw + mw;
Packit b099d7
	points[0].y = ht + mh + IG_LargeIconRectHeight(wid);
Packit b099d7
	if ((!HAS_MASK(wid) &&
Packit b099d7
	     (IG_LargeIconRectWidth(wid) > IG_LabelRectWidth(wid))) ||
Packit b099d7
	    (HAS_MASK(wid) &&
Packit b099d7
	     (IG_LargeIconRectWidth(wid) > IG_LabelRectWidth(wid) + 2*ist))) {
Packit b099d7
	    points[0].y += 2*rht - 2*ht + 2*rmh - 2*mh;
Packit b099d7
	    if (!HAS_MASK(wid)) points[0].y += 2*ist -1;
Packit b099d7
	    else if (highlight_case) points[0].y -= 1;
Packit b099d7
	    if (!highlight_case && HAS_MASK(wid))
Packit b099d7
		points[0].y += SPACING(wid);
Packit b099d7
	} else
Packit b099d7
	    points[0].y += SPACING(wid);
Packit b099d7
	points[1].x = large_icon_x - (ist + rht - ht + rmw - mw);
Packit b099d7
	if (highlight_case && HAS_MASK(wid)) points[1].x += ist;
Packit b099d7
	points[1].y = points[0].y ;
Packit b099d7
	points[2].x = points[1].x ;
Packit b099d7
	points[2].y = ht + mh;
Packit b099d7
	points[3].x = large_icon_x + 
Packit b099d7
	    IG_LargeIconRectWidth(wid) + ist + rht - ht + rmw - mw -1;
Packit b099d7
	if (highlight_case && HAS_MASK(wid)) points[3].x -= ist;
Packit b099d7
	points[3].y = points[2].y ;
Packit b099d7
	points[4].x = points[3].x ;
Packit b099d7
	points[4].y = points[0].y;
Packit b099d7
	points[5].x = label_x +
Packit b099d7
	    IG_LabelRectWidth(wid) + ist + rht - ht + rmw - mw -1;
Packit b099d7
	if (!highlight_case && HAS_MASK(wid) && ist) points[5].x += 1 ;
Packit b099d7
	points[5].y = points[0].y ;
Packit b099d7
	points[6].x = points[5].x ;
Packit b099d7
	points[6].y = IG_LargeIconRectHeight(wid) + IG_LabelRectHeight(wid) +
Packit b099d7
	    2*ist + 2*rht - ht + 2*rmh - mh + SPACING(wid) -1;
Packit b099d7
	if (!highlight_case && HAS_MASK(wid) && ist) points[6].y += 1 ;
Packit b099d7
	points[7].x = points[0].x ;
Packit b099d7
	points[7].y = points[6].y ;
Packit b099d7
    } else if (n == 8) { /* SMALL_ICON */
Packit b099d7
	/* point #0 is top left corner of pixmap */
Packit b099d7
	points[0].x = ht + mw;
Packit b099d7
	points[0].y = small_icon_y - ist - rht + ht - rmh + mh;
Packit b099d7
        if (highlight_case && HAS_MASK(wid)) points[0].y += ist;
Packit b099d7
	points[1].x = IG_SmallIconRectWidth(wid) + ht + mw;
Packit b099d7
	if ((!HAS_MASK(wid) &&
Packit b099d7
	    (IG_SmallIconRectHeight(wid) > IG_LabelRectHeight(wid))) ||
Packit b099d7
	    (HAS_MASK(wid) &&
Packit b099d7
	     (IG_SmallIconRectHeight(wid) > IG_LabelRectHeight(wid) + 2*ist))){
Packit b099d7
	    points[1].x += 2*rht - 2*ht + 2*rmw - 2*mw;
Packit b099d7
	    if (!HAS_MASK(wid)) points[1].x += 2*ist -1;
Packit b099d7
	    else if (highlight_case) points[1].x -= 1;
Packit b099d7
	    if (!highlight_case && HAS_MASK(wid))
Packit b099d7
		points[1].x += SPACING(wid);
Packit b099d7
	} else
Packit b099d7
	    points[1].x += SPACING(wid);
Packit b099d7
	points[1].y = points[0].y;
Packit b099d7
	points[2].x = points[1].x;
Packit b099d7
	points[2].y = label_y - ist - rht + ht - rmh + mh;
Packit b099d7
	points[3].x = IG_SmallIconRectWidth(wid) + SPACING(wid) + 
Packit b099d7
	    IG_LabelRectWidth(wid) + 2*ist + 2*rht - ht + 2*rmw - mw -1;
Packit b099d7
	if (highlight_case && HAS_MASK(wid)) points[3].x -= 1 ;
Packit b099d7
	points[3].y = points[2].y;
Packit b099d7
	points[4].x = points[3].x;
Packit b099d7
	points[4].y = label_y + IG_LabelRectHeight(wid) +
Packit b099d7
	    ist + rht - ht + rmh - mh -1;
Packit b099d7
	if (!highlight_case && HAS_MASK(wid) && ist) points[4].y += 1;
Packit b099d7
	points[5].x = points[1].x;
Packit b099d7
	points[5].y = points[4].y;
Packit b099d7
	points[6].x = points[5].x;
Packit b099d7
	points[6].y = small_icon_y +
Packit b099d7
	    IG_SmallIconRectHeight(wid) + ist + rht - ht + rmh - mh -1;
Packit b099d7
	if (highlight_case && HAS_MASK(wid)) points[6].y -= ist;
Packit b099d7
	points[7].x = points[0].x ;
Packit b099d7
	points[7].y = points[6].y;
Packit b099d7
    } 
Packit b099d7
    
Packit b099d7
    /* now treat the case where the pixmap is present
Packit b099d7
       but it has a mask: no shadow around the pixmap, just the
Packit b099d7
       label, if there is a label of course.
Packit b099d7
       Only aply for the shadow, not for the highlight, so we 
Packit b099d7
       checked that using the ht parameter at the beginning */
Packit b099d7
    if (HAS_MASK(wid) && !highlight_case) {
Packit b099d7
	if (XmStringEmpty(IG_LabelString(wid))) {
Packit b099d7
	    return 0 ;
Packit b099d7
	} else 
Packit b099d7
	if (n == 8) {
Packit b099d7
	    /* uses the points already  computed for the polygon shadow case */
Packit b099d7
	    if (IG_ViewType(wid) == XmLARGE_ICON) {
Packit b099d7
		points[0].x = points[0].x ;
Packit b099d7
		points[0].y = points[0].y ;
Packit b099d7
		points[1].x = points[6].x ;
Packit b099d7
		points[1].y = points[6].y ;
Packit b099d7
	    } else {
Packit b099d7
		points[0].x = points[2].x ;
Packit b099d7
		points[0].y = points[2].y ;
Packit b099d7
		points[1].x = points[4].x ;
Packit b099d7
		points[1].y = points[4].y ;
Packit b099d7
	    }
Packit b099d7
	    n = 2 ;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /* put the points in the frame */
Packit b099d7
    if (highlight_case)
Packit b099d7
	maxX = ig->rectangle.width - ht - mw;
Packit b099d7
    else
Packit b099d7
	maxX = MIN(ig->rectangle.width - ht - mw, first_column_width);
Packit b099d7
    for (i=0; i
Packit b099d7
	if (points[i].x > maxX)
Packit b099d7
	    points[i].x = maxX;
Packit b099d7
	if (points[i].y > ig->rectangle.height - ht - mh)
Packit b099d7
	    points[i].y = ig->rectangle.height - ht - mh;
Packit b099d7
	
Packit b099d7
	/* add the gadget position in its parent */
Packit b099d7
	points[i].x += ig->rectangle.x ;
Packit b099d7
	points[i].y += ig->rectangle.y ;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /* test LayoutIsRtoLG(wid) here */
Packit b099d7
Packit b099d7
     if (LayoutIsRtoLG(wid) ) {
Packit b099d7
	 /* mirror the x position */
Packit b099d7
	 for (i = 0; i < n; i++)
Packit b099d7
	     points[i].x = 2*ig->rectangle.x + XtWidth(wid) - points[i].x -1;
Packit b099d7
	 /* + in the rectangle case, switch x because of XmeDrawShadow
Packit b099d7
	    required left-upper right-bottom point order */
Packit b099d7
	 if (n == 2) {
Packit b099d7
	     Position save_x = points[1].x ;
Packit b099d7
	     points[1].x = points[0].x +1;
Packit b099d7
	     points[0].x = save_x +1;
Packit b099d7
	 }
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return n ;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/***********
Packit b099d7
 * GetContainerData
Packit b099d7
 **********/
Packit b099d7
static void
Packit b099d7
GetContainerData(
Packit b099d7
        Widget wid,
Packit b099d7
        XmContainerData container_data)
Packit b099d7
{
Packit b099d7
    XmIconGadgetClass igc = (XmIconGadgetClass) XtClass(wid);
Packit b099d7
    Widget container_id ;
Packit b099d7
    XmContainerTrait container_trait ;
Packit b099d7
    XmIconGadget 	ig = (XmIconGadget)wid;
Packit b099d7
    
Packit b099d7
    /**** initialize the trait struct */
Packit b099d7
    /* need to set detail_order_count and first_column so that
Packit b099d7
       container gets a min base. The problem we're trying to solve here 
Packit b099d7
       is when the first kid gets created, when it computes its preferred
Packit b099d7
       size from its Initialize method, the container cannot come up
Packit b099d7
       for a valid dynamic detail_order_count or first_column_width 
Packit b099d7
       since it doesn't have any child in it yet (this one hasn't
Packit b099d7
       been inserted yet: Initialize < InsertChild in Xt). So we
Packit b099d7
       pass the current kid value and the Container will use them
Packit b099d7
       as min, or default if you want. */
Packit b099d7
    container_data->detail_order_count = IG_DetailCount(wid);
Packit b099d7
    container_data->first_column_width = 
Packit b099d7
	IG_HLThickness(wid) + GetIconLabelWidth(wid) - IG_MarginWidth(wid);
Packit b099d7
Packit b099d7
    container_data->selection_mode = XmNORMAL_MODE ;
Packit b099d7
    container_data->detail_order = NULL ;
Packit b099d7
    container_data->detail_tablist = NULL ;
Packit b099d7
    container_data->select_color = XmREVERSED_GROUND_COLORS ;
Packit b099d7
Packit b099d7
    /*** get the Container information using the trait */
Packit b099d7
    /* first get the widget id from which to fetch the trait */
Packit b099d7
    container_id = (igc->icong_class.get_container_parent)?
Packit b099d7
	(*(igc->icong_class.get_container_parent))(wid) : XtParent(wid);
Packit b099d7
    /* then get the trait info */
Packit b099d7
    container_trait = (XmContainerTrait) XmeTraitGet((XtPointer)
Packit b099d7
						     XtClass(container_id), 
Packit b099d7
						     XmQTcontainer) ;
Packit b099d7
    if (container_trait)
Packit b099d7
	container_trait->getValues(container_id, container_data);
Packit b099d7
    else return ;
Packit b099d7
Packit b099d7
    /*** detail_order_count might be 0: mean no detail displayed,
Packit b099d7
      even if the icon has some.
Packit b099d7
      detail_order might be NULL: mean if there is detail to display,
Packit b099d7
      we'll use a default order [1..N] when we need it.
Packit b099d7
      detail_tablist might be null, mean concat for the kid.
Packit b099d7
      (XmContainer returns NULL unless it can't come up with a reasonable
Packit b099d7
       tablist due to its size being NULL or too small)
Packit b099d7
      first_column_width might be 0, which mean spatial: use icon/label only */
Packit b099d7
Packit b099d7
Packit b099d7
    /* a return of 0 for first column width means we are
Packit b099d7
       in spatial, in this case, don't use rectangle.x at all */
Packit b099d7
    if (!container_data->first_column_width) {
Packit b099d7
	container_data->first_column_width = 
Packit b099d7
	    IG_HLThickness(wid) + GetIconLabelWidth(wid) - IG_MarginWidth(wid);
Packit b099d7
    } else {
Packit b099d7
Packit b099d7
	/* remove the current hor indentation */
Packit b099d7
	if (LayoutIsRtoLG(wid)) {
Packit b099d7
	    if (XtWidth(XtParent(wid))) {
Packit b099d7
		if ((Position)container_data->first_column_width >
Packit b099d7
		    (XtWidth(XtParent(wid)) - ig->rectangle.width - 
Packit b099d7
		     ig->rectangle.x)) {
Packit b099d7
		    container_data->first_column_width -= 
Packit b099d7
			(XtWidth(XtParent(wid)) - ig->rectangle.width -
Packit b099d7
			 ig->rectangle.x) ;
Packit b099d7
		} else {
Packit b099d7
		    container_data->first_column_width =
Packit b099d7
			IG_HLThickness(wid) + IG_MarginWidth(wid);
Packit b099d7
		}
Packit b099d7
	    } else { /* parent not sized yet */
Packit b099d7
		if ((Position)container_data->first_column_width > 
Packit b099d7
		    ig->rectangle.x)
Packit b099d7
		    container_data->first_column_width -= ig->rectangle.x ;
Packit b099d7
		else
Packit b099d7
		    container_data->first_column_width =
Packit b099d7
			IG_HLThickness(wid) + IG_MarginWidth(wid); 
Packit b099d7
	    }
Packit b099d7
	} else /* regular case: not RtoL*/
Packit b099d7
	    /* here we have to worry of special cases where
Packit b099d7
	       the first_column_width and the position of the kid
Packit b099d7
	       are extreme */
Packit b099d7
	    if (((Position)container_data->first_column_width >
Packit b099d7
		 ig->rectangle.x)
Packit b099d7
		&& ig->rectangle.x >= 0) {
Packit b099d7
		container_data->first_column_width -= ig->rectangle.x ;
Packit b099d7
		if (container_data->first_column_width < 
Packit b099d7
		          IG_HLThickness(wid) + IG_MarginWidth(wid))
Packit b099d7
		    container_data->first_column_width
Packit b099d7
			= IG_HLThickness(wid) + IG_MarginWidth(wid);
Packit b099d7
	    }
Packit b099d7
	    else
Packit b099d7
		container_data->first_column_width =
Packit b099d7
		    IG_HLThickness(wid) + IG_MarginWidth(wid);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /*** leaving this routine:
Packit b099d7
       detail_order_count might be 0: no detail to display
Packit b099d7
       detail_order might be NULL. : use implicit order
Packit b099d7
       container_data->detail_tablist might be NULL: use concat
Packit b099d7
       container_data->first_column_width is:
Packit b099d7
        in spatial, Container returned first_column_width=0, and
Packit b099d7
        we turned it in GetContainerData into icon_width (included highlight).
Packit b099d7
        in outline/detail, first_column_width is the clipping width 
Packit b099d7
        from the current position of the icon to the start of
Packit b099d7
        the detail rendering (included highlight too). */
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 * Redisplay
Packit b099d7
 * This is the main routine of this baby.
Packit b099d7
 ************************************************************************/
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static	void
Packit b099d7
Redisplay(
Packit b099d7
	Widget	wid,
Packit b099d7
	XEvent	*event,		/* unused */
Packit b099d7
	Region	region)		/* unused */
Packit b099d7
{
Packit b099d7
    XmIconGadget 	ig = (XmIconGadget)wid;
Packit b099d7
    GC		gc;
Packit b099d7
    GC		background_gc;
Packit b099d7
    Dimension	pm_width,pm_height;
Packit b099d7
    XRectangle 	clip_rect;
Packit b099d7
    Boolean		clip_set = False;
Packit b099d7
    int depth;
Packit b099d7
    XmContainerDataRec container_data ;
Packit b099d7
    Position large_icon_x = 0, small_icon_y = 0, small_icon_x,
Packit b099d7
             label_x = 0, label_y = 0 ;
Packit b099d7
    Dimension w, h, ist = IG_ShadowThickness(wid), ht = IG_HLThickness(wid);
Packit b099d7
    Dimension mw = IG_MarginWidth(wid), mh = IG_MarginHeight(wid);
Packit b099d7
    Cardinal i ;
Packit b099d7
    XPoint shad_points[8] ;
Packit b099d7
Packit b099d7
    /* a gc for the ink (text only) */
Packit b099d7
    if (!XtIsSensitive(wid)) 
Packit b099d7
        gc = IG_InsensitiveGC(wid);
Packit b099d7
    else
Packit b099d7
        gc = IG_NormalGC(wid);
Packit b099d7
	
Packit b099d7
    /**** invert the background gc for selected view */
Packit b099d7
    if (IG_VisualEmphasis(wid) == XmSELECTED) {
Packit b099d7
	background_gc = IG_SelectedGC(wid);
Packit b099d7
Packit b099d7
	/* if inverse_gc has been set, it holds the parent background
Packit b099d7
	   as its foreground (ink). Use it when in selected mode */
Packit b099d7
    	if (IG_InverseGC(wid)) 
Packit b099d7
	    gc = IG_InverseGC(wid);
Packit b099d7
    } else {
Packit b099d7
	background_gc = IG_BackgroundGC(wid);
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
    /**** get the container information */
Packit b099d7
    container_data.valueMask = ContAllValid ;
Packit b099d7
    GetContainerData(wid, &container_data);
Packit b099d7
Packit b099d7
    /**** clear the background */
Packit b099d7
    /* in detail mode, clear the entire gadget area using 
Packit b099d7
       background_gc (which, depending on the selected mode is the
Packit b099d7
       selectedGC or the BackgroundGC of the icon), while in
Packit b099d7
       iconlabel only, only clear the iconlabel using cleararea 
Packit b099d7
       (and we will later clear the label part using background_gc) */
Packit b099d7
    if (SHOW_DETAIL(wid, &container_data)) { 
Packit b099d7
        XSetClipMask(XtDisplay(wid), background_gc, None);
Packit b099d7
	XFillRectangle(XtDisplay(wid), XtWindow(wid), background_gc,
Packit b099d7
		       ig->rectangle.x, ig->rectangle.y,
Packit b099d7
		       ig->rectangle.width, ig->rectangle.height);
Packit b099d7
    } else {
Packit b099d7
        XSetClipMask(XtDisplay(wid), IG_BackgroundGC(wid), None);
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
    
Packit b099d7
    /**** render the pixmap first */
Packit b099d7
    if ((IG_ViewType(wid) == XmLARGE_ICON) && 
Packit b099d7
	(PIXMAP_VALID(IG_LargeIconPixmap(wid)))) {
Packit b099d7
Packit b099d7
	large_icon_x = GetLargeIconX(wid); /* no rtl yet */
Packit b099d7
	
Packit b099d7
	XmeGetPixmapData(XtScreen(wid),
Packit b099d7
			 IG_LargeIconPixmap(wid),
Packit b099d7
			 NULL,    
Packit b099d7
			 &depth,
Packit b099d7
			 NULL, NULL,
Packit b099d7
			 NULL, NULL,
Packit b099d7
			 NULL, NULL);   
Packit b099d7
Packit b099d7
	pm_width = IG_LargeIconRectWidth(wid);
Packit b099d7
	if (large_icon_x + pm_width >
Packit b099d7
	    MIN(ig->rectangle.width, container_data.first_column_width)) {
Packit b099d7
	    pm_width = MIN(ig->rectangle.width - 2*ht,
Packit b099d7
			   container_data.first_column_width - ht);
Packit b099d7
	    pm_width -= MIN(pm_width, (Dimension)large_icon_x);
Packit b099d7
Packit b099d7
	    if (LayoutIsRtoLG(wid)) 
Packit b099d7
		large_icon_x = ig->rectangle.width -
Packit b099d7
		    MIN(ig->rectangle.width - 2*ht,
Packit b099d7
			container_data.first_column_width - ht) ;
Packit b099d7
	} else {
Packit b099d7
	    if (LayoutIsRtoLG(wid))
Packit b099d7
		large_icon_x = ig->rectangle.width - large_icon_x - pm_width ;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	pm_height = IG_LargeIconRectHeight(wid) ;
Packit b099d7
	if (ht + ist + pm_height > ig->rectangle.height - 2*ht)
Packit b099d7
	    pm_height = ig->rectangle.height - ist - ht;
Packit b099d7
Packit b099d7
	/* clip with the mask if any */
Packit b099d7
	if (PIXMAP_VALID(IG_LargeIconMask(wid))) {
Packit b099d7
Packit b099d7
	    XSetClipMask(XtDisplay(wid), IG_NormalGC(wid),
Packit b099d7
			 IG_LargeIconMask(wid));
Packit b099d7
Packit b099d7
	    XSetClipOrigin(XtDisplay(wid), IG_NormalGC(wid),
Packit b099d7
			   ig->rectangle.x + large_icon_x,
Packit b099d7
			   ig->rectangle.y + ht + mh);
Packit b099d7
	} else {
Packit b099d7
	    XSetClipMask(XtDisplay(wid), IG_NormalGC(wid),None);
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if (depth == XtParent(wid)->core.depth)
Packit b099d7
	    XCopyArea(XtDisplay(wid),IG_LargeIconPixmap(wid),
Packit b099d7
		      XtWindow(wid), IG_NormalGC(wid), 0,0,
Packit b099d7
		      pm_width, pm_height,
Packit b099d7
		      ig->rectangle.x + large_icon_x,
Packit b099d7
		      ig->rectangle.y + GetLargeIconY(wid));
Packit b099d7
	else 
Packit b099d7
	    if (depth == 1) 
Packit b099d7
		XCopyPlane(XtDisplay(wid),IG_LargeIconPixmap(wid),
Packit b099d7
			   XtWindow(wid), IG_NormalGC(wid),
Packit b099d7
			   0,0,
Packit b099d7
			   pm_width, pm_height,
Packit b099d7
			   ig->rectangle.x + large_icon_x,
Packit b099d7
			   ig->rectangle.y + GetLargeIconY(wid), 1);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if ((IG_ViewType(wid) == XmSMALL_ICON) &&
Packit b099d7
	(PIXMAP_VALID(IG_SmallIconPixmap(wid)))) {
Packit b099d7
Packit b099d7
	small_icon_y = GetSmallIconY(wid);
Packit b099d7
Packit b099d7
	XmeGetPixmapData(XtScreen(wid),
Packit b099d7
			 IG_SmallIconPixmap(wid),
Packit b099d7
			 NULL,    
Packit b099d7
			 &depth,
Packit b099d7
			 NULL, NULL,
Packit b099d7
			 NULL, NULL,
Packit b099d7
			 NULL, NULL);   
Packit b099d7
Packit b099d7
	pm_width = IG_SmallIconRectWidth(wid);
Packit b099d7
	small_icon_x = GetSmallIconX(wid);
Packit b099d7
Packit b099d7
	if (small_icon_x + pm_width  > MIN(ig->rectangle.width - 2*ht, 
Packit b099d7
				  container_data.first_column_width - 2*ht)) {
Packit b099d7
	    pm_width = MIN(ig->rectangle.width,
Packit b099d7
			   container_data.first_column_width) - 2*ht;
Packit b099d7
	    pm_width -= MIN(pm_width, (Dimension)small_icon_x);
Packit b099d7
Packit b099d7
	    if (LayoutIsRtoLG(wid)) 
Packit b099d7
		small_icon_x = ig->rectangle.width + 2*ht -
Packit b099d7
		    MIN(ig->rectangle.width,
Packit b099d7
			container_data.first_column_width) ;
Packit b099d7
	} else {
Packit b099d7
	    if (LayoutIsRtoLG(wid))
Packit b099d7
		small_icon_x = ig->rectangle.width - small_icon_x - pm_width ;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	pm_height = IG_SmallIconRectHeight(wid);
Packit b099d7
	if (small_icon_y + pm_height > ig->rectangle.height - 2*ht)
Packit b099d7
	    pm_height = ig->rectangle.height - small_icon_y;
Packit b099d7
Packit b099d7
	/* clip with the mask if any */
Packit b099d7
	if (PIXMAP_VALID(IG_SmallIconMask(wid))) {
Packit b099d7
	    XSetClipMask(XtDisplay(wid), IG_NormalGC(wid),
Packit b099d7
			 IG_SmallIconMask(wid));
Packit b099d7
	    XSetClipOrigin(XtDisplay(wid), IG_NormalGC(wid),
Packit b099d7
			   ig->rectangle.x + small_icon_x,
Packit b099d7
			   ig->rectangle.y + small_icon_y);
Packit b099d7
	} else {
Packit b099d7
	    XSetClipMask(XtDisplay(wid), IG_NormalGC(wid),None);
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if (depth == XtParent(wid)->core.depth)
Packit b099d7
	    XCopyArea(XtDisplay(wid),IG_SmallIconPixmap(wid),
Packit b099d7
		      XtWindow(wid), IG_NormalGC(wid),0,0,
Packit b099d7
		      pm_width,pm_height,
Packit b099d7
		      ig->rectangle.x + small_icon_x,
Packit b099d7
		      ig->rectangle.y + small_icon_y);
Packit b099d7
	else 
Packit b099d7
	    if (depth == 1) 
Packit b099d7
		XCopyPlane(XtDisplay(wid),IG_SmallIconPixmap(wid),
Packit b099d7
			   XtWindow(wid), IG_NormalGC(wid),0,0,
Packit b099d7
			   pm_width,pm_height,
Packit b099d7
			   ig->rectangle.x + small_icon_x,
Packit b099d7
			   ig->rectangle.y + small_icon_y, 1);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    clip_rect.y = ig->rectangle.y + ht + mh;
Packit b099d7
    clip_rect.width = MIN(ig->rectangle.width - 2*ht - 2*mw,
Packit b099d7
			  container_data.first_column_width - ht - mw);
Packit b099d7
    clip_rect.height = ig->rectangle.height - 2*ht - 2*mh;
Packit b099d7
Packit b099d7
    if (LayoutIsRtoLG(wid)) {
Packit b099d7
	clip_rect.x = ig->rectangle.x + ig->rectangle.width -
Packit b099d7
	    ht - clip_rect.width - mw;
Packit b099d7
    } else {
Packit b099d7
	clip_rect.x = ig->rectangle.x + ht + mw;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    XSetClipRectangles(XtDisplay(wid),gc,0,0,&clip_rect,1,Unsorted);
Packit b099d7
    XSetClipRectangles(XtDisplay(wid),background_gc,0,0,&clip_rect,1,Unsorted);
Packit b099d7
Packit b099d7
Packit b099d7
    /**** then draw the label part of the icon */
Packit b099d7
    GetLabelXY(wid, &label_x, &label_y) ;
Packit b099d7
	
Packit b099d7
    if (!XmStringEmpty(IG_LabelString(wid))) {
Packit b099d7
	XFillRectangle(XtDisplay(wid), XtWindow(wid), background_gc,
Packit b099d7
		       ig->rectangle.x + label_x,
Packit b099d7
		       ig->rectangle.y + label_y,
Packit b099d7
		       IG_LabelRectWidth(wid), 
Packit b099d7
		       IG_LabelRectHeight(wid));
Packit b099d7
Packit b099d7
	/* if we are in the inverse_color case, we need to draw
Packit b099d7
	   the string with parent background ink, and
Packit b099d7
	   parent foreground as back color (The previous fillrectangle
Packit b099d7
	   took care of that last part). gc has been set
Packit b099d7
	   up to IG_InverseGC at the beginning of this routine,
Packit b099d7
	   so what's left is the forcing of this ink/foreground */
Packit b099d7
	
Packit b099d7
#ifdef FIX_1381
Packit b099d7
	/*Draw shadow for insensitive text*/
Packit b099d7
	if (!XtIsSensitive(wid)) {
Packit b099d7
		XmStringDraw(XtDisplay(wid),XtWindow(wid),
Packit b099d7
		      IG_RenderTable(wid),IG_LabelString(wid), IG_ShadowGC(wid),
Packit b099d7
		      ig->rectangle.x + label_x+1 + DEFAULT_LABEL_MARGIN_WIDTH,
Packit b099d7
		      ig->rectangle.y + label_y+1 + DEFAULT_LABEL_MARGIN_HEIGHT,
Packit b099d7
		      IG_LabelRectWidth(wid) - 2*DEFAULT_LABEL_MARGIN_WIDTH,
Packit b099d7
		      XmALIGNMENT_BEGINNING,
Packit b099d7
		      LayoutG(wid), NULL);
Packit b099d7
	}
Packit b099d7
#endif
Packit b099d7
	XmStringDraw(XtDisplay(wid),XtWindow(wid),
Packit b099d7
		      IG_RenderTable(wid),IG_LabelString(wid), gc,
Packit b099d7
		      ig->rectangle.x + label_x + DEFAULT_LABEL_MARGIN_WIDTH,
Packit b099d7
		      ig->rectangle.y + label_y + DEFAULT_LABEL_MARGIN_HEIGHT,
Packit b099d7
		      IG_LabelRectWidth(wid) - 2*DEFAULT_LABEL_MARGIN_WIDTH,
Packit b099d7
		      XmALIGNMENT_BEGINNING,
Packit b099d7
		      LayoutG(wid), NULL);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    XSetClipMask(XtDisplay(wid),background_gc,None);
Packit b099d7
	
Packit b099d7
    /**** now the polygon shadow around the icon+label, or the
Packit b099d7
          square shadow around a masked pixmap or a no pixmap icon */
Packit b099d7
Packit b099d7
    /* only draw shadows if there is something inside */
Packit b099d7
    if (container_data.first_column_width) {
Packit b099d7
	Cardinal n ;
Packit b099d7
Packit b099d7
	/* undo the ltr layout for label_x, because getshapeinfo
Packit b099d7
	   does it */
Packit b099d7
	if (LayoutIsRtoLG(wid)) {
Packit b099d7
	    label_x = XtWidth(wid) - IG_LabelRectWidth(wid) - label_x ;
Packit b099d7
	}
Packit b099d7
	n = GetShapeInfo(wid, GetLargeIconX(wid), small_icon_y, 
Packit b099d7
			 label_x, label_y,
Packit b099d7
			 container_data.first_column_width, ht,
Packit b099d7
			 &shad_points[0]) ;
Packit b099d7
	/* only draw the polygon shadow if there is no mask
Packit b099d7
	   and an existing pixmap */
Packit b099d7
	if (n == 2) {
Packit b099d7
	    XmeDrawShadows(XtDisplay(wid),XtWindow(wid),
Packit b099d7
			   IG_TopShadowGC(wid), IG_BottomShadowGC(wid),
Packit b099d7
			   shad_points[0].x,  shad_points[0].y,
Packit b099d7
			   shad_points[1].x - shad_points[0].x,
Packit b099d7
			   shad_points[1].y - shad_points[0].y, 
Packit b099d7
			   ist, XmSHADOW_OUT);
Packit b099d7
	}
Packit b099d7
	else if (n == 8) {
Packit b099d7
	    XmeDrawPolygonShadow (XtDisplay(wid),XtWindow(wid),
Packit b099d7
				  IG_TopShadowGC(wid), IG_BottomShadowGC(wid),
Packit b099d7
				  shad_points, n, ist, XmSHADOW_OUT);
Packit b099d7
	} 
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /**** then comes the details rendering */
Packit b099d7
Packit b099d7
    if (SHOW_DETAIL(wid, &container_data)&&
Packit b099d7
	container_data.first_column_width >= ht + mw) {
Packit b099d7
	unsigned int tab_count = 0 ;
Packit b099d7
	Dimension detail_x, detail_y;
Packit b099d7
	XmStringTable new_detail ;
Packit b099d7
	int lab_baseline = 0, detail_baseline ;
Packit b099d7
Packit b099d7
	/* get the detail table to be displayed */
Packit b099d7
	new_detail = 
Packit b099d7
	    GetStringTableReOrdered(IG_Detail(wid), IG_DetailCount(wid), 
Packit b099d7
				    container_data.detail_order,
Packit b099d7
				    container_data.detail_order_count);
Packit b099d7
Packit b099d7
	if (container_data.detail_tablist) 
Packit b099d7
	    tab_count = XmTabListTabCount(container_data.detail_tablist) ;
Packit b099d7
	/* the extra tabs are ignored */
Packit b099d7
	tab_count = MIN(tab_count, container_data.detail_order_count);
Packit b099d7
	/* tab_count might be 0 at this point, but it won't be treated as
Packit b099d7
	   a special case */
Packit b099d7
Packit b099d7
	if (IG_LabelString(wid))
Packit b099d7
	    lab_baseline = XmStringBaseline(IG_RenderTable(wid), 
Packit b099d7
					    IG_LabelString(wid)) ;
Packit b099d7
Packit b099d7
	/* detail_x is in gadget relative coordinate */
Packit b099d7
	detail_x = container_data.first_column_width;
Packit b099d7
Packit b099d7
	for (i = 0 ; i < IG_DetailCount(wid) ; i++) {
Packit b099d7
	    Position next_tab_x = 0 ;
Packit b099d7
Packit b099d7
	    w = 0 ;
Packit b099d7
Packit b099d7
	    detail_x += DEFAULT_HOR_SPACING ;
Packit b099d7
Packit b099d7
	    if (container_data.detail_tablist)
Packit b099d7
		next_tab_x = container_data.first_column_width +
Packit b099d7
		    _XmTabListGetPosition(XtScreen(wid),
Packit b099d7
					 container_data.detail_tablist,
Packit b099d7
					 XmPIXELS, i);
Packit b099d7
	    if (new_detail[i]) {
Packit b099d7
		
Packit b099d7
		/* if we have a tab, use it, don't bother to call an
Packit b099d7
		   expensive string extent. */
Packit b099d7
		if (i < tab_count) {
Packit b099d7
		    clip_rect.width = MIN (next_tab_x - detail_x,
Packit b099d7
					   ig->rectangle.width - 2*ht - 2*mw -
Packit b099d7
					   detail_x);
Packit b099d7
		    clip_rect.x = ig->rectangle.x + detail_x;
Packit b099d7
		    if (LayoutIsRtoLG(wid)) 
Packit b099d7
			clip_rect.x = ig->rectangle.x + ig->rectangle.width
Packit b099d7
			    - detail_x - clip_rect.width;
Packit b099d7
			
Packit b099d7
		    clip_rect.y = ig->rectangle.y + ht + mh;
Packit b099d7
		    clip_rect.height = ig->rectangle.height - 2*ht - 2*mh;
Packit b099d7
		    XSetClipRectangles(XtDisplay(wid),gc,0,0,&clip_rect,1,
Packit b099d7
				       Unsorted);
Packit b099d7
		} else {
Packit b099d7
		    XmStringExtent(IG_RenderTable(wid), new_detail[i], &w, &h);
Packit b099d7
		    if (!clip_set) {
Packit b099d7
			clip_rect.x = ig->rectangle.x + ht + mw;
Packit b099d7
			clip_rect.y = ig->rectangle.y + ht + mh;
Packit b099d7
			clip_rect.width = ig->rectangle.width - 2*ht - 2*mw;
Packit b099d7
			clip_rect.height = ig->rectangle.height - 2*ht - 2*mh;
Packit b099d7
			XSetClipRectangles(XtDisplay(wid),gc,0,0,&clip_rect,1,
Packit b099d7
					   Unsorted);
Packit b099d7
			/* only set this clip once */
Packit b099d7
			clip_set = True ;
Packit b099d7
		    }			
Packit b099d7
		} 
Packit b099d7
		
Packit b099d7
		detail_baseline = XmStringBaseline(IG_RenderTable(wid),
Packit b099d7
						    new_detail[i]);
Packit b099d7
		detail_y = label_y + DEFAULT_LABEL_MARGIN_HEIGHT +
Packit b099d7
		    lab_baseline - detail_baseline;
Packit b099d7
Packit b099d7
		XmStringDraw(XtDisplay(wid),XtWindow(wid),
Packit b099d7
			     IG_RenderTable(wid), new_detail[i], gc,
Packit b099d7
			     (LayoutIsRtoLG(wid)) ?
Packit b099d7
			     (ig->rectangle.x + ig->rectangle.width - detail_x
Packit b099d7
			      - ((i < tab_count) ? clip_rect.width : w))
Packit b099d7
			     : (ig->rectangle.x + detail_x),
Packit b099d7
			     ig->rectangle.y + detail_y,
Packit b099d7
			     ((i < tab_count) ? clip_rect.width : w),
Packit b099d7
			     XmALIGNMENT_BEGINNING,
Packit b099d7
			     LayoutG(wid), 
Packit b099d7
			     NULL);  /* clip is done in gc */
Packit b099d7
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	    if (i < tab_count) {
Packit b099d7
		detail_x = next_tab_x;
Packit b099d7
	    } else {
Packit b099d7
		detail_x += w ;
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /**** draw the highlight if needed */
Packit b099d7
    if (ig->gadget.highlighted) {
Packit b099d7
	if(((XmGadgetClass) XtClass(wid))->gadget_class.border_highlight){
Packit b099d7
	    (*(((XmGadgetClass) XtClass(wid))
Packit b099d7
	       ->gadget_class.border_highlight))(wid) ;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 * SetValues			
Packit b099d7
 ************************************************************************/
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static	Boolean
Packit b099d7
SetValues(
Packit b099d7
	Widget		cw,
Packit b099d7
	Widget		rw,	
Packit b099d7
	Widget		nw,
Packit b099d7
	ArgList		args,	/* unused */
Packit b099d7
	Cardinal	*num_args) /* unused */
Packit b099d7
{
Packit b099d7
    Boolean			Relayout = False;
Packit b099d7
    Boolean			Redraw = False;
Packit b099d7
    unsigned int w, h ;
Packit b099d7
    Cardinal i ;
Packit b099d7
Packit b099d7
    
Packit b099d7
    if (IG_ViewType(nw) != IG_ViewType(cw)) {
Packit b099d7
	if (XmRepTypeValidValue(XmRID_VIEW_TYPE,IG_ViewType(nw),nw))
Packit b099d7
	    Relayout = Redraw = True;
Packit b099d7
	else
Packit b099d7
	    IG_ViewType(nw) = IG_ViewType(cw);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (IG_VisualEmphasis(nw) != IG_VisualEmphasis(cw)) {
Packit b099d7
	if (XmRepTypeValidValue(XmRID_VISUAL_EMPHASIS,
Packit b099d7
				IG_VisualEmphasis(nw),nw))
Packit b099d7
	    Redraw = True;
Packit b099d7
	else
Packit b099d7
	    IG_VisualEmphasis(nw) = IG_VisualEmphasis(cw);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (IG_Alignment(nw) != IG_Alignment(cw)) {
Packit b099d7
	if (XmRepTypeValidValue(XmRID_ALIGNMENT, IG_Alignment(nw), nw))
Packit b099d7
	    Relayout = Redraw = True;
Packit b099d7
	else
Packit b099d7
	    IG_Alignment(nw) = IG_Alignment(cw);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if ((IG_Background(nw) != IG_Background(cw)) ||
Packit b099d7
	(IG_Foreground(nw) != IG_Foreground(cw)) ||
Packit b099d7
	(IG_TopShadowColor(nw) != IG_TopShadowColor(cw)) ||
Packit b099d7
	(IG_BottomShadowColor(nw) != IG_BottomShadowColor(cw)) ||
Packit b099d7
	(IG_HighlightColor(nw) != IG_HighlightColor(cw)) ||
Packit b099d7
	(IG_BackgroundPixmap(nw) != IG_BackgroundPixmap(cw)) ||
Packit b099d7
	(IG_TopShadowPixmap(nw) != IG_TopShadowPixmap(cw)) ||
Packit b099d7
	(IG_BottomShadowPixmap(nw) != IG_BottomShadowPixmap(cw)) ||
Packit b099d7
	(IG_HighlightPixmap(nw) != IG_HighlightPixmap(cw))) {
Packit b099d7
	UpdateGCs(nw);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (IG_RenderTable(nw) != IG_RenderTable(cw)) {
Packit b099d7
	XmRenderTableFree(IG_RenderTable(cw));
Packit b099d7
	IG_RenderTable(nw) = XmRenderTableCopy(IG_RenderTable(nw), NULL, 0);
Packit b099d7
	UpdateGCs(nw);
Packit b099d7
Packit b099d7
	if (!XmStringEmpty(IG_LabelString(nw)))
Packit b099d7
	    XmStringExtent(IG_RenderTable(nw), IG_LabelString(nw),
Packit b099d7
			    &(IG_LabelRectWidth(nw)),
Packit b099d7
			    &(IG_LabelRectHeight(nw)));
Packit b099d7
Packit b099d7
	IG_LabelRectWidth(nw) += 2*DEFAULT_LABEL_MARGIN_WIDTH ;
Packit b099d7
	IG_LabelRectHeight(nw) += 2*DEFAULT_LABEL_MARGIN_HEIGHT  ;
Packit b099d7
Packit b099d7
	Relayout = Redraw = True;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (IG_LabelString(nw) != IG_LabelString(cw)) {
Packit b099d7
	XmStringFree(IG_LabelString(cw));
Packit b099d7
	IG_LabelString(nw) = XmStringCopy(IG_LabelString(nw));
Packit b099d7
	
Packit b099d7
	if (!XmStringEmpty(IG_LabelString(nw)))
Packit b099d7
	    XmStringExtent(IG_RenderTable(nw), IG_LabelString(nw),
Packit b099d7
			    &(IG_LabelRectWidth(nw)),
Packit b099d7
			    &(IG_LabelRectHeight(nw)));
Packit b099d7
	else {
Packit b099d7
	    IG_LabelRectWidth(nw) = 0 ;
Packit b099d7
	    IG_LabelRectHeight(nw) = 0 ;
Packit b099d7
	}
Packit b099d7
	IG_LabelRectWidth(nw) += 2*DEFAULT_LABEL_MARGIN_WIDTH ;
Packit b099d7
	IG_LabelRectHeight(nw) += 2*DEFAULT_LABEL_MARGIN_HEIGHT  ;
Packit b099d7
Packit b099d7
	Relayout = Redraw = True;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (IG_LargeIconMask(nw) != IG_LargeIconMask(cw)) {
Packit b099d7
	if (OwnLargeMask(cw)) {
Packit b099d7
	    XDeleteContext(XtDisplay(nw), 
Packit b099d7
			   (Window) nw, 
Packit b099d7
			   largeIconContext) ;
Packit b099d7
	    if (PIXMAP_VALID(IG_LargeIconMask(cw)))
Packit b099d7
		XmDestroyPixmap(XtScreen(cw),
Packit b099d7
				IG_LargeIconMask(cw));
Packit b099d7
	}
Packit b099d7
	if (IG_ViewType(nw) == XmLARGE_ICON)
Packit b099d7
	    Relayout = Redraw = True;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (IG_LargeIconPixmap(nw) != IG_LargeIconPixmap(cw)) {
Packit b099d7
	if (IG_ViewType(nw) == XmLARGE_ICON)
Packit b099d7
	    Relayout = Redraw = True;
Packit b099d7
Packit b099d7
	/* if the new icon is different, refetch the sizes */
Packit b099d7
	if (PIXMAP_VALID(IG_LargeIconPixmap(nw)))
Packit b099d7
	    XmeGetPixmapData(XtScreen(nw),
Packit b099d7
			     IG_LargeIconPixmap(nw),
Packit b099d7
			     NULL,    
Packit b099d7
			     NULL,
Packit b099d7
			     NULL, NULL,
Packit b099d7
			     NULL, NULL,
Packit b099d7
			     &w, &h); 
Packit b099d7
	else {
Packit b099d7
	    w = h = 0 ;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	IG_LargeIconRectWidth(nw)  = (unsigned short)w;
Packit b099d7
	IG_LargeIconRectHeight(nw) = (unsigned short)h;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (IG_SmallIconMask(nw) != IG_SmallIconMask(cw)) {
Packit b099d7
	if (OwnSmallMask(cw)) {
Packit b099d7
	    XDeleteContext(XtDisplay(nw), 
Packit b099d7
			   (Window) nw, 
Packit b099d7
			   smallIconContext) ;
Packit b099d7
	    if (PIXMAP_VALID(IG_SmallIconMask(cw)))
Packit b099d7
		XmDestroyPixmap(XtScreen(cw),
Packit b099d7
				IG_SmallIconMask(cw));
Packit b099d7
	}
Packit b099d7
	if (IG_ViewType(nw) == XmSMALL_ICON)
Packit b099d7
	    Relayout = Redraw = True;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (IG_SmallIconPixmap(nw) != IG_SmallIconPixmap(cw)) {
Packit b099d7
	if (IG_ViewType(nw) == XmSMALL_ICON)
Packit b099d7
	    Relayout = Redraw = True;
Packit b099d7
Packit b099d7
	if (PIXMAP_VALID(IG_SmallIconPixmap(nw)))
Packit b099d7
	    XmeGetPixmapData(XtScreen(nw),
Packit b099d7
			     IG_SmallIconPixmap(nw),
Packit b099d7
			     NULL,    
Packit b099d7
			     NULL,
Packit b099d7
			     NULL, NULL,
Packit b099d7
			     NULL, NULL,
Packit b099d7
			     &w, &h); 
Packit b099d7
	else {
Packit b099d7
	    w = h = 0 ;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	IG_SmallIconRectWidth(nw)  = (unsigned short)w;
Packit b099d7
	IG_SmallIconRectHeight(nw) = (unsigned short)h;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (IG_Detail(nw) != IG_Detail(cw)) {
Packit b099d7
	/* new XmNdetail copy in */
Packit b099d7
	
Packit b099d7
	/* first free the current detail table and strings if present */
Packit b099d7
	if (IG_Detail(cw) && IG_DetailCount(cw)) {
Packit b099d7
	    for (i=0; i
Packit b099d7
		XmStringFree(IG_Detail(cw)[i]);
Packit b099d7
	    XtFree((char*)IG_Detail(cw));
Packit b099d7
	}
Packit b099d7
	
Packit b099d7
	/* now copy */
Packit b099d7
	if (IG_Detail(nw) && IG_DetailCount(nw)) {
Packit b099d7
	    IG_Detail(nw) = (XmStringTable) 
Packit b099d7
		XtMalloc(IG_DetailCount(nw) * sizeof(XmString));
Packit b099d7
	    
Packit b099d7
	    for (i=0; i
Packit b099d7
		IG_Detail(nw)[i] = XmStringCopy(IG_Detail(rw)[i]);
Packit b099d7
	}
Packit b099d7
	Relayout = Redraw = True;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (IG_DetailCount(nw) != IG_DetailCount(cw)) {
Packit b099d7
	Relayout = Redraw = True;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (LayoutG(nw) != LayoutG(cw) || XtIsSensitive(nw) != XtIsSensitive(cw)) {
Packit b099d7
	Redraw = True;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if ((Relayout) ||
Packit b099d7
	(IG_Spacing(nw) != IG_Spacing(cw)) ||
Packit b099d7
	(IG_MarginWidth(nw) != IG_MarginWidth(cw)) ||
Packit b099d7
	(IG_MarginHeight(nw) != IG_MarginHeight(cw)) ||
Packit b099d7
	(IG_HLThickness(nw) != IG_HLThickness(cw)) ||
Packit b099d7
	(IG_ShadowThickness(nw) != IG_ShadowThickness(cw))) {
Packit b099d7
	if (IG_RecomputeSize(nw)) {
Packit b099d7
	    /* if a specific size has not been requested at the same time
Packit b099d7
	       just forget the current size */
Packit b099d7
	    if (rw->core.width == cw->core.width)
Packit b099d7
		nw->core.width = 0;
Packit b099d7
	    if (rw->core.height == cw->core.height)
Packit b099d7
		nw->core.height = 0;
Packit b099d7
	}	
Packit b099d7
Packit b099d7
	GetSize(nw, &nw->core.width, &nw->core.height);
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
    return(Redraw);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 * QueryGeometry
Packit b099d7
 ************************************************************************/
Packit b099d7
static	XtGeometryResult
Packit b099d7
QueryGeometry(
Packit b099d7
	Widget			wid,
Packit b099d7
	XtWidgetGeometry	*intended,
Packit b099d7
	XtWidgetGeometry	*desired)
Packit b099d7
{
Packit b099d7
Packit b099d7
    if (IG_RecomputeSize(wid) == False) {
Packit b099d7
        desired->width = XtWidth(wid) ;
Packit b099d7
	desired->height = XtHeight(wid) ;
Packit b099d7
    } else {
Packit b099d7
	desired->width = 0 ;
Packit b099d7
	desired->height = 0 ;
Packit b099d7
	GetSize(wid, &desired->width, &desired->height);
Packit b099d7
	/* the above asks for the containertrait firstColumnWidth */
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return XmeReplyToQueryGeometry(wid, intended, desired) ;
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*-----------------
Packit b099d7
| XmGadget methods |
Packit b099d7
-----------------*/
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 * HighlightBorder
Packit b099d7
 ************************************************************************/
Packit b099d7
static void 
Packit b099d7
HighlightBorder(
Packit b099d7
        Widget w )
Packit b099d7
{   
Packit b099d7
    XmIconGadget ig = (XmIconGadget) w ;
Packit b099d7
    XmContainerDataRec container_data ;
Packit b099d7
    Dimension ht = IG_HLThickness(w) ;
Packit b099d7
Packit b099d7
    /* test LayoutIsRtoLG(wid) here */
Packit b099d7
Packit b099d7
    ig->gadget.highlighted = True ;
Packit b099d7
    ig->gadget.highlight_drawn = True ;
Packit b099d7
Packit b099d7
    if(ig->rectangle.width == 0 || ig->rectangle.height == 0
Packit b099d7
       || ig->gadget.highlight_thickness == 0) return ;
Packit b099d7
Packit b099d7
    /* The highlight is different depending if there is a detail
Packit b099d7
       or not. With a detail, it's a rectangular shadow,
Packit b099d7
       otherwise it's drawn around the icon+label */
Packit b099d7
Packit b099d7
    /**** get the container information */
Packit b099d7
    container_data.valueMask = ContFirstColumnWidth | ContSelectionMode ;
Packit b099d7
    GetContainerData(w, &container_data);
Packit b099d7
Packit b099d7
    XSetClipMask(XtDisplay(w), IG_HighlightGC(w), None);
Packit b099d7
Packit b099d7
    if (SHOW_DETAIL(w, &container_data)) {
Packit b099d7
        ChangeHighlightGC(w, container_data.selection_mode, ht);
Packit b099d7
Packit b099d7
	if (container_data.selection_mode == XmADD_MODE)
Packit b099d7
	  _XmDrawHighlight(XtDisplay(w),XtWindow(w),
Packit b099d7
			   IG_HighlightGC(w),
Packit b099d7
			   ig->rectangle.x,  ig->rectangle.y,
Packit b099d7
			   ig->rectangle.width, ig->rectangle.height,
Packit b099d7
			   ht, LineDoubleDash);
Packit b099d7
	else
Packit b099d7
	  XmeDrawHighlight(XtDisplay(w),XtWindow(w),
Packit b099d7
			   IG_HighlightGC(w),
Packit b099d7
			   ig->rectangle.x,  ig->rectangle.y,
Packit b099d7
			   ig->rectangle.width, ig->rectangle.height,
Packit b099d7
			   ht);
Packit b099d7
Packit b099d7
    } else {
Packit b099d7
	Position label_x, label_y ;
Packit b099d7
	XPoint points[8] ;
Packit b099d7
Packit b099d7
	/* do the polygon highlight around the icon + label part */
Packit b099d7
	GetLabelXY(w, &label_x, &label_y) ;
Packit b099d7
Packit b099d7
	/* undo the ltr layout for label_x, because getshapeinfo
Packit b099d7
	   does it */
Packit b099d7
	if (LayoutIsRtoLG(w)) {
Packit b099d7
	    label_x = XtWidth(w) - IG_LabelRectWidth(w) - label_x ;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if (GetShapeInfo(w, GetLargeIconX(w), GetSmallIconY(w), 
Packit b099d7
			 label_x, label_y,
Packit b099d7
			 container_data.first_column_width, INVALID_DIMENSION,
Packit b099d7
			 points) == 2) {
Packit b099d7
	  /* only 2 points have been set, that's the simple case */
Packit b099d7
	  if (container_data.selection_mode == XmADD_MODE) {
Packit b099d7
	    ChangeHighlightGC(w, container_data.selection_mode, ht);
Packit b099d7
	    _XmDrawHighlight(XtDisplay(w),XtWindow(w),
Packit b099d7
			     IG_HighlightGC(w),
Packit b099d7
			     points[0].x,  points[0].y,
Packit b099d7
			     points[1].x - points[0].x,
Packit b099d7
			     points[1].y - points[0].y,
Packit b099d7
			     ht, LineDoubleDash);
Packit b099d7
	  } else
Packit b099d7
	    XmeDrawHighlight(XtDisplay(w),XtWindow(w),
Packit b099d7
			     IG_HighlightGC(w),
Packit b099d7
			     points[0].x,  points[0].y,
Packit b099d7
			     points[1].x - points[0].x,
Packit b099d7
			     points[1].y - points[0].y,
Packit b099d7
			     ht);
Packit b099d7
	} else {
Packit b099d7
	    ChangeHighlightGC(w, container_data.selection_mode, 1);
Packit b099d7
	    XmeDrawPolygonShadow (XtDisplay(w),XtWindow(w),
Packit b099d7
				  IG_HighlightGC(w), IG_HighlightGC(w),
Packit b099d7
				  points, 8, ht, XmSHADOW_OUT);
Packit b099d7
	} 
Packit b099d7
    }
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 * UnhighlightBorder
Packit b099d7
 ************************************************************************/
Packit b099d7
static void 
Packit b099d7
UnhighlightBorder(
Packit b099d7
        Widget w )
Packit b099d7
{   
Packit b099d7
    XmIconGadget ig = (XmIconGadget) w ;
Packit b099d7
    XmContainerDataRec container_data ;
Packit b099d7
    Dimension ht = IG_HLThickness(w) ;
Packit b099d7
    GC background_gc ;
Packit b099d7
Packit b099d7
    /* test LayoutIsRtoLG(wid) here */
Packit b099d7
Packit b099d7
    ig->gadget.highlighted = False ;
Packit b099d7
    ig->gadget.highlight_drawn = False ;
Packit b099d7
Packit b099d7
    if(ig->rectangle.width == 0 || ig->rectangle.height == 0
Packit b099d7
       || ig->gadget.highlight_thickness == 0) return ;
Packit b099d7
Packit b099d7
    /* unhighlight has to use the current selected background,
Packit b099d7
       it cannot call the superclass unhighlight as in highlight
Packit b099d7
       because Gadget does a simple clearborder. */
Packit b099d7
Packit b099d7
    /**** get the container information */
Packit b099d7
    container_data.valueMask = ContFirstColumnWidth ;
Packit b099d7
    GetContainerData(w, &container_data);
Packit b099d7
Packit b099d7
    if(XmIsManager (XtParent(w)))  {   
Packit b099d7
	background_gc = ((XmManagerWidget)XtParent(w))
Packit b099d7
	    ->manager.background_GC ;
Packit b099d7
    } else {
Packit b099d7
	XSetClipMask(XtDisplay(w), IG_BackgroundGC(w), None);
Packit b099d7
	background_gc = IG_BackgroundGC(w) ;
Packit b099d7
    }
Packit b099d7
        
Packit b099d7
    
Packit b099d7
    if (SHOW_DETAIL(w, &container_data)) {
Packit b099d7
	/* unhighlight the entire gadget area */
Packit b099d7
	XmeDrawHighlight(XtDisplay(w),XtWindow(w),
Packit b099d7
			 background_gc,
Packit b099d7
			 ig->rectangle.x,  ig->rectangle.y,
Packit b099d7
			 ig->rectangle.width, ig->rectangle.height,
Packit b099d7
			 ht);
Packit b099d7
    } else {
Packit b099d7
	Position label_x, label_y ;
Packit b099d7
	XPoint points[8] ;
Packit b099d7
	
Packit b099d7
	/* do the polygon unhighlight around the icon + label part */
Packit b099d7
	GetLabelXY(w, &label_x, &label_y) ;
Packit b099d7
Packit b099d7
	/* undo the ltr layout for label_x, because getshapeinfo
Packit b099d7
	   does it */
Packit b099d7
	if (LayoutIsRtoLG(w)) {
Packit b099d7
	    label_x = XtWidth(w) - IG_LabelRectWidth(w) - label_x ;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if (GetShapeInfo(w, GetLargeIconX(w), GetSmallIconY(w), 
Packit b099d7
			 label_x, label_y,
Packit b099d7
			 container_data.first_column_width, INVALID_DIMENSION,
Packit b099d7
			 points) == 2) {
Packit b099d7
	    /* only 2 points have been set, that's the simple case */
Packit b099d7
	    XmeDrawHighlight(XtDisplay(w),XtWindow(w),
Packit b099d7
			     background_gc,
Packit b099d7
			     points[0].x,  points[0].y,
Packit b099d7
			     points[1].x - points[0].x,
Packit b099d7
			     points[1].y - points[0].y,
Packit b099d7
			     ht);
Packit b099d7
	} else {
Packit b099d7
	    XmeDrawPolygonShadow (XtDisplay(w),XtWindow(w),
Packit b099d7
				  background_gc, background_gc,
Packit b099d7
				  points, 8, ht, XmSHADOW_OUT);
Packit b099d7
	} 
Packit b099d7
    
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/*******************************************************************
Packit b099d7
 *
Packit b099d7
 *  IconGCacheCompare
Packit b099d7
 *
Packit b099d7
 *******************************************************************/
Packit b099d7
static int 
Packit b099d7
IconGCacheCompare(
Packit b099d7
        XtPointer A,
Packit b099d7
        XtPointer B )
Packit b099d7
{
Packit b099d7
    XmIconGCacheObjPart *icon_inst = (XmIconGCacheObjPart *) A ;
Packit b099d7
    XmIconGCacheObjPart *icon_cache_inst = (XmIconGCacheObjPart *) B ;
Packit b099d7
Packit b099d7
    if((icon_inst-> render_table == icon_cache_inst->render_table) &&
Packit b099d7
       (icon_inst-> selected_GC == icon_cache_inst->selected_GC) &&
Packit b099d7
       (icon_inst-> inverse_GC == icon_cache_inst->inverse_GC) &&
Packit b099d7
       (icon_inst-> normal_GC == icon_cache_inst->normal_GC) &&
Packit b099d7
       (icon_inst-> background_GC == icon_cache_inst->background_GC) &&
Packit b099d7
       (icon_inst-> insensitive_GC == icon_cache_inst->insensitive_GC) &&
Packit b099d7
       (icon_inst-> top_shadow_GC == icon_cache_inst->top_shadow_GC) &&
Packit b099d7
       (icon_inst-> bottom_shadow_GC == icon_cache_inst->bottom_shadow_GC) &&
Packit b099d7
       (icon_inst-> highlight_GC == icon_cache_inst->highlight_GC) &&
Packit b099d7
       (icon_inst-> background == icon_cache_inst->background) &&
Packit b099d7
       (icon_inst-> foreground == icon_cache_inst->foreground) &&
Packit b099d7
       (icon_inst-> top_shadow_color == icon_cache_inst->top_shadow_color) &&
Packit b099d7
       (icon_inst-> highlight_color == icon_cache_inst->highlight_color) &&
Packit b099d7
       (icon_inst-> top_shadow_pixmap == icon_cache_inst->background_pixmap) &&
Packit b099d7
       (icon_inst-> background_pixmap == icon_cache_inst->top_shadow_pixmap) &&
Packit b099d7
       (icon_inst-> highlight_pixmap == icon_cache_inst->highlight_pixmap) &&
Packit b099d7
       (icon_inst-> bottom_shadow_color ==
Packit b099d7
	    icon_cache_inst->bottom_shadow_color) &&
Packit b099d7
       (icon_inst-> bottom_shadow_pixmap ==
Packit b099d7
	    icon_cache_inst->bottom_shadow_pixmap) &&
Packit b099d7
       (icon_inst-> alignment == icon_cache_inst->alignment) &&
Packit b099d7
       (icon_inst-> spacing == icon_cache_inst->spacing) &&
Packit b099d7
       (icon_inst-> margin_width == icon_cache_inst->margin_width) &&
Packit b099d7
       (icon_inst-> margin_height == icon_cache_inst->margin_height)  )
Packit b099d7
       return 1;
Packit b099d7
    else
Packit b099d7
       return 0;
Packit b099d7
 }
Packit b099d7
Packit b099d7
Packit b099d7
/****************************************************
Packit b099d7
 *   Functions for manipulating Secondary Resources.
Packit b099d7
 *********************************************************/
Packit b099d7
/*
Packit b099d7
 * GetIconGClassSecResData()
Packit b099d7
 *    Create a XmSecondaryResourceDataRec for each secondary resource;
Packit b099d7
 *    Put the pointers to these records in an array of pointers;
Packit b099d7
 *    Return the pointer to the array of pointers.
Packit b099d7
 *	client_data = Address of the structure in the class record which
Packit b099d7
 *	  represents the (template of ) the secondary data.
Packit b099d7
 */
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static Cardinal 
Packit b099d7
GetIconGClassSecResData(
Packit b099d7
        WidgetClass w_class,	/* unused */
Packit b099d7
        XmSecondaryResourceData **data_rtn )
Packit b099d7
{   int arrayCount;
Packit b099d7
    XmBaseClassExt  bcePtr;
Packit b099d7
    String  resource_class, resource_name;
Packit b099d7
    XtPointer  client_data;
Packit b099d7
Packit b099d7
    bcePtr = &(iconGBaseClassExtRec );
Packit b099d7
    client_data = NULL;
Packit b099d7
    resource_class = NULL;
Packit b099d7
    resource_name = NULL;
Packit b099d7
    arrayCount =
Packit b099d7
      _XmSecondaryResourceData ( bcePtr, data_rtn, client_data,
Packit b099d7
                resource_name, resource_class,
Packit b099d7
                GetIconGClassSecResBase); 
Packit b099d7
    return (arrayCount);
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * GetIconGClassResBase ()
Packit b099d7
 *   retrun the address of the base of resources.
Packit b099d7
 *  If client data is the same as the address of the secndary data in the
Packit b099d7
 *	class record then send the base address of the cache-resources for this
Packit b099d7
 *	instance of the widget. 
Packit b099d7
 * Right now we  do not try to get the address of the cached_data from
Packit b099d7
 *  the Gadget component of this instance - since Gadget class does not
Packit b099d7
 *	have any cached_resources defined. If later secondary resources are
Packit b099d7
 *	defined for Gadget class then this routine will have to change.
Packit b099d7
 */
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static XtPointer 
Packit b099d7
GetIconGClassSecResBase(
Packit b099d7
        Widget widget,
Packit b099d7
        XtPointer client_data )	/* unused */
Packit b099d7
{	XtPointer  widgetSecdataPtr; 
Packit b099d7
  
Packit b099d7
	widgetSecdataPtr = (XtPointer) (IG_Cache(widget));
Packit b099d7
Packit b099d7
Packit b099d7
    return (widgetSecdataPtr);
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 * InputDispatch
Packit b099d7
 ************************************************************************/
Packit b099d7
static	void
Packit b099d7
InputDispatch(
Packit b099d7
	Widget	wid,
Packit b099d7
	XEvent	*event,
Packit b099d7
	Mask	event_mask)
Packit b099d7
{
Packit b099d7
Packit b099d7
    if (event_mask & XmHELP_EVENT) _XmSocorro(wid,event,NULL,NULL);   
Packit b099d7
    else if (event_mask & XmFOCUS_IN_EVENT) 
Packit b099d7
	_XmFocusInGadget (wid, event, NULL, NULL);
Packit b099d7
    else if (event_mask & XmFOCUS_OUT_EVENT) 
Packit b099d7
	_XmFocusOutGadget (wid, event, NULL, NULL);
Packit b099d7
    else if (event_mask & XmENTER_EVENT)
Packit b099d7
	_XmEnterGadget (wid, event, NULL, NULL);
Packit b099d7
    else if (event_mask & XmLEAVE_EVENT)
Packit b099d7
	_XmLeaveGadget (wid, event, NULL, NULL);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 * GetBaselines
Packit b099d7
 ************************************************************************/
Packit b099d7
static	Boolean
Packit b099d7
GetBaselines(
Packit b099d7
	Widget		wid,
Packit b099d7
	Dimension	**baselines,
Packit b099d7
	int		*line_count)
Packit b099d7
{
Packit b099d7
    Dimension *	base_array;
Packit b099d7
    Position label_y ;
Packit b099d7
Packit b099d7
    *line_count = 1;
Packit b099d7
    base_array = (Dimension *)XtMalloc(sizeof(Dimension));
Packit b099d7
Packit b099d7
    GetLabelXY(wid, NULL, &label_y);
Packit b099d7
Packit b099d7
    if (IG_LabelString(wid) == NULL) {
Packit b099d7
	base_array[0] = IG_HLThickness(wid) + label_y ;
Packit b099d7
    } else {
Packit b099d7
	base_array[0] = IG_HLThickness(wid) + label_y 
Packit b099d7
	    + DEFAULT_LABEL_MARGIN_HEIGHT
Packit b099d7
	    + XmStringBaseline(IG_RenderTable(wid), IG_LabelString(wid));
Packit b099d7
    }
Packit b099d7
Packit b099d7
    *baselines = base_array;
Packit b099d7
    return(True);
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 * GetDisplayRect
Packit b099d7
 ************************************************************************/
Packit b099d7
static	Boolean
Packit b099d7
GetDisplayRect(
Packit b099d7
	Widget		wid,
Packit b099d7
	XRectangle	*displayrect)
Packit b099d7
{
Packit b099d7
    Dimension w = 0, h = 0 ;
Packit b099d7
Packit b099d7
    (*displayrect).x = IG_HLThickness(wid);
Packit b099d7
    (*displayrect).y = IG_HLThickness(wid);
Packit b099d7
    GetSize(wid, &w, &h);
Packit b099d7
    (*displayrect).width = w - 2*IG_HLThickness(wid);
Packit b099d7
    (*displayrect).height = h - 2*IG_HLThickness(wid) ;
Packit b099d7
Packit b099d7
    return(True);
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 * MarginsProc
Packit b099d7
 ************************************************************************/
Packit b099d7
static	void
Packit b099d7
MarginsProc(
Packit b099d7
	Widget		w,
Packit b099d7
	XmBaselineMargins *margins_rec)
Packit b099d7
{
Packit b099d7
    if (margins_rec->get_or_set == XmBASELINE_GET) {
Packit b099d7
      margins_rec->margin_top = DEFAULT_LABEL_MARGIN_HEIGHT;
Packit b099d7
      margins_rec->margin_bottom = DEFAULT_LABEL_MARGIN_HEIGHT;
Packit b099d7
      margins_rec->shadow = IG_ShadowThickness(w);
Packit b099d7
      margins_rec->highlight = IG_HLThickness(w);
Packit b099d7
      margins_rec->text_height = IG_LabelRectHeight(w);
Packit b099d7
      margins_rec->margin_height = DEFAULT_LABEL_MARGIN_HEIGHT;
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/*---------------------
Packit b099d7
| XmIconGadget methods |
Packit b099d7
---------------------*/
Packit b099d7
Packit b099d7
/*------------
Packit b099d7
| ActionProcs |
Packit b099d7
------------*/
Packit b099d7

Packit b099d7
/*-------------------
Packit b099d7
| Internal functions |
Packit b099d7
-------------------*/
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 * ChangeHighlightGC
Packit b099d7
 ************************************************************************/
Packit b099d7
static	void
Packit b099d7
ChangeHighlightGC(
Packit b099d7
	Widget	wid,
Packit b099d7
        XtEnum selection_mode,
Packit b099d7
	int line_width)
Packit b099d7
{
Packit b099d7
    XtGCMask  valueMask;
Packit b099d7
    XGCValues	values;
Packit b099d7
Packit b099d7
    valueMask = GCLineStyle | GCLineWidth | GCDashList | GCCapStyle ;
Packit b099d7
    values.line_width = line_width;
Packit b099d7
    values.dashes = MAX(IG_HLThickness(wid), 8);
Packit b099d7
    values.cap_style = CapProjecting;
Packit b099d7
    values.line_style = (selection_mode == XmADD_MODE) 
Packit b099d7
			    ? LineDoubleDash 
Packit b099d7
			    : LineSolid;
Packit b099d7
Packit b099d7
    XChangeGC(XtDisplay(wid), IG_HighlightGC(wid), valueMask, &values);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 * UpdateSelectGCs
Packit b099d7
 ************************************************************************/
Packit b099d7
static	void
Packit b099d7
UpdateSelectGCs(
Packit b099d7
	Widget	wid,
Packit b099d7
        Pixel select_color)
Packit b099d7
{
Packit b099d7
    XGCValues	values;
Packit b099d7
    XtGCMask	valueMask;
Packit b099d7
    XFontStruct	*fs = (XFontStruct *)NULL;
Packit b099d7
    XtGCMask  modifyMask = GCClipMask | GCClipXOrigin | GCClipYOrigin;
Packit b099d7
    
Packit b099d7
   if (IG_SelectedGC(wid))
Packit b099d7
	XtReleaseGC(XtParent(wid),IG_SelectedGC(wid));
Packit b099d7
    if (IG_InverseGC(wid))
Packit b099d7
	XtReleaseGC(XtParent(wid),IG_InverseGC(wid));
Packit b099d7
Packit b099d7
    valueMask = GCForeground | GCBackground | GCGraphicsExposures;    
Packit b099d7
    values.graphics_exposures = FALSE;
Packit b099d7
Packit b099d7
    /* we need a font becasue the inverse gc is going to be
Packit b099d7
       used to render some text */
Packit b099d7
    if (XmeRenderTableGetDefaultFont(IG_RenderTable(wid), &fs)) {
Packit b099d7
	values.font = fs->fid;
Packit b099d7
	valueMask |= GCFont;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /* the select color can take the special value XmREVERSED_GROUND_COLORS,
Packit b099d7
       which means use parent background as ink for text and parent 
Packit b099d7
       foreground as back for the icon rendering */
Packit b099d7
Packit b099d7
    values.background = IG_Foreground(wid) ; 	
Packit b099d7
    if (select_color != XmREVERSED_GROUND_COLORS) {
Packit b099d7
	values.foreground = select_color ;
Packit b099d7
	IG_InverseGC(wid) = NULL ;
Packit b099d7
    } else {
Packit b099d7
	/* we need a GC to hold the parent background as ink */
Packit b099d7
	XtVaGetValues(XtParent(wid), 
Packit b099d7
		      XmNbackground, &(values.foreground), NULL);
Packit b099d7
	IG_InverseGC(wid) = XtAllocateGC(XtParent(wid), 
Packit b099d7
					 XtParent(wid)->core.depth, 
Packit b099d7
					 valueMask, &values, modifyMask, 0);
Packit b099d7
Packit b099d7
	/* get the foreground for the inversed selected background */
Packit b099d7
	values.background = IG_Background(wid) ; 
Packit b099d7
	XtVaGetValues(XtParent(wid), 
Packit b099d7
		      XmNforeground, &(values.foreground), NULL);
Packit b099d7
	
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    IG_SelectedGC(wid) = XtAllocateGC(XtParent(wid), 
Packit b099d7
				      XtParent(wid)->core.depth, 
Packit b099d7
				      valueMask, &values, modifyMask, 0);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 * UpdateGCs
Packit b099d7
 ************************************************************************/
Packit b099d7
static	void
Packit b099d7
UpdateGCs(
Packit b099d7
	Widget	wid)
Packit b099d7
{
Packit b099d7
    XGCValues	values;
Packit b099d7
    XtGCMask	valueMask;
Packit b099d7
    XFontStruct	*fs = (XFontStruct *)NULL;
Packit b099d7
    XmContainerDataRec container_data ;
Packit b099d7
    Pixel select_color;
Packit b099d7
    XtGCMask  modifyMask = GCClipMask | GCClipXOrigin | GCClipYOrigin;
Packit b099d7
    
Packit b099d7
    if (IG_NormalGC(wid))
Packit b099d7
	XtReleaseGC(XtParent(wid),IG_NormalGC(wid));
Packit b099d7
    if (IG_InsensitiveGC(wid))
Packit b099d7
	XtReleaseGC(XtParent(wid),IG_InsensitiveGC(wid));
Packit b099d7
    if (IG_BackgroundGC(wid))
Packit b099d7
	XtReleaseGC(XtParent(wid),IG_BackgroundGC(wid));
Packit b099d7
    if (IG_TopShadowGC(wid))
Packit b099d7
	XtReleaseGC(XtParent(wid),IG_TopShadowGC(wid));
Packit b099d7
    if (IG_BottomShadowGC(wid))
Packit b099d7
	XtReleaseGC(XtParent(wid),IG_BottomShadowGC(wid));
Packit b099d7
    if (IG_HighlightGC(wid))
Packit b099d7
	XtReleaseGC(XtParent(wid),IG_HighlightGC(wid));
Packit b099d7
Packit b099d7
    /** normal gc **/
Packit b099d7
    valueMask = GCForeground | GCBackground | GCGraphicsExposures;
Packit b099d7
    values.foreground = IG_Foreground(wid) ;
Packit b099d7
    values.background = IG_Background(wid) ; 
Packit b099d7
    values.graphics_exposures = FALSE;
Packit b099d7
Packit b099d7
    if (XmeRenderTableGetDefaultFont(IG_RenderTable(wid), &fs)) {
Packit b099d7
	values.font = fs->fid;
Packit b099d7
	valueMask |= GCFont;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    IG_NormalGC(wid) = XtAllocateGC(XtParent(wid), 
Packit b099d7
					 XtParent(wid)->core.depth, 
Packit b099d7
					 valueMask, &values, modifyMask, 0);
Packit b099d7
Packit b099d7
    /** background gc **/
Packit b099d7
    values.foreground = IG_Background(wid) ;
Packit b099d7
    values.background = IG_Foreground(wid) ; 
Packit b099d7
Packit b099d7
    if (PIXMAP_VALID(IG_BackgroundPixmap(wid))) {
Packit b099d7
	int depth ;
Packit b099d7
Packit b099d7
	XmeGetPixmapData(XtScreen(wid),IG_BackgroundPixmap(wid) ,
Packit b099d7
			 NULL,    
Packit b099d7
			 &depth,
Packit b099d7
			 NULL, NULL, NULL, NULL, NULL, NULL); 
Packit b099d7
        
Packit b099d7
	if (depth == 1) {
Packit b099d7
	    valueMask |= GCFillStyle | GCStipple ;
Packit b099d7
	    values.fill_style = FillOpaqueStippled;
Packit b099d7
	    values.stipple = IG_BackgroundPixmap(wid);
Packit b099d7
	} else {
Packit b099d7
	    valueMask |= GCFillStyle | GCTile ;
Packit b099d7
	    values.fill_style = FillTiled;
Packit b099d7
	    values.tile = IG_BackgroundPixmap(wid);
Packit b099d7
	}	   
Packit b099d7
	
Packit b099d7
    }
Packit b099d7
Packit b099d7
    IG_BackgroundGC(wid) =  XtAllocateGC(XtParent(wid), 
Packit b099d7
					 XtParent(wid)->core.depth, 
Packit b099d7
					 valueMask, &values, modifyMask, 0);
Packit b099d7
Packit b099d7
    /** selected gcs **/
Packit b099d7
    /* use a select color from the trait if possible,
Packit b099d7
     otherwise default to select background of the parent
Packit b099d7
     (or is it of the container logical parent ? not really 
Packit b099d7
     important for the header case is not selectable... */
Packit b099d7
Packit b099d7
    /* get the container information */
Packit b099d7
    /* I need the selection mode for the highlight init value */
Packit b099d7
    container_data.valueMask = ContSelectColor | ContSelectionMode;
Packit b099d7
    GetContainerData(wid, &container_data);
Packit b099d7
Packit b099d7
    if (container_data.valueMask & ContSelectColor) {
Packit b099d7
	select_color = container_data.select_color;
Packit b099d7
    } else {
Packit b099d7
	select_color = XmREVERSED_GROUND_COLORS ;
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    UpdateSelectGCs(wid, select_color) ;
Packit b099d7
Packit b099d7
Packit b099d7
    /** insensitive gc **/
Packit b099d7
Packit b099d7
#ifdef FIX_1381
Packit b099d7
	/*generally gray insensitive foreground (instead stipple)*/
Packit b099d7
    values.foreground = _XmAssignInsensitiveColor( wid);
Packit b099d7
#else
Packit b099d7
    values.foreground = IG_Foreground(wid) ;
Packit b099d7
#endif
Packit b099d7
Packit b099d7
    values.background = IG_Background(wid) ; 
Packit b099d7
#ifdef FIX_1381
Packit b099d7
    valueMask |= GCFillStyle;
Packit b099d7
    values.fill_style = FillSolid;
Packit b099d7
#else
Packit b099d7
    valueMask |= GCFillStyle | GCStipple;
Packit b099d7
    values.fill_style = FillOpaqueStippled;
Packit b099d7
    values.stipple = _XmGetInsensitiveStippleBitmap(wid);
Packit b099d7
#endif
Packit b099d7
Packit b099d7
    IG_InsensitiveGC(wid) = XtAllocateGC(XtParent(wid), 
Packit b099d7
					 XtParent(wid)->core.depth, 
Packit b099d7
					 valueMask, &values, modifyMask, 0);
Packit b099d7
#ifdef FIX_1381
Packit b099d7
	/*light shadow for insensitive text (instead stipple)*/
Packit b099d7
	values.foreground = IG_TopShadowColor(wid);
Packit b099d7
	IG_ShadowGC(wid) = XtAllocateGC(XtParent(wid),
Packit b099d7
					XtParent(wid)->core.depth,
Packit b099d7
					 valueMask, &values, modifyMask, 0);
Packit b099d7
#endif
Packit b099d7
Packit b099d7
    /** highlight **/
Packit b099d7
    
Packit b099d7
    valueMask = (GCForeground | GCBackground | GCLineWidth | 
Packit b099d7
		 GCLineStyle | GCDashList);
Packit b099d7
    modifyMask = (GCLineStyle | GCLineWidth | GCDashList | 
Packit b099d7
		  GCClipXOrigin | GCClipYOrigin | GCClipMask);
Packit b099d7
Packit b099d7
    values.foreground = IG_HighlightColor(wid);
Packit b099d7
    XtVaGetValues(XtParent(wid), XmNbackground, &(values.background), NULL);
Packit b099d7
    values.line_width = IG_HLThickness(wid);
Packit b099d7
    values.dashes = MAX(values.line_width, 8);
Packit b099d7
    values.line_style = (container_data.selection_mode == XmADD_MODE) ? 
Packit b099d7
      LineDoubleDash : LineSolid;
Packit b099d7
Packit b099d7
    IG_HighlightGC(wid) = XtAllocateGC(XtParent(wid), 
Packit b099d7
				       XtParent(wid)->core.depth,
Packit b099d7
				       valueMask, &values,
Packit b099d7
				       modifyMask, 0);
Packit b099d7
Packit b099d7
    /** topshadow, bottomshadow gc */
Packit b099d7
    IG_TopShadowGC(wid) = 
Packit b099d7
	_XmGetPixmapBasedGC (wid, 
Packit b099d7
			     IG_TopShadowColor(wid),
Packit b099d7
			     IG_Background(wid),
Packit b099d7
			     IG_TopShadowPixmap(wid));
Packit b099d7
Packit b099d7
     IG_BottomShadowGC(wid) = 
Packit b099d7
	_XmGetPixmapBasedGC (wid, 
Packit b099d7
			     IG_BottomShadowColor(wid),
Packit b099d7
			     IG_Background(wid),
Packit b099d7
			     IG_BottomShadowPixmap(wid));
Packit b099d7
			     
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 * GetStringTableReOrdered.
Packit b099d7
 *  lazy alloc/filling using realloc
Packit b099d7
 * --- Never free the returned array.---
Packit b099d7
 ************************************************************************/
Packit b099d7
static	XmStringTable
Packit b099d7
GetStringTableReOrdered(
Packit b099d7
	XmStringTable st,
Packit b099d7
        Cardinal st_count,
Packit b099d7
        Cardinal * order,
Packit b099d7
        Cardinal order_count)
Packit b099d7
{
Packit b099d7
    static XmString * Default_st = NULL ;
Packit b099d7
    static Cardinal Max_st_count = 0;
Packit b099d7
    Cardinal i, count ;
Packit b099d7
Packit b099d7
    if (!order_count || !st_count) return NULL ;
Packit b099d7
Packit b099d7
    /* here we are filling up a new string table out of an existing
Packit b099d7
       one and a new order table. Take only the minimum number of both */
Packit b099d7
    count = MIN(order_count, st_count);
Packit b099d7
Packit b099d7
    if (count > Max_st_count) {
Packit b099d7
	Max_st_count = MAX(count, 33);
Packit b099d7
	Default_st = (XmStringTable) XtRealloc((char*) Default_st,
Packit b099d7
					Max_st_count * sizeof(XmString));
Packit b099d7
    }
Packit b099d7
Packit b099d7
    for (i = 0; i < count; i++) {
Packit b099d7
	if (order) {
Packit b099d7
	    if (order[i] <= st_count) 
Packit b099d7
		Default_st[i] = st[order[i] - 1];
Packit b099d7
	    else 
Packit b099d7
		Default_st[i] = NULL ;
Packit b099d7
	} else {
Packit b099d7
	    Default_st[i] = st[i];
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    return Default_st ;
Packit b099d7
    /* This is realloced memory, be sure that no one is keeping
Packit b099d7
       reference to this stuff longer enough for it to be realloced again */
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 * GetStringTableExtent
Packit b099d7
 *
Packit b099d7
	1> If the XmTablist has exactly as many entries as
Packit b099d7
	   XmNdetailOrderCount, the last entry is clipped, and consequently,
Packit b099d7
	   all IconGadgets will ask for the same size.
Packit b099d7
	2> If the XmTablist is greater than XmNdetailOrderCount, the extra
Packit b099d7
	   tabs are ignored
Packit b099d7
	3> if the XmTablist is XmNdetailOrderCount-1, then the last detail
Packit b099d7
	   is not clipped, but extends as far as needed.  The IconGadget
Packit b099d7
	   geometry request will be for the full size.  The Container
Packit b099d7
	   will ask for the maximum width requested by all its IconGadgets.
Packit b099d7
	4> If the XmTablist is less than XmNdetailOrderCount-1, then,
Packit b099d7
	   concatenate the extra details at the end and request
Packit b099d7
	   the additional width.
Packit b099d7
Packit b099d7
************************************************************************/
Packit b099d7
static	void
Packit b099d7
GetStringTableExtent(
Packit b099d7
	Screen * screen,
Packit b099d7
        XmStringTable st,
Packit b099d7
        Cardinal st_count,
Packit b099d7
        XmRenderTable render_table,
Packit b099d7
        XmTabList tab_list,
Packit b099d7
        Dimension hor_spacing,  /* for the tab-less concat details */
Packit b099d7
        Dimension * width_ret,
Packit b099d7
        Dimension * height_ret,
Packit b099d7
        Position * baseline_ret)
Packit b099d7
{
Packit b099d7
    Cardinal i ;
Packit b099d7
    Dimension w, h, baseline ;
Packit b099d7
    unsigned int tab_count = 0 ;
Packit b099d7
    Dimension height_under_max = 0 ;
Packit b099d7
Packit b099d7
    *baseline_ret = 0 ;
Packit b099d7
    *width_ret = 0 ;
Packit b099d7
    *height_ret = 0 ;
Packit b099d7
    if (tab_list) tab_count = XmTabListTabCount(tab_list) ;
Packit b099d7
Packit b099d7
    if (st == NULL || !st_count) return ;
Packit b099d7
Packit b099d7
    /* the extra tabs are ignored */
Packit b099d7
    tab_count = MIN(tab_count, st_count);
Packit b099d7
Packit b099d7
    /* the width is given by the last tab position + the remaining items */
Packit b099d7
    if (tab_count) *width_ret = _XmTabListGetPosition(screen,
Packit b099d7
						     tab_list, 
Packit b099d7
						     XmPIXELS, tab_count-1);
Packit b099d7
    /* the height is the sum of max baseline + max height under baseline */
Packit b099d7
    for (i = 0; i < st_count; i++) {
Packit b099d7
	if (st[i]) {
Packit b099d7
	    XmStringExtent(render_table, st[i], &w, &h);
Packit b099d7
	    baseline = XmStringBaseline(render_table, st[i]);
Packit b099d7
	} else {
Packit b099d7
	    h = 0 ; 
Packit b099d7
	    w = 0 ;
Packit b099d7
	    baseline = 0 ;
Packit b099d7
	}
Packit b099d7
	height_under_max = MAX(height_under_max, h - baseline);
Packit b099d7
	*baseline_ret = MAX(*baseline_ret, (Position)baseline);
Packit b099d7
	if (i >= tab_count) *width_ret += w + hor_spacing;
Packit b099d7
    }    
Packit b099d7
Packit b099d7
    *height_ret = *baseline_ret + height_under_max ;    
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 * GetSize
Packit b099d7
 ************************************************************************/
Packit b099d7
static	void
Packit b099d7
GetSize(
Packit b099d7
	Widget		wid,
Packit b099d7
	Dimension *	ret_width,
Packit b099d7
	Dimension *	ret_height)
Packit b099d7
{
Packit b099d7
    XmContainerDataRec container_data ;
Packit b099d7
    Dimension	ht = IG_HLThickness(wid);
Packit b099d7
    Dimension mw = IG_MarginWidth(wid), mh = IG_MarginHeight(wid);
Packit b099d7
    int ideal_width, ideal_height;
Packit b099d7
    Dimension detail_width, detail_height;
Packit b099d7
    XmStringTable new_detail ;
Packit b099d7
    Position label_y, lab_baseline, detail_baseline ;
Packit b099d7
Packit b099d7
    /* get the container information */
Packit b099d7
    container_data.valueMask = ContAllValid ;
Packit b099d7
    GetContainerData(wid, &container_data);
Packit b099d7
Packit b099d7
    
Packit b099d7
    /**** first the size without the detail */
Packit b099d7
    ideal_width = GetIconLabelWidth(wid) ;
Packit b099d7
    ideal_height = GetIconLabelHeight(wid) ;
Packit b099d7
Packit b099d7
    
Packit b099d7
    if (SHOW_DETAIL(wid, &container_data)) {
Packit b099d7
	/* get the detail table to be displayed */
Packit b099d7
	new_detail = 
Packit b099d7
	    GetStringTableReOrdered(IG_Detail(wid), IG_DetailCount(wid), 
Packit b099d7
				    container_data.detail_order,
Packit b099d7
				    container_data.detail_order_count);
Packit b099d7
	/* ask for its extent using the provided container tab list */
Packit b099d7
	/* new_detail might be NULL at this point, extent should
Packit b099d7
	   return 0 size if so. some new_detail[i] might also be NULL,
Packit b099d7
	   in which case extent should go to the next tab. note that 
Packit b099d7
	   tab might  also be NULL. */
Packit b099d7
	GetStringTableExtent(XtScreen(wid),
Packit b099d7
			     new_detail, MIN(container_data.detail_order_count,
Packit b099d7
					     IG_DetailCount(wid)),
Packit b099d7
			     IG_RenderTable(wid), 
Packit b099d7
			     container_data.detail_tablist,
Packit b099d7
			     DEFAULT_HOR_SPACING,
Packit b099d7
			     &detail_width, &detail_height, &detail_baseline);
Packit b099d7
	/* width in detail is sum of first_column_width (where
Packit b099d7
	   the x has been removed already) + the detail width */
Packit b099d7
	ideal_width = container_data.first_column_width + (int)detail_width
Packit b099d7
	    + mw - ht;
Packit b099d7
	/* the baseline have to be taken into account in the calculation
Packit b099d7
	   of the height needed */
Packit b099d7
	GetLabelXY(wid, NULL, &label_y);
Packit b099d7
	lab_baseline = XmStringBaseline(IG_RenderTable(wid),
Packit b099d7
					 IG_LabelString(wid));
Packit b099d7
	ideal_height = MAX(ideal_height, 
Packit b099d7
			   label_y - ht + DEFAULT_LABEL_MARGIN_HEIGHT +
Packit b099d7
			   lab_baseline - mh -
Packit b099d7
			   detail_baseline + detail_height);
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    /* do not set non null dimensions */
Packit b099d7
    if (*ret_width == 0) *ret_width = ideal_width + 2*ht;
Packit b099d7
    if (*ret_height == 0) *ret_height = ideal_height + 2*ht;
Packit b099d7
Packit b099d7
}
Packit b099d7

Packit b099d7
Packit b099d7
/*-------------------
Packit b099d7
| Trait methods     |
Packit b099d7
-------------------*/
Packit b099d7
/************************************************************************
Packit b099d7
 * ContItemSetValues
Packit b099d7
 * 
Packit b099d7
 * Deal with a container setting new attributes on me
Packit b099d7
 ************************************************************************/
Packit b099d7
static	void
Packit b099d7
ContItemSetValues(Widget w, 
Packit b099d7
		  XmContainerItemData contItemData)
Packit b099d7
{
Packit b099d7
    XtExposeProc    expose;
Packit b099d7
Packit b099d7
    /* here there is a match between the containerItem and the IconGadget 
Packit b099d7
       resource values, because we are doing both at the same time and it's
Packit b099d7
       convenient. Others IconGadget kind might have to map our
Packit b099d7
       viewType, visualEmphasis values onto their corresponding types */
Packit b099d7
Packit b099d7
    if (contItemData->valueMask & ContItemViewType)
Packit b099d7
	XtVaSetValues(w, XmNviewType, contItemData->view_type, NULL);
Packit b099d7
Packit b099d7
    if (contItemData->valueMask & ContItemVisualEmphasis) {
Packit b099d7
	IG_VisualEmphasis(w) = contItemData->visual_emphasis ;
Packit b099d7
	
Packit b099d7
	if (XtIsRealized(XtParent(w)))
Packit b099d7
	{
Packit b099d7
	  _XmProcessLock();
Packit b099d7
	  expose = w->core.widget_class->core_class.expose;
Packit b099d7
	  _XmProcessUnlock();
Packit b099d7
Packit b099d7
	  (* (expose)) (w, NULL, NULL);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 * ContItemGetValues
Packit b099d7
 * 
Packit b099d7
 ************************************************************************/
Packit b099d7
static	void
Packit b099d7
ContItemGetValues(Widget w, 
Packit b099d7
		  XmContainerItemData contItemData)
Packit b099d7
{    
Packit b099d7
Packit b099d7
    if (contItemData->valueMask & ContItemViewType)
Packit b099d7
	contItemData->view_type = IG_ViewType(w);
Packit b099d7
    if (contItemData->valueMask & ContItemVisualEmphasis)
Packit b099d7
	contItemData->visual_emphasis = IG_VisualEmphasis(w);
Packit b099d7
    if (contItemData->valueMask & ContItemIconWidth) {
Packit b099d7
	contItemData->icon_width = 2*IG_HLThickness(w) + GetIconLabelWidth(w);
Packit b099d7
    }
Packit b099d7
    if (contItemData->valueMask & ContItemDetailCount) {
Packit b099d7
	contItemData->detail_count = IG_DetailCount(w);
Packit b099d7
    }
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static Boolean 
Packit b099d7
HandleRedraw (
Packit b099d7
	Widget kid, 	       
Packit b099d7
	Widget cur_parent,	/* unused */
Packit b099d7
	Widget new_parent,	/* unused */
Packit b099d7
	Mask visual_flag)
Packit b099d7
{
Packit b099d7
    XmIconGadget ig = (XmIconGadget) kid ;
Packit b099d7
    Boolean redraw = False;
Packit b099d7
    XmIconGCacheObjPart oldCopy;
Packit b099d7
    
Packit b099d7
	
Packit b099d7
    if (visual_flag & VisualSelectColor) {
Packit b099d7
	XmContainerDataRec container_data ;
Packit b099d7
	Pixel select_color;
Packit b099d7
Packit b099d7
	/* this is all shared data, so we need to make a copy
Packit b099d7
	   because changing any field */
Packit b099d7
	_XmProcessLock();
Packit b099d7
	_XmCacheCopy((XtPointer) IG_Cache(ig), (XtPointer) &oldCopy,
Packit b099d7
		     sizeof(XmIconGCacheObjPart));
Packit b099d7
	_XmCacheDelete ((XtPointer) IG_Cache(ig));
Packit b099d7
	_XmProcessUnlock();
Packit b099d7
	IG_Cache(ig) = &oldCopy;
Packit b099d7
    
Packit b099d7
    
Packit b099d7
	/* use a select color from the trait if possible,
Packit b099d7
	   otherwise default to select background of the parent
Packit b099d7
	   (or is it of the container logical parent ? not really 
Packit b099d7
	   important for the header case is not selectable... */
Packit b099d7
Packit b099d7
	/* get the container information */
Packit b099d7
	/* I need the selection mode for the highlight init value */
Packit b099d7
	container_data.valueMask = ContSelectColor ;
Packit b099d7
	GetContainerData(kid, &container_data);
Packit b099d7
Packit b099d7
	if (container_data.valueMask & ContSelectColor) {
Packit b099d7
	    select_color = container_data.select_color;
Packit b099d7
	} else {
Packit b099d7
	    select_color = XmREVERSED_GROUND_COLORS ;
Packit b099d7
	}
Packit b099d7
    
Packit b099d7
	UpdateSelectGCs(kid, select_color) ;
Packit b099d7
Packit b099d7
	redraw = True;
Packit b099d7
Packit b099d7
	/* now cache back the new version */
Packit b099d7
	_XmProcessLock();
Packit b099d7
	IG_Cache(ig) = (XmIconGCacheObjPart *)
Packit b099d7
	    _XmCachePart( IG_ClassCachePart(ig),
Packit b099d7
			 (XtPointer) IG_Cache(ig),
Packit b099d7
			 sizeof(XmIconGCacheObjPart));
Packit b099d7
	_XmProcessUnlock();
Packit b099d7
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    return redraw ;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
static void
Packit b099d7
GetColors(Widget w, 
Packit b099d7
	  XmAccessColorData color_data)
Packit b099d7
{
Packit b099d7
    XmContainerDataRec container_data ;
Packit b099d7
    
Packit b099d7
    /* since we use our own private converter, no real
Packit b099d7
       need to check for validity here, we already do it
Packit b099d7
       in the converter itself, but it doesn't hurt
Packit b099d7
       and if we ever change IconG to use a generic pixmap
Packit b099d7
       converter (solve the mask pixmap setting), it will work 
Packit b099d7
       all by itself */
Packit b099d7
Packit b099d7
    if (IG_Cache(w)) { /* mean it's valid */
Packit b099d7
	color_data->valueMask = AccessForeground | AccessBackgroundPixel |
Packit b099d7
	    AccessHighlightColor | AccessTopShadowColor |
Packit b099d7
		AccessBottomShadowColor | AccessSelectColor;
Packit b099d7
Packit b099d7
	color_data->background = IG_Background(w);
Packit b099d7
	color_data->foreground = IG_Foreground(w);
Packit b099d7
	color_data->highlight_color = IG_Foreground(w);
Packit b099d7
	color_data->top_shadow_color = IG_TopShadowColor(w);
Packit b099d7
	color_data->bottom_shadow_color = IG_BottomShadowColor(w);
Packit b099d7
	
Packit b099d7
	container_data.valueMask = ContSelectColor ;
Packit b099d7
	
Packit b099d7
	/*** get the Container select color using the trait */
Packit b099d7
	{
Packit b099d7
	  XmIconGadgetClass igc = (XmIconGadgetClass) XtClass(w);
Packit b099d7
	  Widget container_id ;
Packit b099d7
	  XmContainerTrait container_trait ;
Packit b099d7
	  
Packit b099d7
	  container_id = (igc->icong_class.get_container_parent) ?
Packit b099d7
	    (*(igc->icong_class.get_container_parent))(w) : XtParent(w);
Packit b099d7
Packit b099d7
	  container_trait = (XmContainerTrait) 
Packit b099d7
	    XmeTraitGet((XtPointer)XtClass(container_id), XmQTcontainer) ;
Packit b099d7
Packit b099d7
	  /* remove message about uninitialized memory read */
Packit b099d7
	  container_data.first_column_width = 0;
Packit b099d7
	  container_data.select_color = XmREVERSED_GROUND_COLORS;
Packit b099d7
	  if (container_trait)
Packit b099d7
	    container_trait->getValues(container_id, &container_data);
Packit b099d7
	}
Packit b099d7
	if (container_data.valueMask & ContSelectColor) {
Packit b099d7
	    color_data->select_color = container_data.select_color;
Packit b099d7
	} else {
Packit b099d7
	    color_data->select_color = XmREVERSED_GROUND_COLORS ;
Packit b099d7
	}
Packit b099d7
Packit b099d7
    } else { /* cannot access the color of the gadget,
Packit b099d7
		because the cache is not yet present.
Packit b099d7
		Return that value, so that the converter
Packit b099d7
		(probably the one calling it)
Packit b099d7
		can take the appropriate step */
Packit b099d7
	color_data->valueMask = AccessColorInvalid ;
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
static Boolean
Packit b099d7
PointIn(Widget wid, 
Packit b099d7
	Position x,
Packit b099d7
        Position y)
Packit b099d7
{
Packit b099d7
    XmContainerDataRec container_data ;
Packit b099d7
Packit b099d7
    /* x, y in parent coordinates system */
Packit b099d7
Packit b099d7
    /* first check that point is in bbox */
Packit b099d7
    if (!(x >= wid->core.x && y >= wid->core.y && 
Packit b099d7
	x < wid->core.x + wid->core.width    && 
Packit b099d7
	y < wid->core.y + wid->core.height))
Packit b099d7
	return False;
Packit b099d7
Packit b099d7
    /* if we have detail then it's enough to answer yes */
Packit b099d7
    container_data.valueMask = ContAllValid ;
Packit b099d7
    GetContainerData(wid, &container_data);
Packit b099d7
    if (SHOW_DETAIL(wid, &container_data))
Packit b099d7
	return True;
Packit b099d7
    else {
Packit b099d7
	Position label_x, label_y;
Packit b099d7
	XPoint points[8];
Packit b099d7
	Cardinal n;
Packit b099d7
Packit b099d7
	/* now check if it's not in empty space at the corners */
Packit b099d7
	GetLabelXY(wid, &label_x, &label_y);
Packit b099d7
Packit b099d7
	/* undo the ltr layout for label_x, because getshapeinfo does it */
Packit b099d7
	if (LayoutIsRtoLG(wid)) {
Packit b099d7
	    label_x = XtWidth(wid) - IG_LabelRectWidth(wid) - label_x;
Packit b099d7
	}
Packit b099d7
	n = GetShapeInfo(wid, GetLargeIconX(wid), GetSmallIconY(wid), 
Packit b099d7
			 label_x, label_y,
Packit b099d7
			 container_data.first_column_width, INVALID_DIMENSION,
Packit b099d7
			 points);
Packit b099d7
	if (n == 2) {
Packit b099d7
	    return (x >= points[0].x && x <= points[1].x &&
Packit b099d7
		    y >= points[0].y && y <= points[1].y);
Packit b099d7
	} else if (n == 8) {
Packit b099d7
	    if (IG_ViewType(wid) == XmLARGE_ICON) {
Packit b099d7
		Cardinal p0, p2, p3, p5;
Packit b099d7
		if (!LayoutIsRtoLG(wid)) {
Packit b099d7
		    p0 = 0; p2 = 2; p3 = 3; p5 = 5;
Packit b099d7
		} else {
Packit b099d7
		    p0 = 5; p2 = 3; p3 = 2; p5 = 0;
Packit b099d7
		}
Packit b099d7
		return (y <= points[1].y && /* pixmap row */
Packit b099d7
			x >= points[p2].x && x <= points[p3].x) ||
Packit b099d7
			    (y >= points[1].y && /* label row */
Packit b099d7
			     x >= points[p0].x && x <= points[p5].x);
Packit b099d7
	    } else {		/* SMALL_ICON */
Packit b099d7
		return (((!LayoutIsRtoLG(wid) && x <= points[1].x) ||
Packit b099d7
			 (LayoutIsRtoLG(wid) && x >= points[1].x)) &&
Packit b099d7
			/* pixmap column */
Packit b099d7
			y >= points[0].y && y <= points[7].y) ||
Packit b099d7
			    (((!LayoutIsRtoLG(wid) && x >= points[1].x) ||
Packit b099d7
			      (LayoutIsRtoLG(wid) && x <= points[1].x)) &&
Packit b099d7
			     /* label row */
Packit b099d7
			     y >= points[2].y && y <= points[5].y);
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
	return True;		/* actually we should never get there */
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/*-------------------
Packit b099d7
| _Xm functions      |
Packit b099d7
--------------------*/
Packit b099d7
void
Packit b099d7
_XmIconGadgetIconPos(Widget wid, int *x, int *y)
Packit b099d7
{
Packit b099d7
  XmIconGadget	ig = (XmIconGadget)wid;
Packit b099d7
  Position icon_x;
Packit b099d7
Packit b099d7
  if (ig -> icong.viewtype == XmSMALL_ICON) {
Packit b099d7
    icon_x = GetSmallIconX(wid);
Packit b099d7
    if (LayoutIsRtoLG(wid))
Packit b099d7
	icon_x = XtWidth(wid) - icon_x - IG_SmallIconRectWidth(wid);
Packit b099d7
    *x = icon_x;
Packit b099d7
    *y = GetSmallIconY(wid);
Packit b099d7
  } else {
Packit b099d7
    icon_x = GetLargeIconX(wid);
Packit b099d7
    if (LayoutIsRtoLG(wid))
Packit b099d7
	icon_x = XtWidth(wid) - icon_x - IG_LargeIconRectWidth(wid);
Packit b099d7
    *x = icon_x;
Packit b099d7
    *y = GetLargeIconY(wid);
Packit b099d7
  }
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/*-------------------
Packit b099d7
| External functions |
Packit b099d7
-------------------*/
Packit b099d7
/************************************************************************
Packit b099d7
 * XmCreateIconGadget
Packit b099d7
 * 
Packit b099d7
 ************************************************************************/
Packit b099d7
Widget
Packit b099d7
XmCreateIconGadget(
Packit b099d7
	Widget		parent,
Packit b099d7
	char		*name,
Packit b099d7
	ArgList		arglist,
Packit b099d7
	Cardinal	argcount)
Packit b099d7
{
Packit b099d7
    return(XtCreateWidget(name,xmIconGadgetClass,parent,arglist,argcount));
Packit b099d7
}
Packit b099d7
Packit b099d7
Widget 
Packit b099d7
XmVaCreateIconGadget(
Packit b099d7
        Widget parent,
Packit b099d7
        char *name,
Packit b099d7
        ...)
Packit b099d7
{
Packit b099d7
    register Widget w;
Packit b099d7
    va_list var;
Packit b099d7
    int count;
Packit b099d7
    
Packit b099d7
    Va_start(var,name);
Packit b099d7
    count = XmeCountVaListSimple(var);
Packit b099d7
    va_end(var);
Packit b099d7
Packit b099d7
    
Packit b099d7
    Va_start(var, name);
Packit b099d7
    w = XmeVLCreateWidget(name, 
Packit b099d7
                         xmIconGadgetClass,
Packit b099d7
                         parent, False, 
Packit b099d7
                         var, count);
Packit b099d7
    va_end(var);   
Packit b099d7
    return w;
Packit b099d7
}
Packit b099d7
Packit b099d7
Widget
Packit b099d7
XmVaCreateManagedIconGadget(
Packit b099d7
        Widget parent,
Packit b099d7
        char *name,
Packit b099d7
        ...)
Packit b099d7
{
Packit b099d7
    Widget w = NULL;
Packit b099d7
    va_list var;
Packit b099d7
    int count;
Packit b099d7
    
Packit b099d7
    Va_start(var, name);
Packit b099d7
    count = XmeCountVaListSimple(var);
Packit b099d7
    va_end(var);
Packit b099d7
    
Packit b099d7
    Va_start(var, name);
Packit b099d7
    w = XmeVLCreateWidget(name, 
Packit b099d7
                         xmIconGadgetClass,
Packit b099d7
                         parent, True, 
Packit b099d7
                         var, count);
Packit b099d7
    va_end(var);   
Packit b099d7
    return w;
Packit b099d7
}