Provided by: tk9.0-doc_9.0.1-1_all bug

NAME

       Tk_ConfigureWidget,  Tk_ConfigureInfo,  Tk_ConfigureValue, Tk_FreeOptions - process configuration options
       for widgets

SYNOPSIS

       #include <tk.h>

       int
       Tk_ConfigureWidget(interp, tkwin, specs, objc, objv, widgRec, flags)

       int
       Tk_ConfigureInfo(interp, tkwin, specs, widgRec, argvName, flags)

       int
       Tk_ConfigureValue(interp, tkwin, specs, widgRec, argvName, flags)

       Tk_FreeOptions(specs, widgRec, display, flags)

ARGUMENTS

       Tcl_Interp *interp (in)     Interpreter to use for returning error messages.

       Tk_Window tkwin (in)        Window used to represent widget (needed to set up X resources).

       const Tk_ConfigSpec *specs (in)
                                   Pointer to table specifying legal configuration options for this widget.

       Tcl_Size objc (in)          Number of arguments in objv.

       Tcl_Obj *const * objv (in)  Command-line options for configuring widget.

       char *widgRec (in/out)      Points to widget record structure.  Fields in this structure get modified  by
                                   Tk_ConfigureWidget to hold configuration information.

       int flags (in)              If non-zero, then it specifies an OR-ed combination of flags that control the
                                   processing  of  configuration  information.   TK_CONFIG_ARGV_ONLY  causes the
                                   option database and defaults to be ignored, and flag bits  TK_CONFIG_USER_BIT
                                   and higher are used to selectively disable entries in specs.

       type name type (in)         The name of the type of a widget record.

       field name field (in)       The name of a field in records of type type.

       const char *argvName (in)   The name used on Tcl command lines to refer to a particular option (e.g. when
                                   creating  a  widget  or invoking the configure widget command).  If non-NULL,
                                   then information is returned only for this option.  If NULL, then information
                                   is returned for all available options.

       Display *display (in)       Display containing widget whose record is being freed;  needed  in  order  to
                                   free up resources.
________________________________________________________________________________________________________________

