Provided by: tk8.6-doc_8.6.14-1build1_all bug

NAME

       Tk_CreateOptionTable,    Tk_DeleteOptionTable,    Tk_InitOptions,   Tk_SetOptions,   Tk_FreeSavedOptions,
       Tk_RestoreSavedOptions, Tk_GetOptionValue,  Tk_GetOptionInfo, Tk_FreeConfigOptions, Tk_Offset  -  process
       configuration options

SYNOPSIS

       #include <tk.h>

       Tk_OptionTable
       Tk_CreateOptionTable(interp, templatePtr)

       Tk_DeleteOptionTable(optionTable)

       int
       Tk_InitOptions(interp, recordPtr, optionTable, tkwin)

       int
       Tk_SetOptions(interp, recordPtr, optionTable, objc, objv, tkwin, savePtr, maskPtr)

       Tk_FreeSavedOptions(savedPtr)

       Tk_RestoreSavedOptions(savedPtr)

       Tcl_Obj *
       Tk_GetOptionValue(interp, recordPtr, optionTable, namePtr, tkwin)

       Tcl_Obj *
       Tk_GetOptionInfo(interp, recordPtr, optionTable, namePtr, tkwin)

       Tk_FreeConfigOptions(recordPtr, optionTable, tkwin)

       int
       Tk_Offset(type, field)

ARGUMENTS

       Tcl_Interp *interp (in)                     A  Tcl  interpreter.   Most  procedures  use  this  only  for
                                                   returning error  messages;  if  it  is  NULL  then  no  error
                                                   messages  are  returned.   For Tk_CreateOptionTable the value
                                                   cannot be NULL; it gives the interpreter in which the  option
                                                   table will be used.

       const Tk_OptionSpec *templatePtr (in)       Points  to  an array of static information that describes the
                                                   configuration options that are supported.  Used  to  build  a
                                                   Tk_OptionTable.   The information pointed to by this argument
                                                   must exist for the lifetime of the Tk_OptionTable.

       Tk_OptionTable optionTable (in)             Token for an option table.  Must  have  been  returned  by  a
                                                   previous call to Tk_CreateOptionTable.

       char *recordPtr (in/out)                    Points  to structure in which values of configuration options
                                                   are stored; fields of this record are modified by  procedures
                                                   such   as  Tk_SetOptions  and  read  by  procedures  such  as
                                                   Tk_GetOptionValue.

       Tk_Window tkwin (in)                        For options such as TK_OPTION_COLOR, this argument  indicates
                                                   the  window in which the option will be used.  If optionTable
                                                   uses no window-dependent options, then a NULL  value  may  be
                                                   supplied for this argument.

       int objc (in)                               Number of values in objv.

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

       Tk_SavedOptions *savePtr (out)              If  not  NULL,  the  structure pointed to by this argument is
                                                   filled in with the  old  values  of  any  options  that  were
                                                   modified  and  old  values  are  restored automatically if an
                                                   error occurs in Tk_SetOptions.

       int *maskPtr (out)                          If not NULL, the word pointed to by maskPtr is filled in with
                                                   the  bit-wise  OR of the typeMask fields for the options that
                                                   were modified.

       Tk_SavedOptions *savedPtr (in/out)          Points to a structure previously filled in  by  Tk_SetOptions
                                                   with old values of modified options.

       Tcl_Obj *namePtr (in)                       The  value of this object is the name of a particular option.
                                                   If NULL is passed to  Tk_GetOptionInfo  then  information  is
                                                   returned   for   all   options.    Must   not  be  NULL  when
                                                   Tk_GetOptionValue is called.

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

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

