Unnamed Fossil Project

Artifact [187a5574fa]
Login

Artifact [187a5574fa]

Artifact 187a5574fae2459eb2447318021c8016fd771eb62184acddc7b068af8cc1240c:


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