Hi,

With LessTif 0.92.32 compiled from source on a Red Hat 6.2 system
(x86), changing an XmScale widget's XmNscaleMultiple resource did
not change the widget's behavior (for instance, clicking with the
left button to the right of the handle would increment the value by
the old increment rather than the new one).  Attachment 1 is patch
to fix this and attachment 2 is a test case for the problem.

Eric Branlund
[EMAIL PROTECTED]
--- Scale.c     Thu Sep 20 13:33:35 2001
+++ Scale.c.new Thu Sep 20 13:40:26 2001
@@ -115,6 +115,9 @@
 static int _XmScaleConvertWidthToSliderSize(Widget w);
 static int _XmScaleConvertSCBValueToScaleValue(Widget w, int value);
 static int _XmScaleConvertScaleValueToSCBValue(Widget w);
+static void _XmScaleConvertScaleIncrementToSCBIncrements(Widget w,
+                                                        int* inc,
+                                                        int* page_inc);
 static void _ScaleValueChanged(Widget sb, XtPointer cd, XtPointer data);
 static void _ScaleDrag(Widget sb, XtPointer cd, XtPointer data);
 static void computeValueSize(Widget w);
@@ -604,7 +607,7 @@
           ArgList args, Cardinal *num_args)
 {
     Boolean refresh = False;
-    Arg argl[6];
+    Arg argl[8];
     int argc;
     Widget sb, lab;
     int resize = False;
@@ -676,6 +679,7 @@
        Scale_Value(new_w) != Scale_Value(old))
     {
        int newval;
+       int inc, page_inc;
 
        argc = 0;
        XtSetArg(argl[argc], XmNorientation, Scale_Orientation(new_w)); argc++;
@@ -685,6 +689,11 @@
        newval = _XmScaleConvertScaleValueToSCBValue(new_w);
 
        XtSetArg(argl[argc], XmNvalue, newval); argc++;
+
+       _XmScaleConvertScaleIncrementToSCBIncrements(new_w, &inc, &page_inc);
+
+       XtSetArg(argl[argc], XmNincrement, inc); argc++;
+       XtSetArg(argl[argc], XmNpageIncrement, page_inc); argc++;
        XtSetArg(argl[argc], XmNshadowThickness,
                 Scale_ShadowThickness(new_w)); argc++;
        XtSetArg(argl[argc], XmNhighlightThickness,
@@ -1918,11 +1927,7 @@
     _XmSetKidGeo(boxes, child);
 
     Scale_SliderSize(scale) = _XmScaleConvertWidthToSliderSize(scale);
-    inc = (int)((double)(SCB_MAX - SCB_MIN - Scale_SliderSize(scale)) /
-               (double)(Scale_Maximum(scale) - Scale_Minimum(scale)) +
-               0.5);
-    inc = _XmMax(inc, 1);      /* FIX ME */
-    p_inc = inc * Scale_ScaleMultiple(scale);
+    _XmScaleConvertScaleIncrementToSCBIncrements(scale, &inc, &p_inc);
 
     XmScrollBarSetValues(boxes[CHILD_SB].kid,
                         _XmScaleConvertScaleValueToSCBValue(scale),
@@ -2247,6 +2252,18 @@
              looks like the old one in _XmScaleConvertSCBValueToScaleValue() */
     result = (int)(roundarg);
     return result;
+}
+
+
+static void _XmScaleConvertScaleIncrementToSCBIncrements(Widget w,
+                                                        int* inc,
+                                                        int* page_inc)
+{
+    *inc = (int)((double)(SCB_MAX - SCB_MIN - Scale_SliderSize(w)) /
+                (double)(Scale_Maximum(w) - Scale_Minimum(w)) +
+                0.5);
+    *inc = _XmMax(*inc, 1);    /* FIX ME */
+    *page_inc = *inc * Scale_ScaleMultiple(w);
 }
 
 
#include <stdlib.h>
#include <stdio.h>
#include <Xm/Xm.h>
#include <Xm/Scale.h>
#include <X11/keysym.h>

void dragCallback(Widget w, XtPointer clientData, XtPointer callData)
{
    XmScaleCallbackStruct *cbs = (XmScaleCallbackStruct *)callData;

    printf ("dragCallback: %d\n", cbs->value);
}

void valueChangedCallback(Widget w, XtPointer clientData, XtPointer callData)
{
    XmScaleCallbackStruct *cbs = (XmScaleCallbackStruct *)callData;

    printf ("valueChangedCallback: %d\n", cbs->value);    
}


int
main(int argc, char *argv[])
{
  Widget toplevel, one;
  XtAppContext app;
  int value;

  XtSetLanguageProc(NULL, NULL, NULL);

  toplevel = XtVaAppInitialize(&app, "Scale", NULL, 0, &argc, argv, NULL, NULL);

  one = XtVaCreateManagedWidget("sb", xmScaleWidgetClass, toplevel, 
                                XmNorientation, XmHORIZONTAL, 
                                XmNscaleWidth, 100, NULL);

  XtAddCallback(one, XmNdragCallback, dragCallback, NULL);
  XtAddCallback(one, XmNvalueChangedCallback, valueChangedCallback, NULL);

  XtRealizeWidget(toplevel);
  XtVaSetValues(one, XmNscaleMultiple, 2, NULL);
  LessTifTestWaitForIt(toplevel);

  LessTifTestKeyPress(one, XK_Right, ControlMask);
  XtVaGetValues(one, XmNvalue, &value, NULL);
  exit((value == 2) ? 0 : 1);
}

Reply via email to