tkappinit.c 4.03 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13
/* appinit.c -- Tcl and Tk application initialization.

   The function Tcl_AppInit() below initializes various Tcl packages.
   It is called for each Tcl interpreter created by _tkinter.create().
   It needs to be compiled with -DWITH_<package> flags for each package
   that you are statically linking with.  You may have to add sections
   for packages not yet listed below.

   Note that those packages for which Tcl_StaticPackage() is called with
   a NULL first argument are known as "static loadable" packages to
   Tcl but not actually initialized.  To use these, you have to load
   it explicitly, e.g. tkapp.eval("load {} Blt").
 */
Guido van Rossum's avatar
Guido van Rossum committed
14

15
#include <string.h>
Guido van Rossum's avatar
Guido van Rossum committed
16 17 18 19
#include <tcl.h>
#include <tk.h>

int
20
Tcl_AppInit(Tcl_Interp *interp)
Guido van Rossum's avatar
Guido van Rossum committed
21
{
22
	Tk_Window main_window;
23
	const char * _tkinter_skip_tk_init;
Guido van Rossum's avatar
Guido van Rossum committed
24

25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
#ifdef TK_AQUA
#ifndef MAX_PATH_LEN
#define MAX_PATH_LEN 1024
#endif
	char tclLibPath[MAX_PATH_LEN], tkLibPath[MAX_PATH_LEN];
	Tcl_Obj*	pathPtr;

        /* pre- Tcl_Init code copied from tkMacOSXAppInit.c */
	Tk_MacOSXOpenBundleResources (interp, "com.tcltk.tcllibrary",
       	tclLibPath, MAX_PATH_LEN, 0);

	if (tclLibPath[0] != '\0') {
       	Tcl_SetVar(interp, "tcl_library", tclLibPath, TCL_GLOBAL_ONLY);
		Tcl_SetVar(interp, "tclDefaultLibrary", tclLibPath, TCL_GLOBAL_ONLY);
		Tcl_SetVar(interp, "tcl_pkgPath", tclLibPath, TCL_GLOBAL_ONLY);
	}
	
   	if (tclLibPath[0] != '\0') {
		Tcl_SetVar(interp, "tcl_library", tclLibPath, TCL_GLOBAL_ONLY);
		Tcl_SetVar(interp, "tclDefaultLibrary", tclLibPath, TCL_GLOBAL_ONLY);
		Tcl_SetVar(interp, "tcl_pkgPath", tclLibPath, TCL_GLOBAL_ONLY);
	}
#endif
Barry Warsaw's avatar
Barry Warsaw committed
48 49
	if (Tcl_Init (interp) == TCL_ERROR)
		return TCL_ERROR;
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72

#ifdef TK_AQUA
        /* pre- Tk_Init code copied from tkMacOSXAppInit.c */
	Tk_MacOSXOpenBundleResources (interp, "com.tcltk.tklibrary",
            tkLibPath, MAX_PATH_LEN, 1);

	if (tclLibPath[0] != '\0') {
		pathPtr = Tcl_NewStringObj(tclLibPath, -1);
	} else {
		Tcl_Obj *pathPtr = TclGetLibraryPath();
	}

	if (tkLibPath[0] != '\0') {
		Tcl_Obj *objPtr;

		Tcl_SetVar(interp, "tk_library", tkLibPath, TCL_GLOBAL_ONLY);
		objPtr = Tcl_NewStringObj(tkLibPath, -1);
		Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
	}

	TclSetLibraryPath(pathPtr);
#endif

73 74 75 76 77 78 79 80 81
#ifdef WITH_XXX
		// Initialize modules that don't require Tk
#endif

	_tkinter_skip_tk_init =	Tcl_GetVar(interp, "_tkinter_skip_tk_init", TCL_GLOBAL_ONLY);
	if (_tkinter_skip_tk_init != NULL && strcmp(_tkinter_skip_tk_init, "1")	== 0) {
		return TCL_OK;
	}
	if (Tk_Init(interp) == TCL_ERROR)
Barry Warsaw's avatar
Barry Warsaw committed
82
		return TCL_ERROR;
Guido van Rossum's avatar
Guido van Rossum committed
83

84
	main_window = Tk_MainWindow(interp);
85

86 87 88 89 90
#ifdef TK_AQUA
	TkMacOSXInitAppleEvents(interp);
	TkMacOSXInitMenus(interp);
#endif
    
Guido van Rossum's avatar
Guido van Rossum committed
91
#ifdef WITH_MOREBUTTONS
Barry Warsaw's avatar
Barry Warsaw committed
92 93 94 95 96
	{
		extern Tcl_CmdProc studButtonCmd;
		extern Tcl_CmdProc triButtonCmd;

		Tcl_CreateCommand(interp, "studbutton", studButtonCmd,
97
				  (ClientData) main_window, NULL);
Barry Warsaw's avatar
Barry Warsaw committed
98
		Tcl_CreateCommand(interp, "tributton", triButtonCmd,
99
				  (ClientData) main_window, NULL);
Barry Warsaw's avatar
Barry Warsaw committed
100
	}
Guido van Rossum's avatar
Guido van Rossum committed
101
#endif
102 103 104

#ifdef WITH_PIL /* 0.2b5 and later -- not yet released as of May 14 */
	{
105
		extern void TkImaging_Init(Tcl_Interp *);
106
		TkImaging_Init(interp);
107 108
		/* XXX TkImaging_Init() doesn't have the right return type */
		/*Tcl_StaticPackage(interp, "Imaging", TkImaging_Init, NULL);*/
109 110 111 112 113 114
	}
#endif

#ifdef WITH_PIL_OLD /* 0.2b4 and earlier */
	{
		extern void TkImaging_Init(void);
115 116
		/* XXX TkImaging_Init() doesn't have the right prototype */
		/*Tcl_StaticPackage(interp, "Imaging", TkImaging_Init, NULL);*/
117 118 119
	}
#endif

120
#ifdef WITH_TIX
121 122 123 124 125
        {
                extern int Tix_Init(Tcl_Interp *interp);
                extern int Tix_SafeInit(Tcl_Interp *interp);
                Tcl_StaticPackage(NULL, "Tix", Tix_Init, Tix_SafeInit);
        }
126 127 128
#endif

#ifdef WITH_BLT
129 130 131 132 133 134 135 136 137 138 139 140 141
	{
		extern int Blt_Init(Tcl_Interp *);
		extern int Blt_SafeInit(Tcl_Interp *);
		Tcl_StaticPackage(NULL, "Blt", Blt_Init, Blt_SafeInit);
	}
#endif

#ifdef WITH_TOGL
	{
		/* XXX I've heard rumors that this doesn't work */
		extern int Togl_Init(Tcl_Interp *);
		/* XXX Is there no Togl_SafeInit? */
		Tcl_StaticPackage(NULL, "Togl", Togl_Init, NULL);
142 143 144
	}
#endif

Guido van Rossum's avatar
Guido van Rossum committed
145 146 147
#ifdef WITH_XXX

#endif
Barry Warsaw's avatar
Barry Warsaw committed
148
	return TCL_OK;
Guido van Rossum's avatar
Guido van Rossum committed
149
}