[Search for users] [Overall Top Noters] [List of all Conferences] [Download this site]

Conference noted::motif

Title:"OSF/Motif" is a trademark
Notice:MOTIF kit note in 7.*
Moderator:GOOEY::GRASS
Created:Mon Aug 07 1989
Last Modified:Thu Jun 05 1997
Last Successful Update:Fri Jun 06 1997
Number of topics:5973
Total number of notes:24620

5972.0. "Setting Scale insensitive in callback goes crazy!" by TAV02::AMIT (Amit Margalit) Thu Jun 05 1997 05:58

Hello!

I have a customer who is writing an application using XmScale. He notified me
that if I use XtSetSensitive(scale,False) from within the XmScale's 
ValueChanged callback, then after you click on the open area (where the
slider can slide to) the slider will jump again and again until it reaches
the edge in that direction, and stay there. He claims that if you separate
your XtAppMainLoop() into a next-event/dispatch-event pair, then you see
that many more event are coming, and keep coming.

The customer is writing this in ADA on OpenVMS, but I have been able to
reproduce this in C on Digital Unix.

Following notes are a program I took from somewhere and modified to show
the problem. Another note is the app-defaults file for that program.

Any help would be appreciated.

	Thanks,

		Amit Margalit
		Software Support
		Digital Israel
T.RTitleUserPersonal
Name
DateLines
5972.1lab01.cTAV02::AMITAmit MargalitThu Jun 05 1997 05:59308
/*
 * OSF/Motif Widgets Class  LAB01 
 *
 * This program does nothing except create a user interface comprised of
 * a moderately complex hierarchy of widgets.  It provides an example
 * with which to practice setting resources.
 *
 */

#include <Xm/Form.h>
#include <Xm/PushB.h>
#include <Xm/DrawingA.h>
#include <Xm/Scale.h>

#include <stdio.h>

#define  EXIT   5
#define  MOVESLIDER   1
#define  CHANGELIMITS 0
#define  BORDERSIZE   5
#define  PRIM_HEIGHT  33

Widget toplevel, colors, colors_child[5], printer, painter, myscale;
Widget tones_pb[2], rainbow_pb[6], printer_pb[3], painter_pb[3];

int newmax[] = {18000, 7000, 12000};
int newmin[] = {500, 4000, 2000};
static int newlimit = 0;
#define  MAXLIM  3

int newval[] = {6696, 5000, 4567};
static int newval_ptr = 0;
#define  MAXVAL  3

/*
 * goodbye() - exit the application.
 */
void goodbye(w, client_data, call_data)
Widget w;
caddr_t client_data;
caddr_t call_data;
{
   exit(0);
}

void MoveSlider(w, client_data, call_data)
Widget w;
caddr_t client_data;
caddr_t call_data;
{
   newval_ptr++; if (newval_ptr == MAXVAL) newval_ptr = 0;
   XmScaleSetValue(colors_child[4], newval[newval_ptr]);
}

void ChangeLimits(w, client_data, call_data)
Widget w;
caddr_t client_data;
caddr_t call_data;
{
   Arg myArgs[10];
   int i;

   newlimit++; if (newlimit == MAXLIM) newlimit = 0;

   i=0;
   XtSetArg(myArgs[i], XmNmaximum,   newmax[newlimit]); i++;
   XtSetArg(myArgs[i], XmNminimum,   newmin[newlimit]); i++;
   XtSetValues(colors_child[4], myArgs, i);
}

void ValueChanged(w, client_data, call_data)
Widget w;
caddr_t client_data;
XmScaleCallbackStruct *call_data;
{
   printf("In Value Changed CALLBACK:\n");
   printf("==========================\n");
   if (call_data->reason == XmCR_VALUE_CHANGED)
        printf("Reason is VALUE CHANGED\n");
   if (call_data->reason == XmCR_DRAG)
        printf("Reason is DRAG\n");
   printf("New value is : %d\n",call_data->value);
/*   printf("Triggger event is : %d\n",call_data->event->type);*/

   XtSetSensitive(w,False);
}

