Blame lib/Xm/ArrowBG.c

Packit b099d7
/* 
Packit b099d7
 * Motif
Packit b099d7
 *
Packit b099d7
 * Copyright (c) 1987-2012, The Open Group. All rights reserved.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are free software; you can
Packit b099d7
 * redistribute them and/or modify them under the terms of the GNU
Packit b099d7
 * Lesser General Public License as published by the Free Software
Packit b099d7
 * Foundation; either version 2 of the License, or (at your option)
Packit b099d7
 * any later version.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are distributed in the hope that
Packit b099d7
 * they will be useful, but WITHOUT ANY WARRANTY; without even the
Packit b099d7
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
Packit b099d7
 * PURPOSE. See the GNU Lesser General Public License for more
Packit b099d7
 * details.
Packit b099d7
 *
Packit b099d7
 * You should have received a copy of the GNU Lesser General Public
Packit b099d7
 * License along with these librararies and programs; if not, write
Packit b099d7
 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
Packit b099d7
 * Floor, Boston, MA 02110-1301 USA
Packit b099d7
*/ 
Packit b099d7
/* 
Packit b099d7
 * HISTORY
Packit b099d7
*/ 
Packit b099d7
#ifdef REV_INFO
Packit b099d7
#ifndef lint
Packit b099d7
static char rcsid[] = "$TOG: ArrowBG.c /main/20 1999/01/26 15:30:15 mgreess $"
Packit b099d7
#endif
Packit b099d7
#endif
Packit b099d7
/* (c) Copyright 1987, 1988, 1989, 1990, 1991, 1992 HEWLETT-PACKARD COMPANY */
Packit b099d7
Packit b099d7
#ifdef HAVE_CONFIG_H
Packit b099d7
#include <config.h>
Packit b099d7
#endif
Packit b099d7
Packit b099d7
Packit b099d7
#include <stdio.h>
Packit b099d7
#include <Xm/ArrowBGP.h>
Packit b099d7
#include <Xm/DrawP.h>
Packit b099d7
#include <Xm/ManagerP.h>
Packit b099d7
#include <Xm/TraitP.h>
Packit b099d7
#include <Xm/AccColorT.h>
Packit b099d7
#include <Xm/ActivatableT.h>
Packit b099d7
#include <Xm/CareVisualT.h>
Packit b099d7
#include <Xm/VaSimpleP.h>
Packit b099d7
#include "ColorI.h"
Packit b099d7
#include "PixConvI.h"
Packit b099d7
#include "PrimitiveI.h"
Packit b099d7
#include "RepTypeI.h"
Packit b099d7
#include "ScreenI.h"
Packit b099d7
#include "TravActI.h"
Packit b099d7
#include "TraversalI.h"
Packit b099d7
#include "XmI.h"
Packit b099d7
Packit b099d7
#define DELAY_DEFAULT	100
Packit b099d7
#define INVALID_PIXEL	((Pixel) -1)
Packit b099d7
#define INVALID_PIXMAP	((Pixmap) -1)
Packit b099d7

Packit b099d7
/********    Static Function Declarations    ********/
Packit b099d7
Packit b099d7
static Pixmap GetHighlightPixmapDefault(XmArrowButtonGadget ag);
Packit b099d7
static Pixmap GetTopShadowPixmapDefault(XmArrowButtonGadget ag);
Packit b099d7
Packit b099d7
static void ClassPartInitialize(WidgetClass wc);
Packit b099d7
static void Initialize(Widget    rw,
Packit b099d7
		       Widget    nw,
Packit b099d7
		       ArgList   args,
Packit b099d7
		       Cardinal *num_args);
Packit b099d7
static void GetArrowGC(XmArrowButtonGadget ag);
Packit b099d7
static void GetBackgroundGC(XmArrowButtonGadget ag);
Packit b099d7
static void Redisplay(Widget w, XEvent *event, Region region);
Packit b099d7
static void Destroy(Widget w);
Packit b099d7
static Boolean SetValues(Widget    cw,
Packit b099d7
			 Widget    rw,
Packit b099d7
			 Widget    nw,
Packit b099d7
			 ArgList   args,
Packit b099d7
			 Cardinal *num_args);
Packit b099d7
static void HighlightBorder(Widget w);
Packit b099d7
static void InputDispatch(Widget wid, XEvent *event, Mask event_mask);
Packit b099d7
static void Arm(XmArrowButtonGadget aw, XEvent *event);
Packit b099d7
static void Activate(Widget    wid,
Packit b099d7
		     XEvent   *event,
Packit b099d7
		     String   *params,
Packit b099d7
		     Cardinal *num_params);
Packit b099d7
static void ArmAndActivate(Widget    w,
Packit b099d7
			   XEvent   *event,
Packit b099d7
			   String   *params,
Packit b099d7
			   Cardinal *num_params);
Packit b099d7
static void ArmTimeout(XtPointer data, XtIntervalId *id);
Packit b099d7
static void Disarm(XmArrowButtonGadget aw, XEvent *event);
Packit b099d7
static void Enter(XmArrowButtonGadget aw, XEvent *event);
Packit b099d7
static void Leave(XmArrowButtonGadget aw, XEvent *event);
Packit b099d7
static void Help(XmArrowButtonGadget aw, XEvent *event);
Packit b099d7
static void ActivateCommonG(XmArrowButtonGadget ag, 
Packit b099d7
			    XEvent             *event,
Packit b099d7
			    Mask                event_mask);
Packit b099d7
Packit b099d7
static void ChangeCB(Widget         w, 
Packit b099d7
		     XtCallbackProc activCB,
Packit b099d7
		     XtPointer      closure,
Packit b099d7
		     Boolean        setunset);
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 InitNewColorBehavior(XmArrowButtonGadget ag);
Packit b099d7
static void DealWithColors(XmArrowButtonGadget ag);
Packit b099d7
static void DealWithPixmaps(XmArrowButtonGadget ag);
Packit b099d7
static void InitNewPixmapBehavior(XmArrowButtonGadget ag);
Packit b099d7
Packit b099d7
static void DrawArrowG(XmArrowButtonGadget ag,
Packit b099d7
		       GC                  top_gc,
Packit b099d7
		       GC                  bottom_gc,
Packit b099d7
		       GC                  center_gc);
Packit b099d7
static void GetColors(Widget widget, XmAccessColorData color_data);
Packit b099d7
Packit b099d7
/********    End Static Function Declarations    ********/
Packit b099d7

