|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T p
Length: 4951 (0x1357) Types: TextFile Names: »planemask.c«
└─⟦276d19d6e⟧ Bits:30007243 EUUGD5_I: X11R5 └─⟦af7d3f39a⟧ »./mit-2/mit-2.00« └─⟦0abaffd9e⟧ └─⟦this⟧ »mit/demos/xgc/planemask.c«
/* ** planemask.c ** ** How to make a widget to choose a planemask. ** ** NOTE: This file uses static variables. Therefore, trying to use these ** functions to create more than one of these planemask choice things ** will fail in a big way. */ #include <stdio.h> #include <X11/Intrinsic.h> #include <X11/StringDefs.h> #include <X11/Xaw/Form.h> #include <X11/Xaw/Label.h> #include <X11/Xaw/Toggle.h> #include "xgc.h" static void choose_plane(); extern void interpret(); extern XStuff X; static unsigned long planemask; static Widget *pm; /* create_planemask_choice(w) ** ------------------------- ** Inside w (a form widget), creates a bunch of little toggle buttons ** in a row, representing the planemask. There's also a label so ** the user knows what it is. */ void create_planemask_choice(w) Widget w; { /* callback list for the toggle widgets */ static XtCallbackRec callbacklist[] = { {(XtCallbackProc) choose_plane, NULL}, {NULL, NULL} }; /* ArgList for the label */ static Arg labelargs[] = { {XtNborderWidth, (XtArgVal) 0}, {XtNjustify, (XtArgVal) XtJustifyRight}, {XtNvertDistance, (XtArgVal) 4} }; /* ArgList for the toggles */ static Arg pmargs[] = { {XtNcallback, (XtArgVal) NULL}, {XtNhorizDistance, (XtArgVal) NULL}, {XtNfromHoriz, (XtArgVal) NULL}, {XtNwidth, (XtArgVal) 10}, {XtNheight, (XtArgVal) 10}, {XtNhighlightThickness,(XtArgVal) 1}, {XtNstate, (XtArgVal) True}, {XtNlabel, (XtArgVal) ""} }; static Widget label; /* the label, of course */ static int *pminfo; /* contains integers saying which bit a particular button is; sent to choose_plane to tell it which bit got changed */ int i, num_planes; char buf[40]; char name[12]; num_planes = PlanesOfScreen(X.scr); planemask = (1<<num_planes)-1; sprintf(buf,"planemask %d",planemask); interpret(buf); /* Allocate space for stuff that we don't know the size of yet */ pm = (Widget *) malloc(num_planes * sizeof(Widget)); pminfo = (int *) malloc(num_planes * sizeof(int)); /* Make the label widget */ label = XtCreateManagedWidget("planemask",labelWidgetClass,w, labelargs,XtNumber(labelargs)); pmargs[0].value = (XtArgVal) callbacklist; for (i=0;i<num_planes;++i) { /* go through all the buttons */ if (i==0) { /* offset the first one from the label */ pmargs[1].value = (XtArgVal) 10; pmargs[2].value = (XtArgVal) label; } else { /* put it directly to the right of the last one, no space in between */ pmargs[1].value = (XtArgVal) -1; pmargs[2].value = (XtArgVal) pm[i-1]; } /* set its original state depending on the state of that bit ** of the planemask */ if (planemask & 1<<i) pmargs[6].value = (XtArgVal) True; else pmargs[6].value = (XtArgVal) False; sprintf(name,"planemask%d",i); pminfo[i] = i; /* which bit we're on; this is needed in choose_plane (the callback) */ callbacklist[0].closure = (caddr_t) &pminfo[i]; pm[i] = XtCreateManagedWidget(name,toggleWidgetClass,w, pmargs,XtNumber(pmargs)); } } /* choose_plane(w,closure,call_data) ** ------------------------------------ ** This function is called when the user toggles a toggle widget. It ** makes the appropriate change to the planemask and sends it off ** to interpret(). ** Funny args are because it's a callback. */ /*ARGSUSED*/ static void choose_plane(w,closure,call_data) Widget w; caddr_t closure; caddr_t call_data; { int num; /* what number button it is */ Boolean on; /* is it currently on or off? */ char buf[80]; /* string to send to interpret() */ static Arg args[] = { {XtNstate, (XtArgVal) NULL} }; /* set up ArgList so that 'on' will contain the state */ args[0].value = (XtArgVal) &on; num = * (int *) closure; /* we put it here back in the last function */ XtGetValues(w,args,XtNumber(args)); /* Modify the planemask appropriately */ if (on) planemask |= 1<<num; else planemask &= ~(1<<num); (void) sprintf(buf,"planemask %d\n",planemask); interpret(buf); } /* update_planemask(mask) ** ---------------------- ** Updates the display of the planemask so that it corresponds to mask. */ void update_planemask(mask) long mask; { int i; /* counter */ static Arg maskargs[] = { /* ArgList for setting toggle state */ {XtNstate, (XtArgVal) NULL} }; /* First set the internal representation */ planemask = mask; for (i = 0; i < PlanesOfScreen(X.scr); ++i) { if (planemask & 1<<i) { /* if it's set, make it look that way */ maskargs[0].value = (XtArgVal) True; } else { maskargs[0].value = (XtArgVal) False; } XtSetValues(pm[i],maskargs,XtNumber(maskargs)); } }