DESCRIPTION

       Note  that  Tk_ConfigureWidget should be replaced with the new Tcl_Obj based API, Tk_SetOptions.  The old
       interface is retained for backward compatibility.

       Tk_ConfigureWidget is called to configure various aspects of a widget,  such  as  colors,  fonts,  border
       width,  etc.  It is intended as a convenience procedure to reduce the amount of code that must be written
       in individual widget managers to handle configuration information.  It is typically invoked when  widgets
       are  created,  and again when the configure command is invoked for a widget.  Although intended primarily
       for widgets, Tk_ConfigureWidget can be used in other situations where objc-objv information is to be used
       to fill in a record structure, such as configuring graphical elements for a canvas widget or entries of a
       menu.

       Tk_ConfigureWidget processes a table specifying the configuration options that are supported (specs)  and
       a  collection of command-line arguments (objc and objv) to fill in fields of a record (widgRec).  It uses
       the option database and defaults specified in specs to fill in fields of widgRec that are  not  specified
       in  objv.   Tk_ConfigureWidget normally returns the value TCL_OK; in this case it does not modify interp.
       If an error occurs then TCL_ERROR is returned and Tk_ConfigureWidget  will  leave  an  error  message  in
       interpreter  interp's  result  in the standard Tcl fashion.  In the event of an error return, some of the
       fields of widgRec could already have been set, if configuration information  for  them  was  successfully
       processed  before  the error occurred.  The other fields will be set to reasonable initial values so that
       Tk_FreeOptions can be called for cleanup.

       The specs array specifies the kinds of configuration options expected by the widget.  Each of its entries
       specifies one configuration option and has the following structure:
              typedef struct {
                  int type;
                  const char *argvName;
                  const char *dbName;
                  const char *dbClass;
                  const char *defValue;
                  Tcl_Size offset;
                  int specFlags;
                  const Tk_CustomOption *customPtr;
              } Tk_ConfigSpec;
       The type field indicates what type of configuration option this is  (e.g.  TK_CONFIG_COLOR  for  a  color
       value,  or  TK_CONFIG_INT  for  an  integer value).  The type field indicates how to use the value of the
       option (more on this below).  The argvName field is a string such as “-font” or “-bg”, which is  compared
       with  the  values  in  objv  (if  argvName is NULL it means this is a grouped entry;  see GROUPED ENTRIES
       below).  The dbName and dbClass fields are used to look  up  a  value  for  this  option  in  the  option
       database.   The  defValue  field  specifies  a default value for this configuration option if no value is
       specified in either objv or the option database.  Offset indicates where in widgRec to store  information
       about  this  option,  and  specFlags  contains  additional  information to control the processing of this
       configuration  option  (see  FLAGS  below).   The  last  field,  customPtr,  is  only  used  if  type  is
       TK_CONFIG_CUSTOM;  see CUSTOM OPTION TYPES below.

       Tk_ConfigureWidget  first processes objv to see which (if any) configuration options are specified there.
       Argv must contain an even number of fields;  the first of each pair of fields must match the argvName  of
       some  entry in specs (unique abbreviations are acceptable), and the second field of the pair contains the
       value for that configuration option.  If there are entries in spec  for  which  there  were  no  matching
       entries  in  objv,  Tk_ConfigureWidget uses the dbName and dbClass fields of the specs entry to probe the
       option database;  if a value is found, then it is used as the value for the option.  Finally, if no entry
       is found in the option database, the defValue field of the specs entry is  used  as  the  value  for  the
       configuration option.  If the defValue is NULL, or if the TK_CONFIG_DONT_SET_DEFAULT bit is set in flags,
       then  there  is no default value and this specs entry will be ignored if no value is specified in objv or
       the option database.

       Once a string value has been determined for a configuration  option,  Tk_ConfigureWidget  translates  the
       string value into a more useful form, such as a color if type is TK_CONFIG_COLOR or an integer if type is
       TK_CONFIG_INT.  This value is then stored in the record pointed to by widgRec.  This record is assumed to
       contain   information   relevant   to  the  manager  of  the  widget;   its  exact  type  is  unknown  to
       Tk_ConfigureWidget.  The offset field of each specs  entry  indicates  where  in  widgRec  to  store  the
       information  about  this  configuration  option.   You  should  use the offsetof macro to generate offset
       values.  The location indicated by widgRec and offset  will  be  referred  to  as  the  “target”  in  the
       descriptions below.

       The  type  field of each entry in specs determines what to do with the string value of that configuration
       option.  The legal values for type, and the corresponding actions, are:

       TK_CONFIG_ACTIVE_CURSOR
              The value must be an ASCII string  identifying  a  cursor  in  a  form  suitable  for  passing  to
              Tk_GetCursor.   The  value  is  converted to a Tk_Cursor by calling Tk_GetCursor and the result is
              stored in the target.  In addition, the resulting cursor is made the active cursor  for  tkwin  by
              calling  XDefineCursor.   If  TK_CONFIG_NULL_OK is specified in specFlags then the value may be an
              empty string, in which case the target and tkwin's active cursor will be  set  to  None.   If  the
              previous value of the target was not None, then it is freed by passing it to Tk_FreeCursor.

       TK_CONFIG_ANCHOR
              The  value  must  be  an  ASCII  string identifying an anchor point in one of the ways accepted by
              Tk_GetAnchor.  The string is converted to a Tk_Anchor by calling Tk_GetAnchor and  the  result  is
              stored in the target.

       TK_CONFIG_BITMAP
              The  value  must  be  an  ASCII  string  identifying  a  bitmap  in a form suitable for passing to
              Tk_GetBitmap.  The value is converted to a Pixmap by calling Tk_GetBitmap and the result is stored
              in the target.  If TK_CONFIG_NULL_OK is specified in specFlags then the  value  may  be  an  empty
              string,  in  which  case  the  target is set to None.  If the previous value of the target was not
              None, then it is freed by passing it to Tk_FreeBitmap.

       TK_CONFIG_BOOLEAN
              The value must be an ASCII string specifying a boolean value.  Any of the  values  “true”,  “yes”,
              “on”,  or  “1”,  or an abbreviation of one of these values, means true; any of the values “false”,
              “no”, “off”, or “0”, or an abbreviation of one of  these  values,  means  false.   The  target  is
              expected  to  be  an integer;  for true values it will be set to 1 and for false values it will be
              set to 0.

       TK_CONFIG_BORDER
              The value must be an ASCII string identifying a border color in a form  suitable  for  passing  to
              Tk_Get3DBorder.   The  value  is  converted to a (Tk_3DBorder *) by calling Tk_Get3DBorder and the
              result is stored in the target.  If TK_CONFIG_NULL_OK is specified in specFlags then the value may
              be an empty string, in which case the target will be set to NULL.  If the previous  value  of  the
              target was not NULL, then it is freed by passing it to Tk_Free3DBorder.

       TK_CONFIG_CAP_STYLE
              The  value  must  be  an  ASCII  string  identifying  a  cap  style in one of the ways accepted by
              Tk_GetCapStyle.  The string is converted to an integer value corresponding to  the  cap  style  by
              calling Tk_GetCapStyle and the result is stored in the target.

       TK_CONFIG_COLOR
              The  value  must  be  an  ASCII  string  identifying  a  color  in  a form suitable for passing to
              Tk_GetColor.  The value is converted to an (XColor *) by calling Tk_GetColor  and  the  result  is
              stored  in  the  target.   If TK_CONFIG_NULL_OK is specified in specFlags then the value may be an
              empty string, in which case the target will be set to None.  If the previous value of  the  target
              was not NULL, then it is freed by passing it to Tk_FreeColor.

       TK_CONFIG_CURSOR
              This  option  is  identical  to TK_CONFIG_ACTIVE_CURSOR except that the new cursor is not made the
              active one for tkwin.

       TK_CONFIG_CUSTOM
              This option allows applications to define new option types.  The  customPtr  field  of  the  entry
              points to a structure defining the new option type.  See the section CUSTOM OPTION TYPES below for
              details.

       TK_CONFIG_DOUBLE
              The  value must be an ASCII floating-point number in the format accepted by strtol.  The string is
              converted to a double value, and the value is stored in the target.

       TK_CONFIG_END
              Marks the end of the table.  The last entry in specs must have this type;  all of its other fields
              are ignored and it will never match any arguments.

       TK_CONFIG_FONT
              The value must be an ASCII string identifying a font in a form suitable for passing to Tk_GetFont.
              The value is converted to a Tk_Font by calling Tk_GetFont and the result is stored in the  target.
              If  TK_CONFIG_NULL_OK  is  specified  in specFlags then the value may be an empty string, in which
              case the target will be set to NULL.  If the previous value of the target was not NULL, then it is
              freed by passing it to Tk_FreeFont.

       TK_CONFIG_INT
              The value must be an ASCII integer string in the format accepted by strtol  (e.g.   “0”  and  “0x”
              prefixes  may  be  used  to  specify  octal  or hexadecimal numbers, respectively).  The string is
              converted to an integer value and the integer is stored in the target.

       TK_CONFIG_JOIN_STYLE
              The value must be an ASCII string identifying a  join  style  in  one  of  the  ways  accepted  by
              Tk_GetJoinStyle.   The  string is converted to an integer value corresponding to the join style by
              calling Tk_GetJoinStyle and the result is stored in the target.

       TK_CONFIG_JUSTIFY
              The value must be an ASCII string identifying a justification method in one of the  ways  accepted
              by Tk_GetJustify.  The string is converted to a Tk_Justify by calling Tk_GetJustify and the result
              is stored in the target.

       TK_CONFIG_MM
              The  value  must  specify a screen distance in one of the forms acceptable to Tk_GetScreenMM.  The
              string is converted to double-precision floating-point distance in millimeters and  the  value  is
              stored in the target.

       TK_CONFIG_PIXELS
              The value must specify screen units in one of the forms acceptable to Tk_GetPixels.  The string is
              converted to an integer distance in pixels and the value is stored in the target.

       TK_CONFIG_RELIEF
              The  value  must  be  an  ASCII  string  identifying  a  relief  in a form suitable for passing to
              Tk_GetRelief.  The value is converted to an integer relief value by calling Tk_GetRelief  and  the
              result is stored in the target.

       TK_CONFIG_STRING
              A  copy  of the value is made by allocating memory space with Tcl_Alloc and copying the value into
              the dynamically-allocated space.  A pointer to the  new  string  is  stored  in  the  target.   If
              TK_CONFIG_NULL_OK  is  specified in specFlags then the value may be an empty string, in which case
              the target will be set to NULL.  If the previous value of the target was  not  NULL,  then  it  is
              freed by passing it to Tcl_Free.

       TK_CONFIG_SYNONYM
              This  type  value  identifies special entries in specs that are synonyms for other entries.  If an
              objv value matches the argvName of a TK_CONFIG_SYNONYM entry, the  entry  is  not  used  directly.
              Instead,  Tk_ConfigureWidget  searches  specs  for another entry whose argvName is the same as the
              dbName field in the TK_CONFIG_SYNONYM entry;  this new entry is used just as if its  argvName  had
              matched the objv value.  The synonym mechanism allows multiple objv values to be used for a single
              configuration option, such as “-background” and “-bg”.

       TK_CONFIG_UID
              The  value  is translated to a Tk_Uid (by passing it to Tk_GetUid).  The resulting value is stored
              in the target.  If TK_CONFIG_NULL_OK is specified in specFlags and the value is  an  empty  string
              then the target will be set to NULL.

       TK_CONFIG_WINDOW
              The  value  must  be  a  window path name.  It is translated to a Tk_Window token and the token is
              stored in the target.

