/*
* 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" /* TclIsInfinite() */
#include "tclOO.h"
#include "tk.h"
#include "default.h"
#include "tk3d.h"
#include "tkFont.h"
#ifndef _WIN32
#include <X11/Xproto.h>
#endif
#if defined(_WIN32)
#include "tkWinInt.h"
#elif defined(MAC_OSX_TK)
#include "tkMacOSXInt.h"
#else
#include "tkUnixInt.h"
#endif
#define _USE_MATH_DEFINES
#include <math.h> /* VC math constants M_PI, M_SQRT1_2 */
#include <float.h> /* DBL_MAX,.. */
#include <assert.h>
/*
* For C++ compilers, use extern "C"
*/
#ifdef __cplusplus
extern "C" {
#endif
/*
* Mathematical functions
*/
#undef ABS
#define ABS(x) (((x)<0)?(-(x)):(x))
#undef EXP10
#define EXP10(x) (pow(10.0,(x)))
#undef FABS
#define FABS(x) (((x)<0.0)?(-(x)):(x))
#undef SIGN
#define SIGN(x) (((x) < 0.0) ? -1 : 1)
#undef MIN
#define MIN(a,b) (((a)<(b))?(a):(b))
#undef MAX
#define MAX(a,b) (((a)>(b))?(a):(b))
#undef MIN3
#define MIN3(a,b,c) (((a)<(b))?(((a)<(c))?(a):(c)):(((b)<(c))?(b):(c)))
#undef MAX3
#define MAX3(a,b,c) (((a)>(b))?(((a)>(c))?(a):(c)):(((b)>(c))?(b):(c)))
#define CLAMP(val,low,high) \
(((val) < (low)) ? (low) : ((val) > (high)) ? (high) : (val))
/*
* Be careful when using the next two macros. They both assume the floating
* point number is less than the size of an int. That means, for example, you
* can't use these macros with numbers bigger than than 2^31-1.
*/
#undef FMOD
#define FMOD(x,y) ((x)-(((int)((x)/(y)))*y))
#undef ROUND
#define ROUND(x) ((int)((x) + (((x)<0.0) ? -0.5 : 0.5)))
#define DEGREES_TO_RADIANS (M_PI/180.0)
#define RADIANS_TO_DEGREES (180.0/M_PI)
/*
* Static tcl objects.
*/
typedef struct tkoObj {
Tcl_Obj *empty;
Tcl_Obj *point;
Tcl_Obj *next;
Tcl_Obj *uplevel;
Tcl_Obj *oo_define;
Tcl_Obj *oo_objdefine;
Tcl_Obj *method;
Tcl_Obj *_tko_configure;
Tcl_Obj *tko;
Tcl_Obj *tko_options;
Tcl_Obj *lsort;
Tcl_Obj *tko_widget;
Tcl_Obj *tko_frame;
Tcl_Obj *tko_labelframe;
Tcl_Obj *tko_toplevel;
Tcl_Obj *path;
Tcl_Obj *graph;
Tcl_Obj *_screen;
Tcl_Obj *_labelwidget;
Tcl_Obj *_0;
Tcl_Obj *_1;
} tkoObj;
MODULE_SCOPE tkoObj TkoObj;
/*
* tkoWidgetOptionType --
*
* Suported type in the TkowidgetOptinSet() function.
* In comments is the type of the address pointer.
*/
typedef enum tkoWidgetOptionType {
TKO_SET_CLASS = 1, /* (Tcl_Obj **)address */
TKO_SET_VISUAL, /* (Tcl_Obj **)address */
TKO_SET_COLORMAP, /* (Tcl_Obj **)address */
TKO_SET_USENULL, /* (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_STRINGNULL, /* (char **)address */
TKO_SET_SCROLLREGION, /* (int *[4])address */
TKO_SET_JUSTIFY /* (Tk_Justify *)address */
} tkoWidgetOptionType;
/*
* tkoWidgetOptionDefine --
*
* Widget definition data used in class.
" An option set method "-option" is created in the following order:
* - If "proc" is given it will be used as option set method.
* - 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 "type", "meta" and "offset" are used as parameters for
* the TkoWidgetOptionSet() function call.
*/
typedef struct tkoWidgetOptionDefine {
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_Obj *optionPtr; /* tko internally used, always init with NULL! */
const char *proc; /* If not NULL it is the body of the newly created -option method */
Tcl_MethodCallProc *method; /* If not NULL it is the function name of the -option method */
tkoWidgetOptionType type; /* if greater 0 then option type used in common option set method */
Tcl_ObjectMetadataType *meta; /* meta data address used in common option set method */
int offset; /* offset in meta data struct */
} tkoWidgetOptionDefine;
#define TKO_OPTION_READONLY 0x1 /* option is only setable at creation time */
#define TKO_OPTION_HIDE 0x2 /* option is hidden in configure method */
/* tkoFrame.c */
MODULE_SCOPE int Tko_FrameInit(
Tcl_Interp * interp);
/* tkoVector.c */
MODULE_SCOPE int Tko_VectorInit(
Tcl_Interp * interp);
/* tkoGraph.c */
MODULE_SCOPE int Tko_GraphInit(
Tcl_Interp * interp);
/* tkoPath.c */
MODULE_SCOPE int Tko_PathInit(
Tcl_Interp * interp);
/* tkoWidget.c */
MODULE_SCOPE int Tko_WidgetInit(
Tcl_Interp * interp);
MODULE_SCOPE Tk_Window *TkoWidgetWindow(
Tcl_Object object);
MODULE_SCOPE Tcl_Obj *TkoWidgetOptionVar(
Tcl_Object object);
MODULE_SCOPE Tcl_Obj *TkoWidgetOptionGet(
Tcl_Interp * interp,
Tcl_Object object,
Tcl_Obj * option);
MODULE_SCOPE int TkoWidgetOptionSet(
Tcl_Interp * interp,
Tcl_ObjectContext context,
Tcl_Obj * option,
tkoWidgetOptionType type,
Tcl_ObjectMetadataType * meta,
size_t offset);
MODULE_SCOPE int TkoWidgetClassDefine(
Tcl_Interp * interp,
Tcl_Class clazz,
Tcl_Obj * classname,
const Tcl_MethodType * methods,
tkoWidgetOptionDefine * options);
/*
* end block for C++
*/
#ifdef __cplusplus
}
#endif
#endif /* _TKOWIDGET_H */
/* vim: set ts=4 sw=4 sts=4 ff=unix et : */