-
-
Notifications
You must be signed in to change notification settings - Fork 156
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
b9e7b1d
commit 20d138d
Showing
6 changed files
with
481 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,112 @@ | ||
diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c | ||
index 2a3e65b6c97..b17c5bfd6b1 100644 | ||
--- a/Modules/_tkinter.c | ||
+++ b/Modules/_tkinter.c | ||
@@ -115,6 +115,7 @@ Copyright (C) 1994 Steen Lumholt. | ||
#ifdef MS_WINDOWS | ||
#include <conio.h> | ||
#define WAIT_FOR_STDIN | ||
+#endif | ||
|
||
static PyObject * | ||
_get_tcl_lib_path() | ||
@@ -132,6 +133,7 @@ _get_tcl_lib_path() | ||
return NULL; | ||
} | ||
|
||
+#ifdef MS_WINDOWS | ||
/* Check expected location for an installed Python first */ | ||
tcl_library_path = PyUnicode_FromString("\\tcl\\tcl" TCL_VERSION); | ||
if (tcl_library_path == NULL) { | ||
@@ -169,11 +171,31 @@ _get_tcl_lib_path() | ||
tcl_library_path = NULL; | ||
#endif | ||
} | ||
+#else | ||
+ /* Check expected location for an installed Python first */ | ||
+ tcl_library_path = PyUnicode_FromString("/lib/tcl" TCL_VERSION); | ||
+ if (tcl_library_path == NULL) { | ||
+ return NULL; | ||
+ } | ||
+ tcl_library_path = PyUnicode_Concat(prefix, tcl_library_path); | ||
+ if (tcl_library_path == NULL) { | ||
+ return NULL; | ||
+ } | ||
+ stat_return_value = _Py_stat(tcl_library_path, &stat_buf); | ||
+ if (stat_return_value == -2) { | ||
+ return NULL; | ||
+ } | ||
+ if (stat_return_value == -1) { | ||
+ /* install location doesn't exist, reset errno and leave Tcl | ||
+ to its own devices */ | ||
+ errno = 0; | ||
+ tcl_library_path = NULL; | ||
+ } | ||
+#endif | ||
already_checked = 1; | ||
} | ||
return tcl_library_path; | ||
} | ||
-#endif /* MS_WINDOWS */ | ||
|
||
/* The threading situation is complicated. Tcl is not thread-safe, except | ||
when configured with --enable-threads. | ||
@@ -822,6 +844,30 @@ Tkapp_New(const char *screenName, const char *className, | ||
|
||
ret = GetEnvironmentVariableW(L"TCL_LIBRARY", NULL, 0); | ||
if (!ret && GetLastError() == ERROR_ENVVAR_NOT_FOUND) { | ||
+ str_path = _get_tcl_lib_path(); | ||
+ if (str_path == NULL && PyErr_Occurred()) { | ||
+ return NULL; | ||
+ } | ||
+ if (str_path != NULL) { | ||
+ utf8_path = PyUnicode_AsUTF8String(str_path); | ||
+ if (utf8_path == NULL) { | ||
+ return NULL; | ||
+ } | ||
+ Tcl_SetVar(v->interp, | ||
+ "tcl_library", | ||
+ PyBytes_AS_STRING(utf8_path), | ||
+ TCL_GLOBAL_ONLY); | ||
+ Py_DECREF(utf8_path); | ||
+ } | ||
+ } | ||
+ } | ||
+#else | ||
+ { | ||
+ const char *env_val = getenv("TCL_LIBRARY"); | ||
+ if (!env_val) { | ||
+ PyObject *str_path; | ||
+ PyObject *utf8_path; | ||
+ | ||
str_path = _get_tcl_lib_path(); | ||
if (str_path == NULL && PyErr_Occurred()) { | ||
return NULL; | ||
@@ -3628,7 +3674,27 @@ PyInit__tkinter(void) | ||
PyMem_Free(wcs_path); | ||
} | ||
#else | ||
+ int set_var = 0; | ||
+ PyObject *str_path; | ||
+ char *path; | ||
+ | ||
+ if (!getenv("TCL_LIBRARY")) { | ||
+ str_path = _get_tcl_lib_path(); | ||
+ if (str_path == NULL && PyErr_Occurred()) { | ||
+ Py_DECREF(m); | ||
+ return NULL; | ||
+ } | ||
+ if (str_path != NULL) { | ||
+ setenv("TCL_LIBRARY", path, 1); | ||
+ set_var = 1; | ||
+ } | ||
+ } | ||
+ | ||
Tcl_FindExecutable(PyBytes_AS_STRING(cexe)); | ||
+ | ||
+ if (set_var) { | ||
+ unsetenv("TCL_LIBRARY"); | ||
+ } | ||
#endif /* MS_WINDOWS */ | ||
} | ||
Py_XDECREF(cexe); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,123 @@ | ||
diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c | ||
index 005036d3ff2..c130ed7b186 100644 | ||
--- a/Modules/_tkinter.c | ||
+++ b/Modules/_tkinter.c | ||
@@ -28,9 +28,7 @@ Copyright (C) 1994 Steen Lumholt. | ||
|
||
#include "Python.h" | ||
#include <ctype.h> | ||
-#ifdef MS_WINDOWS | ||
-# include "pycore_fileutils.h" // _Py_stat() | ||
-#endif | ||
+#include "pycore_fileutils.h" // _Py_stat() | ||
|
||
#ifdef MS_WINDOWS | ||
#include <windows.h> | ||
@@ -123,6 +121,7 @@ Copyright (C) 1994 Steen Lumholt. | ||
#ifdef MS_WINDOWS | ||
#include <conio.h> | ||
#define WAIT_FOR_STDIN | ||
+#endif | ||
|
||
static PyObject * | ||
_get_tcl_lib_path() | ||
@@ -140,6 +139,7 @@ _get_tcl_lib_path() | ||
return NULL; | ||
} | ||
|
||
+#ifdef MS_WINDOWS | ||
/* Check expected location for an installed Python first */ | ||
tcl_library_path = PyUnicode_FromString("\\tcl\\tcl" TCL_VERSION); | ||
if (tcl_library_path == NULL) { | ||
@@ -177,11 +177,31 @@ _get_tcl_lib_path() | ||
tcl_library_path = NULL; | ||
#endif | ||
} | ||
+#else | ||
+ /* Check expected location for an installed Python first */ | ||
+ tcl_library_path = PyUnicode_FromString("/lib/tcl" TCL_VERSION); | ||
+ if (tcl_library_path == NULL) { | ||
+ return NULL; | ||
+ } | ||
+ tcl_library_path = PyUnicode_Concat(prefix, tcl_library_path); | ||
+ if (tcl_library_path == NULL) { | ||
+ return NULL; | ||
+ } | ||
+ stat_return_value = _Py_stat(tcl_library_path, &stat_buf); | ||
+ if (stat_return_value == -2) { | ||
+ return NULL; | ||
+ } | ||
+ if (stat_return_value == -1) { | ||
+ /* install location doesn't exist, reset errno and leave Tcl | ||
+ to its own devices */ | ||
+ errno = 0; | ||
+ tcl_library_path = NULL; | ||
+ } | ||
+#endif | ||
already_checked = 1; | ||
} | ||
return tcl_library_path; | ||
} | ||
-#endif /* MS_WINDOWS */ | ||
|
||
/* The threading situation is complicated. Tcl is not thread-safe, except | ||
when configured with --enable-threads. | ||
@@ -687,6 +707,30 @@ Tkapp_New(const char *screenName, const char *className, | ||
|
||
ret = GetEnvironmentVariableW(L"TCL_LIBRARY", NULL, 0); | ||
if (!ret && GetLastError() == ERROR_ENVVAR_NOT_FOUND) { | ||
+ str_path = _get_tcl_lib_path(); | ||
+ if (str_path == NULL && PyErr_Occurred()) { | ||
+ return NULL; | ||
+ } | ||
+ if (str_path != NULL) { | ||
+ utf8_path = PyUnicode_AsUTF8String(str_path); | ||
+ if (utf8_path == NULL) { | ||
+ return NULL; | ||
+ } | ||
+ Tcl_SetVar(v->interp, | ||
+ "tcl_library", | ||
+ PyBytes_AS_STRING(utf8_path), | ||
+ TCL_GLOBAL_ONLY); | ||
+ Py_DECREF(utf8_path); | ||
+ } | ||
+ } | ||
+ } | ||
+#else | ||
+ { | ||
+ const char *env_val = getenv("TCL_LIBRARY"); | ||
+ if (!env_val) { | ||
+ PyObject *str_path; | ||
+ PyObject *utf8_path; | ||
+ | ||
str_path = _get_tcl_lib_path(); | ||
if (str_path == NULL && PyErr_Occurred()) { | ||
return NULL; | ||
@@ -3428,7 +3472,27 @@ PyInit__tkinter(void) | ||
PyMem_Free(wcs_path); | ||
} | ||
#else | ||
+ int set_var = 0; | ||
+ PyObject *str_path; | ||
+ char *path; | ||
+ | ||
+ if (!getenv("TCL_LIBRARY")) { | ||
+ str_path = _get_tcl_lib_path(); | ||
+ if (str_path == NULL && PyErr_Occurred()) { | ||
+ Py_DECREF(m); | ||
+ return NULL; | ||
+ } | ||
+ if (str_path != NULL) { | ||
+ setenv("TCL_LIBRARY", path, 1); | ||
+ set_var = 1; | ||
+ } | ||
+ } | ||
+ | ||
Tcl_FindExecutable(PyBytes_AS_STRING(cexe)); | ||
+ | ||
+ if (set_var) { | ||
+ unsetenv("TCL_LIBRARY"); | ||
+ } | ||
#endif /* MS_WINDOWS */ | ||
} | ||
Py_XDECREF(cexe); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,123 @@ | ||
diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c | ||
index 6b5fcb8a365..99d44ccf1d8 100644 | ||
--- a/Modules/_tkinter.c | ||
+++ b/Modules/_tkinter.c | ||
@@ -28,9 +28,7 @@ Copyright (C) 1994 Steen Lumholt. | ||
|
||
#include "Python.h" | ||
#include <ctype.h> | ||
-#ifdef MS_WINDOWS | ||
-# include "pycore_fileutils.h" // _Py_stat() | ||
-#endif | ||
+#include "pycore_fileutils.h" // _Py_stat() | ||
|
||
#include "pycore_long.h" | ||
|
||
@@ -134,6 +132,7 @@ typedef int Tcl_Size; | ||
#ifdef MS_WINDOWS | ||
#include <conio.h> | ||
#define WAIT_FOR_STDIN | ||
+#endif | ||
|
||
static PyObject * | ||
_get_tcl_lib_path(void) | ||
@@ -151,6 +150,7 @@ _get_tcl_lib_path(void) | ||
return NULL; | ||
} | ||
|
||
+#ifdef MS_WINDOWS | ||
/* Check expected location for an installed Python first */ | ||
tcl_library_path = PyUnicode_FromString("\\tcl\\tcl" TCL_VERSION); | ||
if (tcl_library_path == NULL) { | ||
@@ -188,11 +188,31 @@ _get_tcl_lib_path(void) | ||
tcl_library_path = NULL; | ||
#endif | ||
} | ||
+#else | ||
+ /* Check expected location for an installed Python first */ | ||
+ tcl_library_path = PyUnicode_FromString("/lib/tcl" TCL_VERSION); | ||
+ if (tcl_library_path == NULL) { | ||
+ return NULL; | ||
+ } | ||
+ tcl_library_path = PyUnicode_Concat(prefix, tcl_library_path); | ||
+ if (tcl_library_path == NULL) { | ||
+ return NULL; | ||
+ } | ||
+ stat_return_value = _Py_stat(tcl_library_path, &stat_buf); | ||
+ if (stat_return_value == -2) { | ||
+ return NULL; | ||
+ } | ||
+ if (stat_return_value == -1) { | ||
+ /* install location doesn't exist, reset errno and leave Tcl | ||
+ to its own devices */ | ||
+ errno = 0; | ||
+ tcl_library_path = NULL; | ||
+ } | ||
+#endif | ||
already_checked = 1; | ||
} | ||
return tcl_library_path; | ||
} | ||
-#endif /* MS_WINDOWS */ | ||
|
||
/* The threading situation is complicated. Tcl is not thread-safe, except | ||
when configured with --enable-threads. | ||
@@ -713,6 +733,30 @@ Tkapp_New(const char *screenName, const char *className, | ||
|
||
ret = GetEnvironmentVariableW(L"TCL_LIBRARY", NULL, 0); | ||
if (!ret && GetLastError() == ERROR_ENVVAR_NOT_FOUND) { | ||
+ str_path = _get_tcl_lib_path(); | ||
+ if (str_path == NULL && PyErr_Occurred()) { | ||
+ return NULL; | ||
+ } | ||
+ if (str_path != NULL) { | ||
+ utf8_path = PyUnicode_AsUTF8String(str_path); | ||
+ if (utf8_path == NULL) { | ||
+ return NULL; | ||
+ } | ||
+ Tcl_SetVar(v->interp, | ||
+ "tcl_library", | ||
+ PyBytes_AS_STRING(utf8_path), | ||
+ TCL_GLOBAL_ONLY); | ||
+ Py_DECREF(utf8_path); | ||
+ } | ||
+ } | ||
+ } | ||
+#else | ||
+ { | ||
+ const char *env_val = getenv("TCL_LIBRARY"); | ||
+ if (!env_val) { | ||
+ PyObject *str_path; | ||
+ PyObject *utf8_path; | ||
+ | ||
str_path = _get_tcl_lib_path(); | ||
if (str_path == NULL && PyErr_Occurred()) { | ||
return NULL; | ||
@@ -3542,7 +3586,27 @@ PyInit__tkinter(void) | ||
PyMem_Free(wcs_path); | ||
} | ||
#else | ||
+ int set_var = 0; | ||
+ PyObject *str_path; | ||
+ char *path; | ||
+ | ||
+ if (!getenv("TCL_LIBRARY")) { | ||
+ str_path = _get_tcl_lib_path(); | ||
+ if (str_path == NULL && PyErr_Occurred()) { | ||
+ Py_DECREF(m); | ||
+ return NULL; | ||
+ } | ||
+ if (str_path != NULL) { | ||
+ setenv("TCL_LIBRARY", path, 1); | ||
+ set_var = 1; | ||
+ } | ||
+ } | ||
+ | ||
Tcl_FindExecutable(PyBytes_AS_STRING(cexe)); | ||
+ | ||
+ if (set_var) { | ||
+ unsetenv("TCL_LIBRARY"); | ||
+ } | ||
#endif /* MS_WINDOWS */ | ||
} | ||
Py_XDECREF(cexe); |
Oops, something went wrong.