GROUPED ENTRIES

       In some cases it is useful to generate  multiple  resources  from  a  single  configuration  value.   For
       example,  a  color  name  might  be  used  both  to  generate  the  background  color for a widget (using
       TK_CONFIG_COLOR) and to generate a 3-D border to draw around the  widget  (using  TK_CONFIG_BORDER).   In
       cases  like this it is possible to specify that several consecutive entries in specs are to be treated as
       a group.  The first entry is used to determine a value (using its argvName, dbName, dbClass, and defValue
       fields).  The value will be processed several times  (one  for  each  entry  in  the  group),  generating
       multiple  different  resources  and modifying multiple targets within widgRec.  Each of the entries after
       the first must have a NULL value in its argvName field;  this indicates that the entry is to  be  grouped
       with the entry that precedes it.  Only the type and offset fields are used from these follow-on entries.

FLAGS

       The  flags  argument passed to Tk_ConfigureWidget is used in conjunction with the specFlags fields in the
       entries of specs to provide additional control over  the  processing  of  configuration  options.   These
       values are used in three different ways as described below.

       First,  if  the  flags  argument to Tk_ConfigureWidget has the TK_CONFIG_ARGV_ONLY bit set (i.e., flags |
       TK_CONFIG_ARGV_ONLY != 0), then the option database and defValue fields are not used.  In this  case,  if
       an  entry  in  specs does not match a field in objv then nothing happens: the corresponding target is not
       modified.  This feature is useful when the goal is to modify certain configuration options while  leaving
       others in their current state, such as when a configure widget command is being processed.

       Second,  the  specFlags  field  of an entry in specs may be used to control the processing of that entry.
       Each specFlags field may consists of an OR-ed combination of the following values:

       TK_CONFIG_COLOR_ONLY
              If this bit is set then the entry will only be considered if the display for tkwin has  more  than
              one bit plane.  If the display is monochromatic then this specs entry will be ignored.

       TK_CONFIG_MONO_ONLY
              If this bit is set then the entry will only be considered if the display for tkwin has exactly one
              bit plane.  If the display is not monochromatic then this specs entry will be ignored.

       TK_CONFIG_NULL_OK
              This  bit  is  only  relevant for some types of entries (see the descriptions of the various entry
              types above).  If this bit is set, it indicates that an  empty  string  value  for  the  field  is
              acceptable  and  if it occurs then the target should be set to NULL or None, depending on the type
              of the target.  This flag is typically used to allow a feature to be turned off entirely, e.g. set
              a cursor value to None so that a window simply inherits its parent's cursor.  If this bit  is  not
              set then empty strings are processed as strings, which generally results in an error.

       TK_CONFIG_DONT_SET_DEFAULT
              If  this  bit  is  one,  it  means  that  the  defValue field of the entry should only be used for
              returning the default value in Tk_ConfigureInfo.  In calls to Tk_ConfigureWidget no  default  will
              be  supplied for entries with this flag set;  it is assumed that the caller has already supplied a
              default value in the target location.  This flag provides a performance optimization where  it  is
              expensive to process the default string:  the client can compute the default once, save the value,
              and provide it before calling Tk_ConfigureWidget.

       The  TK_CONFIG_MONO_ONLY  and  TK_CONFIG_COLOR_ONLY flags are typically used to specify different default
       values for monochrome and color displays.  This is done  by  creating  two  entries  in  specs  that  are
       identical   except   for  their  defValue  and  specFlags  fields.   One  entry  should  have  the  value
       TK_CONFIG_MONO_ONLY in its specFlags and the default value for monochrome displays in its defValue;   the
       other  entry should have the value TK_CONFIG_COLOR_ONLY in its specFlags and the appropriate defValue for
       color displays.

       Third, it is possible to use flags and specFlags together to  selectively  disable  some  entries.   This
       feature  is  not  needed  very  often.   It is useful in cases where several similar kinds of widgets are
       implemented in one place.  It allows a single specs table  to  be  created  with  all  the  configuration
       options  for  all  the  widget types.  When processing a particular widget type, only entries relevant to
       that type will be used.  This effect is achieved by setting the high-order bits (those in positions equal
       to or greater than TK_CONFIG_USER_BIT) in specFlags values or in flags.  In order for a particular  entry
       in specs to be used, its high-order bits must match exactly the high-order bits of the flags value passed
       to  Tk_ConfigureWidget.  If a specs table is being used for N different widget types, then N of the high-
       order bits will be used.  Each specs entry will have one of more of those bits set in its specFlags field
       to indicate the widget types for which this entry is valid.  When calling Tk_ConfigureWidget, flags  will
       have  a  single  one  of these bits set to select the entries for the desired widget type.  For a working
       example of this feature, see the code in tkButton.c.

