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!
This commit is contained in:
Guido van Rossum 1997-10-07 18:51:41 +00:00
parent 53ad776cbf
commit 0e8457c4ec
1 changed files with 19 additions and 3 deletions

View File

@ -1451,17 +1451,30 @@ static PyMethodDef moduleMethods[] =
{NULL, NULL} {NULL, NULL}
}; };
static PyInterpreterState *event_interp = NULL;
static int static int
EventHook() 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) { if (errorInCmd) {
errorInCmd = 0; errorInCmd = 0;
PyErr_Restore(excInCmd, valInCmd, trbInCmd); PyErr_Restore(excInCmd, valInCmd, trbInCmd);
excInCmd = valInCmd = trbInCmd = NULL; excInCmd = valInCmd = trbInCmd = NULL;
PyErr_Print(); PyErr_Print();
} }
if (Tk_GetNumMainWindows() > 0) PyThreadState_Clear(tstate);
Tcl_DoOneEvent(TCL_DONT_WAIT); PyEval_ReleaseThread(tstate);
PyThreadState_Delete(tstate);
return 0; return 0;
} }
@ -1522,8 +1535,11 @@ init_tkinter()
PyDict_SetItemString(d, "TkappType", (PyObject *)&Tkapp_Type); PyDict_SetItemString(d, "TkappType", (PyObject *)&Tkapp_Type);
PyDict_SetItemString(d, "TkttType", (PyObject *)&Tktt_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; PyOS_InputHook = EventHook;
}
if (PyErr_Occurred()) if (PyErr_Occurred())
Py_FatalError("can't initialize module _tkinter"); Py_FatalError("can't initialize module _tkinter");