diff options
Diffstat (limited to 'Modules/_cursesmodule.c')
-rw-r--r-- | Modules/_cursesmodule.c | 91 |
1 files changed, 76 insertions, 15 deletions
diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c index 7f297df..0a6d2c9 100644 --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -44,12 +44,11 @@ unsupported functions: mcprint mvaddchnstr mvaddchstr mvchgat mvcur mvinchnstr mvinchstr mvinnstr mmvwaddchnstr mvwaddchstr mvwchgat mvwgetnstr mvwinchnstr mvwinchstr mvwinnstr napms newterm - overlay overwrite resetty resizeterm restartterm ripoffline - savetty scr_dump scr_init scr_restore scr_set scrl set_curterm - set_term setterm setupterm tgetent tgetflag tgetnum tgetstr - tgoto timeout tputs typeahead use_default_colors vidattr - vidputs waddchnstr waddchstr wchgat wcolor_set winchnstr - winchstr winnstr wmouse_trafo wredrawln wscrl wtimeout + overlay overwrite resizeterm restartterm ripoffline scr_dump + scr_init scr_restore scr_set scrl set_curterm set_term setterm + tgetent tgetflag tgetnum tgetstr tgoto timeout tputs + use_default_colors vidattr vidputs waddchnstr waddchstr wchgat + wcolor_set winchnstr winchstr winnstr wmouse_trafo wscrl Low-priority: slk_attr slk_attr_off slk_attr_on slk_attr_set slk_attroff @@ -77,11 +76,12 @@ char *PyCursesVersion = "1.6"; #include <curses.h> #endif +/* These prototypes are in <term.h>, but including this header + #defines many common symbols (such as "lines") which breaks the + curses module in other ways. So the code will just specify + explicit prototypes here. */ +extern int setupterm(char *,int,int *); #ifdef sgi -/* This prototype is in <term.h>, but including this header #defines - many common symbols (such as "lines") which breaks the curses - module in other ways. So the code will just specify an explicit - prototype here. */ extern char *tigetstr(char *); #endif @@ -98,6 +98,9 @@ static PyObject *PyCursesError; static char *catchall_ERR = "curses function returned ERR"; static char *catchall_NULL = "curses function returned NULL"; +/* Tells whether setupterm() has been called to initialise terminfo. */ +static int initialised_setupterm = FALSE; + /* Tells whether initscr() has been called to initialise curses. */ static int initialised = FALSE; @@ -108,6 +111,12 @@ static int initialisedcolors = FALSE; #define ARG_COUNT(X) \ (((X) == NULL) ? 0 : (PyTuple_Check(X) ? PyTuple_Size(X) : 1)) +#define PyCursesSetupTermCalled \ + if (initialised_setupterm != TRUE) { \ + PyErr_SetString(PyCursesError, \ + "must call (at least) setupterm() first"); \ + return NULL; } + #define PyCursesInitialised \ if (initialised != TRUE) { \ PyErr_SetString(PyCursesError, \ @@ -1702,7 +1711,7 @@ PyCurses_InitScr(PyObject *self, PyObject *args) return NULL; } - initialised = TRUE; + initialised = initialised_setupterm = TRUE; /* This was moved from initcurses() because it core dumped on SGI, where they're not defined until you've called initscr() */ @@ -1780,6 +1789,57 @@ PyCurses_InitScr(PyObject *self, PyObject *args) return (PyObject *)PyCursesWindow_New(win); } +static PyObject * +PyCurses_setupterm(PyObject* self, PyObject *args, PyObject* keywds) +{ + int fd = -1; + int err; + char* termstr = NULL; + + static char *kwlist[] = {"term", "fd", NULL}; + + if (!PyArg_ParseTupleAndKeywords( + args,keywds,"|zi:setupterm",kwlist,&termstr,&fd)) { + return NULL; + } + + if (fd == -1) { + PyObject* sys_stdout; + + sys_stdout = PySys_GetObject("stdout"); + + if (sys_stdout == NULL) { + PyErr_SetString( + PyCursesError, + "lost sys.stdout"); + return NULL; + } + + fd = PyObject_AsFileDescriptor(sys_stdout); + + if (fd == -1) { + return NULL; + } + } + + if (setupterm(termstr,fd,&err) == ERR) { + char* s = "setupterm: unknown error"; + + if (err == 0) { + s = "setupterm: could not find terminal"; + } else if (err == -1) { + s = "setupterm: could not find terminfo database"; + } + + PyErr_SetString(PyCursesError,s); + return NULL; + } + + initialised_setupterm = TRUE; + + Py_INCREF(Py_None); + return Py_None; +} static PyObject * PyCurses_IntrFlush(PyObject *self, PyObject *args) @@ -2057,7 +2117,7 @@ PyCurses_tigetflag(PyObject *self, PyObject *args) { char *capname; - PyCursesInitialised; + PyCursesSetupTermCalled; if (!PyArg_ParseTuple(args, "z", &capname)) return NULL; @@ -2070,7 +2130,7 @@ PyCurses_tigetnum(PyObject *self, PyObject *args) { char *capname; - PyCursesInitialised; + PyCursesSetupTermCalled; if (!PyArg_ParseTuple(args, "z", &capname)) return NULL; @@ -2083,7 +2143,7 @@ PyCurses_tigetstr(PyObject *self, PyObject *args) { char *capname; - PyCursesInitialised; + PyCursesSetupTermCalled; if (!PyArg_ParseTuple(args, "z", &capname)) return NULL; @@ -2103,7 +2163,7 @@ PyCurses_tparm(PyObject *self, PyObject *args) char* result = NULL; int i1,i2,i3,i4,i5,i6,i7,i8,i9; - PyCursesInitialised; + PyCursesSetupTermCalled; if (!PyArg_ParseTuple(args, "s|iiiiiiiii:tparm", &fmt, &i1, &i2, &i3, &i4, @@ -2290,6 +2350,7 @@ static PyMethodDef PyCurses_methods[] = { {"resetty", (PyCFunction)PyCurses_resetty}, {"savetty", (PyCFunction)PyCurses_savetty}, {"setsyx", (PyCFunction)PyCurses_setsyx}, + {"setupterm", (PyCFunction)PyCurses_setupterm, METH_VARARGS|METH_KEYWORDS}, {"start_color", (PyCFunction)PyCurses_Start_Color}, {"termattrs", (PyCFunction)PyCurses_termattrs}, {"termname", (PyCFunction)PyCurses_termname}, |