Blame lib/Xm/Scale.c

Packit b099d7
/* 
Packit b099d7
 * Motif
Packit b099d7
 *
Packit b099d7
 * Copyright (c) 1987-2012, The Open Group. All rights reserved.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are free software; you can
Packit b099d7
 * redistribute them and/or modify them under the terms of the GNU
Packit b099d7
 * Lesser General Public License as published by the Free Software
Packit b099d7
 * Foundation; either version 2 of the License, or (at your option)
Packit b099d7
 * any later version.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are distributed in the hope that
Packit b099d7
 * they will be useful, but WITHOUT ANY WARRANTY; without even the
Packit b099d7
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
Packit b099d7
 * PURPOSE. See the GNU Lesser General Public License for more
Packit b099d7
 * details.
Packit b099d7
 *
Packit b099d7
 * You should have received a copy of the GNU Lesser General Public
Packit b099d7
 * License along with these librararies and programs; if not, write
Packit b099d7
 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
Packit b099d7
 * Floor, Boston, MA 02110-1301 USA
Packit b099d7
 */ 
Packit b099d7
/* 
Packit b099d7
 * HISTORY
Packit b099d7
*/ 
Packit b099d7
#ifdef REV_INFO
Packit b099d7
#ifndef lint
Packit b099d7
static char rcsid[] = "$TOG: 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
}