From 0e8457c4ecf63ffc1826c30f27cbd4756c2b7101 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Tue, 7 Oct 1997 18:51:41 +0000 Subject: Fix EventHook (the trick to make widgets appear when using GNU readline) to create and use a new thread state object -- otherwise it would dump core! --- Modules/_tkinter.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c index 1307053..19ed4f8 100644 --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -1451,17 +1451,30 @@ static PyMethodDef moduleMethods[] = {NULL, NULL} }; +static PyInterpreterState *event_interp = NULL; + static int EventHook() { + PyThreadState *tstate; + + if (Tk_GetNumMainWindows() == 0) + return 0; + if (event_interp == NULL) + return 0; + tstate = PyThreadState_New(event_interp); + PyEval_AcquireThread(tstate); + if (!errorInCmd) + Tcl_DoOneEvent(TCL_DONT_WAIT); if (errorInCmd) { errorInCmd = 0; PyErr_Restore(excInCmd, valInCmd, trbInCmd); excInCmd = valInCmd = trbInCmd = NULL; PyErr_Print(); } - if (Tk_GetNumMainWindows() > 0) - Tcl_DoOneEvent(TCL_DONT_WAIT); + PyThreadState_Clear(tstate); + PyEval_ReleaseThread(tstate); + PyThreadState_Delete(tstate); return 0; } @@ -1522,8 +1535,11 @@ init_tkinter() PyDict_SetItemString(d, "TkappType", (PyObject *)&Tkapp_Type); PyDict_SetItemString(d, "TkttType", (PyObject *)&Tktt_Type); - if (PyOS_InputHook == NULL) + if (PyOS_InputHook == NULL) { + PyEval_InitThreads(); + event_interp = PyThreadState_Get()->interp; PyOS_InputHook = EventHook; + } if (PyErr_Occurred()) Py_FatalError("can't initialize module _tkinter"); -- cgit v0.12