Patch #102412 from mwh: Add support for the setupterm() function, to

initialize the terminal without necessarily calling initscr()
This commit is contained in:
Andrew M. Kuchling 2000-11-18 17:45:59 +00:00
parent 17383b9ad7
commit 26cc66fe6a
1 changed files with 76 additions and 15 deletions

View File

@ -44,12 +44,11 @@ unsupported functions:
mcprint mvaddchnstr mvaddchstr mvchgat mvcur mvinchnstr mcprint mvaddchnstr mvaddchstr mvchgat mvcur mvinchnstr
mvinchstr mvinnstr mmvwaddchnstr mvwaddchstr mvwchgat mvinchstr mvinnstr mmvwaddchnstr mvwaddchstr mvwchgat
mvwgetnstr mvwinchnstr mvwinchstr mvwinnstr napms newterm mvwgetnstr mvwinchnstr mvwinchstr mvwinnstr napms newterm
overlay overwrite resetty resizeterm restartterm ripoffline overlay overwrite resizeterm restartterm ripoffline scr_dump
savetty scr_dump scr_init scr_restore scr_set scrl set_curterm scr_init scr_restore scr_set scrl set_curterm set_term setterm
set_term setterm setupterm tgetent tgetflag tgetnum tgetstr tgetent tgetflag tgetnum tgetstr tgoto timeout tputs
tgoto timeout tputs typeahead use_default_colors vidattr use_default_colors vidattr vidputs waddchnstr waddchstr wchgat
vidputs waddchnstr waddchstr wchgat wcolor_set winchnstr wcolor_set winchnstr winchstr winnstr wmouse_trafo wscrl
winchstr winnstr wmouse_trafo wredrawln wscrl wtimeout
Low-priority: Low-priority:
slk_attr slk_attr_off slk_attr_on slk_attr_set slk_attroff slk_attr slk_attr_off slk_attr_on slk_attr_set slk_attroff
@ -77,11 +76,12 @@ char *PyCursesVersion = "1.6";
#include <curses.h> #include <curses.h>
#endif #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 #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 *); extern char *tigetstr(char *);
#endif #endif
@ -98,6 +98,9 @@ static PyObject *PyCursesError;
static char *catchall_ERR = "curses function returned ERR"; static char *catchall_ERR = "curses function returned ERR";
static char *catchall_NULL = "curses function returned NULL"; 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. */ /* Tells whether initscr() has been called to initialise curses. */
static int initialised = FALSE; static int initialised = FALSE;
@ -108,6 +111,12 @@ static int initialisedcolors = FALSE;
#define ARG_COUNT(X) \ #define ARG_COUNT(X) \
(((X) == NULL) ? 0 : (PyTuple_Check(X) ? PyTuple_Size(X) : 1)) (((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 \ #define PyCursesInitialised \
if (initialised != TRUE) { \ if (initialised != TRUE) { \
PyErr_SetString(PyCursesError, \ PyErr_SetString(PyCursesError, \
@ -1702,7 +1711,7 @@ PyCurses_InitScr(PyObject *self, PyObject *args)
return NULL; return NULL;
} }
initialised = TRUE; initialised = initialised_setupterm = TRUE;
/* This was moved from initcurses() because it core dumped on SGI, /* This was moved from initcurses() because it core dumped on SGI,
where they're not defined until you've called initscr() */ 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); 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 * static PyObject *
PyCurses_IntrFlush(PyObject *self, PyObject *args) PyCurses_IntrFlush(PyObject *self, PyObject *args)
@ -2057,7 +2117,7 @@ PyCurses_tigetflag(PyObject *self, PyObject *args)
{ {
char *capname; char *capname;
PyCursesInitialised; PyCursesSetupTermCalled;
if (!PyArg_ParseTuple(args, "z", &capname)) if (!PyArg_ParseTuple(args, "z", &capname))
return NULL; return NULL;
@ -2070,7 +2130,7 @@ PyCurses_tigetnum(PyObject *self, PyObject *args)
{ {
char *capname; char *capname;
PyCursesInitialised; PyCursesSetupTermCalled;
if (!PyArg_ParseTuple(args, "z", &capname)) if (!PyArg_ParseTuple(args, "z", &capname))
return NULL; return NULL;
@ -2083,7 +2143,7 @@ PyCurses_tigetstr(PyObject *self, PyObject *args)
{ {
char *capname; char *capname;
PyCursesInitialised; PyCursesSetupTermCalled;
if (!PyArg_ParseTuple(args, "z", &capname)) if (!PyArg_ParseTuple(args, "z", &capname))
return NULL; return NULL;
@ -2103,7 +2163,7 @@ PyCurses_tparm(PyObject *self, PyObject *args)
char* result = NULL; char* result = NULL;
int i1,i2,i3,i4,i5,i6,i7,i8,i9; int i1,i2,i3,i4,i5,i6,i7,i8,i9;
PyCursesInitialised; PyCursesSetupTermCalled;
if (!PyArg_ParseTuple(args, "s|iiiiiiiii:tparm", if (!PyArg_ParseTuple(args, "s|iiiiiiiii:tparm",
&fmt, &i1, &i2, &i3, &i4, &fmt, &i1, &i2, &i3, &i4,
@ -2290,6 +2350,7 @@ static PyMethodDef PyCurses_methods[] = {
{"resetty", (PyCFunction)PyCurses_resetty}, {"resetty", (PyCFunction)PyCurses_resetty},
{"savetty", (PyCFunction)PyCurses_savetty}, {"savetty", (PyCFunction)PyCurses_savetty},
{"setsyx", (PyCFunction)PyCurses_setsyx}, {"setsyx", (PyCFunction)PyCurses_setsyx},
{"setupterm", (PyCFunction)PyCurses_setupterm, METH_VARARGS|METH_KEYWORDS},
{"start_color", (PyCFunction)PyCurses_Start_Color}, {"start_color", (PyCFunction)PyCurses_Start_Color},
{"termattrs", (PyCFunction)PyCurses_termattrs}, {"termattrs", (PyCFunction)PyCurses_termattrs},
{"termname", (PyCFunction)PyCurses_termname}, {"termname", (PyCFunction)PyCurses_termname},