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:
parent
53ad776cbf
commit
0e8457c4ec
|
@ -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");
|
||||||
|
|
Loading…
Reference in New Issue