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