|  | /*
 * 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);*/
}
 |