DESCRIPTION

       These procedures handle most of the details of  parsing  configuration  options  such  as  those  for  Tk
       widgets.   Given  a description of what options are supported, these procedures handle all the details of
       parsing options and storing their values into a C structure associated with the  widget  or  object.  The
       procedures  were  designed  primarily  for  widgets  in  Tk, but they can also be used for other kinds of
       objects that have configuration options.  In the rest of this manual page “widget” will be used to  refer
       to  the object whose options are being managed; in practice the object may not actually be a widget.  The
       term “widget record” is used to refer to the C-level structure in which information  about  a  particular
       widget or object is stored.

       Note:  the  easiest way to learn how to use these procedures is to look at a working example.  In Tk, the
       simplest example is the code that implements the button family of widgets, which is in tkButton.c.  Other
       examples are in tkSquare.c and tkMenu.c.

       In  order  to  use  these  procedures, the code that implements the widget must contain a static array of
       Tk_OptionSpec structures. This is a template that describes the various options supported by  that  class
       of  widget; there is a separate template for each kind of widget.  The template contains information such
       as the name of each option, its type, its default value, and where the value of the option is  stored  in
       the widget record.  See TEMPLATES below for more detail.

       In  order  to  process  configuration  options  efficiently,  the  static template must be augmented with
       additional information that is available only at runtime.   The  procedure  Tk_CreateOptionTable  creates
       this  dynamic  information  from  the template and returns a Tk_OptionTable token that describes both the
       static  and  dynamic  information.   All  of  the  other  procedures,  such  as  Tk_SetOptions,  take   a
       Tk_OptionTable token as argument.  Typically, Tk_CreateOptionTable is called the first time that a widget
       of a particular class is created and the resulting Tk_OptionTable is used in the future for  all  widgets
       of  that  class.  A Tk_OptionTable may be used only in a single interpreter, given by the interp argument
       to Tk_CreateOptionTable.  When an option table is no longer needed Tk_DeleteOptionTable should be  called
       to  free all of its resources.  All of the option tables for a Tcl interpreter are freed automatically if
       the interpreter is deleted.

       Tk_InitOptions is invoked when a new widget is created to set  the  default  values.   Tk_InitOptions  is
       passed  a  token for an option table (optionTable) and a pointer to a widget record (recordPtr), which is
       the C structure that holds information about this widget.  Tk_InitOptions uses  the  information  in  the
       option  table to choose an appropriate default for each option, then it stores the default value directly
       into the widget record, overwriting any information that  was  already  present  in  the  widget  record.
       Tk_InitOptions  normally  returns  TCL_OK.   If an error occurred while setting the default values (e.g.,
       because a default value was erroneous) then TCL_ERROR is  returned  and  an  error  message  is  left  in
       interp's   result   if   interp   is   not   NULL.   For  any  widget's  configuration  option  that  has
       TK_OPTION_DONT_SET_DEFAULT set in its flags field, the above initialization is fully skipped, see below.

       Tk_SetOptions is invoked to modify configuration options based on information specified in a Tcl command.
       The  command  might  be  one that creates a new widget, or a command that modifies options on an existing
       widget.  The objc and objv arguments describe the values of the arguments from  the  Tcl  command.   Objv
       must contain an even number of objects: the first object of each pair gives the name of an option and the
       second object gives the new value for that option.  Tk_SetOptions looks  up  each  name  in  optionTable,
       checks  that the new value of the option conforms to the type in optionTable, and stores the value of the
       option into the widget record given by recordPtr.  Tk_SetOptions normally returns TCL_OK.   If  an  error
       occurred  (such  as  an unknown option name or an illegal option value) then TCL_ERROR is returned and an
       error message is left in interp's result if interp is not NULL.

       Tk_SetOptions has two additional features.  First, if the maskPtr argument is not NULL then it points  to
       an  integer  value  that  is  filled  in with information about the options that were modified.  For each
       option in the template passed to Tk_CreateOptionTable there is a typeMask field.  The bits of this  field
       are  defined  by  the  code  that  implements  the  widget;  for  example, each bit might correspond to a
       particular configuration option.  Alternatively, bits might be used functionally.  For example,  one  bit
       might  be used for redisplay: all options that affect the widget's display, such that changing the option
       requires the widget to be redisplayed, might have that bit set.  Another  bit  might  indicate  that  the
       geometry  of  the  widget must be recomputed, and so on.  Tk_SetOptions OR's together the typeMask fields
       from all the options that were modified and returns this value at *maskPtr; the caller can then use  this
       information  to  optimize  itself  so that, for example, it does not redisplay the widget if the modified
       options do not affect the widget's appearance.

       The second additional feature of Tk_SetOptions has to do with error recovery.  If an error  occurs  while
       processing configuration options, this feature makes it possible to restore all the configuration options
       to their previous values.  Errors can occur either while processing options in Tk_SetOptions or later  in
       the  caller.   In  many  cases  the  caller  does  additional processing after Tk_SetOptions returns; for
       example, it might use an option value to set a trace on a  variable  and  may  detect  an  error  if  the
       variable  is  an array instead of a scalar.  Error recovery is enabled by passing in a non-NULL value for
       the savePtr argument to Tk_SetOptions; this should be  a  pointer  to  an  uninitialized  Tk_SavedOptions
       structure  on  the  caller's  stack.   Tk_SetOptions  overwrites the structure pointed to by savePtr with
       information about the old values of any options modified by  the  procedure.   If  Tk_SetOptions  returns
       successfully,  the  caller uses the structure in one of two ways.  If the caller completes its processing
       of the new options without any errors, then it must pass the structure to Tk_FreeSavedOptions so that the
       old  values  can  be freed.  If the caller detects an error in its processing of the new options, then it
       should pass the structure to Tk_RestoreSavedOptions, which will copy the old values back into the  widget
       record  and  free  the  new values.  If Tk_SetOptions detects an error then it automatically restores any
       options that had already been modified and leaves *savePtr in an empty state: the caller  need  not  call
       either  Tk_FreeSavedOptions  or Tk_RestoreSavedOptions.  If the savePtr argument to Tk_SetOptions is NULL
       then Tk_SetOptions frees each old option value immediately when it sets a new value for the  option.   In
       this  case,  if  an  error occurs in the third option, the old values for the first two options cannot be
       restored.

       Tk_GetOptionValue returns the current value of a configuration  option  for  a  particular  widget.   The
       namePtr  argument contains the name of an option; Tk_GetOptionValue uses optionTable to lookup the option
       and extract its value from the widget  record  pointed  to  by  recordPtr,  then  it  returns  an  object
       containing  that  value.  If an error occurs (e.g., because namePtr contains an unknown option name) then
       NULL is returned and an error message is left in interp's result unless interp is NULL.

       Tk_GetOptionInfo returns information about configuration options in a form suitable for configure  widget
       commands.   If  the  namePtr  argument  is  not  NULL,  it  points  to an object that gives the name of a
       configuration option; Tk_GetOptionInfo returns an object containing a list with five elements, which  are
       the  name of the option, the name and class used for the option in the option database, the default value
       for the option, and  the  current  value  for  the  option.   If  the  namePtr  argument  is  NULL,  then
       Tk_GetOptionInfo  returns  information  about  all  options  in the form of a list of lists; each sublist
       describes one option.  Synonym options are handled differently depending on whether namePtr is  NULL:  if
       namePtr is NULL then the sublist for each synonym option has only two elements, which are the name of the
       option and the name of the other option that it refers to; if namePtr is non-NULL  and  names  a  synonym
       option then the object returned is the five-element list for the other option that the synonym refers to.
       If an error occurs (e.g., because namePtr contains an unknown option name) then NULL is returned  and  an
       error message is left in interp's result unless interp is NULL.

       Tk_FreeConfigOptions  must be invoked when a widget is deleted.  It frees all of the resources associated
       with any of the configuration options defined in recordPtr by optionTable.

       The Tk_Offset macro is provided as a safe way of generating the objOffset and internalOffset  values  for
       entries  in Tk_OptionSpec structures.  It takes two arguments: the name of a type of record, and the name
       of a field in that record. It returns the byte offset of the named field in records of the given type.

