Tk Source Code

Documentation
Login
Bounty program for improvements to Tcl and certain Tcl packages.
/*
 * tkoWidget.h --
 *
 *    Header file for the internals of the tko widget package.
 *
 * Copyright (c) 2019 Rene Zaumseil
 *
 */

#ifndef _TKOWIDGET_H
#define _TKOWIDGET_H

#include "tcl.h"
#include "tclInt.h"
#include "tclOO.h"
#include "tk.h"
#include "default.h"

#ifndef _WIN32
#if !defined(MAC_OSX_TK)
#include <X11/Xproto.h>
#endif
#endif

#if defined(_WIN32)
#include "tkWinInt.h"
#elif defined(MAC_OSX_TK)
#include "tkMacOSXInt.h"
#else
#include "tkUnixInt.h"
#endif

/*
 * For C++ compilers, use extern "C"
 */
#ifdef __cplusplus
extern "C" {
#endif

/*
 * Tko_WidgetOptionType --
 *
 * Supported type in the TkoWidgetOptionSet() function.
 * In comments is the type of the address pointer.
 */
    typedef enum Tko_WidgetOptionType {
        TKO_SET_NONE = 0,     /* Nono */
        TKO_SET_CLASS = 1,     /* (Tcl_Obj **)address */
        TKO_SET_VISUAL, /* (Tcl_Obj **)address */
        TKO_SET_COLORMAP,       /* (Tcl_Obj **)address */
        TKO_SET_USE,        /* (Tcl_Obj **)address */
        TKO_SET_CONTAINER,      /* (int *)address */
        TKO_SET_TCLOBJ, /* (Tcl_Obj **)address */
        TKO_SET_XCOLOR, /* (Xcolor **)address */
        TKO_SET_3DBORDER,       /* (Tk_3DBorder *)address */
        TKO_SET_PIXEL,  /* (int *)address */
        TKO_SET_PIXELNONEGATIV, /* (int *)address */
        TKO_SET_PIXELPOSITIV,   /* (int *)address */
        TKO_SET_DOUBLE, /* (double *)address */
        TKO_SET_BOOLEAN,        /* (int *)address */
        TKO_SET_CURSOR, /* (Tk_Cursor *)address */
        TKO_SET_INT,    /* (int *)address */
        TKO_SET_RELIEF, /* (int *)address */
        TKO_SET_ANCHOR, /* (int *)address */
        TKO_SET_WINDOW, /* (Tk_Window *)address */
        TKO_SET_FONT,   /* (Tk_Font *)address */
        TKO_SET_STRING, /* (char **)address */
        TKO_SET_SCROLLREGION,   /* (int *[4])address */
        TKO_SET_JUSTIFY /* (Tk_Justify *)address */
    } Tko_WidgetOptionType;

/*
* Tko_CreateMode --
*
* Supported values in Tko_WdigetCreate() function call.
*/
    typedef enum Tko_WidgetCreateMode {
        TKO_CREATE_WIDGET, /* Create new widget */
        TKO_CREATE_TOPLEVEL, /* Create new toplevel widget */
        TKO_CREATE_CLASS, /* See "tko initclass" */
        TKO_CREATE_WRAP /* See "tko initwrap" */
    } Tko_WidgetCreateMode;

/*
 * Tko_WidgetOptionDefine --
 *
 * Widget definition data used in class.
 * An option set method "-option" is created in the following order:
 * - "option"=NULL indicate the end of a list of option definitions.
 * - If "method" is given it will be used as option set method.
 * - If "type" is greater 0 a common option set method will be used.
 *   In this case "offset" are used as offset in the widget structure.
 */
    typedef struct Tko_WidgetOptionDefine {
        const char *option;    /* Name of option. Starts with "-" minus sign */
        const char *dbname;    /* Option DB name or synonym option if dbclass is NULL */
        const char *dbclass;   /* Option DB class name or NULL for synonym options. */
        const char *defvalue;  /* Default value. */
        int flags;             /* bit array of TKO_OPTION_* values to configure option behaviour */
        Tcl_MethodCallProc *method;    /* If not NULL it is the function name of the -option method */
        Tko_WidgetOptionType type;  /* if greater 0 then option type used in common option set method */
        size_t offset;            /* offset in meta data struct */
    } Tko_WidgetOptionDefine;
#define TKO_OPTION_READONLY 0x1 /* option is only setable at creation time */
#define TKO_OPTION_HIDE     0x2 /* option is hidden in configure method */
#define TKO_OPTION_NULL      0x4 /* empty values are saved as NULL */
#define TKO_OPTION__USER    0x8 /* internally used */

    /*
    * Widget structure data used in objects.
    * These structure will be filled in the **Tko\_WidgetCreate** call
    * and cleared in the **Tko\_WidgetDestroy** call.
    * Widget methods should check the value of *tkWin* on NULL before using it.
    */
    typedef struct Tko_Widget {
        Tk_Window tkWin;           /* Window that embodies the widget. NULL means
                                   * that the window has been destroyed but the
                                   * data structures haven't yet been cleaned
                                   * up.*/
        Display *display;        /* Display containing widget. Used, among
                                 * other things, so that resources can be
                                 * freed even after tkwin has gone away. */
        Tcl_Interp *interp;        /* Interpreter associated with widget. */
        Tcl_Command widgetCmd;     /* Token for command. */
        Tcl_Object object;         /* our own object */
        Tcl_Obj *myCmd;            /* Objects "my" command. Needed to call internal methods. */
        Tcl_Obj *optionsArray;     /* Name of option array variable */
        Tcl_HashTable *optionsTable; /* Hash table containing all used options */
    } Tko_Widget;

/* tkoFrame.c */
    MODULE_SCOPE int Tko_FrameInit(
        Tcl_Interp * interp);
    MODULE_SCOPE int Tko_VectorInit(
        Tcl_Interp * interp);
    MODULE_SCOPE int Tko_GraphInit(
        Tcl_Interp * interp);
/* tkoWidget.c */
    MODULE_SCOPE int Tko_WidgetClassDefine(
        Tcl_Interp *interp,
        Tcl_Obj *classname,
        const Tcl_MethodType *methods,
        const Tko_WidgetOptionDefine *options);
    MODULE_SCOPE int Tko_WidgetCreate(
        ClientData clientdata,
        Tcl_Interp *interp,
        Tcl_Object object,
        Tko_WidgetCreateMode createmode,
        Tcl_Obj *arglist);
    MODULE_SCOPE void Tko_WidgetDestroy(
        Tcl_ObjectContext context);
    MODULE_SCOPE ClientData Tko_WidgetClientData(
        Tcl_ObjectContext context);
    MODULE_SCOPE Tcl_Obj *Tko_WidgetOptionGet(
        Tko_Widget *widget,
        Tcl_Obj *option);
    MODULE_SCOPE Tcl_Obj *Tko_WidgetOptionSet(
        Tko_Widget *widget,
        Tcl_Obj *option,
        Tcl_Obj *value);

/*
 * end block for C++
 */

#ifdef __cplusplus
}
#endif
#endif                         /* _TKOWIDGET_H */
/* vim: set ts=4 sw=4 sts=4 ff=unix et : */