Unnamed Fossil Project

Artifact [3534e8a069]
Login

Artifact [3534e8a069]

Artifact 3534e8a069d361f7ca6d42ec15e8f8ce70e5c787868a23c21691ed9d39b78de6:


/*
 * 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 */