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