@@ -159,6 +159,8 @@ typedef struct {
159159 PyTypeObject * complexstr_type ; // _curses.complexstr
160160 PyObject * topscreen ; // owned ref to the current screen object,
161161 // or NULL for the initscr() screen
162+ PyObject * prescreen ; // owned ref to the pending new_prescr() screen,
163+ // or NULL if there is no pending pre-screen
162164} cursesmodule_state ;
163165
164166static inline cursesmodule_state *
@@ -6619,13 +6621,21 @@ _curses_initscr_impl(PyObject *module)
66196621 return NULL ;
66206622 }
66216623
6624+ cursesmodule_state * state = get_cursesmodule_state (module );
6625+ if (state -> prescreen != NULL ) {
6626+ PyCursesScreenObject * prescreen =
6627+ _PyCursesScreenObject_CAST (state -> prescreen );
6628+ assert (prescreen -> screen != NULL );
6629+ prescreen -> screen = NULL ;
6630+ Py_CLEAR (state -> prescreen );
6631+ }
6632+
66226633 curses_initscr_called = curses_setupterm_called = TRUE;
66236634
66246635 if (curses_init_dict (module ) < 0 ) {
66256636 return NULL ;
66266637 }
66276638
6628- cursesmodule_state * state = get_cursesmodule_state (module );
66296639 PyObject * winobj = PyCursesWindow_New (state , win , NULL , NULL , NULL );
66306640 if (winobj == NULL ) {
66316641 return NULL ;
@@ -6801,6 +6811,13 @@ _curses_newterm_impl(PyObject *module, const char *type, PyObject *fd,
68016811 cursesmodule_state * state = get_cursesmodule_state (module );
68026812 /* The screen object owns the SCREEN and the streams; deleting it (when it
68036813 is no longer referenced) calls delscreen() and closes the streams. */
6814+ if (state -> prescreen != NULL ) {
6815+ PyCursesScreenObject * prescreen =
6816+ _PyCursesScreenObject_CAST (state -> prescreen );
6817+ assert (prescreen -> screen == screen );
6818+ prescreen -> screen = NULL ;
6819+ Py_CLEAR (state -> prescreen );
6820+ }
68046821 PyObject * screenobj = PyCursesScreen_New (state , screen , outfp , infp , NULL );
68056822 if (screenobj == NULL ) {
68066823 delscreen (screen );
@@ -6898,7 +6915,13 @@ _curses_new_prescr_impl(PyObject *module)
68986915 return NULL ;
68996916 }
69006917 cursesmodule_state * state = get_cursesmodule_state (module );
6901- return PyCursesScreen_New (state , screen , NULL , NULL , NULL );
6918+ PyObject * screenobj = PyCursesScreen_New (state , screen , NULL , NULL , NULL );
6919+ if (screenobj == NULL ) {
6920+ delscreen (screen );
6921+ return NULL ;
6922+ }
6923+ Py_XSETREF (state -> prescreen , Py_NewRef (screenobj ));
6924+ return screenobj ;
69026925}
69036926#endif /* HAVE_CURSES_NEW_PRESCR */
69046927
@@ -8894,6 +8917,7 @@ cursesmodule_traverse(PyObject *mod, visitproc visit, void *arg)
88948917 Py_VISIT (state -> complexchar_type );
88958918 Py_VISIT (state -> complexstr_type );
88968919 Py_VISIT (state -> topscreen );
8920+ Py_VISIT (state -> prescreen );
88978921 return 0 ;
88988922}
88998923
@@ -8907,6 +8931,7 @@ cursesmodule_clear(PyObject *mod)
89078931 Py_CLEAR (state -> complexchar_type );
89088932 Py_CLEAR (state -> complexstr_type );
89098933 Py_CLEAR (state -> topscreen );
8934+ Py_CLEAR (state -> prescreen );
89108935 return 0 ;
89118936}
89128937
0 commit comments