ttkTheme.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450
  1. /*
  2. * Copyright (c) 2003 Joe English. Freely redistributable.
  3. *
  4. * Declarations for Tk theme engine.
  5. */
  6. #ifndef _TTKTHEME
  7. #define _TTKTHEME
  8. #ifdef __cplusplus
  9. extern "C" {
  10. #endif
  11. #ifndef MODULE_SCOPE
  12. # ifdef __cplusplus
  13. # define MODULE_SCOPE extern "C"
  14. # else
  15. # define MODULE_SCOPE extern
  16. # endif
  17. #endif
  18. #define TTKAPI MODULE_SCOPE
  19. /* Ttk syncs to the Tk version & patchlevel */
  20. #define TTK_VERSION TK_VERSION
  21. #define TTK_PATCH_LEVEL TK_PATCH_LEVEL
  22. /*------------------------------------------------------------------------
  23. * +++ Defaults for element option specifications.
  24. */
  25. #define DEFAULT_FONT "TkDefaultFont"
  26. #ifdef MAC_OSX_TK
  27. #define DEFAULT_BACKGROUND "systemTextBackgroundColor"
  28. #define DEFAULT_FOREGROUND "systemTextColor"
  29. #else
  30. #define DEFAULT_BACKGROUND "#d9d9d9"
  31. #define DEFAULT_FOREGROUND "black"
  32. #endif
  33. /*------------------------------------------------------------------------
  34. * +++ Widget states.
  35. * Keep in sync with stateNames[] in tkstate.c.
  36. */
  37. typedef unsigned int Ttk_State;
  38. #define TTK_STATE_ACTIVE (1<<0)
  39. #define TTK_STATE_DISABLED (1<<1)
  40. #define TTK_STATE_FOCUS (1<<2)
  41. #define TTK_STATE_PRESSED (1<<3)
  42. #define TTK_STATE_SELECTED (1<<4)
  43. #define TTK_STATE_BACKGROUND (1<<5)
  44. #define TTK_STATE_ALTERNATE (1<<6)
  45. #define TTK_STATE_INVALID (1<<7)
  46. #define TTK_STATE_READONLY (1<<8)
  47. #define TTK_STATE_HOVER (1<<9)
  48. #define TTK_STATE_USER6 (1<<10)
  49. #define TTK_STATE_USER5 (1<<11)
  50. #define TTK_STATE_USER4 (1<<12)
  51. #define TTK_STATE_USER3 (1<<13)
  52. #define TTK_STATE_USER2 (1<<14)
  53. #define TTK_STATE_USER1 (1<<15)
  54. /* Maintenance note: if you get all the way to "USER1",
  55. * see tkstate.c
  56. */
  57. typedef struct
  58. {
  59. unsigned int onbits; /* bits to turn on */
  60. unsigned int offbits; /* bits to turn off */
  61. } Ttk_StateSpec;
  62. #define Ttk_StateMatches(state, spec) \
  63. (((state) & ((spec)->onbits|(spec)->offbits)) == (spec)->onbits)
  64. #define Ttk_ModifyState(state, spec) \
  65. (((state) & ~(spec)->offbits) | (spec)->onbits)
  66. TTKAPI int Ttk_GetStateSpecFromObj(Tcl_Interp *, Tcl_Obj *, Ttk_StateSpec *);
  67. TTKAPI Tcl_Obj *Ttk_NewStateSpecObj(unsigned int onbits,unsigned int offbits);
  68. /*------------------------------------------------------------------------
  69. * +++ State maps and state tables.
  70. */
  71. typedef Tcl_Obj *Ttk_StateMap;
  72. TTKAPI Ttk_StateMap Ttk_GetStateMapFromObj(Tcl_Interp *, Tcl_Obj *);
  73. TTKAPI Tcl_Obj *Ttk_StateMapLookup(Tcl_Interp*, Ttk_StateMap, Ttk_State);
  74. /*
  75. * Table for looking up an integer index based on widget state:
  76. */
  77. typedef struct
  78. {
  79. int index; /* Value to return if this entry matches */
  80. unsigned int onBits; /* Bits which must be set */
  81. unsigned int offBits; /* Bits which must be cleared */
  82. } Ttk_StateTable;
  83. TTKAPI int Ttk_StateTableLookup(Ttk_StateTable map[], Ttk_State);
  84. /*------------------------------------------------------------------------
  85. * +++ Padding.
  86. * Used to represent internal padding and borders.
  87. */
  88. typedef struct
  89. {
  90. short left;
  91. short top;
  92. short right;
  93. short bottom;
  94. } Ttk_Padding;
  95. TTKAPI int Ttk_GetPaddingFromObj(Tcl_Interp*,Tk_Window,Tcl_Obj*,Ttk_Padding*);
  96. TTKAPI int Ttk_GetBorderFromObj(Tcl_Interp*,Tcl_Obj*,Ttk_Padding*);
  97. TTKAPI Ttk_Padding Ttk_MakePadding(short l, short t, short r, short b);
  98. TTKAPI Ttk_Padding Ttk_UniformPadding(short borderWidth);
  99. TTKAPI Ttk_Padding Ttk_AddPadding(Ttk_Padding, Ttk_Padding);
  100. TTKAPI Ttk_Padding Ttk_RelievePadding(Ttk_Padding, int relief, int n);
  101. #define Ttk_PaddingWidth(p) ((p).left + (p).right)
  102. #define Ttk_PaddingHeight(p) ((p).top + (p).bottom)
  103. #define Ttk_SetMargins(tkwin, pad) \
  104. Tk_SetInternalBorderEx(tkwin, pad.left, pad.right, pad.top, pad.bottom)
  105. /*------------------------------------------------------------------------
  106. * +++ Boxes.
  107. * Used to represent rectangular regions
  108. */
  109. typedef struct /* Hey, this is an XRectangle! */
  110. {
  111. int x;
  112. int y;
  113. int width;
  114. int height;
  115. } Ttk_Box;
  116. TTKAPI Ttk_Box Ttk_MakeBox(int x, int y, int width, int height);
  117. TTKAPI int Ttk_BoxContains(Ttk_Box, int x, int y);
  118. #define Ttk_WinBox(tkwin) Ttk_MakeBox(0,0,Tk_Width(tkwin),Tk_Height(tkwin))
  119. /*------------------------------------------------------------------------
  120. * +++ Layout utilities.
  121. */
  122. typedef enum {
  123. TTK_SIDE_LEFT, TTK_SIDE_TOP, TTK_SIDE_RIGHT, TTK_SIDE_BOTTOM
  124. } Ttk_Side;
  125. typedef unsigned int Ttk_Sticky;
  126. /*
  127. * -sticky bits for Ttk_StickBox:
  128. */
  129. #define TTK_STICK_W (0x1)
  130. #define TTK_STICK_E (0x2)
  131. #define TTK_STICK_N (0x4)
  132. #define TTK_STICK_S (0x8)
  133. /*
  134. * Aliases and useful combinations:
  135. */
  136. #define TTK_FILL_X (0x3) /* -sticky ew */
  137. #define TTK_FILL_Y (0xC) /* -sticky ns */
  138. #define TTK_FILL_BOTH (0xF) /* -sticky nswe */
  139. TTKAPI int Ttk_GetStickyFromObj(Tcl_Interp *, Tcl_Obj *, Ttk_Sticky *);
  140. TTKAPI Tcl_Obj *Ttk_NewStickyObj(Ttk_Sticky);
  141. /*
  142. * Extra bits for position specifications (combine -side and -sticky)
  143. */
  144. typedef unsigned int Ttk_PositionSpec; /* See below */
  145. #define TTK_PACK_LEFT (0x10) /* pack at left of current parcel */
  146. #define TTK_PACK_RIGHT (0x20) /* pack at right of current parcel */
  147. #define TTK_PACK_TOP (0x40) /* pack at top of current parcel */
  148. #define TTK_PACK_BOTTOM (0x80) /* pack at bottom of current parcel */
  149. #define TTK_EXPAND (0x100) /* use entire parcel */
  150. #define TTK_BORDER (0x200) /* draw this element after children */
  151. #define TTK_UNIT (0x400) /* treat descendants as a part of element */
  152. /*
  153. * Extra bits for layout specifications
  154. */
  155. #define _TTK_CHILDREN (0x1000)/* for LayoutSpecs -- children follow */
  156. #define _TTK_LAYOUT_END (0x2000)/* for LayoutSpecs -- end of child list */
  157. #define _TTK_LAYOUT (0x4000)/* for LayoutSpec tables -- define layout */
  158. #define _TTK_MASK_STICK (0x0F) /* See Ttk_UnparseLayout() */
  159. #define _TTK_MASK_PACK (0xF0) /* See Ttk_UnparseLayout(), packStrings */
  160. TTKAPI Ttk_Box Ttk_PackBox(Ttk_Box *cavity, int w, int h, Ttk_Side side);
  161. TTKAPI Ttk_Box Ttk_StickBox(Ttk_Box parcel, int w, int h, Ttk_Sticky sticky);
  162. TTKAPI Ttk_Box Ttk_AnchorBox(Ttk_Box parcel, int w, int h, Tk_Anchor anchor);
  163. TTKAPI Ttk_Box Ttk_PadBox(Ttk_Box b, Ttk_Padding p);
  164. TTKAPI Ttk_Box Ttk_ExpandBox(Ttk_Box b, Ttk_Padding p);
  165. TTKAPI Ttk_Box Ttk_PlaceBox(Ttk_Box *cavity, int w,int h, Ttk_Side,Ttk_Sticky);
  166. TTKAPI Ttk_Box Ttk_PositionBox(Ttk_Box *cavity, int w, int h, Ttk_PositionSpec);
  167. /*------------------------------------------------------------------------
  168. * +++ Themes.
  169. */
  170. MODULE_SCOPE void Ttk_StylePkgInit(Tcl_Interp *);
  171. typedef struct Ttk_Theme_ *Ttk_Theme;
  172. typedef struct Ttk_ElementClass_ Ttk_ElementClass;
  173. typedef struct Ttk_Layout_ *Ttk_Layout;
  174. typedef struct Ttk_LayoutNode_ *Ttk_Element;
  175. typedef struct Ttk_Style_ *Ttk_Style;
  176. TTKAPI Ttk_Theme Ttk_GetTheme(Tcl_Interp *interp, const char *name);
  177. TTKAPI Ttk_Theme Ttk_GetDefaultTheme(Tcl_Interp *interp);
  178. TTKAPI Ttk_Theme Ttk_GetCurrentTheme(Tcl_Interp *interp);
  179. TTKAPI Ttk_Theme Ttk_CreateTheme(
  180. Tcl_Interp *interp, const char *name, Ttk_Theme parent);
  181. typedef int (Ttk_ThemeEnabledProc)(Ttk_Theme theme, void *clientData);
  182. MODULE_SCOPE void Ttk_SetThemeEnabledProc(Ttk_Theme, Ttk_ThemeEnabledProc, void *);
  183. MODULE_SCOPE int Ttk_UseTheme(Tcl_Interp *, Ttk_Theme);
  184. typedef void (Ttk_CleanupProc)(void *clientData);
  185. TTKAPI void Ttk_RegisterCleanup(
  186. Tcl_Interp *interp, void *deleteData, Ttk_CleanupProc *cleanupProc);
  187. /*------------------------------------------------------------------------
  188. * +++ Elements.
  189. */
  190. enum TTKStyleVersion2 { TK_STYLE_VERSION_2 = 2 };
  191. typedef void (Ttk_ElementSizeProc)(void *clientData, void *elementRecord,
  192. Tk_Window tkwin, int *widthPtr, int *heightPtr, Ttk_Padding*);
  193. typedef void (Ttk_ElementDrawProc)(void *clientData, void *elementRecord,
  194. Tk_Window tkwin, Drawable d, Ttk_Box b, Ttk_State state);
  195. typedef struct Ttk_ElementOptionSpec
  196. {
  197. const char *optionName; /* Command-line name of the widget option */
  198. Tk_OptionType type; /* Accepted option types */
  199. int offset; /* Offset of Tcl_Obj* field in element record */
  200. const char *defaultValue; /* Default value to used if resource missing */
  201. } Ttk_ElementOptionSpec;
  202. #define TK_OPTION_ANY TK_OPTION_STRING
  203. typedef struct Ttk_ElementSpec {
  204. enum TTKStyleVersion2 version; /* Version of the style support. */
  205. size_t elementSize; /* Size of element record */
  206. Ttk_ElementOptionSpec *options; /* List of options, NULL-terminated */
  207. Ttk_ElementSizeProc *size; /* Compute min size and padding */
  208. Ttk_ElementDrawProc *draw; /* Draw the element */
  209. } Ttk_ElementSpec;
  210. TTKAPI Ttk_ElementClass *Ttk_RegisterElement(
  211. Tcl_Interp *interp, Ttk_Theme theme, const char *elementName,
  212. Ttk_ElementSpec *, void *clientData);
  213. typedef int (*Ttk_ElementFactory)
  214. (Tcl_Interp *, void *clientData,
  215. Ttk_Theme, const char *elementName, int objc, Tcl_Obj *const objv[]);
  216. TTKAPI int Ttk_RegisterElementFactory(
  217. Tcl_Interp *, const char *name, Ttk_ElementFactory, void *clientData);
  218. /*
  219. * Null element implementation:
  220. * has no geometry or layout; may be used as a stub or placeholder.
  221. */
  222. typedef struct {
  223. Tcl_Obj *unused;
  224. } NullElement;
  225. MODULE_SCOPE void TtkNullElementSize
  226. (void *, void *, Tk_Window, int *, int *, Ttk_Padding *);
  227. MODULE_SCOPE void TtkNullElementDraw
  228. (void *, void *, Tk_Window, Drawable, Ttk_Box, Ttk_State);
  229. MODULE_SCOPE Ttk_ElementOptionSpec TtkNullElementOptions[];
  230. MODULE_SCOPE Ttk_ElementSpec ttkNullElementSpec;
  231. /*------------------------------------------------------------------------
  232. * +++ Layout templates.
  233. */
  234. typedef struct {
  235. const char * elementName;
  236. unsigned opcode;
  237. } TTKLayoutInstruction, *Ttk_LayoutSpec;
  238. #define TTK_BEGIN_LAYOUT_TABLE(name) \
  239. static TTKLayoutInstruction name[] = {
  240. #define TTK_LAYOUT(name, content) \
  241. { name, _TTK_CHILDREN|_TTK_LAYOUT }, \
  242. content \
  243. { 0, _TTK_LAYOUT_END },
  244. #define TTK_GROUP(name, flags, children) \
  245. { name, flags | _TTK_CHILDREN }, \
  246. children \
  247. { 0, _TTK_LAYOUT_END },
  248. #define TTK_NODE(name, flags) { name, flags },
  249. #define TTK_END_LAYOUT_TABLE { 0, _TTK_LAYOUT | _TTK_LAYOUT_END } };
  250. #define TTK_BEGIN_LAYOUT(name) static TTKLayoutInstruction name[] = {
  251. #define TTK_END_LAYOUT { 0, _TTK_LAYOUT_END } };
  252. TTKAPI void Ttk_RegisterLayout(
  253. Ttk_Theme theme, const char *className, Ttk_LayoutSpec layoutSpec);
  254. TTKAPI void Ttk_RegisterLayouts(
  255. Ttk_Theme theme, Ttk_LayoutSpec layoutTable);
  256. /*------------------------------------------------------------------------
  257. * +++ Layout instances.
  258. */
  259. MODULE_SCOPE Ttk_Layout Ttk_CreateLayout(
  260. Tcl_Interp *, Ttk_Theme, const char *name,
  261. void *recordPtr, Tk_OptionTable, Tk_Window tkwin);
  262. MODULE_SCOPE Ttk_Layout Ttk_CreateSublayout(
  263. Tcl_Interp *, Ttk_Theme, Ttk_Layout, const char *name, Tk_OptionTable);
  264. MODULE_SCOPE void Ttk_FreeLayout(Ttk_Layout);
  265. MODULE_SCOPE void Ttk_LayoutSize(Ttk_Layout,Ttk_State,int *widthPtr,int *heightPtr);
  266. MODULE_SCOPE void Ttk_PlaceLayout(Ttk_Layout, Ttk_State, Ttk_Box);
  267. MODULE_SCOPE void Ttk_DrawLayout(Ttk_Layout, Ttk_State, Drawable);
  268. MODULE_SCOPE void Ttk_RebindSublayout(Ttk_Layout, void *recordPtr);
  269. MODULE_SCOPE Ttk_Element Ttk_IdentifyElement(Ttk_Layout, int x, int y);
  270. MODULE_SCOPE Ttk_Element Ttk_FindElement(Ttk_Layout, const char *nodeName);
  271. MODULE_SCOPE const char *Ttk_ElementName(Ttk_Element);
  272. MODULE_SCOPE Ttk_Box Ttk_ElementParcel(Ttk_Element);
  273. MODULE_SCOPE Ttk_Box Ttk_ClientRegion(Ttk_Layout, const char *elementName);
  274. MODULE_SCOPE Ttk_Box Ttk_LayoutNodeInternalParcel(Ttk_Layout,Ttk_Element);
  275. MODULE_SCOPE Ttk_Padding Ttk_LayoutNodeInternalPadding(Ttk_Layout,Ttk_Element);
  276. MODULE_SCOPE void Ttk_LayoutNodeReqSize(Ttk_Layout, Ttk_Element, int *w, int *h);
  277. MODULE_SCOPE void Ttk_PlaceElement(Ttk_Layout, Ttk_Element, Ttk_Box);
  278. MODULE_SCOPE void Ttk_ChangeElementState(Ttk_Element,unsigned set,unsigned clr);
  279. MODULE_SCOPE Tcl_Obj *Ttk_QueryOption(Ttk_Layout, const char *, Ttk_State);
  280. TTKAPI Ttk_Style Ttk_LayoutStyle(Ttk_Layout);
  281. TTKAPI Tcl_Obj *Ttk_StyleDefault(Ttk_Style, const char *optionName);
  282. TTKAPI Tcl_Obj *Ttk_StyleMap(Ttk_Style, const char *optionName, Ttk_State);
  283. /*------------------------------------------------------------------------
  284. * +++ Resource cache.
  285. * See resource.c for explanation.
  286. */
  287. typedef struct Ttk_ResourceCache_ *Ttk_ResourceCache;
  288. MODULE_SCOPE Ttk_ResourceCache Ttk_CreateResourceCache(Tcl_Interp *);
  289. MODULE_SCOPE void Ttk_FreeResourceCache(Ttk_ResourceCache);
  290. MODULE_SCOPE Ttk_ResourceCache Ttk_GetResourceCache(Tcl_Interp*);
  291. MODULE_SCOPE Tcl_Obj *Ttk_UseFont(Ttk_ResourceCache, Tk_Window, Tcl_Obj *);
  292. MODULE_SCOPE Tcl_Obj *Ttk_UseColor(Ttk_ResourceCache, Tk_Window, Tcl_Obj *);
  293. MODULE_SCOPE Tcl_Obj *Ttk_UseBorder(Ttk_ResourceCache, Tk_Window, Tcl_Obj *);
  294. MODULE_SCOPE Tk_Image Ttk_UseImage(Ttk_ResourceCache, Tk_Window, Tcl_Obj *);
  295. MODULE_SCOPE void Ttk_RegisterNamedColor(Ttk_ResourceCache, const char *, XColor *);
  296. /*------------------------------------------------------------------------
  297. * +++ Image specifications.
  298. */
  299. typedef struct TtkImageSpec Ttk_ImageSpec;
  300. TTKAPI Ttk_ImageSpec *TtkGetImageSpec(Tcl_Interp *, Tk_Window, Tcl_Obj *);
  301. TTKAPI Ttk_ImageSpec *TtkGetImageSpecEx(Tcl_Interp *, Tk_Window, Tcl_Obj *,
  302. Tk_ImageChangedProc *, ClientData);
  303. TTKAPI void TtkFreeImageSpec(Ttk_ImageSpec *);
  304. TTKAPI Tk_Image TtkSelectImage(Ttk_ImageSpec *, Ttk_State);
  305. /*------------------------------------------------------------------------
  306. * +++ Miscellaneous enumerations.
  307. * Other stuff that element implementations need to know about.
  308. */
  309. typedef enum /* -default option values */
  310. {
  311. TTK_BUTTON_DEFAULT_NORMAL, /* widget defaultable */
  312. TTK_BUTTON_DEFAULT_ACTIVE, /* currently the default widget */
  313. TTK_BUTTON_DEFAULT_DISABLED /* not defaultable */
  314. } Ttk_ButtonDefaultState;
  315. TTKAPI int Ttk_GetButtonDefaultStateFromObj(Tcl_Interp *, Tcl_Obj *, int *);
  316. typedef enum /* -compound option values */
  317. {
  318. TTK_COMPOUND_NONE, /* image if specified, otherwise text */
  319. TTK_COMPOUND_TEXT, /* text only */
  320. TTK_COMPOUND_IMAGE, /* image only */
  321. TTK_COMPOUND_CENTER, /* text overlays image */
  322. TTK_COMPOUND_TOP, /* image above text */
  323. TTK_COMPOUND_BOTTOM, /* image below text */
  324. TTK_COMPOUND_LEFT, /* image to left of text */
  325. TTK_COMPOUND_RIGHT /* image to right of text */
  326. } Ttk_Compound;
  327. TTKAPI int Ttk_GetCompoundFromObj(Tcl_Interp *, Tcl_Obj *, int *);
  328. typedef enum { /* -orient option values */
  329. TTK_ORIENT_HORIZONTAL,
  330. TTK_ORIENT_VERTICAL
  331. } Ttk_Orient;
  332. /*------------------------------------------------------------------------
  333. * +++ Utilities.
  334. */
  335. typedef struct TtkEnsemble {
  336. const char *name; /* subcommand name */
  337. Tcl_ObjCmdProc *command; /* subcommand implementation, OR: */
  338. const struct TtkEnsemble *ensemble; /* subcommand ensemble */
  339. } Ttk_Ensemble;
  340. MODULE_SCOPE int Ttk_InvokeEnsemble( /* Run an ensemble command */
  341. const Ttk_Ensemble *commands, int cmdIndex,
  342. void *clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);
  343. MODULE_SCOPE int TtkEnumerateHashTable(Tcl_Interp *, Tcl_HashTable *);
  344. /*------------------------------------------------------------------------
  345. * +++ Stub table declarations.
  346. */
  347. #include "ttkDecls.h"
  348. /*
  349. * Drawing utilities for theme code:
  350. * (@@@ find a better home for this)
  351. */
  352. typedef enum { ARROW_UP, ARROW_DOWN, ARROW_LEFT, ARROW_RIGHT } ArrowDirection;
  353. MODULE_SCOPE void TtkArrowSize(int h, ArrowDirection, int *widthPtr, int *heightPtr);
  354. MODULE_SCOPE void TtkDrawArrow(Display *, Drawable, GC, Ttk_Box, ArrowDirection);
  355. MODULE_SCOPE void TtkFillArrow(Display *, Drawable, GC, Ttk_Box, ArrowDirection);
  356. #ifdef __cplusplus
  357. }
  358. #endif
  359. #endif /* _TTKTHEME */