Blame lib/Xm/ArrowB.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[] = "$XConsortium: ArrowB.c /main/16 1995/10/25 19:50:57 cde-sun $"
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/ArrowBP.h>
Packit b099d7
#include <Xm/TransltnsP.h>
Packit b099d7
#include <Xm/DrawP.h>
Packit b099d7
#include <Xm/ActivatableT.h>
Packit b099d7
#include <Xm/TraitP.h>
Packit b099d7
#include <Xm/VaSimpleP.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

Packit b099d7
/********    Static Function Declarations    ********/
Packit b099d7
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 GetArrowGC( 
Packit b099d7
                        XmArrowButtonWidget aw);
Packit b099d7
static void Redisplay( 
Packit b099d7
                        Widget wid,
Packit b099d7
                        XEvent *event,
Packit b099d7
                        Region region);
Packit b099d7
static void Destroy( 
Packit b099d7
                        Widget w);
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 void Arm( 
Packit b099d7
                        Widget wid,
Packit b099d7
                        XEvent *event,
Packit b099d7
                        String *params,
Packit b099d7
                        Cardinal *num_params);
Packit b099d7
static void MultiArm( 
Packit b099d7
                        Widget aw,
Packit b099d7
                        XEvent *event,
Packit b099d7
                        String *params,
Packit b099d7
                        Cardinal *num_params);
Packit b099d7
static void Activate( 
Packit b099d7
                        Widget wid,
Packit b099d7
                        XEvent *buttonEvent,
Packit b099d7
                        String *params,
Packit b099d7
                        Cardinal *num_params);
Packit b099d7
static void MultiActivate( 
Packit b099d7
                        Widget wid,
Packit b099d7
                        XEvent *buttonEvent,
Packit b099d7
                        String *params,
Packit b099d7
                        Cardinal *num_params);
Packit b099d7
static void ActivateCommon( 
Packit b099d7
                        Widget wid,
Packit b099d7
                        XEvent *buttonEvent);
Packit b099d7
static void ArmAndActivate( 
Packit b099d7
                        Widget wid,
Packit b099d7
                        XEvent *event,
Packit b099d7
                        String *params,
Packit b099d7
                        Cardinal *num_params);
Packit b099d7
static void ArmTimeout( 
Packit b099d7
                        XtPointer closure,
Packit b099d7
                        XtIntervalId *id);
Packit b099d7
static void Disarm( 
Packit b099d7
                        Widget wid,
Packit b099d7
                        XEvent *event,
Packit b099d7
                        String *params,
Packit b099d7
                        Cardinal *num_params);
Packit b099d7
static void Enter( 
Packit b099d7
                        Widget wid,
Packit b099d7
                        XEvent *event,
Packit b099d7
                        String *params,
Packit b099d7
                        Cardinal *num_params);
Packit b099d7
static void Leave( 
Packit b099d7
                        Widget wid,
Packit b099d7
                        XEvent *event,
Packit b099d7
                        String *params,
Packit b099d7
                        Cardinal *num_params);
Packit b099d7
static void ChangeCB(Widget w, 
Packit b099d7
		     XtCallbackProc activCB,
Packit b099d7
		     XtPointer closure,
Packit b099d7
		     Boolean setunset);
Packit b099d7
static void DrawArrow(XmArrowButtonWidget aw,
Packit b099d7
		      GC top_gc,
Packit b099d7
		      GC bottom_gc,
Packit b099d7
		      GC center_gc);
Packit b099d7
Packit b099d7
/********    End Static Function Declarations    ********/
Packit b099d7

Packit b099d7
/*  Default translation table and action list  */
Packit b099d7
Packit b099d7
#define defaultTranslations	_XmArrowB_defaultTranslations
Packit b099d7
Packit b099d7
static XtActionsRec actionsList[] =
Packit b099d7
{
Packit b099d7
  { "Activate",		Activate	    },
Packit b099d7
  { "MultiActivate",	MultiActivate	    },
Packit b099d7
  { "Arm",		Arm		    },
Packit b099d7
  { "MultiArm",		MultiArm	    },
Packit b099d7
  { "Disarm",		Disarm		    },
Packit b099d7
  { "ArmAndActivate",	ArmAndActivate	    },
Packit b099d7
  { "Enter",		Enter               },
Packit b099d7
  { "Leave",		Leave               },
Packit b099d7
  { "ButtonTakeFocus",	_XmButtonTakeFocus  }
Packit b099d7
};
Packit b099d7
Packit b099d7
Packit b099d7
/*  Resource list for ArrowButton  */
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 _XmArrowButtonRec, 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 _XmArrowButtonRec, 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 _XmArrowButtonRec, 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 _XmArrowButtonRec, 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 _XmArrowButtonRec, arrowbutton.disarm_callback),
Packit b099d7
    XmRPointer, (XtPointer) NULL