Packit b099d7
/*  Resource list for Arrow  */
Packit b099d7
Packit b099d7
static XtResource resources[] = 
Packit b099d7
{
Packit b099d7
  {
Packit b099d7
    XmNmultiClick, XmCMultiClick, XmRMultiClick,
Packit b099d7
    sizeof(unsigned char),
Packit b099d7
    XtOffsetOf(struct _XmArrowButtonGadgetRec, arrowbutton.multiClick),
Packit b099d7
    XmRImmediate, (XtPointer) XmMULTICLICK_KEEP
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNarrowDirection, XmCArrowDirection, XmRArrowDirection, 
Packit b099d7
    sizeof(unsigned char),
Packit b099d7
    XtOffsetOf(struct _XmArrowButtonGadgetRec, arrowbutton.direction), 
Packit b099d7
    XmRImmediate, (XtPointer) XmARROW_UP
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNactivateCallback, XmCCallback, XmRCallback, sizeof(XtCallbackList),
Packit b099d7
    XtOffsetOf(struct _XmArrowButtonGadgetRec, arrowbutton.activate_callback),
Packit b099d7
    XmRPointer, (XtPointer) NULL
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNarmCallback, XmCCallback, XmRCallback, sizeof(XtCallbackList),
Packit b099d7
    XtOffsetOf(struct _XmArrowButtonGadgetRec, arrowbutton.arm_callback),
Packit b099d7
    XmRPointer, (XtPointer) NULL
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNdisarmCallback, XmCCallback, XmRCallback, sizeof(XtCallbackList),
Packit b099d7
    XtOffsetOf(struct _XmArrowButtonGadgetRec, arrowbutton.disarm_callback),
Packit b099d7
    XmRPointer, (XtPointer) NULL
Packit b099d7
  },
Packit b099d7
   
Packit b099d7
  {
Packit b099d7
    XmNbackground, XmCBackground, XmRPixel, 
Packit b099d7
    sizeof(Pixel),
Packit b099d7
    XtOffsetOf(struct _XmArrowButtonGadgetRec, arrowbutton.background),
Packit b099d7
    XmRImmediate, (XtPointer) INVALID_PIXEL
Packit b099d7
  },
Packit b099d7
   
Packit b099d7
  {
Packit b099d7
    XmNforeground, XmCForeground, XmRPixel, 
Packit b099d7
    sizeof(Pixel),
Packit b099d7
    XtOffsetOf(struct _XmArrowButtonGadgetRec, arrowbutton.foreground),
Packit b099d7
    XmRImmediate, (XtPointer) INVALID_PIXEL
Packit b099d7
  },
Packit b099d7
   
Packit b099d7
  {
Packit b099d7
    XmNtopShadowColor, XmCTopShadowColor, XmRPixel, 
Packit b099d7
    sizeof(Pixel),
Packit b099d7
    XtOffsetOf(struct _XmArrowButtonGadgetRec, arrowbutton.top_shadow_color),
Packit b099d7
    XmRImmediate, (XtPointer) INVALID_PIXEL
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNtopShadowPixmap, XmCTopShadowPixmap, XmRNoScalingDynamicPixmap,
Packit b099d7
    sizeof(Pixmap),
Packit b099d7
    XtOffsetOf(struct _XmArrowButtonGadgetRec, arrowbutton.top_shadow_pixmap),
Packit b099d7
    XmRImmediate, (XtPointer) INVALID_PIXMAP
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNbottomShadowColor, XmCBottomShadowColor, XmRPixel, 
Packit b099d7
    sizeof(Pixel),
Packit b099d7
    XtOffsetOf(struct _XmArrowButtonGadgetRec, arrowbutton.bottom_shadow_color),
Packit b099d7
    XmRImmediate, (XtPointer) INVALID_PIXEL
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNbottomShadowPixmap, XmCBottomShadowPixmap, XmRNoScalingDynamicPixmap,
Packit b099d7
    sizeof(Pixmap),
Packit b099d7
    XtOffsetOf(struct _XmArrowButtonGadgetRec, arrowbutton.bottom_shadow_pixmap),
Packit b099d7
    XmRImmediate, (XtPointer) XmUNSPECIFIED_PIXMAP
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNhighlightColor, XmCHighlightColor, XmRPixel, 
Packit b099d7
    sizeof(Pixel), 
Packit b099d7
    XtOffsetOf(struct _XmArrowButtonGadgetRec, arrowbutton.highlight_color),
Packit b099d7
    XmRImmediate, (XtPointer) INVALID_PIXEL
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNhighlightPixmap, XmCHighlightPixmap, XmRNoScalingDynamicPixmap,
Packit b099d7
    sizeof(Pixmap), 
Packit b099d7
    XtOffsetOf(struct _XmArrowButtonGadgetRec, arrowbutton.highlight_pixmap),
Packit b099d7
    XmRImmediate, (XtPointer) INVALID_PIXMAP
Packit b099d7
  },
Packit b099d7
   {
Packit b099d7
     XmNdetailShadowThickness, XmCShadowThickness, XmRHorizontalDimension,
Packit b099d7
     sizeof (Dimension), 
Packit b099d7
     XtOffsetOf(XmArrowButtonGadgetRec, arrowbutton.detail_shadow_thickness),
Packit b099d7
     XmRCallProc, (XtPointer) _XmSetThickness
Packit b099d7
   }
Packit b099d7
};
Packit b099d7
Packit b099d7
static XmSyntheticResource syn_resources[] =
Packit b099d7
{
Packit b099d7
    {
Packit b099d7
        XmNdetailShadowThickness,
Packit b099d7
        sizeof(Dimension),
Packit b099d7
        XtOffsetOf(XmArrowButtonGadgetRec, arrowbutton.detail_shadow_thickness),
Packit b099d7
        XmeFromHorizontalPixels,XmeToHorizontalPixels
Packit b099d7
    }
Packit b099d7
};
Packit b099d7
Packit b099d7
Packit b099d7
/*  The Arrow class record definition  */
Packit b099d7
Packit b099d7
externaldef(xmarrowbuttongadgetclassrec) XmArrowButtonGadgetClassRec
Packit b099d7
	xmArrowButtonGadgetClassRec =
Packit b099d7
{
Packit b099d7
  { /* object fields */
Packit b099d7
    (WidgetClass) &xmGadgetClassRec,	/* superclass            */
Packit b099d7
    "XmArrowButtonGadget",		/* class_name	         */
Packit b099d7
    sizeof(XmArrowButtonGadgetRec),	/* widget_size	         */
Packit b099d7
    (XtProc)NULL,			/* class_initialize      */
Packit b099d7
    ClassPartInitialize,		/* class_part_initialize */
Packit b099d7
    FALSE,				/* class_inited          */
Packit b099d7
    Initialize,				/* initialize	         */
Packit b099d7
    (XtArgsProc)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
    XtExposeCompressMaximal,		/* compress_exposure     */
Packit b099d7
    TRUE,				/* compress_enterleave   */
Packit b099d7
    FALSE,				/* visible_interest      */
Packit b099d7
    Destroy,				/* destroy               */
Packit b099d7
    (XtWidgetProc)NULL,			/* resize                */
Packit b099d7
    Redisplay,				/* expose                */
Packit b099d7
    SetValues,				/* set_values	         */
Packit b099d7
    (XtArgsFunc)NULL,			/* set_values_hook       */
Packit b099d7
    XtInheritSetValuesAlmost,		/* set_values_almost     */
Packit b099d7
    (XtArgsProc)NULL,			/* get_values_hook       */
Packit b099d7
    NULL,				/* accept_focus          */
Packit b099d7
    XtVersion,				/* version               */
Packit b099d7
    (XtPointer)NULL,			/* callback private      */
Packit b099d7
    (String)NULL,			/* tm_table              */
Packit b099d7
    (XtGeometryHandler)NULL,		/* query_geometry        */
Packit b099d7
    NULL,				/* display_accelerator   */
Packit b099d7
    (XtPointer)NULL			/* extension             */
Packit b099d7
  },
Packit b099d7
  
Packit b099d7
  { /* XmGadget fields */
Packit b099d7
    HighlightBorder,			/* border highlight   */
Packit b099d7
    XmInheritBorderUnhighlight,		/* border_unhighlight */
Packit b099d7
    ArmAndActivate,			/* arm_and_activate   */
Packit b099d7
    InputDispatch,			/* input dispatch     */
Packit b099d7
    XmInheritVisualChange,		/* visual_change      */
Packit b099d7
    syn_resources,         		/* syn_resources */
Packit b099d7
    XtNumber(syn_resources),	        /* num_syn_resources */
Packit b099d7
    (XmCacheClassPartPtr)NULL,		/* class cache part   */
Packit b099d7
    (XtPointer)NULL			/* extension          */
Packit b099d7
  },
Packit b099d7
  
Packit b099d7
  { /* XmArrowButtonGadget fields */
Packit b099d7
    (XtPointer)NULL			/* extension	      */
Packit b099d7
  }
Packit b099d7
};
Packit b099d7
Packit b099d7
externaldef(xmarrowbuttongadgetclass) WidgetClass xmArrowButtonGadgetClass = 
Packit b099d7
   (WidgetClass) &xmArrowButtonGadgetClassRec;
Packit b099d7
Packit b099d7
Packit b099d7
/* Trait record for arrowBG */
Packit b099d7
static XmConst XmActivatableTraitRec arrowBGAT = 
Packit b099d7
{
Packit b099d7
  0,				/* version	*/
Packit b099d7
  ChangeCB			/* changeCB	*/
Packit b099d7
};
Packit b099d7
Packit b099d7
static XmConst XmCareVisualTraitRec arrowBGCVT = 
Packit b099d7
{
Packit b099d7
  0,				/* version	*/
Packit b099d7
  HandleRedraw			/* redraw	*/
Packit b099d7
};
Packit b099d7
Packit b099d7
/* Access Colors Trait record for arrow button gadget */
Packit b099d7
static XmConst XmAccessColorsTraitRec arrowBGACT = 
Packit b099d7
{
Packit b099d7
  0,				/* version	*/
Packit b099d7
  GetColors,			/* getColors	*/
Packit b099d7
  NULL				/* setColors	*/
Packit b099d7
};
Packit b099d7
 
Packit b099d7
static Pixmap
Packit b099d7
GetHighlightPixmapDefault(XmArrowButtonGadget ag)
Packit b099d7
{
Packit b099d7
  XmManagerWidget mw = (XmManagerWidget)XtParent(ag);
Packit b099d7
  Pixmap result = XmUNSPECIFIED_PIXMAP;
Packit b099d7
  
Packit b099d7
  if (ag->arrowbutton.highlight_color == ag->arrowbutton.background)
Packit b099d7
    result = XmGetPixmapByDepth(XtScreen(ag), XmS50_foreground,
Packit b099d7
				ag->arrowbutton.highlight_color,
Packit b099d7
				ag->arrowbutton.foreground,
Packit b099d7
				mw->core.depth);
Packit b099d7
Packit b099d7
  return result;
Packit b099d7
}
Packit b099d7

