| 1 | /* | 
|---|
| 2 | * bltObjConfig.h -- | 
|---|
| 3 | * | 
|---|
| 4 | *      This file contains the Tcl_Obj based versions of the old | 
|---|
| 5 | *      Tk_ConfigureWidget procedures. | 
|---|
| 6 | * | 
|---|
| 7 | * Copyright (c) 1990-1994 The Regents of the University of California. | 
|---|
| 8 | * Copyright (c) 1994-1997 Sun Microsystems, Inc. | 
|---|
| 9 | * | 
|---|
| 10 | * See the file "license.terms" for information on usage and redistribution | 
|---|
| 11 | * of this file, and for a DISCLAIMER OF ALL WARRANTIES. | 
|---|
| 12 | * | 
|---|
| 13 | */ | 
|---|
| 14 |  | 
|---|
| 15 | #ifndef BLT_OBJCONFIG_H | 
|---|
| 16 | #define BLT_OBJCONFIG_H | 
|---|
| 17 |  | 
|---|
| 18 | /* | 
|---|
| 19 | * This is a Tcl_Obj based replacement for the widget configuration | 
|---|
| 20 | * functions in Tk. | 
|---|
| 21 | * | 
|---|
| 22 | * What not use the new Tk_Option interface? | 
|---|
| 23 | * | 
|---|
| 24 | *      There were design changes in the new Tk_Option interface that | 
|---|
| 25 | *      make it unwieldy. | 
|---|
| 26 | * | 
|---|
| 27 | *      o You have to dynamically allocate, store, and deallocate | 
|---|
| 28 | *        your option table. | 
|---|
| 29 | *      o The Tk_FreeConfigOptions routine requires a tkwin argument. | 
|---|
| 30 | *        Unfortunately, most widgets save the display pointer and | 
|---|
| 31 | *        deference their tkwin when the window is destroyed. | 
|---|
| 32 | *      o There's no TK_CONFIG_CUSTOM functionality.  This means that | 
|---|
| 33 | *        save special options must be saved as strings by | 
|---|
| 34 | *        Tk_ConfigureWidget and processed later, thus losing the | 
|---|
| 35 | *        benefits of Tcl_Objs.  It also make error handling | 
|---|
| 36 | *        problematic, since you don't pick up certain errors like | 
|---|
| 37 | * | 
|---|
| 38 | *          .widget configure -myoption bad -myoption good | 
|---|
| 39 | * | 
|---|
| 40 | *        You will never see the first "bad" value. | 
|---|
| 41 | *      o Especially compared to the former Tk_ConfigureWidget calls, | 
|---|
| 42 | *        the new interface is overly complex.  If there was a big | 
|---|
| 43 | *        performance win, it might be worth the effort.  But let's | 
|---|
| 44 | *        face it, this biggest wins are in processing custom options | 
|---|
| 45 | *        values with thousands of elements.  Most common resources | 
|---|
| 46 | *        (font, color, etc) have string tokens anyways. | 
|---|
| 47 | * | 
|---|
| 48 | *      On the other hand, the replacement functions in this file fell | 
|---|
| 49 | *      into place quite easily both from the aspect of API writer and | 
|---|
| 50 | *      user.  The biggest benefit is that you don't need to change lots | 
|---|
| 51 | *      of working code just to get the benefits of Tcl_Objs. | 
|---|
| 52 | * | 
|---|
| 53 | */ | 
|---|
| 54 | #define SIDE_LEFT               (0) | 
|---|
| 55 | #define SIDE_TOP                (1) | 
|---|
| 56 | #define SIDE_RIGHT              (2) | 
|---|
| 57 | #define SIDE_BOTTOM             (3) | 
|---|
| 58 |  | 
|---|
| 59 | #define SIDE_HORIZONTAL(s)      (!((s) & 0x1)) | 
|---|
| 60 | #define SIDE_VERTICAL(s)        ((s) & 0x1) | 
|---|
| 61 |  | 
|---|
| 62 | #ifndef Blt_Offset | 
|---|
| 63 | #ifdef offsetof | 
|---|
| 64 | #define Blt_Offset(type, field) ((int) offsetof(type, field)) | 
|---|
| 65 | #else | 
|---|
| 66 | #define Blt_Offset(type, field) ((int) ((char *) &((type *) 0)->field)) | 
|---|
| 67 | #endif | 
|---|
| 68 | #endif /* Blt_Offset */ | 
|---|
| 69 |  | 
|---|
| 70 | typedef int (Blt_OptionParseProc) _ANSI_ARGS_((ClientData clientData, | 
|---|
| 71 | Tcl_Interp *interp, Tk_Window tkwin, Tcl_Obj *objPtr, char *widgRec, | 
|---|
| 72 | int offset)); | 
|---|
| 73 | typedef Tcl_Obj *(Blt_OptionPrintProc) _ANSI_ARGS_((ClientData clientData, | 
|---|
| 74 | Tcl_Interp *interp, Tk_Window tkwin, char *widgRec, int offset)); | 
|---|
| 75 | typedef void (Blt_OptionFreeProc) _ANSI_ARGS_((ClientData clientData, | 
|---|
| 76 | Display *display, char *widgRec, int offset)); | 
|---|
| 77 |  | 
|---|
| 78 | typedef struct Blt_CustomOption { | 
|---|
| 79 | Blt_OptionParseProc *parseProc;     /* Procedure to call to parse an | 
|---|
| 80 | * option and store it in converted | 
|---|
| 81 | * form. */ | 
|---|
| 82 | Blt_OptionPrintProc *printProc;     /* Procedure to return a printable | 
|---|
| 83 | * string describing an existing | 
|---|
| 84 | * option. */ | 
|---|
| 85 | Blt_OptionFreeProc *freeProc;       /* Procedure to free the value. */ | 
|---|
| 86 |  | 
|---|
| 87 | ClientData clientData;              /* Arbitrary one-word value used by | 
|---|
| 88 | * option parser:  passed to | 
|---|
| 89 | * parseProc and printProc. */ | 
|---|
| 90 | } Blt_CustomOption; | 
|---|
| 91 |  | 
|---|
| 92 | /* | 
|---|
| 93 | * Structure used to specify information for Tk_ConfigureWidget.  Each | 
|---|
| 94 | * structure gives complete information for one option, including | 
|---|
| 95 | * how the option is specified on the command line, where it appears | 
|---|
| 96 | * in the option database, etc. | 
|---|
| 97 | */ | 
|---|
| 98 |  | 
|---|
| 99 | typedef struct { | 
|---|
| 100 | int type;                   /* Type of option, such as BLT_CONFIG_COLOR; | 
|---|
| 101 | * see definitions below.  Last option in | 
|---|
| 102 | * table must have type BLT_CONFIG_END. */ | 
|---|
| 103 | char *switchName;           /* Switch used to specify option in argv. | 
|---|
| 104 | * NULL means this spec is part of a group. */ | 
|---|
| 105 | Tk_Uid dbName;              /* Name for option in option database. */ | 
|---|
| 106 | Tk_Uid dbClass;             /* Class for option in database. */ | 
|---|
| 107 | Tk_Uid defValue;            /* Default value for option if not | 
|---|
| 108 | * specified in command line or database. */ | 
|---|
| 109 | int offset;                 /* Where in widget record to store value; | 
|---|
| 110 | * use Tk_Offset macro to generate values | 
|---|
| 111 | * for this. */ | 
|---|
| 112 | int specFlags;              /* Any combination of the values defined | 
|---|
| 113 | * below;  other bits are used internally | 
|---|
| 114 | * by tkConfig.c. */ | 
|---|
| 115 | Blt_CustomOption *customPtr; /* If type is BLT_CONFIG_CUSTOM then this is | 
|---|
| 116 | * a pointer to info about how to parse and | 
|---|
| 117 | * print the option.  Otherwise it is | 
|---|
| 118 | * irrelevant. */ | 
|---|
| 119 | } Blt_ConfigSpec; | 
|---|
| 120 |  | 
|---|
| 121 | /* | 
|---|
| 122 | * Type values for Blt_ConfigSpec structures.  See the user | 
|---|
| 123 | * documentation for details. | 
|---|
| 124 | */ | 
|---|
| 125 |  | 
|---|
| 126 | typedef enum { | 
|---|
| 127 | BLT_CONFIG_ACTIVE_CURSOR, | 
|---|
| 128 | BLT_CONFIG_ANCHOR, | 
|---|
| 129 | BLT_CONFIG_BITMAP, | 
|---|
| 130 | BLT_CONFIG_BOOLEAN, | 
|---|
| 131 | BLT_CONFIG_BORDER, | 
|---|
| 132 | BLT_CONFIG_CAP_STYLE, | 
|---|
| 133 | BLT_CONFIG_COLOR, | 
|---|
| 134 | BLT_CONFIG_CURSOR, | 
|---|
| 135 | BLT_CONFIG_CUSTOM, | 
|---|
| 136 | BLT_CONFIG_DOUBLE, | 
|---|
| 137 | BLT_CONFIG_FONT, | 
|---|
| 138 | BLT_CONFIG_INT, | 
|---|
| 139 | BLT_CONFIG_JOIN_STYLE, | 
|---|
| 140 | BLT_CONFIG_JUSTIFY, | 
|---|
| 141 | BLT_CONFIG_MM, | 
|---|
| 142 | BLT_CONFIG_PIXELS, | 
|---|
| 143 | BLT_CONFIG_RELIEF, | 
|---|
| 144 | BLT_CONFIG_STRING, | 
|---|
| 145 | BLT_CONFIG_SYNONYM, | 
|---|
| 146 | BLT_CONFIG_UID, | 
|---|
| 147 | BLT_CONFIG_WINDOW, | 
|---|
| 148 |  | 
|---|
| 149 | BLT_CONFIG_BITFLAG, | 
|---|
| 150 | BLT_CONFIG_DASHES, | 
|---|
| 151 | BLT_CONFIG_DISTANCE,        /*  */ | 
|---|
| 152 | BLT_CONFIG_FILL, | 
|---|
| 153 | BLT_CONFIG_FLOAT, | 
|---|
| 154 | BLT_CONFIG_LIST, | 
|---|
| 155 | BLT_CONFIG_LISTOBJ, | 
|---|
| 156 | BLT_CONFIG_PAD, | 
|---|
| 157 | BLT_CONFIG_POS_DISTANCE,    /*  */ | 
|---|
| 158 | BLT_CONFIG_SHADOW,          /*  */ | 
|---|
| 159 | BLT_CONFIG_SIDE, | 
|---|
| 160 | BLT_CONFIG_STATE, | 
|---|
| 161 | BLT_CONFIG_TILE, | 
|---|
| 162 |  | 
|---|
| 163 | BLT_CONFIG_END | 
|---|
| 164 | } Blt_ConfigTypes; | 
|---|
| 165 |  | 
|---|
| 166 | /* | 
|---|
| 167 | * Possible values for flags argument to Tk_ConfigureWidget: | 
|---|
| 168 | */ | 
|---|
| 169 |  | 
|---|
| 170 | #define BLT_CONFIG_OBJV_ONLY    1 | 
|---|
| 171 | #define BLT_CONFIG_OBJS         0x80 | 
|---|
| 172 |  | 
|---|
| 173 | /* | 
|---|
| 174 | * Possible flag values for Blt_ConfigSpec structures.  Any bits at | 
|---|
| 175 | * or above BLT_CONFIG_USER_BIT may be used by clients for selecting | 
|---|
| 176 | * certain entries.  Before changing any values here, coordinate with | 
|---|
| 177 | * tkOldConfig.c (internal-use-only flags are defined there). | 
|---|
| 178 | */ | 
|---|
| 179 |  | 
|---|
| 180 | #define BLT_CONFIG_NULL_OK              1 | 
|---|
| 181 | #define BLT_CONFIG_COLOR_ONLY           2 | 
|---|
| 182 | #define BLT_CONFIG_MONO_ONLY            4 | 
|---|
| 183 | #define BLT_CONFIG_DONT_SET_DEFAULT     8 | 
|---|
| 184 | #define BLT_CONFIG_OPTION_SPECIFIED     0x10 | 
|---|
| 185 | #define BLT_CONFIG_USER_BIT             0x100 | 
|---|
| 186 |  | 
|---|
| 187 | /* | 
|---|
| 188 | * Values for "flags" field of Blt_ConfigSpec structures.  Be sure | 
|---|
| 189 | * to coordinate these values with those defined in tk.h | 
|---|
| 190 | * (BLT_CONFIG_COLOR_ONLY, etc.).  There must not be overlap! | 
|---|
| 191 | * | 
|---|
| 192 | * INIT -               Non-zero means (char *) things have been | 
|---|
| 193 | *                      converted to Tk_Uid's. | 
|---|
| 194 | */ | 
|---|
| 195 |  | 
|---|
| 196 | #define INIT            0x20 | 
|---|
| 197 |  | 
|---|
| 198 | EXTERN int Blt_ConfigureInfoFromObj _ANSI_ARGS_((Tcl_Interp *interp, | 
|---|
| 199 | Tk_Window tkwin, Blt_ConfigSpec *specs, char *widgRec, | 
|---|
| 200 | Tcl_Obj *objPtr, int flags)); | 
|---|
| 201 | EXTERN int Blt_ConfigureValueFromObj _ANSI_ARGS_((Tcl_Interp *interp, | 
|---|
| 202 | Tk_Window tkwin, Blt_ConfigSpec *specs, char * widgRec, | 
|---|
| 203 | Tcl_Obj *objPtr, int flags)); | 
|---|
| 204 | EXTERN int Blt_ConfigureWidgetFromObj _ANSI_ARGS_((Tcl_Interp *interp, | 
|---|
| 205 | Tk_Window tkwin, Blt_ConfigSpec *specs, int objc, Tcl_Obj *CONST *objv, | 
|---|
| 206 | char *widgRec, int flags)); | 
|---|
| 207 | EXTERN int Blt_ConfigureComponentFromObj _ANSI_ARGS_((Tcl_Interp *interp, | 
|---|
| 208 | Tk_Window tkwin, char *name, char *className, Blt_ConfigSpec *specs, | 
|---|
| 209 | int objc, Tcl_Obj *CONST *objv, char *widgRec, int flags)); | 
|---|
| 210 |  | 
|---|
| 211 | EXTERN int Blt_ObjConfigModified _ANSI_ARGS_(TCL_VARARGS(Blt_ConfigSpec *, specs)); | 
|---|
| 212 | EXTERN void Blt_FreeObjOptions _ANSI_ARGS_((Blt_ConfigSpec *specs, | 
|---|
| 213 | char *widgRec, Display *display, int needFlags)); | 
|---|
| 214 |  | 
|---|
| 215 | EXTERN int Blt_ObjIsOption _ANSI_ARGS_((Blt_ConfigSpec *specs, Tcl_Obj *objPtr, | 
|---|
| 216 | int flags)); | 
|---|
| 217 |  | 
|---|
| 218 | EXTERN int Blt_GetPositionFromObj _ANSI_ARGS_((Tcl_Interp *interp, | 
|---|
| 219 | Tcl_Obj *objPtr, int *indexPtr)); | 
|---|
| 220 |  | 
|---|
| 221 | EXTERN int Blt_GetPixelsFromObj _ANSI_ARGS_((Tcl_Interp *interp, | 
|---|
| 222 | Tk_Window tkwin, Tcl_Obj *objPtr, int flags, int *valuePtr)); | 
|---|
| 223 |  | 
|---|
| 224 | EXTERN int Blt_GetPadFromObj  _ANSI_ARGS_((Tcl_Interp *interp, | 
|---|
| 225 | Tk_Window tkwin, Tcl_Obj *objPtr, Blt_Pad *padPtr)); | 
|---|
| 226 |  | 
|---|
| 227 | EXTERN int Blt_GetShadowFromObj _ANSI_ARGS_((Tcl_Interp *interp, | 
|---|
| 228 | Tk_Window tkwin, Tcl_Obj *objPtr, Shadow *shadowPtr)); | 
|---|
| 229 |  | 
|---|
| 230 | EXTERN int Blt_GetStateFromObj  _ANSI_ARGS_((Tcl_Interp *interp, | 
|---|
| 231 | Tcl_Obj *objPtr, int *statePtr)); | 
|---|
| 232 |  | 
|---|
| 233 | EXTERN int Blt_GetFillFromObj  _ANSI_ARGS_((Tcl_Interp *interp, | 
|---|
| 234 | Tcl_Obj *objPtr, int *fillPtr)); | 
|---|
| 235 |  | 
|---|
| 236 | EXTERN int Blt_GetDashesFromObj  _ANSI_ARGS_((Tcl_Interp *interp, | 
|---|
| 237 | Tcl_Obj *objPtr, Blt_Dashes *dashesPtr)); | 
|---|
| 238 |  | 
|---|
| 239 |  | 
|---|
| 240 | #if ((TK_VERSION_NUMBER >= _VERSION(8,0,0)) && \ | 
|---|
| 241 | (TK_VERSION_NUMBER < _VERSION(8,1,0))) | 
|---|
| 242 | EXTERN int Tk_GetAnchorFromObj _ANSI_ARGS_((Tcl_Interp *interp, | 
|---|
| 243 | Tcl_Obj *objPtr, Tk_Anchor *anchorPtr)); | 
|---|
| 244 | EXTERN int Tk_GetJustifyFromObj _ANSI_ARGS_((Tcl_Interp *interp, | 
|---|
| 245 | Tcl_Obj *objPtr, Tk_Justify *justifyPtr)); | 
|---|
| 246 | EXTERN int Tk_GetReliefFromObj _ANSI_ARGS_((Tcl_Interp *interp, | 
|---|
| 247 | Tcl_Obj *objPtr, int *reliefPtr)); | 
|---|
| 248 | EXTERN int Tk_GetMMFromObj _ANSI_ARGS_((Tcl_Interp *interp, Tk_Window tkwin, | 
|---|
| 249 | Tcl_Obj *objPtr, double *doublePtr)); | 
|---|
| 250 | EXTERN int Tk_GetPixelsFromObj _ANSI_ARGS_((Tcl_Interp *interp, | 
|---|
| 251 | Tk_Window tkwin, Tcl_Obj *objPtr, int *intPtr)); | 
|---|
| 252 | EXTERN Tk_3DBorder Tk_Alloc3DBorderFromObj _ANSI_ARGS_((Tcl_Interp *interp, | 
|---|
| 253 | Tk_Window tkwin, Tcl_Obj *objPtr)); | 
|---|
| 254 | EXTERN Pixmap Tk_AllocBitmapFromObj _ANSI_ARGS_((Tcl_Interp *interp, | 
|---|
| 255 | Tk_Window tkwin, Tcl_Obj *objPtr)); | 
|---|
| 256 | EXTERN Tk_Font Tk_AllocFontFromObj _ANSI_ARGS_((Tcl_Interp *interp, | 
|---|
| 257 | Tk_Window tkwin, Tcl_Obj *objPtr)); | 
|---|
| 258 | EXTERN Tk_Cursor Tk_AllocCursorFromObj _ANSI_ARGS_((Tcl_Interp *interp, | 
|---|
| 259 | Tk_Window tkwin, Tcl_Obj *objPtr)); | 
|---|
| 260 | EXTERN XColor *Tk_AllocColorFromObj _ANSI_ARGS_((Tcl_Interp *interp, | 
|---|
| 261 | Tk_Window tkwin, Tcl_Obj *objPtr)); | 
|---|
| 262 | #endif /* 8.0 */ | 
|---|
| 263 |  | 
|---|
| 264 | #endif /* BLT_OBJCONFIG_H */ | 
|---|