TEMPLATES

       The array of Tk_OptionSpec  structures  passed  to  Tk_CreateOptionTable  via  its  templatePtr  argument
       describes the configuration options supported by a particular class of widgets.  Each structure specifies
       one configuration option and has the following fields:
              typedef struct {
                  Tk_OptionType type;
                  const char *optionName;
                  const char *dbName;
                  const char *dbClass;
                  const char *defValue;
                  int objOffset;
                  int internalOffset;
                  int flags;
                  const void *clientData;
                  int typeMask;
              } Tk_OptionSpec;
       The type field indicates what kind of configuration option this is  (e.g.  TK_OPTION_COLOR  for  a  color
       value,  or  TK_OPTION_INT  for  an integer value).  Type determines how the value of the option is parsed
       (more on this below).  The optionName field is a string such as -font or -bg; it is the name used for the
       option  in  Tcl  commands  and  passed  to  procedures via the objc or namePtr arguments.  The dbName and
       dbClass fields are used by Tk_InitOptions to look up a default  value  for  this  option  in  the  option
       database;  if dbName is NULL then the option database is not used by Tk_InitOptions for this option.  The
       defValue field specifies a default value for this configuration option if no value is  specified  in  the
       option  database.   The  objOffset  and  internalOffset  fields indicate where to store the value of this
       option in widget records (more on this below); values for the objOffset and internalOffset fields  should
       always be generated with the Tk_Offset macro.  The flags field contains additional information to control
       the processing of this configuration option (see below  for  details).   ClientData  provides  additional
       type-specific  data  needed  by  certain types.  For instance, for TK_OPTION_COLOR types, clientData is a
       string giving the default value to use on monochrome displays.  See the  descriptions  of  the  different
       types  below for details.  The last field, typeMask, is used by Tk_SetOptions to return information about
       which options were modified; see the description of Tk_SetOptions above for details.

       When Tk_InitOptions and Tk_SetOptions store the value of an option into the widget record, they can do it
       in  either  of  two  ways.  If the objOffset field of the Tk_OptionSpec is greater than or equal to zero,
       then the value of the option is stored as a (Tcl_Obj *) at the location in the  widget  record  given  by
       objOffset.   If  the internalOffset field of the Tk_OptionSpec is greater than or equal to zero, then the
       value of the option is stored in a type-specific internal form at the location in the widget record given
       by  internalOffset.   For  example,  if  the  option's type is TK_OPTION_INT then the internal form is an
       integer.  If the objOffset or internalOffset field is negative then the value is not stored in that form.
       At least one of the offsets must be greater than or equal to zero.

       The flags field consists of one or more bits ORed together. The following flags are supported:

       TK_OPTION_NULL_OK
              If this bit is set for an option then an empty string will be accepted as the value for the option
              and the resulting internal form will be a NULL pointer, a zero value, or None,  depending  on  the
              type  of  the  option.   If  the  flag  is  not  set  then  empty  strings  will result in errors.
              TK_OPTION_NULL_OK 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.  Not all option types
              support the TK_OPTION_NULL_OK flag; for those that do, there is an  explicit  indication  of  that
              fact in the descriptions below.

       TK_OPTION_DONT_SET_DEFAULT
              If  this  bit  is  set  for an option then no default value will be set in Tk_InitOptions for this
              option. Neither the option database, nor any system default value, nor  optionTable  are  used  to
              give  a default value to this option. Instead it is assumed that the caller has already supplied a
              default value in the widget code.

       The type field of each Tk_OptionSpec structure determines how to parse the value  of  that  configuration
       option.  The  legal  value  for  type,  and  the corresponding actions, are described below.  If the type
       requires a tkwin value to be passed into procedures like Tk_SetOptions, or  if  it  uses  the  clientData
       field  of the Tk_OptionSpec, then it is indicated explicitly; if not mentioned, the type requires neither
       tkwin nor clientData.

       TK_OPTION_ANCHOR
              The value must be a standard anchor position such as  ne  or  center.   The  internal  form  is  a
              Tk_Anchor value like the ones returned by Tk_GetAnchorFromObj.

       TK_OPTION_BITMAP
              The  value  must  be  a standard Tk bitmap name. The internal form is a Pixmap token like the ones
              returned by Tk_AllocBitmapFromObj.  This option type requires tkwin to be supplied  to  procedures
              such as Tk_SetOptions, and it supports the TK_OPTION_NULL_OK flag.

       TK_OPTION_BOOLEAN
              The  value  must  be a standard boolean value such as true or no.  The internal form is an integer
              with value 0 or 1.

       TK_OPTION_BORDER
              The value must be a standard color  name  such  as  red  or  #ff8080.   The  internal  form  is  a
              Tk_3DBorder  token  like  the ones returned by Tk_Alloc3DBorderFromObj.  This option type requires
              tkwin to be supplied to procedures such as Tk_SetOptions, and it  supports  the  TK_OPTION_NULL_OK
              flag.

       TK_OPTION_COLOR
              The  value  must be a standard color name such as red or #ff8080.  The internal form is an (XColor
              *) token like the ones returned by Tk_AllocColorFromObj.  This option type requires  tkwin  to  be
              supplied to procedures such as Tk_SetOptions, and it supports the TK_OPTION_NULL_OK flag.

       TK_OPTION_CURSOR
              The  value must be a standard cursor name such as cross or @foo.  The internal form is a Tk_Cursor
              token like the ones returned by Tk_AllocCursorFromObj.  This option  type  requires  tkwin  to  be
              supplied to procedures such as Tk_SetOptions, and when the option is set the cursor for the window
              is changed by calling XDefineCursor.  This option type also supports the TK_OPTION_NULL_OK flag.

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

       TK_OPTION_DOUBLE
              The string value must be a floating-point number in the format accepted by strtol.   The  internal
              form  is  a C double value.  This option type supports the TK_OPTION_NULL_OK flag; if a NULL value
              is set, the internal representation is set to zero.

       TK_OPTION_END
              Marks the end of the template.  There must be a Tk_OptionSpec structure with type TK_OPTION_END at
              the  end  of each template.  If the clientData field of this structure is not NULL, then it points
              to an additional array of Tk_OptionSpec's, which is itself  terminated  by  another  TK_OPTION_END
              entry.   Templates  may  be  chained arbitrarily deeply.  This feature allows common options to be
              shared by several widget classes.

       TK_OPTION_FONT
              The value must be a standard font name such as Times 16.  The internal form is  a  Tk_Font  handle
              like  the ones returned by Tk_AllocFontFromObj.  This option type requires tkwin to be supplied to
              procedures such as Tk_SetOptions, and it supports the TK_OPTION_NULL_OK flag.

       TK_OPTION_INT
              The string value must be an integer in the format accepted by strtol (e.g. 0 and 0x  prefixes  may
              be  used  to  specify  octal  or hexadecimal numbers, respectively).  The internal form is a C int
              value.

       TK_OPTION_JUSTIFY
              The value must be a standard justification value such as left.  The internal form is a  Tk_Justify
              like the values returned by Tk_GetJustifyFromObj.

       TK_OPTION_PIXELS
              The value must specify a screen distance such as 2i or 6.4.  The internal form is an integer value
              giving a distance in pixels, like the  values  returned  by  Tk_GetPixelsFromObj.   Note:  if  the
              objOffset field is not used then information about the original value of this option will be lost.
              See  OBJOFFSET  VS.  INTERNALOFFSET  below  for  details.    This   option   type   supports   the
              TK_OPTION_NULL_OK flag; if a NULL value is set, the internal representation is set to zero.

       TK_OPTION_RELIEF
              The  value  must  be standard relief such as raised.  The internal form is an integer relief value
              such as TK_RELIEF_RAISED.  This option type supports the TK_OPTION_NULL_OK flag; if a  NULL  value
              is set, the internal representation is set to TK_RELIEF_NULL.

       TK_OPTION_STRING
              The value may be any string.  The internal form is a (char *) pointer that points to a dynamically
              allocated copy of the value.  This option type supports the TK_OPTION_NULL_OK flag.

       TK_OPTION_STRING_TABLE
              For this type,  clientData  is  a  pointer  to  an  array  of  strings  suitable  for  passing  to
              Tcl_GetIndexFromObj.   The value must be one of the strings in the table, or a unique abbreviation
              of one of the strings.  The internal form is an integer giving the index into  the  table  of  the
              matching  string,  like the return value from Tcl_GetStringFromObj.  This option type supports the
              TK_OPTION_NULL_OK flag; if a NULL value is set, the internal representation is set to -1.

       TK_OPTION_SYNONYM
              This type is used to provide alternative names for an option (for example, -bg is often used as  a
              synonym  for -background).  The clientData field is a string that gives the name of another option
              in the same table.  Whenever the synonym option is used, the information  from  the  other  option
              will be used instead.

       TK_OPTION_WINDOW
              The  value  must  be  a  window path name.  The internal form is a Tk_Window token for the window.
              This option type requires tkwin to be supplied to procedures such as Tk_SetOptions  (in  order  to
              identify the application), and it supports the TK_OPTION_NULL_OK flag.