Packit b099d7
static Pixmap
Packit b099d7
GetTopShadowPixmapDefault(XmArrowButtonGadget ag)
Packit b099d7
{
Packit b099d7
  XmManagerWidget mw = (XmManagerWidget)XtParent(ag);
Packit b099d7
  Pixmap result = XmUNSPECIFIED_PIXMAP;
Packit b099d7
Packit b099d7
  if (ag->arrowbutton.top_shadow_color == ag->arrowbutton.background)
Packit b099d7
    result = XmGetPixmapByDepth(XtScreen(ag), XmS50_foreground,
Packit b099d7
				ag->arrowbutton.top_shadow_color,
Packit b099d7
				ag->arrowbutton.foreground,
Packit b099d7
				mw->core.depth);
Packit b099d7
Packit b099d7
  else if (DefaultDepthOfScreen(XtScreen(ag)) == 1)
Packit b099d7
    result = XmGetPixmapByDepth(XtScreen(ag), XmS50_foreground,
Packit b099d7
				ag->arrowbutton.top_shadow_color,
Packit b099d7
				ag->arrowbutton.background,
Packit b099d7
				mw->core.depth);
Packit b099d7
Packit b099d7
  return result;
Packit b099d7
}
Packit b099d7

Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  ClassPartInitialize
Packit b099d7
 *     Set up the fast subclassing for the widget
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
static void 
Packit b099d7
ClassPartInitialize(
Packit b099d7
        WidgetClass wc)
Packit b099d7
{
Packit b099d7
  _XmFastSubclassInit (wc, XmARROW_BUTTON_GADGET_BIT);
Packit b099d7
  
Packit b099d7
  /* Install the activatable trait for all subclasses */
Packit b099d7
  XmeTraitSet((XtPointer)wc, XmQTactivatable, (XtPointer)&arrowBGAT);
Packit b099d7
  
Packit b099d7
  /* Install the careParentVisual trait for all subclasses as well. */
Packit b099d7
  XmeTraitSet((XtPointer)wc, XmQTcareParentVisual, (XtPointer)&arrowBGCVT);
Packit b099d7
  
Packit b099d7
  /* Install the accessColors trait for all subclasses as well. */
Packit b099d7
  XmeTraitSet((XtPointer)wc, XmQTaccessColors, (XtPointer)&arrowBGACT);
Packit b099d7
}
Packit b099d7

Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  Initialize
Packit b099d7
 *     The main widget instance initialization routine.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
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
  XmArrowButtonGadget request = (XmArrowButtonGadget) rw;
Packit b099d7
  XmArrowButtonGadget new_w = (XmArrowButtonGadget) nw;
Packit b099d7
  
Packit b099d7
  /*
Packit b099d7
   *  Check the data put into the new widget from .Xdefaults
Packit b099d7
   *  or through the arg list.
Packit b099d7
   */
Packit b099d7
  if (!XmRepTypeValidValue(XmRID_ARROW_DIRECTION, 
Packit b099d7
			   new_w->arrowbutton.direction, (Widget) new_w))
Packit b099d7
    {
Packit b099d7
      new_w->arrowbutton.direction = XmARROW_UP;
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  
Packit b099d7
  /*  Set up a geometry for the widget if it is currently 0.  */
Packit b099d7
  if (request->rectangle.width == 0) 
Packit b099d7
    new_w->rectangle.width += 15;
Packit b099d7
  if (request->rectangle.height == 0)
Packit b099d7
    new_w->rectangle.height += 15;
Packit b099d7
  
Packit b099d7
  /*  Set the internal arrow variables */
Packit b099d7
  new_w->arrowbutton.timer = 0;
Packit b099d7
  new_w->arrowbutton.selected = False;
Packit b099d7
  
Packit b099d7
  /*  Get the drawing graphics contexts.  */
Packit b099d7
  DealWithColors(new_w);
Packit b099d7
  DealWithPixmaps(new_w);
Packit b099d7
  
Packit b099d7
  GetArrowGC (new_w);
Packit b099d7
  GetBackgroundGC (new_w);
Packit b099d7
  new_w->arrowbutton.highlight_GC =
Packit b099d7
    _XmGetPixmapBasedGC (XtParent(nw), 
Packit b099d7
			 new_w->arrowbutton.highlight_color,
Packit b099d7
			 new_w->arrowbutton.background,
Packit b099d7
			 new_w->arrowbutton.highlight_pixmap);
Packit b099d7
  
Packit b099d7
  new_w->arrowbutton.top_shadow_GC =
Packit b099d7
    _XmGetPixmapBasedGC (XtParent(nw), 
Packit b099d7
			 new_w->arrowbutton.top_shadow_color,
Packit b099d7
			 new_w->arrowbutton.background,
Packit b099d7
			 new_w->arrowbutton.top_shadow_pixmap);
Packit b099d7
  
Packit b099d7
  new_w->arrowbutton.bottom_shadow_GC =
Packit b099d7
    _XmGetPixmapBasedGC (XtParent(nw), 
Packit b099d7
			 new_w->arrowbutton.bottom_shadow_color,
Packit b099d7
			 new_w->arrowbutton.background,
Packit b099d7
			 new_w->arrowbutton.bottom_shadow_pixmap);
Packit b099d7
  
Packit b099d7
  /*  Initialize the interesting input types.  */
Packit b099d7
  new_w->gadget.event_mask =  XmARM_EVENT | XmACTIVATE_EVENT | XmHELP_EVENT |
Packit b099d7
    XmFOCUS_IN_EVENT | XmFOCUS_OUT_EVENT | XmENTER_EVENT | XmLEAVE_EVENT
Packit b099d7
      | XmMULTI_ARM_EVENT|  XmMULTI_ACTIVATE_EVENT;
Packit b099d7
}
Packit b099d7

Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  GetBackgroundGC
Packit b099d7
 *     Get the graphics context used for drawing the background.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
static void 
Packit b099d7
GetBackgroundGC(
Packit b099d7
        XmArrowButtonGadget ag)
Packit b099d7
{
Packit b099d7
  XGCValues values;
Packit b099d7
  XtGCMask  valueMask;
Packit b099d7
  XmManagerWidget mw = (XmManagerWidget) XtParent(ag);
Packit b099d7
  
Packit b099d7
  ag->arrowbutton.fill_bg_box = 
Packit b099d7
    ((mw->core.background_pixel != ag->arrowbutton.background) &&
Packit b099d7
     (mw->core.background_pixmap == XmUNSPECIFIED_PIXMAP));
Packit b099d7
  
Packit b099d7
  if (!ag->arrowbutton.fill_bg_box)
Packit b099d7
    return;
Packit b099d7
  
Packit b099d7
  valueMask = GCForeground | GCBackground;
Packit b099d7
  values.foreground = ag->arrowbutton.background;
Packit b099d7
  values.background = ag->arrowbutton.foreground; 
Packit b099d7
  
Packit b099d7
  ag->arrowbutton.background_GC = XtGetGC ((Widget) mw, valueMask, &values);
Packit b099d7
}
Packit b099d7

Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  GetArrowGC
Packit b099d7
 *     Get the graphics context used for drawing the arrowbutton.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
static void 
Packit b099d7
GetArrowGC(
Packit b099d7
        XmArrowButtonGadget ag)
Packit b099d7
{
Packit b099d7
  XGCValues values;
Packit b099d7
  XtGCMask  valueMask, unusedMask;
Packit b099d7
  XmManagerWidget mw = (XmManagerWidget) XtParent(ag);
Packit b099d7
  
Packit b099d7
  valueMask = GCForeground | GCBackground | GCGraphicsExposures;
Packit b099d7
  unusedMask = GCClipXOrigin | GCClipYOrigin | GCFont;
Packit b099d7
Packit b099d7
  values.foreground = ag->arrowbutton.foreground;
Packit b099d7
  values.background = ag->arrowbutton.background;
Packit b099d7
  values.graphics_exposures = False;
Packit b099d7
  
Packit b099d7
  ag->arrowbutton.arrow_GC = XtAllocateGC ((Widget) mw, 0, valueMask, &values,
Packit b099d7
					   GCClipMask, unusedMask);
Packit b099d7
  
Packit b099d7
  valueMask |= GCFillStyle | GCStipple;
Packit b099d7
  values.fill_style = FillOpaqueStippled;
Packit b099d7
  values.stipple = _XmGetInsensitiveStippleBitmap((Widget) ag);
Packit b099d7
  
Packit b099d7
  ag->arrowbutton.insensitive_GC = XtAllocateGC((Widget) mw, 0, valueMask, 
Packit b099d7
						&values, GCClipMask, 
Packit b099d7
						unusedMask);
Packit b099d7
}
Packit b099d7

Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  Redisplay
Packit b099d7
 *     General redisplay function called on exposure events.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
Redisplay(
Packit b099d7
        Widget w,
Packit b099d7
        XEvent *event,
Packit b099d7
        Region region)
