Blame lib/Xm/PushB.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: PushB.c /main/29 1999/01/27 16:08:33 mgreess $"
Packit b099d7
#endif
Packit b099d7
#endif
Packit b099d7
#ifdef HAVE_CONFIG_H
Packit b099d7
#include <config.h>
Packit b099d7
#endif
Packit b099d7
Packit b099d7
Packit b099d7
/* (c) Copyright 1989, 1990 DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. */
Packit b099d7
/* (c) Copyright 1987, 1988, 1989, 1990, 1991, 1992 HEWLETT-PACKARD COMPANY */
Packit b099d7
/* (c) Copyright 1988 MASSACHUSETTS INSTITUTE OF TECHNOLOGY  */
Packit b099d7
/* (c) Copyright 1988 MICROSOFT CORPORATION */
Packit b099d7
Packit b099d7
#include <stdio.h>
Packit b099d7
#include <X11/IntrinsicP.h>
Packit b099d7
#include <X11/ShellP.h>
Packit b099d7
#include <Xm/ActivatableT.h>
Packit b099d7
#include <Xm/BaseClassP.h>
Packit b099d7
#include <Xm/CareVisualT.h>
Packit b099d7
#include <Xm/DisplayP.h>
Packit b099d7
#include <Xm/DrawP.h>
Packit b099d7
#include <Xm/ManagerP.h>
Packit b099d7
#include <Xm/MenuT.h>
Packit b099d7
#include <Xm/PushBP.h>
Packit b099d7
#include <Xm/TakesDefT.h>
Packit b099d7
#include <Xm/TearOffBP.h>
Packit b099d7
#include <Xm/TraitP.h>
Packit b099d7
#include <Xm/TransltnsP.h>
Packit b099d7
#include <Xm/VaSimpleP.h>
Packit b099d7
#include "ColorI.h"
Packit b099d7
#include "LabelI.h"
Packit b099d7
#include "MenuProcI.h"
Packit b099d7
#include "MenuStateI.h"
Packit b099d7
#include "MenuUtilI.h"
Packit b099d7
#include "PrimitiveI.h"
Packit b099d7
#include "TravActI.h"
Packit b099d7
#include "TraversalI.h"
Packit b099d7
#include "UniqueEvnI.h"
Packit b099d7
#include "XmI.h"
Packit b099d7
#include "VaSimpleI.h"
Packit b099d7
#include "ExtP.h"
Packit b099d7
Packit b099d7
#define XmINVALID_MULTICLICK	255
Packit b099d7
#define DELAY_DEFAULT		100 
Packit b099d7
Packit b099d7
#define FIX_1516
Packit b099d7
Packit b099d7
/********    Static Function Declarations    ********/
Packit b099d7
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 wid,
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 *event,
Packit b099d7
                        String *params,
Packit b099d7
                        Cardinal *num_params) ;
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 data,
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 BtnDown( 
Packit b099d7
                        Widget wid,
Packit b099d7
                        XEvent *event,
Packit b099d7
                        String *params,
Packit b099d7
                        Cardinal *num_params) ;