TK_CONFIGUREINFO

       The Tk_ConfigureInfo procedure may be used to obtain information about one or all of the  options  for  a
       given  widget.   Given  a  token for a window (tkwin), a table describing the configuration options for a
       class of widgets (specs), a pointer to a widget record containing the current information  for  a  widget
       (widgRec),  and  a  NULL  argvName  argument,  Tk_ConfigureInfo  generates a string describing all of the
       configuration options for the window.  The string is placed in interpreter interp's result.  Under normal
       circumstances it returns TCL_OK;  if an error occurs then it  returns  TCL_ERROR  and  the  interpreter's
       result will contain an error message.

       If  argvName  is  NULL, then the value left in the interpreter's result by Tk_ConfigureInfo consists of a
       list of one or more entries, each of which describes one configuration option (i.e. one entry in  specs).
       Each  entry  in the list will contain either two or five values.  If the corresponding entry in specs has
       type TK_CONFIG_SYNONYM, then the list will contain two values:  the argvName for the entry and the dbName
       (synonym name).  Otherwise the list will contain five values:  argvName, dbName, dbClass,  defValue,  and
       current value.  The current value is computed from the appropriate field of widgRec by calling procedures
       like Tk_NameOfColor.

       If  the  argvName  argument  to  Tk_ConfigureInfo  is  non-NULL,  then  it indicates a single option, and
       information is returned only for that option.  The string placed in the interpreter's result  will  be  a
       list  containing  two  or  five  values  as described above;  this will be identical to the corresponding
       sublist that would have been returned if argvName had been NULL.

       The flags argument to Tk_ConfigureInfo is used to restrict the specs entries to  consider,  just  as  for
       Tk_ConfigureWidget.

