1 | /* appinit.c -- Tcl and Tk application initialization. |
2 | |
3 | The function Tcl_AppInit() below initializes various Tcl packages. |
4 | It is called for each Tcl interpreter created by _tkinter.create(). |
5 | It needs to be compiled with -DWITH_<package> flags for each package |
6 | that you are statically linking with. You may have to add sections |
7 | for packages not yet listed below. |
8 | |
9 | Note that those packages for which Tcl_StaticPackage() is called with |
10 | a NULL first argument are known as "static loadable" packages to |
11 | Tcl but not actually initialized. To use these, you have to load |
12 | it explicitly, e.g. tkapp.eval("load {} Blt"). |
13 | */ |
14 | |
15 | #include <string.h> |
16 | #include <tcl.h> |
17 | #include <tk.h> |
18 | |
19 | #include "tkinter.h" |
20 | |
21 | #ifdef TKINTER_PROTECT_LOADTK |
22 | /* See Tkapp_TkInit in _tkinter.c for the usage of tk_load_faile */ |
23 | static int tk_load_failed; |
24 | #endif |
25 | |
26 | int |
27 | Tcl_AppInit(Tcl_Interp *interp) |
28 | { |
29 | const char *_tkinter_skip_tk_init; |
30 | #ifdef TKINTER_PROTECT_LOADTK |
31 | const char *_tkinter_tk_failed; |
32 | #endif |
33 | |
34 | #ifdef TK_AQUA |
35 | #ifndef MAX_PATH_LEN |
36 | #define MAX_PATH_LEN 1024 |
37 | #endif |
38 | char tclLibPath[MAX_PATH_LEN], tkLibPath[MAX_PATH_LEN]; |
39 | Tcl_Obj* pathPtr; |
40 | |
41 | /* pre- Tcl_Init code copied from tkMacOSXAppInit.c */ |
42 | Tk_MacOSXOpenBundleResources (interp, "com.tcltk.tcllibrary" , |
43 | tclLibPath, MAX_PATH_LEN, 0); |
44 | |
45 | if (tclLibPath[0] != '\0') { |
46 | Tcl_SetVar(interp, "tcl_library" , tclLibPath, TCL_GLOBAL_ONLY); |
47 | Tcl_SetVar(interp, "tclDefaultLibrary" , tclLibPath, TCL_GLOBAL_ONLY); |
48 | Tcl_SetVar(interp, "tcl_pkgPath" , tclLibPath, TCL_GLOBAL_ONLY); |
49 | } |
50 | |
51 | if (tclLibPath[0] != '\0') { |
52 | Tcl_SetVar(interp, "tcl_library" , tclLibPath, TCL_GLOBAL_ONLY); |
53 | Tcl_SetVar(interp, "tclDefaultLibrary" , tclLibPath, TCL_GLOBAL_ONLY); |
54 | Tcl_SetVar(interp, "tcl_pkgPath" , tclLibPath, TCL_GLOBAL_ONLY); |
55 | } |
56 | #endif |
57 | if (Tcl_Init (interp) == TCL_ERROR) |
58 | return TCL_ERROR; |
59 | |
60 | #ifdef TK_AQUA |
61 | /* pre- Tk_Init code copied from tkMacOSXAppInit.c */ |
62 | Tk_MacOSXOpenBundleResources (interp, "com.tcltk.tklibrary" , |
63 | tkLibPath, MAX_PATH_LEN, 1); |
64 | |
65 | if (tclLibPath[0] != '\0') { |
66 | pathPtr = Tcl_NewStringObj(tclLibPath, -1); |
67 | } else { |
68 | Tcl_Obj *pathPtr = TclGetLibraryPath(); |
69 | } |
70 | |
71 | if (tkLibPath[0] != '\0') { |
72 | Tcl_Obj *objPtr; |
73 | |
74 | Tcl_SetVar(interp, "tk_library" , tkLibPath, TCL_GLOBAL_ONLY); |
75 | objPtr = Tcl_NewStringObj(tkLibPath, -1); |
76 | Tcl_ListObjAppendElement(NULL, pathPtr, objPtr); |
77 | } |
78 | |
79 | TclSetLibraryPath(pathPtr); |
80 | #endif |
81 | |
82 | #ifdef WITH_XXX |
83 | /* Initialize modules that don't require Tk */ |
84 | #endif |
85 | |
86 | _tkinter_skip_tk_init = Tcl_GetVar(interp, |
87 | "_tkinter_skip_tk_init" , TCL_GLOBAL_ONLY); |
88 | if (_tkinter_skip_tk_init != NULL && |
89 | strcmp(_tkinter_skip_tk_init, "1" ) == 0) { |
90 | return TCL_OK; |
91 | } |
92 | |
93 | #ifdef TKINTER_PROTECT_LOADTK |
94 | _tkinter_tk_failed = Tcl_GetVar(interp, |
95 | "_tkinter_tk_failed" , TCL_GLOBAL_ONLY); |
96 | |
97 | if (tk_load_failed || ( |
98 | _tkinter_tk_failed != NULL && |
99 | strcmp(_tkinter_tk_failed, "1" ) == 0)) { |
100 | Tcl_SetResult(interp, TKINTER_LOADTK_ERRMSG, TCL_STATIC); |
101 | return TCL_ERROR; |
102 | } |
103 | #endif |
104 | |
105 | if (Tk_Init(interp) == TCL_ERROR) { |
106 | #ifdef TKINTER_PROTECT_LOADTK |
107 | tk_load_failed = 1; |
108 | Tcl_SetVar(interp, "_tkinter_tk_failed" , "1" , TCL_GLOBAL_ONLY); |
109 | #endif |
110 | return TCL_ERROR; |
111 | } |
112 | |
113 | Tk_MainWindow(interp); |
114 | |
115 | #ifdef TK_AQUA |
116 | TkMacOSXInitAppleEvents(interp); |
117 | TkMacOSXInitMenus(interp); |
118 | #endif |
119 | |
120 | #ifdef WITH_PIL /* 0.2b5 and later -- not yet released as of May 14 */ |
121 | { |
122 | extern void TkImaging_Init(Tcl_Interp *); |
123 | TkImaging_Init(interp); |
124 | /* XXX TkImaging_Init() doesn't have the right return type */ |
125 | /*Tcl_StaticPackage(interp, "Imaging", TkImaging_Init, NULL);*/ |
126 | } |
127 | #endif |
128 | |
129 | #ifdef WITH_PIL_OLD /* 0.2b4 and earlier */ |
130 | { |
131 | extern void TkImaging_Init(void); |
132 | /* XXX TkImaging_Init() doesn't have the right prototype */ |
133 | /*Tcl_StaticPackage(interp, "Imaging", TkImaging_Init, NULL);*/ |
134 | } |
135 | #endif |
136 | |
137 | #ifdef WITH_TIX |
138 | { |
139 | extern int Tix_Init(Tcl_Interp *interp); |
140 | extern int Tix_SafeInit(Tcl_Interp *interp); |
141 | Tcl_StaticPackage(NULL, "Tix" , Tix_Init, Tix_SafeInit); |
142 | } |
143 | #endif |
144 | |
145 | #ifdef WITH_BLT |
146 | { |
147 | extern int Blt_Init(Tcl_Interp *); |
148 | extern int Blt_SafeInit(Tcl_Interp *); |
149 | Tcl_StaticPackage(NULL, "Blt" , Blt_Init, Blt_SafeInit); |
150 | } |
151 | #endif |
152 | |
153 | #ifdef WITH_TOGL |
154 | { |
155 | /* XXX I've heard rumors that this doesn't work */ |
156 | extern int Togl_Init(Tcl_Interp *); |
157 | /* XXX Is there no Togl_SafeInit? */ |
158 | Tcl_StaticPackage(NULL, "Togl" , Togl_Init, NULL); |
159 | } |
160 | #endif |
161 | |
162 | #ifdef WITH_XXX |
163 | |
164 | #endif |
165 | return TCL_OK; |
166 | } |
167 | |