/* $Id: tix.h,v 1.4.2.2 2001/12/09 03:10:49 idiscovery Exp $ */ /* * tix.h -- * * This is the standard header file for all tix C code. It * defines many macros and utility functions to make it easier to * write TCL commands and TK widgets in C. No more needs to write * 2000 line functions! * * Copyright (c) 1996, Expert Interface Technologies * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * */ #ifndef _TIX_PORT_H_ #include "tixPort.h" #endif #ifndef _TIX #define _TIX #define _TIX_H_ #ifndef TIX_VERSION #define TIX_VERSION "8.1" #endif #define TIX_PATCHLEVEL "8.1.4" #define TIX_PATCH_LEVEL TIX_PATCHLEVEL #define TIX_RELEASE "8.1.4" #ifndef _TK #include "tk.h" #endif #if defined(__WIN32__) || defined(_WIN32) || defined (__BORLAND) || defined(_Windows) #ifndef _WINDOWS #define _WINDOWS #endif #endif /* * When building Tix itself, BUILD_tix should be defined by the makefile * so that all EXTERN declarations get DLLEXPORT; when building apps * using Tix, BUILD_tix should NOT be defined so that all EXTERN * declarations get DLLIMPORT as defined in tcl.h * * NOTE: This ifdef MUST appear after the include of tcl.h and tk.h * because the EXTERN declarations in those files need DLLIMPORT. */ /* * These macros are used to control whether functions are being declared for * import or export. If a function is being declared while it is being built * to be included in a shared library, then it should have the DLLEXPORT * storage class. If is being declared for use by a module that is going to * link against the shared library, then it should have the DLLIMPORT storage * class. If the symbol is beind declared for a static build or for use from a * stub library, then the storage class should be empty. * * The convention is that a macro called BUILD_xxxx, where xxxx is the * name of a library we are building, is set on the compile line for sources * that are to be placed in the library. When this macro is set, the * storage class will be set to DLLEXPORT. At the end of the header file, the * storage class will be reset to DLLIMPORt. */ #undef TCL_STORAGE_CLASS #ifdef BUILD_tix # define TCL_STORAGE_CLASS DLLEXPORT #else # ifdef USE_TCL_STUBS # define TCL_STORAGE_CLASS # else # define TCL_STORAGE_CLASS DLLIMPORT # endif #endif #ifdef __cplusplus extern "C" { #endif #if (TCL_MAJOR_VERSION > 7) # define TCL_7_5_OR_LATER #else # if ((TCL_MAJOR_VERSION == 7) && (TCL_MINOR_VERSION >= 5)) # define TCL_7_5_OR_LATER # endif #endif #if (TK_MAJOR_VERSION > 4) # define TK_4_1_OR_LATER #else # if ((TK_MAJOR_VERSION == 4) && (TK_MINOR_VERSION >= 1)) # define TK_4_1_OR_LATER # endif #endif /* TK_MAJOR_VERSION ... */ #if (TK_MAJOR_VERSION >= 8) # define TK_8_0_OR_LATER #endif #ifdef TK_4_1_OR_LATER /* TK 4.1 or later */ # define Tix_FreeProc Tcl_FreeProc #else /* TK 4.0 */ # define Tix_FreeProc Tk_FreeProc /* These portable features were not defined in previous versions of * TK but are used in Tix. Let's define them here. */ # define TkPutImage(a, b, c, d, e, f, g, h, i, j, k, l) \ XPutImage(c, d, e, f, g, h, i, j, k, l) # define TkStringToKeysym XStringToKeysym #endif /* TK_4_1_OR_LATER */ #define TIX_STDIN_ALWAYS 0 #define TIX_STDIN_OPTIONAL 1 #define TIX_STDIN_NONE 2 typedef struct { char *name; /* Name of command. */ int (*cmdProc) _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int argc, Tcl_Obj *CONST *objv)); /* Command procedure. */ } Tix_TclCmd; /*---------------------------------------------------------------------- * * * SUB-COMMAND HANDLING * * *---------------------------------------------------------------------- */ typedef int (*Tix_CmdProc) _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int argc, Tcl_Obj *CONST *objv)); typedef int (*Tix_SubCmdProc) _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int argc, Tcl_Obj *CONST *objv)); typedef int (*Tix_CheckArgvProc) _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int argc, Tcl_Obj *CONST *objv)); typedef struct _Tix_CmdInfo { int numSubCmds; int minargc; int maxargc; char * info; } Tix_CmdInfo; typedef struct _Tix_SubCmdInfo { int namelen; char * name; int minargc; int maxargc; Tix_SubCmdProc proc; char * info; Tix_CheckArgvProc checkArgvProc; } Tix_SubCmdInfo; /* * Tix_ArraySize -- * * Find out the number of elements inside a C array. The argument "x" * must be a valid C array. Pointers don't work. */ #define Tix_ArraySize(x) (sizeof(x) / sizeof(x[0])) /* * This is used for Tix_CmdInfo.maxargc and Tix_SubCmdInfo.maxargc, * indicating that this command takes a variable number of arguments. */ #define TIX_VAR_ARGS -1 /* * TIX_DEFAULT_LEN -- * * Use this for Tix_SubCmdInfo.namelen and Tix_ExecSubCmds() will try to * determine the length of the subcommand name for you. */ #define TIX_DEFAULT_LEN -1 /* * TIX_DEFAULT_SUB_CMD -- * * Use this for Tix_SubCmdInfo.name. This will match any subcommand name, * including the empty string, when Tix_ExecSubCmds() finds a subcommand * to execute. */ #define TIX_DEFAULT_SUBCMD 0 /* * TIX_DECLARE_CMD -- * * This is just a handy macro to declare a C function to use as a * command function. */ #define TIX_DECLARE_CMD(func) \ int func _ANSI_ARGS_((ClientData clientData,\ Tcl_Interp *interp, int argc, Tcl_Obj *CONST objv[])) /* * TIX_DECLARE_SUBCMD -- * * This is just a handy macro to declare a C function to use as a * sub command function. */ #define TIX_DECLARE_SUBCMD(func) \ int func _ANSI_ARGS_((ClientData clientData,\ Tcl_Interp *interp, int argc, Tcl_Obj *CONST objv[])) /* * TIX_DEFINE_CMD -- * * This is just a handy macro to define a C function to use as a * command function. */ #define TIX_DEFINE_CMD(func) \ int func(clientData, interp, argc, argv) \ ClientData clientData; /* Main window associated with \ * interpreter. */ \ Tcl_Interp *interp; /* Current interpreter. */ \ int argc; /* Number of arguments. */ \ Tcl_Obj *objv[]; /* Argument strings. */ /*---------------------------------------------------------------------- * Link-list functions -- * * These functions makes it easy to use link lists in C code. * *---------------------------------------------------------------------- */ typedef struct Tix_ListInfo { int nextOffset; /* offset of the "next" pointer in a list * item */ int prevOffset; /* offset of the "next" pointer in a list * item */ } Tix_ListInfo; /* Singly-linked list */ typedef struct Tix_LinkList { int numItems; /* number of items in this list */ char * head; /* (general pointer) head of the list */ char * tail; /* (general pointer) tail of the list */ } Tix_LinkList; typedef struct Tix_ListIterator { char * last; char * curr; unsigned int started : 1; /* True if the search operation has * already started for this list */ unsigned int deleted : 1; /* True if a delete operation has been * performed on the current item (in this * case the curr pointer has already been * adjusted */ } Tix_ListIterator; #define Tix_IsLinkListEmpty(list) ((list.numItems) == 0) #define TIX_UNIQUE 1 #define TIX_UNDEFINED -1 /*---------------------------------------------------------------------- * General Single Link List -- * * The next pointer can be anywhere inside a link. *---------------------------------------------------------------------- */ EXTERN void Tix_LinkListInit _ANSI_ARGS_((Tix_LinkList * lPtr)); EXTERN void Tix_LinkListAppend _ANSI_ARGS_((Tix_ListInfo * infoPtr, Tix_LinkList * lPtr, char * itemPtr, int flags)); EXTERN void Tix_LinkListStart _ANSI_ARGS_((Tix_ListInfo * infoPtr, Tix_LinkList * lPtr, Tix_ListIterator * liPtr)); EXTERN void Tix_LinkListNext _ANSI_ARGS_((Tix_ListInfo * infoPtr, Tix_LinkList * lPtr, Tix_ListIterator * liPtr)); EXTERN void Tix_LinkListDelete _ANSI_ARGS_((Tix_ListInfo * infoPtr, Tix_LinkList * lPtr, Tix_ListIterator * liPtr)); EXTERN int Tix_LinkListDeleteRange _ANSI_ARGS_(( Tix_ListInfo * infoPtr, Tix_LinkList * lPtr, char * fromPtr, char * toPtr, Tix_ListIterator * liPtr)); EXTERN int Tix_LinkListFind _ANSI_ARGS_(( Tix_ListInfo * infoPtr, Tix_LinkList * lPtr, char * itemPtr, Tix_ListIterator * liPtr)); EXTERN int Tix_LinkListFindAndDelete _ANSI_ARGS_(( Tix_ListInfo * infoPtr, Tix_LinkList * lPtr, char * itemPtr, Tix_ListIterator * liPtr)); EXTERN void Tix_LinkListInsert _ANSI_ARGS_(( Tix_ListInfo * infoPtr, Tix_LinkList * lPtr, char * itemPtr, Tix_ListIterator * liPtr)); EXTERN void Tix_LinkListIteratorInit _ANSI_ARGS_(( Tix_ListIterator * liPtr)); #define Tix_LinkListDone(liPtr) ((liPtr)->curr == NULL) /*---------------------------------------------------------------------- * Simple Single Link List -- * * The next pointer is always offset 0 in the link structure. *---------------------------------------------------------------------- */ EXTERN void Tix_SimpleListInit _ANSI_ARGS_((Tix_LinkList * lPtr)); EXTERN void Tix_SimpleListAppend _ANSI_ARGS_(( Tix_LinkList * lPtr, char * itemPtr, int flags)); EXTERN void Tix_SimpleListStart _ANSI_ARGS_(( Tix_LinkList * lPtr, Tix_ListIterator * liPtr)); EXTERN void Tix_SimpleListNext _ANSI_ARGS_(( Tix_LinkList * lPtr, Tix_ListIterator * liPtr)); EXTERN void Tix_SimpleListDelete _ANSI_ARGS_(( Tix_LinkList * lPtr, Tix_ListIterator * liPtr)); EXTERN int Tix_SimpleListDeleteRange _ANSI_ARGS_(( Tix_LinkList * lPtr, char * fromPtr, char * toPtr, Tix_ListIterator * liPtr)); EXTERN int Tix_SimpleListFind _ANSI_ARGS_(( Tix_LinkList * lPtr, char * itemPtr, Tix_ListIterator * liPtr)); EXTERN int Tix_SimpleListFindAndDelete _ANSI_ARGS_(( Tix_LinkList * lPtr, char * itemPtr, Tix_ListIterator * liPtr)); EXTERN void Tix_SimpleListInsert _ANSI_ARGS_(( Tix_LinkList * lPtr, char * itemPtr, Tix_ListIterator * liPtr)); EXTERN void Tix_SimpleListIteratorInit _ANSI_ARGS_(( Tix_ListIterator * liPtr)); #define Tix_SimpleListDone(liPtr) ((liPtr)->curr == NULL) /*---------------------------------------------------------------------- * * * * CUSTOM CONFIG OPTIONS * * *---------------------------------------------------------------------- */ #define TIX_RELIEF_RAISED 1 #define TIX_RELIEF_FLAT 2 #define TIX_RELIEF_SUNKEN 4 #define TIX_RELIEF_GROOVE 8 #define TIX_RELIEF_RIDGE 16 #define TIX_RELIEF_SOLID 32 typedef int Tix_Relief; EXTERN Tk_CustomOption tixConfigItemType; EXTERN Tk_CustomOption tixConfigItemStyle; EXTERN Tk_CustomOption tixConfigRelief; /* * C functions exported by Tix */ EXTERN int Tix_ArgcError _ANSI_ARGS_((Tcl_Interp *interp, int argc, Tcl_Obj *CONST *objv, int prefixCount, char *message)); EXTERN void Tix_CreateCommands _ANSI_ARGS_(( Tcl_Interp *interp, Tix_TclCmd *commands, ClientData clientData, Tcl_CmdDeleteProc *deleteProc)); EXTERN Tk_Window Tix_CreateSubWindow _ANSI_ARGS_(( Tcl_Interp * interp, Tk_Window tkwin, char * subPath)); EXTERN int Tix_DefinePixmap _ANSI_ARGS_(( Tcl_Interp * interp, Tk_Uid name, char **data)); EXTERN void Tix_DrawAnchorLines _ANSI_ARGS_(( Display *display, Drawable drawable, GC gc, int x, int y, int w, int h)); EXTERN int Tix_EvalArgv _ANSI_ARGS_(( Tcl_Interp * interp, int argc, Tcl_Obj *CONST *objv)); EXTERN int Tix_ExistMethod _ANSI_ARGS_((Tcl_Interp *interp, char *context, char *method)); EXTERN void Tix_Exit _ANSI_ARGS_((Tcl_Interp * interp, int code)); EXTERN Pixmap Tix_GetRenderBuffer _ANSI_ARGS_((Display *display, Drawable d, int width, int height, int depth)); #ifdef TCL_VARARGS /* * The TCL_VARARGS macro is only defined in Tcl 7.5 or later */ EXTERN int Tix_GlobalVarEval _ANSI_ARGS_( TCL_VARARGS(Tcl_Interp *,interp)); #else EXTERN int Tix_GlobalVarEval _ANSI_ARGS_( VARARGS(Tcl_Interp *interp)); #endif EXTERN int Tix_HandleSubCmds _ANSI_ARGS_(( Tix_CmdInfo * cmdInfo, Tix_SubCmdInfo * subCmdInfo, ClientData clientData, Tcl_Interp *interp, int argc, Tcl_Obj *CONST *objv)); EXTERN int Tix_Init _ANSI_ARGS_((Tcl_Interp *interp)); EXTERN int Tix_LoadTclLibrary _ANSI_ARGS_(( Tcl_Interp *interp, char *envName, char *tclName, char *initFile, char *defDir, char * appName)); EXTERN void Tix_OpenStdin _ANSI_ARGS_((Tcl_Interp *interp)); EXTERN void Tix_SetArgv _ANSI_ARGS_((Tcl_Interp *interp, int argc, Tcl_Obj *CONST *objv)); EXTERN void Tix_SetRcFileName _ANSI_ARGS_(( Tcl_Interp * interp, char * rcFileName)); EXTERN char * TixGetStringFromObj _ANSI_ARGS_(( char *objPtr,int *lengthPtr)); /* * Entry points for Tk_CONFIG_CUSTOM stubs to call */ EXTERN int TixDItemParseProc _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, Tk_Window tkwin, Tcl_Obj * value, char *widRec, int offset)); EXTERN Tcl_Obj * TixDItemPrintProc _ANSI_ARGS_(( ClientData clientData, Tk_Window tkwin, char *widRec, int offset, Tcl_FreeProc **freeProcPtr)); EXTERN int TixDItemStyleParseProc _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, Tk_Window tkwin, Tcl_Obj * value, char *widRec, int offset)); EXTERN Tcl_Obj * TixDItemStylePrintProc _ANSI_ARGS_(( ClientData clientData, Tk_Window tkwin, char *widRec, int offset, Tcl_FreeProc **freeProcPtr)); /* * Commands exported by Tix * */ extern TIX_DECLARE_CMD(Tix_CallMethodCmd); extern TIX_DECLARE_CMD(Tix_ChainMethodCmd); extern TIX_DECLARE_CMD(Tix_ClassCmd); extern TIX_DECLARE_CMD(Tix_DoWhenIdleCmd); extern TIX_DECLARE_CMD(Tix_DoWhenMappedCmd); extern TIX_DECLARE_CMD(Tix_FalseCmd); extern TIX_DECLARE_CMD(Tix_FileCmd); extern TIX_DECLARE_CMD(Tix_FlushXCmd); extern TIX_DECLARE_CMD(Tix_FormCmd); extern TIX_DECLARE_CMD(Tix_GridCmd); extern TIX_DECLARE_CMD(Tix_GeometryRequestCmd); extern TIX_DECLARE_CMD(Tix_Get3DBorderCmd); extern TIX_DECLARE_CMD(Tix_GetBooleanCmd); extern TIX_DECLARE_CMD(Tix_GetIntCmd); extern TIX_DECLARE_CMD(Tix_GetMethodCmd); extern TIX_DECLARE_CMD(Tix_HListCmd); extern TIX_DECLARE_CMD(Tix_HandleOptionsCmd); extern TIX_DECLARE_CMD(Tix_InputOnlyCmd); extern TIX_DECLARE_CMD(Tix_ItemStyleCmd); extern TIX_DECLARE_CMD(Tix_ManageGeometryCmd); extern TIX_DECLARE_CMD(Tix_MapWindowCmd); extern TIX_DECLARE_CMD(Tix_MoveResizeWindowCmd); extern TIX_DECLARE_CMD(Tix_NoteBookFrameCmd); extern TIX_DECLARE_CMD(Tix_RaiseWindowCmd); extern TIX_DECLARE_CMD(Tix_ShellInputCmd); extern TIX_DECLARE_CMD(Tix_StringSubCmd); extern TIX_DECLARE_CMD(Tix_StrEqCmd); extern TIX_DECLARE_CMD(Tix_TListCmd); extern TIX_DECLARE_CMD(Tix_TmpLineCmd); extern TIX_DECLARE_CMD(Tix_TrueCmd); extern TIX_DECLARE_CMD(Tix_UnmapWindowCmd); extern TIX_DECLARE_CMD(Tix_MwmCmd); extern TIX_DECLARE_CMD(Tix_CreateWidgetCmd); #define SET_RECORD(interp, record, var, value) \ Tcl_SetVar2(interp, record, var, value, TCL_GLOBAL_ONLY) #define GET_RECORD(interp, record, var) \ Tcl_GetVar2(interp, record, var, TCL_GLOBAL_ONLY) #define TIX_HASHKEY(k) ((sizeof(k)>sizeof(int))?((char*)&(k)):((char*)(k))) /*---------------------------------------------------------------------- * Compatibility section *---------------------------------------------------------------------- */ #ifdef _WINDOWS /* This is the way win/tkWinPort.h in tk8.0.5 defines it */ #ifndef strcasecmp #define strcasecmp stricmp #endif #endif #ifdef __cplusplus } #endif #endif /* _TIX */