|
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: Scale.c /main/31 1999/10/13 16:18:07 mgreess $"
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
/* (c) Copyright 1989, DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. */
|
|
Packit |
b099d7 |
/* (c) Copyright 1987, 1988, 1989, 1990, 1991, 1992 HEWLETT-PACKARD COMPANY */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifdef HAVE_CONFIG_H
|
|
Packit |
b099d7 |
#include <config.h>
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#include <stdio.h>
|
|
Packit |
b099d7 |
#include <limits.h>
|
|
Packit |
b099d7 |
#ifndef CSRG_BASED
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Modification by Integrated Computer Solutions, Inc. May 2000
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Original:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* # ifdef linux
|
|
Packit |
b099d7 |
* # define RADIXCHAR MON_DECIMAL_POINT
|
|
Packit |
b099d7 |
* # endif
|
|
Packit |
b099d7 |
* # include <langinfo.h>
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* glibc >= 2.0 defines RADIXCHAR in langinfo.h, simply make sure
|
|
Packit |
b099d7 |
* that it is not redefined here.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
# include <langinfo.h>
|
|
Packit |
b099d7 |
# if defined(linux) && !defined(RADIXCHAR)
|
|
Packit |
b099d7 |
# define RADIXCHAR DECIMAL_POINT
|
|
Packit |
b099d7 |
# endif
|
|
Packit |
b099d7 |
# ifdef X_LOCALE
|
|
Packit |
b099d7 |
# ifdef linux
|
|
Packit |
b099d7 |
/* avoid conflicting with <X11/Xlocale.h> defines */
|
|
Packit |
b099d7 |
# undef LC_ALL
|
|
Packit |
b099d7 |
# undef LC_COLLATE
|
|
Packit |
b099d7 |
# undef LC_CTYPE
|
|
Packit |
b099d7 |
# undef LC_MONETARY
|
|
Packit |
b099d7 |
# undef LC_NUMERIC
|
|
Packit |
b099d7 |
# undef LC_TIME
|
|
Packit |
b099d7 |
# endif
|
|
Packit |
b099d7 |
# endif
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
# define nl_langinfo(radixchar) "."
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
#ifdef __cplusplus
|
|
Packit |
b099d7 |
extern "C" { /* some 'locale.h' do not have prototypes (sun) */
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
#include <X11/Xlocale.h>
|
|
Packit |
b099d7 |
#ifdef __cplusplus
|
|
Packit |
b099d7 |
} /* Close scope of 'extern "C"' declaration */
|
|
Packit |
b099d7 |
#endif /* __cplusplus */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#include <Xm/AtomMgr.h>
|
|
Packit |
b099d7 |
#include <Xm/DisplayP.h>
|
|
Packit |
b099d7 |
#include <Xm/DragC.h>
|
|
Packit |
b099d7 |
#include <Xm/DragIconP.h>
|
|
Packit |
b099d7 |
#include <Xm/LabelG.h>
|
|
Packit |
b099d7 |
#include <Xm/ScaleP.h>
|
|
Packit |
b099d7 |
#include <Xm/ScrollBarP.h> /* for slider geometrical data */
|
|
Packit |
b099d7 |
#include <Xm/TraitP.h>
|
|
Packit |
b099d7 |
#include <Xm/TransferT.h>
|
|
Packit |
b099d7 |
#include <Xm/XmosP.h>
|
|
Packit |
b099d7 |
#include <Xm/VaSimpleP.h>
|
|
Packit |
b099d7 |
#include "GeoUtilsI.h"
|
|
Packit |
b099d7 |
#include "GMUtilsI.h"
|
|
Packit |
b099d7 |
#include "MessagesI.h"
|
|
Packit |
b099d7 |
#include "RepTypeI.h"
|
|
Packit |
b099d7 |
#include "TransferI.h"
|
|
Packit |
b099d7 |
#include "TraversalI.h"
|
|
Packit |
b099d7 |
#include "XmI.h"
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define FIX_1528
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define state_flags last_value
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define MESSAGE1 _XmMMsgScale_0000
|
|
Packit |
b099d7 |
#define MESSAGE2 _XmMMsgScale_0001
|
|
Packit |
b099d7 |
#define MESSAGE3 _XmMMsgScale_0002
|
|
Packit |
b099d7 |
#define MESSAGE5 _XmMMsgScaleScrBar_0004
|
|
Packit |
b099d7 |
#define MESSAGE7 _XmMMsgScale_0006
|
|
Packit |
b099d7 |
#define MESSAGE8 _XmMMsgScale_0007
|
|
Packit |
b099d7 |
#define MESSAGE9 _XmMMsgScale_0008
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static Region null_region = NULL;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Convenience macros and definitions */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define TotalWidth(w) (w->core.width + (w->core.border_width * 2))
|
|
Packit |
b099d7 |
#define TotalHeight(w) (w->core.height + (w->core.border_width * 2))
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define SCROLLBAR_MAX 1000000000
|
|
Packit |
b099d7 |
#define SCALE_VALUE_MARGIN 3
|
|
Packit |
b099d7 |
#define SCALE_DEFAULT_MAJOR_SIZE \
|
|
Packit |
b099d7 |
(100 + (2 * sw->scale.highlight_thickness))
|
|
Packit |
b099d7 |
#define SCALE_DEFAULT_MINOR_SIZE \
|
|
Packit |
b099d7 |
(15 + (2 * sw->scale.highlight_thickness))
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define SLIDER_SIZE(sca) ((sca->scale.sliding_mode == XmTHERMOMETER)?\
|
|
Packit |
b099d7 |
0:sca->scale.slider_size)
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* this one is context dependent, args and n are used */
|
|
Packit |
b099d7 |
#define SET(name, val) {XtSetArg (args[n], (name), (val)); n++;}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define LeadXTic(sb, sca) (sb->scrollBar.slider_area_x \
|
|
Packit |
b099d7 |
+ (Dimension) (((float) SLIDER_SIZE(sca) / 2.0) + 0.5))
|
|
Packit |
b099d7 |
#define LeadYTic(sb, sca) (sb->scrollBar.slider_area_y \
|
|
Packit |
b099d7 |
+ (Dimension) (((float) SLIDER_SIZE(sca) / 2.0) + 0.5))
|
|
Packit |
b099d7 |
#define TrailXTic(sb, sca) (sb->core.width - (sb->scrollBar.slider_area_x \
|
|
Packit |
b099d7 |
+ sb->scrollBar.slider_area_width\
|
|
Packit |
b099d7 |
- (Dimension) (((float) SLIDER_SIZE(sca) / 2.0) + 0.5)))
|
|
Packit |
b099d7 |
#define TrailYTic(sb, sca) (sb->core.height - (sb->scrollBar.slider_area_y \
|
|
Packit |
b099d7 |
+ sb->scrollBar.slider_area_height\
|
|
Packit |
b099d7 |
- (Dimension) (((float) SLIDER_SIZE(sca) / 2.0) + 0.5)))
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/******** Static Function Declarations ********/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void ScaleGetTitleString(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
int resource,
|
|
Packit |
b099d7 |
XtArgVal *value) ;
|
|
Packit |
b099d7 |
static void ClassInitialize( void ) ;
|
|
Packit |
b099d7 |
static void ClassPartInitialize(
|
|
Packit |
b099d7 |
WidgetClass wc) ;
|
|
Packit |
b099d7 |
static void ProcessingDirectionDefault(
|
|
Packit |
b099d7 |
XmScaleWidget widget,
|
|
Packit |
b099d7 |
int offset,
|
|
Packit |
b099d7 |
XrmValue *value) ;
|
|
Packit |
b099d7 |
static void SliderVisualDefault(
|
|
Packit |
b099d7 |
XmScaleWidget widget,
|
|
Packit |
b099d7 |
int offset,
|
|
Packit |
b099d7 |
XrmValue *value) ;
|
|
Packit |
b099d7 |
static void SliderMarkDefault(
|
|
Packit |
b099d7 |
XmScaleWidget widget,
|
|
Packit |
b099d7 |
int offset,
|
|
Packit |
b099d7 |
XrmValue *value) ;
|
|
Packit |
b099d7 |
static void EditableDefault(
|
|
Packit |
b099d7 |
XmScaleWidget widget,
|
|
Packit |
b099d7 |
int offset,
|
|
Packit |
b099d7 |
XrmValue *value) ;
|
|
Packit |
b099d7 |
static void ValidateInitialState(
|
|
Packit |
b099d7 |
XmScaleWidget req,
|
|
Packit |
b099d7 |
XmScaleWidget new_w) ;
|
|
Packit |
b099d7 |
static Widget CreateScaleTitle(
|
|
Packit |
b099d7 |
XmScaleWidget new_w) ;
|
|
Packit |
b099d7 |
static Widget CreateScaleScrollBar(
|
|
Packit |
b099d7 |
XmScaleWidget new_w) ;
|
|
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 GetForegroundGC(
|
|
Packit |
b099d7 |
XmScaleWidget sw) ;
|
|
Packit |
b099d7 |
static void Redisplay(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
XEvent *event,
|
|
Packit |
b099d7 |
Region region) ;
|
|
Packit |
b099d7 |
static void CalcScrollBarData(
|
|
Packit |
b099d7 |
XmScaleWidget sw,
|
|
Packit |
b099d7 |
int *value,
|
|
Packit |
b099d7 |
int *slider_size,
|
|
Packit |
b099d7 |
int *increment,
|
|
Packit |
b099d7 |
int *page) ;
|
|
Packit |
b099d7 |
static void Resize(
|
|
Packit |
b099d7 |
Widget wid) ;
|
|
Packit |
b099d7 |
static void ValidateInputs(
|
|
Packit |
b099d7 |
XmScaleWidget cur,
|
|
Packit |
b099d7 |
XmScaleWidget new_w) ;
|
|
Packit |
b099d7 |
static void HandleTitle(
|
|
Packit |
b099d7 |
XmScaleWidget cur,
|
|
Packit |
b099d7 |
XmScaleWidget req,
|
|
Packit |
b099d7 |
XmScaleWidget new_w) ;
|
|
Packit |
b099d7 |
static void HandleScrollBar(
|
|
Packit |
b099d7 |
XmScaleWidget cur,
|
|
Packit |
b099d7 |
XmScaleWidget req,
|
|
Packit |
b099d7 |
XmScaleWidget new_w) ;
|
|
Packit |
b099d7 |
static Boolean SetValues(
|
|
Packit |
b099d7 |
Widget cw,
|
|
Packit |
b099d7 |
Widget rw,
|
|
Packit |
b099d7 |
Widget nw,
|
|
Packit |
b099d7 |
ArgList args_in,
|
|
Packit |
b099d7 |
Cardinal *num_args_in) ;
|
|
Packit |
b099d7 |
static void Realize(
|
|
Packit |
b099d7 |
register Widget w,
|
|
Packit |
b099d7 |
XtValueMask *p_valueMask,
|
|
Packit |
b099d7 |
XSetWindowAttributes *attributes) ;
|
|
Packit |
b099d7 |
static void Destroy(
|
|
Packit |
b099d7 |
Widget wid) ;
|
|
Packit |
b099d7 |
static XtGeometryResult GeometryManager(
|
|
Packit |
b099d7 |
Widget w,
|
|
Packit |
b099d7 |
XtWidgetGeometry *request,
|
|
Packit |
b099d7 |
XtWidgetGeometry *reply) ;
|
|
Packit |
b099d7 |
static Dimension MaxLabelWidth(
|
|
Packit |
b099d7 |
XmScaleWidget sw) ;
|
|
Packit |
b099d7 |
static Dimension MaxLabelHeight(
|
|
Packit |
b099d7 |
XmScaleWidget sw) ;
|
|
Packit |
b099d7 |
static Dimension ValueTroughWidth(
|
|
Packit |
b099d7 |
XmScaleWidget sw) ;
|
|
Packit |
b099d7 |
static Dimension ValueTroughHeight(
|
|
Packit |
b099d7 |
XmScaleWidget sw) ;
|
|
Packit |
b099d7 |
static Dimension ValueTroughAscent(
|
|
Packit |
b099d7 |
XmScaleWidget sw) ;
|
|
Packit |
b099d7 |
static Dimension ValueTroughDescent(
|
|
Packit |
b099d7 |
XmScaleWidget sw) ;
|
|
Packit |
b099d7 |
static Dimension TitleWidth(
|
|
Packit |
b099d7 |
XmScaleWidget sw) ;
|
|
Packit |
b099d7 |
static Dimension TitleHeight(
|
|
Packit |
b099d7 |
XmScaleWidget sw) ;
|
|
Packit |
b099d7 |
static Cardinal NumManaged(
|
|
Packit |
b099d7 |
XmScaleWidget sw,
|
|
Packit |
b099d7 |
Widget * first_man,
|
|
Packit |
b099d7 |
Widget * last_man);
|
|
Packit |
b099d7 |
static Dimension MajorLeadPad(
|
|
Packit |
b099d7 |
XmScaleWidget sw) ;
|
|
Packit |
b099d7 |
static Dimension MajorTrailPad(
|
|
Packit |
b099d7 |
XmScaleWidget sw) ;
|
|
Packit |
b099d7 |
static Dimension ScrollWidth(
|
|
Packit |
b099d7 |
XmScaleWidget sw) ;
|
|
Packit |
b099d7 |
static Dimension ScrollHeight(
|
|
Packit |
b099d7 |
XmScaleWidget sw) ;
|
|
Packit |
b099d7 |
static void GetScaleSize(
|
|
Packit |
b099d7 |
XmScaleWidget sw,
|
|
Packit |
b099d7 |
Dimension *w,
|
|
Packit |
b099d7 |
Dimension *h) ;
|
|
Packit |
b099d7 |
static void LayoutHorizontalLabels(
|
|
Packit |
b099d7 |
XmScaleWidget sw,
|
|
Packit |
b099d7 |
XRectangle *scrollBox,
|
|
Packit |
b099d7 |
XRectangle *labelBox,
|
|
Packit |
b099d7 |
Widget instigator) ;
|
|
Packit |
b099d7 |
static void LayoutHorizontalScale(
|
|
Packit |
b099d7 |
XmScaleWidget sw,
|
|
Packit |
b099d7 |
XtWidgetGeometry * desired,
|
|
Packit |
b099d7 |
Widget instigator) ;
|
|
Packit |
b099d7 |
static void LayoutVerticalLabels(
|
|
Packit |
b099d7 |
XmScaleWidget sw,
|
|
Packit |
b099d7 |
XRectangle *scrollBox,
|
|
Packit |
b099d7 |
XRectangle *labelBox,
|
|
Packit |
b099d7 |
Widget instigator) ;
|
|
Packit |
b099d7 |
static void LayoutVerticalScale(
|
|
Packit |
b099d7 |
XmScaleWidget sw,
|
|
Packit |
b099d7 |
XtWidgetGeometry * desired,
|
|
Packit |
b099d7 |
Widget instigator) ;
|
|
Packit |
b099d7 |
static void ChangeManaged(
|
|
Packit |
b099d7 |
Widget wid) ;
|
|
Packit |
b099d7 |
static void GetValueString(
|
|
Packit |
b099d7 |
XmScaleWidget sw,
|
|
Packit |
b099d7 |
int value,
|
|
Packit |
b099d7 |
String buffer);
|
|
Packit |
b099d7 |
static void ShowValue(
|
|
Packit |
b099d7 |
XmScaleWidget sw) ;
|
|
Packit |
b099d7 |
static void SetScrollBarData(
|
|
Packit |
b099d7 |
XmScaleWidget sw) ;
|
|
Packit |
b099d7 |
static void ValueChanged(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
XtPointer closure,
|
|
Packit |
b099d7 |
XtPointer call_data) ;
|
|
Packit |
b099d7 |
static XtGeometryResult QueryGeometry(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
XtWidgetGeometry *intended,
|
|
Packit |
b099d7 |
XtWidgetGeometry *desired) ;
|
|
Packit |
b099d7 |
static XmNavigability WidgetNavigable(
|
|
Packit |
b099d7 |
Widget wid) ;
|
|
Packit |
b099d7 |
static void StartDrag (Widget w,
|
|
Packit |
b099d7 |
XtPointer data,
|
|
Packit |
b099d7 |
XEvent *event,
|
|
Packit |
b099d7 |
Boolean *cont) ;
|
|
Packit |
b099d7 |
static void DragConvertCallback (Widget w,
|
|
Packit |
b099d7 |
XtPointer client_data,
|
|
Packit |
b099d7 |
XmConvertCallbackStruct *cs);
|
|
Packit |
b099d7 |
static void CheckSetRenderTable(Widget wid,
|
|
Packit |
b099d7 |
int offset,
|
|
Packit |
b099d7 |
XrmValue *value);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/******** End Static Function Declarations ********/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Resource definitions for Scale class */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static XtResource resources[] =
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNshadowThickness, XmCShadowThickness, XmRHorizontalDimension,
|
|
Packit |
b099d7 |
sizeof (Dimension), XtOffsetOf(XmManagerRec, manager.shadow_thickness),
|
|
Packit |
b099d7 |
XmRCallProc, (XtPointer) _XmSetThickness
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNvalue, XmCValue, XmRInt,
|
|
Packit |
b099d7 |
sizeof(int), XtOffsetOf(XmScaleRec,scale.value),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) XmINVALID_DIMENSION
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNmaximum, XmCMaximum, XmRInt,
|
|
Packit |
b099d7 |
sizeof(int), XtOffsetOf(XmScaleRec,scale.maximum),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer)100
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNminimum, XmCMinimum, XmRInt,
|
|
Packit |
b099d7 |
sizeof(int), XtOffsetOf(XmScaleRec,scale.minimum),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer)0
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNorientation, XmCOrientation, XmROrientation,
|
|
Packit |
b099d7 |
sizeof(unsigned char), XtOffsetOf(XmScaleRec,scale.orientation),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) XmVERTICAL
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNprocessingDirection, XmCProcessingDirection, XmRProcessingDirection,
|
|
Packit |
b099d7 |
sizeof(unsigned char),
|
|
Packit |
b099d7 |
XtOffsetOf(XmScaleRec,scale.processing_direction),
|
|
Packit |
b099d7 |
XmRCallProc, (XtPointer) ProcessingDirectionDefault
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNtitleString, XmCTitleString, XmRXmString,
|
|
Packit |
b099d7 |
sizeof(XmString), XtOffsetOf(XmScaleRec,scale.title),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) NULL
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
"pri.vate","Pri.vate",XmRInt,
|
|
Packit |
b099d7 |
sizeof(int), XtOffsetOf(XmScaleRec,scale.last_value),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) False
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNfontList, XmCFontList, XmRFontList,
|
|
Packit |
b099d7 |
sizeof(XmFontList), XtOffsetOf(XmScaleRec, scale.font_list),
|
|
Packit |
b099d7 |
XmRCallProc, (XtPointer)CheckSetRenderTable
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNrenderTable, XmCRenderTable, XmRRenderTable,
|
|
Packit |
b099d7 |
sizeof(XmRenderTable), XtOffsetOf(XmScaleRec, scale.font_list),
|
|
Packit |
b099d7 |
XmRCallProc, (XtPointer)CheckSetRenderTable
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNshowValue, XmCShowValue, XmRShowValue,
|
|
Packit |
b099d7 |
sizeof(XtEnum), XtOffsetOf(XmScaleRec,scale.show_value),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) XmNONE
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNdecimalPoints, XmCDecimalPoints, XmRShort,
|
|
Packit |
b099d7 |
sizeof(short), XtOffsetOf(XmScaleRec,scale.decimal_points),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) 0
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNscaleWidth, XmCScaleWidth, XmRHorizontalDimension,
|
|
Packit |
b099d7 |
sizeof (Dimension), XtOffsetOf(XmScaleRec, scale.scale_width),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) 0
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNscaleHeight, XmCScaleHeight, XmRVerticalDimension,
|
|
Packit |
b099d7 |
sizeof (Dimension), XtOffsetOf(XmScaleRec, scale.scale_height),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) 0
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNhighlightThickness, XmCHighlightThickness, XmRHorizontalDimension,
|
|
Packit |
b099d7 |
sizeof (Dimension), XtOffsetOf(XmScaleRec, scale.highlight_thickness),
|
|
Packit |
b099d7 |
XmRCallProc, (XtPointer) _XmSetThickness
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNhighlightOnEnter, XmCHighlightOnEnter, XmRBoolean,
|
|
Packit |
b099d7 |
sizeof (Boolean), XtOffsetOf(XmScaleRec, scale.highlight_on_enter),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) False
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNvalueChangedCallback, XmCCallback, XmRCallback,
|
|
Packit |
b099d7 |
sizeof(XtCallbackList),
|
|
Packit |
b099d7 |
XtOffsetOf(XmScaleRec,scale.value_changed_callback),
|
|
Packit |
b099d7 |
XmRCallback, (XtPointer) NULL
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNconvertCallback, XmCCallback, XmRCallback, sizeof(XtCallbackList),
|
|
Packit |
b099d7 |
XtOffsetOf(XmScaleRec, scale.convert_callback),
|
|
Packit |
b099d7 |
XmRCallback, (XtPointer) NULL
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNdragCallback, XmCCallback, XmRCallback,
|
|
Packit |
b099d7 |
sizeof(XtCallbackList),
|
|
Packit |
b099d7 |
XtOffsetOf(XmScaleRec,scale.drag_callback),
|
|
Packit |
b099d7 |
XmRCallback, (XtPointer) NULL
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNscaleMultiple, XmCScaleMultiple, XmRInt,
|
|
Packit |
b099d7 |
sizeof(int), XtOffsetOf(XmScaleRec,scale.scale_multiple),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) 0
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNslidingMode, XmCSlidingMode, XmRSlidingMode,
|
|
Packit |
b099d7 |
sizeof(XtEnum), XtOffsetOf(XmScaleRec,scale.sliding_mode),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) XmSLIDER
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNeditable, XmCEditable, XmRBoolean,
|
|
Packit |
b099d7 |
sizeof(XtEnum), XtOffsetOf(XmScaleRec,scale.editable),
|
|
Packit |
b099d7 |
XmRCallProc, (XtPointer) EditableDefault
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNsliderVisual, XmCSliderVisual, XmRSliderVisual,
|
|
Packit |
b099d7 |
sizeof (XtEnum),
|
|
Packit |
b099d7 |
XtOffsetOf(XmScaleRec, scale.slider_visual),
|
|
Packit |
b099d7 |
XmRCallProc, (XtPointer) SliderVisualDefault
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNsliderMark, XmCSliderMark, XmRSliderMark,
|
|
Packit |
b099d7 |
sizeof (XtEnum),
|
|
Packit |
b099d7 |
XtOffsetOf(XmScaleRec, scale.slider_mark),
|
|
Packit |
b099d7 |
XmRCallProc, (XtPointer) SliderMarkDefault
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{ /* undocumented - need synthetic hook to be complete */
|
|
Packit |
b099d7 |
XmNsliderSize, XmCSliderSize, XmRHorizontalInt, sizeof (int),
|
|
Packit |
b099d7 |
XtOffsetOf(XmScaleRec, scale.slider_size),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) 30
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNshowArrows, XmCShowArrows, XmRShowArrows, sizeof (XtEnum),
|
|
Packit |
b099d7 |
XtOffsetOf(XmScaleRec, scale.show_arrows),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) XmNONE
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Definition for resources that need special processing in get values */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static XmSyntheticResource syn_resources[] =
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNtitleString,
|
|
Packit |
b099d7 |
sizeof (XmString), XtOffsetOf(XmScaleRec, scale.title),
|
|
Packit |
b099d7 |
ScaleGetTitleString, (XmImportProc)NULL
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNscaleWidth,
|
|
Packit |
b099d7 |
sizeof (Dimension), XtOffsetOf(XmScaleRec, scale.scale_width),
|
|
Packit |
b099d7 |
XmeFromHorizontalPixels, XmeToHorizontalPixels
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNscaleHeight,
|
|
Packit |
b099d7 |
sizeof (Dimension), XtOffsetOf(XmScaleRec, scale.scale_height),
|
|
Packit |
b099d7 |
XmeFromVerticalPixels, XmeToVerticalPixels
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Scale class record definition */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static XmBaseClassExtRec baseClassExtRec = {
|
|
Packit |
b099d7 |
NULL,
|
|
Packit |
b099d7 |
NULLQUARK,
|
|
Packit |
b099d7 |
XmBaseClassExtVersion,
|
|
Packit |
b099d7 |
sizeof(XmBaseClassExtRec),
|
|
Packit |
b099d7 |
(XtInitProc)NULL, /* InitializePrehook */
|
|
Packit |
b099d7 |
(XtSetValuesFunc)NULL, /* SetValuesPrehook */
|
|
Packit |
b099d7 |
(XtInitProc)NULL, /* InitializePosthook */
|
|
Packit |
b099d7 |
(XtSetValuesFunc)NULL, /* SetValuesPosthook */
|
|
Packit |
b099d7 |
NULL, /* secondaryObjectClass */
|
|
Packit |
b099d7 |
(XtInitProc)NULL, /* secondaryCreate */
|
|
Packit |
b099d7 |
(XmGetSecResDataFunc)NULL, /* getSecRes data */
|
|
Packit |
b099d7 |
{ 0 }, /* fastSubclass flags */
|
|
Packit |
b099d7 |
(XtArgsProc)NULL, /* getValuesPrehook */
|
|
Packit |
b099d7 |
(XtArgsProc)NULL, /* getValuesPosthook */
|
|
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 |
WidgetNavigable, /* widgetNavigable */
|
|
Packit |
b099d7 |
(XmFocusChangeProc)NULL, /* focusChange */
|
|
Packit |
b099d7 |
(XmWrapperData)NULL /* wrapperData */
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
externaldef(xmscaleclassrec) XmScaleClassRec xmScaleClassRec =
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
{ /* core_class fields */
|
|
Packit |
b099d7 |
(WidgetClass) &xmManagerClassRec, /* superclass */
|
|
Packit |
b099d7 |
"XmScale", /* class_name */
|
|
Packit |
b099d7 |
sizeof(XmScaleRec), /* widget_size */
|
|
Packit |
b099d7 |
ClassInitialize, /* class_initialize */
|
|
Packit |
b099d7 |
ClassPartInitialize, /* class_part_init */
|
|
Packit |
b099d7 |
FALSE, /* class_inited */
|
|
Packit |
b099d7 |
Initialize, /* initialize */
|
|
Packit |
b099d7 |
(XtArgsProc)NULL, /* initialize_hook */
|
|
Packit |
b099d7 |
Realize, /* realize */
|
|
Packit |
b099d7 |
NULL, /* actions */
|
|
Packit |
b099d7 |
0, /* num_actions */
|
|
Packit |
b099d7 |
resources, /* resources */
|
|
Packit |
b099d7 |
XtNumber(resources), /* num_resources */
|
|
Packit |
b099d7 |
NULLQUARK, /* xrm_class */
|
|
Packit |
b099d7 |
TRUE, /* compress_motion */
|
|
Packit |
b099d7 |
XtExposeCompressMaximal, /* compress_exposure */
|
|
Packit |
b099d7 |
TRUE, /* compress_enterlv */
|
|
Packit |
b099d7 |
FALSE, /* visible_interest */
|
|
Packit |
b099d7 |
Destroy, /* destroy */
|
|
Packit |
b099d7 |
Resize, /* resize */
|
|
Packit |
b099d7 |
Redisplay, /* expose */
|
|
Packit |
b099d7 |
SetValues, /* set_values */
|
|
Packit |
b099d7 |
(XtArgsFunc)NULL, /* set_values_hook */
|
|
Packit |
b099d7 |
XtInheritSetValuesAlmost, /* set_values_almost */
|
|
Packit |
b099d7 |
(XtArgsProc)NULL, /* get_values_hook */
|
|
Packit |
b099d7 |
(XtAcceptFocusProc)NULL, /* accept_focus */
|
|
Packit |
b099d7 |
XtVersion, /* version */
|
|
Packit |
b099d7 |
NULL, /* callback_private */
|
|
Packit |
b099d7 |
XtInheritTranslations, /* tm_table */
|
|
Packit |
b099d7 |
(XtGeometryHandler) QueryGeometry, /* query_geometry */
|
|
Packit |
b099d7 |
(XtStringProc)NULL, /* display_accelerator*/
|
|
Packit |
b099d7 |
(XtPointer)&baseClassExtRec, /* extension */
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{ /* composite_class fields */
|
|
Packit |
b099d7 |
GeometryManager, /* geometry_manager */
|
|
Packit |
b099d7 |
ChangeManaged, /* change_managed */
|
|
Packit |
b099d7 |
XtInheritInsertChild, /* insert_child */
|
|
Packit |
b099d7 |
XtInheritDeleteChild, /* delete_child */
|
|
Packit |
b099d7 |
NULL, /* extension */
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{ /* constraint_class fields */
|
|
Packit |
b099d7 |
NULL, /* resource list */
|
|
Packit |
b099d7 |
0, /* num resources */
|
|
Packit |
b099d7 |
sizeof(XmManagerConstraintRec), /* constraint size */
|
|
Packit |
b099d7 |
(XtInitProc)NULL, /* init proc */
|
|
Packit |
b099d7 |
(XtWidgetProc)NULL, /* destroy proc */
|
|
Packit |
b099d7 |
(XtSetValuesFunc)NULL, /* set values proc */
|
|
Packit |
b099d7 |
NULL, /* extension */
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{ /* manager_class fields */
|
|
Packit |
b099d7 |
XtInheritTranslations, /* translations */
|
|
Packit |
b099d7 |
syn_resources, /* syn_resources */
|
|
Packit |
b099d7 |
XtNumber(syn_resources), /* num_syn_resources */
|
|
Packit |
b099d7 |
NULL, /* syn_cont_resources */
|
|
Packit |
b099d7 |
0, /* num_syn_cont_resources */
|
|
Packit |
b099d7 |
XmInheritParentProcess, /* parent_process */
|
|
Packit |
b099d7 |
NULL, /* extension */
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{ /* scale class - none */
|
|
Packit |
b099d7 |
(XtPointer) NULL /* extension */
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
externaldef(xmscalewidgetclass) WidgetClass
|
|
Packit |
b099d7 |
xmScaleWidgetClass = (WidgetClass)&xmScaleClassRec;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Transfer trait record */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static XmConst XmTransferTraitRec ScaleTransfer = {
|
|
Packit |
b099d7 |
0, /* version */
|
|
Packit |
b099d7 |
(XmConvertCallbackProc) DragConvertCallback, /* convertProc */
|
|
Packit |
b099d7 |
NULL, /* destinationProc */
|
|
Packit |
b099d7 |
NULL, /* destinationPreHookProc */
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/****************************************************************/
|
|
Packit |
b099d7 |
/************** Synthetic hook & default routines ***************/
|
|
Packit |
b099d7 |
/****************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
ScaleGetTitleString(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
int resource, /* unused */
|
|
Packit |
b099d7 |
XtArgVal *value)
|
|
Packit |
b099d7 |
/**************** ARGSUSED ****************/
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmScaleWidget scale = (XmScaleWidget) wid ;
|
|
Packit |
b099d7 |
Arg al[1] ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (scale->scale.title == NULL) {
|
|
Packit |
b099d7 |
/* mean that the title has never been set, so
|
|
Packit |
b099d7 |
we should return NULL, not the label value which
|
|
Packit |
b099d7 |
is the label name, not NULL, in this case */
|
|
Packit |
b099d7 |
*value = (XtArgVal) NULL ;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
/* title = -1, our magic value used to tell: look in
|
|
Packit |
b099d7 |
the label child. */
|
|
Packit |
b099d7 |
XtSetArg (al[0], XmNlabelString, value); /* make a copy */
|
|
Packit |
b099d7 |
XtGetValues (scale->composite.children[0], al, 1);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*********************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* ProcessingDirectionDefault
|
|
Packit |
b099d7 |
* This procedure provides the dynamic default behavior for
|
|
Packit |
b099d7 |
* the processing direction resource dependent on the orientation.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*********************************************************************/
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
ProcessingDirectionDefault(
|
|
Packit |
b099d7 |
XmScaleWidget widget,
|
|
Packit |
b099d7 |
int offset, /* unused */
|
|
Packit |
b099d7 |
XrmValue *value )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
static unsigned char direction;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
value->addr = (XPointer) &direction;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (widget->scale.orientation == XmHORIZONTAL)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (LayoutIsRtoLM(widget))
|
|
Packit |
b099d7 |
direction = XmMAX_ON_LEFT;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
direction = XmMAX_ON_RIGHT;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else /* XmVERTICAL -- range checking done during widget
|
|
Packit |
b099d7 |
initialization */
|
|
Packit |
b099d7 |
direction = XmMAX_ON_TOP;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*********************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* SliderVisualDefault
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*********************************************************************/
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
SliderVisualDefault(
|
|
Packit |
b099d7 |
XmScaleWidget widget,
|
|
Packit |
b099d7 |
int offset, /* unused */
|
|
Packit |
b099d7 |
XrmValue *value )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
static XtEnum slider_visual ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
value->addr = (XPointer) &slider_visual;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (widget->scale.sliding_mode == XmTHERMOMETER) {
|
|
Packit |
b099d7 |
slider_visual = XmTROUGH_COLOR ;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
slider_visual = XmSHADOWED_BACKGROUND ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*********************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* SliderMarkDefault
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*********************************************************************/
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
SliderMarkDefault(
|
|
Packit |
b099d7 |
XmScaleWidget widget,
|
|
Packit |
b099d7 |
int offset, /* unused */
|
|
Packit |
b099d7 |
XrmValue *value )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
static XtEnum slider_mark ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
value->addr = (XPointer) &slider_mark;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!widget->scale.editable) slider_mark = XmNONE ;
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
if (widget->scale.sliding_mode == XmTHERMOMETER)
|
|
Packit |
b099d7 |
slider_mark = XmROUND_MARK ;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
slider_mark = XmETCHED_LINE ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*********************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* EditableDefault
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*********************************************************************/
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
EditableDefault(
|
|
Packit |
b099d7 |
XmScaleWidget widget,
|
|
Packit |
b099d7 |
int offset, /* unused */
|
|
Packit |
b099d7 |
XrmValue *value )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
static XtEnum editable ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
value->addr = (XPointer) &editable;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (widget->scale.sliding_mode == XmTHERMOMETER) {
|
|
Packit |
b099d7 |
editable = False ;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
editable = True ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* XmRCallProc routine for checking list.font before setting it to NULL
|
|
Packit |
b099d7 |
* if no value is specified for both XmNrenderTable and XmNfontList.
|
|
Packit |
b099d7 |
* If "last_value" is True, then function has been called twice on same
|
|
Packit |
b099d7 |
* widget, thus resource needs to be set NULL, otherwise leave it alone.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
/* ARGSUSED */
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
CheckSetRenderTable(Widget wid,
|
|
Packit |
b099d7 |
int offset,
|
|
Packit |
b099d7 |
XrmValue *value )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmScaleWidget sw = (XmScaleWidget)wid;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Check if been here before */
|
|
Packit |
b099d7 |
if (sw->scale.last_value)
|
|
Packit |
b099d7 |
value->addr = NULL;
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
sw->scale.last_value = True;
|
|
Packit |
b099d7 |
value->addr = (char*)&(sw->scale.font_list);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* ClassInitialize
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
ClassInitialize( void )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
baseClassExtRec.record_type = XmQmotif ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (null_region == NULL)
|
|
Packit |
b099d7 |
null_region = XCreateRegion();
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* ClassPartInitialize
|
|
Packit |
b099d7 |
* Initialize the fast subclassing.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
ClassPartInitialize(
|
|
Packit |
b099d7 |
WidgetClass wc )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
_XmFastSubclassInit (wc, XmSCALE_BIT);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Install transfer trait */
|
|
Packit |
b099d7 |
XmeTraitSet((XtPointer)wc, XmQTtransfer, (XtPointer) &ScaleTransfer);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*********************************************************************
|
|
Packit |
b099d7 |
* Initialize
|
|
Packit |
b099d7 |
* Validate all of the argument data for the widget, create the
|
|
Packit |
b099d7 |
* title label and scrollbar.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*********************************************************************/
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
ValidateInitialState(
|
|
Packit |
b099d7 |
XmScaleWidget req, /* unused */
|
|
Packit |
b099d7 |
XmScaleWidget new_w )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Boolean default_value = FALSE;
|
|
Packit |
b099d7 |
float value_range;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (new_w->scale.minimum >= new_w->scale.maximum)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
new_w->scale.minimum = 0;
|
|
Packit |
b099d7 |
new_w->scale.maximum = 100;
|
|
Packit |
b099d7 |
XmeWarning( (Widget) new_w, MESSAGE1);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
value_range = (float)((float)new_w->scale.maximum -
|
|
Packit |
b099d7 |
(float)new_w->scale.minimum);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (value_range > (float)((float)INT_MAX / (float) 2.0))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
new_w->scale.minimum = 0;
|
|
Packit |
b099d7 |
if (new_w->scale.maximum > (INT_MAX / 2))
|
|
Packit |
b099d7 |
new_w->scale.maximum = INT_MAX / 2;
|
|
Packit |
b099d7 |
XmeWarning( (Widget) new_w, MESSAGE9);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (new_w->scale.value == XmINVALID_DIMENSION)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
new_w->scale.value = 0;
|
|
Packit |
b099d7 |
default_value = True;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (new_w->scale.value < new_w->scale.minimum)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
new_w->scale.value = new_w->scale.minimum;
|
|
Packit |
b099d7 |
if (!default_value) XmeWarning( (Widget) new_w, MESSAGE2);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (new_w->scale.value > new_w->scale.maximum)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
new_w->scale.value = new_w->scale.minimum;
|
|
Packit |
b099d7 |
if (!default_value) XmeWarning( (Widget) new_w, MESSAGE3);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if(!XmRepTypeValidValue( XmRID_ORIENTATION,
|
|
Packit |
b099d7 |
new_w->scale.orientation, (Widget) new_w) )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
new_w->scale.orientation = XmVERTICAL;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!XmRepTypeValidValue( XmRID_SHOW_VALUE,
|
|
Packit |
b099d7 |
new_w->scale.show_value, (Widget) new_w) )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
new_w->scale.show_value = XmNONE;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (new_w->scale.orientation == XmHORIZONTAL)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if ((new_w->scale.processing_direction != XmMAX_ON_RIGHT) &&
|
|
Packit |
b099d7 |
(new_w->scale.processing_direction != XmMAX_ON_LEFT))
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
new_w->scale.processing_direction = XmMAX_ON_RIGHT;
|
|
Packit |
b099d7 |
XmeWarning( (Widget) new_w, MESSAGE5);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if ((new_w->scale.processing_direction != XmMAX_ON_TOP) &&
|
|
Packit |
b099d7 |
(new_w->scale.processing_direction != XmMAX_ON_BOTTOM))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
new_w->scale.processing_direction = XmMAX_ON_TOP;
|
|
Packit |
b099d7 |
XmeWarning( (Widget) new_w, MESSAGE5);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (new_w->scale.scale_multiple > (new_w->scale.maximum
|
|
Packit |
b099d7 |
- new_w->scale.minimum))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmeWarning( (Widget) new_w, MESSAGE7);
|
|
Packit |
b099d7 |
new_w->scale.scale_multiple = (new_w->scale.maximum
|
|
Packit |
b099d7 |
- new_w->scale.minimum) / 10;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else if (new_w->scale.scale_multiple < 0)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmeWarning( (Widget) new_w, MESSAGE8);
|
|
Packit |
b099d7 |
new_w->scale.scale_multiple = (new_w->scale.maximum
|
|
Packit |
b099d7 |
- new_w->scale.minimum) / 10;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else if (new_w->scale.scale_multiple == 0)
|
|
Packit |
b099d7 |
new_w->scale.scale_multiple = (new_w->scale.maximum
|
|
Packit |
b099d7 |
- new_w->scale.minimum) / 10;
|
|
Packit |
b099d7 |
/* Assure a minimum value of 1 */
|
|
Packit |
b099d7 |
if (new_w->scale.scale_multiple < 1)
|
|
Packit |
b099d7 |
new_w->scale.scale_multiple = 1;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static Widget
|
|
Packit |
b099d7 |
CreateScaleTitle(
|
|
Packit |
b099d7 |
XmScaleWidget new_w )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmLabelGadget title;
|
|
Packit |
b099d7 |
Arg args[5];
|
|
Packit |
b099d7 |
int n;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Create the title label gadget */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* title can be NULL or a valid XmString, if null,
|
|
Packit |
b099d7 |
the label will use its own name as XmString */
|
|
Packit |
b099d7 |
n = 0;
|
|
Packit |
b099d7 |
XtSetArg (args[n], XmNlabelString, new_w->scale.title); n++;
|
|
Packit |
b099d7 |
XtSetArg (args[n], XmNfontList, new_w->scale.font_list); n++;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
title = (XmLabelGadget) XmCreateLabelGadget( (Widget) new_w,
|
|
Packit |
b099d7 |
"Title",
|
|
Packit |
b099d7 |
args, n);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (new_w->scale.title) {
|
|
Packit |
b099d7 |
XtManageChild ((Widget) title);
|
|
Packit |
b099d7 |
new_w->scale.title = (XmString) -1 ;
|
|
Packit |
b099d7 |
} /* scale.title need to be set to some special not NULL value
|
|
Packit |
b099d7 |
in order to see any change at SetValues time and also to
|
|
Packit |
b099d7 |
return NULL at Getvalue time in the hook. This is pirs 3197:
|
|
Packit |
b099d7 |
when you setvalues a new xmstring as title, the value of the
|
|
Packit |
b099d7 |
title field, a pointer, might be the same. */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return((Widget) title);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static Widget
|
|
Packit |
b099d7 |
CreateScaleScrollBar(
|
|
Packit |
b099d7 |
XmScaleWidget new_w )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Widget scrollbar;
|
|
Packit |
b099d7 |
Arg args[25];
|
|
Packit |
b099d7 |
int n = 0;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Build up an arg list for and create the scrollbar */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
n = 0;
|
|
Packit |
b099d7 |
SET(XmNmaximum, SCROLLBAR_MAX);
|
|
Packit |
b099d7 |
SET(XmNminimum, 0);
|
|
Packit |
b099d7 |
SET(XmNshowArrows, new_w->scale.show_arrows);
|
|
Packit |
b099d7 |
SET(XmNunitType, XmPIXELS);
|
|
Packit |
b099d7 |
SET(XmNorientation, new_w->scale.orientation);
|
|
Packit |
b099d7 |
SET(XmNprocessingDirection, new_w->scale.processing_direction);
|
|
Packit |
b099d7 |
SET(XmNslidingMode, new_w->scale.sliding_mode);
|
|
Packit |
b099d7 |
SET(XmNsliderVisual, new_w->scale.slider_visual);
|
|
Packit |
b099d7 |
SET(XmNsliderMark, new_w->scale.slider_mark);
|
|
Packit |
b099d7 |
SET(XmNeditable, new_w->scale.editable);
|
|
Packit |
b099d7 |
if (new_w->scale.scale_width != 0)
|
|
Packit |
b099d7 |
SET(XmNwidth, new_w->scale.scale_width);
|
|
Packit |
b099d7 |
if (new_w->scale.scale_height != 0)
|
|
Packit |
b099d7 |
SET(XmNheight, new_w->scale.scale_height);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* then get everything else from the scale parent */
|
|
Packit |
b099d7 |
/* another more incestuous but also more powerful - because it
|
|
Packit |
b099d7 |
allows customization - way of doing that would be to provide
|
|
Packit |
b099d7 |
resource default proc in ScrollBar that look for a Scale parent
|
|
Packit |
b099d7 |
and inherit those visual resources */
|
|
Packit |
b099d7 |
SET(XmNhighlightColor, new_w->manager.highlight_color);
|
|
Packit |
b099d7 |
SET(XmNhighlightPixmap, new_w->manager.highlight_pixmap);
|
|
Packit |
b099d7 |
SET(XmNhighlightThickness, new_w->scale.highlight_thickness);
|
|
Packit |
b099d7 |
SET(XmNhighlightOnEnter, new_w->scale.highlight_on_enter);
|
|
Packit |
b099d7 |
SET(XmNtraversalOn, new_w->manager.traversal_on);
|
|
Packit |
b099d7 |
SET(XmNshadowThickness, new_w->manager.shadow_thickness);
|
|
Packit |
b099d7 |
SET(XmNbackground, new_w->core.background_pixel);
|
|
Packit |
b099d7 |
SET(XmNtopShadowColor, new_w->manager.top_shadow_color);
|
|
Packit |
b099d7 |
SET(XmNbottomShadowColor, new_w->manager.bottom_shadow_color);
|
|
Packit |
b099d7 |
SET(XmNtopShadowPixmap, new_w->manager.top_shadow_pixmap);
|
|
Packit |
b099d7 |
SET(XmNbottomShadowPixmap, new_w->manager.bottom_shadow_pixmap);
|
|
Packit |
b099d7 |
scrollbar = XmCreateScrollBar( (Widget) new_w, "Scrollbar", args, n);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XtManageChild(scrollbar);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XtAddCallback(scrollbar, XmNvalueChangedCallback, ValueChanged, NULL);
|
|
Packit |
b099d7 |
XtAddCallback(scrollbar, XmNdragCallback, ValueChanged, NULL);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return(scrollbar);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* GetForegroundGC
|
|
Packit |
b099d7 |
* Get the graphics context used for drawing the slider value.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
GetForegroundGC(
|
|
Packit |
b099d7 |
XmScaleWidget sw )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XGCValues values;
|
|
Packit |
b099d7 |
XtGCMask valueMask;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
valueMask = GCForeground | GCBackground | GCGraphicsExposures;
|
|
Packit |
b099d7 |
values.foreground = sw->manager.foreground;
|
|
Packit |
b099d7 |
values.background = sw->core.background_pixel;
|
|
Packit |
b099d7 |
values.graphics_exposures = False;
|
|
Packit |
b099d7 |
if (sw->scale.font_struct)
|
|
Packit |
b099d7 |
values.font = sw->scale.font_struct->fid, valueMask |= GCFont;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* if ((sw->core.background_pixmap != None) &&
|
|
Packit |
b099d7 |
(sw->core.background_pixmap != XmUNSPECIFIED_PIXMAP)) {
|
|
Packit |
b099d7 |
valueMask |= GCFillStyle | GCTile ;
|
|
Packit |
b099d7 |
values.fill_style = FillTiled;
|
|
Packit |
b099d7 |
values.tile = sw->core.background_pixmap;
|
|
Packit |
b099d7 |
}*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Added dynamic clip mask & don't care about origion to merge with
|
|
Packit |
b099d7 |
Label[Gadget] and List GC:s */
|
|
Packit |
b099d7 |
sw->scale.foreground_GC = XtAllocateGC ((Widget) sw, 0, valueMask, &values,
|
|
Packit |
b099d7 |
GCClipMask,
|
|
Packit |
b099d7 |
GCClipXOrigin | GCClipYOrigin);
|
|
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 |
XmScaleWidget req = (XmScaleWidget) rw ;
|
|
Packit |
b099d7 |
XmScaleWidget new_w = (XmScaleWidget) nw ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
new_w->scale.value_region = XCreateRegion();
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Validate the incoming data */
|
|
Packit |
b099d7 |
ValidateInitialState(req, new_w);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (new_w->scale.font_list == NULL)
|
|
Packit |
b099d7 |
new_w->scale.font_list =
|
|
Packit |
b099d7 |
XmeGetDefaultRenderTable( (Widget) new_w, XmLABEL_FONTLIST);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Set the scale font struct used for interactive value display */
|
|
Packit |
b099d7 |
/* to the 0th font in the title font list. If not font list is */
|
|
Packit |
b099d7 |
/* provides, open up fixed and use that. */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
new_w->scale.font_list = XmFontListCopy(new_w->scale.font_list);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (new_w->scale.font_list) {
|
|
Packit |
b099d7 |
if (!XmeRenderTableGetDefaultFont(new_w->scale.font_list,
|
|
Packit |
b099d7 |
&new_w->scale.font_struct))
|
|
Packit |
b099d7 |
new_w->scale.font_struct = NULL;
|
|
Packit |
b099d7 |
#ifndef USE_XFT
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
new_w->scale.font_struct =
|
|
Packit |
b099d7 |
XLoadQueryFont (XtDisplay (new_w), XmDEFAULT_FONT);
|
|
Packit |
b099d7 |
if (new_w->scale.font_struct == NULL)
|
|
Packit |
b099d7 |
new_w->scale.font_struct = XLoadQueryFont (XtDisplay (new_w), "*");
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
(void) CreateScaleTitle(new_w);
|
|
Packit |
b099d7 |
(void) CreateScaleScrollBar(new_w);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Get the foreground GC and initialize internal variables */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
GetForegroundGC (new_w);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
new_w->scale.show_value_x = 0;
|
|
Packit |
b099d7 |
new_w->scale.show_value_y = 0;
|
|
Packit |
b099d7 |
new_w->scale.show_value_width = 0;
|
|
Packit |
b099d7 |
new_w->scale.show_value_height = 0;
|
|
Packit |
b099d7 |
new_w->scale.state_flags = 0 ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* add the handler that drags the value shown in the scale window */
|
|
Packit |
b099d7 |
XtAddEventHandler(nw, ButtonPressMask, False, StartDrag, NULL);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Redisplay
|
|
Packit |
b099d7 |
* General redisplay function called on exposure events.
|
|
Packit |
b099d7 |
* Only redisplays the gadgets (title included) and the value,
|
|
Packit |
b099d7 |
* the scrollbar will take care of itself.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
Redisplay(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
XEvent *event,
|
|
Packit |
b099d7 |
Region region )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmScaleWidget sw = (XmScaleWidget) wid ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XmeRedisplayGadgets( (Widget) sw, event, region);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
ShowValue (sw);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Resize
|
|
Packit |
b099d7 |
* Re-layout children.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
Resize(
|
|
Packit |
b099d7 |
Widget wid )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmScaleWidget sw = (XmScaleWidget) wid ;
|
|
Packit |
b099d7 |
XtWidgetGeometry desired ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Find out what the best possible answer would be, the layout
|
|
Packit |
b099d7 |
routines use this optimum for placing the children */
|
|
Packit |
b099d7 |
desired.width = 0;
|
|
Packit |
b099d7 |
desired.height = 0;
|
|
Packit |
b099d7 |
GetScaleSize(sw, &desired.width, &desired.height);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (sw->scale.orientation == XmHORIZONTAL)
|
|
Packit |
b099d7 |
LayoutHorizontalScale(sw, &desired, NULL);
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
LayoutVerticalScale(sw, &desired, NULL);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Scale has a gravity None, so resize will always generate redisplay */
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* SetValues stuff
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
ValidateInputs(
|
|
Packit |
b099d7 |
XmScaleWidget cur,
|
|
Packit |
b099d7 |
XmScaleWidget new_w )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
float value_range;
|
|
Packit |
b099d7 |
/* Validate the incoming data */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (new_w->scale.minimum >= new_w->scale.maximum)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
new_w->scale.minimum = cur->scale.minimum;
|
|
Packit |
b099d7 |
new_w->scale.maximum = cur->scale.maximum;
|
|
Packit |
b099d7 |
XmeWarning( (Widget) new_w, MESSAGE1);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
value_range = (float)((float)new_w->scale.maximum -
|
|
Packit |
b099d7 |
(float)new_w->scale.minimum);
|
|
Packit |
b099d7 |
if (value_range > (float)((float)INT_MAX / (float) 2.0))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
new_w->scale.minimum = 0;
|
|
Packit |
b099d7 |
if (new_w->scale.maximum > (INT_MAX / 2))
|
|
Packit |
b099d7 |
new_w->scale.maximum = INT_MAX / 2;
|
|
Packit |
b099d7 |
XmeWarning( (Widget) new_w, MESSAGE9);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (new_w->scale.value < new_w->scale.minimum)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
new_w->scale.value = new_w->scale.minimum;
|
|
Packit |
b099d7 |
XmeWarning( (Widget) new_w, MESSAGE2);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (new_w->scale.value > new_w->scale.maximum)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
new_w->scale.value = new_w->scale.maximum;
|
|
Packit |
b099d7 |
XmeWarning( (Widget) new_w, MESSAGE3);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if(!XmRepTypeValidValue( XmRID_SLIDING_MODE,
|
|
Packit |
b099d7 |
new_w->scale.sliding_mode, (Widget) new_w) )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
new_w->scale.sliding_mode = cur->scale.sliding_mode;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if(!XmRepTypeValidValue( XmRID_ORIENTATION,
|
|
Packit |
b099d7 |
new_w->scale.orientation, (Widget) new_w) )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
new_w->scale.orientation = cur->scale.orientation;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if(!XmRepTypeValidValue( XmRID_SHOW_VALUE,
|
|
Packit |
b099d7 |
new_w->scale.show_value, (Widget) new_w) )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
new_w->scale.show_value = cur->scale.show_value;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (new_w->scale.orientation == XmHORIZONTAL)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (new_w->scale.processing_direction != XmMAX_ON_LEFT &&
|
|
Packit |
b099d7 |
new_w->scale.processing_direction != XmMAX_ON_RIGHT)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
new_w->scale.processing_direction = cur->scale.processing_direction;
|
|
Packit |
b099d7 |
XmeWarning( (Widget) new_w, MESSAGE5);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (new_w->scale.processing_direction != XmMAX_ON_TOP &&
|
|
Packit |
b099d7 |
new_w->scale.processing_direction != XmMAX_ON_BOTTOM)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
new_w->scale.processing_direction = cur->scale.processing_direction;
|
|
Packit |
b099d7 |
XmeWarning( (Widget) new_w, MESSAGE5);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (new_w->scale.scale_multiple != cur->scale.scale_multiple)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (new_w->scale.scale_multiple > (new_w->scale.maximum
|
|
Packit |
b099d7 |
- new_w->scale.minimum))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmeWarning( (Widget) new_w, MESSAGE7);
|
|
Packit |
b099d7 |
new_w->scale.scale_multiple = (new_w->scale.maximum
|
|
Packit |
b099d7 |
- new_w->scale.minimum) / 10;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else if (new_w->scale.scale_multiple < 0)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmeWarning( (Widget) new_w, MESSAGE8);
|
|
Packit |
b099d7 |
new_w->scale.scale_multiple = (new_w->scale.maximum
|
|
Packit |
b099d7 |
- new_w->scale.minimum) / 10;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else if (new_w->scale.scale_multiple == 0)
|
|
Packit |
b099d7 |
new_w->scale.scale_multiple = (new_w->scale.maximum
|
|
Packit |
b099d7 |
- new_w->scale.minimum) / 10;
|
|
Packit |
b099d7 |
/* Assure a minimum value of 1 */
|
|
Packit |
b099d7 |
if (new_w->scale.scale_multiple < 1)
|
|
Packit |
b099d7 |
new_w->scale.scale_multiple = 1;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
HandleTitle(
|
|
Packit |
b099d7 |
XmScaleWidget cur,
|
|
Packit |
b099d7 |
XmScaleWidget req, /* unused */
|
|
Packit |
b099d7 |
XmScaleWidget new_w )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Arg args[5];
|
|
Packit |
b099d7 |
int n = 0;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* cur title is either NULL or (-1), as set in CreateScaleTitle,
|
|
Packit |
b099d7 |
so diff are always pertinent */
|
|
Packit |
b099d7 |
/* new title can be NULL or a valid xmstring */
|
|
Packit |
b099d7 |
if (new_w->scale.title != cur->scale.title) {
|
|
Packit |
b099d7 |
XtSetArg (args[n], XmNlabelString, new_w->scale.title); n++;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (new_w->scale.font_list != cur->scale.font_list) {
|
|
Packit |
b099d7 |
XtSetArg (args[n], XmNfontList, new_w->scale.font_list); n++;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (n) XtSetValues (new_w->composite.children[0], args, n);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (new_w->scale.title != cur->scale.title) {
|
|
Packit |
b099d7 |
if (new_w->scale.title != NULL) {
|
|
Packit |
b099d7 |
/* new title differs from old one and is no null, so
|
|
Packit |
b099d7 |
it's a valid xmstring that we change to -1 */
|
|
Packit |
b099d7 |
XtManageChild(new_w->composite.children[0]);
|
|
Packit |
b099d7 |
new_w->scale.title = (XmString) -1 ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else /* new title differs from old one and is null,
|
|
Packit |
b099d7 |
so we let it be null, so that get scale title returns
|
|
Packit |
b099d7 |
null instead of the label string */
|
|
Packit |
b099d7 |
XtUnmanageChild (new_w->composite.children[0]);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
HandleScrollBar(
|
|
Packit |
b099d7 |
XmScaleWidget cur,
|
|
Packit |
b099d7 |
XmScaleWidget req, /* unused */
|
|
Packit |
b099d7 |
XmScaleWidget new_w )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Arg args[30];
|
|
Packit |
b099d7 |
int n = 0;
|
|
Packit |
b099d7 |
Widget scrollbar = new_w->composite.children[1];
|
|
Packit |
b099d7 |
int slider_size, increment, page, value ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* reset any attributes of the scrollbar */
|
|
Packit |
b099d7 |
SET(XmNshowArrows, new_w->scale.show_arrows);
|
|
Packit |
b099d7 |
SET(XmNorientation, new_w->scale.orientation);
|
|
Packit |
b099d7 |
SET(XmNprocessingDirection, new_w->scale.processing_direction);
|
|
Packit |
b099d7 |
if (new_w->scale.scale_width != cur->scale.scale_width)
|
|
Packit |
b099d7 |
SET(XmNwidth, new_w->scale.scale_width);
|
|
Packit |
b099d7 |
if (new_w->scale.scale_height != cur->scale.scale_height)
|
|
Packit |
b099d7 |
SET(XmNheight, new_w->scale.scale_height);
|
|
Packit |
b099d7 |
SET(XmNslidingMode, new_w->scale.sliding_mode);
|
|
Packit |
b099d7 |
SET(XmNsliderMark, new_w->scale.slider_mark);
|
|
Packit |
b099d7 |
SET(XmNsliderVisual, new_w->scale.slider_visual);
|
|
Packit |
b099d7 |
SET(XmNeditable, new_w->scale.editable);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* there is an issue of propagation here, whether or not
|
|
Packit |
b099d7 |
we want to force it. There is a behavior compatibility
|
|
Packit |
b099d7 |
issue if we decide to change the current situation */
|
|
Packit |
b099d7 |
SET(XmNsensitive, new_w->core.sensitive);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
SET(XmNhighlightColor, new_w->manager.highlight_color);
|
|
Packit |
b099d7 |
SET(XmNhighlightPixmap, new_w->manager.highlight_pixmap);
|
|
Packit |
b099d7 |
SET(XmNhighlightThickness, new_w->scale.highlight_thickness);
|
|
Packit |
b099d7 |
SET(XmNshadowThickness, new_w->manager.shadow_thickness);
|
|
Packit |
b099d7 |
SET(XmNhighlightOnEnter, new_w->scale.highlight_on_enter);
|
|
Packit |
b099d7 |
SET(XmNtraversalOn, new_w->manager.traversal_on);
|
|
Packit |
b099d7 |
SET(XmNbackground, new_w->core.background_pixel);
|
|
Packit |
b099d7 |
SET(XmNtopShadowColor, new_w->manager.top_shadow_color);
|
|
Packit |
b099d7 |
SET(XmNtopShadowPixmap, new_w->manager.top_shadow_pixmap);
|
|
Packit |
b099d7 |
SET(XmNbottomShadowColor, new_w->manager.bottom_shadow_color);
|
|
Packit |
b099d7 |
SET(XmNbottomShadowPixmap, new_w->manager.bottom_shadow_pixmap);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
CalcScrollBarData(new_w, &value, &slider_size, &increment, &page);
|
|
Packit |
b099d7 |
SET(XmNvalue, value);
|
|
Packit |
b099d7 |
SET(XmNsliderSize, slider_size);
|
|
Packit |
b099d7 |
SET(XmNincrement, increment);
|
|
Packit |
b099d7 |
SET(XmNpageIncrement, page);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XtSetValues (scrollbar, args, n);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
SetScrollBarData(new_w);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* SetValues class method
|
|
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_in, /* unused */
|
|
Packit |
b099d7 |
Cardinal *num_args_in ) /* unused */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmScaleWidget cur = (XmScaleWidget) cw ;
|
|
Packit |
b099d7 |
XmScaleWidget req = (XmScaleWidget) rw ;
|
|
Packit |
b099d7 |
XmScaleWidget new_w = (XmScaleWidget) nw ;
|
|
Packit |
b099d7 |
Boolean redisplay = False ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define DIFF(x) ((new_w->x) != (cur->x))
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* this flag is checked in the GM */
|
|
Packit |
b099d7 |
new_w->scale.state_flags |= FROM_SET_VALUE ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (DIFF(scale.orientation)) {
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Make sure that processing direction tracks orientation */
|
|
Packit |
b099d7 |
if (!DIFF(scale.processing_direction)) {
|
|
Packit |
b099d7 |
if ((new_w->scale.orientation == XmHORIZONTAL) &&
|
|
Packit |
b099d7 |
(cur->scale.processing_direction == XmMAX_ON_TOP))
|
|
Packit |
b099d7 |
new_w->scale.processing_direction = XmMAX_ON_RIGHT;
|
|
Packit |
b099d7 |
else if ((new_w->scale.orientation == XmHORIZONTAL) &&
|
|
Packit |
b099d7 |
(cur->scale.processing_direction == XmMAX_ON_BOTTOM))
|
|
Packit |
b099d7 |
new_w->scale.processing_direction = XmMAX_ON_LEFT;
|
|
Packit |
b099d7 |
else if ((new_w->scale.orientation == XmVERTICAL) &&
|
|
Packit |
b099d7 |
(cur->scale.processing_direction == XmMAX_ON_LEFT))
|
|
Packit |
b099d7 |
new_w->scale.processing_direction = XmMAX_ON_BOTTOM;
|
|
Packit |
b099d7 |
else if ((new_w->scale.orientation == XmVERTICAL) &&
|
|
Packit |
b099d7 |
(cur->scale.processing_direction == XmMAX_ON_RIGHT))
|
|
Packit |
b099d7 |
new_w->scale.processing_direction = XmMAX_ON_TOP;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Make scale_width and scale_height track orientation too */
|
|
Packit |
b099d7 |
if ((new_w->scale.scale_width == cur->scale.scale_width) &&
|
|
Packit |
b099d7 |
(new_w->scale.scale_height == cur->scale.scale_height)) {
|
|
Packit |
b099d7 |
new_w->scale.scale_width = cur->scale.scale_height;
|
|
Packit |
b099d7 |
new_w->scale.scale_height = cur->scale.scale_width;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
ValidateInputs(cur, new_w);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
HandleTitle(cur, req, new_w);
|
|
Packit |
b099d7 |
HandleScrollBar(cur, req, new_w);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Set the font struct for the value displayed */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (DIFF(scale.font_list)) {
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifndef USE_XFT
|
|
Packit |
b099d7 |
if ((cur->scale.font_list == NULL) &&
|
|
Packit |
b099d7 |
(cur->scale.font_struct != NULL))
|
|
Packit |
b099d7 |
XFreeFont(XtDisplay (cur), cur->scale.font_struct);
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (cur->scale.font_list) XmFontListFree(cur->scale.font_list);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (new_w->scale.font_list == NULL)
|
|
Packit |
b099d7 |
new_w->scale.font_list =
|
|
Packit |
b099d7 |
XmeGetDefaultRenderTable( (Widget) new_w, XmLABEL_FONTLIST);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
new_w->scale.font_list = XmFontListCopy(new_w->scale.font_list);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (new_w->scale.font_list != NULL) {
|
|
Packit |
b099d7 |
if (!XmeRenderTableGetDefaultFont(new_w->scale.font_list,
|
|
Packit |
b099d7 |
&new_w->scale.font_struct))
|
|
Packit |
b099d7 |
new_w->scale.font_struct = NULL;
|
|
Packit |
b099d7 |
#ifdef USE_XFT
|
|
Packit |
b099d7 |
/* TODO: should it be ifndef? */
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
new_w->scale.font_struct =
|
|
Packit |
b099d7 |
XLoadQueryFont(XtDisplay(new_w), XmDEFAULT_FONT);
|
|
Packit |
b099d7 |
if (new_w->scale.font_struct == NULL)
|
|
Packit |
b099d7 |
new_w->scale.font_struct =
|
|
Packit |
b099d7 |
XLoadQueryFont(XtDisplay(new_w), "*");
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XtReleaseGC ((Widget) new_w, new_w->scale.foreground_GC);
|
|
Packit |
b099d7 |
GetForegroundGC (new_w);
|
|
Packit |
b099d7 |
redisplay = True;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (XtIsRealized((Widget)new_w) &&
|
|
Packit |
b099d7 |
( DIFF(scale.font_list) ||
|
|
Packit |
b099d7 |
DIFF(scale.highlight_thickness) ||
|
|
Packit |
b099d7 |
DIFF(scale.scale_height) ||
|
|
Packit |
b099d7 |
DIFF(scale.scale_width) ||
|
|
Packit |
b099d7 |
DIFF(scale.orientation) ||
|
|
Packit |
b099d7 |
DIFF(manager.unit_type) ||
|
|
Packit |
b099d7 |
DIFF(manager.shadow_thickness) ||
|
|
Packit |
b099d7 |
/* need to check on req for title since HandleTitle made
|
|
Packit |
b099d7 |
the new_w field equal to cur */
|
|
Packit |
b099d7 |
(req->scale.title != cur->scale.title) ||
|
|
Packit |
b099d7 |
/* major show value change only */
|
|
Packit |
b099d7 |
(DIFF(scale.show_value) &&
|
|
Packit |
b099d7 |
((new_w->scale.show_value == XmNONE) ||
|
|
Packit |
b099d7 |
(cur->scale.show_value == XmNONE))))) {
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Dimension width=0, height=0 ;
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Re-calculate the size of the Scale if a new size was not
|
|
Packit |
b099d7 |
* specified, and only if realized.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
GetScaleSize (new_w, &width, &height);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (new_w->core.width == cur->core.width)
|
|
Packit |
b099d7 |
new_w->core.width = width ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (new_w->core.height == cur->core.height)
|
|
Packit |
b099d7 |
new_w->core.height = height ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (XtIsRealized((Widget)new_w) &&
|
|
Packit |
b099d7 |
(DIFF(scale.sliding_mode) ||
|
|
Packit |
b099d7 |
/* minor show value change only */
|
|
Packit |
b099d7 |
(DIFF(scale.show_value) &&
|
|
Packit |
b099d7 |
(new_w->scale.show_value != XmNONE) &&
|
|
Packit |
b099d7 |
(cur->scale.show_value != XmNONE)) ||
|
|
Packit |
b099d7 |
DIFF(scale.show_arrows))) {
|
|
Packit |
b099d7 |
XtWidgetProc resize;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* generate a relayout and ask for redisplay, only if realized */
|
|
Packit |
b099d7 |
_XmProcessLock();
|
|
Packit |
b099d7 |
resize = xmScaleClassRec.core_class.resize;
|
|
Packit |
b099d7 |
_XmProcessUnlock();
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
(* resize) (nw);
|
|
Packit |
b099d7 |
redisplay = True;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (XtIsRealized((Widget)new_w) &&
|
|
Packit |
b099d7 |
(DIFF(scale.decimal_points) ||
|
|
Packit |
b099d7 |
DIFF(scale.value) ||
|
|
Packit |
b099d7 |
DIFF(scale.minimum) ||
|
|
Packit |
b099d7 |
DIFF(scale.maximum) ||
|
|
Packit |
b099d7 |
DIFF(scale.processing_direction) ||
|
|
Packit |
b099d7 |
DIFF(scale.show_value))) {
|
|
Packit |
b099d7 |
ShowValue(new_w);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* See if the GC needs to be regenerated */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (DIFF(manager.foreground) ||
|
|
Packit |
b099d7 |
DIFF(core.background_pixel)||
|
|
Packit |
b099d7 |
DIFF(core.background_pixmap)) {
|
|
Packit |
b099d7 |
XtReleaseGC ((Widget) new_w, new_w->scale.foreground_GC);
|
|
Packit |
b099d7 |
GetForegroundGC (new_w);
|
|
Packit |
b099d7 |
redisplay = True;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* unset the GM flag */
|
|
Packit |
b099d7 |
new_w->scale.state_flags &= ~FROM_SET_VALUE ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return (redisplay);
|
|
Packit |
b099d7 |
#undef DIFF
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Realize
|
|
Packit |
b099d7 |
* Can't use the standard Manager class realize procedure,
|
|
Packit |
b099d7 |
* because it creates a window with NW gravity, and the
|
|
Packit |
b099d7 |
* scale wants a gravity of None.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
Realize(
|
|
Packit |
b099d7 |
register Widget w,
|
|
Packit |
b099d7 |
XtValueMask *p_valueMask,
|
|
Packit |
b099d7 |
XSetWindowAttributes *attributes )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Mask valueMask = *p_valueMask;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Make sure height and width are not zero.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
if (!XtWidth(w)) XtWidth(w) = 1 ;
|
|
Packit |
b099d7 |
if (!XtHeight(w)) XtHeight(w) = 1 ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
valueMask |= CWBitGravity | CWDontPropagate;
|
|
Packit |
b099d7 |
attributes->bit_gravity = ForgetGravity;
|
|
Packit |
b099d7 |
attributes->do_not_propagate_mask =
|
|
Packit |
b099d7 |
ButtonPressMask | ButtonReleaseMask |
|
|
Packit |
b099d7 |
KeyPressMask | KeyReleaseMask | PointerMotionMask;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XtCreateWindow (w, InputOutput, CopyFromParent, valueMask, attributes);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Destroy
|
|
Packit |
b099d7 |
* Free the callback lists attached to the scale.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
Destroy(
|
|
Packit |
b099d7 |
Widget wid )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmScaleWidget sw = (XmScaleWidget) wid ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XtReleaseGC ((Widget) sw, sw->scale.foreground_GC);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifdef USE_XFT
|
|
Packit |
b099d7 |
if (sw->scale.font_list == NULL && sw->scale.font_struct != NULL)
|
|
Packit |
b099d7 |
XFreeFont (XtDisplay (sw), sw->scale.font_struct);
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (sw->scale.font_list) XmFontListFree(sw->scale.font_list);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (sw->scale.value_region)
|
|
Packit |
b099d7 |
XDestroyRegion(sw->scale.value_region);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* QueryGeometry
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
static XtGeometryResult
|
|
Packit |
b099d7 |
QueryGeometry(
|
|
Packit |
b099d7 |
Widget widget,
|
|
Packit |
b099d7 |
XtWidgetGeometry *intended,
|
|
Packit |
b099d7 |
XtWidgetGeometry *desired )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/* deal with user initial size setting */
|
|
Packit |
b099d7 |
if (!XtIsRealized(widget)) {
|
|
Packit |
b099d7 |
desired->width = XtWidth(widget) ; /* might be 0 */
|
|
Packit |
b099d7 |
desired->height = XtHeight(widget) ; /* might be 0 */
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
/* always computes natural size afterwards */
|
|
Packit |
b099d7 |
desired->width = 0 ;
|
|
Packit |
b099d7 |
desired->height = 0 ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
GetScaleSize ((XmScaleWidget) widget, &desired->width, &desired->height);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* this function will set CWidth and CHeight */
|
|
Packit |
b099d7 |
return XmeReplyToQueryGeometry(widget, intended, desired) ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* GeometryManager
|
|
Packit |
b099d7 |
* Accept everything except change in position.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static XtGeometryResult
|
|
Packit |
b099d7 |
GeometryManager(
|
|
Packit |
b099d7 |
Widget w,
|
|
Packit |
b099d7 |
XtWidgetGeometry *request,
|
|
Packit |
b099d7 |
XtWidgetGeometry *reply ) /* unused */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XtWidgetGeometry desired ;
|
|
Packit |
b099d7 |
XmScaleWidget sw = (XmScaleWidget) XtParent(w) ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (IsQueryOnly(request)) return XtGeometryYes;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (IsWidth(request)) w->core.width = request->width;
|
|
Packit |
b099d7 |
if (IsHeight(request)) w->core.height = request->height;
|
|
Packit |
b099d7 |
if (IsBorder(request)) w->core.border_width = request->border_width;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* no need to do any layout if it is our change, Xt will
|
|
Packit |
b099d7 |
generate one at the end */
|
|
Packit |
b099d7 |
if (sw->scale.state_flags & FROM_SET_VALUE) return XtGeometryYes;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Find out what the best possible answer would be */
|
|
Packit |
b099d7 |
desired.width = 0;
|
|
Packit |
b099d7 |
desired.height = 0;
|
|
Packit |
b099d7 |
GetScaleSize(sw, &desired.width, &desired.height);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* ask that to our parent */
|
|
Packit |
b099d7 |
desired.request_mode = (CWWidth | CWHeight);
|
|
Packit |
b099d7 |
_XmMakeGeometryRequest((Widget) sw, &desired);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* layout using the new size (accepted or not) */
|
|
Packit |
b099d7 |
if (sw->scale.orientation == XmHORIZONTAL)
|
|
Packit |
b099d7 |
LayoutHorizontalScale(sw, &desired, w);
|
|
Packit |
b099d7 |
else /* sw->scale.orientation == XmVERTICAL */
|
|
Packit |
b099d7 |
LayoutVerticalScale(sw, &desired, w);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return XtGeometryYes;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*********************************************************************
|
|
Packit |
b099d7 |
* ChangeManaged
|
|
Packit |
b099d7 |
* Layout children.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*********************************************************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
ChangeManaged(
|
|
Packit |
b099d7 |
Widget wid )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmScaleWidget sw = (XmScaleWidget) wid ;
|
|
Packit |
b099d7 |
XtWidgetGeometry desired ;
|
|
Packit |
b099d7 |
Dimension tmp_width = 0, tmp_height = 0 ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
GetScaleSize(sw, &tmp_width, &tmp_height);
|
|
Packit |
b099d7 |
desired.width = tmp_width ;
|
|
Packit |
b099d7 |
desired.height = tmp_height ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!XtIsRealized((Widget)sw)) {
|
|
Packit |
b099d7 |
/* the first time, only attemps to change non specified sizes */
|
|
Packit |
b099d7 |
if (XtWidth(sw)) desired.width = XtWidth(sw) ;
|
|
Packit |
b099d7 |
if (XtHeight(sw)) desired.height = XtHeight(sw) ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
desired.request_mode = (CWWidth | CWHeight);
|
|
Packit |
b099d7 |
_XmMakeGeometryRequest((Widget) sw, &desired);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* layout with no instigator, but with our real preferred size */
|
|
Packit |
b099d7 |
desired.width = tmp_width ;
|
|
Packit |
b099d7 |
desired.height = tmp_height ;
|
|
Packit |
b099d7 |
if (sw->scale.orientation == XmHORIZONTAL)
|
|
Packit |
b099d7 |
LayoutHorizontalScale(sw, &desired, NULL);
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
LayoutVerticalScale(sw, &desired, NULL);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XmeNavigChangeManaged( (Widget) sw);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
GetScaleSize(
|
|
Packit |
b099d7 |
XmScaleWidget sw,
|
|
Packit |
b099d7 |
Dimension *w,
|
|
Packit |
b099d7 |
Dimension *h )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Dimension sav_w, sav_h;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
sav_w = XtWidth(sw);
|
|
Packit |
b099d7 |
sav_h = XtHeight(sw);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Mark the scale as anything goes */
|
|
Packit |
b099d7 |
XtWidth(sw) = *w;
|
|
Packit |
b099d7 |
XtHeight(sw) = *h;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* only override the pointed dimensions if they are null */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (sw->scale.orientation == XmHORIZONTAL) {
|
|
Packit |
b099d7 |
if (!*w) {
|
|
Packit |
b099d7 |
*w = MAX(TitleWidth(sw),
|
|
Packit |
b099d7 |
MajorLeadPad(sw) + ScrollWidth(sw) + MajorTrailPad(sw));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!*h) {
|
|
Packit |
b099d7 |
*h = MaxLabelHeight(sw) + ValueTroughHeight(sw)
|
|
Packit |
b099d7 |
+ ScrollHeight(sw) + TitleHeight(sw);
|
|
Packit |
b099d7 |
if (sw->scale.show_value) *h += SCALE_VALUE_MARGIN;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
} else /* sw->scale.orientation == XmVERTICAL */ {
|
|
Packit |
b099d7 |
if (!*w) {
|
|
Packit |
b099d7 |
*w = MaxLabelWidth(sw) + ValueTroughWidth(sw)
|
|
Packit |
b099d7 |
+ ScrollWidth(sw) + TitleWidth(sw);
|
|
Packit |
b099d7 |
if (sw->scale.show_value) *w += SCALE_VALUE_MARGIN;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!*h) {
|
|
Packit |
b099d7 |
*h = MAX(TitleHeight(sw),
|
|
Packit |
b099d7 |
MajorLeadPad(sw) + ScrollHeight(sw) + MajorTrailPad(sw));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Don't ever desire 0 dimensions */
|
|
Packit |
b099d7 |
if (!*w) *w = 1;
|
|
Packit |
b099d7 |
if (!*h) *h = 1;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Restore the current values */
|
|
Packit |
b099d7 |
XtWidth(sw) = sav_w;
|
|
Packit |
b099d7 |
XtHeight(sw) = sav_h;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static Dimension
|
|
Packit |
b099d7 |
MaxLabelWidth(
|
|
Packit |
b099d7 |
XmScaleWidget sw )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
register int i;
|
|
Packit |
b099d7 |
register Widget c;
|
|
Packit |
b099d7 |
Dimension max = 0;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* start at 2 to skip the title and the scrollbar */
|
|
Packit |
b099d7 |
for ( i = 2; i < sw->composite.num_children; i++)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
c = sw->composite.children[i];
|
|
Packit |
b099d7 |
if (XtIsManaged(c) &&
|
|
Packit |
b099d7 |
!((Object)c)->object.being_destroyed)
|
|
Packit |
b099d7 |
ASSIGN_MAX(max, TotalWidth(c));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return (max);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static Dimension
|
|
Packit |
b099d7 |
MaxLabelHeight(
|
|
Packit |
b099d7 |
XmScaleWidget sw )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
register int i;
|
|
Packit |
b099d7 |
register Widget c;
|
|
Packit |
b099d7 |
Dimension max = 0;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* start at 2 to skip the title and the scrollbar */
|
|
Packit |
b099d7 |
for ( i = 2; i < sw->composite.num_children; i++)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
c = sw->composite.children[i];
|
|
Packit |
b099d7 |
if (XtIsManaged(c) &&
|
|
Packit |
b099d7 |
!((Object)c)->object.being_destroyed)
|
|
Packit |
b099d7 |
ASSIGN_MAX(max, TotalHeight(c));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return (max);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static Dimension
|
|
Packit |
b099d7 |
ValueTroughHeight(
|
|
Packit |
b099d7 |
XmScaleWidget sw)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
#if USE_XFT
|
|
Packit |
b099d7 |
int ret_val = 0;
|
|
Packit |
b099d7 |
if (sw->scale.show_value) {
|
|
Packit |
b099d7 |
XmRenderTableGetDefaultFontExtents(sw->scale.font_list,
|
|
Packit |
b099d7 |
&ret_val, NULL, NULL);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
return (Dimension)ret_val;
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
char buff[15];
|
|
Packit |
b099d7 |
register Dimension tmp_max, tmp_min, result;
|
|
Packit |
b099d7 |
int direction, ascent, descent;
|
|
Packit |
b099d7 |
XCharStruct overall_return;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define GET_MAX(tmp, max_or_min_value) {\
|
|
Packit |
b099d7 |
if (sw->scale.decimal_points)\
|
|
Packit |
b099d7 |
sprintf(buff, "%d%c", max_or_min_value,\
|
|
Packit |
b099d7 |
nl_langinfo(RADIXCHAR)[0]);\
|
|
Packit |
b099d7 |
else\
|
|
Packit |
b099d7 |
sprintf(buff, "%d", max_or_min_value);\
|
|
Packit |
b099d7 |
\
|
|
Packit |
b099d7 |
XTextExtents(sw->scale.font_struct, buff, strlen(buff),\
|
|
Packit |
b099d7 |
&direction, &ascent, &descent, &overall_return);\
|
|
Packit |
b099d7 |
\
|
|
Packit |
b099d7 |
tmp = ascent + descent;\
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (sw->scale.show_value) {
|
|
Packit |
b099d7 |
GET_MAX(tmp_max, sw->scale.maximum) ;
|
|
Packit |
b099d7 |
GET_MAX(tmp_min, sw->scale.minimum) ;
|
|
Packit |
b099d7 |
result = MAX(tmp_min, tmp_max);
|
|
Packit |
b099d7 |
return (result);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
return (0);
|
|
Packit |
b099d7 |
#undef GET_MAX
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static Dimension
|
|
Packit |
b099d7 |
ValueTroughAscent(
|
|
Packit |
b099d7 |
XmScaleWidget sw)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
#if USE_XFT
|
|
Packit |
b099d7 |
int ret_val = 0;
|
|
Packit |
b099d7 |
if (sw->scale.show_value) {
|
|
Packit |
b099d7 |
XmRenderTableGetDefaultFontExtents(sw->scale.font_list,
|
|
Packit |
b099d7 |
NULL, &ret_val, NULL);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
return (Dimension)ret_val;
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
char buff[15];
|
|
Packit |
b099d7 |
register Dimension tmp_max, tmp_min, result;
|
|
Packit |
b099d7 |
int direction, ascent, descent;
|
|
Packit |
b099d7 |
XCharStruct overall_return;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define GET_MAX(tmp, max_or_min_value) {\
|
|
Packit |
b099d7 |
if (sw->scale.decimal_points)\
|
|
Packit |
b099d7 |
sprintf(buff, "%d%c", max_or_min_value,\
|
|
Packit |
b099d7 |
nl_langinfo(RADIXCHAR)[0]);\
|
|
Packit |
b099d7 |
else\
|
|
Packit |
b099d7 |
sprintf(buff, "%d", max_or_min_value);\
|
|
Packit |
b099d7 |
\
|
|
Packit |
b099d7 |
XTextExtents(sw->scale.font_struct, buff, strlen(buff),\
|
|
Packit |
b099d7 |
&direction, &ascent, &descent, &overall_return);\
|
|
Packit |
b099d7 |
\
|
|
Packit |
b099d7 |
tmp = ascent;\
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (sw->scale.show_value) {
|
|
Packit |
b099d7 |
GET_MAX(tmp_max, sw->scale.maximum) ;
|
|
Packit |
b099d7 |
GET_MAX(tmp_min, sw->scale.minimum) ;
|
|
Packit |
b099d7 |
result = MAX(tmp_min, tmp_max);
|
|
Packit |
b099d7 |
return (result);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
return (0);
|
|
Packit |
b099d7 |
#undef GET_MAX
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static Dimension
|
|
Packit |
b099d7 |
ValueTroughDescent(
|
|
Packit |
b099d7 |
XmScaleWidget sw)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
#if USE_XFT
|
|
Packit |
b099d7 |
int ret_val = 0;
|
|
Packit |
b099d7 |
if (sw->scale.show_value) {
|
|
Packit |
b099d7 |
XmRenderTableGetDefaultFontExtents(sw->scale.font_list,
|
|
Packit |
b099d7 |
NULL, NULL, &ret_val);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
return (Dimension)ret_val;
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
char buff[15];
|
|
Packit |
b099d7 |
register Dimension tmp_max, tmp_min, result;
|
|
Packit |
b099d7 |
int direction, ascent, descent;
|
|
Packit |
b099d7 |
XCharStruct overall_return;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define GET_MAX(tmp, max_or_min_value) {\
|
|
Packit |
b099d7 |
if (sw->scale.decimal_points)\
|
|
Packit |
b099d7 |
sprintf(buff, "%d%c", max_or_min_value,\
|
|
Packit |
b099d7 |
nl_langinfo(RADIXCHAR)[0]);\
|
|
Packit |
b099d7 |
else\
|
|
Packit |
b099d7 |
sprintf(buff, "%d", max_or_min_value);\
|
|
Packit |
b099d7 |
\
|
|
Packit |
b099d7 |
XTextExtents(sw->scale.font_struct, buff, strlen(buff),\
|
|
Packit |
b099d7 |
&direction, &ascent, &descent, &overall_return);\
|
|
Packit |
b099d7 |
\
|
|
Packit |
b099d7 |
tmp = descent;\
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (sw->scale.show_value) {
|
|
Packit |
b099d7 |
GET_MAX(tmp_max, sw->scale.maximum) ;
|
|
Packit |
b099d7 |
GET_MAX(tmp_min, sw->scale.minimum) ;
|
|
Packit |
b099d7 |
result = MAX(tmp_min, tmp_max);
|
|
Packit |
b099d7 |
return (result);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
return (0);
|
|
Packit |
b099d7 |
#undef GET_MAX
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static Dimension
|
|
Packit |
b099d7 |
ValueTroughWidth(
|
|
Packit |
b099d7 |
XmScaleWidget sw)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
char buff[15];
|
|
Packit |
b099d7 |
register Dimension tmp_max, tmp_min, result;
|
|
Packit |
b099d7 |
int direction, ascent, descent;
|
|
Packit |
b099d7 |
XCharStruct overall_return;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#if USE_XFT
|
|
Packit |
b099d7 |
#define GET_MAX(tmp, max_or_min_value) {\
|
|
Packit |
b099d7 |
XmString tmp_str;\
|
|
Packit |
b099d7 |
if (sw->scale.decimal_points)\
|
|
Packit |
b099d7 |
sprintf(buff, "%d%c", max_or_min_value,\
|
|
Packit |
b099d7 |
nl_langinfo(RADIXCHAR)[0]);\
|
|
Packit |
b099d7 |
else\
|
|
Packit |
b099d7 |
sprintf(buff, "%d", max_or_min_value);\
|
|
Packit |
b099d7 |
\
|
|
Packit |
b099d7 |
tmp = XmStringWidth(sw->scale.font_list, tmp_str = XmStringCreateSimple(buff));\
|
|
Packit |
b099d7 |
XmStringFree(tmp_str);\
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
#define GET_MAX(tmp, max_or_min_value) {\
|
|
Packit |
b099d7 |
if (sw->scale.decimal_points)\
|
|
Packit |
b099d7 |
sprintf(buff, "%d%c", max_or_min_value,\
|
|
Packit |
b099d7 |
nl_langinfo(RADIXCHAR)[0]);\
|
|
Packit |
b099d7 |
else\
|
|
Packit |
b099d7 |
sprintf(buff, "%d", max_or_min_value);\
|
|
Packit |
b099d7 |
\
|
|
Packit |
b099d7 |
XTextExtents(sw->scale.font_struct, buff, strlen(buff),\
|
|
Packit |
b099d7 |
&direction, &ascent, &descent, &overall_return);\
|
|
Packit |
b099d7 |
\
|
|
Packit |
b099d7 |
tmp = overall_return.rbearing - overall_return.lbearing;\
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (sw->scale.show_value) {
|
|
Packit |
b099d7 |
GET_MAX(tmp_max, sw->scale.maximum) ;
|
|
Packit |
b099d7 |
GET_MAX(tmp_min, sw->scale.minimum) ;
|
|
Packit |
b099d7 |
result = MAX(tmp_min, tmp_max);
|
|
Packit |
b099d7 |
return (result);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
return (0);
|
|
Packit |
b099d7 |
#undef GET_MAX
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static Dimension
|
|
Packit |
b099d7 |
TitleWidth(
|
|
Packit |
b099d7 |
XmScaleWidget sw )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
register Dimension tmp = 0;
|
|
Packit |
b099d7 |
register Widget title_widget = sw->composite.children[0];
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (XtIsManaged(title_widget)) {
|
|
Packit |
b099d7 |
tmp = TotalWidth(title_widget) ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (sw->scale.orientation == XmVERTICAL)
|
|
Packit |
b099d7 |
tmp += (TotalHeight(title_widget)) >> 2;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return(tmp);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static Dimension
|
|
Packit |
b099d7 |
TitleHeight(
|
|
Packit |
b099d7 |
XmScaleWidget sw )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
register Dimension tmp = 0;
|
|
Packit |
b099d7 |
register Widget title_widget = sw->composite.children[0];
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (XtIsManaged(title_widget)) {
|
|
Packit |
b099d7 |
tmp = TotalHeight(title_widget);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (sw->scale.orientation == XmHORIZONTAL)
|
|
Packit |
b099d7 |
tmp += (TotalHeight(title_widget)) >> 2;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return(tmp);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static Cardinal
|
|
Packit |
b099d7 |
NumManaged(
|
|
Packit |
b099d7 |
XmScaleWidget sw,
|
|
Packit |
b099d7 |
Widget * first_man,
|
|
Packit |
b099d7 |
Widget * last_man)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Cardinal i, num_managed = 0 ;
|
|
Packit |
b099d7 |
Widget first_tic = NULL, last_tic = NULL, c ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (i = 2; i < sw->composite.num_children; i++) {
|
|
Packit |
b099d7 |
c = sw->composite.children[i];
|
|
Packit |
b099d7 |
if (XtIsManaged(c) &&
|
|
Packit |
b099d7 |
!((Object)c)->object.being_destroyed) {
|
|
Packit |
b099d7 |
num_managed ++ ;
|
|
Packit |
b099d7 |
if (!first_tic) first_tic = c ;
|
|
Packit |
b099d7 |
last_tic = c ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (first_man) *first_man = first_tic ;
|
|
Packit |
b099d7 |
if (last_man) *last_man = last_tic ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return num_managed + 2 ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static Dimension
|
|
Packit |
b099d7 |
MajorLeadPad(
|
|
Packit |
b099d7 |
XmScaleWidget sw )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmScrollBarWidget sb = (XmScrollBarWidget)(sw->composite.children[1]);
|
|
Packit |
b099d7 |
int tmp1 = 0, tmp2;
|
|
Packit |
b099d7 |
Cardinal num_managed ;
|
|
Packit |
b099d7 |
Widget first_tic ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
num_managed = NumManaged(sw, &first_tic, NULL);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (num_managed > 3) {
|
|
Packit |
b099d7 |
if (sw->scale.orientation == XmHORIZONTAL)
|
|
Packit |
b099d7 |
tmp1 = (TotalWidth(first_tic) / 2)
|
|
Packit |
b099d7 |
- LeadXTic(sb, sw);
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
tmp1 = (TotalHeight(first_tic) / 2)
|
|
Packit |
b099d7 |
- LeadYTic(sb, sw);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
} else if (num_managed == 3) {
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* This is a potential non-terminal recursion.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Currently MajorScrollSize has knowledge of this potential
|
|
Packit |
b099d7 |
* problem and has guards around the call to this procedure.
|
|
Packit |
b099d7 |
* Modify with care.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (sw->scale.orientation == XmHORIZONTAL)
|
|
Packit |
b099d7 |
tmp1 = ((int)TotalWidth(first_tic) -
|
|
Packit |
b099d7 |
(int)ScrollWidth(sw))/2;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
tmp1 = ((int)TotalHeight(first_tic) -
|
|
Packit |
b099d7 |
(int)ScrollHeight(sw))/2;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
tmp1 -= (sb->primitive.highlight_thickness + sb->primitive.shadow_thickness);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (sw->scale.orientation == XmHORIZONTAL)
|
|
Packit |
b099d7 |
tmp2 = ((int)ValueTroughWidth(sw) / 2) - (int)LeadXTic(sb, sw);
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
if (sw->scale.sliding_mode == XmTHERMOMETER)
|
|
Packit |
b099d7 |
tmp2 = ((int)ValueTroughAscent(sw)) - (int)LeadYTic(sb, sw);
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
tmp2 = ((int)ValueTroughHeight(sw) / 2) - (int)LeadYTic(sb, sw);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
tmp2 -= (sb->primitive.highlight_thickness
|
|
Packit |
b099d7 |
+ sb->primitive.shadow_thickness);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
ASSIGN_MAX(tmp1, 0);
|
|
Packit |
b099d7 |
ASSIGN_MAX(tmp2, 0);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return(MAX(tmp1, tmp2));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static Dimension
|
|
Packit |
b099d7 |
MajorTrailPad(
|
|
Packit |
b099d7 |
XmScaleWidget sw )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmScrollBarWidget sb = (XmScrollBarWidget) (sw->composite.children[1]);
|
|
Packit |
b099d7 |
int tmp1 = 0, tmp2;
|
|
Packit |
b099d7 |
Cardinal num_managed ;
|
|
Packit |
b099d7 |
Widget first_tic, last_tic ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
num_managed = NumManaged(sw, &first_tic, &last_tic);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (num_managed > 3) {
|
|
Packit |
b099d7 |
if (sw->scale.orientation == XmHORIZONTAL)
|
|
Packit |
b099d7 |
tmp1 = ((int)TotalWidth(last_tic) / 2)
|
|
Packit |
b099d7 |
- (int)TrailXTic(sb, sw);
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
tmp1 = ((int)TotalHeight(last_tic) / 2)
|
|
Packit |
b099d7 |
- (int)TrailYTic(sb, sw);
|
|
Packit |
b099d7 |
} else if (num_managed == 3) {
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* This is a potential non-terminal recursion.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Currently MajorScrollSize has knowledge of this potential
|
|
Packit |
b099d7 |
* problem and has guards around the call to this procedure.
|
|
Packit |
b099d7 |
* Modify with care.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (sw->scale.orientation == XmHORIZONTAL)
|
|
Packit |
b099d7 |
tmp1 = ((int)TotalWidth(first_tic) -
|
|
Packit |
b099d7 |
(int)ScrollWidth(sw))/2;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
tmp1 = ((int)TotalHeight(first_tic) -
|
|
Packit |
b099d7 |
(int)ScrollHeight(sw))/2;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
tmp1 -= (sb->primitive.highlight_thickness
|
|
Packit |
b099d7 |
+ sb->primitive.shadow_thickness);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (sw->scale.orientation == XmHORIZONTAL)
|
|
Packit |
b099d7 |
tmp2 = ((int)ValueTroughWidth(sw) / 2) - (int)TrailXTic(sb, sw);
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
if (sw->scale.sliding_mode == XmTHERMOMETER)
|
|
Packit |
b099d7 |
tmp2 = ((int)ValueTroughDescent(sw)) - (int)TrailYTic(sb, sw);
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
tmp2 = ((int)ValueTroughHeight(sw) / 2) - (int)TrailYTic(sb, sw);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifdef FIX_1528
|
|
Packit |
b099d7 |
tmp2 += (sb->primitive.highlight_thickness
|
|
Packit |
b099d7 |
+ sb->primitive.shadow_thickness);
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
tmp2 -= (sb->primitive.highlight_thickness
|
|
Packit |
b099d7 |
+ sb->primitive.shadow_thickness);
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
ASSIGN_MAX(tmp1, 0);
|
|
Packit |
b099d7 |
ASSIGN_MAX(tmp2, 0);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return(MAX(tmp1, tmp2));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static Dimension
|
|
Packit |
b099d7 |
ScrollWidth(
|
|
Packit |
b099d7 |
XmScaleWidget sw )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int tmp = 0;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (sw->scale.orientation == XmVERTICAL) {
|
|
Packit |
b099d7 |
if (!(tmp = sw->scale.scale_width))
|
|
Packit |
b099d7 |
tmp = SCALE_DEFAULT_MINOR_SIZE;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
tmp = sw->scale.scale_width;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
if (!(tmp = sw->scale.scale_width)) {
|
|
Packit |
b099d7 |
if (sw->core.width != 0) {
|
|
Packit |
b099d7 |
Cardinal num_managed ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
num_managed = NumManaged(sw, NULL, NULL);
|
|
Packit |
b099d7 |
/* Have to catch an indirect recursion here */
|
|
Packit |
b099d7 |
if (num_managed > 3)
|
|
Packit |
b099d7 |
tmp = (int)sw->core.width
|
|
Packit |
b099d7 |
- (MajorLeadPad(sw) + MajorTrailPad(sw));
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
/* Magic to handle excessively wide values */
|
|
Packit |
b099d7 |
int tmp1, tmp2;
|
|
Packit |
b099d7 |
XmScrollBarWidget sb = (XmScrollBarWidget)
|
|
Packit |
b099d7 |
sw->composite.children[1];
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
tmp1 = ((int)ValueTroughWidth(sw) / 2) -
|
|
Packit |
b099d7 |
(int)LeadXTic(sb, sw);
|
|
Packit |
b099d7 |
tmp2 = ((int)ValueTroughWidth(sw) / 2) -
|
|
Packit |
b099d7 |
(int)TrailXTic(sb, sw);
|
|
Packit |
b099d7 |
ASSIGN_MAX(tmp1, 0);
|
|
Packit |
b099d7 |
ASSIGN_MAX(tmp2, 0);
|
|
Packit |
b099d7 |
tmp = (int)sw->core.width - tmp1 - tmp2;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (tmp <= 0) {
|
|
Packit |
b099d7 |
Cardinal num_managed ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
num_managed = NumManaged(sw, NULL, NULL);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (num_managed > 2) {
|
|
Packit |
b099d7 |
/* Have to catch an indirect recursion here */
|
|
Packit |
b099d7 |
if (num_managed > 3) {
|
|
Packit |
b099d7 |
Dimension tic, diff;
|
|
Packit |
b099d7 |
XmScrollBarWidget sb = (XmScrollBarWidget)
|
|
Packit |
b099d7 |
sw->composite.children[1];
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifdef FIX_1528
|
|
Packit |
b099d7 |
tmp = MAX((num_managed - 2)* MaxLabelWidth(sw), SCALE_DEFAULT_MAJOR_SIZE);
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
tmp = (num_managed - 2)* MaxLabelWidth(sw);
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
tic = sb->primitive.highlight_thickness
|
|
Packit |
b099d7 |
+ sb->primitive.shadow_thickness
|
|
Packit |
b099d7 |
+ (Dimension) (((float) SLIDER_SIZE( sw) / 2.0)
|
|
Packit |
b099d7 |
+ 0.5);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
diff = tic - ((int)MaxLabelWidth(sw) / 2);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (diff > 0) tmp+= (2 * diff);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
#ifdef FIX_1528
|
|
Packit |
b099d7 |
tmp = MAX(MaxLabelWidth(sw), SCALE_DEFAULT_MAJOR_SIZE);
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
tmp = MaxLabelWidth(sw);
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (tmp <= 0) tmp = SCALE_DEFAULT_MAJOR_SIZE;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return((Dimension) tmp);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static Dimension
|
|
Packit |
b099d7 |
ScrollHeight(
|
|
Packit |
b099d7 |
XmScaleWidget sw )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int tmp;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (sw->scale.orientation == XmHORIZONTAL) {
|
|
Packit |
b099d7 |
if (!(tmp = sw->scale.scale_height))
|
|
Packit |
b099d7 |
tmp = SCALE_DEFAULT_MINOR_SIZE;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
tmp = sw->scale.scale_height;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
if (!(tmp = sw->scale.scale_height)){
|
|
Packit |
b099d7 |
if (sw->core.height != 0)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Cardinal num_managed ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
num_managed = NumManaged(sw, NULL, NULL);
|
|
Packit |
b099d7 |
/* Have to catch an indirect recursion here */
|
|
Packit |
b099d7 |
if (num_managed > 3)
|
|
Packit |
b099d7 |
tmp = (int)sw->core.height
|
|
Packit |
b099d7 |
- (MajorLeadPad(sw) + MajorTrailPad(sw));
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
#ifdef FIX_1528
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int tmp1, tmp2;
|
|
Packit |
b099d7 |
XmScrollBarWidget sb = (XmScrollBarWidget)
|
|
Packit |
b099d7 |
sw->composite.children[1];
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
tmp1 = ((int)ValueTroughHeight(sw) / 2) -
|
|
Packit |
b099d7 |
(int)LeadYTic(sb, sw);
|
|
Packit |
b099d7 |
tmp2 = ((int)ValueTroughHeight(sw) / 2) -
|
|
Packit |
b099d7 |
(int)TrailYTic(sb, sw);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
ASSIGN_MAX(tmp1, 0);
|
|
Packit |
b099d7 |
ASSIGN_MAX(tmp2, 0);
|
|
Packit |
b099d7 |
tmp = (int)sw->core.height - tmp1 - tmp2;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
tmp = sw->core.height;
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (tmp <= 0){
|
|
Packit |
b099d7 |
Cardinal num_managed ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
num_managed = NumManaged(sw, NULL, NULL);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (num_managed > 2){
|
|
Packit |
b099d7 |
/* Have to catch an indirect recursion here */
|
|
Packit |
b099d7 |
if (num_managed > 3) {
|
|
Packit |
b099d7 |
Dimension tic, diff;
|
|
Packit |
b099d7 |
XmScrollBarWidget sb = (XmScrollBarWidget)
|
|
Packit |
b099d7 |
sw->composite.children[1];
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifdef FIX_1528
|
|
Packit |
b099d7 |
tmp = MAX((num_managed - 2)* MaxLabelHeight(sw), SCALE_DEFAULT_MAJOR_SIZE);
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
tmp = (num_managed - 2)* MaxLabelHeight(sw);
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
tic = sb->primitive.highlight_thickness
|
|
Packit |
b099d7 |
+ sb->primitive.shadow_thickness
|
|
Packit |
b099d7 |
+ (Dimension) (((float) SLIDER_SIZE(sw) / 2.0)
|
|
Packit |
b099d7 |
+ 0.5);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
diff = tic - (MaxLabelHeight(sw) / 2);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (diff > 0) tmp+= (2 * diff);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
#ifdef FIX_1528
|
|
Packit |
b099d7 |
tmp = MAX(MaxLabelHeight(sw), SCALE_DEFAULT_MAJOR_SIZE);
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
tmp = MaxLabelHeight(sw);
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (tmp <= 0) tmp = SCALE_DEFAULT_MAJOR_SIZE;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return((Dimension)tmp);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
LayoutHorizontalLabels(
|
|
Packit |
b099d7 |
XmScaleWidget sw,
|
|
Packit |
b099d7 |
XRectangle *scrollBox,
|
|
Packit |
b099d7 |
XRectangle *labelBox,
|
|
Packit |
b099d7 |
Widget instigator )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Dimension first_tic_dim, last_tic_dim;
|
|
Packit |
b099d7 |
float tic_interval, tmp ;
|
|
Packit |
b099d7 |
XmScrollBarWidget sb = (XmScrollBarWidget)
|
|
Packit |
b099d7 |
(sw->composite.children[1]);
|
|
Packit |
b099d7 |
Widget w, first_tic;
|
|
Packit |
b099d7 |
int i;
|
|
Packit |
b099d7 |
Position x, y, y1;
|
|
Packit |
b099d7 |
Cardinal num_managed ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
y1 = labelBox->y + labelBox->height;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
num_managed = NumManaged(sw, &first_tic, NULL);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (num_managed > 3)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
first_tic_dim = scrollBox->x + LeadXTic(sb, sw);
|
|
Packit |
b099d7 |
last_tic_dim = (scrollBox->x + sb->core.width) - TrailXTic(sb, sw);
|
|
Packit |
b099d7 |
tic_interval = (float)(last_tic_dim - first_tic_dim)
|
|
Packit |
b099d7 |
/ (num_managed - 3);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (i = 2, tmp = first_tic_dim;
|
|
Packit |
b099d7 |
i < sw->composite.num_children;
|
|
Packit |
b099d7 |
i++)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (LayoutIsRtoLM(sw) &&
|
|
Packit |
b099d7 |
sw->scale.processing_direction == XmMAX_ON_LEFT)
|
|
Packit |
b099d7 |
w = sw->composite.children[sw->composite.num_children - i + 1];
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
w = sw->composite.children[i];
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!XtIsManaged(w) ||
|
|
Packit |
b099d7 |
((Object)w)->object.being_destroyed) continue ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
x = (int) tmp - (TotalWidth(w) / 2);
|
|
Packit |
b099d7 |
y = y1 - TotalHeight(w);
|
|
Packit |
b099d7 |
if (instigator != w)
|
|
Packit |
b099d7 |
XmeConfigureObject(w, x, y,
|
|
Packit |
b099d7 |
w->core.width, w->core.height,
|
|
Packit |
b099d7 |
w->core.border_width);
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
w->core.x = x ;
|
|
Packit |
b099d7 |
w->core.y = y ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
tmp += tic_interval ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else if (num_managed == 3)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
w = first_tic;
|
|
Packit |
b099d7 |
y = y1 - TotalHeight(w);
|
|
Packit |
b099d7 |
if (XtIsManaged(w) &&
|
|
Packit |
b099d7 |
!((Object)w)->object.being_destroyed) {
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
tmp = (sb->scrollBar.slider_area_width -
|
|
Packit |
b099d7 |
TotalWidth(w)) / 2;
|
|
Packit |
b099d7 |
x = scrollBox->x + sb->scrollBar.slider_area_x
|
|
Packit |
b099d7 |
+ (int) tmp ;
|
|
Packit |
b099d7 |
if (instigator != w)
|
|
Packit |
b099d7 |
XmeConfigureObject(w, x, y, w->core.width,
|
|
Packit |
b099d7 |
w->core.height,
|
|
Packit |
b099d7 |
w->core.border_width);
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
w->core.x = x ;
|
|
Packit |
b099d7 |
w->core.y = y ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
LayoutHorizontalScale(
|
|
Packit |
b099d7 |
XmScaleWidget sw,
|
|
Packit |
b099d7 |
XtWidgetGeometry * desired,
|
|
Packit |
b099d7 |
Widget instigator)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int diff_w, diff_h, tdiff;
|
|
Packit |
b099d7 |
XRectangle labelBox, valueBox, scrollBox, titleBox;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
diff_w = XtWidth(sw) - desired->width;
|
|
Packit |
b099d7 |
diff_h = XtHeight(sw) - desired->height;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
titleBox.height = TitleHeight(sw);
|
|
Packit |
b099d7 |
scrollBox.height = ScrollHeight(sw);
|
|
Packit |
b099d7 |
valueBox.height = ValueTroughHeight(sw);
|
|
Packit |
b099d7 |
labelBox.height = MaxLabelHeight(sw);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Figure out all of the y locations */
|
|
Packit |
b099d7 |
if (diff_h >= 0)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* We place the title, scrollbar, and value from the right
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
titleBox.y = XtHeight(sw) - titleBox.height;
|
|
Packit |
b099d7 |
scrollBox.y = titleBox.y - scrollBox.height;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (sw->scale.show_value == XmNEAR_BORDER) {
|
|
Packit |
b099d7 |
valueBox.y = 0;
|
|
Packit |
b099d7 |
labelBox.y = scrollBox.y - labelBox.height;
|
|
Packit |
b099d7 |
} else { /* NEAR_SLIDER or NONE */
|
|
Packit |
b099d7 |
labelBox.y = 0;
|
|
Packit |
b099d7 |
valueBox.y = scrollBox.y - valueBox.height;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else if ((tdiff = diff_h + TitleHeight(sw)) >= 0)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/* Place from the left and let the title get clipped */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (sw->scale.show_value == XmNEAR_BORDER) {
|
|
Packit |
b099d7 |
valueBox.y = 0;
|
|
Packit |
b099d7 |
labelBox.y = valueBox.y + valueBox.height;
|
|
Packit |
b099d7 |
} else { /* NEAR_SLIDER or NONE */
|
|
Packit |
b099d7 |
labelBox.y = 0;
|
|
Packit |
b099d7 |
valueBox.y = labelBox.y + labelBox.height;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
scrollBox.y = valueBox.y + valueBox.height;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
titleBox.y = scrollBox.y + scrollBox.height;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else if ((tdiff += ValueTroughHeight(sw)) >= 0)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* The title is outside the window, and the labels are
|
|
Packit |
b099d7 |
* allowed overwrite (occlude) the value display region
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
titleBox.y = XtHeight(sw);
|
|
Packit |
b099d7 |
scrollBox.y = titleBox.y - scrollBox.height;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (sw->scale.show_value == XmNEAR_BORDER) {
|
|
Packit |
b099d7 |
valueBox.y = 0;
|
|
Packit |
b099d7 |
labelBox.y = scrollBox.y - labelBox.height;
|
|
Packit |
b099d7 |
} else { /* NEAR_SLIDER or NONE */
|
|
Packit |
b099d7 |
valueBox.y = scrollBox.y - valueBox.height;
|
|
Packit |
b099d7 |
labelBox.y = 0;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else if ((tdiff += MaxLabelHeight(sw)) >= 0)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* The title is outside the window, the value trough is
|
|
Packit |
b099d7 |
* completely coincident with the label region, and the
|
|
Packit |
b099d7 |
* labels are clipped from the left
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
titleBox.y = XtHeight(sw);
|
|
Packit |
b099d7 |
scrollBox.y = titleBox.y - scrollBox.height;
|
|
Packit |
b099d7 |
labelBox.y = scrollBox.y - labelBox.height;
|
|
Packit |
b099d7 |
valueBox.y = scrollBox.y - valueBox.height;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Just center the scrollbar in the available space.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
titleBox.y = XtHeight(sw);
|
|
Packit |
b099d7 |
valueBox.y = titleBox.y;
|
|
Packit |
b099d7 |
labelBox.y = valueBox.y;
|
|
Packit |
b099d7 |
scrollBox.y = (XtHeight(sw) - ScrollHeight(sw)) / 2;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (diff_w >= 0)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
scrollBox.x = MajorLeadPad(sw);
|
|
Packit |
b099d7 |
scrollBox.width = ScrollWidth(sw);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Dimension sb_min, avail, lp, tp;
|
|
Packit |
b099d7 |
XmScrollBarWidget sb = (XmScrollBarWidget)
|
|
Packit |
b099d7 |
(sw->composite.children[1]);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
sb_min = (2 * sb->primitive.highlight_thickness)
|
|
Packit |
b099d7 |
+ (4 * sb->primitive.shadow_thickness)
|
|
Packit |
b099d7 |
+ SLIDER_SIZE( sw);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
lp = MajorLeadPad(sw);
|
|
Packit |
b099d7 |
tp = MajorTrailPad(sw);
|
|
Packit |
b099d7 |
avail = XtWidth(sw) - lp - tp;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (avail < sb_min)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
scrollBox.width = sb_min;
|
|
Packit |
b099d7 |
scrollBox.x = (XtWidth(sw) - sb_min) / 2;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
scrollBox.width = avail;
|
|
Packit |
b099d7 |
scrollBox.x = lp;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (LayoutIsRtoLM(sw))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
titleBox.x = ScrollWidth(sw) - TitleWidth(sw);
|
|
Packit |
b099d7 |
XmeConfigureObject(sw->composite.children[0],
|
|
Packit |
b099d7 |
titleBox.x, titleBox.y,
|
|
Packit |
b099d7 |
(sw->composite.children[0])->core.width,
|
|
Packit |
b099d7 |
(sw->composite.children[0])->core.height,
|
|
Packit |
b099d7 |
(sw->composite.children[0])->core.border_width);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
if (instigator != sw->composite.children[0])
|
|
Packit |
b099d7 |
XmeConfigureObject(sw->composite.children[0], 0, titleBox.y,
|
|
Packit |
b099d7 |
(sw->composite.children[0])->core.width,
|
|
Packit |
b099d7 |
(sw->composite.children[0])->core.height,
|
|
Packit |
b099d7 |
(sw->composite.children[0])->core.border_width);
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
sw->composite.children[0]->core.x = 0 ;
|
|
Packit |
b099d7 |
sw->composite.children[0]->core.y = titleBox.y ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (instigator != sw->composite.children[1])
|
|
Packit |
b099d7 |
XmeConfigureObject(sw->composite.children[1],
|
|
Packit |
b099d7 |
scrollBox.x, scrollBox.y,
|
|
Packit |
b099d7 |
scrollBox.width, scrollBox.height, 0);
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
sw->composite.children[1]->core.x = scrollBox.x ;
|
|
Packit |
b099d7 |
sw->composite.children[1]->core.y = scrollBox.y ;
|
|
Packit |
b099d7 |
sw->composite.children[1]->core.width = scrollBox.width ;
|
|
Packit |
b099d7 |
sw->composite.children[1]->core.height = scrollBox.height ;
|
|
Packit |
b099d7 |
sw->composite.children[1]->core.border_width = 0 ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
SetScrollBarData(sw);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
LayoutHorizontalLabels(sw, &scrollBox, &labelBox, instigator);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
LayoutVerticalLabels(
|
|
Packit |
b099d7 |
XmScaleWidget sw,
|
|
Packit |
b099d7 |
XRectangle *scrollBox,
|
|
Packit |
b099d7 |
XRectangle *labelBox,
|
|
Packit |
b099d7 |
Widget instigator )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Dimension first_tic_dim, last_tic_dim;
|
|
Packit |
b099d7 |
XmScrollBarWidget sb = (XmScrollBarWidget)
|
|
Packit |
b099d7 |
(sw->composite.children[1]);
|
|
Packit |
b099d7 |
Widget w, first_tic;
|
|
Packit |
b099d7 |
int i;
|
|
Packit |
b099d7 |
float tmp, tic_interval;
|
|
Packit |
b099d7 |
Position x, x1, y;
|
|
Packit |
b099d7 |
Cardinal num_managed ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
num_managed = NumManaged(sw, &first_tic, NULL);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
x1 = labelBox->x + labelBox->width;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (num_managed > 3)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
first_tic_dim = scrollBox->y + LeadYTic(sb, sw);
|
|
Packit |
b099d7 |
last_tic_dim = (scrollBox->y + sb->core.height) -
|
|
Packit |
b099d7 |
TrailYTic(sb, sw);
|
|
Packit |
b099d7 |
tic_interval = (float)(last_tic_dim - first_tic_dim)
|
|
Packit |
b099d7 |
/ (num_managed - 3);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (i = 2, tmp = first_tic_dim;
|
|
Packit |
b099d7 |
i < sw->composite.num_children;
|
|
Packit |
b099d7 |
i++)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
w = sw->composite.children[i];
|
|
Packit |
b099d7 |
if (!XtIsManaged(w) ||
|
|
Packit |
b099d7 |
((Object)w)->object.being_destroyed) continue ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
y = (int) tmp - (TotalHeight(w) / 2);
|
|
Packit |
b099d7 |
if (LayoutIsRtoLM(sw))
|
|
Packit |
b099d7 |
x = labelBox->x;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
x = x1 - TotalWidth(w);
|
|
Packit |
b099d7 |
if (instigator != w)
|
|
Packit |
b099d7 |
XmeConfigureObject(w, x, y,
|
|
Packit |
b099d7 |
w->core.width, w->core.height,
|
|
Packit |
b099d7 |
w->core.border_width);
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
w->core.x = x ;
|
|
Packit |
b099d7 |
w->core.y = y ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
tmp += tic_interval ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else if (num_managed == 3)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
w = first_tic;
|
|
Packit |
b099d7 |
if (XtIsManaged(w) &&
|
|
Packit |
b099d7 |
!((Object)w)->object.being_destroyed) {
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
x = x1 - TotalWidth(w);
|
|
Packit |
b099d7 |
tmp = (sb->scrollBar.slider_area_height -
|
|
Packit |
b099d7 |
TotalHeight(w)) / 2;
|
|
Packit |
b099d7 |
y = scrollBox->y + sb->scrollBar.slider_area_y
|
|
Packit |
b099d7 |
+ (int) tmp;
|
|
Packit |
b099d7 |
if (instigator != w)
|
|
Packit |
b099d7 |
XmeConfigureObject(w, x, y, w->core.width,
|
|
Packit |
b099d7 |
w->core.height,
|
|
Packit |
b099d7 |
w->core.border_width);
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
w->core.x = x ;
|
|
Packit |
b099d7 |
w->core.y = y ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
LayoutVerticalScale(
|
|
Packit |
b099d7 |
XmScaleWidget sw,
|
|
Packit |
b099d7 |
XtWidgetGeometry * desired,
|
|
Packit |
b099d7 |
Widget instigator)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int diff_w, diff_h, tdiff;
|
|
Packit |
b099d7 |
XRectangle labelBox, valueBox, scrollBox, titleBox;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
diff_w = XtWidth(sw) - desired->width;
|
|
Packit |
b099d7 |
diff_h = XtHeight(sw) - desired->height;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
titleBox.width = TitleWidth(sw);
|
|
Packit |
b099d7 |
scrollBox.width = ScrollWidth(sw);
|
|
Packit |
b099d7 |
valueBox.width = ValueTroughWidth(sw);
|
|
Packit |
b099d7 |
labelBox.width = MaxLabelWidth(sw);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Figure out all of the x locations */
|
|
Packit |
b099d7 |
if (diff_w >= 0)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (LayoutIsRtoLM(sw)) {
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Place the title, scrollbar, and value from the left
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
titleBox.x = 0;
|
|
Packit |
b099d7 |
scrollBox.x = titleBox.x + titleBox.width;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (sw->scale.show_value == XmNEAR_BORDER) {
|
|
Packit |
b099d7 |
valueBox.x = XtWidth(sw) - valueBox.width;
|
|
Packit |
b099d7 |
labelBox.x = scrollBox.x + scrollBox.width;
|
|
Packit |
b099d7 |
} else { /* NEAR_SLIDER or NONE */
|
|
Packit |
b099d7 |
valueBox.x = scrollBox.x + scrollBox.width;
|
|
Packit |
b099d7 |
labelBox.x = XtWidth(sw) - labelBox.width;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* We place the title, scrollbar, and value from the right
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
titleBox.x = XtWidth(sw) - titleBox.width;
|
|
Packit |
b099d7 |
scrollBox.x = titleBox.x - scrollBox.width;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (sw->scale.show_value == XmNEAR_BORDER) {
|
|
Packit |
b099d7 |
valueBox.x = 0;
|
|
Packit |
b099d7 |
labelBox.x = scrollBox.x - labelBox.width;
|
|
Packit |
b099d7 |
} else { /* NEAR_SLIDER or NONE */
|
|
Packit |
b099d7 |
valueBox.x = scrollBox.x - valueBox.width;
|
|
Packit |
b099d7 |
labelBox.x = 0;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else if ((tdiff = diff_w + TitleWidth(sw)) >= 0)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (LayoutIsRtoLM(sw)) {
|
|
Packit |
b099d7 |
/* Place from the right and let the title get clipped */
|
|
Packit |
b099d7 |
if (sw->scale.show_value == XmNEAR_BORDER) {
|
|
Packit |
b099d7 |
valueBox.x = XtWidth(sw) - labelBox.width;
|
|
Packit |
b099d7 |
labelBox.x = valueBox.x - valueBox.width;
|
|
Packit |
b099d7 |
scrollBox.x = labelBox.x - scrollBox.width;
|
|
Packit |
b099d7 |
} else { /* NEAR_SLIDER or NONE */
|
|
Packit |
b099d7 |
labelBox.x = XtWidth(sw) - labelBox.width;
|
|
Packit |
b099d7 |
valueBox.x = labelBox.x - valueBox.width;
|
|
Packit |
b099d7 |
scrollBox.x = valueBox.x - scrollBox.width;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
titleBox.x = scrollBox.x - titleBox.width;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
/* Place from the left and let the title get clipped */
|
|
Packit |
b099d7 |
if (sw->scale.show_value == XmNEAR_BORDER) {
|
|
Packit |
b099d7 |
valueBox.x = 0;
|
|
Packit |
b099d7 |
labelBox.x = valueBox.x + valueBox.width;
|
|
Packit |
b099d7 |
scrollBox.x = labelBox.x + labelBox.width;
|
|
Packit |
b099d7 |
} else { /* NEAR_SLIDER or NONE */
|
|
Packit |
b099d7 |
labelBox.x = 0;
|
|
Packit |
b099d7 |
valueBox.x = labelBox.x + labelBox.width;
|
|
Packit |
b099d7 |
scrollBox.x = valueBox.x + valueBox.width;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
titleBox.x = scrollBox.x + scrollBox.width;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else if ((tdiff += ValueTroughWidth(sw)) >= 0)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* The title is outside the window, and the labels are
|
|
Packit |
b099d7 |
* allowed overwrite (occlude) the value display region
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
if (LayoutIsRtoLM(sw))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
titleBox.x = -titleBox.width;
|
|
Packit |
b099d7 |
scrollBox.x = 0;
|
|
Packit |
b099d7 |
if (sw->scale.show_value == XmNEAR_BORDER) {
|
|
Packit |
b099d7 |
labelBox.x = scrollBox.x + scrollBox.width;
|
|
Packit |
b099d7 |
valueBox.x = XtWidth(sw) - valueBox.width;
|
|
Packit |
b099d7 |
} else { /* NEAR_SLIDER or NONE */
|
|
Packit |
b099d7 |
valueBox.x = scrollBox.x + scrollBox.width;
|
|
Packit |
b099d7 |
labelBox.x = XtWidth(sw) - labelBox.width;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
titleBox.x = XtWidth(sw);
|
|
Packit |
b099d7 |
scrollBox.x = titleBox.x - scrollBox.width;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (sw->scale.show_value == XmNEAR_BORDER) {
|
|
Packit |
b099d7 |
labelBox.x = scrollBox.x - labelBox.width;
|
|
Packit |
b099d7 |
valueBox.x = 0;
|
|
Packit |
b099d7 |
} else { /* NEAR_SLIDER or NONE */
|
|
Packit |
b099d7 |
valueBox.x = scrollBox.x - valueBox.width;
|
|
Packit |
b099d7 |
labelBox.x = 0;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else if ((tdiff += MaxLabelWidth(sw)) >= 0)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* The title is outside the window, the value trough is
|
|
Packit |
b099d7 |
* completely coincident with the label region, and the
|
|
Packit |
b099d7 |
* labels are clipped from the left
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
titleBox.x = XtWidth(sw);
|
|
Packit |
b099d7 |
scrollBox.x = titleBox.x - scrollBox.width;
|
|
Packit |
b099d7 |
valueBox.x = scrollBox.x - valueBox.width;
|
|
Packit |
b099d7 |
labelBox.x = scrollBox.x - labelBox.width;
|
|
Packit |
b099d7 |
if (LayoutIsRtoLM(sw))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
titleBox.x = -titleBox.width;
|
|
Packit |
b099d7 |
scrollBox.x = 0;
|
|
Packit |
b099d7 |
valueBox.x = scrollBox.x + scrollBox.width;
|
|
Packit |
b099d7 |
labelBox.x = scrollBox.x + scrollBox.width;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Just center the scrollbar in the available space.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
titleBox.x = XtWidth(sw);
|
|
Packit |
b099d7 |
valueBox.x = titleBox.x;
|
|
Packit |
b099d7 |
labelBox.x = valueBox.x;
|
|
Packit |
b099d7 |
scrollBox.x = (XtWidth(sw) - ScrollWidth(sw)) / 2;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (diff_h >= 0)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
scrollBox.y = MajorLeadPad(sw);
|
|
Packit |
b099d7 |
scrollBox.height = ScrollHeight(sw);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Dimension sb_min, avail, lp, tp;
|
|
Packit |
b099d7 |
XmScrollBarWidget sb = (XmScrollBarWidget)
|
|
Packit |
b099d7 |
(sw->composite.children[1]);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
sb_min = (2 * sb->primitive.highlight_thickness)
|
|
Packit |
b099d7 |
+ (4 * sb->primitive.shadow_thickness)
|
|
Packit |
b099d7 |
+ SLIDER_SIZE( sw);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
lp = MajorLeadPad(sw);
|
|
Packit |
b099d7 |
tp = MajorTrailPad(sw);
|
|
Packit |
b099d7 |
avail = XtHeight(sw) - lp - tp;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (avail < sb_min)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
scrollBox.height = sb_min;
|
|
Packit |
b099d7 |
scrollBox.y = (XtHeight(sw) - sb_min) / 2;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
scrollBox.height = avail;
|
|
Packit |
b099d7 |
scrollBox.y = lp;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (instigator != sw->composite.children[0])
|
|
Packit |
b099d7 |
XmeConfigureObject(sw->composite.children[0],
|
|
Packit |
b099d7 |
titleBox.x, 0,
|
|
Packit |
b099d7 |
(sw->composite.children[0])->core.width,
|
|
Packit |
b099d7 |
(sw->composite.children[0])->core.height,
|
|
Packit |
b099d7 |
(sw->composite.children[0])->core.border_width);
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
sw->composite.children[0]->core.x = titleBox.x ;
|
|
Packit |
b099d7 |
sw->composite.children[0]->core.y = 0 ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (instigator != sw->composite.children[1])
|
|
Packit |
b099d7 |
XmeConfigureObject(sw->composite.children[1],
|
|
Packit |
b099d7 |
scrollBox.x, scrollBox.y,
|
|
Packit |
b099d7 |
scrollBox.width, scrollBox.height, 0);
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
sw->composite.children[1]->core.x = scrollBox.x ;
|
|
Packit |
b099d7 |
sw->composite.children[1]->core.y = scrollBox.y ;
|
|
Packit |
b099d7 |
sw->composite.children[1]->core.width = scrollBox.width ;
|
|
Packit |
b099d7 |
sw->composite.children[1]->core.height = scrollBox.height ;
|
|
Packit |
b099d7 |
sw->composite.children[1]->core.border_width = 0 ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
SetScrollBarData(sw);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
LayoutVerticalLabels(sw, &scrollBox, &labelBox, instigator);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
GetValueString(
|
|
Packit |
b099d7 |
XmScaleWidget sw,
|
|
Packit |
b099d7 |
int value,
|
|
Packit |
b099d7 |
String buffer)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
register int i;
|
|
Packit |
b099d7 |
int diff, dec_point_size;
|
|
Packit |
b099d7 |
struct lconv *loc_values;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (sw->scale.decimal_points > 0) {
|
|
Packit |
b099d7 |
/* Add one to decimal points to get leading zero, since
|
|
Packit |
b099d7 |
only US sometimes skips this zero, not other countries */
|
|
Packit |
b099d7 |
sprintf (buffer,"%.*d", sw->scale.decimal_points+1, value);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
diff = strlen(buffer) - sw->scale.decimal_points;
|
|
Packit |
b099d7 |
loc_values = localeconv();
|
|
Packit |
b099d7 |
dec_point_size = strlen(loc_values->decimal_point);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (i = strlen(buffer); i >= diff; i--)
|
|
Packit |
b099d7 |
buffer[i+dec_point_size] = buffer[i];
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (i=0; i
|
|
Packit |
b099d7 |
buffer[diff+i] = loc_values->decimal_point[i];
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
} else
|
|
Packit |
b099d7 |
sprintf (buffer,"%d", value);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* ShowValue
|
|
Packit |
b099d7 |
* Display or erase the slider value.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
ShowValue(
|
|
Packit |
b099d7 |
XmScaleWidget sw)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
#if USE_XFT
|
|
Packit |
b099d7 |
Dimension x, y, width, height;
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
int x, y, width, height;
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
XCharStruct width_return;
|
|
Packit |
b099d7 |
char buffer[256];
|
|
Packit |
b099d7 |
int direction, descent;
|
|
Packit |
b099d7 |
XmScrollBarWidget scrollbar;
|
|
Packit |
b099d7 |
Region value_region = sw->scale.value_region;
|
|
Packit |
b099d7 |
XRectangle value_rect;
|
|
Packit |
b099d7 |
XmString tmp_str;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!XtIsRealized((Widget)sw)) return;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
x = sw->scale.show_value_x;
|
|
Packit |
b099d7 |
y = sw->scale.show_value_y;
|
|
Packit |
b099d7 |
width = sw->scale.show_value_width;
|
|
Packit |
b099d7 |
height = sw->scale.show_value_height;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!sw->scale.show_value) { /* turn off the value display */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (width) { /* We were displaying, so we must clear it */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XClearArea (XtDisplay (sw), XtWindow (sw), x, y, width,
|
|
Packit |
b099d7 |
height, FALSE);
|
|
Packit |
b099d7 |
value_rect.x = x;
|
|
Packit |
b099d7 |
value_rect.y = y;
|
|
Packit |
b099d7 |
value_rect.width = width;
|
|
Packit |
b099d7 |
value_rect.height = height;
|
|
Packit |
b099d7 |
XIntersectRegion(null_region, value_region, value_region);
|
|
Packit |
b099d7 |
XUnionRectWithRegion(&value_rect, value_region, value_region);
|
|
Packit |
b099d7 |
XmeRedisplayGadgets( (Widget) sw, NULL, value_region);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
sw->scale.show_value_width = 0;
|
|
Packit |
b099d7 |
return;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Time for the real work.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (width) {
|
|
Packit |
b099d7 |
/* Clear the old one */
|
|
Packit |
b099d7 |
value_rect.x = x;
|
|
Packit |
b099d7 |
value_rect.y = y;
|
|
Packit |
b099d7 |
value_rect.width = width;
|
|
Packit |
b099d7 |
value_rect.height = height;
|
|
Packit |
b099d7 |
XIntersectRegion(null_region, value_region, value_region);
|
|
Packit |
b099d7 |
XClearArea(XtDisplay(sw), XtWindow(sw), x, y, width, height, FALSE);
|
|
Packit |
b099d7 |
XUnionRectWithRegion(&value_rect, value_region, value_region);
|
|
Packit |
b099d7 |
XmeRedisplayGadgets( (Widget) sw, NULL, value_region);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Get a string representation of the new value */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
GetValueString(sw, sw->scale.value, buffer);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Calculate the x, y, width, and height of the string to display */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#if USE_XFT
|
|
Packit |
b099d7 |
XmStringExtent(sw->scale.font_list, tmp_str = XmStringCreateSimple(buffer),
|
|
Packit |
b099d7 |
&width, &height);
|
|
Packit |
b099d7 |
XmStringFree(tmp_str);
|
|
Packit |
b099d7 |
sw->scale.show_value_width = width;
|
|
Packit |
b099d7 |
sw->scale.show_value_height = height;
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
XTextExtents (sw->scale.font_struct, buffer, strlen(buffer),
|
|
Packit |
b099d7 |
&direction, &height, &descent, &width_return);
|
|
Packit |
b099d7 |
width = width_return.rbearing - width_return.lbearing;
|
|
Packit |
b099d7 |
sw->scale.show_value_width = width;
|
|
Packit |
b099d7 |
sw->scale.show_value_height = height + descent;
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
scrollbar = (XmScrollBarWidget) sw->composite.children[1];
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (sw->scale.orientation == XmHORIZONTAL) {
|
|
Packit |
b099d7 |
#if USE_XFT
|
|
Packit |
b099d7 |
#ifdef FIX_1528
|
|
Packit |
b099d7 |
x = scrollbar->core.x
|
|
Packit |
b099d7 |
+ scrollbar->scrollBar.slider_x
|
|
Packit |
b099d7 |
+ ((sw->scale.sliding_mode)?
|
|
Packit |
b099d7 |
scrollbar->scrollBar.slider_width: 0)
|
|
Packit |
b099d7 |
- (width - SLIDER_SIZE( sw)) / 2;
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
x = scrollbar->core.x
|
|
Packit |
b099d7 |
+ scrollbar->scrollBar.slider_x
|
|
Packit |
b099d7 |
+ scrollbar->scrollBar.slider_width / 2
|
|
Packit |
b099d7 |
- width / 2;
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
if (sw->scale.show_value == XmNEAR_BORDER)
|
|
Packit |
b099d7 |
/*tmp: should store the max */
|
|
Packit |
b099d7 |
y = scrollbar->core.y - MaxLabelHeight(sw) - height - 3;
|
|
Packit |
b099d7 |
else /* NEAR_SLIDER or NONE */
|
|
Packit |
b099d7 |
y = scrollbar->core.y - height - 3;
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
x = scrollbar->core.x
|
|
Packit |
b099d7 |
+ scrollbar->scrollBar.slider_x
|
|
Packit |
b099d7 |
+ ((sw->scale.sliding_mode)?
|
|
Packit |
b099d7 |
scrollbar->scrollBar.slider_width: 0)
|
|
Packit |
b099d7 |
- (width_return.rbearing - SLIDER_SIZE( sw)) / 2;
|
|
Packit |
b099d7 |
if (sw->scale.show_value == XmNEAR_BORDER)
|
|
Packit |
b099d7 |
/*tmp: should store the max */
|
|
Packit |
b099d7 |
y = scrollbar->core.y - MaxLabelHeight(sw) - 3;
|
|
Packit |
b099d7 |
else /* NEAR_SLIDER or NONE */
|
|
Packit |
b099d7 |
y = scrollbar->core.y - 3;
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
if (sw->scale.show_value == XmNEAR_BORDER) {
|
|
Packit |
b099d7 |
if (LayoutIsRtoLM(sw))
|
|
Packit |
b099d7 |
x = scrollbar->core.x + scrollbar->core.width +
|
|
Packit |
b099d7 |
MaxLabelWidth(sw);
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
#if USE_XFT
|
|
Packit |
b099d7 |
x = scrollbar->core.x - MaxLabelWidth(sw) -
|
|
Packit |
b099d7 |
sw->scale.show_value_width - SCALE_VALUE_MARGIN;
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
x = scrollbar->core.x - MaxLabelWidth(sw) -
|
|
Packit |
b099d7 |
width_return.rbearing - SCALE_VALUE_MARGIN;
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
} else { /* NEAR_SLIDER or NONE */
|
|
Packit |
b099d7 |
if (LayoutIsRtoLM(sw))
|
|
Packit |
b099d7 |
x = scrollbar->core.x + scrollbar->core.width;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
#ifdef FIX_1528
|
|
Packit |
b099d7 |
#if USE_XFT
|
|
Packit |
b099d7 |
x = scrollbar->core.x - sw->scale.show_value_width - SCALE_VALUE_MARGIN;
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
x = scrollbar->core.x - width_return.rbearing - SCALE_VALUE_MARGIN;
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
#if USE_XFT
|
|
Packit |
b099d7 |
x = scrollbar->core.x - sw->scale.show_value_width;
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
x = scrollbar->core.x - width_return.rbearing;
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
#if USE_XFT
|
|
Packit |
b099d7 |
y = scrollbar->core.y + scrollbar->scrollBar.slider_y
|
|
Packit |
b099d7 |
+ SLIDER_SIZE(sw)/2 - height/2;
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
y = scrollbar->core.y + scrollbar->scrollBar.slider_y
|
|
Packit |
b099d7 |
+ SLIDER_SIZE(sw) + ((height - SLIDER_SIZE( sw)) / 2) - 3;
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#if USE_XFT
|
|
Packit |
b099d7 |
sw->scale.show_value_x = x;
|
|
Packit |
b099d7 |
sw->scale.show_value_y = y + 1;
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
sw->scale.show_value_x = x + width_return.lbearing;
|
|
Packit |
b099d7 |
sw->scale.show_value_y = y - height + 1;
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Display the string */
|
|
Packit |
b099d7 |
XSetClipMask(XtDisplay(sw), sw->scale.foreground_GC, None);
|
|
Packit |
b099d7 |
#if USE_XFT
|
|
Packit |
b099d7 |
XmStringDraw(XtDisplay(sw), XtWindow(sw), sw->scale.font_list,
|
|
Packit |
b099d7 |
tmp_str = XmStringCreateSimple(buffer),
|
|
Packit |
b099d7 |
sw->scale.foreground_GC,
|
|
Packit |
b099d7 |
x, y, width, XmALIGNMENT_CENTER,
|
|
Packit |
b099d7 |
sw->manager.string_direction,
|
|
Packit |
b099d7 |
NULL);
|
|
Packit |
b099d7 |
XmStringFree(tmp_str);
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
XDrawImageString (XtDisplay(sw), XtWindow(sw),
|
|
Packit |
b099d7 |
sw->scale.foreground_GC, x, y, buffer, strlen(buffer));
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*********************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* CalcScrollBarData
|
|
Packit |
b099d7 |
* Figure out the scale derived attributes of the scrollbar child.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*********************************************************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
CalcScrollBarData(
|
|
Packit |
b099d7 |
XmScaleWidget sw,
|
|
Packit |
b099d7 |
int *pvalue,
|
|
Packit |
b099d7 |
int *pslider_size,
|
|
Packit |
b099d7 |
int *pincrement,
|
|
Packit |
b099d7 |
int *ppage )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int slider_size, increment, page, value ;
|
|
Packit |
b099d7 |
Dimension scrollbar_size;
|
|
Packit |
b099d7 |
float sb_value, tmp;
|
|
Packit |
b099d7 |
XmScrollBarWidget scrollbar =
|
|
Packit |
b099d7 |
(XmScrollBarWidget) sw->composite.children[1];
|
|
Packit |
b099d7 |
register int ht = scrollbar->primitive.highlight_thickness;
|
|
Packit |
b099d7 |
register int st = scrollbar->primitive.shadow_thickness;
|
|
Packit |
b099d7 |
int size;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Adjust the slider size to take SLIDER_SIZE area. */
|
|
Packit |
b099d7 |
/* Adjust value to be in the bounds of the scrollbar. */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (scrollbar->scrollBar.orientation == XmHORIZONTAL)
|
|
Packit |
b099d7 |
scrollbar_size = scrollbar->scrollBar.slider_area_width + 2 *(ht +st);
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
scrollbar_size = scrollbar->scrollBar.slider_area_height + 2 *(ht +st);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
size = scrollbar_size - 2 * (sw->scale.highlight_thickness
|
|
Packit |
b099d7 |
+ sw->manager.shadow_thickness) ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* prevent divide by zero error and integer rollover */
|
|
Packit |
b099d7 |
if (size <= 0)
|
|
Packit |
b099d7 |
scrollbar_size = 1;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
/* this looks suspicious to me, but it is bc to let it in */
|
|
Packit |
b099d7 |
scrollbar_size -= 2 * (sw->scale.highlight_thickness
|
|
Packit |
b099d7 |
+ sw->manager.shadow_thickness);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
slider_size = (SCROLLBAR_MAX / scrollbar_size) * SLIDER_SIZE( sw);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Now error check our arithmetic
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
if (slider_size < 0)
|
|
Packit |
b099d7 |
slider_size = SCROLLBAR_MAX;
|
|
Packit |
b099d7 |
else if (slider_size < 1)
|
|
Packit |
b099d7 |
slider_size = 1;
|
|
Packit |
b099d7 |
else if (slider_size > SCROLLBAR_MAX)
|
|
Packit |
b099d7 |
slider_size = SCROLLBAR_MAX;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
sb_value = (float) (sw->scale.value - sw->scale.minimum) /
|
|
Packit |
b099d7 |
(float) (sw->scale.maximum - sw->scale.minimum);
|
|
Packit |
b099d7 |
sb_value = sb_value * (float) (SCROLLBAR_MAX - slider_size);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
value = (int) sb_value;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
ASSIGN_MIN(value, SCROLLBAR_MAX - slider_size);
|
|
Packit |
b099d7 |
ASSIGN_MAX(value, 0);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Set up the increment processing correctly */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
tmp = (float) SCROLLBAR_MAX - (float) slider_size;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
increment = (int) ((tmp /
|
|
Packit |
b099d7 |
(float) (sw->scale.maximum - sw->scale.minimum)) + 0.5);
|
|
Packit |
b099d7 |
ASSIGN_MAX(increment, 1);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
page = sw->scale.scale_multiple * (increment);
|
|
Packit |
b099d7 |
ASSIGN_MAX(page, 1);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
*pvalue = value ;
|
|
Packit |
b099d7 |
*pslider_size = slider_size ;
|
|
Packit |
b099d7 |
*pincrement = increment ;
|
|
Packit |
b099d7 |
*ppage = page ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*********************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* SetScrollBarData
|
|
Packit |
b099d7 |
* Call CalcScrollBarData and do a setvalues on the SB.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*********************************************************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
SetScrollBarData(
|
|
Packit |
b099d7 |
XmScaleWidget sw)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int slider_size, increment, page, value ;
|
|
Packit |
b099d7 |
Arg args[5] ;
|
|
Packit |
b099d7 |
Cardinal n = 0 ;
|
|
Packit |
b099d7 |
XmScrollBarWidget scrollbar =
|
|
Packit |
b099d7 |
(XmScrollBarWidget) sw->composite.children[1];
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
CalcScrollBarData(sw, &value, &slider_size, &increment, &page);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
SET(XmNvalue, value);
|
|
Packit |
b099d7 |
SET(XmNsliderSize, slider_size);
|
|
Packit |
b099d7 |
SET(XmNincrement, increment);
|
|
Packit |
b099d7 |
SET(XmNpageIncrement, page);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XtSetValues ((Widget)scrollbar, args, n);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*********************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* ValueChanged
|
|
Packit |
b099d7 |
* Callback procedure invoked from the scrollbars value being changed.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*********************************************************************/
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
ValueChanged(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
XtPointer closure, /* unused */
|
|
Packit |
b099d7 |
XtPointer call_data )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmScaleWidget sw = (XmScaleWidget) XtParent (wid);
|
|
Packit |
b099d7 |
XmScrollBarCallbackStruct * scroll_callback =
|
|
Packit |
b099d7 |
(XmScrollBarCallbackStruct *) call_data;
|
|
Packit |
b099d7 |
XmScaleCallbackStruct scale_callback;
|
|
Packit |
b099d7 |
float sb_value;
|
|
Packit |
b099d7 |
XmScrollBarWidget sb = (XmScrollBarWidget)(sw->composite.children[1]);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
sb_value = (float) scroll_callback->value
|
|
Packit |
b099d7 |
/ (float) (SCROLLBAR_MAX - sb->scrollBar.slider_size);
|
|
Packit |
b099d7 |
sb_value = (sb_value * (float) (sw->scale.maximum - sw->scale.minimum))
|
|
Packit |
b099d7 |
+ (float) sw->scale.minimum;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Set up the round off correctly */
|
|
Packit |
b099d7 |
if (sb_value < 0.0) sb_value -= 0.5;
|
|
Packit |
b099d7 |
else if (sb_value > 0.0) sb_value += 0.5;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
sw->scale.value = (int) sb_value;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
ShowValue (sw);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
scale_callback.event = scroll_callback->event;
|
|
Packit |
b099d7 |
scale_callback.reason = scroll_callback->reason;
|
|
Packit |
b099d7 |
scale_callback.value = sw->scale.value;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (scale_callback.reason == XmCR_DRAG)
|
|
Packit |
b099d7 |
XtCallCallbackList((Widget) sw, sw->scale.drag_callback,
|
|
Packit |
b099d7 |
&scale_callback);
|
|
Packit |
b099d7 |
else /* value changed and to_top and to_bottom */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
scale_callback.reason = XmCR_VALUE_CHANGED;
|
|
Packit |
b099d7 |
XtCallCallbackList((Widget) sw,
|
|
Packit |
b099d7 |
sw->scale.value_changed_callback,
|
|
Packit |
b099d7 |
&scale_callback);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* StartDrag:
|
|
Packit |
b099d7 |
* This routine is performed by the initiator when a drag starts
|
|
Packit |
b099d7 |
* (in this case, when mouse button 2 was pressed). It starts
|
|
Packit |
b099d7 |
* the drag processing, and establishes a drag context
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
StartDrag (Widget w,
|
|
Packit |
b099d7 |
XtPointer data, /* unused */
|
|
Packit |
b099d7 |
XEvent *event,
|
|
Packit |
b099d7 |
Boolean *cont) /* unused */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Widget drag_icon;
|
|
Packit |
b099d7 |
Arg args[10];
|
|
Packit |
b099d7 |
Cardinal n;
|
|
Packit |
b099d7 |
XmScaleWidget sw = (XmScaleWidget) w ;
|
|
Packit |
b099d7 |
XmDisplay dpy = (XmDisplay) XmGetXmDisplay(XtDisplay(w));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* CDE - allow user to not drag labels and label subclasses
|
|
Packit |
b099d7 |
also, disable drag if enable_btn1_transfer is set to
|
|
Packit |
b099d7 |
BUTTON2_ADJUST and the trigger was button2 */
|
|
Packit |
b099d7 |
if (! dpy -> display.enable_unselectable_drag ||
|
|
Packit |
b099d7 |
(dpy -> display.enable_btn1_transfer == XmBUTTON2_ADJUST &&
|
|
Packit |
b099d7 |
event && event -> xany.type == ButtonPress &&
|
|
Packit |
b099d7 |
event -> xbutton.button == 2)) return;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* first check that the click is OK: button 2 and in the value label */
|
|
Packit |
b099d7 |
if ((!sw->scale.show_value) ||
|
|
Packit |
b099d7 |
(event->xbutton.button != Button2) ||
|
|
Packit |
b099d7 |
((event->xbutton.x < sw->scale.show_value_x) ||
|
|
Packit |
b099d7 |
(event->xbutton.y < sw->scale.show_value_y) ||
|
|
Packit |
b099d7 |
(event->xbutton.x > sw->scale.show_value_x +
|
|
Packit |
b099d7 |
sw->scale.show_value_width) ||
|
|
Packit |
b099d7 |
(event->xbutton.y > sw->scale.show_value_y +
|
|
Packit |
b099d7 |
sw->scale.show_value_height))) return ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
drag_icon = XmeGetTextualDragIcon(w);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
n = 0;
|
|
Packit |
b099d7 |
XtSetArg(args[n], XmNcursorBackground, sw->core.background_pixel); n++;
|
|
Packit |
b099d7 |
XtSetArg(args[n], XmNcursorForeground, sw->manager.foreground); n++;
|
|
Packit |
b099d7 |
XtSetArg(args[n], XmNsourceCursorIcon, drag_icon); n++;
|
|
Packit |
b099d7 |
XtSetArg(args[n], XmNdragOperations, XmDROP_COPY); n++ ;
|
|
Packit |
b099d7 |
(void) XmeDragSource(w, NULL, event, args, n);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* DragConvertProc:
|
|
Packit |
b099d7 |
* This routine returns the value of the scale,
|
|
Packit |
b099d7 |
* converted into compound text.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
DragConvertCallback (Widget w,
|
|
Packit |
b099d7 |
XtPointer client_data, /* unused */
|
|
Packit |
b099d7 |
XmConvertCallbackStruct *cs)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
enum { XmACOMPOUND_TEXT, XmATARGETS, XmA_MOTIF_EXPORT_TARGETS,
|
|
Packit |
b099d7 |
XmA_MOTIF_CLIPBOARD_TARGETS, XmAUTF8_STRING, NUM_ATOMS };
|
|
Packit |
b099d7 |
static char *atom_names[] = {
|
|
Packit |
b099d7 |
XmSCOMPOUND_TEXT, XmSTARGETS, XmS_MOTIF_EXPORT_TARGETS,
|
|
Packit |
b099d7 |
XmS_MOTIF_CLIPBOARD_TARGETS, XmSUTF8_STRING };
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
char tmpstring[100];
|
|
Packit |
b099d7 |
char *strlist;
|
|
Packit |
b099d7 |
char *passtext;
|
|
Packit |
b099d7 |
XmScaleWidget sw = (XmScaleWidget) w;
|
|
Packit |
b099d7 |
Atom atoms[XtNumber(atom_names)];
|
|
Packit |
b099d7 |
XTextProperty tp;
|
|
Packit |
b099d7 |
Atom type = None ;
|
|
Packit |
b099d7 |
XtPointer value = NULL ;
|
|
Packit |
b099d7 |
unsigned long size = 0 ;
|
|
Packit |
b099d7 |
int format = 8 ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
assert(XtNumber(atom_names) == NUM_ATOMS);
|
|
Packit |
b099d7 |
XInternAtoms(XtDisplay(w), atom_names, XtNumber(atom_names), False, atoms);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Begin fixing the bug OSF 4846 */
|
|
Packit |
b099d7 |
/* get the value of the scale and convert it to compound text */
|
|
Packit |
b099d7 |
GetValueString(sw, sw->scale.value, tmpstring);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (cs -> target == atoms[XmATARGETS] ||
|
|
Packit |
b099d7 |
cs -> target == atoms[XmA_MOTIF_EXPORT_TARGETS] ||
|
|
Packit |
b099d7 |
cs -> target == atoms[XmA_MOTIF_CLIPBOARD_TARGETS]) {
|
|
Packit |
b099d7 |
int count = 0;
|
|
Packit |
b099d7 |
Atom *targs;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (cs -> target == atoms[XmATARGETS])
|
|
Packit |
b099d7 |
targs = XmeStandardTargets(w, 3, &count);
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
targs = (Atom *) XtMalloc(sizeof(Atom) * 3);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
value = (XtPointer) targs;
|
|
Packit |
b099d7 |
targs[count] = XA_STRING; count++;
|
|
Packit |
b099d7 |
targs[count] = atoms[XmACOMPOUND_TEXT]; count++;
|
|
Packit |
b099d7 |
targs[count] = atoms[XmAUTF8_STRING]; count++;
|
|
Packit |
b099d7 |
size = count;
|
|
Packit |
b099d7 |
type = XA_ATOM;
|
|
Packit |
b099d7 |
format = 32;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (cs -> target == XA_STRING ||
|
|
Packit |
b099d7 |
cs -> target == atoms[XmAUTF8_STRING]) {
|
|
Packit |
b099d7 |
/* handle plain STRING and UTF8_STRING first */
|
|
Packit |
b099d7 |
type = cs -> target;
|
|
Packit |
b099d7 |
value = (XtPointer) XtNewString(tmpstring);
|
|
Packit |
b099d7 |
size = strlen((char*) value);
|
|
Packit |
b099d7 |
format = 8;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* this routine processes only compound text now */
|
|
Packit |
b099d7 |
if (cs -> target == atoms[XmACOMPOUND_TEXT]) {
|
|
Packit |
b099d7 |
strlist = tmpstring;
|
|
Packit |
b099d7 |
tp.value = NULL;
|
|
Packit |
b099d7 |
XmbTextListToTextProperty(XtDisplay(w), &strlist, 1,
|
|
Packit |
b099d7 |
XCompoundTextStyle, &tp);
|
|
Packit |
b099d7 |
passtext = XtNewString((char*)tp.value);
|
|
Packit |
b099d7 |
XtFree((char*)tp.value);
|
|
Packit |
b099d7 |
/* End fixing the bug OSF 4846 */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* format the value for transfer. convert the value from
|
|
Packit |
b099d7 |
* compound string to compound text for the transfer */
|
|
Packit |
b099d7 |
type = atoms[XmACOMPOUND_TEXT];
|
|
Packit |
b099d7 |
value = (XtPointer) passtext;
|
|
Packit |
b099d7 |
size = strlen(passtext);
|
|
Packit |
b099d7 |
format = 8;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmConvertComplete(w, value, size, format, type, cs);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* WidgetNavigable class method
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
static XmNavigability
|
|
Packit |
b099d7 |
WidgetNavigable(
|
|
Packit |
b099d7 |
Widget wid)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if( XtIsSensitive(wid)
|
|
Packit |
b099d7 |
&& ((XmManagerWidget) wid)->manager.traversal_on )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNavigationType nav_type
|
|
Packit |
b099d7 |
= ((XmManagerWidget) wid)->manager.navigation_type ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if( (nav_type == XmSTICKY_TAB_GROUP)
|
|
Packit |
b099d7 |
|| (nav_type == XmEXCLUSIVE_TAB_GROUP)
|
|
Packit |
b099d7 |
|| ( (nav_type == XmTAB_GROUP)
|
|
Packit |
b099d7 |
&& !_XmShellIsExclusive( wid)) )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
return XmDESCENDANTS_TAB_NAVIGABLE ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
return XmNOT_NAVIGABLE ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* External API functions.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* XmScaleSetValue
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
XmScaleSetValue(
|
|
Packit |
b099d7 |
Widget w,
|
|
Packit |
b099d7 |
int value )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmScaleWidget sw = (XmScaleWidget) w;
|
|
Packit |
b099d7 |
XtAppContext app = XtWidgetToApplicationContext(w);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (value < sw->scale.minimum) {
|
|
Packit |
b099d7 |
XmeWarning( (Widget) sw, MESSAGE2);
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
return ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (value > sw->scale.maximum) {
|
|
Packit |
b099d7 |
XmeWarning( (Widget) sw, MESSAGE3);
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
return ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
sw->scale.value = value ;
|
|
Packit |
b099d7 |
SetScrollBarData(sw);
|
|
Packit |
b099d7 |
ShowValue(sw);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* XmScaleGetValue
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
XmScaleGetValue(
|
|
Packit |
b099d7 |
Widget w,
|
|
Packit |
b099d7 |
int *value )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmScaleWidget sw = (XmScaleWidget) w;
|
|
Packit |
b099d7 |
XtAppContext app = XtWidgetToApplicationContext(w);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
*value = sw->scale.value;
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* XmCreateScale
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
Widget
|
|
Packit |
b099d7 |
XmCreateScale(
|
|
Packit |
b099d7 |
Widget parent,
|
|
Packit |
b099d7 |
char *name,
|
|
Packit |
b099d7 |
ArgList arglist,
|
|
Packit |
b099d7 |
Cardinal argcount )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
return (XtCreateWidget(name, xmScaleWidgetClass,
|
|
Packit |
b099d7 |
parent, arglist, argcount));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Widget
|
|
Packit |
b099d7 |
XmVaCreateScale(
|
|
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 |
xmScaleWidgetClass,
|
|
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 |
XmVaCreateManagedScale(
|
|
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 |
xmScaleWidgetClass,
|
|
Packit |
b099d7 |
parent, True,
|
|
Packit |
b099d7 |
var, count);
|
|
Packit |
b099d7 |
va_end(var);
|
|
Packit |
b099d7 |
return w;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|