/*
* tkTheme.h --
* Declarations for Tk style engine.
*
* Copyright (c) 2003 Joe English. Freely redistributable.
*
* $Id: tkTheme.h,v 1.15 2004/01/05 21:57:04 patthoyts Exp $
*/
#ifndef TKTHEME_H
#define TKTHEME_H 1
#ifndef WIN32
#define NO_PRIVATE_HEADERS 1
#endif
/*
* Defaults:
* @@@ should use named fonts here...
* @@@ belongs in platform-specific header file
*/
#if defined(__WIN32__)
#define DEFAULT_FONT "{MS Sans Serif} 8"
#define DEFAULT_BACKGROUND "SystemButtonFace"
#define DEFAULT_SCALE_TROUGHBG "SystemScrollbar"
#else /* Assume Unix */
#define DEFAULT_FONT "sans-serif -12"
#define DEFAULT_BACKGROUND "#d9d9d9"
#define DEFAULT_SCALE_TROUGHBG DEFAULT_BACKGROUND
#endif
#define DEFAULT_FOREGROUND "black"
#define DEFAULT_BORDERWIDTH "2"
#define DEFAULT_ANCHOR "center"
#define DEFAULT_PADDING "0"
/*
* Widget states:
*/
#define TK_WIDGET_STATE_ACTIVE (1<<0)
#define TK_WIDGET_STATE_DISABLED (1<<1)
#define TK_WIDGET_STATE_FOCUS (1<<2)
#define TK_WIDGET_STATE_PRESSED (1<<3)
#define TK_WIDGET_STATE_SELECTED (1<<4)
#define TK_WIDGET_STATE_RESERVED1 (1<<5)
#define TK_WIDGET_STATE_RESERVED2 (1<<6)
#define TK_WIDGET_STATE_RESERVED3 (1<<7)
#define TK_WIDGET_STATE_USER8 (1<<8)
#define TK_WIDGET_STATE_USER7 (1<<9)
#define TK_WIDGET_STATE_USER6 (1<<10)
#define TK_WIDGET_STATE_USER5 (1<<11)
#define TK_WIDGET_STATE_USER4 (1<<12)
#define TK_WIDGET_STATE_USER3 (1<<13)
#define TK_WIDGET_STATE_USER2 (1<<14)
#define TK_WIDGET_STATE_USER1 (1<<15)
/* Maintenance note: if you get all the way to "USER1",
* see tkstate.c
*/
typedef struct
{
unsigned int mask; /* Which bits are relevant */
unsigned int match; /* Required values */
} TTK_WidgetStateSpec;
#define TTK_WidgetStateMatches(state, spec) \
(((state) & (spec)->mask) == (spec)->match)
#define TTK_ModifyWidgetState(state, spec) \
(((state) & ~(spec)->mask) | (spec)->match)
extern Tcl_Obj *TTK_NewWidgetStateSpecObj(unsigned int mask,unsigned int match);
extern int TTK_GetWidgetStateSpecFromObj(
Tcl_Interp *, Tcl_Obj *, TTK_WidgetStateSpec *);
typedef Tcl_Obj *TTK_StateMap;
extern Tcl_Obj *TTK_StateMapLookup(Tcl_Interp*,TTK_StateMap,unsigned int state);
/*
* Padding structure: used to represent internal padding and borders.
*/
typedef struct /* @@@ move this somewhere more appropriate */
{
short left;
short top;
short right;
short bottom;
} TTK_Padding;
extern int TTK_GetPaddingFromObj(Tcl_Interp*,Tk_Window,Tcl_Obj*,TTK_Padding*);
/*
* Box structure: used to represent rectangular regions
*/
typedef struct /* Hey, this is an XRectangle! */
{
int x;
int y;
int w; /* @@@ sb: width */
int h; /* @@@ sb: height */
} TTK_Box;
/*
* Client interface:
*/
extern void TTK_StylePkgInit(Tcl_Interp *);
typedef struct TTK_Theme_ *TTK_Theme;
typedef struct TTK_Style_ *TTK_Style;
typedef struct TTK_Element_ *TTK_Element;
extern TTK_Theme TTK_GetTheme(Tcl_Interp *, const char *name);
extern TTK_Theme TTK_GetThemeFromObj(Tcl_Interp *, Tcl_Obj *);
extern TTK_Theme TTK_GetDefaultTheme(Tcl_Interp *);
extern TTK_Theme TTK_GetCurrentTheme(Tcl_Interp *);
extern TTK_Element TTK_GetElement(
TTK_Theme theme,
TTK_Style style,
const char *elementName,
Tk_OptionTable optionTable);
extern void TTK_ElementGeometry(
TTK_Element element, char * recordPtr, Tk_Window tkwin,
unsigned int state,
int *widthPtr, int *heightPtr, TTK_Padding*);
extern void TTK_DrawElement(
TTK_Element element, char *recordPtr, Tk_Window tkwin,
Drawable d, int x, int y, int width, int height, unsigned int state);
/*
* Implementation interface:
*/
/*
* Style support version tag.
*/
#define TK_STYLE_VERSION_2 0x2
/*
* The following structures and prototypes are used as static templates to
* declare widget elements.
*/
typedef void (TTK_ElementGeometryProc)(void *clientData, void *elementRecord,
Tk_Window tkwin, int *widthPtr, int *heightPtr, TTK_Padding*);
typedef void (TTK_DrawElementProc)(void *clientData, void *elementRecord,
Tk_Window tkwin, Drawable d, int x, int y, int width, int height,
unsigned int state);
#define TK_OPTION_ANY TK_OPTION_END
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;
typedef struct TTK_ElementSpec {
int version; /* Version of the style support. */
size_t elementSize; /* Size of element record */
TTK_ElementOptionSpec *options;
/* List of options. Last one's name
* must be NULL. */
/*
* Hooks
*/
TTK_ElementGeometryProc *geometry;
/* compute min width, height, and padding */
TTK_DrawElementProc *draw; /* Draw the element in the given bounding box.*/
} TTK_ElementSpec;
extern TTK_Theme
TTK_CreateTheme(Tcl_Interp *, const char * name, TTK_Theme parent);
extern void
TTK_RegisterElementSpec(
TTK_Theme style, const char *elementName,
TTK_ElementSpec *, void *clientData);
/*
* Layout specifications:
*/
enum
{
TTKLAYOUT_DRAW = 0x0, /* draw current element; don't adjust parcel */
TTKLAYOUT_LEFT = 0x1, /* pack at left of current parcel */
TTKLAYOUT_RIGHT = 0x2, /* pack at right of current parcel */
TTKLAYOUT_HFILL = 0x3, /* fill remaining parcel, horizontally */
TTKLAYOUT_TOP = 0x4, /* pack at top of current parcel */
TTKLAYOUT_BOTTOM = 0x8, /* pack at bottom of current parcel */
TTKLAYOUT_VFILL = 0xC, /* fill remaining parcel, vertically */
};
#define TTKLAYOUT_CHILDREN 0x10
#define TTKLAYOUT_BORDER 0x20
#define TTKLAYOUT_END 0xFF
typedef struct
{
unsigned opcode;
const char * elementName;
} TTKLayoutInstruction, *TTKLayout, *TTK_LayoutSpec;
#define TTK_BEGIN_LAYOUT(name) \
static TTKLayoutInstruction name[] = {
#define TTK_LAYOUT_DRAW(el) { TTKLAYOUT_DRAW, el },
#define TTK_LAYOUT_TOP(el) { TTKLAYOUT_TOP, el },
#define TTK_LAYOUT_LEFT(el) { TTKLAYOUT_LEFT, el },
#define TTK_LAYOUT_BOTTOM(el) { TTKLAYOUT_BOTTOM, el },
#define TTK_LAYOUT_RIGHT(el) { TTKLAYOUT_RIGHT, el },
#define TTK_LAYOUT_HFILL(el) { TTKLAYOUT_HFILL, el },
#define TTK_LAYOUT_VFILL(el) { TTKLAYOUT_VFILL, el },
#define TTK_LAYOUT_CHILDREN(children) \
{ TTKLAYOUT_CHILDREN, 0 }, children { TTKLAYOUT_END },
#define TTK_LAYOUT_INSIDE(el, children) \
{ TTKLAYOUT_CHILDREN, el }, children { TTKLAYOUT_END },
#define TTK_LAYOUT_BORDER(el, children) \
{ TTKLAYOUT_BORDER|TTKLAYOUT_CHILDREN, el }, children { TTKLAYOUT_END },
#define TTK_END_LAYOUT { TTKLAYOUT_END, 0 } };
/*
* Layout instances:
*/
typedef struct TTK_LayoutNode_ TTK_LayoutNode, *TTK_Layout;
extern TTK_Layout TTK_BuildLayout(
TTK_Theme, TTK_LayoutSpec, TTK_Style, Tk_OptionTable);
extern void TTK_FreeLayout(TTK_Layout);
extern void TTK_LayoutReqSize(
TTK_Layout, char *recordPtr, Tk_Window tkwin,
int *widthPtr, int *heightPtr);
extern void TTK_LayoutGeometry(
TTK_Layout, char *recordPtr, Tk_Window tkwin,
int x, int y, int width, int height, unsigned int state);
extern void TTK_LayoutDraw(
TTK_Layout, char *recordPtr, Tk_Window tkwin,
Drawable d, unsigned int state);
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_Element TTK_LayoutNodeElement(TTK_LayoutNode *);
extern void TTK_LayoutNodeSetParcel(TTK_LayoutNode *node, TTK_Box parcel);
extern void TTK_ModifyElementState(TTK_LayoutNode *, TTK_WidgetStateSpec *);
extern void TTK_ChangeElementState(TTK_LayoutNode *,unsigned set,unsigned clr);
extern TTK_Style TTK_RegisterLayout(
TTK_Theme theme, const char *className, TTK_LayoutSpec layoutSpec);
extern TTK_LayoutSpec TTK_FindLayout(TTK_Theme theme, const char *className);
extern TTK_Layout TTK_CreateLayout(
TTK_Theme, const char *name, Tk_OptionTable);
/*
* Miscellaneous other stuff that element implementations need to know about:
*/
typedef enum
{
TK_BUTTON_DEFAULT_ACTIVE,
TK_BUTTON_DEFAULT_DISABLED,
TK_BUTTON_DEFAULT_NORMAL
} TkButtonDefaultState;
extern int TkGetButtonDefaultStateFromObj(Tcl_Interp *, Tcl_Obj *, int *);
typedef enum
{
TK_COMPOUND_LAYOUT_NONE, /* image if specified, otherwise text */
TK_COMPOUND_LAYOUT_TEXT, /* text only */
TK_COMPOUND_LAYOUT_IMAGE, /* image only */
TK_COMPOUND_LAYOUT_CENTER, /* text overlays image */
TK_COMPOUND_LAYOUT_TOP, /* image above text */
TK_COMPOUND_LAYOUT_BOTTOM, /* image below text */
TK_COMPOUND_LAYOUT_LEFT, /* image to left of text */
TK_COMPOUND_LAYOUT_RIGHT, /* image to right of text */
} TkCompoundLayout;
enum { ORIENT_HORIZONTAL, ORIENT_VERTICAL };
extern int TkGetCompoundLayoutFromObj(Tcl_Interp *, Tcl_Obj *, int *);
/*
* Helper routines for element implementations:
* @@@ Rename these, decide if they should be public or private interfaces.
*/
extern void adjustAnchor(
Tk_Anchor anchor,
int *x, int *y, int width, int height, /* outer box */
int innerWidth, int innerHeight);
extern int adjustAspect(int *x, int *y, int *width, int *height);
extern void adjustPadding(
TTK_Padding *p, int *xPtr, int *yPtr, int *widthPtr, int *heightPtr);
extern XColor *getForegroundFromObj(Tk_Window, Tcl_Obj *,
unsigned long *maskPtr, XGCValues *);
extern Tk_Font getFontFromObj(Tk_Window, Tcl_Obj *,
unsigned long *maskPtr, XGCValues *);
#endif /* TKTHEME_H */