DynaValues and LWValues

The DynaValue data type defined in lwdyna.h is a union of containers for values of various base types. DynaValues are used as function arguments, with commands and requesters, for example, when the function must accept values of multiple types. LWValues are a variation on DynaValues used by Panels and defined in lwpanel.h.

The DynaValue typedef looks like this.

   typedef union un_DynaValue {
      DynaType      type;
      DyValString   str;
      DyValInt      intv;
      DyValFloat    flt;
      DyValIVector  ivec;
      DyValFVector  fvec;
      DyValCustom   cust;
   } DynaValue;

The elements of this union each support a different base type, and each base type can underlie several DynaTypes. (Two DynaTypes, DY_NULL and DY_TEXT, have no underlying value.)

Strings

   typedef struct st_DyValString {           DY_STRING
      DynaType   type;                       DY_SURFACE
      char      *buf;
      int        bufLen;
   } DyValString;

bufLen is the size of buf in characters. For the DY_SURFACE type, buf contains the surface name.

Integers

   typedef struct st_DyValInt {              DY_INTEGER
      DynaType   type;                       DY_BOOLEAN
      int        value;                      DY_CHOICE
      int        defVal;                     DY_FONT
   } DyValInt;                               DY_LAYERS

The value in defVal is used by requesters to reset control values. The value for DY_CHOICE and DY_FONT is a 0-based index into a list. The value for DY_LAYERS is a set of bitfields corresponding to layer numbers.

Floating-Point Numbers

   typedef struct st_DyValFloat {            DY_FLOAT
      DynaType   type;                       DY_DISTANCE
      double     value;
      double     defVal;
   } DyValFloat;

DY_DIST values are distances in meters.

Integer Vectors

   typedef struct st_DyValIVector {          DY_VINT
      DynaType   type;
      int        val[3];
      int        defVal;
   } DyValIVector;

Floating-Point Vectors

   typedef struct st_DyValFVector {          DY_VFLOAT
      DynaType   type;                       DY_VDIST
      double     val[3];
      double     defVal;
   } DyValFVector;

Custom Values

   typedef struct st_DyValCustom {           DY_CUSTOM
      DynaType   type;
      int        val[4];
   } DyValCustom;

DY_CUSTOM is used to encode values that don't fit one of the standard types. The interpretation of the values in the val array will depend on the context in which this type is used.

The Dynamic Conversion global provides a facility for converting between DynaValues of different types.

LWValues

Panels adds a generic pointer type to the list of types, but in all other respects, LWValues differ from DynaValues in name only. Structurally they're equivalent.

   typedef union un_LWValue {
      LWType        type;
      LWValString   str;
      LWValInt      intv;
      LWValFloat    flt;
      LWValIVector  ivec;
      LWValFVector  fvec;
      LWValPointer  ptr;
      LWValCustom   cust;
   } LWValue;

Although lwpanel.h defines others, only five LWTypes are needed to describe the values of all LWPanels controls.

   LWT_STRING
   LWT_INTEGER
   LWT_FLOAT
   LWT_VINT
   LWT_VFLOAT