|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Motif
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Copyright (c) 1987-2012, The Open Group. All rights reserved.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* These libraries and programs are free software; you can
|
|
Packit |
b099d7 |
* redistribute them and/or modify them under the terms of the GNU
|
|
Packit |
b099d7 |
* Lesser General Public License as published by the Free Software
|
|
Packit |
b099d7 |
* Foundation; either version 2 of the License, or (at your option)
|
|
Packit |
b099d7 |
* any later version.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* These libraries and programs are distributed in the hope that
|
|
Packit |
b099d7 |
* they will be useful, but WITHOUT ANY WARRANTY; without even the
|
|
Packit |
b099d7 |
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
Packit |
b099d7 |
* PURPOSE. See the GNU Lesser General Public License for more
|
|
Packit |
b099d7 |
* details.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit |
b099d7 |
* License along with these librararies and programs; if not, write
|
|
Packit |
b099d7 |
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
|
|
Packit |
b099d7 |
* Floor, Boston, MA 02110-1301 USA
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* HISTORY
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
#ifdef REV_INFO
|
|
Packit |
b099d7 |
#ifndef lint
|
|
Packit |
b099d7 |
static char rcsid[] = "$XConsortium: ArrowB.c /main/16 1995/10/25 19:50:57 cde-sun $"
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
/* (c) Copyright 1987, 1988, 1989, 1990, 1991, 1992 HEWLETT-PACKARD COMPANY */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifdef HAVE_CONFIG_H
|
|
Packit |
b099d7 |
#include <config.h>
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#include <stdio.h>
|
|
Packit |
b099d7 |
#include <Xm/ArrowBP.h>
|
|
Packit |
b099d7 |
#include <Xm/TransltnsP.h>
|
|
Packit |
b099d7 |
#include <Xm/DrawP.h>
|
|
Packit |
b099d7 |
#include <Xm/ActivatableT.h>
|
|
Packit |
b099d7 |
#include <Xm/TraitP.h>
|
|
Packit |
b099d7 |
#include <Xm/VaSimpleP.h>
|
|
Packit |
b099d7 |
#include "PrimitiveI.h"
|
|
Packit |
b099d7 |
#include "RepTypeI.h"
|
|
Packit |
b099d7 |
#include "ScreenI.h"
|
|
Packit |
b099d7 |
#include "TravActI.h"
|
|
Packit |
b099d7 |
#include "TraversalI.h"
|
|
Packit |
b099d7 |
#include "XmI.h"
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define DELAY_DEFAULT 100
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/******** Static Function Declarations ********/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void ClassPartInitialize(
|
|
Packit |
b099d7 |
WidgetClass wc);
|
|
Packit |
b099d7 |
static void Initialize(
|
|
Packit |
b099d7 |
Widget rw,
|
|
Packit |
b099d7 |
Widget nw,
|
|
Packit |
b099d7 |
ArgList args,
|
|
Packit |
b099d7 |
Cardinal *num_args);
|
|
Packit |
b099d7 |
static void GetArrowGC(
|
|
Packit |
b099d7 |
XmArrowButtonWidget aw);
|
|
Packit |
b099d7 |
static void Redisplay(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
XEvent *event,
|
|
Packit |
b099d7 |
Region region);
|
|
Packit |
b099d7 |
static void Destroy(
|
|
Packit |
b099d7 |
Widget w);
|
|
Packit |
b099d7 |
static Boolean SetValues(
|
|
Packit |
b099d7 |
Widget cw,
|
|
Packit |
b099d7 |
Widget rw,
|
|
Packit |
b099d7 |
Widget nw,
|
|
Packit |
b099d7 |
ArgList args,
|
|
Packit |
b099d7 |
Cardinal *num_args);
|
|
Packit |
b099d7 |
static void Arm(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
XEvent *event,
|
|
Packit |
b099d7 |
String *params,
|
|
Packit |
b099d7 |
Cardinal *num_params);
|
|
Packit |
b099d7 |
static void MultiArm(
|
|
Packit |
b099d7 |
Widget aw,
|
|
Packit |
b099d7 |
XEvent *event,
|
|
Packit |
b099d7 |
String *params,
|
|
Packit |
b099d7 |
Cardinal *num_params);
|
|
Packit |
b099d7 |
static void Activate(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
XEvent *buttonEvent,
|
|
Packit |
b099d7 |
String *params,
|
|
Packit |
b099d7 |
Cardinal *num_params);
|
|
Packit |
b099d7 |
static void MultiActivate(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
XEvent *buttonEvent,
|
|
Packit |
b099d7 |
String *params,
|
|
Packit |
b099d7 |
Cardinal *num_params);
|
|
Packit |
b099d7 |
static void ActivateCommon(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
XEvent *buttonEvent);
|
|
Packit |
b099d7 |
static void ArmAndActivate(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
XEvent *event,
|
|
Packit |
b099d7 |
String *params,
|
|
Packit |
b099d7 |
Cardinal *num_params);
|
|
Packit |
b099d7 |
static void ArmTimeout(
|
|
Packit |
b099d7 |
XtPointer closure,
|
|
Packit |
b099d7 |
XtIntervalId *id);
|
|
Packit |
b099d7 |
static void Disarm(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
XEvent *event,
|
|
Packit |
b099d7 |
String *params,
|
|
Packit |
b099d7 |
Cardinal *num_params);
|
|
Packit |
b099d7 |
static void Enter(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
XEvent *event,
|
|
Packit |
b099d7 |
String *params,
|
|
Packit |
b099d7 |
Cardinal *num_params);
|
|
Packit |
b099d7 |
static void Leave(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
XEvent *event,
|
|
Packit |
b099d7 |
String *params,
|
|
Packit |
b099d7 |
Cardinal *num_params);
|
|
Packit |
b099d7 |
static void ChangeCB(Widget w,
|
|
Packit |
b099d7 |
XtCallbackProc activCB,
|
|
Packit |
b099d7 |
XtPointer closure,
|
|
Packit |
b099d7 |
Boolean setunset);
|
|
Packit |
b099d7 |
static void DrawArrow(XmArrowButtonWidget aw,
|
|
Packit |
b099d7 |
GC top_gc,
|
|
Packit |
b099d7 |
GC bottom_gc,
|
|
Packit |
b099d7 |
GC center_gc);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/******** End Static Function Declarations ********/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Default translation table and action list */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define defaultTranslations _XmArrowB_defaultTranslations
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static XtActionsRec actionsList[] =
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
{ "Activate", Activate },
|
|
Packit |
b099d7 |
{ "MultiActivate", MultiActivate },
|
|
Packit |
b099d7 |
{ "Arm", Arm },
|
|
Packit |
b099d7 |
{ "MultiArm", MultiArm },
|
|
Packit |
b099d7 |
{ "Disarm", Disarm },
|
|
Packit |
b099d7 |
{ "ArmAndActivate", ArmAndActivate },
|
|
Packit |
b099d7 |
{ "Enter", Enter },
|
|
Packit |
b099d7 |
{ "Leave", Leave },
|
|
Packit |
b099d7 |
{ "ButtonTakeFocus", _XmButtonTakeFocus }
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Resource list for ArrowButton */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static XtResource resources[] =
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNmultiClick, XmCMultiClick, XmRMultiClick,
|
|
Packit |
b099d7 |
sizeof(unsigned char),
|
|
Packit |
b099d7 |
XtOffsetOf( struct _XmArrowButtonRec, arrowbutton.multiClick),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) XmMULTICLICK_KEEP
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNarrowDirection, XmCArrowDirection, XmRArrowDirection,
|
|
Packit |
b099d7 |
sizeof(unsigned char),
|
|
Packit |
b099d7 |
XtOffsetOf( struct _XmArrowButtonRec, arrowbutton.direction),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) XmARROW_UP
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNactivateCallback, XmCCallback, XmRCallback, sizeof(XtCallbackList),
|
|
Packit |
b099d7 |
XtOffsetOf( struct _XmArrowButtonRec, arrowbutton.activate_callback),
|
|
Packit |
b099d7 |
XmRPointer, (XtPointer) NULL
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNarmCallback, XmCCallback, XmRCallback, sizeof(XtCallbackList),
|
|
Packit |
b099d7 |
XtOffsetOf( struct _XmArrowButtonRec, arrowbutton.arm_callback),
|
|
Packit |
b099d7 |
XmRPointer, (XtPointer) NULL
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNdisarmCallback, XmCCallback, XmRCallback, sizeof(XtCallbackList),
|
|
Packit |
b099d7 |
XtOffsetOf( struct _XmArrowButtonRec, arrowbutton.disarm_callback),
|
|
Packit |
b099d7 |
XmRPointer, (XtPointer) NULL
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNdetailShadowThickness, XmCShadowThickness, XmRHorizontalDimension,
|
|
Packit |
b099d7 |
sizeof (Dimension),
|
|
Packit |
b099d7 |
XtOffsetOf(XmArrowButtonRec, arrowbutton.detail_shadow_thickness),
|
|
Packit |
b099d7 |
XmRCallProc, (XtPointer) _XmSetThickness
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static XmSyntheticResource syn_resources[] =
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNdetailShadowThickness,
|
|
Packit |
b099d7 |
sizeof(Dimension),
|
|
Packit |
b099d7 |
XtOffsetOf(XmArrowButtonRec, arrowbutton.detail_shadow_thickness),
|
|
Packit |
b099d7 |
XmeFromHorizontalPixels,XmeToHorizontalPixels
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* The ArrowButton class record definition */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
externaldef (xmarrowbuttonclassrec) XmArrowButtonClassRec xmArrowButtonClassRec=
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
{ /* Core fields */
|
|
Packit |
b099d7 |
(WidgetClass) &xmPrimitiveClassRec, /* superclass */
|
|
Packit |
b099d7 |
"XmArrowButton", /* class_name */
|
|
Packit |
b099d7 |
sizeof(XmArrowButtonRec), /* widget_size */
|
|
Packit |
b099d7 |
(XtProc)NULL, /* class_initialize */
|
|
Packit |
b099d7 |
ClassPartInitialize, /* class_part_initialize */
|
|
Packit |
b099d7 |
FALSE, /* class_inited */
|
|
Packit |
b099d7 |
Initialize, /* initialize */
|
|
Packit |
b099d7 |
(XtArgsProc)NULL, /* initialize_hook */
|
|
Packit |
b099d7 |
XtInheritRealize, /* realize */
|
|
Packit |
b099d7 |
actionsList, /* actions */
|
|
Packit |
b099d7 |
XtNumber(actionsList), /* num_actions */
|
|
Packit |
b099d7 |
resources, /* resources */
|
|
Packit |
b099d7 |
XtNumber(resources), /* num_resources */
|
|
Packit |
b099d7 |
NULLQUARK, /* xrm_class */
|
|
Packit |
b099d7 |
TRUE, /* compress_motion */
|
|
Packit |
b099d7 |
XtExposeCompressMaximal, /* compress_exposure */
|
|
Packit |
b099d7 |
TRUE, /* compress_enterleave */
|
|
Packit |
b099d7 |
FALSE, /* visible_interest */
|
|
Packit |
b099d7 |
Destroy, /* destroy */
|
|
Packit |
b099d7 |
(XtWidgetProc)NULL, /* resize */
|
|
Packit |
b099d7 |
Redisplay, /* expose */
|
|
Packit |
b099d7 |
SetValues, /* set_values */
|
|
Packit |
b099d7 |
(XtArgsFunc)NULL, /* set_values_hook */
|
|
Packit |
b099d7 |
XtInheritSetValuesAlmost, /* set_values_almost */
|
|
Packit |
b099d7 |
(XtArgsProc)NULL, /* get_values_hook */
|
|
Packit |
b099d7 |
(XtAcceptFocusProc)NULL, /* accept_focus */
|
|
Packit |
b099d7 |
XtVersion, /* version */
|
|
Packit |
b099d7 |
(XtPointer)NULL, /* callback private */
|
|
Packit |
b099d7 |
defaultTranslations, /* tm_table */
|
|
Packit |
b099d7 |
(XtGeometryHandler)NULL, /* query_geometry */
|
|
Packit |
b099d7 |
(XtStringProc)NULL, /* display_accelerator */
|
|
Packit |
b099d7 |
(XtPointer)NULL /* extension */
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{ /* XmPrimitive fields */
|
|
Packit |
b099d7 |
XmInheritBorderHighlight, /* Primitive border_highlight */
|
|
Packit |
b099d7 |
XmInheritBorderUnhighlight, /* Primitive border_unhighlight */
|
|
Packit |
b099d7 |
XtInheritTranslations, /* translations */
|
|
Packit |
b099d7 |
ArmAndActivate, /* arm_and_activate */
|
|
Packit |
b099d7 |
syn_resources, /* syn_resources */
|
|
Packit |
b099d7 |
XtNumber(syn_resources), /* num_syn_resources */
|
|
Packit |
b099d7 |
(XtPointer) NULL /* extension */
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{ /* XmArrowButtonWidget fields */
|
|
Packit |
b099d7 |
(XtPointer) NULL /* extension */
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
externaldef(xmarrowbuttonwidgetclass) WidgetClass xmArrowButtonWidgetClass =
|
|
Packit |
b099d7 |
(WidgetClass) &xmArrowButtonClassRec;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Trait record for arrowButton */
|
|
Packit |
b099d7 |
static XmConst XmActivatableTraitRec arrowButtonAT =
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
0, /* version */
|
|
Packit |
b099d7 |
ChangeCB /* changeCB */
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* ClassPartInitialize
|
|
Packit |
b099d7 |
* Set up the fast subclassing for the widget
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
ClassPartInitialize(
|
|
Packit |
b099d7 |
WidgetClass wc )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
_XmFastSubclassInit (wc, XmARROW_BUTTON_BIT);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Install the activatable trait for all subclasses */
|
|
Packit |
b099d7 |
XmeTraitSet((XtPointer)wc, XmQTactivatable, (XtPointer) &arrowButtonAT);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Initialize
|
|
Packit |
b099d7 |
* The main widget instance initialization routine.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
Initialize(
|
|
Packit |
b099d7 |
Widget rw,
|
|
Packit |
b099d7 |
Widget nw,
|
|
Packit |
b099d7 |
ArgList args, /* unused */
|
|
Packit |
b099d7 |
Cardinal *num_args) /* unused */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmArrowButtonWidget request = (XmArrowButtonWidget) rw;
|
|
Packit |
b099d7 |
XmArrowButtonWidget new_w = (XmArrowButtonWidget) nw;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Check the data put into the new widget from .Xdefaults
|
|
Packit |
b099d7 |
* or through the arg list.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
if (!XmRepTypeValidValue(XmRID_ARROW_DIRECTION,
|
|
Packit |
b099d7 |
new_w->arrowbutton.direction, (Widget) new_w))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
new_w->arrowbutton.direction = XmARROW_UP;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Set up a geometry for the widget if it is currently 0. */
|
|
Packit |
b099d7 |
if (request->core.width == 0)
|
|
Packit |
b099d7 |
new_w->core.width += 15;
|
|
Packit |
b099d7 |
if (request->core.height == 0)
|
|
Packit |
b099d7 |
new_w->core.height += 15;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Set the internal arrow variables */
|
|
Packit |
b099d7 |
new_w->arrowbutton.timer = 0;
|
|
Packit |
b099d7 |
new_w->arrowbutton.selected = False;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Get the drawing graphics contexts. */
|
|
Packit |
b099d7 |
GetArrowGC (new_w);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* GetArrowGC
|
|
Packit |
b099d7 |
* Get the graphics context used for drawing the arrowbutton.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
GetArrowGC(
|
|
Packit |
b099d7 |
XmArrowButtonWidget aw )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XGCValues values;
|
|
Packit |
b099d7 |
XtGCMask valueMask, unusedMask;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
valueMask = GCForeground | GCBackground | GCGraphicsExposures;
|
|
Packit |
b099d7 |
unusedMask = GCClipXOrigin | GCClipYOrigin | GCFont;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
values.foreground = aw->primitive.foreground;
|
|
Packit |
b099d7 |
values.background = aw->core.background_pixel;
|
|
Packit |
b099d7 |
values.graphics_exposures = False;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
aw->arrowbutton.arrow_GC = XtAllocateGC((Widget) aw, 0, valueMask, &values,
|
|
Packit |
b099d7 |
GCClipMask, unusedMask);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
valueMask |= GCFillStyle | GCStipple;
|
|
Packit |
b099d7 |
values.fill_style = FillOpaqueStippled;
|
|
Packit |
b099d7 |
values.stipple = _XmGetInsensitiveStippleBitmap((Widget) aw);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
aw->arrowbutton.insensitive_GC = XtAllocateGC((Widget) aw, 0, valueMask,
|
|
Packit |
b099d7 |
&values, GCClipMask,
|
|
Packit |
b099d7 |
unusedMask);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Redisplay
|
|
Packit |
b099d7 |
* General redisplay function called on exposure events.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
Redisplay(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
XEvent *event,
|
|
Packit |
b099d7 |
Region region )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmArrowButtonWidget aw = (XmArrowButtonWidget) wid;
|
|
Packit |
b099d7 |
int iwidth, iheight;
|
|
Packit |
b099d7 |
XtExposeProc expose;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
iwidth = (int) aw->core.width - 2 * aw->primitive.highlight_thickness;
|
|
Packit |
b099d7 |
iheight = (int) aw->core.height - 2 * aw->primitive.highlight_thickness;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Draw the arrow */
|
|
Packit |
b099d7 |
if ((iwidth > 0) && (iheight > 0))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (aw->primitive.shadow_thickness > 0)
|
|
Packit |
b099d7 |
XmeDrawShadows(XtDisplay (aw), XtWindow (aw),
|
|
Packit |
b099d7 |
aw->primitive.top_shadow_GC,
|
|
Packit |
b099d7 |
aw->primitive.bottom_shadow_GC,
|
|
Packit |
b099d7 |
aw->primitive.highlight_thickness,
|
|
Packit |
b099d7 |
aw->primitive.highlight_thickness,
|
|
Packit |
b099d7 |
aw->core.width - 2 * aw->primitive.highlight_thickness,
|
|
Packit |
b099d7 |
aw->core.height - 2 * aw->primitive.highlight_thickness,
|
|
Packit |
b099d7 |
aw->primitive.shadow_thickness,
|
|
Packit |
b099d7 |
XmSHADOW_OUT);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (aw->arrowbutton.selected && XtIsSensitive(wid))
|
|
Packit |
b099d7 |
DrawArrow(aw, aw->primitive.bottom_shadow_GC,
|
|
Packit |
b099d7 |
aw->primitive.top_shadow_GC, aw->arrowbutton.arrow_GC);
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
DrawArrow(aw, aw->primitive.top_shadow_GC,
|
|
Packit |
b099d7 |
aw->primitive.bottom_shadow_GC,
|
|
Packit |
b099d7 |
(XtIsSensitive(wid) ?
|
|
Packit |
b099d7 |
aw->arrowbutton.arrow_GC : aw->arrowbutton.insensitive_GC));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Envelop our superclass expose method */
|
|
Packit |
b099d7 |
_XmProcessLock();
|
|
Packit |
b099d7 |
expose = xmPrimitiveClassRec.core_class.expose;
|
|
Packit |
b099d7 |
_XmProcessUnlock();
|
|
Packit |
b099d7 |
(*(expose)) ((Widget) aw, event, region);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Destroy
|
|
Packit |
b099d7 |
* Clean up allocated resources when the widget is destroyed.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
Destroy(
|
|
Packit |
b099d7 |
Widget w )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmArrowButtonWidget aw = (XmArrowButtonWidget) w;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (aw->arrowbutton.timer)
|
|
Packit |
b099d7 |
XtRemoveTimeOut(aw->arrowbutton.timer);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XtReleaseGC(w, aw->arrowbutton.arrow_GC);
|
|
Packit |
b099d7 |
XtReleaseGC(w, aw->arrowbutton.insensitive_GC);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* SetValues
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static Boolean
|
|
Packit |
b099d7 |
SetValues(
|
|
Packit |
b099d7 |
Widget cw,
|
|
Packit |
b099d7 |
Widget rw,
|
|
Packit |
b099d7 |
Widget nw,
|
|
Packit |
b099d7 |
ArgList args, /* unused */
|
|
Packit |
b099d7 |
Cardinal *num_args) /* unused */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmArrowButtonWidget current = (XmArrowButtonWidget) cw;
|
|
Packit |
b099d7 |
XmArrowButtonWidget new_w = (XmArrowButtonWidget) nw;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Boolean returnFlag = FALSE;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Check the data put into the new widget. */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!XmRepTypeValidValue(XmRID_ARROW_DIRECTION,
|
|
Packit |
b099d7 |
new_w->arrowbutton.direction, (Widget) new_w))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
new_w->arrowbutton.direction = current->arrowbutton.direction;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* See if the GC's need to be regenerated and widget redrawn. */
|
|
Packit |
b099d7 |
if (new_w->core.background_pixel != current->core.background_pixel ||
|
|
Packit |
b099d7 |
new_w->primitive.foreground != current->primitive.foreground)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
returnFlag = TRUE;
|
|
Packit |
b099d7 |
XtReleaseGC ((Widget) new_w, new_w->arrowbutton.arrow_GC);
|
|
Packit |
b099d7 |
XtReleaseGC ((Widget) new_w, new_w->arrowbutton.insensitive_GC);
|
|
Packit |
b099d7 |
GetArrowGC (new_w);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (new_w->arrowbutton.direction != current->arrowbutton.direction ||
|
|
Packit |
b099d7 |
XtIsSensitive(nw) != XtIsSensitive(cw) ||
|
|
Packit |
b099d7 |
new_w->primitive.highlight_thickness !=
|
|
Packit |
b099d7 |
current->primitive.highlight_thickness ||
|
|
Packit |
b099d7 |
new_w->primitive.shadow_thickness != current->primitive.shadow_thickness)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
returnFlag = TRUE;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return (returnFlag);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Arm
|
|
Packit |
b099d7 |
* This function processes button 1 down occuring on the arrowButton.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
Arm(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
XEvent *event,
|
|
Packit |
b099d7 |
String *params, /* unused */
|
|
Packit |
b099d7 |
Cardinal *num_params) /* unused */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmArrowButtonWidget aw = (XmArrowButtonWidget) wid;
|
|
Packit |
b099d7 |
XmArrowButtonCallbackStruct call_value;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
(void) XmProcessTraversal((Widget) aw, XmTRAVERSE_CURRENT);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
aw->arrowbutton.selected = True;
|
|
Packit |
b099d7 |
aw->arrowbutton.armTimeStamp = event->xbutton.time; /* see MultiActivate */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
DrawArrow(aw, aw->primitive.bottom_shadow_GC,
|
|
Packit |
b099d7 |
aw->primitive.top_shadow_GC, NULL);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (aw->arrowbutton.arm_callback)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XFlush(XtDisplay(aw));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
call_value.reason = XmCR_ARM;
|
|
Packit |
b099d7 |
call_value.event = event;
|
|
Packit |
b099d7 |
XtCallCallbackList((Widget) aw,
|
|
Packit |
b099d7 |
aw->arrowbutton.arm_callback,
|
|
Packit |
b099d7 |
&call_value);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
MultiArm(
|
|
Packit |
b099d7 |
Widget aw,
|
|
Packit |
b099d7 |
XEvent *event,
|
|
Packit |
b099d7 |
String *params,
|
|
Packit |
b099d7 |
Cardinal *num_params)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (((XmArrowButtonWidget) aw)->arrowbutton.multiClick == XmMULTICLICK_KEEP)
|
|
Packit |
b099d7 |
Arm(aw, event, params, num_params);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Activate
|
|
Packit |
b099d7 |
* This function processes button 1 up occuring on the arrowButton.
|
|
Packit |
b099d7 |
* If the button 1 up occurred inside the button the activate
|
|
Packit |
b099d7 |
* callbacks are called.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
Activate(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
XEvent *buttonEvent,
|
|
Packit |
b099d7 |
String *params, /* unused */
|
|
Packit |
b099d7 |
Cardinal *num_params) /* unused */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmArrowButtonWidget aw = (XmArrowButtonWidget) wid;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (aw->arrowbutton.selected == False)
|
|
Packit |
b099d7 |
return;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
aw->arrowbutton.click_count = 1;
|
|
Packit |
b099d7 |
ActivateCommon((Widget) aw, buttonEvent);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
MultiActivate(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
XEvent *buttonEvent,
|
|
Packit |
b099d7 |
String *params,
|
|
Packit |
b099d7 |
Cardinal *num_params)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/* When a multi click sequence occurs and the user Button Presses and
|
|
Packit |
b099d7 |
* holds for a length of time, the final release should look like a
|
|
Packit |
b099d7 |
* new/separate activate.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
XmArrowButtonWidget aw = (XmArrowButtonWidget) wid;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (aw->arrowbutton.multiClick == XmMULTICLICK_KEEP)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if ((buttonEvent->xbutton.time - aw->arrowbutton.armTimeStamp) >
|
|
Packit |
b099d7 |
XtGetMultiClickTime(XtDisplay(aw)))
|
|
Packit |
b099d7 |
aw->arrowbutton.click_count = 1;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
aw->arrowbutton.click_count++;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
ActivateCommon((Widget) aw, buttonEvent);
|
|
Packit |
b099d7 |
Disarm ((Widget) aw, buttonEvent, params, num_params);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
ActivateCommon(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
XEvent *buttonEvent)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmArrowButtonWidget aw = (XmArrowButtonWidget) wid;
|
|
Packit |
b099d7 |
XmArrowButtonCallbackStruct call_value;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
aw->arrowbutton.selected = False;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
DrawArrow(aw, aw->primitive.top_shadow_GC,
|
|
Packit |
b099d7 |
aw->primitive.bottom_shadow_GC, NULL);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* CR 9181: Consider clipping when testing visibility. */
|
|
Packit |
b099d7 |
if (((buttonEvent->xany.type == ButtonPress) ||
|
|
Packit |
b099d7 |
(buttonEvent->xany.type == ButtonRelease)) &&
|
|
Packit |
b099d7 |
_XmGetPointVisibility(wid,
|
|
Packit |
b099d7 |
buttonEvent->xbutton.x_root,
|
|
Packit |
b099d7 |
buttonEvent->xbutton.y_root) &&
|
|
Packit |
b099d7 |
(aw->arrowbutton.activate_callback))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XFlush(XtDisplay(aw));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
call_value.reason = XmCR_ACTIVATE;
|
|
Packit |
b099d7 |
call_value.event = buttonEvent;
|
|
Packit |
b099d7 |
call_value.click_count = aw->arrowbutton.click_count;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ((aw->arrowbutton.multiClick == XmMULTICLICK_DISCARD) &&
|
|
Packit |
b099d7 |
(call_value.click_count > 1))
|
|
Packit |
b099d7 |
return;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XtCallCallbackList((Widget) aw,
|
|
Packit |
b099d7 |
aw->arrowbutton.activate_callback,
|
|
Packit |
b099d7 |
&call_value);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* ArmAndActivate
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
ArmAndActivate(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
XEvent *event,
|
|
Packit |
b099d7 |
String *params, /* unused */
|
|
Packit |
b099d7 |
Cardinal *num_params) /* unused */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmArrowButtonWidget ab = (XmArrowButtonWidget) wid;
|
|
Packit |
b099d7 |
XmArrowButtonCallbackStruct call_value;
|
|
Packit |
b099d7 |
XtExposeProc expose;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
ab->arrowbutton.selected = TRUE;
|
|
Packit |
b099d7 |
_XmProcessLock();
|
|
Packit |
b099d7 |
expose = ab->core.widget_class->core_class.expose;
|
|
Packit |
b099d7 |
_XmProcessUnlock();
|
|
Packit |
b099d7 |
(*(expose)) ((Widget) ab, event, FALSE);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XFlush (XtDisplay (ab));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (ab->arrowbutton.arm_callback)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
call_value.reason = XmCR_ARM;
|
|
Packit |
b099d7 |
call_value.event = event;
|
|
Packit |
b099d7 |
XtCallCallbackList((Widget)ab, ab->arrowbutton.arm_callback, &call_value);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
call_value.reason = XmCR_ACTIVATE;
|
|
Packit |
b099d7 |
call_value.event = event;
|
|
Packit |
b099d7 |
call_value.click_count = 1; /* always 1 in kselect */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (ab->arrowbutton.activate_callback)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XFlush (XtDisplay (ab));
|
|
Packit |
b099d7 |
XtCallCallbackList((Widget)ab,ab->arrowbutton.activate_callback,
|
|
Packit |
b099d7 |
&call_value);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
ab->arrowbutton.selected = FALSE;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (ab->arrowbutton.disarm_callback)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XFlush (XtDisplay (ab));
|
|
Packit |
b099d7 |
call_value.reason = XmCR_DISARM;
|
|
Packit |
b099d7 |
XtCallCallbackList((Widget) ab, ab->arrowbutton.disarm_callback,
|
|
Packit |
b099d7 |
&call_value);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* If the button is still around, show it released after a short delay */
|
|
Packit |
b099d7 |
if (ab->core.being_destroyed == False)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
ab->arrowbutton.timer =
|
|
Packit |
b099d7 |
XtAppAddTimeOut(XtWidgetToApplicationContext((Widget)ab),
|
|
Packit |
b099d7 |
(unsigned long) DELAY_DEFAULT,
|
|
Packit |
b099d7 |
ArmTimeout, (XtPointer)ab);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* ARGSUSED */
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
ArmTimeout(
|
|
Packit |
b099d7 |
XtPointer closure,
|
|
Packit |
b099d7 |
XtIntervalId *id )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmArrowButtonWidget ab = (XmArrowButtonWidget) closure;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
ab->arrowbutton.timer = 0;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (XtIsRealized((Widget)ab) && XtIsManaged((Widget)ab))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XtExposeProc expose;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmProcessLock();
|
|
Packit |
b099d7 |
expose = ab->core.widget_class->core_class.expose;
|
|
Packit |
b099d7 |
_XmProcessUnlock();
|
|
Packit |
b099d7 |
(*(expose)) ((Widget) ab, NULL, FALSE);
|
|
Packit |
b099d7 |
XFlush (XtDisplay (ab));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Disarm
|
|
Packit |
b099d7 |
* This function processes button 1 up occuring on the arrowButton.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
Disarm(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
XEvent *event,
|
|
Packit |
b099d7 |
String *params, /* unused */
|
|
Packit |
b099d7 |
Cardinal *num_params) /* unused */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmArrowButtonWidget aw = (XmArrowButtonWidget) wid;
|
|
Packit |
b099d7 |
XmArrowButtonCallbackStruct call_value;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
aw->arrowbutton.selected = False;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
DrawArrow(aw, aw->primitive.top_shadow_GC,
|
|
Packit |
b099d7 |
aw->primitive.bottom_shadow_GC, NULL);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
call_value.reason = XmCR_DISARM;
|
|
Packit |
b099d7 |
call_value.event = event;
|
|
Packit |
b099d7 |
XtCallCallbackList((Widget) aw, aw->arrowbutton.disarm_callback, &call_value);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Enter
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
Enter(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
XEvent *event,
|
|
Packit |
b099d7 |
String *params,
|
|
Packit |
b099d7 |
Cardinal *num_params )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmArrowButtonWidget aw = (XmArrowButtonWidget) wid;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmPrimitiveEnter (wid, event, params, num_params);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (aw->arrowbutton.selected && XtIsSensitive(wid))
|
|
Packit |
b099d7 |
DrawArrow(aw, aw->primitive.bottom_shadow_GC,
|
|
Packit |
b099d7 |
aw->primitive.top_shadow_GC, NULL);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Leave
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
Leave(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
XEvent *event,
|
|
Packit |
b099d7 |
String *params,
|
|
Packit |
b099d7 |
Cardinal *num_params )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmArrowButtonWidget aw = (XmArrowButtonWidget) wid;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmPrimitiveLeave (wid, event, params, num_params);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (aw->arrowbutton.selected && XtIsSensitive(wid))
|
|
Packit |
b099d7 |
DrawArrow(aw, aw->primitive.top_shadow_GC,
|
|
Packit |
b099d7 |
aw->primitive.bottom_shadow_GC, NULL);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* ChangeCB
|
|
Packit |
b099d7 |
* add or remove the activate callback list.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
ChangeCB(
|
|
Packit |
b099d7 |
Widget w,
|
|
Packit |
b099d7 |
XtCallbackProc activCB,
|
|
Packit |
b099d7 |
XtPointer closure,
|
|
Packit |
b099d7 |
Boolean setunset)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (setunset)
|
|
Packit |
b099d7 |
XtAddCallback (w, XmNactivateCallback, activCB, closure);
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
XtRemoveCallback (w, XmNactivateCallback, activCB, closure);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* XmCreateArrowButton
|
|
Packit |
b099d7 |
* Create an instance of an arrowbutton and return the widget id.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Widget
|
|
Packit |
b099d7 |
XmCreateArrowButton(
|
|
Packit |
b099d7 |
Widget parent,
|
|
Packit |
b099d7 |
char *name,
|
|
Packit |
b099d7 |
ArgList arglist,
|
|
Packit |
b099d7 |
Cardinal argcount )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
return XtCreateWidget(name, xmArrowButtonWidgetClass, parent,
|
|
Packit |
b099d7 |
arglist, argcount);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Widget
|
|
Packit |
b099d7 |
XmVaCreateArrowButton(
|
|
Packit |
b099d7 |
Widget parent,
|
|
Packit |
b099d7 |
char *name,
|
|
Packit |
b099d7 |
...)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
register Widget w;
|
|
Packit |
b099d7 |
va_list var;
|
|
Packit |
b099d7 |
int count;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Va_start(var,name);
|
|
Packit |
b099d7 |
count = XmeCountVaListSimple(var);
|
|
Packit |
b099d7 |
va_end(var);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Va_start(var, name);
|
|
Packit |
b099d7 |
w = XmeVLCreateWidget(name,
|
|
Packit |
b099d7 |
xmArrowButtonWidgetClass,
|
|
Packit |
b099d7 |
parent, False,
|
|
Packit |
b099d7 |
var, count);
|
|
Packit |
b099d7 |
va_end(var);
|
|
Packit |
b099d7 |
return w;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
Widget
|
|
Packit |
b099d7 |
XmVaCreateManagedArrowButton(
|
|
Packit |
b099d7 |
Widget parent,
|
|
Packit |
b099d7 |
char *name,
|
|
Packit |
b099d7 |
...)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Widget w = NULL;
|
|
Packit |
b099d7 |
va_list var;
|
|
Packit |
b099d7 |
int count;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Va_start(var, name);
|
|
Packit |
b099d7 |
count = XmeCountVaListSimple(var);
|
|
Packit |
b099d7 |
va_end(var);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Va_start(var, name);
|
|
Packit |
b099d7 |
w = XmeVLCreateWidget(name,
|
|
Packit |
b099d7 |
xmArrowButtonWidgetClass,
|
|
Packit |
b099d7 |
parent, True,
|
|
Packit |
b099d7 |
var, count);
|
|
Packit |
b099d7 |
va_end(var);
|
|
Packit |
b099d7 |
return w;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Wrapper around XmeDrawArrow to calculate sizes. */
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
DrawArrow(XmArrowButtonWidget aw,
|
|
Packit |
b099d7 |
GC top_gc,
|
|
Packit |
b099d7 |
GC bottom_gc,
|
|
Packit |
b099d7 |
GC center_gc)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Position x, y;
|
|
Packit |
b099d7 |
Dimension width, height;
|
|
Packit |
b099d7 |
Dimension margin = (aw->primitive.highlight_thickness +
|
|
Packit |
b099d7 |
aw->primitive.shadow_thickness);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Don't let large margins cause confusion. */
|
|
Packit |
b099d7 |
if (margin <= (aw->core.width / 2))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
x = margin;
|
|
Packit |
b099d7 |
width = aw->core.width - (margin * 2);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
x = aw->core.width / 2;
|
|
Packit |
b099d7 |
width = 0;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (margin <= (aw->core.height / 2))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
y = margin;
|
|
Packit |
b099d7 |
height = aw->core.height - (margin * 2);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
y = aw->core.height / 2;
|
|
Packit |
b099d7 |
height = 0;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* The way we currently handle 1 shadowThickness in XmeDrawArrow
|
|
Packit |
b099d7 |
is by drawing the center a little bit bigger, so the center_gc has
|
|
Packit |
b099d7 |
to be present. Kinda hacky... */
|
|
Packit |
b099d7 |
if (!center_gc &&
|
|
Packit |
b099d7 |
aw->arrowbutton.detail_shadow_thickness == 1)
|
|
Packit |
b099d7 |
center_gc = aw->arrowbutton.arrow_GC ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (center_gc)
|
|
Packit |
b099d7 |
XSetClipMask(XtDisplay((Widget)aw), center_gc, None);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XmeDrawArrow (XtDisplay ((Widget) aw), XtWindow ((Widget) aw),
|
|
Packit |
b099d7 |
top_gc, bottom_gc, center_gc,
|
|
Packit |
b099d7 |
x, y, width, height,
|
|
Packit |
b099d7 |
aw->arrowbutton.detail_shadow_thickness,
|
|
Packit |
b099d7 |
aw->arrowbutton.direction);
|
|
Packit |
b099d7 |
}
|