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);
45 if (nativethread_checked || ip == (Tcl_Interp *)
NULL) {
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.)");
67 nativethread_checked = 1;
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"
87 # define TK_NAME "tk89"
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"
98 # define TK_NAME "libtk8.9"
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;
122 ruby_tcl_dll =
getenv(
"RUBY_TCL_DLL");
124 if (ruby_tcl_dll) ruby_tcl_dll =
ruby_strdup(ruby_tcl_dll);
127 tcl_dll = (DL_HANDLE)DL_OPEN(ruby_tcl_dll);
129 char tcl_name[] = TCL_NAME DLEXT;
131 for (n =
'9'; n >
'0'; n--) {
132 tcl_name[TCL_INDEX] = n;
133 tcl_dll = (DL_HANDLE)DL_OPEN(tcl_name);
146 p_Tcl_FindExecutable = (void (*)(
const char *))DL_SYM(tcl_dll,
"Tcl_FindExecutable");
147 if (!p_Tcl_FindExecutable)
151 p_Tcl_FindExecutable(appname);
153 p_Tcl_FindExecutable(
"ruby");
163 char *ruby_tk_dll = 0;
173 ruby_tk_dll =
getenv(
"RUBY_TK_DLL");
175 tk_dll = (DL_HANDLE)DL_OPEN(ruby_tk_dll);
177 char tk_name[] = TK_NAME DLEXT;
179 for (n =
'9'; n >
'0'; n--) {
180 tk_name[TK_INDEX] = n;
181 tk_dll = (DL_HANDLE)DL_OPEN(tk_name);
194 #ifdef HAVE_PROTOTYPES
207 return(tclStubsPtr != (TclStubs*)
NULL);
213 return(tkStubsPtr != (TkStubs*)
NULL);
218 #ifdef HAVE_PROTOTYPES
230 tcl_ip = Tcl_CreateInterp();
234 return (Tcl_Interp*)
NULL;
242 Tcl_Interp *(*p_Tcl_CreateInterp)();
243 Tcl_Interp *(*p_Tcl_DeleteInterp)();
251 return (Tcl_Interp*)
NULL;
256 = (Tcl_Interp *(*)())DL_SYM(tcl_dll,
"Tcl_CreateInterp");
257 if (!p_Tcl_CreateInterp) {
259 return (Tcl_Interp*)
NULL;
263 = (Tcl_Interp *(*)())DL_SYM(tcl_dll,
"Tcl_DeleteInterp");
264 if (!p_Tcl_DeleteInterp) {
266 return (Tcl_Interp*)
NULL;
269 tcl_ip = (*p_Tcl_CreateInterp)();
272 return (Tcl_Interp*)
NULL;
275 if (!Tcl_InitStubs(tcl_ip,
"8.1", 0)) {
277 (*p_Tcl_DeleteInterp)(tcl_ip);
278 return (Tcl_Interp*)
NULL;
296 if (!tcl_ip)
return st;
298 Tcl_DeleteInterp(tcl_ip);
305 #ifdef HAVE_PROTOTYPES
312 Tcl_ResetResult(tcl_ip);
315 if (Tk_Init(tcl_ip) == TCL_ERROR) {
319 int (*p_Tk_Init)(Tcl_Interp *);
326 p_Tk_Init = (int (*)(Tcl_Interp *))DL_SYM(tk_dll,
"Tk_Init");
330 #if defined USE_TK_STUBS && defined TK_FRAMEWORK && defined(__APPLE__)
340 "if {[array get env TK_LIBRARY] == {}} { set env(TK_LIBRARY) [regsub -all -nocase {(t)cl} $tcl_library {\\1k}] }"
346 if ((*p_Tk_Init)(tcl_ip) == TCL_ERROR)
349 if (!Tk_InitStubs(tcl_ip, (
char *)
"8.1", 0))
361 #ifdef HAVE_PROTOTYPES
368 Tcl_ResetResult(tcl_ip);
371 if (Tk_SafeInit(tcl_ip) == TCL_ERROR)
374 int (*p_Tk_SafeInit)(Tcl_Interp *);
381 p_Tk_SafeInit = (int (*)(Tcl_Interp *))DL_SYM(tk_dll,
"Tk_SafeInit");
385 if ((*p_Tk_SafeInit)(tcl_ip) == TCL_ERROR)
388 if (!Tk_InitStubs(tcl_ip, (
char *)
"8.1", 0))
431 Tcl_DeleteInterp(tcl_ip);
435 Tcl_DeleteInterp(tcl_ip);
439 Tcl_DeleteInterp(tcl_ip);
452 #ifdef HAVE_PROTOTYPES
460 Tcl_FindExecutable(appname);
462 Tcl_FindExecutable(
"ruby");
481 #ifdef HAVE_PROTOTYPES
504 #ifdef HAVE_PROTOTYPES
519 tcl_ip = Tcl_CreateInterp();
522 return (Tcl_Interp*)
NULL;
537 #ifdef HAVE_PROTOTYPES
544 if (Tk_Init(tcl_ip) == TCL_ERROR)
547 if (!call_tk_stubs_init) {
551 call_tk_stubs_init = 1;
558 #ifdef HAVE_PROTOTYPES
565 #if TCL_MAJOR_VERSION >= 8
566 if (Tk_SafeInit(tcl_ip) == TCL_ERROR)
569 if (!call_tk_stubs_init) {
573 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)
RUBY_EXTERN VALUE rb_argv0
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,...)