Packit b099d7
static void BtnUp( 
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 BorderHighlight( 
Packit b099d7
                        Widget wid) ;
Packit b099d7
static void DrawBorderHighlight( 
Packit b099d7
                        Widget wid) ;
Packit b099d7
static void BorderUnhighlight( 
Packit b099d7
                        Widget wid) ;
Packit b099d7
static void KeySelect( 
Packit b099d7
                        Widget wid,
Packit b099d7
                        XEvent *event,
Packit b099d7
                        String *params,
Packit b099d7
                        Cardinal *num_params) ;
Packit b099d7
static void ClassInitialize( void ) ;
Packit b099d7
static void ClassPartInitialize( 
Packit b099d7
                        WidgetClass wc) ;
Packit b099d7
static void InitializePrehook( 
Packit b099d7
                        Widget req,
Packit b099d7
                        Widget new_w,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
Packit b099d7
static void InitializePosthook( 
Packit b099d7
                        Widget req,
Packit b099d7
                        Widget new_w,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
Packit b099d7
static void Initialize( 
Packit b099d7
                        Widget rw,
Packit b099d7
                        Widget nw,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
Packit b099d7
static void GetFillGC( 
Packit b099d7
                        XmPushButtonWidget pb) ;
Packit b099d7
static void GetBackgroundGC( 
Packit b099d7
                        XmPushButtonWidget pb) ;
Packit b099d7
static Boolean SetValuesPrehook( 
Packit b099d7
			Widget cw,
Packit b099d7
                        Widget rw,
Packit b099d7
                        Widget nw,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
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 Help( 
Packit b099d7
                        Widget wid,
Packit b099d7
                        XEvent *event,
Packit b099d7
                        String *params,
Packit b099d7
                        Cardinal *num_params) ;
Packit b099d7
static void Destroy( 
Packit b099d7
                        Widget w) ;
Packit b099d7
static void Resize(
Packit b099d7
                        Widget w) ;
Packit b099d7
static void EraseDefaultButtonShadow( 
Packit b099d7
                        XmPushButtonWidget pb) ;
Packit b099d7
static void Redisplay( 
Packit b099d7
                        Widget wid,
Packit b099d7
                        XEvent *event,
Packit b099d7
                        Region region) ;
Packit b099d7
static void DrawPushButtonBackground( 
Packit b099d7
                        XmPushButtonWidget pb) ;
Packit b099d7
static void DrawPushButtonLabel( 
Packit b099d7
                        XmPushButtonWidget pb,
Packit b099d7
                        XEvent *event,
Packit b099d7
                        Region region) ;
Packit b099d7
static void DrawPushButtonShadows( 
Packit b099d7
                        XmPushButtonWidget pb) ;
Packit b099d7
static void ComputePBLabelArea( 
Packit b099d7
                        XmPushButtonWidget pb,
Packit b099d7
                        XRectangle *box) ;
Packit b099d7
static void DrawPBPrimitiveShadows( 
Packit b099d7
                        XmPushButtonWidget pb) ;
Packit b099d7
static void DrawDefaultButtonShadows( 
Packit b099d7
                        XmPushButtonWidget pb) ;
Packit b099d7
static XmImportOperator ShowAsDef_ToHorizPix( 
Packit b099d7
                        Widget widget,
Packit b099d7
                        int offset,
Packit b099d7
                        XtArgVal *value) ;
Packit b099d7
static int AdjustHighLightThickness( 
Packit b099d7
                        XmPushButtonWidget new_w,
Packit b099d7
                        XmPushButtonWidget current) ;
Packit b099d7
static void ExportHighlightThickness( 
Packit b099d7
                        Widget widget,
Packit b099d7
                        int offset,
Packit b099d7
                        XtArgVal *value) ;
Packit b099d7
static void FillBorderWithParentColor( 
Packit b099d7
                        XmPushButtonWidget pb,
Packit b099d7
                        int borderwidth,
Packit b099d7
                        int dx,
Packit b099d7
                        int dy,
Packit b099d7
                        int rectwidth,
Packit b099d7
                        int rectheight) ;
Packit b099d7
static void SetPushButtonSize(
Packit b099d7
                        XmPushButtonWidget newtb) ;
Packit b099d7
static void ChangeCB(Widget w, 
Packit b099d7
		     XtCallbackProc activCB,
Packit b099d7
		     XtPointer closure,
Packit b099d7
		     Boolean setunset) ;
Packit b099d7
static void ShowAsDefault(Widget w,
Packit b099d7
			  XtEnum state) ;
Packit b099d7
static Boolean ParentVisualChanged(Widget kid, 
Packit b099d7
				   Widget cur_parent,
Packit b099d7
				   Widget new_parent,
Packit b099d7
				   Mask visual_flag);
Packit b099d7
static void PB_FixTearoff(XmPushButtonWidget pb);
Packit b099d7
Packit b099d7
/********    End Static Function Declarations    ********/
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *   Description:   translation tables for class: PushButton
Packit b099d7
 *   -----------
Packit b099d7
 *
Packit b099d7
 *   Matches events with string descriptors for internal routines.
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
static XtTranslations default_parsed;
Packit b099d7
Packit b099d7
#define defaultTranslations	_XmPushB_defaultTranslations
Packit b099d7
Packit b099d7
static XtTranslations menu_parsed;
Packit b099d7
Packit b099d7
#define menuTranslations	_XmPushB_menuTranslations
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *   Description:  action list for class: PushButton
Packit b099d7
 *   -----------
Packit b099d7
 *
Packit b099d7
 *   Matches string descriptors with internal routines.
Packit b099d7
 *   Note that Primitive will register additional event handlers
Packit b099d7
 *   for traversal.
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
static XtActionsRec actionsList[] =
Packit b099d7
{
Packit b099d7
  { "Arm", 			Arm			 },
Packit b099d7
  { "MultiArm", 		MultiArm		 },
Packit b099d7
  { "Activate", 		Activate		 },
Packit b099d7
  { "MultiActivate",		MultiActivate		 },
Packit b099d7
  { "ArmAndActivate", 		ArmAndActivate		 },
Packit b099d7
  { "Disarm", 			Disarm			 },
Packit b099d7
  { "BtnDown", 			BtnDown			 },
Packit b099d7
  { "BtnUp", 			BtnUp			 },
Packit b099d7
  { "Enter", 			Enter			 },
Packit b099d7
  { "Leave",			Leave			 },
Packit b099d7
  { "ButtonTakeFocus",       	_XmButtonTakeFocus	 },
Packit b099d7
  { "MenuButtonTakeFocus",   	_XmMenuButtonTakeFocus	 },
Packit b099d7
  { "MenuButtonTakeFocusUp", 	_XmMenuButtonTakeFocusUp },
Packit b099d7
  { "KeySelect",		KeySelect		 },
Packit b099d7
  { "Help",			Help			 },
Packit b099d7
};
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/* The resource list for Push Button. */
Packit b099d7
Packit b099d7
static XtResource resources[] = 
Packit b099d7
{     
Packit b099d7
   {
Packit b099d7
     XmNmultiClick, XmCMultiClick, 
Packit b099d7
     XmRMultiClick, sizeof (unsigned char),
Packit b099d7
     XtOffsetOf(XmPushButtonRec, pushbutton.multiClick),
Packit b099d7
     XmRImmediate, (XtPointer) XmINVALID_MULTICLICK
Packit b099d7
   },
Packit b099d7
Packit b099d7
   {
Packit b099d7
     XmNfillOnArm, XmCFillOnArm, 
Packit b099d7
     XmRBoolean, sizeof (Boolean),
Packit b099d7
     XtOffsetOf(XmPushButtonRec, pushbutton.fill_on_arm),
Packit b099d7
     XmRImmediate, (XtPointer) True
Packit b099d7
   },
Packit b099d7
Packit b099d7
   {
Packit b099d7
     XmNarmColor, XmCArmColor,
Packit b099d7
     XmRPixel, sizeof (Pixel),
Packit b099d7
     XtOffsetOf(XmPushButtonRec, pushbutton.arm_color),
Packit b099d7
     XmRCallProc, (XtPointer) _XmSelectColorDefault
Packit b099d7
   },
Packit b099d7
Packit b099d7
   {
Packit b099d7
     XmNarmPixmap, XmCArmPixmap,
Packit b099d7
     XmRDynamicPixmap, sizeof (Pixmap),
Packit b099d7
     XtOffsetOf(XmPushButtonRec, pushbutton.arm_pixmap),
Packit b099d7
     XmRImmediate, (XtPointer) XmUNSPECIFIED_PIXMAP
Packit b099d7
   },
Packit b099d7
Packit b099d7
   {
Packit b099d7
     XmNshowAsDefault, XmCShowAsDefault,
Packit b099d7
     XmRBooleanDimension, sizeof (Dimension),
Packit b099d7
     XtOffsetOf(XmPushButtonRec, pushbutton.show_as_default),
Packit b099d7
     XmRImmediate, (XtPointer) 0
Packit b099d7
   },
Packit b099d7
Packit b099d7
   {
Packit b099d7
     XmNactivateCallback, XmCCallback,
Packit b099d7
     XmRCallback, sizeof(XtCallbackList),
Packit b099d7
     XtOffsetOf(XmPushButtonRec, pushbutton.activate_callback),
Packit b099d7
     XmRPointer, (XtPointer) NULL
Packit b099d7
   },
Packit b099d7
Packit b099d7
   {
Packit b099d7
     XmNarmCallback, XmCCallback,
Packit b099d7
     XmRCallback, sizeof(XtCallbackList),
Packit b099d7
     XtOffsetOf(XmPushButtonRec, pushbutton.arm_callback),
Packit b099d7
     XmRPointer, (XtPointer) NULL
Packit b099d7
   },
Packit b099d7
Packit b099d7
   {
Packit b099d7
     XmNdisarmCallback, XmCCallback,
Packit b099d7
     XmRCallback, sizeof(XtCallbackList),
Packit b099d7
     XtOffsetOf(XmPushButtonRec, pushbutton.disarm_callback),
Packit b099d7
     XmRPointer, (XtPointer) NULL
Packit b099d7
   },
Packit b099d7
   
Packit b099d7
   {
Packit b099d7
     XmNshadowThickness, XmCShadowThickness,
Packit b099d7
     XmRHorizontalDimension, sizeof(Dimension),
Packit b099d7
     XtOffsetOf(XmPushButtonRec, primitive.shadow_thickness),
Packit b099d7
     XmRCallProc, (XtPointer) _XmSetThickness
Packit b099d7
   },
Packit b099d7
Packit b099d7
   {
Packit b099d7
     XmNdefaultButtonShadowThickness, XmCDefaultButtonShadowThickness, 
Packit b099d7
     XmRHorizontalDimension, sizeof (Dimension),
Packit b099d7
     XtOffsetOf(XmPushButtonRec, pushbutton.default_button_shadow_thickness),
Packit b099d7
     XmRImmediate, (XtPointer) 0
Packit b099d7
   },
Packit b099d7
Packit b099d7
   {
Packit b099d7
     XmNtraversalOn, XmCTraversalOn,
Packit b099d7
     XmRBoolean, sizeof(Boolean),
Packit b099d7
     XtOffsetOf(XmPrimitiveRec, primitive.traversal_on),
Packit b099d7
     XmRImmediate, (XtPointer) True
Packit b099d7
   },
Packit b099d7
Packit b099d7
   {
Packit b099d7
     XmNhighlightThickness, XmCHighlightThickness,
Packit b099d7
     XmRHorizontalDimension, sizeof (Dimension),
Packit b099d7
     XtOffsetOf(XmPrimitiveRec, primitive.highlight_thickness),
Packit b099d7
     XmRCallProc, (XtPointer) _XmSetThickness
Packit b099d7
   },
Packit b099d7
};
Packit b099d7
Packit b099d7
/* Synthetic resources list */
Packit b099d7
Packit b099d7
static XmSyntheticResource syn_resources[] =
Packit b099d7
{
Packit b099d7
  {
Packit b099d7
     XmNshowAsDefault, sizeof (Dimension),
Packit b099d7
     XtOffsetOf(XmPushButtonRec, pushbutton.show_as_default),
Packit b099d7
     XmeFromHorizontalPixels,
Packit b099d7
     ShowAsDef_ToHorizPix
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
     XmNdefaultButtonShadowThickness, sizeof (Dimension),
Packit b099d7
     XtOffsetOf(XmPushButtonRec, pushbutton.default_button_shadow_thickness),
Packit b099d7
     XmeFromHorizontalPixels,  
Packit b099d7
     XmeToHorizontalPixels
Packit b099d7
  },
Packit b099d7
Packit b099d7
   {
Packit b099d7
     XmNhighlightThickness, sizeof (Dimension),
Packit b099d7
     XtOffsetOf(XmPrimitiveRec, primitive.highlight_thickness),
Packit b099d7
     ExportHighlightThickness,
Packit b099d7
     XmeToHorizontalPixels
Packit b099d7
   },
Packit b099d7
};
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *   Description:  global class record for instances of class: PushButton
Packit b099d7
 *   -----------
Packit b099d7
 *
Packit b099d7
 *   Defines default field settings for this class record.
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
static XmBaseClassExtRec       pushBBaseClassExtRec = {
Packit b099d7
    NULL,                                     /* Next extension       */
Packit b099d7
    NULLQUARK,                                /* record type XmQmotif */
Packit b099d7
    XmBaseClassExtVersion,                    /* version              */
Packit b099d7
    sizeof(XmBaseClassExtRec),                /* size                 */
Packit b099d7
    InitializePrehook,                        /* initialize prehook   */
Packit b099d7
    SetValuesPrehook,                         /* set_values prehook   */
Packit b099d7
    InitializePosthook,                       /* initialize posthook  */
Packit b099d7
    XmInheritSetValuesPosthook,               /* set_values posthook  */
Packit b099d7
    XmInheritClass,                           /* secondary class      */
Packit b099d7
    XmInheritSecObjectCreate,                 /* creation proc        */
Packit b099d7
    XmInheritGetSecResData,                   /* getSecResData        */
Packit b099d7
    {0},                                      /* fast subclass        */
Packit b099d7
    XmInheritGetValuesPrehook,                /* get_values prehook   */
Packit b099d7
    XmInheritGetValuesPosthook,               /* get_values posthook  */
Packit b099d7
    (XtWidgetClassProc)NULL,                  /* classPartInitPrehook */
Packit b099d7
    (XtWidgetClassProc)NULL,                  /* classPartInitPosthook*/
Packit b099d7
    NULL,                                     /* ext_resources        */
Packit b099d7
    NULL,                                     /* compiled_ext_resources*/
Packit b099d7
    0,                                        /* num_ext_resources    */
Packit b099d7
    FALSE,                                    /* use_sub_resources    */
Packit b099d7
    XmInheritWidgetNavigable,                 /* widgetNavigable      */
Packit b099d7
    XmInheritFocusChange,                     /* focusChange          */
Packit b099d7
};
Packit b099d7
Packit b099d7
externaldef(xmpushbuttonclassrec) XmPushButtonClassRec xmPushButtonClassRec = 
Packit b099d7
{
Packit b099d7
  { /* core_class record */	
Packit b099d7
    /* superclass	  */	(WidgetClass) &xmLabelClassRec,
Packit b099d7
    /* class_name	  */	"XmPushButton",
Packit b099d7
    /* widget_size	  */	sizeof(XmPushButtonRec),
Packit b099d7
    /* class_initialize   */    ClassInitialize,
Packit b099d7
    /* class_part_init    */    ClassPartInitialize,
Packit b099d7
    /* class_inited       */	FALSE,
Packit b099d7
    /* initialize	  */	Initialize,
Packit b099d7
    /* initialize_hook    */    (XtArgsProc)NULL,
Packit b099d7
    /* realize		  */	XtInheritRealize,
Packit b099d7
    /* actions		  */	actionsList,
Packit b099d7
    /* num_actions	  */	XtNumber(actionsList),
Packit b099d7
    /* resources	  */	resources,
Packit b099d7
    /* num_resources	  */	XtNumber(resources),
Packit b099d7
    /* xrm_class	  */	NULLQUARK,
Packit b099d7
    /* compress_motion	  */	TRUE,
Packit b099d7
    /* compress_exposure  */	XtExposeCompressMaximal,
Packit b099d7
    /* compress_enterlv   */    TRUE,
Packit b099d7
    /* visible_interest	  */	FALSE,
Packit b099d7
    /* destroy		  */	Destroy,
Packit b099d7
    /* resize		  */	Resize,
Packit b099d7
    /* expose		  */	Redisplay,
Packit b099d7
    /* set_values	  */	SetValues,
Packit b099d7
    /* set_values_hook    */    (XtArgsFunc)NULL,
Packit b099d7
    /* set_values_almost  */    XtInheritSetValuesAlmost,
Packit b099d7
    /* get_values_hook    */	(XtArgsProc)NULL,
Packit b099d7
    /* accept_focus	  */	(XtAcceptFocusProc)NULL,
Packit b099d7
    /* version            */	XtVersion,
Packit b099d7
    /* callback_private   */    NULL,
Packit b099d7
    /* tm_table           */    NULL,
Packit b099d7
    /* query_geometry     */	XtInheritQueryGeometry, 
Packit b099d7
    /* display_accelerator*/    (XtStringProc)NULL,
Packit b099d7
    /* extension record   */    (XtPointer)&pushBBaseClassExtRec,
Packit b099d7
  },
Packit b099d7
Packit b099d7
  { /* primitive_class record       */
Packit b099d7
    /* Primitive border_highlight   */	BorderHighlight,
Packit b099d7
    /* Primitive border_unhighlight */	BorderUnhighlight,
Packit b099d7
    /* translations		    */  XtInheritTranslations,
Packit b099d7
    /* arm_and_activate		    */  ArmAndActivate,
Packit b099d7
    /* get resources		    */  syn_resources,
Packit b099d7
    /* num get_resources	    */  XtNumber(syn_resources),
Packit b099d7
    /* extension		    */  NULL,
Packit b099d7
  },
Packit b099d7
Packit b099d7
  { /* label_class record */
Packit b099d7
    /* setOverrideCallback*/	XmInheritWidgetProc,
Packit b099d7
    /* menu procedures    */	XmInheritMenuProc,
Packit b099d7
    /* menu traversal xlation */ XtInheritTranslations,
Packit b099d7
    /* extension	  */	(XtPointer) NULL,
Packit b099d7
  },
Packit b099d7
Packit b099d7
  { /* pushbutton_class record */
Packit b099d7
    /* extension	  */	(XtPointer) NULL,
Packit b099d7
  }
Packit b099d7
};
Packit b099d7
Packit b099d7
Packit b099d7
externaldef(xmpushbuttonwidgetclass)
Packit b099d7
   WidgetClass xmPushButtonWidgetClass = (WidgetClass)&xmPushButtonClassRec;
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/* Activatable Trait record for pushButton */
Packit b099d7
static XmConst XmActivatableTraitRec pushButtonAT = 
Packit b099d7
{
Packit b099d7
  0,		/* version */
Packit b099d7
  ChangeCB,
Packit b099d7
};
Packit b099d7
Packit b099d7
/* Care visual Trait record for pushButton */
Packit b099d7
static XmConst XmCareVisualTraitRec pushButtonCVT = {
Packit b099d7
  0,		/* version */
Packit b099d7
  ParentVisualChanged,
Packit b099d7
};
Packit b099d7
Packit b099d7
/* TakesDefault Trait record for pushButton */
Packit b099d7
static XmConst XmTakesDefaultTraitRec pushButtonTDT = 
Packit b099d7
{
Packit b099d7
  0,		/* version */
Packit b099d7
  ShowAsDefault,
Packit b099d7
};
Packit b099d7
Packit b099d7
/* Menu Savvy trait record */
Packit b099d7
static XmMenuSavvyTraitRec MenuSavvyRecord = {
Packit b099d7
    /* version: */
Packit b099d7
    -1,
Packit b099d7
    NULL,
Packit b099d7
    NULL,
Packit b099d7
    NULL,
Packit b099d7
    _XmCBNameActivate,
Packit b099d7
};
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  Synthetic hooks
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
static XmImportOperator 
Packit b099d7
ShowAsDef_ToHorizPix(
Packit b099d7
        Widget widget,
Packit b099d7
        int offset,
Packit b099d7
        XtArgVal *value )
Packit b099d7
{
Packit b099d7
  XtArgVal        oldValue ;
Packit b099d7
  XmImportOperator returnVal ;
Packit b099d7
  
Packit b099d7
  oldValue = *value ;
Packit b099d7
  returnVal = XmeToHorizontalPixels (widget, offset, value) ;
Packit b099d7
  
Packit b099d7
  if (oldValue  &&  !*value)
Packit b099d7
    *value = (XtArgVal) 1;
Packit b099d7
Packit b099d7
  return (returnVal) ;
Packit b099d7
} 
Packit b099d7

Packit b099d7
static void 
Packit b099d7
ExportHighlightThickness(
Packit b099d7
        Widget widget,
Packit b099d7
        int offset,
Packit b099d7
        XtArgVal *value )
Packit b099d7
{
Packit b099d7
  XmPushButtonWidget pbw = (XmPushButtonWidget) widget;
Packit b099d7
  if (pbw->pushbutton.show_as_default ||
Packit b099d7
      pbw->pushbutton.default_button_shadow_thickness)
Packit b099d7
    {
Packit b099d7
      if ((int)*value >= Xm3D_ENHANCE_PIXEL)
Packit b099d7
	*value -= Xm3D_ENHANCE_PIXEL;
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  XmeFromHorizontalPixels (widget, offset, value);
Packit b099d7
}
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  ClassInitialize 
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
static void 
Packit b099d7
ClassInitialize( void )
Packit b099d7
{
Packit b099d7
  /* parse the various translation tables */
Packit b099d7
  menu_parsed    = XtParseTranslationTable(menuTranslations);
Packit b099d7
  default_parsed = XtParseTranslationTable(defaultTranslations);
Packit b099d7
  
Packit b099d7
  /* set up base class extension quark */
Packit b099d7
  pushBBaseClassExtRec.record_type = XmQmotif;
Packit b099d7
}
Packit b099d7

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
static void 
Packit b099d7
ClassPartInitialize(
Packit b099d7
        WidgetClass wc )
Packit b099d7
{
Packit b099d7
  _XmFastSubclassInit (wc, XmPUSH_BUTTON_BIT);
Packit b099d7
  
Packit b099d7
  /* Install the menu savvy trait record,  copying fields from XmLabel */
Packit b099d7
  _XmLabelCloneMenuSavvy (wc, &MenuSavvyRecord);
Packit b099d7
Packit b099d7
  /* Install the activatable trait for all subclasses */
Packit b099d7
  XmeTraitSet((XtPointer) wc, XmQTactivatable, (XtPointer) &pushButtonAT);
Packit b099d7
  
Packit b099d7
  /* Install the takesDefault trait for all subclasses */
Packit b099d7
  XmeTraitSet((XtPointer) wc, XmQTtakesDefault, (XtPointer) &pushButtonTDT);
Packit b099d7
Packit b099d7
  /* Override primitive's careParentVisual trait for all subclasses. */
Packit b099d7
  XmeTraitSet((XtPointer) wc, XmQTcareParentVisual, (XtPointer)&pushButtonCVT);
Packit b099d7
}
Packit b099d7

Packit b099d7
/************************************************************
Packit b099d7
 *
Packit b099d7
 * InitializePrehook
Packit b099d7
 *
Packit b099d7
 * Put the proper translations in core_class tm_table so that
Packit b099d7
 * the data is massaged correctly
Packit b099d7
 *
Packit b099d7
 ************************************************************/
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void
Packit b099d7
InitializePrehook(
Packit b099d7
        Widget req,		/* unused */
Packit b099d7
        Widget new_w,
Packit b099d7
        ArgList args,		/* unused */
Packit b099d7
        Cardinal *num_args )	/* unused */
Packit b099d7
{
Packit b099d7
  XmPushButtonWidget bw = (XmPushButtonWidget) new_w;
Packit b099d7
  unsigned char type;
Packit b099d7
  XmMenuSystemTrait menuSTrait;
Packit b099d7
  
Packit b099d7
  menuSTrait = (XmMenuSystemTrait) 
Packit b099d7
    XmeTraitGet((XtPointer) XtClass(XtParent(new_w)), XmQTmenuSystem);
Packit b099d7
  
Packit b099d7
  _XmSaveCoreClassTranslations (new_w);
Packit b099d7
  
Packit b099d7
  if (menuSTrait != NULL)
Packit b099d7
    type = menuSTrait->type(XtParent(new_w));
Packit b099d7
  else 
Packit b099d7
    type = XmWORK_AREA;
Packit b099d7
  
Packit b099d7
  _XmProcessLock();
Packit b099d7
  if (type == XmMENU_PULLDOWN ||
Packit b099d7
      type == XmMENU_POPUP)
Packit b099d7
    new_w->core.widget_class->core_class.tm_table = (String) menu_parsed;
Packit b099d7
  else 
Packit b099d7
    new_w->core.widget_class->core_class.tm_table = (String) default_parsed;
Packit b099d7
  
Packit b099d7
  /* CR 2990: Use XmNbuttonFontList as the default font. */
Packit b099d7
  if (bw->label.font == NULL)
Packit b099d7
    bw->label.font = XmeGetDefaultRenderTable (new_w, XmBUTTON_FONTLIST);
Packit b099d7
  _XmProcessUnlock();
Packit b099d7
}
Packit b099d7

Packit b099d7
/************************************************************
Packit b099d7
 *
Packit b099d7
 * InitializePosthook
Packit b099d7
 *
Packit b099d7
 * restore core class translations
Packit b099d7
 *
Packit b099d7
 ************************************************************/
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void
Packit b099d7
InitializePosthook(
Packit b099d7
        Widget req,		/* unused */
Packit b099d7
        Widget new_w,
Packit b099d7
        ArgList args,		/* unused */
Packit b099d7
        Cardinal *num_args )	/* unused */
Packit b099d7
{
Packit b099d7
  _XmRestoreCoreClassTranslations (new_w);
Packit b099d7
}
Packit b099d7

Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  GetFillGC
Packit b099d7
 *     Get the graphics context used for filling in background of button.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
static void 
Packit b099d7
GetFillGC(
Packit b099d7
        XmPushButtonWidget pb )
Packit b099d7
{
Packit b099d7
  XGCValues values;
Packit b099d7
  XtGCMask  valueMask;
Packit b099d7
  
Packit b099d7
  valueMask = GCForeground | GCBackground | GCFillStyle;
Packit b099d7
  
Packit b099d7
  values.foreground = pb->pushbutton.arm_color;
Packit b099d7
  values.background = pb->core.background_pixel;
Packit b099d7
  values.fill_style = FillSolid;
Packit b099d7
  
Packit b099d7
  pb->pushbutton.fill_gc = XtGetGC ((Widget) pb, valueMask, &values);
Packit b099d7
}
Packit b099d7

Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  GetBackgroundGC
Packit b099d7
 *     Get the graphics context used for filling in background of 
Packit b099d7
 *     the pushbutton when not armed.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
static void 
Packit b099d7
GetBackgroundGC(
Packit b099d7
        XmPushButtonWidget pb )
Packit b099d7
{
Packit b099d7
  XGCValues       values;
Packit b099d7
  XtGCMask        valueMask;
Packit b099d7
  XFontStruct     *fs;
Packit b099d7
  
Packit b099d7
  valueMask = GCForeground | GCBackground | GCFont | GCGraphicsExposures;
Packit b099d7
  
Packit b099d7
  values.foreground = pb->core.background_pixel;
Packit b099d7
  values.background = pb->primitive.foreground;
Packit b099d7
  values.graphics_exposures = False;
Packit b099d7
  
Packit b099d7
  if (XmeRenderTableGetDefaultFont(pb->label.font, &fs))
Packit b099d7
    values.font = fs->fid;
Packit b099d7
  else
Packit b099d7
    valueMask &= ~GCFont;
Packit b099d7
  
Packit b099d7
  /* add background_pixmap to GC */
Packit b099d7
  if (pb->core.background_pixmap != XmUNSPECIFIED_PIXMAP)
Packit b099d7
    {
Packit b099d7
      values.tile = pb->core.background_pixmap;
Packit b099d7
      values.fill_style = FillTiled;
Packit b099d7
      valueMask |= (GCTile | GCFillStyle);
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  pb->pushbutton.background_gc = XtGetGC ((Widget) pb,valueMask,&values);
Packit b099d7
}
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  Initialize 
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
  XmPushButtonWidget request = (XmPushButtonWidget) rw ;
Packit b099d7
  XmPushButtonWidget new_w = (XmPushButtonWidget) nw ;
Packit b099d7
  int		     increase;	
Packit b099d7
  int		     adjustment = 0;  
Packit b099d7
  XmDisplay dpy = (XmDisplay) XmGetXmDisplay(XtDisplay(new_w));
Packit b099d7
  Boolean etched_in = dpy->display.enable_etched_in_menu;
Packit b099d7
  
Packit b099d7
  if (new_w->pushbutton.multiClick == XmINVALID_MULTICLICK)
Packit b099d7
    {
Packit b099d7
      if (Lab_IsMenupane(new_w))
Packit b099d7
	new_w->pushbutton.multiClick = XmMULTICLICK_DISCARD;
Packit b099d7
      else
Packit b099d7
	new_w->pushbutton.multiClick = XmMULTICLICK_KEEP;
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  /* if menuProcs is not set up yet, try again */
Packit b099d7
  _XmProcessLock();
Packit b099d7
  if (xmLabelClassRec.label_class.menuProcs == NULL)
Packit b099d7
    xmLabelClassRec.label_class.menuProcs =
Packit b099d7
      (XmMenuProc) _XmGetMenuProcContext();
Packit b099d7
  _XmProcessUnlock();
Packit b099d7
  
Packit b099d7
  /*
Packit b099d7
   * Fix to introduce Resource XmNdefaultBorderWidth and compatibility
Packit b099d7
   *  variable.
Packit b099d7
   *  if defaultBorderWidth > 0, the program knows about this resource
Packit b099d7
   *  and is therefore a Motif 1.1 program; otherwise it is a Motif 1.0
Packit b099d7
   *      program and old semantics of XmNshowAsDefault prevails.
Packit b099d7
   */
Packit b099d7
  if (new_w->pushbutton.default_button_shadow_thickness > 0)
Packit b099d7
    new_w->pushbutton.compatible = False;
Packit b099d7
  else 
Packit b099d7
    new_w->pushbutton.compatible = True;
Packit b099d7
  
Packit b099d7
  /*
Packit b099d7
   * showAsDefault as boolean if compatibility is false (Motif 1.1) else
Packit b099d7
   *  treat it to indicate the thickness of defaultButtonShadow.
Packit b099d7
   */
Packit b099d7
  if (new_w->pushbutton.compatible)
Packit b099d7
    new_w->pushbutton.default_button_shadow_thickness =
Packit b099d7
      new_w->pushbutton.show_as_default;
Packit b099d7
  
Packit b099d7
#ifdef DEFAULT_GLYPH_PIXMAP
Packit b099d7
  if (_XmGetDefaultGlyphPixmap(XtScreen(nw), NULL, NULL) != 
Packit b099d7
      XmUNSPECIFIED_PIXMAP) 
Packit b099d7
    {
Packit b099d7
      new_w->pushbutton.compatible = False;
Packit b099d7
      new_w->pushbutton.default_button_shadow_thickness = 0 ;
Packit b099d7
    }
Packit b099d7
#endif
Packit b099d7
  
Packit b099d7
  new_w->pushbutton.armed = FALSE;
Packit b099d7
  new_w->pushbutton.timer = 0;
Packit b099d7
  
Packit b099d7
  /* No unarm_pixmap but do have an arm_pixmap, use that. */
Packit b099d7
  if ((new_w->label.pixmap == XmUNSPECIFIED_PIXMAP) &&
Packit b099d7
      (new_w->pushbutton.arm_pixmap != XmUNSPECIFIED_PIXMAP))
Packit b099d7
    {
Packit b099d7
      XtWidgetProc resize;
Packit b099d7
      new_w->label.pixmap = new_w->pushbutton.arm_pixmap;
Packit b099d7
      if (request->core.width == 0)
Packit b099d7
	new_w->core.width = 0;
Packit b099d7
      if (request->core.height == 0)
Packit b099d7
	new_w->core.height = 0;
Packit b099d7
      
Packit b099d7
      _XmCalcLabelDimensions(nw);
Packit b099d7
      _XmProcessLock();
Packit b099d7
      resize = xmLabelClassRec.core_class.resize;
Packit b099d7
      _XmProcessUnlock();
Packit b099d7
      (* resize) ((Widget) new_w);
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
    if ((new_w->label.label_type == XmPIXMAP ||
Packit b099d7
       new_w->label.label_type == XmPIXMAP_AND_STRING) &&
Packit b099d7
       (new_w->pushbutton.arm_pixmap != XmUNSPECIFIED_PIXMAP))
Packit b099d7
    {
Packit b099d7
      if (request->core.width == 0)
Packit b099d7
	new_w->core.width = 0;
Packit b099d7
      if (request->core.height == 0)
Packit b099d7
	new_w->core.height = 0;
Packit b099d7
      SetPushButtonSize(new_w);
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  new_w->pushbutton.unarm_pixmap = new_w->label.pixmap;
Packit b099d7
  
Packit b099d7
  if (new_w->pushbutton.default_button_shadow_thickness)
Packit b099d7
    {
Packit b099d7
      /*
Packit b099d7
       * Special hack for 3d enhancement of location cursor highlight.
Packit b099d7
       *  - Make the box bigger. During drawing of location cursor
Packit b099d7
       *    make it smaller.  See in Primitive.c
Packit b099d7
       *  Maybe we should use the macro: G_HighLightThickness(pbgadget);
Packit b099d7
       */
Packit b099d7
      new_w->primitive.highlight_thickness += Xm3D_ENHANCE_PIXEL;
Packit b099d7
      adjustment = Xm3D_ENHANCE_PIXEL;
Packit b099d7
      increase =  (2 * new_w->pushbutton.default_button_shadow_thickness +
Packit b099d7
		   new_w->primitive.shadow_thickness + adjustment);
Packit b099d7
      
Packit b099d7
      /* Add the increase to the core to compensate for extra space */
Packit b099d7
      if (increase != 0)
Packit b099d7
	{
Packit b099d7
	  Lab_MarginLeft(new_w) += increase;
Packit b099d7
	  Lab_MarginRight(new_w) += increase;
Packit b099d7
	  Lab_TextRect_x(new_w) += increase ;
Packit b099d7
	  new_w->core.width += (increase << 1);
Packit b099d7
	  
Packit b099d7
	  Lab_MarginTop(new_w) += increase;
Packit b099d7
	  Lab_MarginBottom(new_w) += increase;
Packit b099d7
	  Lab_TextRect_y(new_w) += increase ;
Packit b099d7
	  new_w->core.height += (increase << 1);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if (Lab_IsMenupane(new_w))
Packit b099d7
    {
Packit b099d7
      new_w->primitive.traversal_on = TRUE;
Packit b099d7
    }  
Packit b099d7
Packit b099d7
  if (etched_in || !Lab_IsMenupane(new_w)) {
Packit b099d7
      /* Initialize GCs for fill and background */
Packit b099d7
      GetFillGC (new_w);
Packit b099d7
      GetBackgroundGC (new_w);
Packit b099d7
  }
Packit b099d7
  
Packit b099d7
}
Packit b099d7

Packit b099d7
#ifdef DEFAULT_GLYPH_PIXMAP
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * DrawDefaultGlyphPixmap (pb)
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void 
Packit b099d7
DrawDefaultGlyphPixmap(
Packit b099d7
        XmPushButtonWidget pb )
Packit b099d7
{ 
Packit b099d7
  int dx, dy, width, height ;
Packit b099d7
  Pixmap def_pixmap ;
Packit b099d7
  unsigned int def_pixmap_width, def_pixmap_height ;
Packit b099d7
  
Packit b099d7
  def_pixmap = _XmGetDefaultGlyphPixmap(XtScreen((Widget)(pb)), 
Packit b099d7
					&def_pixmap_width, 
Packit b099d7
					&def_pixmap_height) ;
Packit b099d7
  
Packit b099d7
  /* we draw in the margin right area here */
Packit b099d7
  dx = pb->core.width -
Packit b099d7
    (Lab_MarginRight(pb) + Lab_MarginWidth(pb) +
Packit b099d7
     pb->primitive.highlight_thickness + pb->primitive.shadow_thickness) ;
Packit b099d7
  dy = pb->primitive.highlight_thickness +
Packit b099d7
    pb->primitive.shadow_thickness + Lab_MarginTop(pb) + Lab_MarginHeight(pb) + 
Packit b099d7
      (MAX(Lab_TextRect_height(pb),
Packit b099d7
	   pb->label.acc_TextRect.height) - def_pixmap_height)/2;
Packit b099d7
  width = MIN(def_pixmap_width, Lab_MarginRight(pb));
Packit b099d7
  height = MIN(def_pixmap_height, 
Packit b099d7
	       MAX(Lab_TextRect_height(pb), pb->label.acc_TextRect.height));
Packit b099d7
  XCopyPlane (XtDisplay (pb), def_pixmap, XtWindow (pb),
Packit b099d7
	      pb->label.normal_GC, 0, 0, width, height, dx, dy, 1);
Packit b099d7
}
Packit b099d7
#endif /* DEFAULT_GLYPH_PIXMAP */
Packit b099d7

Packit b099d7
#ifdef DEFAULT_GLYPH_PIXMAP
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * EraseDefaultGlyphPixmap (pb)
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void 
Packit b099d7
EraseDefaultGlyphPixmap(
Packit b099d7
        XmPushButtonWidget pb )
Packit b099d7
{ 
Packit b099d7
  int dx, dy, width, height ;
Packit b099d7
  
Packit b099d7
  /* we clear the margin right area here */
Packit b099d7
  dx = pb->core.width -
Packit b099d7
    (Lab_MarginRight(pb) + Lab_MarginWidth(pb) +
Packit b099d7
     pb->primitive.highlight_thickness + pb->primitive.shadow_thickness) ;
Packit b099d7
  dy = pb->primitive.highlight_thickness +
Packit b099d7
    pb->primitive.shadow_thickness + Lab_MarginTop(pb) + Lab_MarginHeight(pb) ;
Packit b099d7
Packit b099d7
  width = Lab_MarginRight(pb) ;
Packit b099d7
  height = MAX(Lab_TextRect_height(pb), pb->label.acc_TextRect.height) ;
Packit b099d7
Packit b099d7
  XClearArea (XtDisplay (pb), XtWindow (pb),
Packit b099d7
	      dx, dy, width, height, False);
Packit b099d7
}
Packit b099d7
#endif /* DEFAULT_GLYPH_PIXMAP */
Packit b099d7

Packit b099d7
/*
Packit b099d7
 * EraseDefaultButtonShadow (pb)
Packit b099d7
 *  - Called from SetValues() - effort to optimize shadow drawing.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void 
Packit b099d7
EraseDefaultButtonShadow(
Packit b099d7
        XmPushButtonWidget pb )
Packit b099d7
{  
Packit b099d7
  int size, x, y, width, height, delta;
Packit b099d7
  XtEnum default_button_emphasis;
Packit b099d7
  
Packit b099d7
#ifdef DEFAULT_GLYPH_PIXMAP
Packit b099d7
  if (_XmGetDefaultGlyphPixmap(XtScreen((Widget)(pb)), NULL, NULL) != 
Packit b099d7
      XmUNSPECIFIED_PIXMAP) 
Packit b099d7
    {
Packit b099d7
      EraseDefaultGlyphPixmap( pb) ;
Packit b099d7
      return ;
Packit b099d7
    } 
Packit b099d7
#endif
Packit b099d7
Packit b099d7
  size = pb->pushbutton.default_button_shadow_thickness;
Packit b099d7
Packit b099d7
  if (size > 0) 
Packit b099d7
    { 
Packit b099d7
      XmDisplay xm_dpy = (XmDisplay) XmGetXmDisplay(XtDisplay(pb));
Packit b099d7
Packit b099d7
      default_button_emphasis = xm_dpy->display.default_button_emphasis;
Packit b099d7
Packit b099d7
      switch (default_button_emphasis)
Packit b099d7
	{
Packit b099d7
	case XmEXTERNAL_HIGHLIGHT:
Packit b099d7
	  delta = pb->primitive.highlight_thickness;
Packit b099d7
	  break;
Packit b099d7
Packit b099d7
	case XmINTERNAL_HIGHLIGHT:
Packit b099d7
	  delta = Xm3D_ENHANCE_PIXEL;
Packit b099d7
	  break;
Packit b099d7
Packit b099d7
	default:
Packit b099d7
	  assert(FALSE);
Packit b099d7
	  return;
Packit b099d7
	}
Packit b099d7
Packit b099d7
      size += Xm3D_ENHANCE_PIXEL;
Packit b099d7
      x = y = delta;
Packit b099d7
      width = pb->core.width - (2 * delta);
Packit b099d7
      height = pb->core.height - (2 * delta);
Packit b099d7
Packit b099d7
      FillBorderWithParentColor(pb, size, x, y, width, height);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7

Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  SetValuesPrehook
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static Boolean 
Packit b099d7
SetValuesPrehook(
Packit b099d7
        Widget cw,		/* unused */
Packit b099d7
        Widget rw,		/* unused */
Packit b099d7
        Widget nw,
Packit b099d7
        ArgList args,		/* unused */
Packit b099d7
        Cardinal *num_args )	/* unused */
Packit b099d7
{
Packit b099d7
  XmPushButtonWidget new_w = (XmPushButtonWidget) nw ;
Packit b099d7
  
Packit b099d7
  /* CR 2990: Use XmNbuttonFontList as the default font. */
Packit b099d7
  if (new_w->label.font == NULL)
Packit b099d7
    new_w->label.font = XmeGetDefaultRenderTable (nw, XmBUTTON_FONTLIST);
Packit b099d7
  
Packit b099d7
  return False;
Packit b099d7
}
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  SetValues(current, request, new_w)
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
  XmPushButtonWidget current = (XmPushButtonWidget) cw ;
Packit b099d7
  XmPushButtonWidget request = (XmPushButtonWidget) rw ;
Packit b099d7
  XmPushButtonWidget new_w = (XmPushButtonWidget) nw ;
Packit b099d7
  int increase;
Packit b099d7
  Boolean  flag = FALSE;    /* our return value */
Packit b099d7
  int adjustment;
Packit b099d7
  XmDisplay dpy = (XmDisplay) XmGetXmDisplay(XtDisplay(new_w));
Packit b099d7
  Boolean etched_in = dpy->display.enable_etched_in_menu;
Packit b099d7
  
Packit b099d7
  /*
Packit b099d7
   * Fix to introduce Resource XmNdefaultBorderWidth and compatibility
Packit b099d7
   *      variable.
Packit b099d7
   *  if the XmNdefaultBorderWidth resource in the current differ from the
Packit b099d7
   *  one in "new_w", then the programmer is setting this resource - so this
Packit b099d7
   *  is known to the programmer and hence it is a Motif1.1 program.
Packit b099d7
   *  If they are same then either it is a Motif 1.0 program or there has been
Packit b099d7
   *  no change in the resource (Motif 1.1 program). If it is a Motif 1.0 
Packit b099d7
   *  program, then we should copy the value of XmNshowAsDefault to the 
Packit b099d7
   *  XmNdefaultBorderWidth. If it is  Motif 1.1 program  (Compatible
Packit b099d7
   *  flag is false) - then we should not do the copy.
Packit b099d7
   *  This logic will maintain the semantics of the  XmNshowAsDefault of Motif
Packit b099d7
   *  1.0. For a full explanation see the Design architecture document.
Packit b099d7
   */
Packit b099d7
  
Packit b099d7
  if ((current->pushbutton.default_button_shadow_thickness) !=
Packit b099d7
      (new_w->pushbutton.default_button_shadow_thickness))
Packit b099d7
    new_w->pushbutton.compatible = False;
Packit b099d7
  
Packit b099d7
  if (new_w->pushbutton.compatible)
Packit b099d7
    new_w->pushbutton.default_button_shadow_thickness =
Packit b099d7
      new_w->pushbutton.show_as_default;
Packit b099d7
  
Packit b099d7
  adjustment = AdjustHighLightThickness (new_w, current);
Packit b099d7
  
Packit b099d7
  /*
Packit b099d7
   * Compute size change.
Packit b099d7
   */
Packit b099d7
  if (new_w->pushbutton.default_button_shadow_thickness != 
Packit b099d7
      current->pushbutton.default_button_shadow_thickness)
Packit b099d7
    {
Packit b099d7
      if (new_w->pushbutton.default_button_shadow_thickness > 
Packit b099d7
	  current->pushbutton.default_button_shadow_thickness)
Packit b099d7
	{
Packit b099d7
	  increase = (2 * new_w->pushbutton.default_button_shadow_thickness +
Packit b099d7
		      new_w->primitive.shadow_thickness);
Packit b099d7
	  if (current->pushbutton.default_button_shadow_thickness > 0)
Packit b099d7
            increase -=
Packit b099d7
	      (2 * current->pushbutton.default_button_shadow_thickness +
Packit b099d7
	       current->primitive.shadow_thickness);
Packit b099d7
	}
Packit b099d7
      else
Packit b099d7
	{
Packit b099d7
	  increase = -(2 * current->pushbutton.default_button_shadow_thickness +
Packit b099d7
		       current->primitive.shadow_thickness);
Packit b099d7
	  if (new_w->pushbutton.default_button_shadow_thickness > 0)
Packit b099d7
	    increase += (2 * new_w->pushbutton.default_button_shadow_thickness +
Packit b099d7
			 new_w->primitive.shadow_thickness);
Packit b099d7
	}
Packit b099d7
      
Packit b099d7
      increase += adjustment ;
Packit b099d7
      
Packit b099d7
      if (new_w->label.recompute_size || request->core.width == 0)
Packit b099d7
	{
Packit b099d7
	  Lab_MarginLeft(new_w) += increase;
Packit b099d7
	  Lab_MarginRight(new_w) += increase;
Packit b099d7
	  new_w->core.width += (increase << 1);
Packit b099d7
	  flag = TRUE;
Packit b099d7
	}
Packit b099d7
      else if (increase != 0)
Packit b099d7
	{ 
Packit b099d7
	  /* Add the change due to default button to the core */
Packit b099d7
	  Lab_MarginLeft(new_w) += increase;
Packit b099d7
	  Lab_MarginRight(new_w) += increase;
Packit b099d7
	  new_w->core.width += (increase << 1);
Packit b099d7
	  flag = TRUE;
Packit b099d7
	}
Packit b099d7
      
Packit b099d7
      if (new_w->label.recompute_size || request->core.height == 0)
Packit b099d7
	{
Packit b099d7
	  Lab_MarginTop(new_w) += increase;
Packit b099d7
	  Lab_MarginBottom(new_w) += increase;
Packit b099d7
	  new_w->core.height += (increase << 1);
Packit b099d7
	  flag = TRUE;
Packit b099d7
	}
Packit b099d7
      else if (increase != 0)
Packit b099d7
	{ 
Packit b099d7
	  /* Add the change due to default button to the core */
Packit b099d7
	  Lab_MarginTop(new_w) += increase;
Packit b099d7
	  Lab_MarginBottom(new_w) += increase;
Packit b099d7
	  new_w->core.height += (increase << 1);
Packit b099d7
	  flag = TRUE;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if ((new_w->pushbutton.arm_pixmap != current->pushbutton.arm_pixmap) &&
Packit b099d7
      (new_w->label.label_type == XmPIXMAP) && (new_w->pushbutton.armed)) 
Packit b099d7
    flag = TRUE;
Packit b099d7
  
Packit b099d7
  /* No unarm_pixmap but do have an arm_pixmap, use that. */
Packit b099d7
  if ((new_w->label.pixmap == XmUNSPECIFIED_PIXMAP) &&
Packit b099d7
      (new_w->pushbutton.arm_pixmap != XmUNSPECIFIED_PIXMAP))
Packit b099d7
    {
Packit b099d7
      XtWidgetProc resize;
Packit b099d7
      new_w->label.pixmap = new_w->pushbutton.arm_pixmap;
Packit b099d7
      if (new_w->label.recompute_size &&
Packit b099d7
          request->core.width == current->core.width)
Packit b099d7
	new_w->core.width = 0;
Packit b099d7
      if (new_w->label.recompute_size &&
Packit b099d7
          request->core.height == current->core.height)
Packit b099d7
	new_w->core.width = 0;
Packit b099d7
      
Packit b099d7
      _XmCalcLabelDimensions(nw);
Packit b099d7
      _XmProcessLock();
Packit b099d7
      resize = xmLabelClassRec.core_class.resize;
Packit b099d7
      _XmProcessUnlock();
Packit b099d7
      (* resize) ((Widget) new_w);
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if (new_w->label.pixmap != current->label.pixmap)
Packit b099d7
    {
Packit b099d7
      new_w->pushbutton.unarm_pixmap = new_w->label.pixmap;
Packit b099d7
      if ((new_w->label.label_type == XmPIXMAP) && (!new_w->pushbutton.armed))
Packit b099d7
	flag = TRUE;
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if ((new_w->label.label_type == XmPIXMAP ||
Packit b099d7
      new_w->label.label_type == XmPIXMAP_AND_STRING) &&
Packit b099d7
      (new_w->pushbutton.arm_pixmap != current->pushbutton.arm_pixmap))
Packit b099d7
    {
Packit b099d7
      if ((new_w->label.recompute_size))
Packit b099d7
	{
Packit b099d7
          if (request->core.width == current->core.width)
Packit b099d7
	    new_w->core.width = 0;
Packit b099d7
          if (request->core.height == current->core.height)
Packit b099d7
	    new_w->core.height = 0;
Packit b099d7
	}
Packit b099d7
      SetPushButtonSize(new_w);
Packit b099d7
      flag = TRUE;
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if ((new_w->pushbutton.fill_on_arm != current->pushbutton.fill_on_arm) &&
Packit b099d7
      (new_w->pushbutton.armed == TRUE))
Packit b099d7
    flag = TRUE;
Packit b099d7
  
Packit b099d7
Packit b099d7
  if (! Lab_IsMenupane(new_w) || etched_in) {
Packit b099d7
      /*  See if the GC need to be regenerated and widget redrawn.  */
Packit b099d7
      if (new_w->pushbutton.arm_color != current->pushbutton.arm_color)
Packit b099d7
	{
Packit b099d7
	    if (new_w->pushbutton.armed) flag = TRUE;  /* see PIR 5091 */
Packit b099d7
	    XtReleaseGC ((Widget) new_w, new_w->pushbutton.fill_gc);
Packit b099d7
	    GetFillGC (new_w);
Packit b099d7
	}
Packit b099d7
      
Packit b099d7
      if (new_w->core.background_pixel != current->core.background_pixel ||
Packit b099d7
	  (new_w->core.background_pixmap != XmUNSPECIFIED_PIXMAP &&
Packit b099d7
	   new_w->core.background_pixmap != current->core.background_pixmap))
Packit b099d7
	{
Packit b099d7
	    flag = TRUE;  /* label will cause redisplay anyway */
Packit b099d7
	    XtReleaseGC ((Widget) new_w, new_w->pushbutton.background_gc);
Packit b099d7
	    GetBackgroundGC (new_w);
Packit b099d7
	}
Packit b099d7
  }
Packit b099d7
  
Packit b099d7
  /* OSF Fix pir 3469 */
Packit b099d7
  if (flag == False && XtIsRealized((Widget)new_w))
Packit b099d7
    {
Packit b099d7
      /* Size is unchanged - optimize the shadow drawing  */
Packit b099d7
      if ((current->pushbutton.show_as_default != 0) &&
Packit b099d7
	  (new_w->pushbutton.show_as_default == 0))
Packit b099d7
	EraseDefaultButtonShadow (new_w);
Packit b099d7
      
Packit b099d7
      if ((current->pushbutton.show_as_default == 0) &&
Packit b099d7
	  (new_w->pushbutton.show_as_default != 0))
Packit b099d7
	DrawDefaultButtonShadows (new_w);
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  return flag;
Packit b099d7
}
Packit b099d7

Packit b099d7
/**************************************************************************
Packit b099d7
 *
Packit b099d7
 * Resize(w)
Packit b099d7
 *
Packit b099d7
 **************************************************************************/
Packit b099d7
Packit b099d7
static void 
Packit b099d7
Resize(
Packit b099d7
        Widget w )
Packit b099d7
{
Packit b099d7
  register XmPushButtonWidget tb = (XmPushButtonWidget) w;
Packit b099d7
Packit b099d7
  if (Lab_IsPixmap(w) || Lab_IsPixmapAndText(w)) 
Packit b099d7
    SetPushButtonSize((XmPushButtonWidget) tb);
Packit b099d7
  else {
Packit b099d7
    XtWidgetProc    resize;
Packit b099d7
    _XmProcessLock();
Packit b099d7
    resize = xmLabelClassRec.core_class.resize;
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
    (* resize)((Widget) tb);
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
  XmPushButtonWidget pb = (XmPushButtonWidget) w ;
Packit b099d7
  XmDisplay dpy = (XmDisplay) XmGetXmDisplay(XtDisplay(w));
Packit b099d7
  Boolean etched_in = dpy->display.enable_etched_in_menu;
Packit b099d7
Packit b099d7
  if (pb->pushbutton.timer)
Packit b099d7
    XtRemoveTimeOut (pb->pushbutton.timer);
Packit b099d7
  
Packit b099d7
  if (!Lab_IsMenupane(pb) || etched_in) {
Packit b099d7
    XtReleaseGC ((Widget) pb, pb->pushbutton.fill_gc);
Packit b099d7
    XtReleaseGC ((Widget) pb, pb->pushbutton.background_gc);
Packit b099d7
  }
Packit b099d7
}
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  Redisplay (pb, event, region)
Packit b099d7
 *   Completely rewritten to accommodate defaultButtonShadowThickness
Packit b099d7
 *   Description:
Packit b099d7
 *   -----------
Packit b099d7
 *     Cause the widget, identified by pb, to be redisplayed.
Packit b099d7
 *     If XmNfillOnArm is True and the pushbutton is not in a menu,
Packit b099d7
 *     the background will be filled with XmNarmColor.
Packit b099d7
 *     If XmNinvertOnArm is True and XmNLabelType is XmPIXMAP,
Packit b099d7
 *     XmNarmPixmap will be used in the label.
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
Redisplay(
Packit b099d7
        Widget wid,
Packit b099d7
        XEvent *event,
Packit b099d7
        Region region )
Packit b099d7
{
Packit b099d7
  XmPushButtonWidget pb = (XmPushButtonWidget) wid ;
Packit b099d7
  
Packit b099d7
  if (XtIsRealized((Widget)pb))
Packit b099d7
    { 
Packit b099d7
      if (Lab_IsMenupane(pb))
Packit b099d7
	{
Packit b099d7
	  DrawPushButtonLabel (pb, event, region);	
Packit b099d7
	  
Packit b099d7
	  /* CR 5991:  Refresh border highlight too. */
Packit b099d7
	  if (pb->pushbutton.armed)
Packit b099d7
	    (*(((XmPushButtonWidgetClass) XtClass (pb))
Packit b099d7
	       ->primitive_class.border_highlight)) ((Widget) pb) ;
Packit b099d7
	}
Packit b099d7
      else
Packit b099d7
	{ 
Packit b099d7
	  DrawPushButtonBackground (pb);
Packit b099d7
	  DrawPushButtonLabel (pb, event, region);
Packit b099d7
	  DrawPushButtonShadows (pb);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
}
Packit b099d7

Packit b099d7
/*
Packit b099d7
 * DrawPushButtonBackground ()
Packit b099d7
 *  - Compute the area allocated to the pushbutton and fill it with
Packit b099d7
 *    the background or the fill gc;
Packit b099d7
 */ 
Packit b099d7
Packit b099d7
static void 
Packit b099d7
DrawPushButtonBackground(
Packit b099d7
        XmPushButtonWidget pb )
Packit b099d7
{
Packit b099d7
  XRectangle box;
Packit b099d7
  GC  tmp_gc;
Packit b099d7
Packit b099d7
  ComputePBLabelArea (pb, &box);
Packit b099d7
  
Packit b099d7
  if ((pb->pushbutton.armed) && (pb->pushbutton.fill_on_arm))
Packit b099d7
    tmp_gc = pb->pushbutton.fill_gc;
Packit b099d7
  else
Packit b099d7
    tmp_gc = pb->pushbutton.background_gc;
Packit b099d7
  /* really need to fill with background if not armed ? */
Packit b099d7
Packit b099d7
  if (tmp_gc)
Packit b099d7
    XFillRectangle (XtDisplay(pb), XtWindow(pb), tmp_gc,
Packit b099d7
		    box.x, box.y, box.width, box.height);
Packit b099d7
}
Packit b099d7

Packit b099d7
/*
Packit b099d7
 * DrawPushButtonLabel (pb, event, region)
Packit b099d7
 * Draw the label contained in the pushbutton.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void 
Packit b099d7
DrawPushButtonLabel(
Packit b099d7
        XmPushButtonWidget pb,
Packit b099d7
        XEvent *event,
Packit b099d7
        Region region )
Packit b099d7
{  
Packit b099d7
  GC tmp_gc = NULL;
Packit b099d7
  Boolean replaceGC = False;
Packit b099d7
  Boolean replaceBg = False;
Packit b099d7
  Boolean deadjusted = False;
Packit b099d7
  XmDisplay dpy = (XmDisplay) XmGetXmDisplay(XtDisplay(pb));
Packit b099d7
  Boolean etched_in = dpy->display.enable_etched_in_menu;
Packit b099d7
Packit b099d7
  if (pb->pushbutton.armed &&
Packit b099d7
      ((! Lab_IsMenupane(pb) && pb->pushbutton.fill_on_arm) ||
Packit b099d7
       (Lab_IsMenupane(pb) && etched_in)))
Packit b099d7
    {
Packit b099d7
      XSetWindowBackground(XtDisplay(pb), XtWindow(pb), pb->pushbutton.arm_color);
Packit b099d7
      replaceBg = True;
Packit b099d7
      if ((pb->label.label_type == XmSTRING ||
Packit b099d7
           pb->label.label_type == XmPIXMAP_AND_STRING) && 
Packit b099d7
	  (pb->pushbutton.arm_color == pb->primitive.foreground))
Packit b099d7
	{
Packit b099d7
	  tmp_gc = pb->label.normal_GC;
Packit b099d7
	  pb->label.normal_GC = pb->pushbutton.background_gc;
Packit b099d7
	  replaceGC = True;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if (pb->label.label_type == XmPIXMAP ||
Packit b099d7
     pb->label.label_type == XmPIXMAP_AND_STRING)
Packit b099d7
    {
Packit b099d7
	if (pb->pushbutton.armed)
Packit b099d7
	  {
Packit b099d7
	      if (pb->pushbutton.arm_pixmap != XmUNSPECIFIED_PIXMAP)
Packit b099d7
		  pb->label.pixmap = pb->pushbutton.arm_pixmap;
Packit b099d7
	      else
Packit b099d7
		  pb->label.pixmap = pb->pushbutton.unarm_pixmap;
Packit b099d7
	  }
Packit b099d7
	else   /* pushbutton is unarmed */
Packit b099d7
	    pb->label.pixmap = pb->pushbutton.unarm_pixmap;
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  /*
Packit b099d7
   * Temporarily remove the Xm3D_ENHANCE_PIXEL hack ("adjustment")
Packit b099d7
   *           from the margin values, so we don't confuse Label.
Packit b099d7
   */
Packit b099d7
  if (pb->pushbutton.default_button_shadow_thickness > 0)
Packit b099d7
    { 
Packit b099d7
	deadjusted = True;
Packit b099d7
	Lab_MarginLeft(pb) -= Xm3D_ENHANCE_PIXEL;
Packit b099d7
	Lab_MarginRight(pb) -= Xm3D_ENHANCE_PIXEL;
Packit b099d7
	Lab_MarginTop(pb) -= Xm3D_ENHANCE_PIXEL;
Packit b099d7
	Lab_MarginBottom(pb) -= Xm3D_ENHANCE_PIXEL;
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
    {
Packit b099d7
	XtExposeProc expose;
Packit b099d7
	_XmProcessLock();
Packit b099d7
	expose = xmLabelClassRec.core_class.expose;
Packit b099d7
	_XmProcessUnlock();
Packit b099d7
	(* expose) ((Widget) pb, event, region) ;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  if (deadjusted)
Packit b099d7
    {
Packit b099d7
	Lab_MarginLeft(pb) += Xm3D_ENHANCE_PIXEL;
Packit b099d7
	Lab_MarginRight(pb) += Xm3D_ENHANCE_PIXEL;
Packit b099d7
	Lab_MarginTop(pb) += Xm3D_ENHANCE_PIXEL;
Packit b099d7
	Lab_MarginBottom(pb) += Xm3D_ENHANCE_PIXEL;
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if (replaceGC)
Packit b099d7
      pb->label.normal_GC = tmp_gc;    
Packit b099d7
  if (replaceBg) {
Packit b099d7
      XSetWindowBackground(XtDisplay(pb), XtWindow(pb), XtBackground(pb));
Packit b099d7
      if (pb->core.background_pixmap != XmUNSPECIFIED_PIXMAP) {
Packit b099d7
          XSetWindowBackgroundPixmap(XtDisplay(pb), XtWindow(pb),
Packit b099d7
	      pb->core.background_pixmap);
Packit b099d7
      }
Packit b099d7
  }
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 * DrawPushButtonShadows()
Packit b099d7
 *  Note: PushButton has two types of shadows: primitive-shadow and
Packit b099d7
 *	default-button-shadow.
Packit b099d7
 *  If pushbutton is in a menu only primitive shadows are drawn.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void 
Packit b099d7
DrawPushButtonShadows(
Packit b099d7
        XmPushButtonWidget pb )
Packit b099d7
{
Packit b099d7
  XRectangle box;
Packit b099d7
  XtEnum default_button_emphasis;
Packit b099d7
  int adjust;
Packit b099d7
  XmDisplay xm_dpy = (XmDisplay) XmGetXmDisplay(XtDisplay(pb));
Packit b099d7
Packit b099d7
  default_button_emphasis = xm_dpy->display.default_button_emphasis;
Packit b099d7
Packit b099d7
  switch (default_button_emphasis)
Packit b099d7
    {
Packit b099d7
    case XmEXTERNAL_HIGHLIGHT:
Packit b099d7
      adjust = (pb->primitive.highlight_thickness -
Packit b099d7
		(pb->pushbutton.default_button_shadow_thickness ? 
Packit b099d7
		 Xm3D_ENHANCE_PIXEL : 0));
Packit b099d7
      break;
Packit b099d7
Packit b099d7
    case XmINTERNAL_HIGHLIGHT:
Packit b099d7
      adjust = 0;
Packit b099d7
      break;
Packit b099d7
Packit b099d7
    default:
Packit b099d7
      assert(FALSE);
Packit b099d7
      return;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  /* Clear the area not occupied by label with parents background color. */
Packit b099d7
  /* Label will invoke BorderUnhighlight() on the highlight_thickness	 */
Packit b099d7
  /* area, which is redundant when XmEXTERNAL_HIGHLIGHT default button	 */
Packit b099d7
  /* shadow emphasis is used.						 */
Packit b099d7
Packit b099d7
  ComputePBLabelArea (pb, &box);
Packit b099d7
  if (box.x > adjust)
Packit b099d7
    {
Packit b099d7
      FillBorderWithParentColor(pb, 
Packit b099d7
				box.x - adjust, 
Packit b099d7
				adjust, 
Packit b099d7
				adjust,
Packit b099d7
				pb->core.width - 2 * adjust,
Packit b099d7
				pb->core.height - 2 * adjust);
Packit b099d7
Packit b099d7
      switch (default_button_emphasis)
Packit b099d7
	{
Packit b099d7
	case XmINTERNAL_HIGHLIGHT:
Packit b099d7
	  /* The call above erases the border highlighting. */
Packit b099d7
	  if (pb->primitive.highlight_drawn)
Packit b099d7
	    (*(((XmPushButtonWidgetClass) XtClass (pb))
Packit b099d7
	       ->primitive_class.border_highlight)) ((Widget) pb) ;
Packit b099d7
	  break;
Packit b099d7
Packit b099d7
	default:
Packit b099d7
	  break;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
  if (pb->pushbutton.default_button_shadow_thickness
Packit b099d7
#ifdef DEFAULT_GLYPH_PIXMAP
Packit b099d7
      || (_XmGetDefaultGlyphPixmap(XtScreen((Widget)pb), NULL, NULL) != 
Packit b099d7
	  XmUNSPECIFIED_PIXMAP) 
Packit b099d7
#endif
Packit b099d7
      ) 
Packit b099d7
    { 
Packit b099d7
      if (pb->pushbutton.show_as_default)
Packit b099d7
	DrawDefaultButtonShadows (pb);
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if (pb->primitive.shadow_thickness)
Packit b099d7
    DrawPBPrimitiveShadows (pb);
Packit b099d7
}
Packit b099d7

Packit b099d7
/*ARGSUSED*/
Packit b099d7
static Boolean 
Packit b099d7
ParentVisualChanged(Widget kid, 	       
Packit b099d7
		    Widget cur_parent,	/* unused */
Packit b099d7
		    Widget new_parent,	/* unused */
Packit b099d7
		    Mask visual_flag)
Packit b099d7
{
Packit b099d7
  XmPushButtonWidget pb = (XmPushButtonWidget) kid ;
Packit b099d7
Packit b099d7
  /* CR 9333: The primitive Redraw procedure only redraws the */
Packit b099d7
  /*	highighlight area, but push buttons needs to redraw the */
Packit b099d7
  /*	default button shadow emphasis area too. */  
Packit b099d7
Packit b099d7
  if (visual_flag & (VisualBackgroundPixel|VisualBackgroundPixmap)) 
Packit b099d7
    {
Packit b099d7
      XmPrimitiveClassRec* kid_class = (XmPrimitiveClassRec*) XtClass(kid);
Packit b099d7
Packit b099d7
      if (! XtIsRealized(kid)) return True;
Packit b099d7
Packit b099d7
      if (!pb->primitive.highlighted &&
Packit b099d7
	  kid_class->primitive_class.border_unhighlight)
Packit b099d7
	kid_class->primitive_class.border_unhighlight(kid);
Packit b099d7
Packit b099d7
      DrawPushButtonShadows(pb);
Packit b099d7
    }
Packit b099d7
Packit b099d7
  return False;
Packit b099d7
}
Packit b099d7

Packit b099d7
/*
Packit b099d7
 * ComputePBLabelArea()
Packit b099d7
 *	Compute the area allocated to the label of the pushbutton; 
Packit b099d7
 * fill in the dimensions in the box.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
ComputePBLabelArea(
Packit b099d7
        XmPushButtonWidget pb,
Packit b099d7
        XRectangle *box )
Packit b099d7
{   
Packit b099d7
  int dx, adjust;
Packit b099d7
  short fill = 0;
Packit b099d7
  
Packit b099d7
  if ((pb->pushbutton.arm_color == pb->primitive.top_shadow_color) ||
Packit b099d7
      (pb->pushbutton.arm_color == pb->primitive.bottom_shadow_color))
Packit b099d7
    fill = 1;
Packit b099d7
  
Packit b099d7
  if (pb->pushbutton.compatible)
Packit b099d7
    adjust = pb->pushbutton.show_as_default; 
Packit b099d7
  else
Packit b099d7
    adjust = pb->pushbutton.default_button_shadow_thickness; 
Packit b099d7
Packit b099d7
  if (adjust > 0) 
Packit b099d7
    { 
Packit b099d7
      adjust = adjust + pb->primitive.shadow_thickness;
Packit b099d7
      adjust = (adjust << 1);
Packit b099d7
      dx = pb->primitive.highlight_thickness + adjust + fill;
Packit b099d7
    }
Packit b099d7
  else
Packit b099d7
    dx = (pb->primitive.highlight_thickness + 
Packit b099d7
	  pb->primitive.shadow_thickness + fill);
Packit b099d7
  
Packit b099d7
  box->x = dx;
Packit b099d7
  box->y = dx;
Packit b099d7
  adjust = (dx << 1);
Packit b099d7
  box->width  = pb->core.width - adjust;
Packit b099d7
  box->height = pb->core.height - adjust;
Packit b099d7
}
Packit b099d7
	
Packit b099d7
/*
Packit b099d7
 * DrawPBPrimitiveShadow (pb)
Packit b099d7
 *   - Should be called only if PrimitiveShadowThickness > 0 
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void 
Packit b099d7
DrawPBPrimitiveShadows(
Packit b099d7
        XmPushButtonWidget pb )
Packit b099d7
{
Packit b099d7
  GC top_gc, bottom_gc;
Packit b099d7
  int dx, adjust, shadow_thickness;
Packit b099d7
Packit b099d7
  if (pb->pushbutton.armed)
Packit b099d7
    {
Packit b099d7
      bottom_gc = pb->primitive.top_shadow_GC;
Packit b099d7
      top_gc = pb->primitive.bottom_shadow_GC;
Packit b099d7
    }
Packit b099d7
  else 
Packit b099d7
    { 
Packit b099d7
      bottom_gc = pb->primitive.bottom_shadow_GC;
Packit b099d7
      top_gc = pb->primitive.top_shadow_GC;
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  
Packit b099d7
  shadow_thickness = pb->primitive.shadow_thickness;
Packit b099d7
  /*
Packit b099d7
   * This might have to be modified.
Packit b099d7
   *  - this is where dependency on compatibility with 1.0
Packit b099d7
   *    and defaultButtonShadowThickness etc. will showup.
Packit b099d7
   *  NOTE: defaultButtonShadowThickness is not supported in 
Packit b099d7
   *   RowColumn children.
Packit b099d7
   *  1. Compute (x,y,width,height) for the rectangle within which
Packit b099d7
   *	  the shadow is to be drawn.
Packit b099d7
   */
Packit b099d7
  
Packit b099d7
  if ((shadow_thickness > 0) && (top_gc) && (bottom_gc))
Packit b099d7
    { 
Packit b099d7
      if (pb->pushbutton.compatible)
Packit b099d7
	adjust = pb->pushbutton.show_as_default;
Packit b099d7
      else
Packit b099d7
	adjust = pb->pushbutton.default_button_shadow_thickness;
Packit b099d7
Packit b099d7
      if (adjust > 0)
Packit b099d7
	{ 
Packit b099d7
	  adjust = (adjust << 1);
Packit b099d7
	  dx = (pb->primitive.highlight_thickness + 
Packit b099d7
		adjust + pb->primitive.shadow_thickness);
Packit b099d7
	}
Packit b099d7
      else
Packit b099d7
	dx = pb->primitive.highlight_thickness ;
Packit b099d7
Packit b099d7
      /* CR 7115: Deal with degenerate cases. */
Packit b099d7
      if ((pb->core.width > 2 * dx) &&
Packit b099d7
	  (pb->core.height > 2 * dx))
Packit b099d7
	XmeDrawShadows (XtDisplay (pb), XtWindow (pb), top_gc, bottom_gc, 
Packit b099d7
			dx, dx, 
Packit b099d7
			pb->core.width - 2 * dx, 
Packit b099d7
			pb->core.height - 2 * dx, 
Packit b099d7
			shadow_thickness, XmSHADOW_OUT);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7

Packit b099d7
/*
Packit b099d7
 * DrawDefaultButtonShadows()
Packit b099d7
 *  - get the topShadowColor and bottomShadowColor from the parent;
Packit b099d7
 *    use those colors to construct top and bottom gc; use these
Packit b099d7
 *	  GCs to draw the shadows of the button.
Packit b099d7
 *  - Should not be called if pushbutton is in a row column or in a menu.
Packit b099d7
 *  - Should be called only if a defaultbuttonshadow is to be drawn.
Packit b099d7
 */      
Packit b099d7
Packit b099d7
static void 
Packit b099d7
DrawDefaultButtonShadows(
Packit b099d7
        XmPushButtonWidget pb )
Packit b099d7
{
Packit b099d7
  GC	 top_gc, bottom_gc;
Packit b099d7
  int	 default_button_shadow_thickness;
Packit b099d7
  int	 x, y, width, height, delta;
Packit b099d7
  Widget parent;
Packit b099d7
  XtEnum default_button_emphasis;
Packit b099d7
  XmDisplay xm_dpy;
Packit b099d7
  
Packit b099d7
  if (pb->pushbutton.compatible && 
Packit b099d7
      (pb->pushbutton.show_as_default == 0))
Packit b099d7
    return;
Packit b099d7
  
Packit b099d7
#ifdef DEFAULT_GLYPH_PIXMAP
Packit b099d7
  if (_XmGetDefaultGlyphPixmap(XtScreen((Widget)(pb)), NULL, NULL) != 
Packit b099d7
      XmUNSPECIFIED_PIXMAP) 
Packit b099d7
    {
Packit b099d7
      DrawDefaultGlyphPixmap( pb) ;
Packit b099d7
      return ;
Packit b099d7
    } 
Packit b099d7
#endif
Packit b099d7
  
Packit b099d7
  if (!pb->pushbutton.compatible &&
Packit b099d7
      (pb->pushbutton.default_button_shadow_thickness == 0))
Packit b099d7
    return ;
Packit b099d7
  
Packit b099d7
  /*
Packit b099d7
   * May need more complex computation for getting the GCs.
Packit b099d7
   */
Packit b099d7
  parent = XtParent(pb);
Packit b099d7
  if (XmIsManager(parent)) 
Packit b099d7
    {  
Packit b099d7
      /* CR 5894:  Use the parent's GC so monochrome works. */
Packit b099d7
      bottom_gc = XmParentTopShadowGC(pb);
Packit b099d7
      top_gc = XmParentBottomShadowGC(pb);
Packit b099d7
    }
Packit b099d7
  else
Packit b099d7
    { 
Packit b099d7
      /* Use your own pixel for drawing. */
Packit b099d7
      bottom_gc = pb->primitive.top_shadow_GC;
Packit b099d7
      top_gc = pb->primitive.bottom_shadow_GC;
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if ((bottom_gc == None) || (top_gc == None)) 
Packit b099d7
    return;
Packit b099d7
  
Packit b099d7
  
Packit b099d7
  if (pb->pushbutton.compatible)
Packit b099d7
    default_button_shadow_thickness = pb->pushbutton.show_as_default;
Packit b099d7
  else    
Packit b099d7
    default_button_shadow_thickness = 
Packit b099d7
      pb->pushbutton.default_button_shadow_thickness;
Packit b099d7
  
Packit b099d7
  
Packit b099d7
  /*
Packit b099d7
   * Compute location of bounding box to contain the defaultButtonShadow.
Packit b099d7
   */
Packit b099d7
  xm_dpy = (XmDisplay) XmGetXmDisplay(XtDisplay(pb));
Packit b099d7
  default_button_emphasis = xm_dpy->display.default_button_emphasis;
Packit b099d7
Packit b099d7
  switch (default_button_emphasis)
Packit b099d7
    {
Packit b099d7
    case XmEXTERNAL_HIGHLIGHT:
Packit b099d7
      delta = pb->primitive.highlight_thickness;
Packit b099d7
      break;
Packit b099d7
Packit b099d7
    case XmINTERNAL_HIGHLIGHT:
Packit b099d7
      delta = Xm3D_ENHANCE_PIXEL;
Packit b099d7
      break;
Packit b099d7
Packit b099d7
    default:
Packit b099d7
      assert(FALSE);
Packit b099d7
      return;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  x = y = delta;
Packit b099d7
  width = pb->core.width - 2 * delta;
Packit b099d7
  height = pb->core.height - 2 * delta;
Packit b099d7
Packit b099d7
  if ((width > 0) && (height > 0))
Packit b099d7
    XmeDrawShadows(XtDisplay(pb), XtWindow(pb), 
Packit b099d7
		   top_gc, bottom_gc, x, y, width, height,
Packit b099d7
		   default_button_shadow_thickness, XmSHADOW_OUT); 
Packit b099d7
}
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  BorderHighlight 
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
static void 
Packit b099d7
BorderHighlight(
Packit b099d7
        Widget wid )
Packit b099d7
{
Packit b099d7
  XmPushButtonWidget pb = (XmPushButtonWidget) wid ;
Packit b099d7
  XmPushButtonCallbackStruct call_value;
Packit b099d7
  XEvent * event = NULL;
Packit b099d7
  
Packit b099d7
  if (Lab_IsMenupane(pb))
Packit b099d7
    {
Packit b099d7
       XmDisplay dpy = (XmDisplay) XmGetXmDisplay(XtDisplay(wid));
Packit b099d7
       Boolean etched_in = dpy->display.enable_etched_in_menu;
Packit b099d7
       Boolean already_armed = pb->pushbutton.armed;
Packit b099d7
Packit b099d7
       pb->pushbutton.armed = TRUE;
Packit b099d7
Packit b099d7
       if (etched_in && !XmIsTearOffButton(pb) ) 
Packit b099d7
	 {
Packit b099d7
	     XFillRectangle (XtDisplay(pb), XtWindow(pb),
Packit b099d7
			     pb->pushbutton.fill_gc,
Packit b099d7
			     0, 0, pb->core.width, pb->core.height);
Packit b099d7
Packit b099d7
	     DrawPushButtonLabel (pb, event, NULL);	
Packit b099d7
	 }
Packit b099d7
      
Packit b099d7
       if ((pb->core.width > 2 * pb->primitive.highlight_thickness) &&
Packit b099d7
	   (pb->core.height > 2 * pb->primitive.highlight_thickness))
Packit b099d7
	   XmeDrawShadows(XtDisplay (pb), XtWindow (pb),
Packit b099d7
		       pb->primitive.top_shadow_GC,
Packit b099d7
		       pb->primitive.bottom_shadow_GC,
Packit b099d7
		       pb->primitive.highlight_thickness,
Packit b099d7
		       pb->primitive.highlight_thickness,
Packit b099d7
		       pb->core.width - 2 * pb->primitive.highlight_thickness,
Packit b099d7
		       pb->core.height - 2 * pb->primitive.highlight_thickness,
Packit b099d7
		       pb->primitive.shadow_thickness, 
Packit b099d7
		       etched_in ? XmSHADOW_IN : XmSHADOW_OUT);
Packit b099d7
      
Packit b099d7
       if (!already_armed && pb->pushbutton.arm_callback) 
Packit b099d7
	 {
Packit b099d7
	     XFlush (XtDisplay (pb));
Packit b099d7
	  
Packit b099d7
	     call_value.reason = XmCR_ARM;
Packit b099d7
	     call_value.event = event;
Packit b099d7
	     XtCallCallbackList ((Widget) pb, pb->pushbutton.arm_callback, 
Packit b099d7
				 &call_value);
Packit b099d7
	 }
Packit b099d7
   }
Packit b099d7
  else 
Packit b099d7
    {
Packit b099d7
      DrawBorderHighlight ((Widget) pb) ;
Packit b099d7
    } 
Packit b099d7
}
Packit b099d7

Packit b099d7
static void
Packit b099d7
DrawBorderHighlight(
Packit b099d7
        Widget wid)
Packit b099d7
{   
Packit b099d7
  XmPushButtonWidget pb = (XmPushButtonWidget) wid ;
Packit b099d7
  int x, y, width, height, delta;
Packit b099d7
  Dimension highlight_width ;
Packit b099d7
  XtEnum default_button_emphasis;
Packit b099d7
  
Packit b099d7
  if (!XtWidth (pb) || !XtHeight (pb))
Packit b099d7
    return;
Packit b099d7
Packit b099d7
  pb->primitive.highlighted = True;
Packit b099d7
  pb->primitive.highlight_drawn = True;
Packit b099d7
  
Packit b099d7
  if (pb->pushbutton.default_button_shadow_thickness)
Packit b099d7
    highlight_width = pb->primitive.highlight_thickness - Xm3D_ENHANCE_PIXEL;
Packit b099d7
  else
Packit b099d7
    highlight_width = pb->primitive.highlight_thickness;
Packit b099d7
  
Packit b099d7
  if (highlight_width > 0)
Packit b099d7
    {
Packit b099d7
      XmDisplay xm_dpy = (XmDisplay) XmGetXmDisplay(XtDisplay(pb));
Packit b099d7
Packit b099d7
      default_button_emphasis = xm_dpy->display.default_button_emphasis;
Packit b099d7
Packit b099d7
      switch (default_button_emphasis)
Packit b099d7
	{
Packit b099d7
	case XmEXTERNAL_HIGHLIGHT:
Packit b099d7
	  delta = 0;
Packit b099d7
	  break;
Packit b099d7
Packit b099d7
	case XmINTERNAL_HIGHLIGHT:
Packit b099d7
	  if (pb->pushbutton.default_button_shadow_thickness)
Packit b099d7
	    delta = Xm3D_ENHANCE_PIXEL +
Packit b099d7
	      2 * (pb->pushbutton.compatible ?
Packit b099d7
		   pb->pushbutton.show_as_default :
Packit b099d7
		   pb->pushbutton.default_button_shadow_thickness);
Packit b099d7
	  else
Packit b099d7
	    delta = 0;
Packit b099d7
	  break;
Packit b099d7
Packit b099d7
	default:
Packit b099d7
	  assert(FALSE);
Packit b099d7
	  return;
Packit b099d7
	}
Packit b099d7
Packit b099d7
      x = y = delta;
Packit b099d7
      width = pb->core.width - 2 * delta;
Packit b099d7
      height = pb->core.height - 2 * delta;
Packit b099d7
Packit b099d7
      XmeDrawHighlight(XtDisplay(pb), XtWindow(pb), pb->primitive.highlight_GC,
Packit b099d7
		       x, y, width, height, highlight_width);
Packit b099d7
    }
Packit b099d7
} 
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  BorderUnhighlight
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
static void 
Packit b099d7
BorderUnhighlight(
Packit b099d7
        Widget wid )
Packit b099d7
{
Packit b099d7
  XmPushButtonWidget pb = (XmPushButtonWidget) wid ;
Packit b099d7
  XmPushButtonCallbackStruct call_value;
Packit b099d7
  XEvent * event = NULL;
Packit b099d7
Packit b099d7
  if (Lab_IsMenupane(pb))
Packit b099d7
    {
Packit b099d7
     XmDisplay dpy = (XmDisplay) XmGetXmDisplay(XtDisplay(wid));
Packit b099d7
     Boolean etched_in = dpy->display.enable_etched_in_menu;
Packit b099d7
     Boolean already_armed = pb->pushbutton.armed;
Packit b099d7
Packit b099d7
     pb->pushbutton.armed = FALSE;
Packit b099d7
Packit b099d7
     if (etched_in && !XmIsTearOffButton(pb) ) {
Packit b099d7
	  XFillRectangle (XtDisplay(pb), XtWindow(pb),
Packit b099d7
			  pb->pushbutton.background_gc,
Packit b099d7
			  0, 0, pb->core.width, pb->core.height);
Packit b099d7
	  DrawPushButtonLabel (pb, event, NULL);
Packit b099d7
     }
Packit b099d7
      else
Packit b099d7
	  XmeClearBorder (
Packit b099d7
		  XtDisplay (pb), XtWindow (pb),
Packit b099d7
		  pb->primitive.highlight_thickness,
Packit b099d7
		  pb->primitive.highlight_thickness,
Packit b099d7
		  pb->core.width - 2 * pb->primitive.highlight_thickness,
Packit b099d7
		  pb->core.height - 2 * pb->primitive.highlight_thickness,
Packit b099d7
		  pb->primitive.shadow_thickness);
Packit b099d7
      
Packit b099d7
      
Packit b099d7
      if (already_armed && pb->pushbutton.disarm_callback)
Packit b099d7
	{
Packit b099d7
	  XFlush (XtDisplay (pb));
Packit b099d7
	  
Packit b099d7
	  call_value.reason = XmCR_DISARM;
Packit b099d7
	  call_value.event = event;
Packit b099d7
	  XtCallCallbackList ((Widget) pb, pb->pushbutton.disarm_callback, 
Packit b099d7
			      &call_value);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
  else 
Packit b099d7
    {
Packit b099d7
      /* PushButton is not in a menu - parent may be a shell or manager */
Packit b099d7
      int border = pb->primitive.highlight_thickness - Xm3D_ENHANCE_PIXEL;
Packit b099d7
      XtEnum default_button_emphasis;
Packit b099d7
      XmDisplay xm_dpy = (XmDisplay) XmGetXmDisplay(XtDisplay(pb));
Packit b099d7
Packit b099d7
      default_button_emphasis = xm_dpy->display.default_button_emphasis;
Packit b099d7
Packit b099d7
      switch (default_button_emphasis)
Packit b099d7
	{
Packit b099d7
	case XmINTERNAL_HIGHLIGHT:
Packit b099d7
	  if (pb->pushbutton.default_button_shadow_thickness && (border > 0))
Packit b099d7
	    {
Packit b099d7
	      int x, y, width, height, delta;
Packit b099d7
Packit b099d7
	      pb->primitive.highlighted = False;
Packit b099d7
	      pb->primitive.highlight_drawn = False;
Packit b099d7
Packit b099d7
	      delta = Xm3D_ENHANCE_PIXEL + 
Packit b099d7
		2 * (pb->pushbutton.compatible ?
Packit b099d7
		     pb->pushbutton.show_as_default :
Packit b099d7
		     pb->pushbutton.default_button_shadow_thickness);
Packit b099d7
	    
Packit b099d7
	      x = y = delta;
Packit b099d7
	      width = pb->core.width - 2 * delta;
Packit b099d7
	      height = pb->core.height - 2 * delta;
Packit b099d7
Packit b099d7
	      FillBorderWithParentColor(pb, border, x, y, width, height);
Packit b099d7
	      break;
Packit b099d7
	    }
Packit b099d7
	  /* else fall through to XmEXTERNAL_HIGHLIGHT. */
Packit b099d7
Packit b099d7
	case XmEXTERNAL_HIGHLIGHT:
Packit b099d7
	  (*(xmLabelClassRec.primitive_class.border_unhighlight)) (wid) ;
Packit b099d7
	  break;
Packit b099d7
Packit b099d7
	default:
Packit b099d7
	  assert(FALSE);
Packit b099d7
	  return;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
}
Packit b099d7

Packit b099d7
/*
Packit b099d7
 * AdjustHighLightThickness ()
Packit b099d7
 *  HighlightThickness has a dependency on default_button-shadow-thickness;
Packit b099d7
 *  This routine (called from SetValues) adjust for that dependency.
Packit b099d7
 *  Applications should be aware that
Packit b099d7
 *  if a pushbutton gadget has  with (default_button-shadow-thickness == 0)
Packit b099d7
 * - then if through a XtSetValue it sets (default_button-shadow-thickness > 0)
Packit b099d7
 *  the application-specified highlight-thickness is internally increased by
Packit b099d7
 *  Xm3D_ENHANCE_PIXEL to enhance the 3D-appearance of the defaultButton
Packit b099d7
 *  Shadow. Similarly if a pushbutton gadget has  (default_button-shadow_
Packit b099d7
 *  thickness > 0), and it resets the (default_button-shadow-thickness = 0)
Packit b099d7
 *  through a XtSetValue , then the existing highlight-thickness is decreased
Packit b099d7
 *  by Xm3D_ENHANCE_PIXEL.
Packit b099d7
 *  The border-highlight when drawn is however is always of the same
Packit b099d7
 *  thickness as specified by the application since compensation is done
Packit b099d7
 *  in the drawing routine (see BorderHighlight).
Packit b099d7
 */
Packit b099d7
Packit b099d7
static int 
Packit b099d7
AdjustHighLightThickness(
Packit b099d7
        XmPushButtonWidget new_w,
Packit b099d7
        XmPushButtonWidget current )
Packit b099d7
{
Packit b099d7
  int adjustment = 0; 
Packit b099d7
  
Packit b099d7
  
Packit b099d7
  if (new_w->pushbutton.default_button_shadow_thickness > 0)
Packit b099d7
    {
Packit b099d7
      if (current->pushbutton.default_button_shadow_thickness == 0)
Packit b099d7
	{
Packit b099d7
	  new_w->primitive.highlight_thickness += Xm3D_ENHANCE_PIXEL;
Packit b099d7
	  adjustment = Xm3D_ENHANCE_PIXEL;
Packit b099d7
	}
Packit b099d7
      else if (new_w->primitive.highlight_thickness !=
Packit b099d7
	       current->primitive.highlight_thickness)
Packit b099d7
	{
Packit b099d7
	  new_w->primitive.highlight_thickness += Xm3D_ENHANCE_PIXEL;
Packit b099d7
	  adjustment = Xm3D_ENHANCE_PIXEL;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
  else
Packit b099d7
    { 
Packit b099d7
      if (current->pushbutton.default_button_shadow_thickness > 0)
Packit b099d7
        /* default_button_shadow_thickness was > 0 and is now being set to 0,
Packit b099d7
         * so take away the adjustment for enhancement.
Packit b099d7
         */
Packit b099d7
	{
Packit b099d7
	  if (new_w->primitive.highlight_thickness ==
Packit b099d7
	      current->primitive.highlight_thickness)
Packit b099d7
	    {
Packit b099d7
	      new_w->primitive.highlight_thickness -= Xm3D_ENHANCE_PIXEL;
Packit b099d7
	      adjustment -= Xm3D_ENHANCE_PIXEL;
Packit b099d7
	    }
Packit b099d7
	  /*
Packit b099d7
	   * This will appear to be a bug if in a XtSetValues the application
Packit b099d7
	   * removes the default_button_shadow_thickness and also
Packit b099d7
	   * sets the high-light-thickness to a value of
Packit b099d7
	   * (old-high-light-thickness (from previous XtSetValue) +
Packit b099d7
	   *  Xm3D_ENHANCE_PIXEL) at the same time.
Packit b099d7
	   * This will be documented.
Packit b099d7
	   */
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
  return (adjustment);
Packit b099d7
}
Packit b099d7

Packit b099d7
static void 
Packit b099d7
FillBorderWithParentColor(
Packit b099d7
        XmPushButtonWidget pb,
Packit b099d7
        int borderwidth,
Packit b099d7
        int dx,
Packit b099d7
        int dy,
Packit b099d7
        int rectwidth,
Packit b099d7
        int rectheight )
Packit b099d7
{
Packit b099d7
  if (XmIsManager(XtParent(pb)))
Packit b099d7
    {
Packit b099d7
      /* CR 5551: Use the manager gc rather than creating a new one. */
Packit b099d7
      XmeDrawHighlight(XtDisplay(pb), XtWindow(pb), XmParentBackgroundGC(pb),
Packit b099d7
		       dx, dy, rectwidth, rectheight, borderwidth);
Packit b099d7
    }
Packit b099d7
  else 
Packit b099d7
    {
Packit b099d7
      /* CR 6038: This is wrong, but is the way Label (by calling
Packit b099d7
       *	Primitive.c:UnhighlightBorder) clears borders in shells.
Packit b099d7
       */
Packit b099d7
      XmeClearBorder(XtDisplay(pb), XtWindow(pb),
Packit b099d7
		     dx, dy, rectwidth, rectheight, borderwidth);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7

Packit b099d7
/*************************************************************************
Packit b099d7
 *
Packit b099d7
 * SetPushButtonSize(newpb)
Packit b099d7
 *  Picks the larger dimension when the armPixmap is a
Packit b099d7
 *  different size than the label pixmap(i.e the unarm pixmap).
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
static void
Packit b099d7
SetPushButtonSize(
Packit b099d7
     XmPushButtonWidget newpb)
Packit b099d7
{
Packit b099d7
  XmLabelPart *lp = &(newpb->label);
Packit b099d7
  unsigned int onW = 0, onH = 0, onW2 = 0, onH2 = 0;
Packit b099d7
  XtWidgetProc resize;
Packit b099d7
  
Packit b099d7
  if (newpb->pushbutton.arm_pixmap != XmUNSPECIFIED_PIXMAP)
Packit b099d7
    {
Packit b099d7
#ifdef FIX_1516
Packit b099d7
      if (newpb->label.pixmap != XmUNSPECIFIED_PIXMAP)
Packit b099d7
#endif
Packit b099d7
      XmeGetPixmapData(XtScreen(newpb), newpb->label.pixmap,
Packit b099d7
		     NULL, NULL, NULL, NULL, NULL, NULL,
Packit b099d7
		     &onW, &onH);
Packit b099d7
      XmeGetPixmapData(XtScreen(newpb), newpb->pushbutton.arm_pixmap,
Packit b099d7
		     NULL, NULL, NULL, NULL, NULL, NULL,
Packit b099d7
		     &onW2, &onH2);
Packit b099d7
      newpb->label.PixmapRect.width = MAX(onW2, onW);
Packit b099d7
      newpb->label.PixmapRect.height = MAX(onH2, onH);
Packit b099d7
      _XmLabelCalcTextRect((Widget)newpb);
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  
Packit b099d7
  /* Let Label do the rest. */
Packit b099d7
  _XmProcessLock();
Packit b099d7
  resize = xmLabelClassRec.core_class.resize;
Packit b099d7
  _XmProcessUnlock();
Packit b099d7
  (* resize) ((Widget) newpb);
Packit b099d7
}
Packit b099d7

Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *    Actions -----------
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *     Arm
Packit b099d7
 *
Packit b099d7
 *     This function processes button 1 down occuring on the pushbutton.
Packit b099d7
 *     Mark the pushbutton as armed (i.e. active).
Packit b099d7
 *     The callbacks for XmNarmCallback are called.
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
  XmPushButtonWidget pb = (XmPushButtonWidget) wid ;
Packit b099d7
  XmPushButtonCallbackStruct call_value;
Packit b099d7
  XtExposeProc expose;
Packit b099d7
Packit b099d7
  (void) XmProcessTraversal ((Widget) pb, XmTRAVERSE_CURRENT);
Packit b099d7
  
Packit b099d7
  pb->pushbutton.armed = TRUE;
Packit b099d7
  
Packit b099d7
  if (event != NULL &&
Packit b099d7
      (event->xany.type == ButtonPress || event->xany.type == ButtonRelease))
Packit b099d7
    pb->pushbutton.armTimeStamp = event->xbutton.time;
Packit b099d7
  else
Packit b099d7
    pb->pushbutton.armTimeStamp = 0;
Packit b099d7
  
Packit b099d7
  _XmProcessLock();
Packit b099d7
  expose = XtClass(pb)->core_class.expose;
Packit b099d7
  _XmProcessUnlock();
Packit b099d7
  (* expose)(wid, event, (Region) NULL);
Packit b099d7
  
Packit b099d7
  if (pb->pushbutton.arm_callback)
Packit b099d7
    {
Packit b099d7
      XFlush(XtDisplay (pb));
Packit b099d7
      
Packit b099d7
      call_value.reason = XmCR_ARM;
Packit b099d7
      call_value.event = event;
Packit b099d7
      XtCallCallbackList((Widget) pb, pb->pushbutton.arm_callback, &call_value);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7

Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
MultiArm(
Packit b099d7
        Widget wid,
Packit b099d7
        XEvent *event,
Packit b099d7
        String *params,		/* unused */
Packit b099d7
        Cardinal *num_params )	/* unused */
Packit b099d7
{
Packit b099d7
  XmPushButtonWidget pb = (XmPushButtonWidget) wid ;
Packit b099d7
  
Packit b099d7
  if (pb->pushbutton.multiClick == XmMULTICLICK_KEEP)
Packit b099d7
    Arm ((Widget) pb, event, NULL, NULL);
Packit b099d7
}
Packit b099d7

Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *     Activate
Packit b099d7
 *
Packit b099d7
 *     Mark the pushbutton as unarmed (i.e. inactive).
Packit b099d7
 *     If the button release occurs inside of the PushButton, the 
Packit b099d7
 *     callbacks for XmNactivateCallback are called.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
static void 
Packit b099d7
Activate(
Packit b099d7
        Widget wid,
Packit b099d7
        XEvent *buttonEvent,
Packit b099d7
        String *params,
Packit b099d7
        Cardinal *num_params )
Packit b099d7
{
Packit b099d7
  XmPushButtonWidget pb = (XmPushButtonWidget) wid ;
Packit b099d7
Packit b099d7
  if (pb->pushbutton.armed == FALSE)
Packit b099d7
    return;
Packit b099d7
  
Packit b099d7
  pb->pushbutton.click_count = 1;
Packit b099d7
  ActivateCommon ((Widget) pb, buttonEvent, params, num_params);
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
  XmPushButtonWidget pb = (XmPushButtonWidget) wid ;
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_w/separate activate.
Packit b099d7
   */
Packit b099d7
  if (pb->pushbutton.multiClick == XmMULTICLICK_KEEP)
Packit b099d7
    {
Packit b099d7
      if ((buttonEvent->xbutton.time - pb->pushbutton.armTimeStamp) >
Packit b099d7
	  XtGetMultiClickTime(XtDisplay(pb)))
Packit b099d7
	pb->pushbutton.click_count = 1;
Packit b099d7
      else
Packit b099d7
        pb->pushbutton.click_count++;
Packit b099d7
Packit b099d7
      ActivateCommon ((Widget) pb, buttonEvent, params, num_params);
Packit b099d7
      Disarm ((Widget) pb, buttonEvent, params, num_params);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7

Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
ActivateCommon(
Packit b099d7
        Widget wid,
Packit b099d7
        XEvent *event,
Packit b099d7
        String *params,		/* unused */
Packit b099d7
        Cardinal *num_params )	/* unused */
Packit b099d7
{
Packit b099d7
  XmPushButtonWidget pb = (XmPushButtonWidget) wid ;
Packit b099d7
  XmPushButtonCallbackStruct call_value;
Packit b099d7
  XmMenuSystemTrait menuSTrait;
Packit b099d7
  XtExposeProc expose;
Packit b099d7
  
Packit b099d7
  pb->pushbutton.armed = FALSE;
Packit b099d7
  
Packit b099d7
  _XmProcessLock();
Packit b099d7
  expose = ((WidgetClass)XtClass(pb))->core_class.expose;
Packit b099d7
  _XmProcessUnlock();
Packit b099d7
Packit b099d7
  (* expose)(wid, event, (Region) NULL);
Packit b099d7
  
Packit b099d7
  /* CR 9181: Consider clipping when testing visibility. */
Packit b099d7
  if ((event->xany.type == ButtonPress || event->xany.type == ButtonRelease) &&
Packit b099d7
      _XmGetPointVisibility(wid, event->xbutton.x_root, event->xbutton.y_root))
Packit b099d7
    {
Packit b099d7
      call_value.reason = XmCR_ACTIVATE;
Packit b099d7
      call_value.event = event;
Packit b099d7
      call_value.click_count = pb->pushbutton.click_count;
Packit b099d7
      
Packit b099d7
      if ((pb->pushbutton.multiClick == XmMULTICLICK_DISCARD) &&	
Packit b099d7
	  (call_value.click_count > 1))
Packit b099d7
	return;
Packit b099d7
      
Packit b099d7
      menuSTrait = (XmMenuSystemTrait) 
Packit b099d7
	XmeTraitGet((XtPointer) XtClass(XtParent(pb)), XmQTmenuSystem);
Packit b099d7
      
Packit b099d7
      /* if the parent is menu system able, notify it about the select */
Packit b099d7
      if (menuSTrait != NULL)
Packit b099d7
	menuSTrait->entryCallback(XtParent(pb), (Widget) pb, &call_value);
Packit b099d7
      
Packit b099d7
      if ((! pb->label.skipCallback) &&
Packit b099d7
	  (pb->pushbutton.activate_callback))
Packit b099d7
	{
Packit b099d7
	  XFlush (XtDisplay (pb));
Packit b099d7
	  XtCallCallbackList ((Widget) pb, pb->pushbutton.activate_callback,
Packit b099d7
			      &call_value);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
}
Packit b099d7

Packit b099d7
Packit b099d7
Packit b099d7
static void 
Packit b099d7
PB_FixTearoff( XmPushButtonWidget pb)	
Packit b099d7
{
Packit b099d7
	 if  (XmMENU_PULLDOWN == pb->label.menu_type) 
Packit b099d7
	 {							
Packit b099d7
		Widget mwid = XmGetPostedFromWidget(XtParent(pb));	
Packit b099d7
		if (mwid && XmIsRowColumn(mwid)
Packit b099d7
			&& (XmMENU_OPTION == RC_Type(mwid)) 
Packit b099d7
			&& _XmIsActiveTearOff(XtParent(pb))) 
Packit b099d7
			XmProcessTraversal((Widget) pb, XmTRAVERSE_CURRENT);
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
  XmPushButtonWidget pb = (XmPushButtonWidget) wid ;
Packit b099d7
  Boolean already_armed = pb->pushbutton.armed;
Packit b099d7
  XmPushButtonCallbackStruct call_value;
Packit b099d7
  Boolean is_menupane = Lab_IsMenupane(pb);
Packit b099d7
  Boolean torn_has_focus = FALSE;	/* must be torn! */
Packit b099d7
  XmMenuSystemTrait menuSTrait;
Packit b099d7
  
Packit b099d7
  if (is_menupane && !XmIsMenuShell(XtParent(XtParent(pb))))
Packit b099d7
    {
Packit b099d7
      /* Because the pane is torn and the parent is a transient shell,
Packit b099d7
       * the shell's focal point from _XmGetFocusData should be valid
Packit b099d7
       * (as opposed to getting it from a MenuShell).
Packit b099d7
       */
Packit b099d7
      if (XmeFocusIsInShell((Widget)pb))
Packit b099d7
	{
Packit b099d7
	  /* In case allowAcceleratedInsensitiveUnmanagedMenuItems is True */
Packit b099d7
	  if (!XtIsSensitive((Widget)pb) || (!XtIsManaged((Widget)pb)))
Packit b099d7
            return;
Packit b099d7
	  torn_has_focus = TRUE;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  menuSTrait = (XmMenuSystemTrait) 
Packit b099d7
    XmeTraitGet((XtPointer) XtClass((Widget)XtParent(pb)), XmQTmenuSystem);
Packit b099d7
  if (is_menupane && menuSTrait != NULL)
Packit b099d7
    {
Packit b099d7
      pb->pushbutton.armed = FALSE;
Packit b099d7
      
Packit b099d7
      /* CR 7799: Torn off menus shouldn't be shared, so don't reparent. */
Packit b099d7
      if (torn_has_focus)
Packit b099d7
	menuSTrait->popdown(XtParent(pb), event);
Packit b099d7
      else
Packit b099d7
	menuSTrait->buttonPopdown(XtParent(pb), event);
Packit b099d7
      
Packit b099d7
      /* if its in a torn off menu pane, show depressed button briefly */
Packit b099d7
      if (torn_has_focus)
Packit b099d7
	{
Packit b099d7
	  XmDisplay dpy = (XmDisplay) XmGetXmDisplay(XtDisplay(pb));
Packit b099d7
	  Boolean etched_in = dpy->display.enable_etched_in_menu;
Packit b099d7
	  
Packit b099d7
	  /* Set the focus here. */
Packit b099d7
	  XmProcessTraversal((Widget) pb, XmTRAVERSE_CURRENT);
Packit b099d7
	  
Packit b099d7
	  if ((pb->core.width > 2 * pb->primitive.highlight_thickness) &&
Packit b099d7
	      (pb->core.height > 2 * pb->primitive.highlight_thickness))
Packit b099d7
	    XmeDrawShadows
Packit b099d7
	      (XtDisplay (pb), XtWindow (pb),
Packit b099d7
	       pb->primitive.bottom_shadow_GC, pb->primitive.top_shadow_GC,
Packit b099d7
	       pb->primitive.highlight_thickness,
Packit b099d7
	       pb->primitive.highlight_thickness,
Packit b099d7
	       pb->core.width - 2 * pb->primitive.highlight_thickness,
Packit b099d7
	       pb->core.height - 2 * pb->primitive.highlight_thickness,
Packit b099d7
	       pb->primitive.shadow_thickness, 
Packit b099d7
	       etched_in ? XmSHADOW_IN : XmSHADOW_OUT);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
  else 
Packit b099d7
    {
Packit b099d7
      XtExposeProc expose;
Packit b099d7
      pb->pushbutton.armed = TRUE;
Packit b099d7
      _XmProcessLock();
Packit b099d7
      expose = XtClass(pb)->core_class.expose;
Packit b099d7
      _XmProcessUnlock();
Packit b099d7
      (* expose)(wid, event, (Region) NULL);
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  XFlush (XtDisplay (pb));
Packit b099d7
  
Packit b099d7
  /* If the parent is menu system able, set the lastSelectToplevel before
Packit b099d7
   * the arm. It's ok if this is recalled later.
Packit b099d7
   */
Packit b099d7
  if (menuSTrait != NULL)
Packit b099d7
    menuSTrait->getLastSelectToplevel(XtParent(pb));
Packit b099d7
  
Packit b099d7
  if (pb->pushbutton.arm_callback && !already_armed)
Packit b099d7
    {
Packit b099d7
      call_value.reason = XmCR_ARM;
Packit b099d7
      call_value.event = event;
Packit b099d7
      XtCallCallbackList((Widget)pb, pb->pushbutton.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 the parent is menu system able, notify it about the select */
Packit b099d7
  if (menuSTrait != NULL)
Packit b099d7
    menuSTrait->entryCallback(XtParent(pb), (Widget)pb, &call_value);
Packit b099d7
#ifdef FIX_1375
Packit b099d7
	pb->label.pixmap = pb->pushbutton.unarm_pixmap;
Packit b099d7
#endif 
Packit b099d7
  if ((! pb->label.skipCallback) && (pb->pushbutton.activate_callback))
Packit b099d7
    {
Packit b099d7
      XFlush (XtDisplay (pb));
Packit b099d7
      XtCallCallbackList ((Widget) pb, pb->pushbutton.activate_callback,
Packit b099d7
			  &call_value);
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  pb->pushbutton.armed = FALSE;
Packit b099d7
  
Packit b099d7
  if (pb->pushbutton.disarm_callback)
Packit b099d7
    {
Packit b099d7
      XFlush (XtDisplay (pb));
Packit b099d7
      call_value.reason = XmCR_DISARM;
Packit b099d7
      XtCallCallbackList ((Widget) pb, pb->pushbutton.disarm_callback,
Packit b099d7
			  &call_value);
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if (is_menupane && menuSTrait != NULL)
Packit b099d7
    {
Packit b099d7
      if (torn_has_focus && XtIsSensitive(wid))
Packit b099d7
	{
Packit b099d7
	  /* Leave the focus widget in an armed state */
Packit b099d7
	  pb->pushbutton.armed = TRUE;
Packit b099d7
	  
Packit b099d7
	  if (pb->pushbutton.arm_callback)
Packit b099d7
	    {
Packit b099d7
	      XFlush (XtDisplay (pb));
Packit b099d7
	      call_value.reason = XmCR_ARM;
Packit b099d7
	      XtCallCallbackList ((Widget) pb, pb->pushbutton.arm_callback,
Packit b099d7
				  &call_value);
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
      else
Packit b099d7
	{
Packit b099d7
	  menuSTrait->reparentToTearOffShell(XtParent(pb), event);
Packit b099d7
	  PB_FixTearoff(pb);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  /*
Packit b099d7
   * If the button is still around, show it released, after a short delay.
Packit b099d7
   * This is done if the button is outside of a menus, or if in a torn
Packit b099d7
   * off menupane.
Packit b099d7
   */
Packit b099d7
  
Packit b099d7
  if (!is_menupane || torn_has_focus)
Packit b099d7
    {
Packit b099d7
      if ((pb->core.being_destroyed == False) && (!pb->pushbutton.timer))
Packit b099d7
        pb->pushbutton.timer = 
Packit b099d7
	  XtAppAddTimeOut (XtWidgetToApplicationContext((Widget)pb),
Packit b099d7
			   (unsigned long) DELAY_DEFAULT,
Packit b099d7
			   ArmTimeout,
Packit b099d7
			   (XtPointer)(pb));
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
  XmPushButtonWidget pb = (XmPushButtonWidget) data;
Packit b099d7
  
Packit b099d7
  pb->pushbutton.timer = 0;
Packit b099d7
  if (XtIsRealized ((Widget)pb) && XtIsManaged ((Widget)pb))
Packit b099d7
    {
Packit b099d7
      if (Lab_IsMenupane(pb))
Packit b099d7
	{
Packit b099d7
	  /* When rapidly clicking, the focus may have moved away from this
Packit b099d7
	   * widget, so check before changing the shadow.
Packit b099d7
	   */
Packit b099d7
	  if (XmeFocusIsInShell((Widget)pb) &&
Packit b099d7
	      (XmGetFocusWidget((Widget)pb) == (Widget)pb))
Packit b099d7
	    {
Packit b099d7
	      XmDisplay dpy = (XmDisplay) XmGetXmDisplay(XtDisplay(pb));
Packit b099d7
	      Boolean etched_in = dpy->display.enable_etched_in_menu;
Packit b099d7
Packit b099d7
	      /* in a torn off menu, redraw shadows */
Packit b099d7
	      if ((pb->core.width > 2 * pb->primitive.highlight_thickness) &&
Packit b099d7
		  (pb->core.height > 2 * pb->primitive.highlight_thickness))
Packit b099d7
		XmeDrawShadows
Packit b099d7
		  (XtDisplay (pb), XtWindow (pb),
Packit b099d7
		   pb->primitive.top_shadow_GC,
Packit b099d7
		   pb->primitive.bottom_shadow_GC,
Packit b099d7
		   pb->primitive.highlight_thickness,
Packit b099d7
		   pb->primitive.highlight_thickness,
Packit b099d7
		   pb->core.width - 2 * pb->primitive.highlight_thickness,
Packit b099d7
		   pb->core.height - 2 * pb->primitive.highlight_thickness,
Packit b099d7
		   pb->primitive.shadow_thickness, 
Packit b099d7
		   etched_in ? XmSHADOW_IN : XmSHADOW_OUT);
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
      else
Packit b099d7
	{
Packit b099d7
	  XtExposeProc expose;
Packit b099d7
	  _XmProcessLock();
Packit b099d7
	  expose = XtClass(pb)->core_class.expose;
Packit b099d7
	  _XmProcessUnlock();
Packit b099d7
	  (* expose) ((Widget) pb, NULL, (Region) NULL);
Packit b099d7
	}
Packit b099d7
      
Packit b099d7
      XFlush (XtDisplay (pb));
Packit b099d7
    }
Packit b099d7
}
Packit b099d7

Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *    Disarm
Packit b099d7
 *
Packit b099d7
 *     Mark the pushbutton as unarmed (i.e. active).
Packit b099d7
 *     The callbacks for XmNdisarmCallback are called..
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
  XmPushButtonWidget pb = (XmPushButtonWidget) wid ;
Packit b099d7
  XmPushButtonCallbackStruct call_value;
Packit b099d7
  XtExposeProc expose;
Packit b099d7
  
Packit b099d7
  /* BEGIN OSF Fix pir 2826 */
Packit b099d7
  if (pb->pushbutton.armed == TRUE)
Packit b099d7
    {
Packit b099d7
      pb->pushbutton.armed = FALSE;
Packit b099d7
      Redisplay((Widget) pb, event, (Region)NULL);
Packit b099d7
      _XmProcessLock();
Packit b099d7
      expose = XtClass(pb)->core_class.expose;
Packit b099d7
      _XmProcessUnlock();
Packit b099d7
      if (expose)
Packit b099d7
        (* expose)((Widget)(pb), event, (Region)NULL);
Packit b099d7
      
Packit b099d7
    }
Packit b099d7
  /* END OSF Fix pir 2826 */
Packit b099d7
  
Packit b099d7
  if (pb->pushbutton.disarm_callback)
Packit b099d7
    {
Packit b099d7
      call_value.reason = XmCR_DISARM;
Packit b099d7
      call_value.event = event;
Packit b099d7
      XtCallCallbackList ((Widget) pb, pb->pushbutton.disarm_callback, 
Packit b099d7
			  &call_value);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7

Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *     BtnDown
Packit b099d7
 *
Packit b099d7
 *     This function processes a button down occuring on the pushbutton
Packit b099d7
 *     when it is in a popup, pulldown, or option menu.
Packit b099d7
 *     Popdown the posted menu.
Packit b099d7
 *     Turn parent's traversal off.
Packit b099d7
 *     Mark the pushbutton as armed (i.e. active).
Packit b099d7
 *     The callbacks for XmNarmCallback are called.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
BtnDown(
Packit b099d7
        Widget wid,
Packit b099d7
        XEvent *event,
Packit b099d7
        String *params,		/* unused */
Packit b099d7
        Cardinal *num_params )	/* unused */
Packit b099d7
{
Packit b099d7
  XmPushButtonWidget pb = (XmPushButtonWidget) wid ;
Packit b099d7
  XmPushButtonCallbackStruct call_value;
Packit b099d7
  Boolean validButton = False;
Packit b099d7
  Boolean already_armed;
Packit b099d7
  ShellWidget popup;
Packit b099d7
  XmMenuSystemTrait menuSTrait;
Packit b099d7
  
Packit b099d7
  /* Support menu replay, free server input queue until next button event */
Packit b099d7
  XAllowEvents(XtDisplay(pb), SyncPointer, CurrentTime);
Packit b099d7
  
Packit b099d7
  /* If no menu system trait then parent isn't a menu as it should be. */
Packit b099d7
  menuSTrait = (XmMenuSystemTrait) 
Packit b099d7
    XmeTraitGet((XtPointer) XtClass(XtParent(pb)), XmQTmenuSystem);
Packit b099d7
  if (menuSTrait == NULL) 
Packit b099d7
    return;
Packit b099d7
  
Packit b099d7
  if (event && (event->type == ButtonPress))
Packit b099d7
    validButton = menuSTrait->verifyButton(XtParent(pb), event);
Packit b099d7
  
Packit b099d7
  if (!validButton)
Packit b099d7
    return;
Packit b099d7
  
Packit b099d7
  _XmSetInDragMode((Widget)pb, True);
Packit b099d7
  
Packit b099d7
  /* Popdown other popus that may be up */
Packit b099d7
  if (!(popup = (ShellWidget)_XmGetRC_PopupPosted(XtParent(pb))))
Packit b099d7
    {
Packit b099d7
      if (!XmIsMenuShell(XtParent(XtParent(pb))))
Packit b099d7
	{
Packit b099d7
	  /* In case tear off not armed and no grabs in place, do it now.
Packit b099d7
	   * Ok if already armed and grabbed - nothing done.
Packit b099d7
	   */
Packit b099d7
	  menuSTrait->tearOffArm(XtParent(pb));
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if (popup)
Packit b099d7
    {
Packit b099d7
      if (popup->shell.popped_up)
Packit b099d7
	menuSTrait->popdownEveryone((Widget) popup, event);
Packit b099d7
    } 
Packit b099d7
  
Packit b099d7
  /* Set focus to this pushbutton.  This must follow the possible
Packit b099d7
   * unhighlighting of the CascadeButton else it'll screw up active_child.
Packit b099d7
   */
Packit b099d7
  (void)XmProcessTraversal ((Widget) pb, XmTRAVERSE_CURRENT);
Packit b099d7
  /* get the location cursor - get consistent with Gadgets */
Packit b099d7
  
Packit b099d7
  already_armed = pb->pushbutton.armed;
Packit b099d7
  pb->pushbutton.armed = TRUE;
Packit b099d7
  
Packit b099d7
  if (pb->pushbutton.arm_callback && !already_armed)
Packit b099d7
    {
Packit b099d7
      XFlush (XtDisplay (pb));
Packit b099d7
      
Packit b099d7
      call_value.reason = XmCR_ARM;
Packit b099d7
      call_value.event = event;
Packit b099d7
      XtCallCallbackList((Widget) pb, pb->pushbutton.arm_callback, &call_value);
Packit b099d7
    }
Packit b099d7
  _XmRecordEvent (event);
Packit b099d7
}
Packit b099d7

Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *     BtnUp
Packit b099d7
 *
Packit b099d7
 *     This function processes a button up occuring on the pushbutton
Packit b099d7
 *     when it is in a popup, pulldown, or option menu.
Packit b099d7
 *     Mark the pushbutton as unarmed (i.e. inactive).
Packit b099d7
 *     The callbacks for XmNactivateCallback are called.
Packit b099d7
 *     The callbacks for XmNdisarmCallback are called.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
BtnUp(
Packit b099d7
        Widget wid,
Packit b099d7
        XEvent *event,
Packit b099d7
        String *params,		/* unused */
Packit b099d7
        Cardinal *num_params )	/* unused */
Packit b099d7
{
Packit b099d7
  XmPushButtonWidget pb = (XmPushButtonWidget) wid ;
Packit b099d7
  Widget parent =  XtParent(pb);
Packit b099d7
  XmPushButtonCallbackStruct call_value;
Packit b099d7
  Boolean flushDone = False;
Packit b099d7
  Boolean validButton = False;
Packit b099d7
  Boolean popped_up;
Packit b099d7
  Boolean is_menupane = Lab_IsMenupane(pb);
Packit b099d7
  Widget shell = XtParent(XtParent(pb));
Packit b099d7
  XmMenuSystemTrait menuSTrait;
Packit b099d7
  
Packit b099d7
  /* If no menu system trait then parent isn't a menu as it should be. */
Packit b099d7
  menuSTrait = (XmMenuSystemTrait) 
Packit b099d7
    XmeTraitGet((XtPointer) XtClass(XtParent(pb)), XmQTmenuSystem);
Packit b099d7
  if (menuSTrait == NULL) 
Packit b099d7
    return;
Packit b099d7
  
Packit b099d7
  if (event && (event->type == ButtonRelease))
Packit b099d7
    validButton = menuSTrait->verifyButton(parent, event);
Packit b099d7
  
Packit b099d7
  if (!validButton || (pb->pushbutton.armed == FALSE))
Packit b099d7
    return;
Packit b099d7
  
Packit b099d7
  pb->pushbutton.armed = FALSE;
Packit b099d7
  
Packit b099d7
  if (is_menupane && !XmIsMenuShell(shell))
Packit b099d7
    popped_up = menuSTrait->popdown((Widget) pb, event);
Packit b099d7
  else
Packit b099d7
    popped_up = menuSTrait->buttonPopdown((Widget) pb, event);
Packit b099d7
  
Packit b099d7
  _XmRecordEvent(event);
Packit b099d7
  
Packit b099d7
  /* XmMENU_POPDOWN left the menu posted on button click - don't activate! */
Packit b099d7
  if (popped_up)
Packit b099d7
    return;
Packit b099d7
  
Packit b099d7
  call_value.reason = XmCR_ACTIVATE;
Packit b099d7
  call_value.event = event;
Packit b099d7
  call_value.click_count = 1;  
Packit b099d7
Packit b099d7
  /* if the parent is menu system able, notify it about the select */
Packit b099d7
  if (menuSTrait != NULL)
Packit b099d7
    {
Packit b099d7
      menuSTrait->entryCallback(parent, (Widget) pb, &call_value);
Packit b099d7
      flushDone = True;
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if ((! pb->label.skipCallback) &&
Packit b099d7
      (pb->pushbutton.activate_callback))
Packit b099d7
    {
Packit b099d7
      XFlush (XtDisplay (pb));
Packit b099d7
      flushDone = True;
Packit b099d7
      XtCallCallbackList ((Widget) pb, pb->pushbutton.activate_callback,
Packit b099d7
			  &call_value);
Packit b099d7
    }
Packit b099d7
  if (pb->pushbutton.disarm_callback)
Packit b099d7
    {
Packit b099d7
      if (!flushDone)
Packit b099d7
	XFlush (XtDisplay (pb));
Packit b099d7
      call_value.reason = XmCR_DISARM;
Packit b099d7
      call_value.event = event;
Packit b099d7
      XtCallCallbackList ((Widget) pb, pb->pushbutton.disarm_callback,
Packit b099d7
			  &call_value);
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  /* If the original shell does not indicate an active menu, but rather a
Packit b099d7
   * tear off pane, leave the button in an armed state.  Also, briefly
Packit b099d7
   * display the button as depressed to give the user some feedback of
Packit b099d7
   * the selection.
Packit b099d7
   */
Packit b099d7
  
Packit b099d7
  if (is_menupane) /* necessary check? */
Packit b099d7
    {
Packit b099d7
      if (!XmIsMenuShell(shell))
Packit b099d7
	{
Packit b099d7
	  if (XtIsSensitive((Widget)pb))
Packit b099d7
	    {
Packit b099d7
	      XmDisplay dpy = (XmDisplay) XmGetXmDisplay(XtDisplay(pb));
Packit b099d7
	      Boolean etched_in = dpy->display.enable_etched_in_menu;
Packit b099d7
	      
Packit b099d7
	      if ((pb->core.width > 2 * pb->primitive.highlight_thickness) &&
Packit b099d7
		  (pb->core.height > 2 * pb->primitive.highlight_thickness))
Packit b099d7
		XmeDrawShadows
Packit b099d7
		  (XtDisplay (pb), XtWindow (pb),
Packit b099d7
		   pb->primitive.bottom_shadow_GC,
Packit b099d7
		   pb->primitive.top_shadow_GC,
Packit b099d7
		   pb->primitive.highlight_thickness,
Packit b099d7
		   pb->primitive.highlight_thickness,
Packit b099d7
		   pb->core.width - 2 * pb->primitive.highlight_thickness,
Packit b099d7
		   pb->core.height - 2 * pb->primitive.highlight_thickness,
Packit b099d7
		   pb->primitive.shadow_thickness, 
Packit b099d7
		   etched_in ? XmSHADOW_IN : XmSHADOW_OUT);
Packit b099d7
	      
Packit b099d7
	      XFlush (XtDisplay (pb));
Packit b099d7
	      flushDone = True;
Packit b099d7
Packit b099d7
	      if (pb->core.being_destroyed == False)
Packit b099d7
		{
Packit b099d7
		  if (!pb->pushbutton.timer)
Packit b099d7
		    pb->pushbutton.timer =
Packit b099d7
		      XtAppAddTimeOut(XtWidgetToApplicationContext((Widget)pb),
Packit b099d7
				      (unsigned long) DELAY_DEFAULT,
Packit b099d7
				      ArmTimeout,
Packit b099d7
				      (XtPointer)(pb));
Packit b099d7
		}
Packit b099d7
	      
Packit b099d7
	      pb->pushbutton.armed = TRUE;
Packit b099d7
	      if (pb->pushbutton.arm_callback)
Packit b099d7
		{
Packit b099d7
		  if (!flushDone)
Packit b099d7
		    XFlush (XtDisplay (pb));
Packit b099d7
		  call_value.reason = XmCR_ARM;
Packit b099d7
		  call_value.event = event;
Packit b099d7
		  XtCallCallbackList ((Widget) pb, pb->pushbutton.arm_callback,
Packit b099d7
				      &call_value);
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
      else
Packit b099d7
	menuSTrait->reparentToTearOffShell(XtParent(pb), event);
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  _XmSetInDragMode((Widget)pb, False);
Packit b099d7
  
Packit b099d7
  /* For the benefit of tear off menus, we must set the focus item
Packit b099d7
   * to this button.  In normal menus, this would not be a problem
Packit b099d7
   * because the focus is cleared when the menu is unposted.
Packit b099d7
   */
Packit b099d7
  if (!XmIsMenuShell(shell))
Packit b099d7
    XmProcessTraversal((Widget) pb, XmTRAVERSE_CURRENT);
Packit b099d7
  PB_FixTearoff(pb);
Packit b099d7
}
Packit b099d7

Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  Enter
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
Enter(
Packit b099d7
        Widget wid,
Packit b099d7
        XEvent *event,
Packit b099d7
        String *params,		/* unused */
Packit b099d7
        Cardinal *num_params )	/* unused */
Packit b099d7
{
Packit b099d7
  XmPushButtonWidget pb = (XmPushButtonWidget) wid ;
Packit b099d7
  XmPushButtonCallbackStruct call_value;
Packit b099d7
Packit b099d7
  if (Lab_IsMenupane(pb))
Packit b099d7
    {
Packit b099d7
      if ((((ShellWidget) XtParent(XtParent(pb)))->shell.popped_up) &&
Packit b099d7
          _XmGetInDragMode((Widget)pb))
Packit b099d7
	{
Packit b099d7
	  XmDisplay dpy = (XmDisplay) XmGetXmDisplay(XtDisplay(wid));
Packit b099d7
	  Boolean etched_in = dpy->display.enable_etched_in_menu;
Packit b099d7
Packit b099d7
	  if (pb->pushbutton.armed)
Packit b099d7
	    return;
Packit b099d7
	  
Packit b099d7
	  /* So KHelp event is delivered correctly */
Packit b099d7
	  _XmSetFocusFlag (XtParent(XtParent(pb)), XmFOCUS_IGNORE, TRUE);
Packit b099d7
	  XtSetKeyboardFocus(XtParent(XtParent(pb)), (Widget)pb);
Packit b099d7
	  _XmSetFocusFlag (XtParent(XtParent(pb)), XmFOCUS_IGNORE, FALSE);
Packit b099d7
Packit b099d7
	  pb -> pushbutton.armed = TRUE;
Packit b099d7
Packit b099d7
	  ((XmManagerWidget) XtParent(wid))->manager.active_child = wid;
Packit b099d7
Packit b099d7
	  /* etched in menu button */
Packit b099d7
	  if (etched_in && !XmIsTearOffButton(pb) ) {
Packit b099d7
Packit b099d7
	      XFillRectangle (XtDisplay(pb), XtWindow(pb),
Packit b099d7
			      pb->pushbutton.fill_gc,
Packit b099d7
			      0, 0, pb->core.width, pb->core.height);
Packit b099d7
	      DrawPushButtonLabel( pb, event, NULL );
Packit b099d7
	  }
Packit b099d7
Packit b099d7
	  if ((pb->core.width > 2 * pb->primitive.highlight_thickness) &&
Packit b099d7
	      (pb->core.height > 2 * pb->primitive.highlight_thickness))
Packit b099d7
	    XmeDrawShadows
Packit b099d7
	      (XtDisplay (pb), XtWindow (pb),
Packit b099d7
	       pb->primitive.top_shadow_GC,
Packit b099d7
	       pb->primitive.bottom_shadow_GC,
Packit b099d7
	       pb->primitive.highlight_thickness,
Packit b099d7
	       pb->primitive.highlight_thickness,
Packit b099d7
	       pb->core.width - 2 * pb->primitive.highlight_thickness,
Packit b099d7
	       pb->core.height - 2 * pb->primitive.highlight_thickness,
Packit b099d7
	       pb->primitive.shadow_thickness, 
Packit b099d7
	       etched_in ? XmSHADOW_IN : XmSHADOW_OUT);
Packit b099d7
Packit b099d7
	  if (pb->pushbutton.arm_callback)
Packit b099d7
	    {
Packit b099d7
	      XFlush (XtDisplay (pb));
Packit b099d7
	      
Packit b099d7
	      call_value.reason = XmCR_ARM;
Packit b099d7
	      call_value.event = event;
Packit b099d7
	      XtCallCallbackList ((Widget) pb,
Packit b099d7
				  pb->pushbutton.arm_callback, &call_value);
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    }  
Packit b099d7
  else 
Packit b099d7
    {	
Packit b099d7
      XtExposeProc expose;
Packit b099d7
      _XmPrimitiveEnter ((Widget) pb, event, NULL, NULL);
Packit b099d7
      if (pb->pushbutton.armed == TRUE) {
Packit b099d7
	_XmProcessLock();
Packit b099d7
	expose = XtClass(pb)->core_class.expose;
Packit b099d7
	_XmProcessUnlock();
Packit b099d7
	(* expose)(wid, event, (Region) NULL);
Packit b099d7
      }
Packit b099d7
    }
Packit b099d7
}
Packit b099d7

Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  Leave
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
Leave(
Packit b099d7
        Widget wid,
Packit b099d7
        XEvent *event,
Packit b099d7
        String *params,		/* unused */
Packit b099d7
        Cardinal *num_params )	/* unused */
Packit b099d7
{
Packit b099d7
  XmPushButtonWidget pb = (XmPushButtonWidget) wid ;
Packit b099d7
  XmPushButtonCallbackStruct call_value;
Packit b099d7
Packit b099d7
  if (Lab_IsMenupane(pb))
Packit b099d7
    {
Packit b099d7
      XmDisplay dpy = (XmDisplay) XmGetXmDisplay(XtDisplay(wid));
Packit b099d7
      Boolean etched_in = dpy->display.enable_etched_in_menu;
Packit b099d7
Packit b099d7
      if (_XmGetInDragMode((Widget)pb) && pb->pushbutton.armed &&
Packit b099d7
          (/* !ActiveTearOff || */ event->xcrossing.mode == NotifyNormal))
Packit b099d7
	{
Packit b099d7
	  pb->pushbutton.armed = FALSE;
Packit b099d7
  
Packit b099d7
	  ((XmManagerWidget) XtParent(wid))->manager.active_child = NULL;
Packit b099d7
Packit b099d7
	  if (etched_in && !XmIsTearOffButton(pb) ) {
Packit b099d7
	      XFillRectangle (XtDisplay(pb), XtWindow(pb),
Packit b099d7
			      pb->pushbutton.background_gc,
Packit b099d7
			      0, 0, pb->core.width, pb->core.height);
Packit b099d7
	      DrawPushButtonLabel (pb, event, NULL);
Packit b099d7
	  }
Packit b099d7
	  else 
Packit b099d7
	     XmeClearBorder
Packit b099d7
		 (XtDisplay (pb), XtWindow (pb),
Packit b099d7
		  pb->primitive.highlight_thickness,
Packit b099d7
		  pb->primitive.highlight_thickness,
Packit b099d7
		  pb->core.width - 2 * pb->primitive.highlight_thickness,
Packit b099d7
		  pb->core.height - 2 * pb->primitive.highlight_thickness,
Packit b099d7
		  pb->primitive.shadow_thickness);
Packit b099d7
Packit b099d7
	  if (pb->pushbutton.disarm_callback)
Packit b099d7
	    {
Packit b099d7
	      XFlush (XtDisplay (pb));
Packit b099d7
	      
Packit b099d7
	      call_value.reason = XmCR_DISARM;
Packit b099d7
	      call_value.event = event;
Packit b099d7
	      XtCallCallbackList ((Widget) pb, 
Packit b099d7
				  pb->pushbutton.disarm_callback, &call_value);
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
  else 
Packit b099d7
    {
Packit b099d7
      _XmPrimitiveLeave ((Widget) pb, event, NULL, NULL);
Packit b099d7
      
Packit b099d7
      if (pb->pushbutton.armed == TRUE)
Packit b099d7
	{  
Packit b099d7
	  XtExposeProc expose;
Packit b099d7
	  pb->pushbutton.armed = FALSE;
Packit b099d7
	  _XmProcessLock();
Packit b099d7
	  expose = XtClass(pb)->core_class.expose;
Packit b099d7
	  _XmProcessUnlock();
Packit b099d7
	  (* expose)(wid, event, (Region) NULL);
Packit b099d7
	  pb->pushbutton.armed = TRUE;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
}
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  KeySelect
Packit b099d7
 *
Packit b099d7
 *  If the menu system traversal is enabled, do an activate and disarm
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
KeySelect(
Packit b099d7
        Widget wid,
Packit b099d7
        XEvent *event,
Packit b099d7
        String *params,		/* unused */
Packit b099d7
        Cardinal *num_params )	/* unused */
Packit b099d7
{
Packit b099d7
  XmPushButtonWidget pb = (XmPushButtonWidget) wid ;
Packit b099d7
  XmPushButtonCallbackStruct call_value;
Packit b099d7
  XmMenuSystemTrait menuSTrait;
Packit b099d7
  
Packit b099d7
  if (!_XmIsEventUnique(event))
Packit b099d7
    return;
Packit b099d7
  
Packit b099d7
  if (!_XmGetInDragMode((Widget)pb))
Packit b099d7
    {
Packit b099d7
      menuSTrait = (XmMenuSystemTrait) 
Packit b099d7
	XmeTraitGet((XtPointer) XtClass(XtParent(pb)), XmQTmenuSystem);
Packit b099d7
      pb->pushbutton.armed = FALSE;
Packit b099d7
      
Packit b099d7
      if (menuSTrait != NULL)
Packit b099d7
	menuSTrait->buttonPopdown(XtParent(pb), event);
Packit b099d7
      
Packit b099d7
      _XmRecordEvent(event);
Packit b099d7
      
Packit b099d7
      call_value.reason = XmCR_ACTIVATE;
Packit b099d7
      call_value.event = event;
Packit b099d7
      
Packit b099d7
      /* if the parent is menu system able, notify it about the select */
Packit b099d7
      if (menuSTrait != NULL)
Packit b099d7
	menuSTrait->entryCallback(XtParent(pb), (Widget) pb, &call_value);
Packit b099d7
      
Packit b099d7
      if ((! pb->label.skipCallback) &&
Packit b099d7
	  (pb->pushbutton.activate_callback))
Packit b099d7
	{
Packit b099d7
	  XFlush (XtDisplay (pb));
Packit b099d7
	  XtCallCallbackList ((Widget) pb, pb->pushbutton.activate_callback,
Packit b099d7
			      &call_value);
Packit b099d7
	}
Packit b099d7
      
Packit b099d7
      if (menuSTrait != NULL)
Packit b099d7
	menuSTrait->reparentToTearOffShell(XtParent(pb), event);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7

Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  Help
Packit b099d7
 *     This function processes Function Key 1 press occuring on the PushButton.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
Help(
Packit b099d7
        Widget wid,
Packit b099d7
        XEvent *event,
Packit b099d7
        String *params,		/* unused */
Packit b099d7
        Cardinal *num_params )	/* unused */
Packit b099d7
{
Packit b099d7
  XmPushButtonWidget pb = (XmPushButtonWidget) wid ;
Packit b099d7
  Boolean is_menupane = Lab_IsMenupane(pb);
Packit b099d7
  XmMenuSystemTrait menuSTrait;
Packit b099d7
  
Packit b099d7
  menuSTrait = (XmMenuSystemTrait) 
Packit b099d7
    XmeTraitGet((XtPointer) XtClass(XtParent(wid)), XmQTmenuSystem);
Packit b099d7
  
Packit b099d7
  if (is_menupane && menuSTrait != NULL)
Packit b099d7
    menuSTrait->buttonPopdown(XtParent(pb), event);
Packit b099d7
  
Packit b099d7
  _XmPrimitiveHelp ((Widget) pb, event, NULL, NULL);
Packit b099d7
  
Packit b099d7
  /***
Packit b099d7
   * call_value.reason = XmCR_HELP;
Packit b099d7
   * call_value.event = event;
Packit b099d7
   * XtCallCallbackList ((Widget) pb, pb->primitive.help_callback, &call_value);
Packit b099d7
   ***/
Packit b099d7
  
Packit b099d7
  if (is_menupane && menuSTrait != NULL)
Packit b099d7
    menuSTrait->reparentToTearOffShell(XtParent(pb), event);
Packit b099d7
}
Packit b099d7

Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  Trait methods --------
Packit b099d7
 *      
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
 *  ShowAsDefault
Packit b099d7
 *	set up the default visual
Packit b099d7
 *      
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
static void 
Packit b099d7
ShowAsDefault(Widget w, 
Packit b099d7
	      XtEnum state)
Packit b099d7
{
Packit b099d7
  XmPushButtonWidget pb = (XmPushButtonWidget) w ;
Packit b099d7
  Dimension dbShadowTh ;
Packit b099d7
  
Packit b099d7
  switch (state) 
Packit b099d7
    {
Packit b099d7
    case XmDEFAULT_READY:
Packit b099d7
      {
Packit b099d7
	/* We have pixels, but the button unit type might not be 
Packit b099d7
	 * pixel, so save it and restore it after the setvalues */
Packit b099d7
	unsigned char saved_unit_type =
Packit b099d7
	  ((XmPrimitiveWidget)w)->primitive.unit_type ;
Packit b099d7
Packit b099d7
#ifdef DEFAULT_GLYPH_PIXMAP
Packit b099d7
	unsigned int def_pixmap_width ;
Packit b099d7
	if (_XmGetDefaultGlyphPixmap(XtScreen((Widget)(pb)), 
Packit b099d7
				     &def_pixmap_width, NULL) != 
Packit b099d7
	    XmUNSPECIFIED_PIXMAP) 
Packit b099d7
	  {
Packit b099d7
	    /* We will use the margin right area, so increase it */
Packit b099d7
	    pb->pushbutton.compatible = False;
Packit b099d7
	    ((XmPrimitiveWidget)w)->primitive.unit_type = XmPIXELS;
Packit b099d7
	    XtVaSetValues(w, XmNmarginRight, def_pixmap_width, NULL);
Packit b099d7
	    ((XmPrimitiveWidget)w)->primitive.unit_type = saved_unit_type;
Packit b099d7
	  } 
Packit b099d7
	else
Packit b099d7
#endif
Packit b099d7
	  if (!pb->pushbutton.default_button_shadow_thickness)
Packit b099d7
	    {   
Packit b099d7
	      if (pb->primitive.shadow_thickness > 1) 
Packit b099d7
		dbShadowTh = pb->primitive.shadow_thickness >> 1 ;
Packit b099d7
	      else
Packit b099d7
		dbShadowTh = pb->primitive.shadow_thickness ;
Packit b099d7
		
Packit b099d7
	      /* CR 7474: Disable pushbutton compatibility mode. */
Packit b099d7
	      pb->pushbutton.compatible = False;
Packit b099d7
	      ((XmPrimitiveWidget)w)->primitive.unit_type = XmPIXELS;
Packit b099d7
	      XtVaSetValues(w, XmNdefaultButtonShadowThickness,
Packit b099d7
			    dbShadowTh, NULL);
Packit b099d7
	      ((XmPrimitiveWidget)w)->primitive.unit_type = saved_unit_type;
Packit b099d7
	    } 
Packit b099d7
      }
Packit b099d7
      break ;
Packit b099d7
Packit b099d7
    case XmDEFAULT_ON :
Packit b099d7
      /* CR 7474: Disable pushbutton compatibility mode. */
Packit b099d7
      pb->pushbutton.compatible = False;
Packit b099d7
      XtVaSetValues(w, XmNshowAsDefault, True, NULL);
Packit b099d7
      break ;
Packit b099d7
Packit b099d7
    case XmDEFAULT_OFF :
Packit b099d7
      XtVaSetValues(w, XmNshowAsDefault, False, NULL);
Packit b099d7
      break ;
Packit b099d7
Packit b099d7
    case XmDEFAULT_FORGET :
Packit b099d7
    default:
Packit b099d7
#ifdef DEFAULT_GLYPH_PIXMAP
Packit b099d7
      if (_XmGetDefaultGlyphPixmap(XtScreen((Widget)(pb)), NULL, NULL) != 
Packit b099d7
	  XmUNSPECIFIED_PIXMAP)
Packit b099d7
	XtVaSetValues(w, XmNmarginRight, 0, NULL);
Packit b099d7
      else 
Packit b099d7
#endif
Packit b099d7
    	if (!pb->pushbutton.default_button_shadow_thickness)
Packit b099d7
	  XtVaSetValues(w, XmNdefaultButtonShadowThickness, 0, NULL);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7

Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *		Application Accessible External Functions
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  XmCreatePushButton
Packit b099d7
 *	Create an instance of a pushbutton and return the widget id.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
Widget 
Packit b099d7
XmCreatePushButton(
Packit b099d7
        Widget parent,
Packit b099d7
        char *name,
Packit b099d7
        ArgList arglist,
Packit b099d7
        Cardinal argcount )
Packit b099d7
{
Packit b099d7
  return XtCreateWidget(name, xmPushButtonWidgetClass, parent, 
Packit b099d7
			arglist, argcount);
Packit b099d7
}
Packit b099d7
Packit b099d7
Widget 
Packit b099d7
XmVaCreatePushButton(
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
                         xmPushButtonWidgetClass, 
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
XmVaCreateManagedPushButton(
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
                         xmPushButtonWidgetClass, 
Packit b099d7
                         parent, True, 
Packit b099d7
                         var, count);
Packit b099d7
    va_end(var);   
Packit b099d7
    return w;
Packit b099d7
    
Packit b099d7
}