STORAGE MANAGEMENT ISSUES

       If  a  field  of  a  widget  record  has  its offset stored in the objOffset or internalOffset field of a
       Tk_OptionSpec structure then the procedures described here will handle all of the storage allocation  and
       resource  management  issues  associated  with  the  field.   When  the  value  of  an option is changed,
       Tk_SetOptions (or Tk_FreeSavedOptions) will automatically free any  resources  associated  with  the  old
       value,  such  as Tk_Fonts for TK_OPTION_FONT options or dynamically allocated memory for TK_OPTION_STRING
       options.  For an option stored as an object using the objOffset field  of  a  Tk_OptionSpec,  the  widget
       record  shares  the  object  pointed  to by the objv value from the call to Tk_SetOptions.  The reference
       count for this object is incremented when a pointer to it is stored in the widget record and  decremented
       when  the option is modified.  When the widget is deleted Tk_FreeConfigOptions should be invoked; it will
       free the resources associated with all options and decrement reference counts for any objects.

       However, the widget code is responsible for storing NULL or None in all pointer and token  fields  before
       invoking  Tk_InitOptions.   This is needed to allow proper cleanup in the rare case where an error occurs
       in Tk_InitOptions.

OBJOFFSET VS. INTERNALOFFSET

       In most cases it is simplest to use the internalOffset field of a Tk_OptionSpec  structure  and  not  the
       objOffset  field.   This makes the internal form of the value immediately available to the widget code so
       the value does not have to be extracted from an object each time it is  used.   However,  there  are  two
       cases  where  the  objOffset  field  is useful.  The first case is for TK_OPTION_PIXELS options.  In this
       case, the internal form is an integer pixel value that is valid only for a  particular  screen.   If  the
       value of the option is retrieved, it will be returned as a simple number.  For example, after the command
       .b configure -borderwidth 2m, the command .b configure -borderwidth might return 7, which is the  integer
       pixel  value  corresponding to 2m.  Unfortunately, this loses the original screen-independent value. Thus
       for TK_OPTION_PIXELS options it is better to use the objOffset field.  In this case the original value of
       the  option is retained in the object and can be returned when the option is retrieved.  In most cases it
       is convenient to use the internalOffset field as well, so that the integer value is immediately available
       for  use  in the widget code (alternatively, Tk_GetPixelsFromObj can be used to extract the integer value
       from the object whenever it is needed).  Note: the problem of losing  information  on  retrievals  exists
       only for TK_OPTION_PIXELS options.

       The  second reason to use the objOffset field is in order to implement new types of options not supported
       by these procedures.  To implement a new type of option, you can use TK_OPTION_STRING as the type in  the
       Tk_OptionSpec  structure  and  set  the  objOffset  field  but not the internalOffset field.  Then, after
       calling Tk_SetOptions, convert the object to internal form yourself.

