Posted to tcl by apw at Fri Sep 14 07:37:38 GMT 2007view pretty
I have found a solution to my problems of defering to load Tk until it is needed in itcl-ng. What I have done is: in itcl-ng I have defined on C-level tcl commands for example: Tcl_CreateObjCommand(interp, "::itcl::widget", Itcl_WidgetCmdStart, (ClientData)infoPtr, (Tcl_CmdDeleteProc*)NULL); /* * ------------------------------------------------------------------------ * Itcl_WidgetCmdStart() * * that is just a dummy command to load package ItclWidget * and then to resend the command and execute it in that package * package ItclWidget is renaming the Tcl command!! * * ------------------------------------------------------------------------ */ int Itcl_WidgetCmdStart( ClientData clientData, /* info for all known objects */ Tcl_Interp *interp, /* current interpreter */ int objc, /* number of arguments */ Tcl_Obj *CONST objv[]) /* argument objects */ { ItclShowArgs(0, "Itcl_WidgetCmdStart", objc, objv); const char *res = Tcl_PkgRequire(interp, "ItclWidget", "4.0", 0); if (res == NULL) { return TCL_ERROR; } return Tcl_EvalObjv(interp, objc, objv, 0); } and in the additional package ItclWidget, which is linked agaist Tk lib, I have the following: TclRenameCommand(interp, "::itcl::widget", "::itcl::__widget"); Tcl_CreateObjCommand(interp, "::itcl::widget", Itcl_WidgetCmd, (ClientData)infoPtr, (Tcl_CmdDeleteProc*)NULL); C-function Itcl_WidgetCmd is doing the real work from that point on, and as the Tcl_EvalObjv command is calling the parser again, now the Itcl_WidgetCmd is called without interaction from the user