|
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 |
}
|