10 #if !defined(RSTRING_PTR)
11 #define RSTRING_PTR(s) (RSTRING(s)->ptr)
12 #define RSTRING_LEN(s) (RSTRING(s)->len)
22 # include <Quickdraw.h>
24 static int call_macinit = 0;
31 Tcl_MacSetEventProc(TkMacConvertEvent);
51 if (Tcl_GetVar2(ip,
"tcl_platform",
"threaded", TCL_GLOBAL_ONLY) != (
char*)
NULL) {
52 #ifdef HAVE_NATIVETHREAD
55 rb_warn(
"Inconsistency. Loaded Tcl/Tk libraries are enabled nativethread-support. But `tcltklib' is not. The inconsistency causes SEGV or other troubles frequently.");
58 #ifdef HAVE_NATIVETHREAD
59 rb_warning(
"Inconsistency.`tcltklib' is enabled nativethread-support. But loaded Tcl/Tk libraries are not. (Probably, the inconsistency doesn't cause any troubles.)");
72 #if defined USE_TCL_STUBS && defined USE_TK_STUBS
74 #if defined _WIN32 || defined __CYGWIN__
75 # ifdef HAVE_RUBY_RUBY_H
81 typedef HINSTANCE DL_HANDLE;
82 # define DL_OPEN LoadLibrary
83 # define DL_SYM GetProcAddress
86 # define TCL_NAME "tcl89%s"
87 # define TK_NAME "tk89%s"
90 #elif defined HAVE_DLOPEN
92 typedef void *DL_HANDLE;
93 # define DL_OPEN(file) dlopen(file, RTLD_LAZY|RTLD_GLOBAL)
97 # define TCL_NAME "libtcl8.9%s"
98 # define TK_NAME "libtk8.9%s"
99 # if defined(__APPLE__) && defined(__MACH__)
101 # define DLEXT ".dylib"
105 static DL_HANDLE tcl_dll = (DL_HANDLE)0;
106 static DL_HANDLE tk_dll = (DL_HANDLE)0;
109 #ifdef HAVE_PROTOTYPES
116 void (*p_Tcl_FindExecutable)(
const char *);
118 char *ruby_tcl_dll = 0;
123 ruby_tcl_dll =
getenv(
"RUBY_TCL_DLL");
125 if (ruby_tcl_dll) ruby_tcl_dll =
ruby_strdup(ruby_tcl_dll);
128 tcl_dll = (DL_HANDLE)DL_OPEN(ruby_tcl_dll);
130 snprintf(tcl_name,
sizeof tcl_name, TCL_NAME, DLEXT);
132 for (n =
'9'; n >
'0'; n--) {
133 tcl_name[TCL_INDEX] = n;
134 tcl_dll = (DL_HANDLE)DL_OPEN(tcl_name);
147 p_Tcl_FindExecutable = (void (*)(
const char *))DL_SYM(tcl_dll,
"Tcl_FindExecutable");
148 if (!p_Tcl_FindExecutable)
152 p_Tcl_FindExecutable(appname);
154 p_Tcl_FindExecutable(
"ruby");
164 char *ruby_tk_dll = 0;
175 ruby_tk_dll =
getenv(
"RUBY_TK_DLL");
177 tk_dll = (DL_HANDLE)DL_OPEN(ruby_tk_dll);
179 snprintf(tk_name,
sizeof tk_name, TK_NAME, DLEXT);
181 for (n =
'9'; n >
'0'; n--) {
182 tk_name[TK_INDEX] = n;
183 tk_dll = (DL_HANDLE)DL_OPEN(tk_name);
196 #ifdef HAVE_PROTOTYPES
209 return(tclStubsPtr != (TclStubs*)
NULL);
215 return(tkStubsPtr != (TkStubs*)
NULL);
220 #ifdef HAVE_PROTOTYPES
232 tcl_ip = Tcl_CreateInterp();
236 return (Tcl_Interp*)
NULL;
244 Tcl_Interp *(*p_Tcl_CreateInterp)();
245 Tcl_Interp *(*p_Tcl_DeleteInterp)();
253 return (Tcl_Interp*)
NULL;
258 = (Tcl_Interp *(*)())DL_SYM(tcl_dll,
"Tcl_CreateInterp");
259 if (!p_Tcl_CreateInterp) {
261 return (Tcl_Interp*)
NULL;
265 = (Tcl_Interp *(*)())DL_SYM(tcl_dll,
"Tcl_DeleteInterp");
266 if (!p_Tcl_DeleteInterp) {
268 return (Tcl_Interp*)
NULL;
271 tcl_ip = (*p_Tcl_CreateInterp)();
274 return (Tcl_Interp*)
NULL;
277 if (!Tcl_InitStubs(tcl_ip,
"8.1", 0)) {
279 (*p_Tcl_DeleteInterp)(tcl_ip);
280 return (Tcl_Interp*)
NULL;
298 if (!tcl_ip)
return st;
300 Tcl_DeleteInterp(tcl_ip);
307 #ifdef HAVE_PROTOTYPES
314 Tcl_ResetResult(tcl_ip);
317 if (Tk_Init(tcl_ip) == TCL_ERROR) {
321 int (*p_Tk_Init)(Tcl_Interp *);
328 p_Tk_Init = (int (*)(Tcl_Interp *))DL_SYM(tk_dll,
"Tk_Init");
332 #if defined USE_TK_STUBS && defined TK_FRAMEWORK && defined(__APPLE__) && defined(__MACH__)
342 "if {[array get env TK_LIBRARY] == {}} { set env(TK_LIBRARY) [regsub -all -nocase {(t)cl} $tcl_library {\\1k}] }"
348 if ((*p_Tk_Init)(tcl_ip) == TCL_ERROR)
351 if (!Tk_InitStubs(tcl_ip, (
char *)
"8.1", 0))
363 #ifdef HAVE_PROTOTYPES
370 Tcl_ResetResult(tcl_ip);
373 if (Tk_SafeInit(tcl_ip) == TCL_ERROR)
376 int (*p_Tk_SafeInit)(Tcl_Interp *);
383 p_Tk_SafeInit = (int (*)(Tcl_Interp *))DL_SYM(tk_dll,
"Tk_SafeInit");
387 if ((*p_Tk_SafeInit)(tcl_ip) == TCL_ERROR)
390 if (!Tk_InitStubs(tcl_ip, (
char *)
"8.1", 0))
433 Tcl_DeleteInterp(tcl_ip);
437 Tcl_DeleteInterp(tcl_ip);
441 Tcl_DeleteInterp(tcl_ip);
454 #ifdef HAVE_PROTOTYPES
462 Tcl_FindExecutable(appname);
464 Tcl_FindExecutable(
"ruby");
483 #ifdef HAVE_PROTOTYPES
506 #ifdef HAVE_PROTOTYPES
521 tcl_ip = Tcl_CreateInterp();
524 return (Tcl_Interp*)
NULL;
539 #ifdef HAVE_PROTOTYPES
546 if (Tk_Init(tcl_ip) == TCL_ERROR)
549 if (!call_tk_stubs_init) {
553 call_tk_stubs_init = 1;
560 #ifdef HAVE_PROTOTYPES
567 #if TCL_MAJOR_VERSION >= 8
568 if (Tk_SafeInit(tcl_ip) == TCL_ERROR)
571 if (!call_tk_stubs_init) {
575 call_tk_stubs_init = 1;
int ruby_tcl_stubs_init()
#define FAIL_Tcl_InitStubs
#define FAIL_CreateInterp
static void _nativethread_consistency_check(Tcl_Interp *ip)
int ruby_open_tcltk_dll(char *appname)
static int nativethread_checked
char * ruby_strdup(const char *)
int ruby_tk_stubs_safeinit(Tcl_Interp *tcl_ip)
int ruby_tk_stubs_init(Tcl_Interp *tcl_ip)
#define FAIL_Tk_InitStubs
#define NO_FindExecutable
Tcl_Interp * ruby_tcl_create_ip_and_stubs_init(int *st)
static int call_tk_stubs_init
void rb_warning(const char *fmt,...)
int ruby_open_tcl_dll(char *appname)
void rb_warn(const char *fmt,...)
RUBY_EXTERN VALUE rb_argv0