]> granicus.if.org Git - python/commitdiff
Fix EventHook (the trick to make widgets appear when using GNU
authorGuido van Rossum <guido@python.org>
Tue, 7 Oct 1997 18:51:41 +0000 (18:51 +0000)
committerGuido van Rossum <guido@python.org>
Tue, 7 Oct 1997 18:51:41 +0000 (18:51 +0000)
readline) to create and use a new thread state object -- otherwise it
would dump core!

Modules/_tkinter.c

index 1307053f84f8a6feec409d5f4486f2004e74ced9..19ed4f8fb3ca9ccc7961358bbeebd132591d7c6f 100644 (file)
@@ -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");