CUSTOM OPTION TYPES

       Applications can extend the built-in configuration types with additional configuration types  by  writing
       procedures  to parse, print, free, and restore saved copies of the type and creating a structure pointing
       to those procedures:
              typedef struct Tk_ObjCustomOption {
                  char *name;
                  Tk_CustomOptionSetProc *setProc;
                  Tk_CustomOptionGetProc *getProc;
                  Tk_CustomOptionRestoreProc *restoreProc;
                  Tk_CustomOptionFreeProc *freeProc;
                  ClientData clientData;
              } Tk_ObjCustomOption;

              typedef int Tk_CustomOptionSetProc(
                  ClientData clientData,
                  Tcl_Interp *interp,
                  Tk_Window tkwin,
                  Tcl_Obj **valuePtr,
                  char *recordPtr,
                  int internalOffset,
                  char *saveInternalPtr,
                  int flags);

              typedef Tcl_Obj *Tk_CustomOptionGetProc(
                  ClientData clientData,
                  Tk_Window tkwin,
                  char *recordPtr,
                  int internalOffset);

              typedef void Tk_CustomOptionRestoreProc(
                  ClientData clientData,
                  Tk_Window tkwin,
                  char *internalPtr,
                  char *saveInternalPtr);

              typedef void Tk_CustomOptionFreeProc(
                  ClientData clientData,
                  Tk_Window tkwin,
                  char *internalPtr);

       The Tk_ObjCustomOption structure contains six fields: a name for the custom option type; pointers to  the
       four  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.  RestoreProc and freeProc may be NULL, indicating that no
       function should be called for those operations.

       The setProc procedure is invoked by Tk_SetOptions to convert a Tcl_Obj into  an  internal  representation
       and store the resulting value in the widget record.  The arguments are:

              clientData
                     A copy of the clientData field in the Tk_ObjCustomOption structure.

              interp A pointer to a Tcl interpreter, used for error reporting.

              Tkwin  A copy of the tkwin argument to Tk_SetOptions

              valuePtr
                     A  pointer  to  a  reference to a Tcl_Obj describing the new value for the option; it could
                     have been specified explicitly in the call to Tk_SetOptions  or  it  could  come  from  the
                     option  database or a default.  If the objOffset for the option is non-negative (the option
                     value is stored as a (Tcl_Obj *) in the widget record), the Tcl_Obj pointer  referenced  by
                     valuePtr  is  the pointer that will be stored at the objOffset for the option.  SetProc may
                     modify the value if necessary; for example, setProc may change the value to NULL to support
                     the TK_OPTION_NULL_OK flag.

              recordPtr
                     A pointer to the start of the widget record to modify.

              internalOffset
                     Offset  in  bytes  from  the  start of the widget record to the location where the internal
                     representation of the option value is to be placed.

              saveInternalPtr
                     A  pointer  to  storage  allocated  in  a  Tk_SavedOptions  structure  for   the   internal
                     representation  of  the original option value.  Before setting the option to its new value,
                     setProc should set the value referenced by saveInternalPtr to the  original  value  of  the
                     option in order to support Tk_RestoreSavedOptions.

              flags  A copy of the flags field in the Tk_OptionSpec structure for the option

       SetProc returns a standard Tcl result: TCL_OK to indicate successful processing, or TCL_ERROR to indicate
       a failure of any kind.  An error message may be left in the Tcl interpreter given by interp in  the  case
       of an error.

       The  getProc  procedure  is  invoked  by  Tk_GetOptionValue  and  Tk_GetOptionInfo  to retrieve a Tcl_Obj
       representation of the internal representation of an option.  The clientData argument is  a  copy  of  the
       clientData  field  in  the  Tk_ObjCustomOption  structure.   Tkwin  is  a  copy  of the tkwin argument to
       Tk_GetOptionValue or Tk_GetOptionInfo.  RecordPtr is a pointer to the beginning of the widget  record  to
       query.   InternalOffset  is  the  offset in bytes from the beginning of the widget record to the location
       where the internal representation of the option value is stored.  GetProc must  return  a  pointer  to  a
       Tcl_Obj representing the value of the option.

       The  restoreProc  procedure  is  invoked by Tk_RestoreSavedOptions to restore a previously saved internal
       representation of a custom option value.  The clientData argument is a copy of the  clientData  field  in
       the  Tk_ObjCustomOption  structure.   Tkwin  is  a  copy  of  the  tkwin argument to Tk_GetOptionValue or
       Tk_GetOptionInfo.  InternalPtr is a pointer to the location where internal representation of  the  option
       value  is stored.  SaveInternalPtr is a pointer to the saved value.  RestoreProc must copy the value from
       saveInternalPtr to internalPtr to restore the value.  RestoreProc need not  free  any  memory  associated
       with  either  internalPtr  or saveInternalPtr; freeProc will be invoked to free that memory if necessary.
       RestoreProc has no return value.

       The freeProc procedure is invoked by Tk_SetOptions and Tk_FreeSavedOptions to free any storage  allocated
       for  the internal representation of a custom option.  The clientData argument is a copy of the clientData
       field in the Tk_ObjCustomOption structure.  Tkwin is a copy of the tkwin argument to Tk_GetOptionValue or
       Tk_GetOptionInfo.   InternalPtr  is  a  pointer  to the location where the internal representation of the
       option value is stored.  The freeProc must free any storage associated with the option.  FreeProc has  no
       return value.

KEYWORDS

       anchor,  bitmap,  boolean,  border,  color, configuration option, cursor, double, font, integer, justify,
       pixels, relief, screen distance, synonym