/*
* tkTheme.h --
* Declarations for Tk style engine.
*
* Copyright (c) 2003 Joe English. Freely redistributable.
*
* $Id: tkTheme.h,v 1.107 2005/06/26 22:34:30 jenglish Exp $
*/
#ifndef TKTHEME_H
#define TKTHEME_H 1
#ifdef __cplusplus
extern "C" {
#endif
#if defined(BUILD_tile)
# define TTKAPI DLLEXPORT
# undef USE_TTK_STUBS
#else
# define TTKAPI DLLIMPORT
#endif
#define TILE_VERSION "0.6"
#define TILE_PATCHLEVEL "0.6.5"
/*------------------------------------------------------------------------
* +++ Defaults for element option specifications.
*/
#define DEFAULT_FONT "TkDefaultFont"
#define DEFAULT_BACKGROUND "#d9d9d9"
#define DEFAULT_FOREGROUND "black"
/*------------------------------------------------------------------------
* +++ Widget states.
* Keep in sync with stateNames[] in tkstate.c.
*/
typedef unsigned int Ttk_State;
#define TTK_STATE_ACTIVE (1<<0)
#define TTK_STATE_DISABLED (1<<1)
#define TTK_STATE_FOCUS (1<<2)
#define TTK_STATE_PRESSED (1<<3)
#define TTK_STATE_SELECTED (1<<4)
#define TTK_STATE_BACKGROUND (1<<5)
#define TTK_STATE_ALTERNATE (1<<6)
#define TTK_STATE_INVALID (1<<7)
#define TTK_STATE_READONLY (1<<8)
#define TTK_STATE_USER7 (1<<9)
#define TTK_STATE_USER6 (1<<10)
#define TTK_STATE_USER5 (1<<11)
#define TTK_STATE_USER4 (1<<12)
#define TTK_STATE_USER3 (1<<13)
#define TTK_STATE_USER2 (1<<14)
#define TTK_STATE_USER1 (1<<15)
/* Maintenance note: if you get all the way to "USER1",
* see tkstate.c
*/
typedef struct
{
unsigned int onbits; /* bits to turn on */
unsigned int offbits; /* bits to turn off */
} Ttk_StateSpec;
#define Ttk_StateMatches(state, spec) \
(((state) & ((spec)->onbits|(spec)->offbits)) == (spec)->onbits)
#define Ttk_ModifyState(state, spec) \
(((state) & ~(spec)->offbits) | (spec)->onbits)
TTKAPI int Ttk_GetStateSpecFromObj(Tcl_Interp *, Tcl_Obj *, Ttk_StateSpec *);
TTKAPI Tcl_Obj *Ttk_NewStateSpecObj(unsigned int onbits,unsigned int offbits);
/*------------------------------------------------------------------------
* +++ State maps and state tables.
*/
typedef Tcl_Obj *Ttk_StateMap;
TTKAPI Ttk_StateMap Ttk_GetStateMapFromObj(Tcl_Interp *, Tcl_Obj *);
TTKAPI Tcl_Obj *Ttk_StateMapLookup(Tcl_Interp*, Ttk_StateMap, Ttk_State);
/*
* Table for looking up an integer index based on widget state:
*/
typedef struct
{
int index; /* Value to return if this entry matches */
unsigned int onBits; /* Bits which must be set */
unsigned int offBits; /* Bits which must be cleared */
} Ttk_StateTable;
TTKAPI int Ttk_StateTableLookup(Ttk_StateTable map[], Ttk_State);
/*------------------------------------------------------------------------
* +++ Padding.
* Used to represent internal padding and borders.
*/
typedef struct
{
short left;
short top;
short right;
short bottom;
} Ttk_Padding;
TTKAPI int Ttk_GetPaddingFromObj(Tcl_Interp*,Tk_Window,Tcl_Obj*,Ttk_Padding*);
TTKAPI int Ttk_GetBorderFromObj(Tcl_Interp*,Tcl_Obj*,Ttk_Padding*);
TTKAPI Ttk_Padding Ttk_MakePadding(short l, short t, short r, short b);
TTKAPI Ttk_Padding Ttk_UniformPadding(short borderWidth);
TTKAPI Ttk_Padding Ttk_AddPadding(Ttk_Padding, Ttk_Padding);
TTKAPI Ttk_Padding Ttk_RelievePadding(Ttk_Padding, int relief, int n);
#define Ttk_PaddingWidth(p) ((p).left + (p).right)
#define Ttk_PaddingHeight(p) ((p).top + (p).bottom)
#define Ttk_SetMargins(tkwin, pad) \
Tk_SetInternalBorderEx(tkwin, pad.left, pad.right, pad.top, pad.bottom)
/*------------------------------------------------------------------------
* +++ Boxes.
* Used to represent rectangular regions
*/
typedef struct /* Hey, this is an XRectangle! */
{
int x;
int y;
int width;
int height;
} Ttk_Box;
TTKAPI Ttk_Box Ttk_MakeBox(int x, int y, int width, int height);
TTKAPI int Ttk_BoxContains(Ttk_Box, int x, int y);
#define Ttk_WinBox(tkwin) Ttk_MakeBox(0,0,Tk_Width(tkwin),Tk_Height(tkwin))
/*------------------------------------------------------------------------
* +++ Layout utilities.
*/
typedef enum {
TTK_SIDE_LEFT, TTK_SIDE_TOP, TTK_SIDE_RIGHT, TTK_SIDE_BOTTOM
} Ttk_Side;
typedef unsigned int Ttk_Sticky;
TTKAPI Ttk_Box Ttk_PackBox(Ttk_Box *cavity, int w, int h, Ttk_Side side);
TTKAPI Ttk_Box Ttk_StickBox(Ttk_Box parcel, int w, int h, Ttk_Sticky sticky);
TTKAPI Ttk_Box Ttk_AnchorBox(Ttk_Box parcel, int w, int h, int anchor);
TTKAPI Ttk_Box Ttk_PadBox(Ttk_Box b, Ttk_Padding p);
TTKAPI Ttk_Box Ttk_ExpandBox(Ttk_Box b, Ttk_Padding p);
TTKAPI Ttk_Box Ttk_PlaceBox(Ttk_Box *cavity, int w, int h, Ttk_Side side, Ttk_Sticky sticky);
/*
* -sticky bits for Ttk_StickBox:
*/
#define TTK_STICK_W (0x1)
#define TTK_STICK_E (0x2)
#define TTK_STICK_N (0x4)
#define TTK_STICK_S (0x8)
/*
* Aliases and useful combinations:
*/
#define TTK_FILL_X (0x3) /* -sticky ew */
#define TTK_FILL_Y (0xC) /* -sticky ns */
#define TTK_FILL_BOTH (0xF) /* -sticky nswe */
TTKAPI int Ttk_GetStickyFromObj(Tcl_Interp *, Tcl_Obj *, Ttk_Sticky *);
TTKAPI Tcl_Obj *Ttk_NewStickyObj(Ttk_Sticky);
/*
* Extra bits for layout specifications:
*/
#define TTK_PACK_LEFT (0x10) /* pack at left of current parcel */
#define TTK_PACK_RIGHT (0x20) /* pack at right of current parcel */
#define TTK_PACK_TOP (0x40) /* pack at top of current parcel */
#define TTK_PACK_BOTTOM (0x80) /* pack at bottom of current parcel */
#define TTK_EXPAND (0x100) /* use entire parcel */
#define TTK_BORDER (0x200) /* draw this element after children */
#define TTK_UNIT (0x400) /* treat descendants as a part of element */
#define TTK_CHILDREN (0x1000)/* for LayoutSpecs -- children follow */
#define TTK_LAYOUT_END (0x2000)/* for LayoutSpecs -- end of child list */
#define _TTK_MASK_STICK (0x0F) /* See Ttk_UnparseLayout() */
#define _TTK_MASK_PACK (0xF0) /* See Ttk_UnparseLayout(), packStrings */
/*------------------------------------------------------------------------
* +++ Themes.
*/
extern void Ttk_StylePkgInit(Tcl_Interp *);
typedef struct Ttk_Theme_ *Ttk_Theme;
typedef struct Ttk_ElementImpl_ *Ttk_Element;
typedef struct Ttk_Layout_ *Ttk_Layout;
typedef struct Ttk_LayoutNode_ Ttk_LayoutNode;
TTKAPI Ttk_Theme Ttk_GetTheme(Tcl_Interp *interp, const char *name);
TTKAPI Ttk_Theme Ttk_GetDefaultTheme(Tcl_Interp *interp);
TTKAPI Ttk_Theme Ttk_GetCurrentTheme(Tcl_Interp *interp);
TTKAPI Ttk_Theme Ttk_CreateTheme(
Tcl_Interp *interp, const char *name, Ttk_Theme parent);
typedef int (Ttk_ThemeEnabledProc)(Ttk_Theme theme, void *clientData);
extern void Ttk_SetThemeEnabledProc(Ttk_Theme, Ttk_ThemeEnabledProc, void *);
extern int Ttk_UseTheme(Tcl_Interp *, Ttk_Theme);
typedef void (Ttk_CleanupProc)(void *clientData);
TTKAPI void Ttk_RegisterCleanup(
Tcl_Interp *interp, void *deleteData, Ttk_CleanupProc *cleanupProc);
/*------------------------------------------------------------------------
* +++ Elements.
*/
enum TTKStyleVersion2 { TK_STYLE_VERSION_2 = 2 };
typedef void (Ttk_ElementSizeProc)(void *clientData, void *elementRecord,
Tk_Window tkwin, int *widthPtr, int *heightPtr, Ttk_Padding*);
typedef void (Ttk_ElementDrawProc)(void *clientData, void *elementRecord,
Tk_Window tkwin, Drawable d, Ttk_Box b, Ttk_State state);
/*
* Flag bit for widget optionSpec->flags, indicating that
* this is a compatibility resource and should be ignored
* by the theme engine:
*/
#define TK_OPTION_COMPAT (TK_CONFIG_USER_BIT)
typedef struct Ttk_ElementOptionSpec
{
char *optionName; /* Command-line name of the widget option */
Tk_OptionType type; /* Accepted option types */
int offset; /* Offset of Tcl_Obj* field in element record */
char *defaultValue; /* Default value to used if resource missing */
} Ttk_ElementOptionSpec;
#define TK_OPTION_ANY TK_OPTION_STRING
typedef struct Ttk_ElementSpec {
enum TTKStyleVersion2 version; /* Version of the style support. */
size_t elementSize; /* Size of element record */
Ttk_ElementOptionSpec *options; /* List of options, NULL-terminated */
Ttk_ElementSizeProc *size; /* Compute min size and padding */
Ttk_ElementDrawProc *draw; /* Draw the element */
} Ttk_ElementSpec;
TTKAPI Ttk_Element Ttk_RegisterElement(
Tcl_Interp *interp, Ttk_Theme theme, const char *elementName,
Ttk_ElementSpec *, void *clientData);
typedef int (*Ttk_ElementFactory)
(Tcl_Interp *, void *clientData,
Ttk_Theme, const char *elementName, int objc, Tcl_Obj *const objv[]);
TTKAPI int Ttk_RegisterElementFactory(
Tcl_Interp *, const char *name, Ttk_ElementFactory, void *clientData);
/*
* Null element implementation:
* has no geometry or layout; may be used as a stub or placeholder.
*/
typedef struct {
Tcl_Obj *unused;
} NullElement;
extern void NullElementGeometry
(void *, void *, Tk_Window, int *, int *, Ttk_Padding *);
extern void NullElementDraw
(void *, void *, Tk_Window, Drawable, Ttk_Box, Ttk_State);
extern Ttk_ElementOptionSpec NullElementOptions[];
extern Ttk_ElementSpec NullElementSpec;
/*------------------------------------------------------------------------
* +++ Layout templates.
*/
typedef struct {
const char * elementName;
unsigned opcode;
} TTKLayoutInstruction, *Ttk_LayoutSpec;
#define TTK_BEGIN_LAYOUT(name) static TTKLayoutInstruction name[] = {
#define TTK_GROUP(name, flags, children) \
{ name, flags | TTK_CHILDREN }, \
children \
{ 0, TTK_LAYOUT_END },
#define TTK_NODE(name, flags) { name, flags },
#define TTK_END_LAYOUT { 0, TTK_LAYOUT_END } };
TTKAPI void Ttk_RegisterLayout(
Ttk_Theme theme, const char *className, Ttk_LayoutSpec layoutSpec);
/*------------------------------------------------------------------------
* +++ Layout instances.
*/
extern Ttk_Layout Ttk_CreateLayout(
Tcl_Interp *, Ttk_Theme, const char *name,
void *recordPtr, Tk_OptionTable, Tk_Window tkwin);
extern Ttk_Layout Ttk_CreateSubLayout(
Tcl_Interp *, Ttk_Theme, const char *name,
void *recordPtr, Tk_OptionTable, Tk_Window tkwin);
extern void Ttk_FreeLayout(Ttk_Layout);
extern void Ttk_LayoutSize(Ttk_Layout,Ttk_State,int *widthPtr,int *heightPtr);
extern void Ttk_PlaceLayout(Ttk_Layout, Ttk_State, Ttk_Box);
extern void Ttk_DrawLayout(Ttk_Layout, Ttk_State, Drawable);
extern void Ttk_RebindSublayout(Ttk_Layout, void *recordPtr);
extern Ttk_LayoutNode *Ttk_LayoutIdentify(Ttk_Layout, int x, int y);
extern Ttk_LayoutNode *Ttk_LayoutFindNode(Ttk_Layout, const char *nodeName);
extern const char *Ttk_LayoutNodeName(Ttk_LayoutNode *);
extern Ttk_Box Ttk_LayoutNodeParcel(Ttk_LayoutNode *);
extern Ttk_Box Ttk_LayoutNodeInternalParcel(Ttk_Layout,Ttk_LayoutNode *);
extern Ttk_Padding Ttk_LayoutNodeInternalPadding(Ttk_Layout,Ttk_LayoutNode *);
extern void Ttk_LayoutNodeReqSize(Ttk_Layout, Ttk_LayoutNode *, int *w, int *h);
extern void Ttk_LayoutNodeSetParcel(Ttk_LayoutNode *node, Ttk_Box parcel);
extern void Ttk_PlaceLayoutNode(Ttk_Layout,Ttk_LayoutNode *, Ttk_Box);
extern void Ttk_ChangeElementState(Ttk_LayoutNode *,unsigned set,unsigned clr);
extern Tcl_Obj *Ttk_QueryOption(Ttk_Layout, const char *, Ttk_State);
/*------------------------------------------------------------------------
* +++ Resource cache.
* See resource.c for explanation.
*/
typedef struct Ttk_ResourceCache_ *Ttk_ResourceCache;
extern Ttk_ResourceCache Ttk_CreateResourceCache(Tcl_Interp *);
extern void Ttk_FreeResourceCache(Ttk_ResourceCache);
extern Ttk_ResourceCache Ttk_GetResourceCache(Tcl_Interp*);
extern Tcl_Obj *Ttk_UseFont(Ttk_ResourceCache, Tk_Window, Tcl_Obj *);
extern Tcl_Obj *Ttk_UseColor(Ttk_ResourceCache, Tk_Window, Tcl_Obj *);
extern Tcl_Obj *Ttk_UseBorder(Ttk_ResourceCache, Tk_Window, Tcl_Obj *);
extern Tk_Image Ttk_UseImage(Ttk_ResourceCache, Tk_Window, Tcl_Obj *);
extern void Ttk_RegisterNamedColor(Ttk_ResourceCache, const char *, XColor *);
/*------------------------------------------------------------------------
* +++ Miscellaneous enumerations.
* Other stuff that element implementations need to know about.
*/
typedef enum /* -default option values */
{
TTK_BUTTON_DEFAULT_NORMAL, /* widget defaultable */
TTK_BUTTON_DEFAULT_ACTIVE, /* currently the default widget */
TTK_BUTTON_DEFAULT_DISABLED /* not defaultable */
} Ttk_ButtonDefaultState;
extern int Ttk_GetButtonDefaultStateFromObj(Tcl_Interp *, Tcl_Obj *, int *);
typedef enum /* -compound option values */
{
TTK_COMPOUND_NONE, /* image if specified, otherwise text */
TTK_COMPOUND_TEXT, /* text only */
TTK_COMPOUND_IMAGE, /* image only */
TTK_COMPOUND_CENTER, /* text overlays image */
TTK_COMPOUND_TOP, /* image above text */
TTK_COMPOUND_BOTTOM, /* image below text */
TTK_COMPOUND_LEFT, /* image to left of text */
TTK_COMPOUND_RIGHT /* image to right of text */
} Ttk_Compound;
extern int Ttk_GetCompoundFromObj(Tcl_Interp *, Tcl_Obj *, int *);
typedef enum { /* -orient option values */
TTK_ORIENT_HORIZONTAL,
TTK_ORIENT_VERTICAL
} Ttk_Orient;
/*------------------------------------------------------------------------
* +++ Stub table declarations:
*/
#include "ttkDecls.h"
/*
* Drawing utilities for theme code:
* (@@@ find a better home for this)
*/
typedef enum { ARROW_UP, ARROW_DOWN, ARROW_LEFT, ARROW_RIGHT } ArrowDirection;
extern void ArrowSize(int h, ArrowDirection, int *widthPtr, int *heightPtr);
extern void DrawArrow(Display *, Drawable, GC, Ttk_Box, ArrowDirection);
extern void FillArrow(Display *, Drawable, GC, Ttk_Box, ArrowDirection);
#ifdef __cplusplus
}
#endif
#endif /* TKTHEME_H */