Packit b099d7
{
Packit b099d7
  XmArrowButtonGadget aw = (XmArrowButtonGadget) w;
Packit b099d7
  int iwidth, iheight;
Packit b099d7
  int background_x_offset, background_y_offset, background_width,
Packit b099d7
  background_height;
Packit b099d7
  
Packit b099d7
  iwidth = (int) aw->rectangle.width - 2 * aw->gadget.highlight_thickness;
Packit b099d7
  iheight = (int) aw->rectangle.height - 2 * aw->gadget.highlight_thickness;
Packit b099d7
  
Packit b099d7
  background_x_offset = (aw->rectangle.x +
Packit b099d7
			 aw->gadget.highlight_thickness +
Packit b099d7
			 aw->gadget.shadow_thickness);
Packit b099d7
  
Packit b099d7
  background_y_offset = (aw->rectangle.y +
Packit b099d7
			 aw->gadget.highlight_thickness +
Packit b099d7
			 aw->gadget.shadow_thickness);
Packit b099d7
  
Packit b099d7
  background_height = iheight - 2 * aw->gadget.shadow_thickness;
Packit b099d7
  background_width = iwidth - 2 * aw->gadget.shadow_thickness;
Packit b099d7
  
Packit b099d7
  if (aw->arrowbutton.fill_bg_box)
Packit b099d7
    XFillRectangle(XtDisplay(aw),
Packit b099d7
		   XtWindow((Widget) aw),
Packit b099d7
		   aw->arrowbutton.background_GC,
Packit b099d7
		   background_x_offset,
Packit b099d7
		   background_y_offset,
Packit b099d7
		   background_width,
Packit b099d7
		   background_height);
Packit b099d7
  
Packit b099d7
  /*  Draw the arrow  */
Packit b099d7
  if ((iwidth > 0) && (iheight > 0))
Packit b099d7
    {
Packit b099d7
      if (aw->gadget.shadow_thickness > 0)
Packit b099d7
	XmeDrawShadows (XtDisplay (aw), XtWindow (aw),
Packit b099d7
			aw->arrowbutton.top_shadow_GC,
Packit b099d7
			aw->arrowbutton.bottom_shadow_GC,
Packit b099d7
			aw->rectangle.x + aw->gadget.highlight_thickness,
Packit b099d7
			aw->rectangle.y + aw->gadget.highlight_thickness,
Packit b099d7
			aw->rectangle.width - 2 *
Packit b099d7
			aw->gadget.highlight_thickness,
Packit b099d7
			aw->rectangle.height-2 *
Packit b099d7
			aw->gadget.highlight_thickness,
Packit b099d7
			aw->gadget.shadow_thickness, XmSHADOW_OUT);
Packit b099d7
      
Packit b099d7
      if (aw->arrowbutton.selected && XtIsSensitive(w))
Packit b099d7
	DrawArrowG(aw, aw->arrowbutton.bottom_shadow_GC,
Packit b099d7
		   aw->arrowbutton.top_shadow_GC, aw->arrowbutton.arrow_GC);
Packit b099d7
      else
Packit b099d7
	DrawArrowG(aw, aw->arrowbutton.top_shadow_GC,
Packit b099d7
		   aw->arrowbutton.bottom_shadow_GC,
Packit b099d7
		   (XtIsSensitive(w) ? 
Packit b099d7
		    aw->arrowbutton.arrow_GC : aw->arrowbutton.insensitive_GC));
Packit b099d7
    }
Packit b099d7
Packit b099d7
  if (aw->gadget.highlighted)
Packit b099d7
    {   
Packit b099d7
      (*(xmArrowButtonGadgetClassRec.gadget_class.border_highlight)) (w);
Packit b099d7
    } 
Packit b099d7
}
Packit b099d7

Packit b099d7
 /*
Packit b099d7
  *
Packit b099d7
  * DealWithColors
Packit b099d7
  *
Packit b099d7
  * Deal with compatibility.  
Packit b099d7
  *  If any resource is set initialize like a widget otherwise get
Packit b099d7
  * everything from the parent.
Packit b099d7
  * 
Packit b099d7
  *
Packit b099d7
  */
Packit b099d7
static void
Packit b099d7
DealWithColors(
Packit b099d7
        XmArrowButtonGadget ag)
