ttkWidget.h 8.7 KB

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