summaryrefslogtreecommitdiff
path: root/Modules
diff options
context:
space:
mode:
authorJack Jansen <jack.jansen@cwi.nl>2001-12-09 23:15:56 +0000
committerJack Jansen <jack.jansen@cwi.nl>2001-12-09 23:15:56 +0000
commitcb85244228ed9261eceb71f31cd825bfcb617a70 (patch)
tree3a3cb03790e09949af696a7517292cc846b2012b /Modules
parentedeea04bfd8342c5339cea701d9c6c08186a1cdb (diff)
downloadcpython-git-cb85244228ed9261eceb71f31cd825bfcb617a70.tar.gz
Mods by Tony Lownds (patch 490100, slightly massaged by me) to make Tkinter
work with Mac OS X Aqua-Tk, all nicely within ifdefs. The process is not for the faint of heart, though: you need to download and install the (alfa) Aqua-Tk, obtain a few needed X11 headers from somewhere else and then everything builds. To run scripts using Tkinter you must build with --enable-framework, build Python.app in Mac/OSX and run your Tkinter scripts with that. Then, about half the tests in Demo/tkinter work (or at least do something). Checking this in anyway because it shouldn't break anything, and newer versions of Aqua-Tk will streamline the process.
Diffstat (limited to 'Modules')
-rw-r--r--Modules/_tkinter.c24
-rw-r--r--Modules/tkappinit.c51
2 files changed, 74 insertions, 1 deletions
diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c
index 4e701ad3e3..44f6420c71 100644
--- a/Modules/_tkinter.c
+++ b/Modules/_tkinter.c
@@ -41,8 +41,13 @@ Copyright (C) 1994 Steen Lumholt.
#define MAC_TCL
#endif
+#ifdef TK_FRAMEWORK
+#include <Tcl/tcl.h>
+#include <Tk/tk.h>
+#else
#include <tcl.h>
#include <tk.h>
+#endif
#define TKMAJORMINOR (TK_MAJOR_VERSION*1000 + TK_MINOR_VERSION)
@@ -454,6 +459,7 @@ Tkapp_New(char *screenName, char *baseName, char *className, int interactive)
ClearMenuBar();
TkMacInitMenus(v->interp);
#endif
+
/* Delete the 'exit' command, which can screw things up */
Tcl_DeleteCommand(v->interp, "exit");
@@ -1580,7 +1586,7 @@ Tktt_Repr(PyObject *self)
char buf[100];
PyOS_snprintf(buf, sizeof(buf), "<tktimertoken at %p%s>", v,
- v->func == NULL ? ", handler deleted" : "");
+ v->func == NULL ? ", handler deleted" : "");
return PyString_FromString(buf);
}
@@ -2137,6 +2143,22 @@ init_tkinter(void)
Tktt_Type.ob_type = &PyType_Type;
PyDict_SetItemString(d, "TkttType", (PyObject *)&Tktt_Type);
+
+#ifdef TK_AQUA
+ /* Tk_MacOSXSetupTkNotifier must be called before Tcl's subsystems
+ * start waking up. Note that Tcl_FindExecutable will do this, this
+ * code must be above it! The original warning from
+ * tkMacOSXAppInit.c is copied below.
+ *
+ * NB - You have to swap in the Tk Notifier BEFORE you start up the
+ * Tcl interpreter for now. It probably should work to do this
+ * in the other order, but for now it doesn't seem to.
+ *
+ */
+ Tk_MacOSXSetupTkNotifier();
+#endif
+
+
/* This helps the dynamic loader; in Unicode aware Tcl versions
it also helps Tcl find its encodings. */
Tcl_FindExecutable(Py_GetProgramName());
diff --git a/Modules/tkappinit.c b/Modules/tkappinit.c
index c551fcab44..96c545d7e9 100644
--- a/Modules/tkappinit.c
+++ b/Modules/tkappinit.c
@@ -20,13 +20,64 @@ Tcl_AppInit(Tcl_Interp *interp)
{
Tk_Window main_window;
+#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
if (Tcl_Init (interp) == TCL_ERROR)
return TCL_ERROR;
+
+#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
+
if (Tk_Init (interp) == TCL_ERROR)
return TCL_ERROR;
main_window = Tk_MainWindow(interp);
+#ifdef TK_AQUA
+ TkMacOSXInitAppleEvents(interp);
+ TkMacOSXInitMenus(interp);
+#endif
+
#ifdef WITH_MOREBUTTONS
{
extern Tcl_CmdProc studButtonCmd;