Packit b099d7
  },
Packit b099d7
   {
Packit b099d7
     XmNdetailShadowThickness, XmCShadowThickness, XmRHorizontalDimension,
Packit b099d7
     sizeof (Dimension), 
Packit b099d7
     XtOffsetOf(XmArrowButtonRec, 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(XmArrowButtonRec, arrowbutton.detail_shadow_thickness),
Packit b099d7
        XmeFromHorizontalPixels,XmeToHorizontalPixels
Packit b099d7
    }
Packit b099d7
};
Packit b099d7
Packit b099d7
Packit b099d7
/*  The ArrowButton class record definition  */
Packit b099d7
Packit b099d7
externaldef (xmarrowbuttonclassrec) XmArrowButtonClassRec xmArrowButtonClassRec=
Packit b099d7
{
Packit b099d7
  { /* Core fields */
Packit b099d7
    (WidgetClass) &xmPrimitiveClassRec, /* superclass            */	
Packit b099d7
    "XmArrowButton",			/* class_name	         */	
Packit b099d7
    sizeof(XmArrowButtonRec),		/* 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
    XtInheritRealize,			/* realize	         */	
Packit b099d7
    actionsList,			/* actions               */	
Packit b099d7
    XtNumber(actionsList),		/* 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
    (XtAcceptFocusProc)NULL,		/* accept_focus	         */	
Packit b099d7
    XtVersion,				/* version               */
Packit b099d7
    (XtPointer)NULL,			/* callback private      */
Packit b099d7
    defaultTranslations,		/* tm_table              */
Packit b099d7
    (XtGeometryHandler)NULL,		/* query_geometry        */
Packit b099d7
    (XtStringProc)NULL,			/* display_accelerator   */
Packit b099d7
    (XtPointer)NULL			/* extension             */
Packit b099d7
  },
Packit b099d7
Packit b099d7
  { /* XmPrimitive fields */
Packit b099d7
    XmInheritBorderHighlight,		/* Primitive border_highlight   */
Packit b099d7
    XmInheritBorderUnhighlight,		/* Primitive border_unhighlight */
Packit b099d7
    XtInheritTranslations,		/* translations                 */
Packit b099d7
    ArmAndActivate,			/* arm_and_activate             */
Packit b099d7
    syn_resources,         		/* syn_resources */
Packit b099d7
    XtNumber(syn_resources),	        /* num_syn_resources */
Packit b099d7
    (XtPointer) NULL         		/* extension                    */
Packit b099d7
  },
Packit b099d7
Packit b099d7
  { /* XmArrowButtonWidget fields */
Packit b099d7
    (XtPointer) NULL			/* extension			*/
Packit b099d7
  }
Packit b099d7
};
Packit b099d7
Packit b099d7
externaldef(xmarrowbuttonwidgetclass) WidgetClass xmArrowButtonWidgetClass =
Packit b099d7
			  (WidgetClass) &xmArrowButtonClassRec;
Packit b099d7
Packit b099d7
Packit b099d7
/* Trait record for arrowButton */
Packit b099d7
static XmConst XmActivatableTraitRec arrowButtonAT = 
Packit b099d7
{
Packit b099d7
  0,				/* version	*/
Packit b099d7
  ChangeCB			/* changeCB	*/
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_BIT);
Packit b099d7
Packit b099d7
  /* Install the activatable trait for all subclasses */
Packit b099d7
  XmeTraitSet((XtPointer)wc, XmQTactivatable, (XtPointer) &arrowButtonAT);
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
  XmArrowButtonWidget request = (XmArrowButtonWidget) rw;
Packit b099d7
  XmArrowButtonWidget new_w = (XmArrowButtonWidget) 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->core.width == 0) 
Packit b099d7
    new_w->core.width += 15;
Packit b099d7
  if (request->core.height == 0) 
