1 /* 2 * Copyright (c) 2003, Joe English 3 * Helper routines for widget implementations. 4 */ 5 6 #ifndef _TTKWIDGET 7 #define _TTKWIDGET 8 9 /* 10 * State flags for 'flags' field. 11 */ 12 #define WIDGET_DESTROYED 0x0001 13 #define REDISPLAY_PENDING 0x0002 /* scheduled call to RedisplayWidget */ 14 #define CURSOR_ON 0x0020 /* See TtkBlinkCursor() */ 15 #define WIDGET_USER_FLAG 0x0100 /* 0x0100 - 0x8000 for user flags */ 16 17 /* 18 * Bit fields for OptionSpec 'mask' field: 19 */ 20 #define READONLY_OPTION 0x1 21 #define STYLE_CHANGED 0x2 22 #define GEOMETRY_CHANGED 0x4 23 24 /* 25 * Core widget elements 26 */ 27 typedef struct WidgetSpec_ WidgetSpec; /* Forward */ 28 29 typedef struct 30 { 31 Tk_Window tkwin; /* Window associated with widget */ 32 Tcl_Interp *interp; /* Interpreter associated with widget. */ 33 WidgetSpec *widgetSpec; /* Widget class hooks */ 34 Tcl_Command widgetCmd; /* Token for widget command. */ 35 Tk_OptionTable optionTable; /* Option table */ 36 Ttk_Layout layout; /* Widget layout */ 37 38 /* 39 * Storage for resources: 40 */ 41 Tcl_Obj *takeFocusPtr; /* Storage for -takefocus option */ 42 Tcl_Obj *cursorObj; /* Storage for -cursor option */ 43 Tcl_Obj *styleObj; /* Name of currently-applied style */ 44 Tcl_Obj *classObj; /* Class name (readonly option) */ 45 46 Ttk_State state; /* Current widget state */ 47 unsigned int flags; /* internal flags, see above */ 48 49 } WidgetCore; 50 51 /* 52 * Widget specifications: 53 */ 54 struct WidgetSpec_ 55 { 56 const char *className; /* Widget class name */ 57 size_t recordSize; /* #bytes in widget record */ 58 const Tk_OptionSpec *optionSpecs; /* Option specifications */ 59 const Ttk_Ensemble *commands; /* Widget instance subcommands */ 60 61 /* 62 * Hooks: 63 */ 64 void (*initializeProc)(Tcl_Interp *, void *recordPtr); 65 void (*cleanupProc)(void *recordPtr); 66 int (*configureProc)(Tcl_Interp *, void *recordPtr, int flags); 67 int (*postConfigureProc)(Tcl_Interp *, void *recordPtr, int flags); 68 Ttk_Layout (*getLayoutProc)(Tcl_Interp *,Ttk_Theme, void *recordPtr); 69 int (*sizeProc)(void *recordPtr, int *widthPtr, int *heightPtr); 70 void (*layoutProc)(void *recordPtr); 71 void (*displayProc)(void *recordPtr, Drawable d); 72 }; 73 74 /* 75 * Common factors for widget implementations: 76 */ 77 MODULE_SCOPE void TtkNullInitialize(Tcl_Interp *, void *); 78 MODULE_SCOPE int TtkNullPostConfigure(Tcl_Interp *, void *, int); 79 MODULE_SCOPE void TtkNullCleanup(void *recordPtr); 80 MODULE_SCOPE Ttk_Layout TtkWidgetGetLayout( 81 Tcl_Interp *, Ttk_Theme, void *recordPtr); 82 MODULE_SCOPE Ttk_Layout TtkWidgetGetOrientedLayout( 83 Tcl_Interp *, Ttk_Theme, void *recordPtr, Tcl_Obj *orientObj); 84 MODULE_SCOPE int TtkWidgetSize(void *recordPtr, int *w, int *h); 85 MODULE_SCOPE void TtkWidgetDoLayout(void *recordPtr); 86 MODULE_SCOPE void TtkWidgetDisplay(void *recordPtr, Drawable); 87 88 MODULE_SCOPE int TtkCoreConfigure(Tcl_Interp*, void *, int mask); 89 90 /* Common widget commands: 91 */ 92 MODULE_SCOPE int TtkWidgetConfigureCommand( 93 void *,Tcl_Interp *, int, Tcl_Obj*const[]); 94 MODULE_SCOPE int TtkWidgetCgetCommand( 95 void *,Tcl_Interp *, int, Tcl_Obj*const[]); 96 MODULE_SCOPE int TtkWidgetInstateCommand( 97 void *,Tcl_Interp *, int, Tcl_Obj*const[]); 98 MODULE_SCOPE int TtkWidgetStateCommand( 99 void *,Tcl_Interp *, int, Tcl_Obj*const[]); 100 MODULE_SCOPE int TtkWidgetIdentifyCommand( 101 void *,Tcl_Interp *, int, Tcl_Obj*const[]); 102 103 /* Widget constructor: 104 */ 105 MODULE_SCOPE int TtkWidgetConstructorObjCmd( 106 ClientData, Tcl_Interp*, int, Tcl_Obj*const[]); 107 108 #define RegisterWidget(interp, name, specPtr) \ 109 Tcl_CreateObjCommand(interp, name, \ 110 TtkWidgetConstructorObjCmd, (ClientData)specPtr,NULL) 111 112 /* WIDGET_TAKEFOCUS_TRUE -- 113 * WIDGET_TAKEFOCUS_FALSE -- 114 * Add one or the other of these to each OptionSpecs table 115 * to indicate whether the widget should take focus 116 * during keyboard traversal. 117 */ 118 #define WIDGET_TAKEFOCUS_TRUE \ 119 {TK_OPTION_STRING, "-takefocus", "takeFocus", "TakeFocus", \ 120 "ttk::takefocus", Tk_Offset(WidgetCore, takeFocusPtr), -1, 0,0,0 } 121 #define WIDGET_TAKEFOCUS_FALSE \ 122 {TK_OPTION_STRING, "-takefocus", "takeFocus", "TakeFocus", \ 123 "", Tk_Offset(WidgetCore, takeFocusPtr), -1, 0,0,0 } 124 125 /* WIDGET_INHERIT_OPTIONS(baseOptionSpecs) -- 126 * Add this at the end of an OptionSpecs table to inherit 127 * the options from 'baseOptionSpecs'. 128 */ 129 #define WIDGET_INHERIT_OPTIONS(baseOptionSpecs) \ 130 {TK_OPTION_END, 0,0,0, NULL, -1,-1, 0, (ClientData)baseOptionSpecs, 0} 131 132 /* All widgets should inherit from ttkCoreOptionSpecs[]. 133 */ 134 MODULE_SCOPE Tk_OptionSpec ttkCoreOptionSpecs[]; 135 136 /* 137 * Useful routines for use inside widget implementations: 138 */ 139 /* extern int WidgetDestroyed(WidgetCore *); */ 140 #define WidgetDestroyed(corePtr) ((corePtr)->flags & WIDGET_DESTROYED) 141 142 MODULE_SCOPE void TtkWidgetChangeState(WidgetCore *, 143 unsigned int setBits, unsigned int clearBits); 144 145 MODULE_SCOPE void TtkRedisplayWidget(WidgetCore *); 146 MODULE_SCOPE void TtkResizeWidget(WidgetCore *); 147 148 MODULE_SCOPE void TtkTrackElementState(WidgetCore *); 149 MODULE_SCOPE void TtkBlinkCursor(WidgetCore *); 150 151 /* 152 * -state option values (compatibility) 153 */ 154 MODULE_SCOPE void TtkCheckStateOption(WidgetCore *, Tcl_Obj *); 155 156 /* 157 * Variable traces: 158 */ 159 typedef void (*Ttk_TraceProc)(void *recordPtr, const char *value); 160 typedef struct TtkTraceHandle_ Ttk_TraceHandle; 161 162 MODULE_SCOPE Ttk_TraceHandle *Ttk_TraceVariable( 163 Tcl_Interp*, Tcl_Obj *varnameObj, Ttk_TraceProc callback, void *clientData); 164 MODULE_SCOPE void Ttk_UntraceVariable(Ttk_TraceHandle *); 165 MODULE_SCOPE int Ttk_FireTrace(Ttk_TraceHandle *); 166 167 /* 168 * Virtual events: 169 */ 170 MODULE_SCOPE void TtkSendVirtualEvent(Tk_Window tgtWin, const char *eventName); 171 172 /* 173 * Helper routines for data accessor commands: 174 */ 175 MODULE_SCOPE int TtkEnumerateOptions( 176 Tcl_Interp *, void *, const Tk_OptionSpec *, Tk_OptionTable, Tk_Window); 177 MODULE_SCOPE int TtkGetOptionValue( 178 Tcl_Interp *, void *, Tcl_Obj *optName, Tk_OptionTable, Tk_Window); 179 180 /* 181 * Helper routines for scrolling widgets (see scroll.c). 182 */ 183 typedef struct { 184 int first; /* First visible item */ 185 int last; /* Last visible item */ 186 int total; /* Total #items */ 187 char *scrollCmd; /* Widget option */ 188 } Scrollable; 189 190 typedef struct ScrollHandleRec *ScrollHandle; 191 192 MODULE_SCOPE ScrollHandle TtkCreateScrollHandle(WidgetCore *, Scrollable *); 193 MODULE_SCOPE void TtkFreeScrollHandle(ScrollHandle); 194 195 MODULE_SCOPE int TtkScrollviewCommand( 196 Tcl_Interp *interp, int objc, Tcl_Obj *const objv[], ScrollHandle); 197 198 MODULE_SCOPE void TtkUpdateScrollInfo(ScrollHandle h); 199 MODULE_SCOPE void TtkScrollTo(ScrollHandle, int newFirst, int updateScrollInfo); 200 MODULE_SCOPE void TtkScrolled(ScrollHandle, int first, int last, int total); 201 MODULE_SCOPE void TtkScrollbarUpdateRequired(ScrollHandle); 202 203 /* 204 * Tag sets (work in progress, half-baked) 205 */ 206 207 typedef struct TtkTag *Ttk_Tag; 208 typedef struct TtkTagTable *Ttk_TagTable; 209 typedef struct TtkTagSet { /* TODO: make opaque */ 210 Ttk_Tag *tags; 211 int nTags; 212 } *Ttk_TagSet; 213 214 MODULE_SCOPE Ttk_TagTable Ttk_CreateTagTable( 215 Tcl_Interp *, Tk_Window tkwin, Tk_OptionSpec[], int recordSize); 216 MODULE_SCOPE void Ttk_DeleteTagTable(Ttk_TagTable); 217 218 MODULE_SCOPE Ttk_Tag Ttk_GetTag(Ttk_TagTable, const char *tagName); 219 MODULE_SCOPE Ttk_Tag Ttk_GetTagFromObj(Ttk_TagTable, Tcl_Obj *); 220 221 MODULE_SCOPE Tcl_Obj *Ttk_TagOptionValue( 222 Tcl_Interp *, Ttk_TagTable, Ttk_Tag, Tcl_Obj *optionName); 223 224 MODULE_SCOPE int Ttk_EnumerateTagOptions( 225 Tcl_Interp *, Ttk_TagTable, Ttk_Tag); 226 227 MODULE_SCOPE int Ttk_EnumerateTags(Tcl_Interp *, Ttk_TagTable); 228 229 MODULE_SCOPE int Ttk_ConfigureTag( 230 Tcl_Interp *interp, Ttk_TagTable tagTable, Ttk_Tag tag, 231 int objc, Tcl_Obj *const objv[]); 232 233 MODULE_SCOPE Ttk_TagSet Ttk_GetTagSetFromObj( 234 Tcl_Interp *interp, Ttk_TagTable, Tcl_Obj *objPtr); 235 MODULE_SCOPE Tcl_Obj *Ttk_NewTagSetObj(Ttk_TagSet); 236 237 MODULE_SCOPE void Ttk_FreeTagSet(Ttk_TagSet); 238 239 MODULE_SCOPE int Ttk_TagSetContains(Ttk_TagSet, Ttk_Tag tag); 240 MODULE_SCOPE int Ttk_TagSetAdd(Ttk_TagSet, Ttk_Tag tag); 241 MODULE_SCOPE int Ttk_TagSetRemove(Ttk_TagSet, Ttk_Tag tag); 242 243 MODULE_SCOPE void Ttk_TagSetValues(Ttk_TagTable, Ttk_TagSet, void *record); 244 MODULE_SCOPE void Ttk_TagSetApplyStyle(Ttk_TagTable,Ttk_Style,Ttk_State,void*); 245 246 /* 247 * String tables for widget resource specifications: 248 */ 249 250 MODULE_SCOPE const char *ttkOrientStrings[]; 251 MODULE_SCOPE const char *ttkCompoundStrings[]; 252 MODULE_SCOPE const char *ttkDefaultStrings[]; 253 254 /* 255 * ... other option types... 256 */ 257 MODULE_SCOPE int TtkGetLabelAnchorFromObj( 258 Tcl_Interp*, Tcl_Obj*, Ttk_PositionSpec *); 259 260 /* 261 * Platform-specific initialization. 262 */ 263 264 #ifdef _WIN32 265 #define Ttk_PlatformInit Ttk_WinPlatformInit 266 MODULE_SCOPE int Ttk_PlatformInit(Tcl_Interp *); 267 #elif defined(MAC_OSX_TK) 268 #define Ttk_PlatformInit Ttk_MacOSXPlatformInit 269 MODULE_SCOPE int Ttk_PlatformInit(Tcl_Interp *); 270 #else 271 #define Ttk_PlatformInit(interp) /* TTK_X11PlatformInit() */ 272 #endif 273 274 #endif /* _TTKWIDGET */ 275