void Drag(w, client_data, call_data)
Widget w;
caddr_t client_data;
XmScaleCallbackStruct *call_data;
{
   printf("In Drag CALLBACK:\n");
   printf("=================\n");
   if (call_data->reason == XmCR_VALUE_CHANGED)
        printf("Reason is VALUE CHANGED\n");
   if (call_data->reason == XmCR_DRAG)
        printf("Reason is DRAG\n");
   printf("New value is : %d\n",call_data->value);
/*   printf("Triggger event is : %d\n",call_data->event->type);*/
}


/***********************************************************************
 ***                             MAIN                                ***
 ***********************************************************************/
 main(argc, argv)
  unsigned int argc;
  char **argv;
{
   XtAppContext app_context;
   Display *display;
   XEvent myevent;
   int done=0,cnt=0;

   Arg myArgs[10];
   int i, n, leftPos, rightPos, topPos, bottomPos;
   static char * tones_name[] = {"black", "white"};
   static char * rainbow_name[] = {"red", "orange", "yellow", "green",
                                   "blue", "violet"};
   static char * printer_name[] = {"magenta", "yellow", "cyan"};
   static char * painter_name[] = {"red", "yellow", "blue"};

   static int rainbow_widths[] = {16, 17, 17, 17, 16, 16};
   static int tones_widths[] = {49, 50};
     
   XtToolkitInitialize();
   app_context = XtCreateApplicationContext();
   display = XtOpenDisplay(app_context,"","","Lab01",NULL,0,&argc,argv);
   toplevel=XtAppCreateShell("lab01","Lab01",applicationShellWidgetClass,
                              display,NULL,0);
   colors = XmCreateForm(toplevel, "colors", myArgs, 0);
   XtManageChild(colors);

   /*
    * 4 "main" widgets:  rainbow form, drawing area, primaries form
    *                    and tones form
    */
   i = 0;
   XtSetArg(myArgs[i], XmNleftAttachment,   XmATTACH_FORM);      i++;
   XtSetArg(myArgs[i], XmNtopAttachment,    XmATTACH_FORM);      i++;
   XtSetArg(myArgs[i], XmNrightAttachment,  XmATTACH_FORM);      i++;
   XtSetArg(myArgs[i], XmNbottomAttachment, XmATTACH_POSITION);  i++;
   XtSetArg(myArgs[i], XmNleftOffset,       BORDERSIZE);         i++;
   XtSetArg(myArgs[i], XmNtopOffset,        BORDERSIZE);         i++;
   XtSetArg(myArgs[i], XmNrightOffset,      BORDERSIZE);         i++;
   XtSetArg(myArgs[i], XmNbottomPosition,   15);                 i++;
   colors_child[0] = XmCreateForm(colors, "rainbow", myArgs, i);

   i = 0;
   XtSetArg(myArgs[i], XmNleftAttachment,   XmATTACH_FORM);      i++;
   XtSetArg(myArgs[i], XmNtopAttachment,    XmATTACH_POSITION);  i++;
   XtSetArg(myArgs[i], XmNrightAttachment,  XmATTACH_POSITION);  i++;
   XtSetArg(myArgs[i], XmNbottomAttachment, XmATTACH_POSITION);  i++;
   XtSetArg(myArgs[i], XmNleftOffset,       BORDERSIZE);         i++;
   XtSetArg(myArgs[i], XmNtopPosition,      36);                 i++;
   XtSetArg(myArgs[i], XmNrightPosition,    66);                 i++;
   XtSetArg(myArgs[i], XmNbottomPosition,   83);                 i++;
   colors_child[1] = XmCreateDrawingArea(colors, "draw", myArgs, i);

   i = 0;
   XtSetArg(myArgs[i], XmNleftAttachment,   XmATTACH_POSITION);  i++;
   XtSetArg(myArgs[i], XmNtopAttachment,    XmATTACH_POSITION);  i++;
   XtSetArg(myArgs[i], XmNrightAttachment,  XmATTACH_FORM);      i++;
   XtSetArg(myArgs[i], XmNbottomAttachment, XmATTACH_FORM);      i++;
   XtSetArg(myArgs[i], XmNleftPosition,     67);                 i++;
   XtSetArg(myArgs[i], XmNtopPosition,      16);                 i++;
   XtSetArg(myArgs[i], XmNrightOffset,      BORDERSIZE);         i++;
   XtSetArg(myArgs[i], XmNbottomOffset,     BORDERSIZE);         i++;
   colors_child[2] = XmCreateForm(colors, "primaries", myArgs, i);

   i = 0;
   XtSetArg(myArgs[i], XmNleftAttachment,   XmATTACH_FORM);      i++;
   XtSetArg(myArgs[i], XmNtopAttachment,    XmATTACH_POSITION);  i++;
   XtSetArg(myArgs[i], XmNrightAttachment,  XmATTACH_POSITION);  i++;
   XtSetArg(myArgs[i], XmNbottomAttachment, XmATTACH_FORM);      i++;
   XtSetArg(myArgs[i], XmNleftOffset,       BORDERSIZE);         i++;
   XtSetArg(myArgs[i], XmNtopPosition,      84);                 i++;
   XtSetArg(myArgs[i], XmNrightPosition,    66);                 i++;
   XtSetArg(myArgs[i], XmNbottomOffset,     BORDERSIZE);         i++;
   colors_child[3] = XmCreateForm(colors, "tones", myArgs, i);

   i = 0;
   XtSetArg(myArgs[i], XmNleftAttachment,   XmATTACH_FORM);      i++;
   XtSetArg(myArgs[i], XmNtopAttachment,    XmATTACH_POSITION);  i++;
   XtSetArg(myArgs[i], XmNrightAttachment,  XmATTACH_POSITION);  i++;
   XtSetArg(myArgs[i], XmNbottomAttachment, XmATTACH_POSITION);  i++;
   XtSetArg(myArgs[i], XmNleftOffset,       BORDERSIZE);         i++;
   XtSetArg(myArgs[i], XmNtopPosition,      16);                 i++;
   XtSetArg(myArgs[i], XmNrightPosition,    66);                 i++;
   XtSetArg(myArgs[i], XmNbottomPosition,   35);                 i++;
   colors_child[4] = XmCreateScale(colors, "scaleit", myArgs, i);
   XtAddCallback(colors_child[4], XmNdragCallback, Drag, NULL);
   XtAddCallback(colors_child[4], XmNvalueChangedCallback, ValueChanged, NULL);

   XtManageChildren(colors_child, XtNumber(colors_child));


   /* rainbow pushbuttons */
   i = 0;
   XtSetArg(myArgs[i], XmNleftAttachment,   XmATTACH_POSITION);  i++;
   XtSetArg(myArgs[i], XmNtopAttachment,    XmATTACH_FORM);      i++;
   XtSetArg(myArgs[i], XmNrightAttachment,  XmATTACH_POSITION);  i++;
   XtSetArg(myArgs[i], XmNbottomAttachment, XmATTACH_FORM);      i++;
   XtSetArg(myArgs[i], XmNtopOffset,        BORDERSIZE);         i++;
   XtSetArg(myArgs[i], XmNbottomOffset,     BORDERSIZE);         i++;
   leftPos = 1;
   for (n = 0; n < XtNumber(rainbow_pb); n++) {
      rightPos = leftPos + rainbow_widths[n] - 1;
      XtSetArg(myArgs[i],   XmNleftPosition,  leftPos);
      XtSetArg(myArgs[i+1], XmNrightPosition, rightPos);
      rainbow_pb[n] = XmCreatePushButton(colors_child[0],
                                         rainbow_name[n], myArgs, i+2);
      leftPos = leftPos + rainbow_widths[n];
   }
   XtAddCallback(rainbow_pb[EXIT], XmNactivateCallback, goodbye, NULL);
   XtManageChildren(rainbow_pb, XtNumber(rainbow_pb));


   /*
    * primaries children:  a "printer" form (form of printer's primary colors)
    *                      and a "painter" form
    */
   i = 0;
   XtSetArg(myArgs[i], XmNleftAttachment,   XmATTACH_FORM);      i++;
   XtSetArg(myArgs[i], XmNtopAttachment,    XmATTACH_POSITION);  i++;
   XtSetArg(myArgs[i], XmNrightAttachment,  XmATTACH_FORM);      i++;
   XtSetArg(myArgs[i], XmNbottomAttachment, XmATTACH_FORM);      i++;
   XtSetArg(myArgs[i], XmNleftOffset,       BORDERSIZE);         i++;
   XtSetArg(myArgs[i], XmNtopPosition,      50);                 i++;
   XtSetArg(myArgs[i], XmNrightOffset,      BORDERSIZE);         i++;
   XtSetArg(myArgs[i], XmNbottomOffset,     BORDERSIZE);         i++;
   printer = XmCreateForm(colors_child[2], "printer", myArgs, i);
   XtManageChild(printer);

   i = 0;
   XtSetArg(myArgs[i], XmNleftAttachment,   XmATTACH_FORM);      i++;
   XtSetArg(myArgs[i], XmNtopAttachment,    XmATTACH_FORM);      i++;
   XtSetArg(myArgs[i], XmNrightAttachment,  XmATTACH_FORM);      i++;
   XtSetArg(myArgs[i], XmNbottomAttachment, XmATTACH_POSITION);  i++;
   XtSetArg(myArgs[i], XmNleftOffset,       BORDERSIZE);         i++;
   XtSetArg(myArgs[i], XmNtopOffset,        BORDERSIZE);         i++;
   XtSetArg(myArgs[i], XmNrightOffset,      BORDERSIZE);         i++;
   XtSetArg(myArgs[i], XmNbottomPosition,   49);                 i++;
   painter = XmCreateForm(colors_child[2], "painter", myArgs, i);
   XtManageChild(painter);

   i = 0;
   XtSetArg(myArgs[i], XmNleftAttachment,   XmATTACH_FORM);      i++;
   XtSetArg(myArgs[i], XmNtopAttachment,    XmATTACH_POSITION);  i++;
   XtSetArg(myArgs[i], XmNrightAttachment,  XmATTACH_FORM);      i++;
   XtSetArg(myArgs[i], XmNbottomAttachment, XmATTACH_POSITION);  i++;
   XtSetArg(myArgs[i], XmNleftOffset,       BORDERSIZE);         i++;
   XtSetArg(myArgs[i], XmNrightOffset,      BORDERSIZE);         i++;
   topPos = 1;
   for (n = 0; n < XtNumber(printer_pb); n++) {
      bottomPos = topPos + PRIM_HEIGHT - 1;
      XtSetArg(myArgs[i],   XmNtopPosition,    topPos);
      XtSetArg(myArgs[i+1], XmNbottomPosition, bottomPos);
      printer_pb[n] = XmCreatePushButton(printer,
                                         printer_name[n], myArgs, i+2);
      topPos = topPos + PRIM_HEIGHT;
   }
   XtManageChildren(printer_pb, XtNumber(printer_pb));

   topPos = 1;
   for (n = 0; n < XtNumber(painter_pb); n++) {
      bottomPos = topPos + PRIM_HEIGHT - 1;
      XtSetArg(myArgs[i],   XmNtopPosition,    topPos);
      XtSetArg(myArgs[i+1], XmNbottomPosition, bottomPos);
      painter_pb[n] = XmCreatePushButton(painter,
                                         painter_name[n], myArgs, i+2);
      topPos = topPos + PRIM_HEIGHT;
   }
   XtManageChildren(painter_pb, XtNumber(painter_pb));


   /* tone's pushbuttons */
   i = 0;
   XtSetArg(myArgs[i], XmNleftAttachment,   XmATTACH_POSITION);  i++;
   XtSetArg(myArgs[i], XmNtopAttachment,    XmATTACH_FORM);      i++;
   XtSetArg(myArgs[i], XmNrightAttachment,  XmATTACH_POSITION);  i++;
   XtSetArg(myArgs[i], XmNbottomAttachment, XmATTACH_FORM);      i++;
   XtSetArg(myArgs[i], XmNtopOffset,        BORDERSIZE);         i++;
   XtSetArg(myArgs[i], XmNbottomOffset,     BORDERSIZE);         i++;
   leftPos = 1;
   for (n = 0; n < XtNumber(tones_pb); n++) {
      rightPos = leftPos + tones_widths[n] - 1;
      XtSetArg(myArgs[i],   XmNleftPosition,    leftPos);
      XtSetArg(myArgs[i+1], XmNrightPosition,   rightPos);
      tones_pb[n] = XmCreatePushButton(colors_child[3],
                                       tones_name[n], myArgs, i+2);
      leftPos = leftPos + tones_widths[n];
   }
   XtAddCallback(tones_pb[MOVESLIDER], XmNactivateCallback, MoveSlider, NULL);
   XtAddCallback(tones_pb[CHANGELIMITS], XmNactivateCallback, ChangeLimits,
       NULL);
   XtManageChildren(tones_pb, XtNumber(tones_pb));

   XtRealizeWidget(toplevel);
   while(!done)
   {
     printf("%d\n",cnt++);
     XtAppNextEvent(app_context,&myevent);
     XtDispatchEvent(&myevent);
   }
/*   XtAppMainLoop(app_context);*/
}
5972.2Lab01 - app defs fileTAV02::AMITAmit MargalitThu Jun 05 1997 06:00101
#
#  Lab01 Resource Defaults
#
#
# form resources
#
lab01*foreground:               White
lab01*background:               #D16F5E
lab01*fontList:         -Adobe-New Century
Schoolbook-Bold-R-Normal--24-240-75-75-P-149-ISO8859-1
lab01*armColor:                 LightBlue
                                                          