Packit b099d7
    new_w->core.height += 15;
Packit b099d7
  
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
  GetArrowGC (new_w);
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
        XmArrowButtonWidget aw )
Packit b099d7
{
Packit b099d7
  XGCValues values;
Packit b099d7
  XtGCMask  valueMask, unusedMask;
Packit b099d7
  
Packit b099d7
  valueMask = GCForeground | GCBackground | GCGraphicsExposures;
Packit b099d7
  unusedMask = GCClipXOrigin | GCClipYOrigin | GCFont;
Packit b099d7
Packit b099d7
  values.foreground = aw->primitive.foreground;
Packit b099d7
  values.background = aw->core.background_pixel;
Packit b099d7
  values.graphics_exposures = False;
Packit b099d7
  
Packit b099d7
  aw->arrowbutton.arrow_GC = XtAllocateGC((Widget) aw, 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) aw);
Packit b099d7
  
Packit b099d7
  aw->arrowbutton.insensitive_GC = XtAllocateGC((Widget) aw, 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
static void 
Packit b099d7
Redisplay(
Packit b099d7
        Widget wid,
Packit b099d7
        XEvent *event,
Packit b099d7
        Region region )
Packit b099d7
{
Packit b099d7
  XmArrowButtonWidget aw = (XmArrowButtonWidget) wid;
Packit b099d7
  int iwidth, iheight;
Packit b099d7
  XtExposeProc expose;
Packit b099d7
  
Packit b099d7
  iwidth = (int) aw->core.width - 2 * aw->primitive.highlight_thickness;
Packit b099d7
  iheight = (int) aw->core.height - 2 * aw->primitive.highlight_thickness;
Packit b099d7
  
Packit b099d7
  /*  Draw the arrow  */
Packit b099d7
  if ((iwidth > 0) && (iheight > 0))
Packit b099d7
    {
Packit b099d7
      if (aw->primitive.shadow_thickness > 0)
Packit b099d7
	XmeDrawShadows(XtDisplay (aw), XtWindow (aw),
Packit b099d7
		       aw->primitive.top_shadow_GC,
Packit b099d7
		       aw->primitive.bottom_shadow_GC,
Packit b099d7
		       aw->primitive.highlight_thickness,
Packit b099d7
		       aw->primitive.highlight_thickness,
Packit b099d7
		       aw->core.width - 2 * aw->primitive.highlight_thickness,
Packit b099d7
		       aw->core.height - 2 * aw->primitive.highlight_thickness,
Packit b099d7
		       aw->primitive.shadow_thickness,
Packit b099d7
		       XmSHADOW_OUT);
Packit b099d7
      
Packit b099d7
      if (aw->arrowbutton.selected && XtIsSensitive(wid))
Packit b099d7
	DrawArrow(aw, aw->primitive.bottom_shadow_GC,
Packit b099d7
		  aw->primitive.top_shadow_GC, aw->arrowbutton.arrow_GC);
Packit b099d7
      else
Packit b099d7
	DrawArrow(aw, aw->primitive.top_shadow_GC,
Packit b099d7
		  aw->primitive.bottom_shadow_GC,
Packit b099d7
		  (XtIsSensitive(wid) ?
Packit b099d7
		   aw->arrowbutton.arrow_GC : aw->arrowbutton.insensitive_GC));
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  /* Envelop our superclass expose method */
Packit b099d7
  _XmProcessLock();
Packit b099d7
  expose = xmPrimitiveClassRec.core_class.expose;
Packit b099d7
  _XmProcessUnlock(); 
Packit b099d7
  (*(expose)) ((Widget) aw, event, region);
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
  XmArrowButtonWidget aw = (XmArrowButtonWidget) w;
Packit b099d7
  
Packit b099d7
  if (aw->arrowbutton.timer)
Packit b099d7
    XtRemoveTimeOut(aw->arrowbutton.timer);
Packit b099d7
  
Packit b099d7
  XtReleaseGC(w, aw->arrowbutton.arrow_GC);
Packit b099d7
  XtReleaseGC(w, aw->arrowbutton.insensitive_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,
Packit b099d7
        Widget nw,
Packit b099d7
        ArgList args,		/* unused */
Packit b099d7
        Cardinal *num_args)	/* unused */
Packit b099d7
{
Packit b099d7
  XmArrowButtonWidget current = (XmArrowButtonWidget) cw;
Packit b099d7
  XmArrowButtonWidget new_w = (XmArrowButtonWidget) nw;
Packit b099d7
  
Packit b099d7
  Boolean returnFlag = FALSE;
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
  /*  See if the GC's need to be regenerated and widget redrawn.  */
Packit b099d7
  if (new_w->core.background_pixel != current->core.background_pixel ||
Packit b099d7
      new_w->primitive.foreground != current->primitive.foreground)
Packit b099d7
    {
Packit b099d7
      returnFlag = TRUE;
Packit b099d7
      XtReleaseGC ((Widget) new_w, new_w->arrowbutton.arrow_GC);
Packit b099d7
      XtReleaseGC ((Widget) new_w, new_w->arrowbutton.insensitive_GC);
Packit b099d7
      GetArrowGC (new_w);
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if (new_w->arrowbutton.direction != current->arrowbutton.direction ||
Packit b099d7
      XtIsSensitive(nw) != XtIsSensitive(cw) ||
Packit b099d7
      new_w->primitive.highlight_thickness !=
Packit b099d7
      current->primitive.highlight_thickness ||
Packit b099d7
      new_w->primitive.shadow_thickness != current->primitive.shadow_thickness)
Packit b099d7
    {
Packit b099d7
      returnFlag = TRUE;
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  return (returnFlag);
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
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
Arm(
Packit b099d7
        Widget wid,
Packit b099d7
        XEvent *event,
Packit b099d7
        String *params,		/* unused */
Packit b099d7
        Cardinal *num_params)	/* unused */
Packit b099d7
{
Packit b099d7
  XmArrowButtonWidget aw = (XmArrowButtonWidget) wid;
Packit b099d7
  XmArrowButtonCallbackStruct call_value;
Packit b099d7
  
Packit b099d7
  (void) XmProcessTraversal((Widget) aw, XmTRAVERSE_CURRENT);
Packit b099d7
  
Packit b099d7
  aw->arrowbutton.selected = True;
Packit b099d7
  aw->arrowbutton.armTimeStamp = event->xbutton.time; /* see MultiActivate */
Packit b099d7
  
Packit b099d7
  DrawArrow(aw, aw->primitive.bottom_shadow_GC,
Packit b099d7
	    aw->primitive.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, 
Packit b099d7
			 aw->arrowbutton.arm_callback, 
Packit b099d7
			 &call_value);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7

Packit b099d7
static void 
Packit b099d7
MultiArm(
Packit b099d7
        Widget aw,
Packit b099d7
        XEvent *event,
Packit b099d7
        String *params,
Packit b099d7
        Cardinal *num_params)
Packit b099d7
{
Packit b099d7
  if (((XmArrowButtonWidget) aw)->arrowbutton.multiClick == XmMULTICLICK_KEEP)
Packit b099d7
    Arm(aw, event, params, num_params);
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
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
Activate(
Packit b099d7
        Widget wid,
Packit b099d7
        XEvent *buttonEvent,
Packit b099d7
        String *params,		/* unused */
Packit b099d7
        Cardinal *num_params)	/* unused */
Packit b099d7
{
Packit b099d7
  XmArrowButtonWidget aw = (XmArrowButtonWidget) wid;
Packit b099d7
  
Packit b099d7
  if (aw->arrowbutton.selected == False)
Packit b099d7
    return;
Packit b099d7
  
Packit b099d7
  aw->arrowbutton.click_count = 1;
Packit b099d7
  ActivateCommon((Widget) aw, buttonEvent);
Packit b099d7
}
Packit b099d7

Packit b099d7
static void 
Packit b099d7
MultiActivate(
Packit b099d7
        Widget wid,
Packit b099d7
        XEvent *buttonEvent,
Packit b099d7
        String *params,
Packit b099d7
        Cardinal *num_params)
Packit b099d7
{
Packit b099d7
  /* When a multi click sequence occurs and the user Button Presses and
Packit b099d7
   * holds for a length of time, the final release should look like a
Packit b099d7
   * new/separate activate.
Packit b099d7
   */
Packit b099d7
  XmArrowButtonWidget aw = (XmArrowButtonWidget) wid;
Packit b099d7
  
Packit b099d7
  if (aw->arrowbutton.multiClick == XmMULTICLICK_KEEP)
Packit b099d7
    {
Packit b099d7
      if ((buttonEvent->xbutton.time - aw->arrowbutton.armTimeStamp) > 
Packit b099d7
	  XtGetMultiClickTime(XtDisplay(aw)))
Packit b099d7
	aw->arrowbutton.click_count = 1;
Packit b099d7
      else
Packit b099d7
	aw->arrowbutton.click_count++;
Packit b099d7
      
Packit b099d7
      ActivateCommon((Widget) aw, buttonEvent);
Packit b099d7
      Disarm ((Widget) aw, buttonEvent, params, num_params);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7

Packit b099d7
static void 
Packit b099d7
ActivateCommon(
Packit b099d7
        Widget wid,
Packit b099d7
        XEvent *buttonEvent)
Packit b099d7
{
Packit b099d7
  XmArrowButtonWidget aw = (XmArrowButtonWidget) wid;
Packit b099d7
  XmArrowButtonCallbackStruct call_value;
Packit b099d7
  
Packit b099d7
  aw->arrowbutton.selected = False;
Packit b099d7
  
Packit b099d7
  DrawArrow(aw, aw->primitive.top_shadow_GC,
Packit b099d7
	    aw->primitive.bottom_shadow_GC, NULL);
Packit b099d7
  
Packit b099d7
  /* CR 9181: Consider clipping when testing visibility. */
Packit b099d7
  if (((buttonEvent->xany.type == ButtonPress) || 
Packit b099d7
       (buttonEvent->xany.type == ButtonRelease)) &&
Packit b099d7
      _XmGetPointVisibility(wid, 
Packit b099d7
			    buttonEvent->xbutton.x_root, 
Packit b099d7
			    buttonEvent->xbutton.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 = buttonEvent;
Packit b099d7
      call_value.click_count = aw->arrowbutton.click_count;
Packit b099d7
Packit b099d7
      if ((aw->arrowbutton.multiClick == XmMULTICLICK_DISCARD) &&
Packit b099d7
	  (call_value.click_count > 1))
Packit b099d7
	return;
Packit b099d7
Packit b099d7
      XtCallCallbackList((Widget) aw, 
Packit b099d7
			 aw->arrowbutton.activate_callback, 
Packit b099d7
			 &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 wid,
Packit b099d7
        XEvent *event,
Packit b099d7
        String *params,		/* unused */
Packit b099d7
        Cardinal *num_params)	/* unused */
Packit b099d7
{
Packit b099d7
  XmArrowButtonWidget ab = (XmArrowButtonWidget) wid;
Packit b099d7
  XmArrowButtonCallbackStruct call_value;
Packit b099d7
  XtExposeProc expose;
Packit b099d7
  
Packit b099d7
  ab->arrowbutton.selected = TRUE;
Packit b099d7
  _XmProcessLock();
Packit b099d7
  expose = ab->core.widget_class->core_class.expose;
Packit b099d7
  _XmProcessUnlock();
Packit b099d7
  (*(expose)) ((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
      XtCallCallbackList((Widget)ab, ab->arrowbutton.arm_callback, &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
  if (ab->core.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 closure,
Packit b099d7
        XtIntervalId *id )
Packit b099d7
{
Packit b099d7
  XmArrowButtonWidget ab = (XmArrowButtonWidget) closure;
Packit b099d7
Packit b099d7
  ab->arrowbutton.timer = 0;
Packit b099d7
Packit b099d7
  if (XtIsRealized((Widget)ab) && XtIsManaged((Widget)ab)) 
Packit b099d7
    {
Packit b099d7
      XtExposeProc expose;
Packit b099d7
	
Packit b099d7
      _XmProcessLock();
Packit b099d7
      expose = ab->core.widget_class->core_class.expose;
Packit b099d7
      _XmProcessUnlock();
Packit b099d7
      (*(expose)) ((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
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
Disarm(
Packit b099d7
        Widget wid,
Packit b099d7
        XEvent *event,
Packit b099d7
        String *params,		/* unused */
Packit b099d7
        Cardinal *num_params)	/* unused */
Packit b099d7
{
Packit b099d7
  XmArrowButtonWidget aw = (XmArrowButtonWidget) wid;
Packit b099d7
  XmArrowButtonCallbackStruct call_value;
Packit b099d7
  
Packit b099d7
  aw->arrowbutton.selected = False;
Packit b099d7
  
Packit b099d7
  DrawArrow(aw, aw->primitive.top_shadow_GC,
Packit b099d7
	    aw->primitive.bottom_shadow_GC, NULL);
Packit b099d7
  
Packit b099d7
  call_value.reason = XmCR_DISARM;
Packit b099d7
  call_value.event = event;
Packit b099d7
  XtCallCallbackList((Widget) aw, aw->arrowbutton.disarm_callback, &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
        Widget wid,
Packit b099d7
        XEvent *event,
Packit b099d7
        String *params,
Packit b099d7
        Cardinal *num_params )
Packit b099d7
{
Packit b099d7
  XmArrowButtonWidget aw = (XmArrowButtonWidget) wid;
Packit b099d7
Packit b099d7
  _XmPrimitiveEnter (wid, event, params, num_params);
Packit b099d7
  
Packit b099d7
  if (aw->arrowbutton.selected && XtIsSensitive(wid))
Packit b099d7
    DrawArrow(aw, aw->primitive.bottom_shadow_GC,
Packit b099d7
	      aw->primitive.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
        Widget wid,
Packit b099d7
        XEvent *event,
Packit b099d7
        String *params,
Packit b099d7
        Cardinal *num_params )
Packit b099d7
{
Packit b099d7
  XmArrowButtonWidget aw = (XmArrowButtonWidget) wid;
Packit b099d7
Packit b099d7
  _XmPrimitiveLeave (wid, event, params, num_params);
Packit b099d7
  
Packit b099d7
  if (aw->arrowbutton.selected && XtIsSensitive(wid))
Packit b099d7
    DrawArrow(aw, aw->primitive.top_shadow_GC,
Packit b099d7
	      aw->primitive.bottom_shadow_GC, 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
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  XmCreateArrowButton
Packit b099d7
 *	Create an instance of an arrowbutton and return the widget id.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
Widget 
Packit b099d7
XmCreateArrowButton(
Packit b099d7
        Widget parent,
Packit b099d7
        char *name,
Packit b099d7
        ArgList arglist,
Packit b099d7
        Cardinal argcount )
Packit b099d7
{
Packit b099d7
  return XtCreateWidget(name, xmArrowButtonWidgetClass, parent, 
Packit b099d7
			arglist, argcount);
Packit b099d7
}
Packit b099d7
Packit b099d7
Widget 
Packit b099d7
XmVaCreateArrowButton(
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
                         xmArrowButtonWidgetClass, 
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
XmVaCreateManagedArrowButton(
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
                         xmArrowButtonWidgetClass, 
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
/* Wrapper around XmeDrawArrow to calculate sizes. */
Packit b099d7
static void
Packit b099d7
DrawArrow(XmArrowButtonWidget aw,
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 = (aw->primitive.highlight_thickness + 
Packit b099d7
			  aw->primitive.shadow_thickness);
Packit b099d7
  
Packit b099d7
  /* Don't let large margins cause confusion. */
Packit b099d7
  if (margin <= (aw->core.width / 2))
Packit b099d7
    {
Packit b099d7
      x = margin;
Packit b099d7
      width = aw->core.width - (margin * 2);
Packit b099d7
    }
Packit b099d7
  else
Packit b099d7
    {
Packit b099d7
      x = aw->core.width / 2;
Packit b099d7
      width = 0;
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if (margin <= (aw->core.height / 2))
Packit b099d7
    {
Packit b099d7
      y = margin;
Packit b099d7
      height = aw->core.height - (margin * 2);
Packit b099d7
    }
Packit b099d7
  else
Packit b099d7
    {
Packit b099d7
      y = aw->core.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
      aw->arrowbutton.detail_shadow_thickness == 1) 
Packit b099d7
      center_gc = aw->arrowbutton.arrow_GC ;
Packit b099d7
Packit b099d7
  if (center_gc)
Packit b099d7
    XSetClipMask(XtDisplay((Widget)aw), center_gc, None);
Packit b099d7
Packit b099d7
  XmeDrawArrow (XtDisplay ((Widget) aw), XtWindow ((Widget) aw),
Packit b099d7
		top_gc, bottom_gc, center_gc,
Packit b099d7
		x, y, width, height, 
Packit b099d7
		aw->arrowbutton.detail_shadow_thickness, 
Packit b099d7
		aw->arrowbutton.direction);
Packit b099d7
}