SetOptions.3
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:32k
源码类别:

通讯编程

开发平台:

Visual C++

  1. '"
  2. '" Copyright (c) 1998 Sun Microsystems, Inc.
  3. '"
  4. '" See the file "license.terms" for information on usage and redistribution
  5. '" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  6. '" 
  7. '" RCS: @(#) $Id: SetOptions.3,v 1.8 2000/10/01 21:31:35 ericm Exp $
  8. '" 
  9. .so man.macros
  10. .TH Tk_SetOptions 3 8.1 Tk "Tk Library Procedures"
  11. .BS
  12. .SH NAME
  13. Tk_CreateOptionTable, Tk_DeleteOptionTable, Tk_InitOptions, Tk_SetOptions, Tk_FreeSavedOptions, Tk_RestoreSavedOptions, Tk_GetOptionValue,  Tk_GetOptionInfo, Tk_FreeConfigOptions, Tk_Offset - process configuration options
  14. .SH SYNOPSIS
  15. .nf
  16. fB#include <tk.h>fR
  17. .sp
  18. Tk_OptionTable
  19. fBTk_CreateOptionTable(fIinterp, templatePtrfB)fR
  20. .sp
  21. fBTk_DeleteOptionTable(fIoptionTablefB)fR
  22. .sp
  23. int
  24. fBTk_InitOptions(fIinterp, recordPtr, optionTable, tkwinfB)fR
  25. .sp
  26. int
  27. fBTk_SetOptions(fIinterp, recordPtr, optionTable, objc, objv, tkwin, savePtr, maskPtrfB)fR
  28. .sp
  29. fBTk_FreeSavedOptions(fIsavedPtrfB)fR
  30. .sp
  31. fBTk_RestoreSavedOptions(fIsavedPtrfB)fR
  32. .sp
  33. Tcl_Obj *
  34. fBTk_GetOptionValue(fIinterp, recordPtr, optionTable, namePtr, tkwinfB)fR
  35. .sp
  36. Tcl_Obj *
  37. fBTk_GetOptionInfo(fIinterp, recordPtr, optionTable, namePtr, tkwinfB)fR
  38. .sp
  39. fBTk_FreeConfigOptions(fIrecordPtr, optionTable, tkwinfB)fR
  40. .sp
  41. int
  42. fBTk_Offset(fItype, fieldfB)fR
  43. .SH ARGUMENTS
  44. .AS Tk_SavedOptions "*CONST objv[]" in/out
  45. .AP Tcl_Interp *interp in
  46. A Tcl interpreter.  Most procedures use this only for returning error
  47. messages; if it is NULL then no error messages are returned.  For
  48. fBTk_CreateOptionTablefR the value cannot be NULL; it gives the
  49. interpreter in which the option table will be used.
  50. .AP Tk_OptionSpec *templatePtr in
  51. Points to an array of static information that describes the configuration
  52. options that are supported.  Used to build a Tk_OptionTable.  The information
  53. pointed to by this argument must exist for the lifetime of the Tk_OptionTable.
  54. .AP Tk_OptionTable optionTable in
  55. Token for an option table.  Must have been returned by a previous call
  56. to fBTk_CreateOptionTablefR.
  57. .AP char *recordPtr in/out
  58. Points to structure in which values of configuration options are stored;
  59. fields of this record are modified by procedures such as fBTk_SetOptionsfR
  60. and read by procedures such as fBTk_GetOptionValuefR.
  61. .AP Tk_Window tkwin in
  62. For options such as TK_OPTION_COLOR, this argument indicates
  63. the window in which the option will be used.  If fIoptionTablefR uses
  64. no window-dependent options, then a NULL value may be supplied for
  65. this argument.
  66. .AP int objc in
  67. Number of values in fIobjvfR.
  68. .AP Tcl_Obj "*CONST objv[]" in
  69. Command-line arguments for setting configuring options.
  70. .AP Tk_SavedOptions *savePtr out
  71. If not NULL, the structure pointed to by this argument is filled
  72. in with the old values of any options that were modified and old
  73. values are restored automatically if an error occurs in fBTk_SetOptionsfR.
  74. .AP int *maskPtr out
  75. If not NULL, the word pointed to by fImaskPtrfR is filled in with the
  76. bit-wise OR of the fItypeMaskfR fields for the options that
  77. were modified.
  78. .AP Tk_SavedOptions *savedPtr in/out
  79. Points to a structure previously filled in by fBTk_SetOptionsfR with
  80. old values of modified options.
  81. .AP Tcl_Obj *namePtr in
  82. The value of this object is the name of a particular option.  If NULL
  83. is passed to fBTk_GetOptionInfofR then information is returned for
  84. all options.  Must not be NULL when fBTk_GetOptionValuefR is called.
  85. .AP "type name" type in
  86. The name of the type of a record.
  87. .AP "field name" field in
  88. The name of a field in records of type fItypefR.
  89. .BE
  90. .SH DESCRIPTION
  91. .PP
  92. These procedures handle most of the details of parsing configuration
  93. options such as those for Tk widgets.  Given a description of what
  94. options are supported, these procedures handle all the details of
  95. parsing options and storing their values into a C structure associated
  96. with the widget or object. The procedures were designed primarily for
  97. widgets in Tk, but they can also be used for other kinds of objects that
  98. have configuration options.  In the rest of this manual page ``widget'' will
  99. be used to refer to the object whose options are being managed; in
  100. practice the object may not actually be a widget.  The term ``widget
  101. record'' is used to refer to the C-level structure in
  102. which information about a particular widget or object is stored.
  103. .PP
  104. Note: the easiest way to learn how to use these procedures is to
  105. look at a working example.  In Tk, the simplest example is the code
  106. that implements the button family of widgets, which is an fBtkButton.cfR.
  107. Other examples are in fBtkSquare.cfR and fBtkMenu.cfR.
  108. .PP
  109. In order to use these procedures, the code that implements the widget
  110. must contain a static array of Tk_OptionSpec structures. This is a
  111. template that describes the various options supported by that class of
  112. widget; there is a separate template for each kind of widget.  The
  113. template contains information such as the name of each option, its type,
  114. its default value, and where the value of the option is stored in the
  115. widget record.  See TEMPLATES below for more detail.
  116. .PP
  117. In order to process configuration options efficiently, the static
  118. template must be augmented with additional information that is available
  119. only at runtime.  The procedure fBTk_CreateOptionTablefR creates this
  120. dynamic information from the template and returns a Tk_OptionTable token
  121. that describes both the static and dynamic information.  All of the
  122. other procedures, such as fBTk_SetOptionsfR, take a Tk_OptionTable
  123. token as argument.  Typically, fBTk_CreateOptionTablefR is called the
  124. first time that a widget of a particular class is created and the
  125. resulting Tk_OptionTable is used in the future for all widgets of that
  126. class.  A Tk_OptionTable may be used only in a single interpreter, given
  127. by the fIinterpfR argument to fBTk_CreateOptionTablefR.  When an
  128. option table is no longer needed fBTk_DeleteOptionTablefR should be
  129. called to free all of its resources.  All of the option tables
  130. for a Tcl interpreter are freed automatically if the interpreter is deleted.
  131. .PP
  132. fBTk_InitOptionsfR is invoked when a new widget is created to set
  133. the default values for all of the widget's configuration options.
  134. fBTk_InitOptionsfR is passed a token for an option table (fIoptionTablefR)
  135. and a pointer to a widget record (fIrecordPtrfR), which is the C
  136. structure that holds information about this widget. fBTk_InitOptionsfR
  137. uses the information in the option table to
  138. choose an appropriate default for each option, then it stores the default
  139. value directly into the widget record, overwriting any information that
  140. was already present in the widget record.  fBTk_InitOptionsfR normally
  141. returns TCL_OK.  If an error occurred while setting the default values
  142. (e.g., because a default value was erroneous) then TCL_ERROR is returned
  143. and an error message is left in fIinterpfR's result if fIinterpfR
  144. isn't NULL.
  145. .PP
  146. fBTk_SetOptionsfR is invoked to modify configuration options based
  147. on information specified in a Tcl command.  The command might be one that
  148. creates a new widget, or a command that modifies options on an existing
  149. widget.  The fIobjcfR and fIobjvfR arguments describe the
  150. values of the arguments from the Tcl command.  fIObjvfR must contain
  151. an even number of objects: the first object of each pair gives the name of
  152. an option and the second object gives the new value for that option.
  153. fBTk_SetOptionsfR looks up each name in fIoptionTablefR, checks that
  154. the new value of the option conforms to the type in fIoptionTablefR,
  155. and stores the value of the option into the widget record given by
  156. fIrecordPtrfR.  fBTk_SetOptionsfR normally returns TCL_OK.  If
  157. an error occurred (such as an unknown option name or an illegal option
  158. value) then TCL_ERROR is returned and an error message is left in
  159. fIinterpfR's result if fIinterpfR isn't NULL.
  160. .PP
  161. fBTk_SetOptionsfR has two additional features.  First, if the
  162. fImaskPtrfR argument isn't NULL then it points to an integer
  163. value that is filled in with information about the options that were
  164. modified.  For each option in the template passed to
  165. fBTk_CreateOptionTablefR there is a fItypeMaskfR field.  The
  166. bits of this field are defined by the code that implements the widget;
  167. for example, each bit might correspond to a particular configuration option.
  168. Alternatively, bits might be used functionally.  For example, one bit might
  169. be used for redisplay: all options that affect the widget's display, such
  170. that changing the option requires the widget to be redisplayed, might have
  171. that bit set.  Another bit might indicate that the geometry of the widget
  172. must be recomputed, and so on.  fBTk_SetOptionsfR OR's together the
  173. fItypeMaskfR fields from all the options that were modified and returns
  174. this value at *fImaskPtrfR; the caller can then use this information
  175. to optimize itself so that, for example, it doesn't redisplay the widget
  176. if the modified options don't affect the widget's appearance.
  177. .PP
  178. The second additional feature of fBTk_SetOptionsfR has to do with error
  179. recovery.  If an error occurs while processing configuration options, this
  180. feature makes it possible to restore all the configuration options to their
  181. previous values.  Errors can occur either while processing options in
  182. fBTk_SetOptionsfR or later in the caller.  In many cases the caller does
  183. additional processing after fBTk_SetOptionsfR returns; for example, it
  184. might use an option value to set a trace on a variable and may detect
  185. an error if the variable is an array instead of a scalar.  Error recovery
  186. is enabled by passing in a non-NULL value for the fIsavePtrfR argument
  187. to fBTk_SetOptionsfR; this should be a pointer to an uninitialized
  188. Tk_SavedOptions structure on the caller's stack.  fBTk_SetOptionsfR
  189. overwrites the structure pointed to by fIsavePtrfR with information
  190. about the old values of any options modified by the procedure.
  191. If fBTk_SetOptionsfR returns successfully, the
  192. caller uses the structure in one of two ways.  If the caller completes
  193. its processing of the new options without any errors, then it must pass
  194. the structure to fBTk_FreeSavedOptionsfR so that the old values can be
  195. freed.  If the caller detects an error in its processing of the new
  196. options, then it should pass the structure to fBTk_RestoreSavedOptionsfR,
  197. which will copy the old values back into the widget record and free
  198. the new values.
  199. If fBTk_SetOptionsfR detects an error then it automatically restores
  200. any options that had already been modified and leaves *fIsavePtrfR in
  201. an empty state: the caller need not call either fBTk_FreeSavedOptionsfR or
  202. fBTk_RestoreSavedOptionsfR.
  203. If the fIsavePtrfR argument to fBTk_SetOptionsfR is NULL then
  204. fBTk_SetOptionsfR frees each old option value immediately when it sets a new
  205. value for the option.  In this case, if an error occurs in the third
  206. option, the old values for the first two options cannot be restored.
  207. .PP
  208. fBTk_GetOptionValuefR returns the current value of a configuration option
  209. for a particular widget.  The fInamePtrfR argument contains the name of
  210. an option; fBTk_GetOptionValuefR uses fIoptionTablefR
  211. to lookup the option and extract its value from the widget record
  212. pointed to by fIrecordPtrfR, then it returns an object containing
  213. that value.  If an error occurs (e.g., because fInamePtrfR contains an
  214. unknown option name) then NULL is returned and an error message is left
  215. in fIinterpfR's result unless fIinterpfR is NULL.
  216. .PP
  217. fBTk_GetOptionInfofR returns information about configuration options in
  218. a form suitable for fBconfigurefR widget commands.  If the fInamePtrfR
  219. argument is not NULL, it points to an object that gives the name of a
  220. configuration option; fBTk_GetOptionInfofR returns an object containing
  221. a list with five elements, which are the name of the option, the name and
  222. class used for the option in the option database, the default value for
  223. the option, and the current value for the option.  If the fInamePtrfR
  224. argument is NULL, then fBTk_GetOptionInfofR returns information about
  225. all options in the form of a list of lists; each sublist describes one
  226. option.  Synonym options are handled differently depending on whether
  227. fInamePtrfR is NULL: if fInamePtrfR is NULL then the sublist for
  228. each synonym option has only two elements, which are the name of the
  229. option and the name of the other option that it refers to; if fInamePtrfR
  230. is non-NULL and names a synonym option then the object returned
  231. is the five-element list
  232. for the other option that the synonym refers to.  If an error occurs
  233. (e.g., because fInamePtrfR contains an unknown option name) then NULL
  234. is returned and an error message is left in fIinterpfR's result unless
  235. fIinterpfR is NULL.
  236. .PP
  237. fBTk_FreeConfigOptionsfR must be invoked when a widget is deleted.
  238. It frees all of the resources associated with any of the configuration
  239. options defined in fIrecordPtrfR by fIoptionTablefR.
  240. .PP
  241. The fBTk_OffsetfR macro is provided as a safe way of generating the
  242. fIobjOffsetfR and fIinternalOffsetfR values for entries in
  243. Tk_OptionSpec structures.  It takes two arguments: the name of a type
  244. of record, and the name of a field in that record. It returns the byte
  245. offset of the named field in records of the given type.
  246. .SH "TEMPLATES"
  247. .PP
  248. The array of Tk_OptionSpec structures passed to fBTk_CreateOptionTablefR
  249. via its fItemplatePtrfR argument describes the configuration options
  250. supported by a particular class of widgets.  Each structure specifies
  251. one configuration option and has the following fields:
  252. .CS
  253. typedef struct {
  254. Tk_OptionType fItypefR;
  255. char *fIoptionNamefR;
  256. char *fIdbNamefR;
  257. char *fIdbClassfR;
  258. char *fIdefValuefR;
  259. int fIobjOffsetfR;
  260. int fIinternalOffsetfR;
  261. int fIflagsfR;
  262. ClientData fIclientDatafR;
  263. int fItypeMaskfR;
  264. } Tk_OptionSpec;
  265. .CE
  266. The fItypefR field indicates what kind of configuration option this is
  267. (e.g. TK_OPTION_COLOR for a color value, or TK_OPTION_INT for
  268. an integer value).  fITypefR determines how the
  269. value of the option is parsed (more on this below).
  270. The fIoptionNamefR field is a string such as fB-fontfR or fB-bgfR;
  271. it is the name used for the option in Tcl commands and passed to
  272. procedures via the fIobjcfR or fInamePtrfR arguments.
  273. The fIdbNamefR and fIdbClassfR fields are used by fBTk_InitOptionsfR
  274. to look up a default value for this option in the option database; if
  275. fIdbNamefR is NULL then the option database is not used by
  276. fBTk_InitOptionsfR for this option.  The fIdefValuefR field
  277. specifies a default value for this configuration option if no
  278. value is specified in the option database.  The fIobjOffsetfR and
  279. fIinternalOffsetfR fields indicate where to store the value of this
  280. option in widget records (more on this below); values for the fIobjOffsetfR
  281. and fIinternalOffsetfR fields should always be generated with the
  282. fBTk_OffsetfR macro.
  283. The fIflagsfR field contains additional information
  284. to control the processing of this configuration option (see below
  285. for details).
  286. fIClientDatafR provides additional type-specific data needed
  287. by certain types.  For instance, for TK_OPTION_COLOR types,
  288. fIclientDatafR is a string giving the default value to use on
  289. monochrome displays.  See the descriptions of the different types
  290. below for details.
  291. The last field, fItypeMaskfR, is used by fBTk_SetOptionsfR to
  292. return information about which options were modified; see the description
  293. of fBTk_SetOptionsfR above for details.
  294. .PP
  295. When fBTk_InitOptionsfR and fBTk_SetOptionsfR store the value of an
  296. option into the widget record, they can do it in either of two ways.
  297. If the fIobjOffsetfR field of the Tk_OptionSpec is greater than
  298. or equal to zero, then the value of the option is stored as a
  299. (Tcl_Obj *) at the location in the widget record given by fIobjOffsetfR.
  300. If the fIinternalOffsetfR field of the Tk_OptionSpec is
  301. greater than or equal to zero, then the value of the option is stored
  302. in a type-specific internal form at the location in the widget record
  303. given by fIinternalOffsetfR.  For example, if the option's type is
  304. TK_OPTION_INT then the internal form is an integer.  If the
  305. fIobjOffsetfR or fIinternalOffsetfR field is negative then the
  306. value is not stored in that form.  At least one of the offsets must be
  307. greater than or equal to zero.
  308. .PP
  309. The fIflagsfR field consists of one or more bits ORed together.  At
  310. present only a single flag is supported: TK_OPTION_NULL_OK.  If
  311. this bit is set for an option then an empty string will be accepted as
  312. the value for the option and the resulting internal form will be a
  313. NULL pointer, a zero value, or fBNonefR, depending on the type of
  314. the option.  If the flag is not set then empty strings will result
  315. in errors.
  316. TK_OPTION_NULL_OK is typically used to allow a
  317. feature to be turned off entirely, e.g. set a cursor value to
  318. fBNonefR so that a window simply inherits its parent's cursor.
  319. Not all option types support the TK_OPTION_NULL_OK
  320. flag; for those that do, there is an explicit indication of that fact
  321. in the descriptions below.
  322. .PP
  323. The fItypefR field of each Tk_OptionSpec structure determines
  324. how to parse the value of that configuration option. The
  325. legal value for fItypefR, and the corresponding actions, are
  326. described below.  If the type requires a fItkwinfR value to be
  327. passed into procedures like fBTk_SetOptionsfR, or if it uses
  328. the fIclientDatafR field of the Tk_OptionSpec, then it is indicated
  329. explicitly; if not mentioned, the type requires neither fItkwinfR
  330. nor fIclientDatafR.
  331. .TP
  332. fBTK_OPTION_ANCHORfR
  333. The value must be a standard anchor position such as fBnefR or
  334. fBcenterfR.  The internal form is a Tk_Anchor value like the ones
  335. returned by fBTk_GetAnchorFromObjfR.
  336. .TP
  337. fBTK_OPTION_BITMAPfR
  338. The value must be a standard Tk bitmap name. The internal form is a
  339. Pixmap token like the ones returned by fBTk_AllocBitmapFromObjfR.
  340. This option type requires fItkwinfR to be supplied to procedures
  341. such as fBTk_SetOptionsfR, and it supports the TK_OPTION_NULL_OK flag.
  342. .TP
  343. fBTK_OPTION_BOOLEANfR
  344. The value must be a standard boolean value such as fBtruefR or
  345. fBnofR.  The internal form is an integer with value 0 or 1.
  346. .TP
  347. fBTK_OPTION_BORDERfR
  348. The value must be a standard color name such as fBredfR or fB#ff8080fR.
  349. The internal form is a Tk_3DBorder token like the ones returned
  350. by fBTk_Alloc3DBorderFromObjfR.
  351. This option type requires fItkwinfR to be supplied to procedures
  352. such as fBTk_SetOptionsfR, and it supports the TK_OPTION_NULL_OK flag.
  353. .TP
  354. fBTK_OPTION_COLORfR
  355. The value must be a standard color name such as fBredfR or fB#ff8080fR.
  356. The internal form is an (XColor *) token like the ones returned by
  357. fBTk_AllocColorFromObjfR.
  358. This option type requires fItkwinfR to be supplied to procedures
  359. such as fBTk_SetOptionsfR, and it supports the TK_OPTION_NULL_OK flag.
  360. .TP
  361. fBTK_OPTION_CURSORfR
  362. The value must be a standard cursor name such as fBcrossfR or fB@foofR.
  363. The internal form is a Tk_Cursor token like the ones returned by
  364. fBTk_AllocCursorFromObjfR.
  365. This option type requires fItkwinfR to be supplied to procedures
  366. such as fBTk_SetOptionsfR, and when the option is set the cursor
  367. for the window is changed by calling fBXDefineCursorfR.  This
  368. option type also supports the TK_OPTION_NULL_OK flag.
  369. .TP
  370. fBTK_OPTION_CUSTOMfR
  371. This option allows applications to define new option types.  The
  372. clientData field of the entry points to a structure defining the new
  373. option type.  See the section CUSTOM OPTION TYPES below for details.
  374. .TP
  375. fBTK_OPTION_DOUBLEfR
  376. The string value must be a floating-point number in
  377. the format accepted by fBstrtolfR.  The internal form is a C
  378. fBdoublefR value.  This option type supports the TK_OPTION_NULL_OK
  379. flag; if a NULL value is set, the internal representation is set to zero.
  380. .TP
  381. fBTK_OPTION_ENDfR
  382. Marks the end of the template.  There must be a Tk_OptionSpec structure
  383. with fItypefR TK_OPTION_END at the end of each template.  If the
  384. fIclientDatafR field of this structure isn't NULL, then it points to
  385. an additional array of Tk_OptionSpec's, which is itself terminated by
  386. another TK_OPTION_END entry.  Templates may be chained arbitrarily
  387. deeply.  This feature allows common options to be shared by several
  388. widget classes.
  389. .TP
  390. fBTK_OPTION_FONTfR
  391. The value must be a standard font name such as fBTimes 16fR.
  392. The internal form is a Tk_Font handle like the ones returned by
  393. fBTk_AllocFontFromObjfR.
  394. This option type requires fItkwinfR to be supplied to procedures
  395. such as fBTk_SetOptionsfR, and it supports the TK_OPTION_NULL_OK flag.
  396. .TP
  397. fBTK_OPTION_INTfR
  398. The string value must be an integer in the format accepted by
  399. fBstrtolfR (e.g. fB0fR and fB0xfR prefixes may be used to
  400. specify octal or hexadecimal numbers, respectively).  The internal
  401. form is a C fBintfR value.
  402. .TP
  403. fBTK_OPTION_JUSTIFYfR
  404. The value must be a standard justification value such as fBleftfR.
  405. The internal form is a Tk_Justify like the values returned by
  406. fBTk_GetJustifyFromObjfR.
  407. .TP
  408. fBTK_OPTION_PIXELSfR
  409. The value must specify a screen distance such as fB2ifR or fB6.4fR.
  410. The internal form is an integer value giving a
  411. distance in pixels, like the values returned by
  412. fBTk_GetPixelsFromObjfR.  Note: if the fIobjOffsetfR field isn't
  413. used then information about the original value of this option will be lost.
  414. See fBOBJOFFSET VS. INTERNALOFFSETfR below for details.  This option
  415. type supports the TK_OPTION_NULL_OK flag; if a NULL value is set, the
  416. internal representation is set to zero.
  417. .TP
  418. fBTK_OPTION_RELIEFfR
  419. The value must be standard relief such as fBraisedfR.
  420. The internal form is an integer relief value such as
  421. TK_RELIEF_RAISED.  This option type supports the TK_OPTION_NULL_OK
  422. flag; if the empty string is specified as the value for the option,
  423. the integer relief value is set to TK_RELIEF_NULL.
  424. .TP
  425. fBTK_OPTION_STRINGfR
  426. The value may be any string.  The internal form is a (char *) pointer
  427. that points to a dynamically allocated copy of the value.
  428. This option type supports the TK_OPTION_NULL_OK flag.
  429. .TP
  430. fBTK_OPTION_STRING_TABLEfR
  431. For this type, fIclientDatafR is a pointer to an array of strings
  432. suitable for passing to fBTcl_GetIndexFromObjfR.  The value must
  433. be one of the strings in the table, or a unique abbreviation of
  434. one of the strings.  The internal form is an integer giving the index
  435. into the table of the matching string, like the return value
  436. from fBTcl_GetStringFromObjfR. 
  437. .TP
  438. fBTK_OPTION_SYNONYMfR
  439. This type is used to provide alternative names for an option (for
  440. example, fB-bgfR is often used as a synonym for fB-backgroundfR).
  441. The fBclientDatafR field is a (char *) pointer that gives
  442. the name of another option in the same table.  Whenever the
  443. synonym option is used, the information from the other option
  444. will be used instead.
  445. .TP
  446. fBTK_OPTION_WINDOWfR
  447. The value must be a window path name.  The internal form is a
  448. fBTk_WindowfR token for the window.
  449. This option type requires fItkwinfR to be supplied to procedures
  450. such as fBTk_SetOptionsfR (in order to identify the application),
  451. and it supports the TK_OPTION_NULL_OK flag.
  452. .SH "STORAGE MANAGEMENT ISSUES"
  453. .PP
  454. If a field of a widget record has its offset stored in the fIobjOffsetfR
  455. or fIinternalOffsetfR field of a Tk_OptionSpec structure then the
  456. procedures described here will handle all of the storage allocation and
  457. resource management issues associated with the field.  When the value
  458. of an option is changed, fBTk_SetOptionsfR (or fBTk_FreeSavedOptionsfR)
  459. will automatically free any resources associated with the old value, such as
  460. Tk_Fonts for TK_OPTION_FONT options or dynamically allocated memory for
  461. TK_OPTION_STRING options.  For an option stored as an object using the
  462. fIobjOffsetfR field of a Tk_OptionSpec, the widget record shares the
  463. object pointed to by the fIobjvfR value from the call to
  464. fBTk_SetOptionsfR.  The reference count for this object is incremented
  465. when a pointer to it is stored in the widget record and decremented when
  466. the option is modified.  When the widget is deleted
  467. fBTk_FreeConfigOptionsfR should be invoked; it will free the resources
  468. associated with all options and decrement reference counts for any
  469. objects.
  470. .PP
  471. However, the widget code is responsible for storing NULL or fBNonefR in
  472. all pointer and token fields before invoking fBTk_InitOptionsfR.
  473. This is needed to allow proper cleanup in the rare case where
  474. an error occurs in fBTk_InitOptionsfR.
  475. .SH "OBJOFFSET VS. INTERNALOFFSET"
  476. .PP
  477. In most cases it is simplest to use the fIinternalOffsetfR field of
  478. a Tk_OptionSpec structure and not the fIobjOffsetfR field.  This
  479. makes the internal form of the value immediately available to the
  480. widget code so the value doesn't have to be extracted from an object
  481. each time it is used.  However, there are two cases where the
  482. fIobjOffsetfR field is useful.  The first case is for
  483. TK_OPTION_PIXELS options.  In this case, the internal form is
  484. an integer pixel value that is valid only for a particular screen.
  485. If the value of the option is retrieved, it will be returned as a simple
  486. number.  For example, after the command fB.b configure -borderwidth 2mfR,
  487. the command fB.b configure -borderwidthfR might return 7, which is the
  488. integer pixel value corresponding to fB2mfR.  Unfortunately, this loses
  489. the original screen-independent value.  Thus for TK_OPTION_PIXELS options
  490. it is better to use the fIobjOffsetfR field.  In this case the original
  491. value of the option is retained in the object and can be returned when
  492. the option is retrieved.  In most cases it is convenient to use the
  493. fIinternalOffsetfR field field as well, so that the integer value is
  494. immediately available for use in the widget code (alternatively,
  495. fBTk_GetPixelsFromObjfR can be used to extract the integer value from
  496. the object whenever it is needed).  Note: the problem of losing information
  497. on retrievals exists only for TK_OPTION_PIXELS options.
  498. .PP
  499. The second reason to use the fIobjOffsetfR field is in order to
  500. implement new types of options not supported by these procedures.
  501. To implement a new type of option, you can use TK_OPTION_STRING as
  502. the type in the Tk_OptionSpec structure and set the fIobjOffsetfR field
  503. but not the fIinternalOffsetfR field.  Then, after calling
  504. fBTk_SetOptionsfR, convert the object to internal form yourself.
  505. .SH "CUSTOM OPTION TYPES"
  506. .PP
  507. Applications can extend the built-in configuration types with
  508. additional configuration types by writing procedures to parse, print,
  509. free, and restore saved copies of the type and creating a structure
  510. pointing to those procedures:
  511. .CS
  512. typedef struct Tk_ObjCustomOption {
  513. char *name;
  514. Tk_CustomOptionSetProc *fIsetProcfR;
  515. Tk_CustomOptionGetProc *fIgetProcfR;
  516. Tk_CustomOptionRestoreProc *fIrestoreProcfR;
  517. Tk_CustomOptionFreeProc *fIfreeProcfR;
  518. ClientData fIclientDatafR;
  519. } Tk_ObjCustomOption;
  520. typedef int Tk_CustomOptionSetProc(
  521. ClientData fIclientDatafR,
  522. Tcl_Interp *fIinterpfR, 
  523. Tk_Window fItkwinfR, 
  524. Tcl_Obj **fIvaluePtrfR,
  525. char *fIrecordPtrfR,
  526. int fIinternalOffsetfR,
  527. char *fIsaveInternalPtrfR, 
  528. int fIflagsfR);
  529. typedef Tcl_Obj *Tk_CustomOptionGetProc(
  530. ClientData fIclientDatafR,
  531. Tk_Window fItkwinfR, 
  532. char *fIrecordPtrfR,
  533. int fIinternalOffsetfR);
  534. typedef void Tk_CustomOptionRestoreProc(
  535. ClientData fIclientDatafR,
  536. Tk_Window fItkwinfR, 
  537. char *fIinternalPtrfR, 
  538. char *fIsaveInternalPtrfR);
  539. typedef void Tk_CustomOptionFreeProc(
  540. ClientData fIclientDatafR,
  541. Tk_Window fItkwinfR, 
  542. char *fIinternalPtrfR);
  543. .CE
  544. .PP
  545. The Tk_ObjCustomOption structure contains six fields: a name
  546. for the custom option type; pointers to the four procedures; and a
  547. fIclientDatafR value to be passed to those procedures when they are
  548. invoked.  The fIclientDatafR value typically points to a structure
  549. containing information that is needed by the procedures when they are
  550. parsing and printing options.  fIRestoreProcfR and fIfreeProcfR
  551. may be NULL, indicating that no function should be called for those
  552. operations.
  553. .PP
  554. The fIsetProcfR procedure is invoked by fBTk_SetOptionsfR to
  555. convert a Tcl_Obj into an internal representation and store the
  556. resulting value in the widget record.  The arguments are:
  557. .RS
  558. .TP
  559. fIclientDatafR
  560. A copy of the fIclientDatafR field in the Tk_ObjCustomOption
  561. structure.
  562. .TP
  563. fIinterpfR
  564. A pointer to a Tcl interpreter, used for error reporting.
  565. .TP
  566. fITkwinfR
  567. A copy of the fItkwinfR argument to fBTk_SetOptionsfR
  568. .TP
  569. fIvaluePtrfR
  570. A pointer to a reference to a Tcl_Obj describing the new value for the
  571. option; it could have been specified explicitly in the call to
  572. fBTk_SetOptionsfR or it could come from the option database or a
  573. default.  If the objOffset for the option is non-negative (the option
  574. value is stored as a (Tcl_Obj *) in the widget record), the Tcl_Obj
  575. pointer referenced by fIvaluePtrfR is the pointer that will be
  576. stored at the objOffset for the option.  fISetProcfR may modify the
  577. value if necessary; for example, fIsetProcfR may change the value to
  578. NULL to support the TK_OPTION_NULL_OK flag.
  579. .TP
  580. fIrecordPtrfR
  581. A pointer to the start of the widget record to modify.
  582. .TP
  583. fIinternalOffsetfR
  584. Offset in bytes from the start of the widget record to the location
  585. where the internal representation of the option value is to be placed.
  586. .TP
  587. fIsaveInternalPtrfR
  588. A pointer to storage allocated in a Tk_SavedOptions structure for the
  589. internal representation of the original option value.  Before setting
  590. the option to its new value, fIsetProcfR should set the value
  591. referenced by fIsaveInternalPtrfR to the original value of the
  592. option in order to support fBTk_RestoreSavedOptionsfR.
  593. .TP
  594. fIflagsfR
  595. A copy of the fIflagsfR field in the Tk_OptionSpec structure for the
  596. option
  597. .RE
  598. .PP
  599. fISetProcfR returns a standard Tcl result:  TCL_OK to indicate successful
  600. processing, or TCL_ERROR to indicate a failure of any kind.  An error
  601. message may be left in the Tcl interpreter given by fIinterpfR in
  602. the case of an error.
  603. .PP
  604. The fIgetProcfR procedure is invoked by fBTk_GetOptionValuefR and
  605. fBTk_GetOptionInfofR to retrieve a Tcl_Obj representation of the
  606. internal representation of an option.  The fIclientDatafR argument
  607. is a copy of the fIclientDatafR field in the Tk_ObjCustomOption
  608. structure.  fITkwinfR is a copy of the fItkwinfR argument to
  609. fBTk_GetOptionValuefR or fBTk_GetOptionInfofR.  fIRecordPtrfR
  610. is a pointer to the beginning of the widget record to query.
  611. fIInternalOffsetfR is the offset in bytes from the beginning of the
  612. widget record to the location where the internal representation of the
  613. option value is stored.  fIGetProcfR must return a pointer to a
  614. Tcl_Obj representing the value of the option.
  615. .PP
  616. The fIrestoreProcfR procedure is invoked by
  617. fBTk_RestoreSavedOptionsfR to restore a previously saved internal
  618. representation of a custom option value.  The fIclientDatafR argument
  619. is a copy of the fIclientDatafR field in the Tk_ObjCustomOption
  620. structure.  fITkwinfR is a copy of the fItkwinfR argument to
  621. fBTk_GetOptionValuefR or fBTk_GetOptionInfofR.  fIInternalPtrfR
  622. is a pointer to the location where internal representation of the
  623. option value is stored.
  624. fISaveInternalPtrfR is a pointer to the saved value.
  625. fIRestoreProcfR must copy the value from fIsaveInternalPtrfR to
  626. fIinternalPtrfR to restore the value.  fIRestoreProcfR need not
  627. free any memory associated with either fIinternalPtrfR or
  628. fIsaveInternalPtrfR; fIfreeProcfR will be invoked to free that
  629. memory if necessary.  fIRestoreProcfR has no return value.
  630. .PP
  631. The fIfreeProcfR procedure is invoked by fBTk_SetOptionsfR and
  632. fBTk_FreeSavedOptionsfR to free any storage allocated for the
  633. internal representation of a custom option.  The fIclientDatafR argument
  634. is a copy of the fIclientDatafR field in the Tk_ObjCustomOption
  635. structure.  fITkwinfR is a copy of the fItkwinfR argument to
  636. fBTk_GetOptionValuefR or fBTk_GetOptionInfofR.  fIInternalPtrfR
  637. is a pointer to the location where the internal representation of the
  638. option value is stored.  The fIfreeProcfR must free any storage
  639. associated with the option.  fIFreeProcfR has no return value.
  640. .SH KEYWORDS
  641. anchor, bitmap, boolean, border, color, configuration option,
  642. cursor, double, font, integer, justify,
  643. pixels, relief, screen distance, synonym