lab01*shadowThickness:          4

#
# colors resources (form)
#
lab01*colors.width:                             645
lab01*colors.height:                            600
lab01*colors.XmForm*background:                 Salmon
lab01*colors.XmDrawingArea*background:          LightBlue

#
# rainbow pushbutton resources
#
lab01.colors.rainbow.red.background:            Red
lab01*colors.rainbow.red.labelString:           Redder
                                               
lab01*colors.rainbow.orange.background:         Orange
lab01*colors.rainbow.orange.labelString:        Orange
lab01*colors.rainbow.orange.sensitive:          False

lab01*colors.rainbow.yellow.background:         Yellow
lab01*colors.rainbow.yellow.labelString:        Yellow

lab01*colors.rainbow.green.background:          DarkGreen
lab01*colors.rainbow.green.fillOnArm:           False
#lab01*colors.rainbow.green.labelString:         Green
lab01*colors.rainbow.green.labelType:           XmPIXMAP
lab01*colors.rainbow.green.labelPixmap:         slant_right
lab01*colors.rainbow.green.armPixmap:           slant_left

lab01*colors.rainbow.blue.background:           Blue
lab01*colors.rainbow.blue.labelString:          Blue
lab01*colors.rainbow.blue.armColor:             Red

lab01*colors.rainbow.violet.background:         Violet
lab01*colors.rainbow.violet.labelString:        EXIT

