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" 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__) 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)
560 #ifdef HAVE_PROTOTYPES 567 #if TCL_MAJOR_VERSION >= 8 568 if (Tk_SafeInit(tcl_ip) == TCL_ERROR)
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