/* $Id: widget.h,v 1.17 2004/01/17 01:19:05 jenglish Exp $
* Copyright (c) 2003, Joe English
*
* Helper routines for widget implementations.
*
* Require: tkTheme.h, layout.h
*/
#ifndef WIDGET_H
#define WIDGET_H 1
/* State flags for 'flags' field.
* @@@ todo: distinguish:
* need reconfigure, need redisplay, redisplay pending
*/
#define WIDGET_DESTROYED 0x0001
#define UPDATE_PENDING 0x0002
#define REDISPLAY_REQUIRED 0x0004 /* widget to be redisplayed */
#define RELAYOUT_REQUIRED 0x0008 /* recompute geometry */
#define WIDGET_USER_FLAG 0x0100 /* 0x0100 - 0x8000 for user flags */
/*
* Bit fields for OptionSpec 'mask' field:
*/
#define STYLE_CHANGED 0x1
#define GEOMETRY_CHANGED 0x2
/*
* Core widget elements
*/
typedef struct WidgetSpec_ WidgetSpec; /* Forward */
typedef struct
{
Tk_Window tkwin; /* Window associated with widget */
Tcl_Interp *interp; /* Interpreter associated with widget. */
WidgetSpec *widgetSpec; /* Widget class hooks */
Tcl_Command widgetCmd; /* Token for widget command. */
Tk_OptionTable optionTable; /* Option table */
TTK_Layout layout; /* @@@ */
const char *layoutName; /* @@@ */
Tcl_Obj *takeFocusPtr; /* Storage for -takefocus option */
Tcl_Obj *styleObj; /* Name of currently-applied style */
unsigned int state; /* Current widget state */
unsigned int flags; /* internal flags, see above */
} WidgetCore;
/*
* Subcommand specifications:
*/
typedef int (*WidgetSubcommandProc)(
Tcl_Interp *interp, int objc, Tcl_Obj * CONST objv[], void *recordPtr);
typedef struct {
const char *name;
WidgetSubcommandProc command;
} WidgetCommandSpec;
/*
* Widget specifications:
*/
struct WidgetSpec_
{
const char *className; /* Widget class name */
size_t recordSize; /* #bytes in widget record */
Tk_OptionSpec *optionSpecs; /* Option specifications */
WidgetCommandSpec *commands; /* Widget instance subcommands */
/*
* Hooks:
*/
int (*initializeProc)(Tcl_Interp *, void *recordPtr);
void (*cleanupProc)(void *recordPtr);
int (*configureProc)(Tcl_Interp *, void *recordPtr, int flags);
int (*postConfigureProc)(Tcl_Interp *, void *recordPtr, int flags);
void (*geometryProc)(void *recordPtr,
int *widthPtr, int *heightPtr, TTK_Padding *paddingPtr);
void (*displayProc)(void *recordPtr, Drawable d);
enum { WIDGET_SPEC_END } sentinel; /* to help the compiler catch errors */
};
/*
* Common factors for widget implementations:
*/
extern int NullInitialize(Tcl_Interp *, void *);
extern int NullPostConfigure(Tcl_Interp *, void *, int);
extern void NullCleanup(void *recordPtr);
extern void WidgetGeometry(void *recordPtr, int *w, int *h, TTK_Padding *);
extern void WidgetDisplay(void *recordPtr, Drawable);
extern int CoreConfigure(Tcl_Interp*, void *, int mask);
extern int WidgetConfigureCommand(Tcl_Interp *, int, Tcl_Obj*CONST[], void *);
extern int WidgetCgetCommand(Tcl_Interp *, int, Tcl_Obj*CONST[], void *);
extern int WidgetInstateCommand(Tcl_Interp *, int, Tcl_Obj*CONST[], void *);
extern int WidgetStateCommand(Tcl_Interp *, int, Tcl_Obj*CONST[], void *);
extern int WidgetConstructorObjCmd(ClientData,Tcl_Interp*,int,Tcl_Obj*CONST[]);
#define RegisterWidget(interp, name, specPtr) \
Tcl_CreateObjCommand(interp, name, \
WidgetConstructorObjCmd, (ClientData)specPtr,NULL)
/*
* Useful routines for use inside widget implementations:
*/
extern int WidgetDestroyed(WidgetCore *);
#define WidgetDestroyed(corePtr) ((corePtr)->flags & WIDGET_DESTROYED)
extern void WidgetChangeState(WidgetCore *,
unsigned int setBits, unsigned int clearBits);
extern void WidgetChanged(WidgetCore *, unsigned flags);
extern void WidgetSetLayout(Tcl_Interp *,WidgetCore *, const char *layoutName);
extern void TrackElementState(WidgetCore *);
/*
* Variable traces:
*/
typedef int (*TraceProc)(Tcl_Interp *, void *recordPtr, const char *value);
typedef struct TraceHandle_ TraceHandle;
extern TraceHandle *TraceVariable(
Tcl_Interp *, Tcl_Obj *varnameObj, TraceProc callback, void *clientData);
extern void UntraceVariable(TraceHandle *);
extern int FireTrace(TraceHandle *);
/*
* Useful widget base classes:
*/
extern Tk_OptionSpec CoreOptionSpecs[];
/*
* String tables for widget resource specifications:
*/
extern CONST char *TTKOrientStrings[];
extern CONST char *TTKCompoundStrings[];
extern CONST char *TTKDefaultStrings[];
/*
* Package initialiation routines:
*/
extern void RegisterElements(Tcl_Interp *);
extern int AltTheme_Init(Tcl_Interp *);
extern int StepTheme_Init(Tcl_Interp *);
extern int PixmapTheme_Init(Tcl_Interp *);
#if defined(__WIN32__)
#define TTK_PlatformInit TTK_WinPlatformInit
extern int TTK_WinPlatformInit(Tcl_Interp *);
#else
#define TTK_PlatformInit(interp) /* nothing */
#endif
#endif /* WIDGET_H */