#
# wildcarded for both primary forms
#
lab01*colors.primaries.XmForm.background:       #FFB388

#
# painter pushbuttons
#
lab01.colors.primaries.painter.red.background:          Red
lab01.colors.primaries.painter.red.labelString:         Red

lab01.colors.primaries.painter.yellow.background:       Yellow
lab01.colors.primaries.painter.yellow.labelString:      Yellow

lab01.colors.primaries.painter.blue.background:         Blue
lab01.colors.primaries.painter.blue.labelString:        Blue

#
# printer pushbuttons
#
lab01.colors.primaries.printer.magenta.background:      Magenta
lab01.colors.primaries.printer.magenta.labelString:     Magenta

lab01.colors.primaries.printer.yellow.background:       Yellow
lab01.colors.primaries.printer.yellow.labelString:      Yellow

lab01.colors.primaries.printer.cyan.background:         Cyan
lab01.colors.primaries.printer.cyan.labelString:        Cyan

#
# tones pushbuttons
#
lab01.colors.tones.black.background:            Black
#lab01.colors.tones.black.labelString:          Black
lab01.colors.tones.black.labelString:           Change Limits
lab01.colors.tones.black.foreground:            white

lab01.colors.tones.white.background:            White
lab01.colors.tones.white.foreground:            Red
#lab01.colors.tones.white.labelString:          White
lab01.colors.tones.white.labelString:           Move Slider

#
# Scale widget:
#
lab01*colors.XmScale.maximum:           8000
lab01*colors.XmScale.minimum:           1000
lab01*colors.XmScale.orientation:       XmHORIZONTAL
lab01*colors.XmScale.scaleHeight:       70
lab01*colors.XmScale.showValue:         True
lab01*colors.XmScale.value:             3000
lab01*colors.XmScale.decimalPoints:     1