Packit b099d7
{
Packit b099d7
  XmManagerWidget mw = (XmManagerWidget) XtParent(ag);
Packit b099d7
  
Packit b099d7
  /*
Packit b099d7
   * If the gadget color is set to the tag value or it is the
Packit b099d7
   * same as the manager color; bc mode is enabled otherwise
Packit b099d7
   * initialize like a widget.
Packit b099d7
   */
Packit b099d7
  if ((ag->arrowbutton.background == INVALID_PIXEL ||
Packit b099d7
       ag->arrowbutton.background == mw->core.background_pixel) &&
Packit b099d7
      (ag->arrowbutton.foreground == INVALID_PIXEL ||
Packit b099d7
       ag->arrowbutton.foreground == mw->manager.foreground) &&
Packit b099d7
      (ag->arrowbutton.top_shadow_color == INVALID_PIXEL ||
Packit b099d7
       ag->arrowbutton.top_shadow_color == mw->manager.top_shadow_color) &&
Packit b099d7
      (ag->arrowbutton.bottom_shadow_color == INVALID_PIXEL ||
Packit b099d7
       ag->arrowbutton.bottom_shadow_color == mw->manager.bottom_shadow_color) &&
Packit b099d7
      (ag->arrowbutton.highlight_color == INVALID_PIXEL ||
Packit b099d7
       ag->arrowbutton.highlight_color == mw->manager.highlight_color))
Packit b099d7
    {
Packit b099d7
      ag->arrowbutton.background = mw->core.background_pixel;
Packit b099d7
      ag->arrowbutton.foreground = mw->manager.foreground;
Packit b099d7
      ag->arrowbutton.top_shadow_color = mw->manager.top_shadow_color;
Packit b099d7
      ag->arrowbutton.bottom_shadow_color = mw->manager.bottom_shadow_color;
Packit b099d7
      ag->arrowbutton.highlight_color = mw->manager.highlight_color;
Packit b099d7
    }
Packit b099d7
  else
Packit b099d7
    {
Packit b099d7
      InitNewColorBehavior(ag);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
 
Packit b099d7
static void
Packit b099d7
InitNewColorBehavior(
Packit b099d7
        XmArrowButtonGadget ag)
Packit b099d7
{
Packit b099d7
  XrmValue value;
Packit b099d7
  
Packit b099d7
  value.size = sizeof(Pixel);
Packit b099d7
  
Packit b099d7
  if (ag->arrowbutton.background == INVALID_PIXEL)
Packit b099d7
    {
Packit b099d7
      _XmBackgroundColorDefault ((Widget)ag,
Packit b099d7
				 XtOffsetOf(struct _XmArrowButtonGadgetRec, 
Packit b099d7
					    arrowbutton.background),
Packit b099d7
				 &value);
Packit b099d7
      memcpy((char*) &ag->arrowbutton.background, value.addr, value.size);
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if (ag->arrowbutton.foreground == INVALID_PIXEL)
Packit b099d7
    {
Packit b099d7
      _XmForegroundColorDefault ((Widget)ag,
Packit b099d7
				 XtOffsetOf(struct _XmArrowButtonGadgetRec, 
Packit b099d7
					    arrowbutton.foreground),
Packit b099d7
				 &value);
Packit b099d7
      memcpy((char*) &ag->arrowbutton.foreground, value.addr, value.size);
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if (ag->arrowbutton.top_shadow_color == INVALID_PIXEL)
Packit b099d7
    {
Packit b099d7
      _XmTopShadowColorDefault ((Widget)ag,
Packit b099d7
				XtOffsetOf(struct _XmArrowButtonGadgetRec, 
Packit b099d7
					   arrowbutton.top_shadow_color),
Packit b099d7
				&value);
Packit b099d7
      memcpy((char*)&ag->arrowbutton.top_shadow_color, value.addr,value.size);
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if (ag->arrowbutton.bottom_shadow_color == INVALID_PIXEL)
Packit b099d7
    {
Packit b099d7
      _XmBottomShadowColorDefault((Widget)ag,
Packit b099d7
				  XtOffsetOf(struct _XmArrowButtonGadgetRec,
Packit b099d7
					     arrowbutton.bottom_shadow_color),
Packit b099d7
				  &value);
Packit b099d7
      memcpy((char*)&ag->arrowbutton.bottom_shadow_color, value.addr, value.size);
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if (ag->arrowbutton.highlight_color == INVALID_PIXEL)
Packit b099d7
    {
Packit b099d7
      _XmHighlightColorDefault((Widget)ag,
Packit b099d7
			       XtOffsetOf(struct _XmArrowButtonGadgetRec,
Packit b099d7
					  arrowbutton.highlight_color),
Packit b099d7
			       &value);
Packit b099d7
      memcpy((char*) &ag->arrowbutton.highlight_color, value.addr,value.size);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7

Packit b099d7
 /*
Packit b099d7
  *
Packit b099d7
  * DealWithPixmaps
Packit b099d7
  *
Packit b099d7
  * Deal with compatibility.  
Packit b099d7
  *  If any resource is set initialize like a widget otherwise get
Packit b099d7
  * everything from the parent.
Packit b099d7
  * 
Packit b099d7
  */
Packit b099d7
Packit b099d7
static void
Packit b099d7
DealWithPixmaps(
Packit b099d7
        XmArrowButtonGadget ag)
Packit b099d7
{
Packit b099d7
  XmManagerWidget mw = (XmManagerWidget) XtParent(ag);
Packit b099d7
  
Packit b099d7
  if ((ag->arrowbutton.top_shadow_pixmap == INVALID_PIXMAP ||
Packit b099d7
       ag->arrowbutton.top_shadow_pixmap == mw->manager.top_shadow_pixmap) && 
Packit b099d7
      (ag->arrowbutton.highlight_pixmap == INVALID_PIXMAP  ||
Packit b099d7
       ag->arrowbutton.highlight_pixmap == mw->manager.highlight_pixmap))
Packit b099d7
    {
Packit b099d7
      ag->arrowbutton.top_shadow_pixmap = mw->manager.top_shadow_pixmap;
Packit b099d7
      ag->arrowbutton.highlight_pixmap = mw->manager.highlight_pixmap;
Packit b099d7
    }
Packit b099d7
  else
Packit b099d7
    {
Packit b099d7
      InitNewPixmapBehavior(ag);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
    
Packit b099d7
/*
Packit b099d7
 * InitNewPixmapBehavior
Packit b099d7
 *
Packit b099d7
 * Initialize colors like a widget.
Packit b099d7
 */
Packit b099d7
 
Packit b099d7
static void
Packit b099d7
InitNewPixmapBehavior(
Packit b099d7
        XmArrowButtonGadget ag)
Packit b099d7
{
Packit b099d7
  if (ag->arrowbutton.top_shadow_pixmap == INVALID_PIXMAP)
Packit b099d7
    {
Packit b099d7
      ag->arrowbutton.top_shadow_pixmap = GetTopShadowPixmapDefault(ag);
Packit b099d7
    }
Packit b099d7
Packit b099d7
  if (ag->arrowbutton.highlight_pixmap == INVALID_PIXMAP)
Packit b099d7
    {
Packit b099d7
      ag->arrowbutton.highlight_pixmap = GetHighlightPixmapDefault(ag);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7

Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  Destroy
Packit b099d7
 *	Clean up allocated resources when the widget is destroyed.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
static void 
Packit b099d7
Destroy(
Packit b099d7
        Widget w)
Packit b099d7
{
Packit b099d7
  XmArrowButtonGadget aw = (XmArrowButtonGadget) w;
Packit b099d7
  XmManagerWidget mw = (XmManagerWidget) XtParent(aw);
Packit b099d7
  
Packit b099d7
  if (aw->arrowbutton.timer)
Packit b099d7
    XtRemoveTimeOut (aw->arrowbutton.timer);
Packit b099d7
  
Packit b099d7
  XtReleaseGC ((Widget) mw, aw->arrowbutton.arrow_GC);
Packit b099d7
  XtReleaseGC ((Widget) mw, aw->arrowbutton.insensitive_GC);
Packit b099d7
  if (aw->arrowbutton.fill_bg_box)
Packit b099d7
    XtReleaseGC ((Widget) mw, aw->arrowbutton.background_GC);
Packit b099d7
  XtReleaseGC ((Widget) mw, aw->arrowbutton.top_shadow_GC);
Packit b099d7
  XtReleaseGC ((Widget) mw, aw->arrowbutton.bottom_shadow_GC);
Packit b099d7
  XtReleaseGC ((Widget) mw, aw->arrowbutton.highlight_GC);
Packit b099d7
}
Packit b099d7

Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  SetValues
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static Boolean 
Packit b099d7
SetValues(
Packit b099d7
        Widget cw,
Packit b099d7
        Widget rw,		/* unused */
Packit b099d7
        Widget nw,
Packit b099d7
        ArgList args,		/* unused */
Packit b099d7
        Cardinal *num_args)	/* unused */
Packit b099d7
{
Packit b099d7
  XmArrowButtonGadget current = (XmArrowButtonGadget) cw;
Packit b099d7
  XmArrowButtonGadget new_w = (XmArrowButtonGadget) nw;
Packit b099d7
  
Packit b099d7
  Boolean returnFlag = FALSE;
Packit b099d7
  
Packit b099d7
  
Packit b099d7
  /*  Check the data put into the new widget.  */
Packit b099d7
  
Packit b099d7
  if (!XmRepTypeValidValue(XmRID_ARROW_DIRECTION, 
Packit b099d7
			   new_w->arrowbutton.direction, (Widget) new_w))
Packit b099d7
    {
Packit b099d7
      new_w->arrowbutton.direction = current->arrowbutton.direction;
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  
Packit b099d7
  /*  ReInitialize the interesting input types.  */
Packit b099d7
  
Packit b099d7
  new_w->gadget.event_mask |=  XmARM_EVENT | XmACTIVATE_EVENT | XmHELP_EVENT |
Packit b099d7
    XmFOCUS_IN_EVENT | XmFOCUS_OUT_EVENT | XmENTER_EVENT | XmLEAVE_EVENT
Packit b099d7
      | XmMULTI_ARM_EVENT | XmMULTI_ACTIVATE_EVENT;
Packit b099d7
  
Packit b099d7
  if (new_w->arrowbutton.direction != current->arrowbutton.direction ||
Packit b099d7
      XtIsSensitive(nw) != XtIsSensitive(cw) ||
Packit b099d7
      new_w->gadget.highlight_thickness !=
Packit b099d7
      current->gadget.highlight_thickness ||
Packit b099d7
      new_w->gadget.shadow_thickness != current->gadget.shadow_thickness)
Packit b099d7
    {
Packit b099d7
      returnFlag = TRUE;
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if (new_w->arrowbutton.foreground != current->arrowbutton.foreground ||
Packit b099d7
      new_w->arrowbutton.background != current->arrowbutton.background)
Packit b099d7
    {
Packit b099d7
      XtReleaseGC (XtParent(current), new_w->arrowbutton.arrow_GC);
Packit b099d7
      XtReleaseGC (XtParent(current), new_w->arrowbutton.insensitive_GC);
Packit b099d7
      if (new_w->arrowbutton.fill_bg_box)
Packit b099d7
	XtReleaseGC (XtParent(current), new_w->arrowbutton.background_GC);
Packit b099d7
      GetArrowGC (new_w);
Packit b099d7
      GetBackgroundGC (new_w);
Packit b099d7
      return (True);
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if (current->arrowbutton.top_shadow_color != 
Packit b099d7
      new_w->arrowbutton.top_shadow_color ||
Packit b099d7
      current->arrowbutton.top_shadow_pixmap != 
Packit b099d7
      new_w->arrowbutton.top_shadow_pixmap)
Packit b099d7
    {
Packit b099d7
      XtReleaseGC ((Widget) new_w, new_w->arrowbutton.top_shadow_GC);
Packit b099d7
      new_w->arrowbutton.top_shadow_GC =
Packit b099d7
	_XmGetPixmapBasedGC (XtParent(nw), 
Packit b099d7
			     new_w->arrowbutton.top_shadow_color,
Packit b099d7
			     new_w->arrowbutton.background,
Packit b099d7
			     new_w->arrowbutton.top_shadow_pixmap);
Packit b099d7
      returnFlag = True;
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  
Packit b099d7
  if (current->arrowbutton.bottom_shadow_color != 
Packit b099d7
      new_w->arrowbutton.bottom_shadow_color ||
Packit b099d7
      current->arrowbutton.bottom_shadow_pixmap != 
Packit b099d7
      new_w->arrowbutton.bottom_shadow_pixmap)
Packit b099d7
    {
Packit b099d7
      XtReleaseGC ((Widget) new_w, new_w->arrowbutton.bottom_shadow_GC);
Packit b099d7
      new_w->arrowbutton.bottom_shadow_GC =
Packit b099d7
	_XmGetPixmapBasedGC (XtParent(nw), 
Packit b099d7
			     new_w->arrowbutton.bottom_shadow_color,
Packit b099d7
			     new_w->arrowbutton.background,
Packit b099d7
			     new_w->arrowbutton.bottom_shadow_pixmap);
Packit b099d7
      returnFlag = True;
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if (current->arrowbutton.highlight_color !=
Packit b099d7
      new_w->arrowbutton.highlight_color ||
Packit b099d7
      current->arrowbutton.highlight_pixmap !=
Packit b099d7
      new_w->arrowbutton.highlight_pixmap)
Packit b099d7
    {
Packit b099d7
      XtReleaseGC ((Widget) new_w, new_w->arrowbutton.highlight_GC);
Packit b099d7
      new_w->arrowbutton.highlight_GC =
Packit b099d7
	_XmGetPixmapBasedGC (XtParent(nw), 
Packit b099d7
			     new_w->arrowbutton.highlight_color,
Packit b099d7
			     new_w->arrowbutton.background,
Packit b099d7
			     new_w->arrowbutton.highlight_pixmap);
Packit b099d7
      
Packit b099d7
      returnFlag = True;
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  
Packit b099d7
  return (returnFlag);
Packit b099d7
}
Packit b099d7

Packit b099d7
static void 
Packit b099d7
HighlightBorder(
Packit b099d7
        Widget w)
Packit b099d7
{   
Packit b099d7
  XmArrowButtonGadget ag = (XmArrowButtonGadget) w;
Packit b099d7
Packit b099d7
  if (ag->rectangle.width == 0 || 
Packit b099d7
      ag->rectangle.height == 0 ||
Packit b099d7
      ag->gadget.highlight_thickness == 0)
Packit b099d7
    {   
Packit b099d7
      return;
Packit b099d7
    } 
Packit b099d7
Packit b099d7
  ag->gadget.highlighted = True;
Packit b099d7
  ag->gadget.highlight_drawn = True;
Packit b099d7
Packit b099d7
  /* CR 7330: Use XmeDrawHighlight, not _XmDrawHighlight. */
Packit b099d7
  XmeDrawHighlight(XtDisplay((Widget) ag), XtWindow((Widget) ag), 
Packit b099d7
		   ag->arrowbutton.highlight_GC,
Packit b099d7
		   ag->rectangle.x, ag->rectangle.y, 
Packit b099d7
		   ag->rectangle.width, ag->rectangle.height,
Packit b099d7
		   ag->gadget.highlight_thickness);
Packit b099d7
}
Packit b099d7

Packit b099d7
static Boolean 
Packit b099d7
HandleRedraw (
Packit b099d7
	Widget kid, 	       
Packit b099d7
	Widget cur_parent,
Packit b099d7
	Widget new_parent,
Packit b099d7
	Mask visual_flag)
Packit b099d7
{
Packit b099d7
  XmArrowButtonGadget ag = (XmArrowButtonGadget) kid;
Packit b099d7
  XmManagerWidget mw = (XmManagerWidget) new_parent;
Packit b099d7
  XmManagerWidget curmw = (XmManagerWidget) cur_parent;
Packit b099d7
  Boolean redraw, do_bg, do_arrow, do_highlight, do_top, do_bot;
Packit b099d7
  
Packit b099d7
  redraw = do_bg = do_arrow = do_highlight = do_top = do_bot = False;
Packit b099d7
  
Packit b099d7
  if ((visual_flag & VisualBackgroundPixel) &&
Packit b099d7
      (ag->arrowbutton.background == curmw->core.background_pixel))
Packit b099d7
    
Packit b099d7
    {
Packit b099d7
      redraw = do_bg = do_arrow = do_highlight = do_top = do_bot = True;
Packit b099d7
      ag->arrowbutton.background = mw->core.background_pixel;
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if ((visual_flag & VisualForeground) &&
Packit b099d7
      (ag->arrowbutton.foreground == curmw->manager.foreground))
Packit b099d7
    {
Packit b099d7
      redraw = do_arrow = True;
Packit b099d7
      ag->arrowbutton.foreground = mw->manager.foreground;
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if (visual_flag & VisualBackgroundPixmap)	
Packit b099d7
    {
Packit b099d7
      redraw = do_bg = True;
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if (visual_flag & (VisualTopShadowColor | VisualTopShadowPixmap))
Packit b099d7
    {
Packit b099d7
      redraw = do_top = True;
Packit b099d7
      
Packit b099d7
      if (ag->arrowbutton.top_shadow_color == curmw->manager.top_shadow_color)
Packit b099d7
	ag->arrowbutton.top_shadow_color = mw->manager.top_shadow_color;
Packit b099d7
      
Packit b099d7
      if ((ag->arrowbutton.top_shadow_pixmap == 
Packit b099d7
	   curmw->manager.top_shadow_pixmap) &&
Packit b099d7
	  (ag->arrowbutton.top_shadow_pixmap != XmUNSPECIFIED_PIXMAP || 
Packit b099d7
	   ag->arrowbutton.top_shadow_color == curmw->manager.top_shadow_color))
Packit b099d7
	ag->arrowbutton.top_shadow_pixmap = mw->manager.top_shadow_pixmap;
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if (visual_flag & (VisualBottomShadowColor | VisualBottomShadowPixmap))
Packit b099d7
    {
Packit b099d7
      redraw = do_bot = True;
Packit b099d7
      
Packit b099d7
      if (ag->arrowbutton.bottom_shadow_color ==
Packit b099d7
	  curmw->manager.bottom_shadow_color)
Packit b099d7
	ag->arrowbutton.bottom_shadow_color = mw->manager.bottom_shadow_color;
Packit b099d7
      
Packit b099d7
      if ((ag->arrowbutton.bottom_shadow_pixmap == 
Packit b099d7
	   curmw->manager.bottom_shadow_pixmap) && 
Packit b099d7
	  (ag->arrowbutton.bottom_shadow_pixmap != XmUNSPECIFIED_PIXMAP ||
Packit b099d7
	   ag->arrowbutton.bottom_shadow_color == curmw->manager.bottom_shadow_color))
Packit b099d7
	ag->arrowbutton.bottom_shadow_pixmap = mw->manager.bottom_shadow_pixmap;
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if (visual_flag & (VisualHighlightColor | VisualHighlightPixmap))
Packit b099d7
    {
Packit b099d7
      redraw = do_highlight = True;
Packit b099d7
      
Packit b099d7
      if (ag->arrowbutton.highlight_color == curmw->manager.highlight_color)
Packit b099d7
	ag->arrowbutton.highlight_color = mw->manager.highlight_color;
Packit b099d7
      
Packit b099d7
      if (ag->arrowbutton.highlight_pixmap == curmw->manager.highlight_pixmap &&
Packit b099d7
	  (ag->arrowbutton.highlight_pixmap != XmUNSPECIFIED_PIXMAP ||
Packit b099d7
	   ag->arrowbutton.highlight_color != curmw->manager.highlight_color))
Packit b099d7
	ag->arrowbutton.highlight_pixmap = mw->manager.highlight_pixmap;
Packit b099d7
      
Packit b099d7
      ag->arrowbutton.highlight_GC =
Packit b099d7
	_XmGetPixmapBasedGC (XtParent(ag), 
Packit b099d7
			     ag->arrowbutton.highlight_color,
Packit b099d7
			     ag->arrowbutton.background,
Packit b099d7
			     ag->arrowbutton.highlight_pixmap);
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if (do_bg)
Packit b099d7
    {
Packit b099d7
      if (ag->arrowbutton.fill_bg_box)
Packit b099d7
	XtReleaseGC ((Widget)mw, ag->arrowbutton.background_GC);
Packit b099d7
      GetBackgroundGC (ag);
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if (do_arrow)
Packit b099d7
    {
Packit b099d7
      XtReleaseGC ((Widget)mw, ag->arrowbutton.arrow_GC);
Packit b099d7
      XtReleaseGC ((Widget)mw, ag->arrowbutton.insensitive_GC);
Packit b099d7
      GetArrowGC (ag);
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if (do_highlight)
Packit b099d7
    {
Packit b099d7
      XtReleaseGC ((Widget)mw, ag->arrowbutton.highlight_GC);
Packit b099d7
      ag->arrowbutton.highlight_GC =
Packit b099d7
	_XmGetPixmapBasedGC (XtParent(ag), 
Packit b099d7
			     ag->arrowbutton.highlight_color,
Packit b099d7
			     ag->arrowbutton.background,
Packit b099d7
			     ag->arrowbutton.highlight_pixmap);
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if (do_top)
Packit b099d7
    {
Packit b099d7
      XtReleaseGC ((Widget)mw, ag->arrowbutton.top_shadow_GC);
Packit b099d7
      ag->arrowbutton.top_shadow_GC =
Packit b099d7
	_XmGetPixmapBasedGC (XtParent(ag), 
Packit b099d7
			     ag->arrowbutton.top_shadow_color,
Packit b099d7
			     ag->arrowbutton.background,
Packit b099d7
			     ag->arrowbutton.top_shadow_pixmap);
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if (do_bot)
Packit b099d7
    {
Packit b099d7
      XtReleaseGC ((Widget)mw, ag->arrowbutton.bottom_shadow_GC);
Packit b099d7
      ag->arrowbutton.bottom_shadow_GC =
Packit b099d7
	_XmGetPixmapBasedGC (XtParent(ag), 
Packit b099d7
			     ag->arrowbutton.bottom_shadow_color,
Packit b099d7
			     ag->arrowbutton.background,
Packit b099d7
			     ag->arrowbutton.bottom_shadow_pixmap);
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  return redraw;
Packit b099d7
}
Packit b099d7

Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  InputDispatch
Packit b099d7
 *     This function catches input sent by a manager and dispatches it
Packit b099d7
 *     to the individual routines.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
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
  XmArrowButtonGadget ag = (XmArrowButtonGadget) wid;
Packit b099d7
  
Packit b099d7
  if ((event_mask & XmARM_EVENT) || 
Packit b099d7
      ((ag->arrowbutton.multiClick == XmMULTICLICK_KEEP) &&
Packit b099d7
       (event_mask & XmMULTI_ARM_EVENT)))
Packit b099d7
    Arm (ag, event);
Packit b099d7
Packit b099d7
  else if (event_mask & XmACTIVATE_EVENT)
Packit b099d7
    { 
Packit b099d7
      ag->arrowbutton.click_count = 1;  
Packit b099d7
      ActivateCommonG (ag, event, event_mask);
Packit b099d7
    }
Packit b099d7
Packit b099d7
  else if (event_mask & XmMULTI_ACTIVATE_EVENT)
Packit b099d7
    { 
Packit b099d7
      /* if XmNMultiClick resource is set to DISCARD - do nothing
Packit b099d7
       * else call ActivateCommon() and increment clickCount;
Packit b099d7
       */
Packit b099d7
      if (ag->arrowbutton.multiClick == XmMULTICLICK_KEEP)
Packit b099d7
	{  
Packit b099d7
	  ag->arrowbutton.click_count++;
Packit b099d7
	  ActivateCommonG (ag, event, event_mask);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  else if (event_mask & XmHELP_EVENT) 
Packit b099d7
    Help (ag, event);
Packit b099d7
Packit b099d7
  else if (event_mask & XmENTER_EVENT)
Packit b099d7
    Enter (ag, event);
Packit b099d7
Packit b099d7
  else if (event_mask & XmLEAVE_EVENT)
Packit b099d7
    Leave (ag, event);
Packit b099d7
Packit b099d7
  else if (event_mask & XmFOCUS_IN_EVENT) 
Packit b099d7
    _XmFocusInGadget ((Widget) ag, event, NULL, NULL);
Packit b099d7
Packit b099d7
  else if (event_mask & XmFOCUS_OUT_EVENT) 
Packit b099d7
    _XmFocusOutGadget ((Widget)ag, event, NULL, NULL);
Packit b099d7
}
Packit b099d7

Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  Arm
Packit b099d7
 *     This function processes button 1 down occuring on the arrowbutton.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
static void 
Packit b099d7
Arm(
Packit b099d7
        XmArrowButtonGadget aw,
Packit b099d7
        XEvent *event)
Packit b099d7
{
Packit b099d7
  XmArrowButtonCallbackStruct call_value;
Packit b099d7
  
Packit b099d7
  aw->arrowbutton.selected = True;
Packit b099d7
  
Packit b099d7
  DrawArrowG(aw, aw->arrowbutton.bottom_shadow_GC,
Packit b099d7
	     aw->arrowbutton.top_shadow_GC, NULL);
Packit b099d7
  
Packit b099d7
  if (aw->arrowbutton.arm_callback)
Packit b099d7
    {
Packit b099d7
      XFlush(XtDisplay(aw));
Packit b099d7
      
Packit b099d7
      call_value.reason = XmCR_ARM;
Packit b099d7
      call_value.event = event;
Packit b099d7
      XtCallCallbackList ((Widget) aw, aw->arrowbutton.arm_callback,
Packit b099d7
			  &call_value);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7

Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  Activate
Packit b099d7
 *     This function processes button 1 up occuring on the arrowbutton.
Packit b099d7
 *     If the button 1 up occurred inside the button the activate
Packit b099d7
 *     callbacks are called.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
/*ARGSUSED*/
Packit b099d7
Packit b099d7
static void 
Packit b099d7
Activate(
Packit b099d7
        Widget wid,
Packit b099d7
        XEvent *event,
Packit b099d7
        String *params,		/* unused */
Packit b099d7
        Cardinal *num_params)	/* unused */
Packit b099d7
{
Packit b099d7
  XmArrowButtonGadget aw = (XmArrowButtonGadget) wid;
Packit b099d7
  XButtonPressedEvent *buttonEvent = (XButtonPressedEvent *) event;
Packit b099d7
  
Packit b099d7
  XmPushButtonCallbackStruct call_value;
Packit b099d7
  
Packit b099d7
  aw->arrowbutton.selected = False;
Packit b099d7
  
Packit b099d7
  DrawArrowG(aw, aw->arrowbutton.top_shadow_GC, 
Packit b099d7
	     aw->arrowbutton.bottom_shadow_GC, NULL);
Packit b099d7
  
Packit b099d7
  /* CR 9181: Consider clipping when testing visibility. */
Packit b099d7
  if ((buttonEvent->type == ButtonPress || 
Packit b099d7
       buttonEvent->type == ButtonRelease) &&
Packit b099d7
      _XmGetPointVisibility(wid, buttonEvent->x_root, buttonEvent->y_root) &&
Packit b099d7
      (aw->arrowbutton.activate_callback))
Packit b099d7
    {
Packit b099d7
      XFlush(XtDisplay(aw));
Packit b099d7
      
Packit b099d7
      call_value.reason = XmCR_ACTIVATE;
Packit b099d7
      call_value.event = (XEvent *) buttonEvent;
Packit b099d7
      call_value.click_count = aw->arrowbutton.click_count;
Packit b099d7
      XtCallCallbackList ((Widget) aw, 
Packit b099d7
			  aw->arrowbutton.activate_callback, &call_value);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7

Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *     ArmAndActivate
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
ArmAndActivate(
Packit b099d7
        Widget w,
Packit b099d7
        XEvent *event,
Packit b099d7
        String *params,		/* unused */
Packit b099d7
        Cardinal *num_params)	/* unused */
Packit b099d7
{
Packit b099d7
  XmArrowButtonGadget ab = (XmArrowButtonGadget) w;
Packit b099d7
  XmPushButtonCallbackStruct call_value;
Packit b099d7
  XtExposeProc expose;
Packit b099d7
  
Packit b099d7
  ab->arrowbutton.selected = TRUE;
Packit b099d7
  ab->arrowbutton.click_count = 1;
Packit b099d7
  _XmProcessLock();
Packit b099d7
  expose = ab->object.widget_class->core_class.expose;
Packit b099d7
  _XmProcessUnlock();
Packit b099d7
  (*(expose)) 
Packit b099d7
    ((Widget) ab, event, FALSE);
Packit b099d7
  
Packit b099d7
  XFlush (XtDisplay (ab));
Packit b099d7
  
Packit b099d7
  if (ab->arrowbutton.arm_callback)
Packit b099d7
    {
Packit b099d7
      call_value.reason = XmCR_ARM;
Packit b099d7
      call_value.event = event;
Packit b099d7
      call_value.click_count = ab->arrowbutton.click_count;
Packit b099d7
      XtCallCallbackList ((Widget) ab, ab->arrowbutton.arm_callback,
Packit b099d7
			  &call_value);
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  call_value.reason = XmCR_ACTIVATE;
Packit b099d7
  call_value.event = event;
Packit b099d7
  call_value.click_count = 1;          /* always 1 in kselect */
Packit b099d7
  
Packit b099d7
  if (ab->arrowbutton.activate_callback)
Packit b099d7
    {
Packit b099d7
      XFlush (XtDisplay (ab));
Packit b099d7
      XtCallCallbackList ((Widget) ab, ab->arrowbutton.activate_callback,
Packit b099d7
			  &call_value);
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  ab->arrowbutton.selected = FALSE;
Packit b099d7
  
Packit b099d7
  if (ab->arrowbutton.disarm_callback)
Packit b099d7
    {
Packit b099d7
      XFlush (XtDisplay (ab));
Packit b099d7
      call_value.reason = XmCR_DISARM;
Packit b099d7
      XtCallCallbackList ((Widget) ab, ab->arrowbutton.disarm_callback,
Packit b099d7
			  &call_value);
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  /* If the button is still around, show it released, after a short delay */
Packit b099d7
  
Packit b099d7
  if (ab->object.being_destroyed == False)
Packit b099d7
    {
Packit b099d7
      ab->arrowbutton.timer = 
Packit b099d7
	XtAppAddTimeOut(XtWidgetToApplicationContext((Widget) ab),
Packit b099d7
			(unsigned long) DELAY_DEFAULT,
Packit b099d7
			ArmTimeout, (XtPointer)ab);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7

Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
ArmTimeout(
Packit b099d7
        XtPointer data,
Packit b099d7
        XtIntervalId *id)
Packit b099d7
{
Packit b099d7
  XmArrowButtonGadget ab = (XmArrowButtonGadget) data;
Packit b099d7
  
Packit b099d7
  ab->arrowbutton.timer = 0;
Packit b099d7
Packit b099d7
  if (XtIsRealized((Widget)ab) && XtIsManaged((Widget)ab)) 
Packit b099d7
    {
Packit b099d7
      Redisplay ((Widget) ab, NULL, FALSE);
Packit b099d7
      XFlush (XtDisplay (ab));
Packit b099d7
    }
Packit b099d7
}
Packit b099d7

Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  Disarm
Packit b099d7
 *     This function processes button 1 up occuring on the arrowbutton.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
static void 
Packit b099d7
Disarm(
Packit b099d7
        XmArrowButtonGadget aw,
Packit b099d7
        XEvent *event)
Packit b099d7
{
Packit b099d7
  XmArrowButtonCallbackStruct call_value;
Packit b099d7
  
Packit b099d7
  call_value.reason = XmCR_DISARM;
Packit b099d7
  call_value.event = event;
Packit b099d7
  XtCallCallbackList ((Widget) aw, aw->arrowbutton.disarm_callback,
Packit b099d7
		      &call_value);
Packit b099d7
}
Packit b099d7

Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  Enter
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
static void 
Packit b099d7
Enter(
Packit b099d7
        XmArrowButtonGadget aw,
Packit b099d7
        XEvent *event)
Packit b099d7
{
Packit b099d7
  _XmEnterGadget ((Widget) aw, event, NULL, NULL);
Packit b099d7
  
Packit b099d7
  if (aw->arrowbutton.selected && XtIsSensitive((Widget) aw))
Packit b099d7
    DrawArrowG(aw, aw->arrowbutton.bottom_shadow_GC,
Packit b099d7
	       aw->arrowbutton.top_shadow_GC, NULL);
Packit b099d7
}
Packit b099d7

Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  Leave
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
static void 
Packit b099d7
Leave(
Packit b099d7
        XmArrowButtonGadget aw,
Packit b099d7
        XEvent *event)
Packit b099d7
{
Packit b099d7
  _XmLeaveGadget ((Widget) aw, event, NULL, NULL);
Packit b099d7
Packit b099d7
  if (aw->arrowbutton.selected && XtIsSensitive((Widget) aw))
Packit b099d7
    DrawArrowG(aw, aw->arrowbutton.top_shadow_GC,
Packit b099d7
	       aw->arrowbutton.bottom_shadow_GC, NULL);
Packit b099d7
}
Packit b099d7

Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  Help
Packit b099d7
 *     This function processes Function Key 1 press occuring on 
Packit b099d7
 *     the arrowbutton.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
static void 
Packit b099d7
Help(
Packit b099d7
        XmArrowButtonGadget aw,
Packit b099d7
        XEvent *event)
Packit b099d7
{
Packit b099d7
   _XmSocorro((Widget) aw, event, NULL, NULL);
Packit b099d7
}
Packit b099d7

Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  ChangeCB
Packit b099d7
 *	add or remove the activate callback list.
Packit b099d7
 *      
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
static void 
Packit b099d7
ChangeCB(
Packit b099d7
	 Widget w, 
Packit b099d7
	 XtCallbackProc activCB,
Packit b099d7
	 XtPointer closure,
Packit b099d7
	 Boolean setunset)
Packit b099d7
{
Packit b099d7
  if (setunset)
Packit b099d7
    XtAddCallback (w, XmNactivateCallback, activCB, closure);
Packit b099d7
  else
Packit b099d7
    XtRemoveCallback (w, XmNactivateCallback, activCB, closure);
Packit b099d7
}
Packit b099d7

Packit b099d7
static void
Packit b099d7
GetColors(Widget w, 
Packit b099d7
	  XmAccessColorData color_data)
Packit b099d7
{
Packit b099d7
  color_data->valueMask = AccessForeground | AccessBackgroundPixel |
Packit b099d7
    AccessHighlightColor | AccessTopShadowColor | AccessBottomShadowColor;
Packit b099d7
  color_data->background = ArrowBG_Background(w);
Packit b099d7
  color_data->foreground = ArrowBG_Foreground(w);
Packit b099d7
  color_data->highlight_color = ArrowBG_HighlightColor(w);
Packit b099d7
  color_data->top_shadow_color = ArrowBG_TopShadowColor(w);
Packit b099d7
  color_data->bottom_shadow_color = ArrowBG_BottomShadowColor(w);
Packit b099d7
}
Packit b099d7

Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  XmCreateArrowButtonGadget
Packit b099d7
 *	Create an instance of an arrowbutton and return the widget id.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
Widget 
Packit b099d7
XmCreateArrowButtonGadget(
Packit b099d7
        Widget parent,
Packit b099d7
        char *name,
Packit b099d7
        ArgList arglist,
Packit b099d7
        Cardinal argcount)
Packit b099d7
{
Packit b099d7
  return XtCreateWidget(name, xmArrowButtonGadgetClass, parent, 
Packit b099d7
			arglist, argcount);
Packit b099d7
}
Packit b099d7
Packit b099d7
Widget 
Packit b099d7
XmVaCreateArrowButtonGadget(
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
                         xmArrowButtonGadgetClass, 
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
XmVaCreateManagedArrowButtonGadget(
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
                         xmArrowButtonGadgetClass, 
Packit b099d7
                         parent, True, 
Packit b099d7
                         var, count);
Packit b099d7
    va_end(var);   
Packit b099d7
    return w;
Packit b099d7
    
Packit b099d7
}
Packit b099d7

Packit b099d7
/* ARGSUSED */
Packit b099d7
static void 
Packit b099d7
ActivateCommonG(
Packit b099d7
        XmArrowButtonGadget ag,
Packit b099d7
        XEvent *event,
Packit b099d7
        Mask event_mask)
Packit b099d7
{
Packit b099d7
  if (event->type == ButtonRelease)
Packit b099d7
    {
Packit b099d7
      Activate((Widget) ag, event, NULL, NULL);
Packit b099d7
      Disarm (ag, event);
Packit b099d7
    }
Packit b099d7
Packit b099d7
  else  /* assume KeyPress or KeyRelease */
Packit b099d7
    (* (((XmArrowButtonGadgetClassRec *)(ag->object.widget_class))->
Packit b099d7
	gadget_class.arm_and_activate))
Packit b099d7
      ((Widget) ag, event, NULL, NULL);
Packit b099d7
}
Packit b099d7

Packit b099d7
/* Wrapper around XmeDrawArrow to calculate sizes. */
Packit b099d7
static void
Packit b099d7
DrawArrowG(XmArrowButtonGadget ag,
Packit b099d7
	   GC		       top_gc,
Packit b099d7
	   GC		       bottom_gc,
Packit b099d7
	   GC		       center_gc)
Packit b099d7
{
Packit b099d7
  Position x, y;
Packit b099d7
  Dimension width, height;
Packit b099d7
  Dimension margin = 
Packit b099d7
    ag->gadget.highlight_thickness + ag->gadget.shadow_thickness;
Packit b099d7
Packit b099d7
  /* Don't let large margins cause confusion. */
Packit b099d7
  if (margin <= (ag->rectangle.width / 2))
Packit b099d7
    {
Packit b099d7
      x = ag->rectangle.x + margin;
Packit b099d7
      width = ag->rectangle.width - (margin * 2);
Packit b099d7
    }
Packit b099d7
  else
Packit b099d7
    {
Packit b099d7
      x = ag->rectangle.x + ag->rectangle.width / 2;
Packit b099d7
      width = 0;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  if (margin <= (ag->rectangle.height / 2))
Packit b099d7
    {
Packit b099d7
      y = ag->rectangle.y + margin;
Packit b099d7
      height = ag->rectangle.height - (margin * 2);
Packit b099d7
    }
Packit b099d7
  else
Packit b099d7
    {
Packit b099d7
      y = ag->rectangle.y + ag->rectangle.height / 2;
Packit b099d7
      height = 0;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  /* The way we currently handle 1 shadowThickness in XmeDrawArrow 
Packit b099d7
     is by drawing the center a little bit bigger, so the center_gc has
Packit b099d7
     to be present. Kinda hacky... */
Packit b099d7
  if (!center_gc && 
Packit b099d7
      ag->arrowbutton.detail_shadow_thickness == 1) 
Packit b099d7
      center_gc = ag->arrowbutton.arrow_GC ;
Packit b099d7
  if (center_gc)
Packit b099d7
    XSetClipMask(XtDisplay((Widget) ag), center_gc, None);
Packit b099d7
Packit b099d7
  XmeDrawArrow (XtDisplay ((Widget) ag), XtWindow ((Widget) ag),
Packit b099d7
		top_gc, bottom_gc, center_gc,
Packit b099d7
		x, y, width, height, 
Packit b099d7
		ag->arrowbutton.detail_shadow_thickness, 
Packit b099d7
		ag->arrowbutton.direction);
Packit b099d7
}