Initial import of the CDE 2.1.30 sources from the Open Group.
This commit is contained in:
936
cde/programs/dtwm/Button.c
Normal file
936
cde/programs/dtwm/Button.c
Normal file
@@ -0,0 +1,936 @@
|
||||
/* $XConsortium: Button.c /main/7 1995/11/14 10:03:27 rswiston $ */
|
||||
#ifdef REV_INFO
|
||||
#ifndef lint
|
||||
static char SCCSID[] = "OSF/Motif: @(#)Button.c 1.19 95/05/01";
|
||||
#endif /* lint */
|
||||
#endif /* REV_INFO */
|
||||
/******************************************************************************
|
||||
*******************************************************************************
|
||||
*
|
||||
* (c) Copyright 1992 HEWLETT-PACKARD COMPANY
|
||||
* ALL RIGHTS RESERVED
|
||||
*
|
||||
*******************************************************************************
|
||||
******************************************************************************/
|
||||
#include <stdio.h>
|
||||
#include <X11/cursorfont.h>
|
||||
#include "ButtonP.h"
|
||||
#include <Xm/ManagerP.h>
|
||||
#include <Dt/Control.h>
|
||||
#include <Dt/MacrosP.h>
|
||||
#include <Dt/DtStrDefs.h>
|
||||
|
||||
#define DELAY_DEFAULT 100
|
||||
|
||||
static void Initialize(
|
||||
Widget request_w,
|
||||
Widget new_w) ;
|
||||
static void GetGCs(
|
||||
Widget w) ;
|
||||
static void UpdateGCs(
|
||||
Widget w) ;
|
||||
static void Redisplay(
|
||||
Widget w,
|
||||
XEvent *event,
|
||||
Region region) ;
|
||||
static Boolean SetValues(
|
||||
Widget current_w,
|
||||
Widget request_w,
|
||||
Widget new_w) ;
|
||||
static void Arm(
|
||||
Widget w,
|
||||
XEvent *event,
|
||||
String *params,
|
||||
Cardinal *num_params) ;
|
||||
static void Disarm(
|
||||
Widget w,
|
||||
XEvent *event,
|
||||
String *params,
|
||||
Cardinal *num_params) ;
|
||||
static void Activate(
|
||||
Widget w,
|
||||
XEvent *event,
|
||||
String *params,
|
||||
Cardinal *num_params) ;
|
||||
static void ArmAndActivate(
|
||||
Widget w,
|
||||
XEvent *event,
|
||||
String *params,
|
||||
Cardinal *num_params) ;
|
||||
static void InputDispatch(
|
||||
Widget w,
|
||||
XButtonEvent *event,
|
||||
Mask event_mask) ;
|
||||
static Boolean VisualChange(
|
||||
Widget w,
|
||||
Widget current_w,
|
||||
Widget new_w) ;
|
||||
static void ArmTimeout(
|
||||
Widget w,
|
||||
XtIntervalId *id) ;
|
||||
static void Enter(
|
||||
Widget wid,
|
||||
XEvent *event,
|
||||
String *params,
|
||||
Cardinal *num_params) ;
|
||||
static void Leave(
|
||||
Widget wid,
|
||||
XEvent *event,
|
||||
String *params,
|
||||
Cardinal *num_params) ;
|
||||
static void CallCallback(
|
||||
DtButtonGadget g,
|
||||
XtCallbackList cb,
|
||||
int reason,
|
||||
XEvent *event) ;
|
||||
static void DefaultSelectColor(
|
||||
Widget widget,
|
||||
int offset,
|
||||
XrmValue *value) ;
|
||||
|
||||
/* Resource list for button */
|
||||
|
||||
#define R_Offset(field) \
|
||||
XtOffset (DtButtonGadget, button.field)
|
||||
static XtResource resources[] =
|
||||
{
|
||||
{
|
||||
XmNcursorFont,
|
||||
XmCCursorFont, XmRInt, sizeof (int),
|
||||
R_Offset (cursor_font),
|
||||
XmRImmediate, (XtPointer) 1
|
||||
},
|
||||
{
|
||||
XmNarmColor,
|
||||
XmCArmColor, XmRPixel, sizeof (Pixel),
|
||||
R_Offset (arm_color),
|
||||
XmRCallProc, (XtPointer) DefaultSelectColor
|
||||
},
|
||||
{
|
||||
XmNsubpanel,
|
||||
XmCSubpanel, XmRWidget, sizeof (Widget),
|
||||
R_Offset (subpanel),
|
||||
XmRImmediate, (XtPointer) NULL
|
||||
},
|
||||
{
|
||||
XmNpushFunction,
|
||||
XmCPushFunction, XmRFunction, sizeof (XtPointer),
|
||||
R_Offset (push_function),
|
||||
XmRImmediate, (XtPointer) NULL
|
||||
},
|
||||
{
|
||||
XmNpushArgument,
|
||||
XmCPushArgument, XmRPointer, sizeof (XtPointer),
|
||||
R_Offset (push_argument),
|
||||
XmRImmediate, (XtPointer) NULL
|
||||
},
|
||||
{
|
||||
XmNimageName,
|
||||
XmCString, XmRString, sizeof (String),
|
||||
R_Offset (image_name),
|
||||
XmRImmediate, (XtPointer) ""
|
||||
},
|
||||
|
||||
{
|
||||
XmNcallback,
|
||||
XmCCallback, XmRCallback, sizeof(XtCallbackList),
|
||||
R_Offset (callback),
|
||||
XmRImmediate, (caddr_t) NULL
|
||||
},
|
||||
|
||||
{
|
||||
XmNmultiClick,
|
||||
XmCMultiClick, XmRMultiClick, sizeof (unsigned char),
|
||||
R_Offset (multiClick),
|
||||
XmRImmediate, (XtPointer) XmMULTICLICK_KEEP
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/* The button class record definition */
|
||||
|
||||
externaldef (dtbuttongadgetclassrec)
|
||||
DtButtonGadgetClassRec dtButtonGadgetClassRec=
|
||||
{
|
||||
{
|
||||
(WidgetClass) &xmGadgetClassRec, /* superclass */
|
||||
"DtButton", /* class_name */
|
||||
sizeof(DtButtonGadgetRec), /* widget_size */
|
||||
NULL, /* class_initialize */
|
||||
NULL, /* class_part_initialize */
|
||||
FALSE, /* class_inited */
|
||||
(XtInitProc) Initialize, /* initialize */
|
||||
NULL, /* initialize_hook */
|
||||
NULL, /* realize */
|
||||
NULL, /* actions */
|
||||
0, /* num_actions */
|
||||
resources, /* resources */
|
||||
XtNumber(resources), /* num_resources */
|
||||
NULLQUARK, /* xrm_class */
|
||||
TRUE, /* compress_motion */
|
||||
XtExposeCompressMaximal, /* compress_exposure */
|
||||
TRUE, /* compress_enterleave */
|
||||
FALSE, /* visible_interest */
|
||||
NULL, /* destroy */
|
||||
NULL, /* resize */
|
||||
(XtExposeProc) Redisplay, /* expose */
|
||||
(XtSetValuesFunc) SetValues, /* set_values */
|
||||
NULL, /* set_values_hook */
|
||||
XtInheritSetValuesAlmost, /* set_values_almost */
|
||||
NULL, /* get_values_hook */
|
||||
NULL, /* accept_focus */
|
||||
XtVersion, /* version */
|
||||
NULL, /* callback private */
|
||||
NULL, /* tm_table */
|
||||
NULL, /* query_geometry */
|
||||
NULL, /* display_accelerator */
|
||||
NULL, /* extension */
|
||||
},
|
||||
|
||||
/* XmGadget Part */
|
||||
{
|
||||
(XtWidgetProc) _XtInherit, /* Gadget border_highlight */
|
||||
(XtWidgetProc) _XtInherit, /* Gadget border_unhighlight */
|
||||
ArmAndActivate, /* arm_and_activate */
|
||||
(XmWidgetDispatchProc)InputDispatch, /* input_dispatch */
|
||||
VisualChange, /* visual_change */
|
||||
NULL, /* get resources */
|
||||
0, /* num get_resources */
|
||||
NULL, /* class_cache_part */
|
||||
NULL, /* extension */
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
externaldef(dtbuttonwidgetclass) WidgetClass dtButtonGadgetClass =
|
||||
(WidgetClass) &dtButtonGadgetClassRec;
|
||||
|
||||
|
||||
/************************************************************************
|
||||
*
|
||||
* Initialize
|
||||
* The main widget instance initialization routine.
|
||||
*
|
||||
************************************************************************/
|
||||
|
||||
static void
|
||||
Initialize(
|
||||
Widget request_w,
|
||||
Widget new_w )
|
||||
{
|
||||
DtButtonGadget request = (DtButtonGadget) request_w ;
|
||||
DtButtonGadget new_g = (DtButtonGadget) new_w ;
|
||||
XmManagerWidget mw = (XmManagerWidget) XtParent(new_w) ;
|
||||
|
||||
new_g->button.timer = 0;
|
||||
new_g->button.click_count = 0;
|
||||
new_g->button.armTimeStamp = 0;
|
||||
new_g->button.activateTimeStamp = 0;
|
||||
|
||||
B_Armed (new_g) = False;
|
||||
|
||||
/* Set the input mask for events handled by Manager.
|
||||
*/
|
||||
G_EventMask (new_g) = (XmARM_EVENT | XmACTIVATE_EVENT |
|
||||
XmMULTI_ARM_EVENT | XmMULTI_ACTIVATE_EVENT |
|
||||
XmHELP_EVENT | XmFOCUS_IN_EVENT |
|
||||
XmFOCUS_OUT_EVENT | XmENTER_EVENT | XmLEAVE_EVENT);
|
||||
|
||||
/* Get pixmap and mask, get pixmap geometry, get gcs.
|
||||
*/
|
||||
if (B_ImageName (new_g) != NULL)
|
||||
{
|
||||
String str = B_ImageName (new_g);
|
||||
B_ImageName (new_g) = XtMalloc (strlen (str) + 1);
|
||||
strcpy (B_ImageName (new_g), str);
|
||||
|
||||
B_Pixmap (new_g) =
|
||||
XmGetPixmap (XtScreen (new_g), B_ImageName (new_g),
|
||||
M_BottomShadowColor (mw),
|
||||
M_TopShadowColor (mw));
|
||||
B_Mask (new_g) =
|
||||
_DtGetMask (XtScreen (new_g), B_ImageName (new_g));
|
||||
|
||||
if (B_Pixmap (new_g) != XmUNSPECIFIED_PIXMAP)
|
||||
{
|
||||
Window root;
|
||||
int int_x = 0, int_y = 0;
|
||||
unsigned int int_w = 0, int_h = 0,
|
||||
int_bw, depth;
|
||||
|
||||
XGetGeometry (XtDisplay (new_g), B_Pixmap (new_g),
|
||||
&root, &int_x, &int_y, &int_w, &int_h,
|
||||
&int_bw, &depth);
|
||||
|
||||
B_PixmapWidth (new_g) = (Dimension) int_w;
|
||||
B_PixmapHeight (new_g) = (Dimension) int_h;
|
||||
}
|
||||
else
|
||||
{
|
||||
B_PixmapWidth (new_g) = 0;
|
||||
B_PixmapHeight (new_g) = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
B_Pixmap (new_g) = XmUNSPECIFIED_PIXMAP;
|
||||
B_Mask (new_g) = XmUNSPECIFIED_PIXMAP;
|
||||
B_PixmapWidth (new_g) = 0;
|
||||
B_PixmapHeight (new_g) = 0;
|
||||
}
|
||||
|
||||
GetGCs (new_w);
|
||||
|
||||
/* Set widget geometry.
|
||||
*/
|
||||
new_g -> gadget.shadow_thickness = 1;
|
||||
new_g -> gadget.highlight_thickness = 1;
|
||||
if (G_Width(request) == 0)
|
||||
{
|
||||
if (B_PixmapWidth (new_g) > 0)
|
||||
G_Width(new_g) = B_PixmapWidth (new_g) + 4;
|
||||
else
|
||||
G_Width(new_g) = 10;
|
||||
}
|
||||
if (G_Height(request) == 0)
|
||||
{
|
||||
if (B_PixmapHeight (new_g) > 0)
|
||||
G_Height(new_g) = B_PixmapHeight (new_g) + 4;
|
||||
else
|
||||
G_Height(new_g) = 10;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/************************************************************************
|
||||
*
|
||||
* GetGCs
|
||||
* Get the graphics context used for drawing the button.
|
||||
*
|
||||
************************************************************************/
|
||||
|
||||
static void
|
||||
GetGCs(
|
||||
Widget w )
|
||||
{
|
||||
DtButtonGadget bg = (DtButtonGadget) w ;
|
||||
XmManagerWidget mw = (XmManagerWidget) XtParent(w) ;
|
||||
XGCValues values;
|
||||
XtGCMask valueMask;
|
||||
|
||||
valueMask = GCForeground | GCBackground;
|
||||
|
||||
values.foreground = M_Foreground(mw);
|
||||
values.background = M_Background(mw);
|
||||
bg -> button.gc_normal = XtGetGC ((Widget) mw, valueMask, &values);
|
||||
|
||||
values.foreground = B_ArmColor (bg);
|
||||
bg -> button.gc_armed_bg = XtGetGC ((Widget) mw, valueMask, &values);
|
||||
|
||||
values.foreground = M_Background(mw);
|
||||
values.background = M_Foreground(mw);
|
||||
bg -> button.gc_background = XtGetGC ((Widget) mw, valueMask, &values);
|
||||
|
||||
/* Get Clip GC
|
||||
*/
|
||||
if (B_Mask(bg) != XmUNSPECIFIED_PIXMAP)
|
||||
{
|
||||
valueMask = GCForeground | GCBackground | GCClipMask;
|
||||
values.clip_mask = B_Mask(bg);
|
||||
values.foreground = M_Foreground (mw);
|
||||
values.background = M_Background (mw);
|
||||
bg->button.gc_clip = XtGetGC ((Widget) mw, valueMask, &values);
|
||||
}
|
||||
else
|
||||
bg->button.gc_clip = NULL;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
UpdateGCs(
|
||||
Widget w )
|
||||
{
|
||||
DtButtonGadget bg = (DtButtonGadget) w ;
|
||||
XmManagerWidget mw = (XmManagerWidget) XtParent(w) ;
|
||||
XGCValues values;
|
||||
|
||||
XtReleaseGC ((Widget) mw, bg->button.gc_normal);
|
||||
XtReleaseGC ((Widget) mw, bg->button.gc_background);
|
||||
XtReleaseGC ((Widget) mw, bg->button.gc_armed_bg);
|
||||
|
||||
if (bg->button.gc_clip != NULL)
|
||||
XtReleaseGC ((Widget) mw, bg->button.gc_clip);
|
||||
|
||||
GetGCs (w);
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
*
|
||||
* Redisplay
|
||||
* General redisplay function called on exposure events.
|
||||
*
|
||||
************************************************************************/
|
||||
/* ARGSUSED */
|
||||
static void
|
||||
Redisplay(
|
||||
Widget w,
|
||||
XEvent *event,
|
||||
Region region )
|
||||
{
|
||||
DtButtonGadget bg = (DtButtonGadget) w;
|
||||
XmManagerWidget mw = (XmManagerWidget) XtParent(w);
|
||||
Dimension s_t = bg -> gadget.shadow_thickness;
|
||||
Dimension h_t = bg -> gadget.highlight_thickness;
|
||||
Position x;
|
||||
Pixmap pix;
|
||||
GC gc;
|
||||
|
||||
gc = (B_Armed (bg)) ? bg -> button.gc_armed_bg : bg -> button.gc_background;
|
||||
XFillRectangle (XtDisplay (bg), XtWindow (bg),
|
||||
gc, G_X(bg) +s_t + h_t, G_Y(bg) + s_t + h_t,
|
||||
G_Width(bg) - 2 * (s_t + h_t),
|
||||
G_Height(bg) - 2 * (s_t + h_t));
|
||||
|
||||
if (s_t > 0)
|
||||
{
|
||||
GC gc1, gc2;
|
||||
if (B_Armed (bg))
|
||||
{
|
||||
gc1 = XmParentBottomShadowGC(w);
|
||||
gc2 = XmParentTopShadowGC(w);
|
||||
}
|
||||
else
|
||||
{
|
||||
gc1 = bg -> button.gc_background;
|
||||
gc2 = bg -> button.gc_background;
|
||||
}
|
||||
XmeDrawShadows (XtDisplay(bg), XtWindow (bg), gc1, gc2,
|
||||
G_X(bg) + h_t, G_Y(bg) + h_t,
|
||||
G_Width(bg) - 2 * h_t, G_Height(bg) - 2 * h_t,
|
||||
s_t,XmSHADOW_OUT);
|
||||
}
|
||||
|
||||
x = G_X(bg) + ((Position)(G_Width(bg) - B_PixmapWidth (bg))/2);
|
||||
if (x % 2 == 1)
|
||||
x++;
|
||||
|
||||
if (B_Mask (bg) != XmUNSPECIFIED_PIXMAP)
|
||||
{
|
||||
gc = bg->button.gc_clip;
|
||||
XSetClipMask (XtDisplay(bg), gc, B_Mask (bg));
|
||||
XSetClipOrigin (XtDisplay(bg), gc,
|
||||
x, G_Y(bg) + (Position)(G_Height(bg) - B_PixmapHeight (bg))/2);
|
||||
}
|
||||
else
|
||||
gc = bg->button.gc_normal;
|
||||
|
||||
pix = B_Pixmap (bg);
|
||||
if ((gc != NULL) && (pix != XmUNSPECIFIED_PIXMAP))
|
||||
{
|
||||
XCopyArea (XtDisplay ((Widget) bg), pix, XtWindow ((Widget) bg), gc, 0, 0,
|
||||
B_PixmapWidth (bg), B_PixmapHeight (bg),
|
||||
x, G_Y(bg) + (Position)(G_Height(bg) - B_PixmapHeight (bg))/2);
|
||||
}
|
||||
|
||||
if (bg -> gadget.highlighted)
|
||||
(*(xmGadgetClassRec.gadget_class.border_highlight))((Widget) bg);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
*
|
||||
* Destroy
|
||||
* Clean up allocated resources when the widget is destroyed.
|
||||
*
|
||||
************************************************************************/
|
||||
#if 0
|
||||
static void
|
||||
Destroy(
|
||||
Widget w )
|
||||
{
|
||||
DtButtonGadget bg = (DtButtonGadget) w ;
|
||||
|
||||
if (bg->button.timer)
|
||||
XtRemoveTimeOut (bg->button.timer);
|
||||
|
||||
XtReleaseGC (w, bg -> button.gc_normal);
|
||||
XtReleaseGC (w, bg -> button.gc_background);
|
||||
XtReleaseGC (w, bg -> button.gc_armed_bg);
|
||||
if (bg -> button.gc_clip != NULL)
|
||||
XtReleaseGC (w, bg -> button.gc_clip);
|
||||
|
||||
XtRemoveAllCallbacks (w, "callback");
|
||||
}
|
||||
#endif /* 0 */
|
||||
|
||||
|
||||
|
||||
/************************************************************************
|
||||
*
|
||||
* SetValues
|
||||
* Note: The only implementation within this function is to
|
||||
* support the resetting of the image, cursor, and functions
|
||||
* as needed by the front panel.
|
||||
*
|
||||
************************************************************************/
|
||||
|
||||
/* ARGSUSED */
|
||||
static Boolean
|
||||
SetValues(
|
||||
Widget current_w,
|
||||
Widget request_w,
|
||||
Widget new_w )
|
||||
|
||||
{
|
||||
DtButtonGadget current = (DtButtonGadget) current_w;
|
||||
DtButtonGadget request = (DtButtonGadget) request_w;
|
||||
DtButtonGadget new_g = (DtButtonGadget) new_w;
|
||||
XmManagerWidget mw = (XmManagerWidget) XtParent(new_w);
|
||||
Boolean returnFlag = FALSE;
|
||||
Cursor cursor;
|
||||
|
||||
G_EventMask (new_g) = (XmARM_EVENT | XmACTIVATE_EVENT |
|
||||
XmMULTI_ARM_EVENT | XmMULTI_ACTIVATE_EVENT |
|
||||
XmHELP_EVENT | XmFOCUS_IN_EVENT |
|
||||
XmFOCUS_OUT_EVENT | XmENTER_EVENT | XmLEAVE_EVENT);
|
||||
|
||||
/* Change the image */
|
||||
|
||||
if (strcmp (B_ImageName (current), B_ImageName (new_g)) != 0)
|
||||
{
|
||||
String str = B_ImageName (new_g);
|
||||
|
||||
XtFree (B_ImageName (current));
|
||||
B_ImageName (new_g) = XtMalloc (strlen (str) + 1);
|
||||
strcpy (B_ImageName (new_g), str);
|
||||
|
||||
B_Pixmap (new_g) =
|
||||
XmGetPixmap (XtScreen (new_g), B_ImageName (new_g),
|
||||
M_BottomShadowColor (mw),
|
||||
M_TopShadowColor (mw));
|
||||
B_Mask (new_g) =
|
||||
_DtGetMask (XtScreen (new_g), B_ImageName (new_g));
|
||||
|
||||
if (B_Pixmap (new_g) != XmUNSPECIFIED_PIXMAP)
|
||||
{
|
||||
Window root;
|
||||
int int_x = 0, int_y = 0;
|
||||
unsigned int int_w = 0, int_h = 0,
|
||||
int_bw, depth;
|
||||
|
||||
XGetGeometry (XtDisplay (new_g), B_Pixmap (new_g),
|
||||
&root, &int_x, &int_y, &int_w, &int_h, &int_bw, &depth);
|
||||
|
||||
B_PixmapWidth (new_g) = (Dimension) int_w;
|
||||
B_PixmapHeight (new_g) = (Dimension) int_h;
|
||||
}
|
||||
else
|
||||
{
|
||||
B_PixmapWidth (new_g) = 0;
|
||||
B_PixmapHeight (new_g) = 0;
|
||||
}
|
||||
|
||||
UpdateGCs(new_w);
|
||||
|
||||
returnFlag = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (B_ImageName (new_g) != B_ImageName (current))
|
||||
{
|
||||
String str = B_ImageName (new_g);
|
||||
|
||||
XtFree (B_ImageName (current));
|
||||
B_ImageName (new_g) = XtMalloc (strlen (str) + 1);
|
||||
strcpy (B_ImageName (new_g), str);
|
||||
}
|
||||
}
|
||||
|
||||
return (returnFlag);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/************************************************************************
|
||||
*
|
||||
* arm
|
||||
* This function processes button 1 down occuring on the button.
|
||||
*
|
||||
************************************************************************/
|
||||
|
||||
static void
|
||||
Arm(
|
||||
Widget w,
|
||||
XEvent *event,
|
||||
String *params,
|
||||
Cardinal *num_params )
|
||||
{
|
||||
DtButtonGadget bg = (DtButtonGadget) w ;
|
||||
|
||||
(void) XmProcessTraversal((Widget) bg, XmTRAVERSE_CURRENT);
|
||||
|
||||
B_Armed (bg) = True;
|
||||
|
||||
if ((event->xbutton.time - bg->button.armTimeStamp) >
|
||||
XtGetMultiClickTime(XtDisplay(bg)))
|
||||
{
|
||||
bg -> button.armTimeStamp = event->xbutton.time;
|
||||
B_Expose ( w, event, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
*
|
||||
* disarm
|
||||
* This function processes button 1 up occuring on the button.
|
||||
*
|
||||
************************************************************************/
|
||||
|
||||
static void
|
||||
Disarm(
|
||||
Widget w,
|
||||
XEvent *event,
|
||||
String *params,
|
||||
Cardinal *num_params )
|
||||
{
|
||||
DtButtonGadget bg = (DtButtonGadget) w ;
|
||||
|
||||
B_Armed (bg) = False;
|
||||
|
||||
B_Expose (w, event, NULL);
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
*
|
||||
* activate
|
||||
* This function processes button 1 up occuring on the button.
|
||||
* If the button 1 up occurred inside the button the activate
|
||||
* callbacks are called.
|
||||
*
|
||||
************************************************************************/
|
||||
|
||||
static void
|
||||
Activate(
|
||||
Widget w,
|
||||
XEvent *event,
|
||||
String *params,
|
||||
Cardinal *num_params )
|
||||
{
|
||||
DtButtonGadget bg = (DtButtonGadget) w ;
|
||||
DtButtonCallbackStruct call_value;
|
||||
Dimension bw = G_BorderWidth(bg);
|
||||
|
||||
if (!B_Armed (bg))
|
||||
return;
|
||||
|
||||
if ((event->xbutton.time - bg->button.activateTimeStamp) >
|
||||
XtGetMultiClickTime(XtDisplay(bg)))
|
||||
{
|
||||
bg -> button.activateTimeStamp = event->xbutton.time;
|
||||
bg->button.click_count = 1;
|
||||
}
|
||||
else
|
||||
bg->button.click_count++;
|
||||
|
||||
B_Armed (bg) = False;
|
||||
|
||||
if (bg->button.callback)
|
||||
{
|
||||
call_value.reason = XmCR_ACTIVATE;
|
||||
call_value.event = event;
|
||||
call_value.click_count = bg->button.click_count;
|
||||
|
||||
if ((bg->button.multiClick == XmMULTICLICK_DISCARD) &&
|
||||
(call_value.click_count > 1)) {
|
||||
return;
|
||||
}
|
||||
|
||||
XFlush(XtDisplay(bg));
|
||||
|
||||
CallCallback (bg, B_Callback (bg), XmCR_ACTIVATE, event);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
*
|
||||
* ArmAndActivate
|
||||
*
|
||||
************************************************************************/
|
||||
|
||||
static void
|
||||
ArmAndActivate(
|
||||
Widget w,
|
||||
XEvent *event,
|
||||
String *params,
|
||||
Cardinal *num_params )
|
||||
{
|
||||
DtButtonCallbackStruct call_value;
|
||||
DtButtonGadget bg = (DtButtonGadget) w ;
|
||||
|
||||
B_Armed (bg) = True;
|
||||
Redisplay ( w, event, FALSE);
|
||||
|
||||
XFlush (XtDisplay (bg));
|
||||
|
||||
call_value.reason = XmCR_ACTIVATE;
|
||||
call_value.event = event;
|
||||
call_value.click_count = 1; /* always 1 in kselect */
|
||||
|
||||
if (bg->button.callback)
|
||||
{
|
||||
XFlush (XtDisplay (bg));
|
||||
CallCallback (bg, B_Callback (bg), XmCR_ACTIVATE, event);
|
||||
}
|
||||
B_Armed (bg) = False;
|
||||
|
||||
/* If the button is still around, show it released, after a short delay */
|
||||
|
||||
if (bg->object.being_destroyed == False)
|
||||
{
|
||||
bg->button.timer = XtAppAddTimeOut(
|
||||
XtWidgetToApplicationContext((Widget)bg),
|
||||
(unsigned long) DELAY_DEFAULT,
|
||||
(XtTimerCallbackProc)ArmTimeout,
|
||||
(caddr_t)bg);
|
||||
}
|
||||
}
|
||||
|
||||
/* ARGSUSED */
|
||||
static void
|
||||
ArmTimeout(
|
||||
Widget w,
|
||||
XtIntervalId *id )
|
||||
{
|
||||
DtButtonGadget bg = (DtButtonGadget) w ;
|
||||
|
||||
bg -> button.timer = 0;
|
||||
if (XtIsRealized ((Widget)bg) && XtIsManaged ((Widget)bg)) {
|
||||
Redisplay ( w, NULL, FALSE);
|
||||
XFlush (XtDisplay (bg));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/*-------------------------------------------------------------
|
||||
** InputDispatch
|
||||
** Process event dispatched from parent or event handler.
|
||||
*/
|
||||
static void
|
||||
InputDispatch(
|
||||
Widget w,
|
||||
XButtonEvent *event,
|
||||
Mask event_mask )
|
||||
{
|
||||
DtButtonGadget bg = (DtButtonGadget) w ;
|
||||
|
||||
if (event_mask & XmARM_EVENT ||
|
||||
event_mask & XmMULTI_ARM_EVENT)
|
||||
{
|
||||
if (event->button == Button1)
|
||||
Arm (w, (XEvent*) event, (String *)NULL, (Cardinal)0);
|
||||
}
|
||||
else if (event_mask & XmACTIVATE_EVENT ||
|
||||
event_mask & XmMULTI_ACTIVATE_EVENT)
|
||||
{
|
||||
if (event->button == Button1)
|
||||
{
|
||||
if (event->x >= G_X (bg) &&
|
||||
event->x <= (Position)(G_X (bg) + G_Width (bg)) &&
|
||||
event->y >= G_Y (bg) &&
|
||||
event->y <= (Position)(G_Y (bg) + G_Height (bg)))
|
||||
{
|
||||
Activate (w, (XEvent*) event,
|
||||
(String *)NULL, (Cardinal)0);
|
||||
Disarm (w, (XEvent*) event,
|
||||
(String *)NULL, (Cardinal)0);
|
||||
}
|
||||
else
|
||||
Disarm (w, (XEvent*) event,
|
||||
(String *)NULL, (Cardinal)0);
|
||||
}
|
||||
}
|
||||
else if (event_mask & XmHELP_EVENT)
|
||||
_XmSocorro (w, (XEvent *)event,
|
||||
(String *)NULL,(Cardinal)0);
|
||||
else if (event_mask & XmENTER_EVENT)
|
||||
Enter (w, (XEvent *)event, (String *)NULL,(Cardinal)0);
|
||||
else if (event_mask & XmLEAVE_EVENT)
|
||||
Leave (w, (XEvent *)event, (String *)NULL,(Cardinal)0);
|
||||
else if (event_mask & XmFOCUS_IN_EVENT)
|
||||
_XmFocusInGadget (w, (XEvent *)event,
|
||||
(String *)NULL,(Cardinal)0);
|
||||
else if (event_mask & XmFOCUS_OUT_EVENT)
|
||||
_XmFocusOutGadget (w, (XEvent *)event,
|
||||
(String *)NULL,(Cardinal)0);
|
||||
}
|
||||
|
||||
|
||||
/*-------------------------------------------------------------
|
||||
** VisualChange
|
||||
** Update GCs when parent visuals change.
|
||||
*/
|
||||
static Boolean
|
||||
VisualChange(
|
||||
Widget w,
|
||||
Widget current_w,
|
||||
Widget new_w )
|
||||
{
|
||||
XmManagerWidget current = (XmManagerWidget) current_w;
|
||||
XmManagerWidget new_m = (XmManagerWidget) new_w;
|
||||
DtButtonGadget bg = (DtButtonGadget) w ;
|
||||
Boolean update = False;
|
||||
|
||||
/* If the parent foreground or background has changed,
|
||||
* then update gcs and pixmap.
|
||||
*/
|
||||
if (M_Foreground (current) != M_Foreground (new_m) ||
|
||||
M_Background (current) != M_Background (new_m))
|
||||
{
|
||||
UpdateGCs(w);
|
||||
update = True;
|
||||
}
|
||||
|
||||
if (update)
|
||||
{
|
||||
if (B_ImageName (bg) != NULL)
|
||||
{
|
||||
if (B_Mask(bg) != XmUNSPECIFIED_PIXMAP)
|
||||
XmDestroyPixmap (XtScreen(bg), B_Mask(bg));
|
||||
|
||||
if (B_Pixmap(bg) != XmUNSPECIFIED_PIXMAP)
|
||||
XmDestroyPixmap (XtScreen(w), B_Pixmap (bg));
|
||||
|
||||
B_Pixmap (bg) = XmGetPixmap (XtScreen (bg), B_ImageName (bg),
|
||||
M_TopShadowColor (new_m),
|
||||
M_BottomShadowColor (new_m));
|
||||
|
||||
if (B_Pixmap (bg) != XmUNSPECIFIED_PIXMAP)
|
||||
B_Mask(bg) = (Pixmap)_DtGetMask(XtScreen(bg), B_ImageName(bg));
|
||||
|
||||
return (True);
|
||||
}
|
||||
else
|
||||
return (False);
|
||||
}
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
*
|
||||
* Enter
|
||||
*
|
||||
************************************************************************/
|
||||
|
||||
static void
|
||||
Enter(
|
||||
Widget wid,
|
||||
XEvent *event,
|
||||
String *params,
|
||||
Cardinal *num_params )
|
||||
{
|
||||
DtButtonGadget bg = (DtButtonGadget) wid ;
|
||||
|
||||
_XmEnterGadget (wid, (XEvent *)event, (String *)NULL,(Cardinal *)0);
|
||||
|
||||
if (B_Armed (bg))
|
||||
B_Expose (wid, event, NULL);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/************************************************************************
|
||||
*
|
||||
* Leave
|
||||
*
|
||||
************************************************************************/
|
||||
|
||||
static void
|
||||
Leave(
|
||||
Widget wid,
|
||||
XEvent *event,
|
||||
String *params,
|
||||
Cardinal *num_params )
|
||||
{
|
||||
DtButtonGadget bg = (DtButtonGadget) wid ;
|
||||
|
||||
_XmLeaveGadget (wid, (XEvent *)event, (String *)NULL, (Cardinal *)0);
|
||||
|
||||
if (B_Armed (bg))
|
||||
{
|
||||
B_Armed (bg) = False;
|
||||
B_Expose (wid, event, NULL);
|
||||
B_Armed (bg) = True;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*-------------------------------------------------------------
|
||||
** CallCallback
|
||||
** Call callback, if any, with reason and event.
|
||||
*/
|
||||
static void
|
||||
CallCallback(
|
||||
DtButtonGadget w,
|
||||
XtCallbackList cb,
|
||||
int reason,
|
||||
XEvent *event )
|
||||
{
|
||||
DtControlCallbackStruct cb_data;
|
||||
|
||||
if (cb != NULL)
|
||||
{
|
||||
cb_data.reason = reason;
|
||||
cb_data.event = event;
|
||||
cb_data.control_type = XmCONTROL_BUTTON;
|
||||
cb_data.set = False;
|
||||
cb_data.subpanel = B_Subpanel (w);
|
||||
cb_data.push_function = B_PushFunction (w);
|
||||
cb_data.push_argument = B_PushArgument (w);
|
||||
cb_data.file_size = 0;
|
||||
XtCallCallbackList ((Widget) w, cb, &cb_data);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*-------------------------------------------------------------
|
||||
** DefaultSelectColor
|
||||
** Resource proc. to determine the default select color.
|
||||
** (Formerly _XmSelectColorDefault).
|
||||
*/
|
||||
static void
|
||||
DefaultSelectColor(
|
||||
Widget widget,
|
||||
int offset,
|
||||
XrmValue *value )
|
||||
{
|
||||
XmeGetDefaultPixel (widget, XmSELECT, offset, value);
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
*
|
||||
* DtCreateButtonGadget
|
||||
* Create an instance of an button and return the widget id.
|
||||
*
|
||||
************************************************************************/
|
||||
|
||||
Widget
|
||||
DtCreateButtonGadget(
|
||||
Widget parent,
|
||||
char *name,
|
||||
ArgList arglist,
|
||||
Cardinal argcount )
|
||||
{
|
||||
return (XtCreateWidget (name, dtButtonGadgetClass,
|
||||
parent, arglist, argcount));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user