|
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 W
Length: 6830 (0x1aae) Types: TextFile Names: »WidgetWrap.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0 └─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z« └─⟦e5a54fb17⟧ └─⟦this⟧ »pp-5.0/Src/MTAconsole/WidgetWrap.c«
/* WidgetWrap.c: variable argument style programmer interfaces to widgets */ # ifndef lint static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Src/MTAconsole/RCS/WidgetWrap.c,v 5.0 90/09/20 16:19:01 pp Exp Locker: pp $"; # endif /* * $Header: /cs/research/pp/hubris/pp-beta/Src/MTAconsole/RCS/WidgetWrap.c,v 5.0 90/09/20 16:19:01 pp Exp Locker: pp $ * * $Log: WidgetWrap.c,v $ * Revision 5.0 90/09/20 16:19:01 pp * rcsforce : 5.0 public release * */ #include <stdio.h> #include <X11/Intrinsic.h> #include <varargs.h> #include "WidgetWrap.h" /* * WidgetWrap.c -- variable argument style programmer interfaces to widgets: * WidgetCreate(name, class, parent, varargs...); * WidgetSet(name, varargs); * WidgetGet(name, varargs); * GenericWidgetName(buf); * * This module was written by Dan Heller <island!argv@sun.com> or * <dheller@ucbcory.berkeley.edu>. * * The purpose of this module is to allow the programmer to Create * widgets and set/get widget attributes via a variable argument list * style of function call. This eliminates the need for many local * variables and bothersome XtSetArg() calls and so forth. An example * of usage: * * Widget foo; * * foo = WidgetCreate("foo", labelWidgetClass, toplevel, * XtNlabel, "Widget", * XtNforeground, WhitePixelOfScreen(XtScreen(toplevel)), * XtNbackground, BlackPixelOfScreen(XtScreen(toplevel)), * XtNborderWidth, 1, * NULL); * * As you can see, the list must be NULL terminated. You may pass up to * to MAXARGS argument pairs. Increase this number in WidgetWrap.h if * necessary. There are special args availabel to the create/get/set * functions that are available: * * XtNmanaged pass "False" to create a non-managed widget. * XtNargList takes _two_ parameters. * * The XtNargList makes it possible to pass attributes to the create/get/set * calls that are probably common to many widgets to be created or reset. * * static Arg args[] = { * XtNforeground, black, * XtNbackground, white, * XtNwidth, 20, * XtNheight, 10, * }; * foo = WidgetCreate("bar", widgetClass, toplevel, * XtNargList, args, XtNumber(args), * NULL); * * Most large applciations will create huge numbers of widgets which the * programmer has to think up unique names for all of them. What's more, * typically, as noted by the examples above, the names are constant strings * which takes up memory, disk spaces, etc... So, if WidgetCreate() gets * NULL as the name of the widget, then a widget name will be created * automatically. Since most of the time, user's don't care what the name * of a widget is, this capability is available. * * Finally, a note about varargs. Note that there are many different * implementations of varargs. To maintain portability, it is important * to never return from a function that uses varargs without calling va_end(). * va_start() and va_end() should always exist in the same block of {}'s. * There can be blocks between them, but va_end() shouldn't be in a block * inside of the va_start() stuff. This is to allow support for weird * implementations which define va_start() to something like: ".... { " * (pyramid computers for one). * Also, if you use varargs, never declare "known" arguments; extract them * from the vararg list later. */ char *GenericWidgetName(buf) char *buf; { static int widget_count; (void) sprintf(buf, "_widget.%6d", widget_count++); return buf; } /* * WidgetCreate() * Create a widget passing it's instance attributes and other parameters * as variable arguments. This removes the need to build your own Arg[] * lists, etc... Terminate argument list pairs with a NULL argument. */ /* VARARGS */ Widget WidgetCreate(va_alist) va_dcl { va_list var; Arg args[MAXARGS]; int err = 0, nargs, i = 0; int managed = True; String argstr; XtArgVal argval; char *name, buf[32]; WidgetClass class; Widget parent; va_start(var); if (!(name = va_arg(var, char *))) name = GenericWidgetName(buf); class = va_arg(var, WidgetClass); parent = va_arg(var, Widget); while (argstr = va_arg(var, char *)) { if (i == MAXARGS) { fprintf(stderr, "WidgetCreate: too many arguments: %d\n", i); err++; break; } if (!strcmp(argstr, XtNargList)) { ArgList list = va_arg(var, ArgList); int numargs = va_arg(var, int); for (numargs--; i < MAXARGS && numargs >= 0; i++, numargs--) XtSetArg(args[i], list[numargs].name, list[numargs].value); if (i == MAXARGS) { fprintf(stderr, "WidgetCreate: too many arguments: %d\n", i); err++; break; } } else if (!strcmp(argstr, XtNmanaged)) /* managed is _really_ boolean, but varargs only works with ints */ managed = va_arg(var, int); else { argval = va_arg(var, XtArgVal); XtSetArg(args[i], argstr, argval); ++i; } } va_end(var); if (err) return NULL; if (managed) return XtCreateManagedWidget(name, class, parent, args, i); else return XtCreateWidget(name, class, parent, args, i); } /* * WidgetSet() * Once a widget has been created, you may use this routine to * add or change a varaible number of attributes on it. */ /*VARARGS*/ void WidgetSet(va_alist) va_dcl { String argstr; Arg args[MAXARGS]; XtArgVal argval; int i = 0; va_list var; Widget w; va_start(var); w = va_arg(var, Widget); while (argstr = va_arg(var, char *)) { if (i == MAXARGS) { fprintf(stderr, "Warning: increase MAXARGS! (%d)\n", i); XtSetValues(w, args, i); i = 0; } if (!strcmp(argstr, XtNargList)) { ArgList list = va_arg(var, ArgList); XtArgVal numargs = va_arg(var, Cardinal); XtSetValues(w, list, numargs); } else { argval = va_arg(var, XtArgVal); XtSetArg(args[i], argstr, argval); ++i; } } va_end(var); if (i > 0) XtSetValues(w, args, i); } /* * WidgetGet() * Get the values of a widget via an interface identical to WidgetSet */ /*VARARGS*/ void WidgetGet(va_alist) va_dcl { String argstr; Arg args[MAXARGS]; XtArgVal argval; int i = 0; va_list var; Widget w; va_start(var); w = va_arg(var, Widget); while (argstr = va_arg(var, char *)) { argval = va_arg(var, XtArgVal); if (i == MAXARGS) { fprintf(stderr, "Warning: increase MAXARGS! (%d)\n", i); XtGetValues(w, args, i); i = 0; } if (!strcmp(argstr, XtNargList)) { ArgList list = va_arg(var, ArgList); XtArgVal numargs = va_arg(var, Cardinal); XtGetValues(w, list, numargs); } else XtSetArg(args[i], argstr, argval); ++i; } va_end(var); if (i > 0) XtGetValues(w, args, i); }