1fd7d9bd3Smrg/*
2fd7d9bd3Smrg** planemask.c
3fd7d9bd3Smrg**
4fd7d9bd3Smrg** How to make a widget to choose a planemask.
5fd7d9bd3Smrg**
6fd7d9bd3Smrg** NOTE: This file uses static variables.  Therefore, trying to use these
7fd7d9bd3Smrg**       functions to create more than one of these planemask choice things
8fd7d9bd3Smrg**       will fail in a big way.
9fd7d9bd3Smrg*/
10fd7d9bd3Smrg
11fd7d9bd3Smrg#include <X11/Xos.h>
12fd7d9bd3Smrg#include <stdio.h>
13fd7d9bd3Smrg#include <stdlib.h>
14fd7d9bd3Smrg#include <X11/Intrinsic.h>
15fd7d9bd3Smrg#include <X11/StringDefs.h>
16fd7d9bd3Smrg#include <X11/Xaw/Form.h>
17fd7d9bd3Smrg#include <X11/Xaw/Label.h>
18fd7d9bd3Smrg#include <X11/Xaw/Toggle.h>
19fd7d9bd3Smrg#include "xgc.h"
20fd7d9bd3Smrg
21fd7d9bd3Smrgstatic void choose_plane(Widget, caddr_t, caddr_t);
22fd7d9bd3Smrg
23e53c48bfSmrgstatic unsigned long planemask;
24fd7d9bd3Smrgstatic Widget *pm;
25fd7d9bd3Smrg
26fd7d9bd3Smrg/* create_planemask_choice(w)
27fd7d9bd3Smrg** -------------------------
28fd7d9bd3Smrg** Inside w (a form widget), creates a bunch of little toggle buttons
29fd7d9bd3Smrg** in a row, representing the planemask.  There's also a label so
30fd7d9bd3Smrg** the user knows what it is.
31fd7d9bd3Smrg*/
32fd7d9bd3Smrg
33fd7d9bd3Smrgvoid
34fd7d9bd3Smrgcreate_planemask_choice(Widget w)
35fd7d9bd3Smrg{
36fd7d9bd3Smrg  /* callback list for the toggle widgets */
37fd7d9bd3Smrg  static XtCallbackRec callbacklist[] = {
38fd7d9bd3Smrg    {(XtCallbackProc) choose_plane, NULL},
39fd7d9bd3Smrg    {NULL,                          NULL}
40fd7d9bd3Smrg  };
41fd7d9bd3Smrg
42fd7d9bd3Smrg  /* ArgList for the label */
43fd7d9bd3Smrg  static Arg labelargs[] = {
44fd7d9bd3Smrg    {XtNborderWidth,     (XtArgVal) 0},
45fd7d9bd3Smrg    {XtNjustify,         (XtArgVal) XtJustifyRight},
46fd7d9bd3Smrg    {XtNvertDistance,    (XtArgVal) 4}
47fd7d9bd3Smrg  };
48fd7d9bd3Smrg
49fd7d9bd3Smrg  /* ArgList for the toggles */
50fd7d9bd3Smrg  static Arg pmargs[] = {
51fd7d9bd3Smrg    {XtNcallback,          (XtArgVal) NULL},
52fd7d9bd3Smrg    {XtNhorizDistance,     (XtArgVal) NULL},
53fd7d9bd3Smrg    {XtNfromHoriz,         (XtArgVal) NULL},
54fd7d9bd3Smrg    {XtNwidth,             (XtArgVal) 10},
55fd7d9bd3Smrg    {XtNheight,            (XtArgVal) 10},
56fd7d9bd3Smrg    {XtNhighlightThickness,(XtArgVal) 1},
57fd7d9bd3Smrg    {XtNstate,             (XtArgVal) True},
58fd7d9bd3Smrg    {XtNlabel,             (XtArgVal) ""}
59fd7d9bd3Smrg  };
60fd7d9bd3Smrg
61fd7d9bd3Smrg  static Widget label;		/* the label, of course */
62fd7d9bd3Smrg  static int *pminfo;		/* contains integers saying which bit
63fd7d9bd3Smrg				   a particular button is; sent to
64fd7d9bd3Smrg				   choose_plane to tell it which
65fd7d9bd3Smrg				   bit got changed */
66fd7d9bd3Smrg
67fd7d9bd3Smrg  int i, num_planes;
68fd7d9bd3Smrg
69fd7d9bd3Smrg  char buf[40];
70e53c48bfSmrg  char name[20];
71fd7d9bd3Smrg
72fd7d9bd3Smrg  num_planes = PlanesOfScreen(X.scr);
73fd7d9bd3Smrg
74fd7d9bd3Smrg  planemask = (1<<num_planes)-1;
75fd7d9bd3Smrg  snprintf(buf, sizeof buf, "planemask %lu",planemask);
76fd7d9bd3Smrg  interpret(buf);
77fd7d9bd3Smrg
78fd7d9bd3Smrg  /* Allocate space for stuff that we don't know the size of yet */
79fd7d9bd3Smrg
80fd7d9bd3Smrg  pm = (Widget *) malloc(num_planes * sizeof(Widget));
81fd7d9bd3Smrg  pminfo = (int *) malloc(num_planes * sizeof(int));
82fd7d9bd3Smrg
83fd7d9bd3Smrg  /* Make the label widget */
84fd7d9bd3Smrg
85fd7d9bd3Smrg  label = XtCreateManagedWidget("planemask",labelWidgetClass,w,
86fd7d9bd3Smrg				labelargs,XtNumber(labelargs));
87fd7d9bd3Smrg
88fd7d9bd3Smrg  pmargs[0].value = (XtArgVal) callbacklist;
89fd7d9bd3Smrg
90fd7d9bd3Smrg  for (i=0;i<num_planes;++i) {	/* go through all the buttons */
91fd7d9bd3Smrg    if (i==0) {			/* offset the first one from the label */
92fd7d9bd3Smrg      pmargs[1].value = (XtArgVal) 10;
93fd7d9bd3Smrg      pmargs[2].value = (XtArgVal) label;
94fd7d9bd3Smrg    }
95fd7d9bd3Smrg    else {			/* put it directly to the right of the
96fd7d9bd3Smrg				   last one, no space in between */
97fd7d9bd3Smrg      pmargs[1].value = (XtArgVal) -1;
98fd7d9bd3Smrg      pmargs[2].value = (XtArgVal) pm[i-1];
99fd7d9bd3Smrg    }
100fd7d9bd3Smrg
101fd7d9bd3Smrg    /* set its original state depending on the state of that bit
102fd7d9bd3Smrg    ** of the planemask */
103fd7d9bd3Smrg
104fd7d9bd3Smrg    if (planemask & 1<<i)
105fd7d9bd3Smrg      pmargs[6].value = (XtArgVal) True;
106fd7d9bd3Smrg    else
107fd7d9bd3Smrg      pmargs[6].value = (XtArgVal) False;
108fd7d9bd3Smrg
109fd7d9bd3Smrg    snprintf(name, sizeof name, "planemask%d",i);
110fd7d9bd3Smrg
111fd7d9bd3Smrg    pminfo[i] = i;		/* which bit we're on; this is needed in
112fd7d9bd3Smrg				   choose_plane (the callback) */
113fd7d9bd3Smrg    callbacklist[0].closure = (caddr_t) &pminfo[i];
114fd7d9bd3Smrg
115fd7d9bd3Smrg    pm[i] = XtCreateManagedWidget(name,toggleWidgetClass,w,
116fd7d9bd3Smrg				  pmargs,XtNumber(pmargs));
117fd7d9bd3Smrg  }
118fd7d9bd3Smrg}
119fd7d9bd3Smrg
120fd7d9bd3Smrg/* choose_plane(w,closure,call_data)
121fd7d9bd3Smrg** ------------------------------------
122fd7d9bd3Smrg** This function is called when the user toggles a toggle widget.  It
123fd7d9bd3Smrg** makes the appropriate change to the planemask and sends it off
124fd7d9bd3Smrg** to interpret().
125fd7d9bd3Smrg** Funny args are because it's a callback.
126fd7d9bd3Smrg*/
127fd7d9bd3Smrg
128fd7d9bd3Smrg/*ARGSUSED*/
129fd7d9bd3Smrgstatic void
130fd7d9bd3Smrgchoose_plane(Widget w, caddr_t closure, caddr_t call_data)
131fd7d9bd3Smrg{
132fd7d9bd3Smrg  int num;			/* what number button it is */
133fd7d9bd3Smrg  Boolean on;			/* is it currently on or off? */
134fd7d9bd3Smrg
135fd7d9bd3Smrg  char buf[80];			/* string to send to interpret() */
136fd7d9bd3Smrg
137fd7d9bd3Smrg  static Arg args[] = {
138fd7d9bd3Smrg    {XtNstate,    (XtArgVal) NULL}
139fd7d9bd3Smrg  };
140fd7d9bd3Smrg
141fd7d9bd3Smrg  /* set up ArgList so that 'on' will contain the state */
142fd7d9bd3Smrg  args[0].value = (XtArgVal) &on;
143fd7d9bd3Smrg
144fd7d9bd3Smrg  num = * (int *) closure;	/* we put it here back in the last function */
145fd7d9bd3Smrg  XtGetValues(w,args,XtNumber(args));
146fd7d9bd3Smrg
147fd7d9bd3Smrg  /* Modify the planemask appropriately */
148fd7d9bd3Smrg
149fd7d9bd3Smrg  if (on)
150fd7d9bd3Smrg    planemask |= 1<<num;
151fd7d9bd3Smrg  else
152fd7d9bd3Smrg    planemask &= ~(1<<num);
153fd7d9bd3Smrg
154fd7d9bd3Smrg  (void) snprintf(buf, sizeof buf, "planemask %lu\n",planemask);
155fd7d9bd3Smrg  interpret(buf);
156fd7d9bd3Smrg}
157fd7d9bd3Smrg
158fd7d9bd3Smrg/* update_planemask(mask)
159fd7d9bd3Smrg** ----------------------
160fd7d9bd3Smrg** Updates the display of the planemask so that it corresponds to mask.
161fd7d9bd3Smrg*/
162fd7d9bd3Smrg
163fd7d9bd3Smrgvoid
164fd7d9bd3Smrgupdate_planemask(long mask)
165fd7d9bd3Smrg{
166fd7d9bd3Smrg  int i;			/* counter */
167fd7d9bd3Smrg  static Arg maskargs[] = {	/* ArgList for setting toggle state */
168fd7d9bd3Smrg    {XtNstate,     (XtArgVal) NULL}
169fd7d9bd3Smrg  };
170fd7d9bd3Smrg
171fd7d9bd3Smrg  /* First set the internal representation */
172fd7d9bd3Smrg
173fd7d9bd3Smrg  planemask = mask;
174fd7d9bd3Smrg
175fd7d9bd3Smrg  for (i = 0; i < PlanesOfScreen(X.scr); ++i) {
176fd7d9bd3Smrg    if (planemask & 1<<i) {        /* if it's set, make it look that way */
177fd7d9bd3Smrg      maskargs[0].value = (XtArgVal) True;
178fd7d9bd3Smrg    }
179fd7d9bd3Smrg    else {
180fd7d9bd3Smrg      maskargs[0].value = (XtArgVal) False;
181fd7d9bd3Smrg    }
182fd7d9bd3Smrg
183fd7d9bd3Smrg    XtSetValues(pm[i],maskargs,XtNumber(maskargs));
184fd7d9bd3Smrg  }
185fd7d9bd3Smrg}
186