@@ -16,8 +16,38 @@ static char *PyCursesVersion = "2.1";
16
16
17
17
#include <panel.h>
18
18
19
- static PyObject * PyCursesError ;
19
+ typedef struct {
20
+ PyObject * PyCursesError ;
21
+ } _curses_panelstate ;
22
+
23
+ #define _curses_panelstate (o ) ((_curses_panelstate *)PyModule_GetState(o))
24
+
25
+ /*static PyObject *PyCursesError;*/
26
+
27
+ static int
28
+ _curses_panel_clear (PyObject * m )
29
+ {
30
+ Py_CLEAR (_curses_panelstate (m )-> PyCursesError );
31
+ return 0 ;
32
+ }
33
+
34
+ static int
35
+ _curses_panel_traverse (PyObject * m , visitproc visit , void * arg )
36
+ {
37
+ Py_VISIT (_curses_panelstate (m )-> PyCursesError );
38
+ return 0 ;
39
+ }
40
+
41
+ static void
42
+ _curses_panel_free (void * m )
43
+ {
44
+ _curses_panel_clear ((PyObject * ) m );
45
+ }
46
+
47
+ static struct PyModuleDef _curses_panelmodule ;
20
48
49
+ #define _curses_panelstate_global \
50
+ ((_curses_panelstate *) PyModule_GetState(PyState_FindModule(&_curses_panelmodule)))
21
51
22
52
/* Utility Functions */
23
53
@@ -34,9 +64,9 @@ PyCursesCheckERR(int code, char *fname)
34
64
return Py_None ;
35
65
} else {
36
66
if (fname == NULL ) {
37
- PyErr_SetString (PyCursesError , catchall_ERR );
67
+ PyErr_SetString (_curses_panelstate_global -> PyCursesError , catchall_ERR );
38
68
} else {
39
- PyErr_Format (PyCursesError , "%s() returned ERR" , fname );
69
+ PyErr_Format (_curses_panelstate_global -> PyCursesError , "%s() returned ERR" , fname );
40
70
}
41
71
return NULL ;
42
72
}
@@ -280,7 +310,7 @@ PyCursesPanel_replace_panel(PyCursesPanelObject *self, PyObject *args)
280
310
281
311
rtn = replace_panel (self -> pan , temp -> win );
282
312
if (rtn == ERR ) {
283
- PyErr_SetString (PyCursesError , "replace_panel() returned ERR" );
313
+ PyErr_SetString (_curses_panelstate_global -> PyCursesError , "replace_panel() returned ERR" );
284
314
return NULL ;
285
315
}
286
316
Py_DECREF (po -> wo );
@@ -305,7 +335,7 @@ PyCursesPanel_userptr(PyCursesPanelObject *self)
305
335
PyCursesInitialised ;
306
336
obj = (PyObject * ) panel_userptr (self -> pan );
307
337
if (obj == NULL ) {
308
- PyErr_SetString (PyCursesError , "no userptr set" );
338
+ PyErr_SetString (_curses_panelstate_global -> PyCursesError , "no userptr set" );
309
339
return NULL ;
310
340
}
311
341
@@ -405,7 +435,7 @@ PyCurses_new_panel(PyObject *self, PyObject *args)
405
435
return NULL ;
406
436
pan = new_panel (win -> win );
407
437
if (pan == NULL ) {
408
- PyErr_SetString (PyCursesError , catchall_NULL );
438
+ PyErr_SetString (_curses_panelstate_global -> PyCursesError , catchall_NULL );
409
439
return NULL ;
410
440
}
411
441
return (PyObject * )PyCursesPanel_New (pan , win );
@@ -467,12 +497,12 @@ static struct PyModuleDef _curses_panelmodule = {
467
497
PyModuleDef_HEAD_INIT ,
468
498
"_curses_panel" ,
469
499
NULL ,
470
- -1 ,
500
+ sizeof ( _curses_panelstate ) ,
471
501
PyCurses_methods ,
472
502
NULL ,
473
- NULL ,
474
- NULL ,
475
- NULL
503
+ _curses_panel_traverse ,
504
+ _curses_panel_clear ,
505
+ _curses_panel_free
476
506
};
477
507
478
508
PyMODINIT_FUNC
@@ -493,8 +523,8 @@ PyInit__curses_panel(void)
493
523
d = PyModule_GetDict (m );
494
524
495
525
/* For exception _curses_panel.error */
496
- PyCursesError = PyErr_NewException ("_curses_panel.error" , NULL , NULL );
497
- PyDict_SetItemString (d , "error" , PyCursesError );
526
+ _curses_panelstate ( m ) -> PyCursesError = PyErr_NewException ("_curses_panel.error" , NULL , NULL );
527
+ PyDict_SetItemString (d , "error" , _curses_panelstate ( m ) -> PyCursesError );
498
528
499
529
/* Make the version available */
500
530
v = PyUnicode_FromString (PyCursesVersion );
0 commit comments