TK_CONFIGUREVALUE

       Tk_ConfigureValue  takes arguments similar to Tk_ConfigureInfo; instead of returning a list of values, it
       just returns the current value of the option given by argvName (argvName must not be NULL).  The value is
       returned in interpreter interp's result and TCL_OK is normally returned as the procedure's result.  If an
       error occurs in Tk_ConfigureValue (e.g., argvName is not a valid option name), TCL_ERROR is returned  and
       an  error  message  is left in the interpreter's result.  This procedure is typically called to implement
       cget widget commands.

TK_FREEOPTIONS

       The Tk_FreeOptions procedure may be invoked during  widget  cleanup  to  release  all  of  the  resources
       associated  with  configuration  options.   It  scans through specs and for each entry corresponding to a
       resource that must be explicitly freed (e.g. those with type TK_CONFIG_COLOR), it frees the  resource  in
       the  widget  record.  If the field in the widget record does not refer to a resource (e.g.  it contains a
       null pointer) then no resource is freed for that entry.  After freeing a  resource,  Tk_FreeOptions  sets
       the corresponding field of the widget record to null.

CUSTOM OPTION TYPES

       Applications  can  extend the built-in configuration types with additional configuration types by writing
       procedures to parse and print options  of  the  a  type  and  creating  a  structure  pointing  to  those
       procedures:
              typedef struct {
                  Tk_OptionParseProc *parseProc;
                  Tk_OptionPrintProc *printProc;
                  void *clientData;
              } Tk_CustomOption;

              typedef int Tk_OptionParseProc(
                      void *clientData,
                      Tcl_Interp *interp,
                      Tk_Window tkwin,
                      const char *value,
                      char *widgRec,
                      Tcl_Size offset);

              typedef const char *Tk_OptionPrintProc(
                      void *clientData,
                      Tk_Window tkwin,
                      char *widgRec,
                      Tcl_Size offset,
                      Tcl_FreeProc **freeProcPtr);
       The  Tk_CustomOption  structure  contains  three  fields,  which are pointers to the two procedures and a
       clientData value to be passed to those procedures when they are invoked.  The clientData value  typically
       points  to  a structure containing information that is needed by the procedures when they are parsing and
       printing options.

       The parseProc procedure is invoked by Tk_ConfigureWidget to parse a string and store the resulting  value
       in  the  widget record.  The clientData argument is a copy of the clientData field in the Tk_CustomOption
       structure.  The interp argument points to a Tcl interpreter used for error reporting.  Tkwin is a copy of
       the tkwin argument to Tk_ConfigureWidget.  The value argument is a string describing the  value  for  the
       option;   it could have been specified explicitly in the call to Tk_ConfigureWidget or it could come from
       the option database or a default.  Value will never be a null pointer  but  it  may  point  to  an  empty
       string.   RecordPtr is the same as the widgRec argument to Tk_ConfigureWidget;  it points to the start of
       the widget record to modify.  The last argument, offset, gives the offset in bytes from the start of  the
       widget record to the location where the option value is to be placed.  The procedure should translate the
       string  to  whatever  form  is  appropriate  for the option and store the value in the widget record.  It
       should normally return TCL_OK, but if an error occurs in translating the string to a value then it should
       return TCL_ERROR and store an error message in interpreter interp's result.

       The printProc procedure is called by Tk_ConfigureInfo to produce a string value  describing  an  existing
       option.   Its  clientData,  tkwin,  widgRec,  and  offset  arguments  all  have  the  same meaning as for
       Tk_OptionParseProc procedures.  The printProc procedure should examine the option whose value  is  stored
       at  offset  in  widgRec, produce a string describing that option, and return a pointer to the string.  If
       the string is stored in dynamically-allocated memory, then the procedure must  set  *freeProcPtr  to  the
       address  of  a  procedure to call to free the string's memory;  Tk_ConfigureInfo will call this procedure
       when it is finished with the string.  If the result string is stored in static memory then printProc need
       not do anything with the freeProcPtr argument.

       Once parseProc and printProc have been defined and a Tk_CustomOption structure has been created for them,
       options of  this  new  type  may  be  manipulated  with  Tk_ConfigSpec  entries  whose  type  fields  are
       TK_CONFIG_CUSTOM and whose customPtr fields point to the Tk_CustomOption structure.

EXAMPLES

       Although  the  explanation  of  Tk_ConfigureWidget  is  fairly  complicated,  its  actual  use  is pretty
       straightforward.  The easiest way to get started is to copy  the  code  from  an  existing  widget.   The
       library  implementation  of  frames  (tkFrame.c)  has  a  simple  configuration  table,  and  the library
       implementation of buttons (tkButton.c) has a much  more  complex  table  that  uses  many  of  the  fancy
       specFlags mechanisms.

SEE ALSO

       Tk_SetOptions(3tk)

KEYWORDS

       anchor,  bitmap,  boolean, border, cap style, color, configuration options, cursor, custom, double, font,
       integer, join style, justify, millimeters, pixels, relief, synonym, uid

Tk                                                     4.1                               Tk_ConfigureWidget(3tk)