diff options
Diffstat (limited to 'Modules/_cursesmodule.c')
-rw-r--r-- | Modules/_cursesmodule.c | 1298 |
1 files changed, 1298 insertions, 0 deletions
diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c new file mode 100644 index 0000000..0fdf710 --- /dev/null +++ b/Modules/_cursesmodule.c @@ -0,0 +1,1298 @@ +/*********************************************************** +Copyright 1994 by Lance Ellinghouse, +Cathedral City, California Republic, United States of America. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Lance Ellinghouse +not be used in advertising or publicity pertaining to distribution +of the software without specific, written prior permission. + +LANCE ELLINGHOUSE DISCLAIMS ALL WARRANTIES WITH REGARD TO +THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS, IN NO EVENT SHALL LANCE ELLINGHOUSE BE LIABLE FOR ANY SPECIAL, +INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING +FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION +WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +******************************************************************/ + +/* curses module */ + +#include "allobjects.h" +#include "fileobject.h" +#include "modsupport.h" + +#include <curses.h> + +#include "rename1.h" + +typedef struct { + PyObject_HEAD + SCREEN *scr; +} PyCursesScreenObject; + +typedef struct { + PyObject_HEAD + WINDOW *win; + WINDOW *parent; +} PyCursesWindowObject; + +typedef struct { + PyObject_HEAD + WINDOW *pad; +} PyCursesPadObject; + +staticforward PyTypeObject PyCursesScreen_Type; +staticforward PyTypeObject PyCursesWindow_Type; +staticforward PyTypeObject PyCursesPad_Type; + +#define PyCursesScreen_Check(v) ((v)->ob_type == &PyCursesScreen_Type) +#define PyCursesWindow_Check(v) ((v)->ob_type == &PyCursesWindow_Type) +#define PyCursesPad_Check(v) ((v)->ob_type == &PyCursesPad_Type) + +/* Defines */ +PyObject *PyCurses_OK; +PyObject *PyCurses_ERR; + +/* ------------- SCREEN routines --------------- */ +#ifdef NOT_YET +static PyObject * +PyCursesScreen_New(arg) + PyObject * arg; +{ + char *term_type; + PyFileObject *in_fo; + PyFileObject *out_fo; + PyCursesScreenObject *xp; + xp = (PyObject *)PyObject_NEW(PyCursesScreenObject, &PyCursesScreen_Type); + if (xp == NULL) + return NULL; + return (PyObject *)xp; +} +#endif +/* ------------- WINDOW routines --------------- */ +static PyObject * +PyCursesWindow_New(win) + WINDOW *win; +{ + PyCursesWindowObject *wo; + wo = (PyCursesWindowObject *)PyObject_NEW(PyCursesWindowObject, &PyCursesWindow_Type); + if (wo == NULL) + return NULL; + wo->win = win; + wo->parent = (WINDOW *)NULL; + return (PyObject *)wo; +} + +static void +PyCursesWindow_Dealloc(wo) + PyCursesWindowObject *wo; +{ + if (wo->win != stdscr) + delwin(wo->win); + PyMem_DEL(wo); +} + +static PyObject * +PyCursesWindow_Refresh(self,arg) + PyCursesWindowObject *self; + PyObject * arg; +{ + if (!PyArg_NoArgs(arg)) + return (PyObject *)NULL; + return (PyObject *)PyInt_FromLong(wrefresh(self->win)); +} + +static PyObject * +PyCursesWindow_NoOutRefresh(self,arg) + PyCursesWindowObject *self; + PyObject * arg; +{ + if (!PyArg_NoArgs(arg)) + return (PyObject *)NULL; + return (PyObject *)PyInt_FromLong(wnoutrefresh(self->win)); +} + +static PyObject * +PyCursesWindow_MoveWin(self,arg) + PyCursesWindowObject *self; + PyObject * arg; +{ + int rtn; + int x, y; + if (!PyArg_Parse(arg,"(ii)", &y, &x)) + return (PyObject *)NULL; + rtn = mvwin(self->win,y,x); + if (rtn == OK) { + Py_INCREF(PyCurses_OK); + return (PyObject *)PyCurses_OK; + } + Py_INCREF(PyCurses_ERR); + return (PyObject *)PyCurses_ERR; +} + +static PyObject * +PyCursesWindow_Move(self,arg) + PyCursesWindowObject *self; + PyObject * arg; +{ + int rtn; + int x, y; + if (!PyArg_Parse(arg,"(ii)", &y, &x)) + return (PyObject *)NULL; + rtn = wmove(self->win,y,x); + if (rtn == OK) { + Py_INCREF(PyCurses_OK); + return (PyObject *)PyCurses_OK; + } + Py_INCREF(PyCurses_ERR); + return (PyObject *)PyCurses_ERR; +} + +static PyObject * +PyCursesWindow_SubWin(self,arg) + PyCursesWindowObject *self; + PyObject * arg; +{ + WINDOW *win; + PyCursesWindowObject *rtn_win; + int nlines, ncols, begin_y, begin_x; + nlines = 0; + ncols = 0; + if (!PyArg_Parse(arg, + "(iiii);nlines,ncols,begin_y,begin_x", + &nlines,&ncols,&begin_y,&begin_x)) + if (!PyArg_Parse(arg,"(ii)",&begin_y,&begin_x)) + return (PyObject *)NULL; + win = subwin(self->win,nlines,ncols,begin_y,begin_x); + if (win == NULL) { + Py_INCREF(Py_None); + return (PyObject *)Py_None; + } + rtn_win = (PyCursesWindowObject *)PyCursesWindow_New(win); + rtn_win->parent = self->win; + return (PyObject *)rtn_win; +} + +static PyObject * +PyCursesWindow_AddCh(self,arg) + PyCursesWindowObject *self; + PyObject * arg; +{ + int rtn; + int x, y; + int ch; + int attr; + int attr_old; + int use_xy = TRUE; + int use_attr = TRUE; + switch (PyTuple_Size(arg)) { + case 2: + case 4: + use_attr = TRUE; + break; + default: + use_attr = FALSE; + } + if (!PyArg_Parse(arg,"(iiii);y,x,ch,attr", &y, &x, &ch, &attr)) { + if (!PyArg_Parse(arg,"(iii);y,x,ch", &y, &x, &ch)) { + use_xy = FALSE; + if (!PyArg_Parse(arg,"(ii);ch,attr", &ch, &attr)) + if (!PyArg_Parse(arg,"i;ch", &ch)) + return (PyObject *)NULL; + } + } + if (use_attr == TRUE) { + attr_old = getattrs(self->win); + wattrset(self->win,attr); + } + if (use_xy == TRUE) + rtn = mvwaddch(self->win,y,x,ch); + else + rtn = waddch(self->win,ch); + if (use_attr == TRUE) + wattrset(self->win,attr_old); + if (rtn == OK) { + Py_INCREF(PyCurses_OK); + return (PyObject *)PyCurses_OK; + } + Py_INCREF(PyCurses_ERR); + return (PyObject *)PyCurses_ERR; +} + +static PyObject * +PyCursesWindow_InsCh(self,arg) + PyCursesWindowObject *self; + PyObject * arg; +{ + int rtn; + int x, y; + int ch; + int use_xy = TRUE; + int attr, attr_old, use_attr = FALSE; + switch (PyTuple_Size(arg)) { + case 2: + case 4: + use_attr = TRUE; + break; + default: + use_attr = FALSE; + } + if (!PyArg_Parse(arg,"(iiii);y,x,ch,attr", &y, &x, &ch, &attr)) { + if (!PyArg_Parse(arg,"(iii);y,x,ch", &y, &x, &ch)) { + use_xy = FALSE; + if (!PyArg_Parse(arg,"(ii);ch,attr", &ch, &attr)) + if (!PyArg_Parse(arg,"i;ch", &ch)) + return (PyObject *)NULL; + } + } + if (use_attr == TRUE) { + attr_old = getattrs(self->win); + wattrset(self->win,attr); + } + if (use_xy == TRUE) + rtn = mvwinsch(self->win,y,x,ch); + else + rtn = winsch(self->win,ch); + if (use_attr == TRUE) + wattrset(self->win,attr_old); + if (rtn == OK) { + Py_INCREF(PyCurses_OK); + return (PyObject *)PyCurses_OK; + } + Py_INCREF(PyCurses_ERR); + return (PyObject *)PyCurses_ERR; +} + +static PyObject * +PyCursesWindow_DelCh(self,arg) + PyCursesWindowObject *self; + PyObject * arg; +{ + int rtn; + int x, y; + int use_xy = TRUE; + if (!PyArg_Parse(arg,"(ii);y,x", &y, &x)) + use_xy = FALSE; + if (use_xy == TRUE) + rtn = mvwdelch(self->win,y,x); + else + rtn = wdelch(self->win); + if (rtn == OK) { + Py_INCREF(PyCurses_OK); + return (PyObject *)PyCurses_OK; + } + Py_INCREF(PyCurses_ERR); + return (PyObject *)PyCurses_ERR; +} + +static PyObject * +PyCursesWindow_EchoChar(self,arg) + PyCursesWindowObject *self; + PyObject * arg; +{ + int rtn; + int ch; + int attr, attr_old, use_attr = TRUE; + if (!PyArg_Parse(arg,"(ii);ch,attr", &ch, &attr)) { + use_attr = FALSE; + if (!PyArg_Parse(arg,"i;ch", &ch)) + return (PyObject *)NULL; + } + if (use_attr == TRUE) { + attr_old = getattrs(self->win); + wattrset(self->win,attr); + } + rtn = wechochar(self->win,ch); + if (use_attr == TRUE) + wattrset(self->win,attr_old); + if (rtn == OK) { + Py_INCREF(PyCurses_OK); + return (PyObject *)PyCurses_OK; + } + Py_INCREF(PyCurses_ERR); + return (PyObject *)PyCurses_ERR; +} + +static PyObject * +PyCursesWindow_AddStr(self,arg) + PyCursesWindowObject *self; + PyObject * arg; +{ + int rtn; + int x, y; + char *str; + int use_xy = TRUE; + int attr, attr_old, use_attr = TRUE; + switch (PyTuple_Size(arg)) { + case 2: + case 4: + use_attr = TRUE; + break; + default: + use_attr = FALSE; + } + if (!PyArg_Parse(arg,"(iisi);y,x,str,attr", &y, &x, &str, &attr)) { + if (!PyArg_Parse(arg,"(iis);y,x,str", &y, &x, &str)) { + use_xy = FALSE; + if (!PyArg_Parse(arg,"(si);str,attr", &str, &attr)) + if (!PyArg_Parse(arg,"s;str", &str)) + return (PyObject *)NULL; + } + } + if (use_attr == TRUE) { + attr_old = getattrs(self->win); + wattrset(self->win,attr); + } + if (use_xy == TRUE) + rtn = mvwaddstr(self->win,y,x,str); + else + rtn = waddstr(self->win,str); + if (use_attr == TRUE) + wattrset(self->win,attr_old); + if (rtn == OK) { + Py_INCREF(PyCurses_OK); + return (PyObject *)PyCurses_OK; + } + Py_INCREF(PyCurses_ERR); + return (PyObject *)PyCurses_ERR; +} + +static PyObject * +PyCursesWindow_AttrOn(self,arg) + PyCursesWindowObject *self; + PyObject * arg; +{ + int rtn; + int ch; + if (!PyArg_Parse(arg,"i;attr", &ch)) + return (PyObject *)NULL; + rtn = wattron(self->win,ch); + if (rtn == OK) { + Py_INCREF(PyCurses_OK); + return (PyObject *)PyCurses_OK; + } + Py_INCREF(PyCurses_ERR); + return (PyObject *)PyCurses_ERR; +} + +static PyObject * +PyCursesWindow_AttrOff(self,arg) + PyCursesWindowObject *self; + PyObject * arg; +{ + int rtn; + int ch; + if (!PyArg_Parse(arg,"i;attr", &ch)) + return (PyObject *)NULL; + rtn = wattroff(self->win,ch); + if (rtn == OK) { + Py_INCREF(PyCurses_OK); + return (PyObject *)PyCurses_OK; + } + Py_INCREF(PyCurses_ERR); + return (PyObject *)PyCurses_ERR; +} + +static PyObject * +PyCursesWindow_AttrSet(self,arg) + PyCursesWindowObject *self; + PyObject * arg; +{ + int rtn; + int ch; + if (!PyArg_Parse(arg,"i;attr", &ch)) + return (PyObject *)NULL; + rtn = wattrset(self->win,ch); + if (rtn == OK) { + Py_INCREF(PyCurses_OK); + return (PyObject *)PyCurses_OK; + } + Py_INCREF(PyCurses_ERR); + return (PyObject *)PyCurses_ERR; +} + +static PyObject * +PyCursesWindow_StandEnd(self,arg) + PyCursesWindowObject *self; + PyObject * arg; +{ + int rtn; + if (!PyArg_NoArgs(arg)) + return (PyObject *)NULL; + rtn = wstandend(self->win); + if (rtn == OK) { + Py_INCREF(PyCurses_OK); + return (PyObject *)PyCurses_OK; + } + Py_INCREF(PyCurses_ERR); + return (PyObject *)PyCurses_ERR; +} + +static PyObject * +PyCursesWindow_StandOut(self,arg) + PyCursesWindowObject *self; + PyObject * arg; +{ + int rtn; + if (!PyArg_NoArgs(arg)) + return (PyObject *)NULL; + rtn = wstandout(self->win); + if (rtn == OK) { + Py_INCREF(PyCurses_OK); + return (PyObject *)PyCurses_OK; + } + Py_INCREF(PyCurses_ERR); + return (PyObject *)PyCurses_ERR; +} + +static PyObject * +PyCursesWindow_Box(self,arg) + PyCursesWindowObject *self; + PyObject * arg; +{ + int rtn; + int ch1=0,ch2=0; + if (!PyArg_Parse(arg,"(ii);vertch,horch", &ch1, &ch2)) + PyErr_Clear(); + rtn = box(self->win,ch1,ch2); + if (rtn == OK) { + Py_INCREF(PyCurses_OK); + return (PyObject *)PyCurses_OK; + } + Py_INCREF(PyCurses_ERR); + return (PyObject *)PyCurses_ERR; +} + +static PyObject * +PyCursesWindow_Erase(self,arg) + PyCursesWindowObject *self; + PyObject * arg; +{ + if (!PyArg_NoArgs(arg)) + return (PyObject *)NULL; + werase(self->win); + Py_INCREF(Py_None); + return (PyObject *)Py_None; +} + +static PyObject * +PyCursesWindow_DeleteLine(self,arg) + PyCursesWindowObject *self; + PyObject * arg; +{ + if (!PyArg_NoArgs(arg)) + return (PyObject *)NULL; + wdeleteln(self->win); + Py_INCREF(Py_None); + return (PyObject *)Py_None; +} + +static PyObject * +PyCursesWindow_InsertLine(self,arg) + PyCursesWindowObject *self; + PyObject * arg; +{ + if (!PyArg_NoArgs(arg)) + return (PyObject *)NULL; + winsertln(self->win); + Py_INCREF(Py_None); + return (PyObject *)Py_None; +} + +static PyObject * +PyCursesWindow_GetYX(self,arg) + PyCursesWindowObject *self; + PyObject * arg; +{ + int x, y; + if (!PyArg_NoArgs(arg)) + return (PyObject *)NULL; + getyx(self->win,y,x); + return (PyObject *)Py_BuildValue("(ii)", y, x); +} + +static PyObject * +PyCursesWindow_GetBegYX(self,arg) + PyCursesWindowObject *self; + PyObject * arg; +{ + int x, y; + if (!PyArg_NoArgs(arg)) + return (PyObject *)NULL; + getbegyx(self->win,y,x); + return (PyObject *)Py_BuildValue("(ii)", y, x); +} + +static PyObject * +PyCursesWindow_GetMaxYX(self,arg) + PyCursesWindowObject *self; + PyObject * arg; +{ + int x, y; + if (!PyArg_NoArgs(arg)) + return (PyObject *)NULL; + getmaxyx(self->win,y,x); + return (PyObject *)Py_BuildValue("(ii)", y, x); +} + +static PyObject * +PyCursesWindow_Clear(self,arg) + PyCursesWindowObject *self; + PyObject * arg; +{ + if (!PyArg_NoArgs(arg)) + return (PyObject *)NULL; + wclear(self->win); + Py_INCREF(Py_None); + return (PyObject *)Py_None; +} + +static PyObject * +PyCursesWindow_ClearToBottom(self,arg) + PyCursesWindowObject *self; + PyObject * arg; +{ + if (!PyArg_NoArgs(arg)) + return (PyObject *)NULL; + wclrtobot(self->win); + Py_INCREF(Py_None); + return (PyObject *)Py_None; +} + +static PyObject * +PyCursesWindow_ClearToEOL(self,arg) + PyCursesWindowObject *self; + PyObject * arg; +{ + if (!PyArg_NoArgs(arg)) + return (PyObject *)NULL; + wclrtoeol(self->win); + Py_INCREF(Py_None); + return (PyObject *)Py_None; +} + +static PyObject * +PyCursesWindow_Scroll(self,arg) + PyCursesWindowObject *self; + PyObject * arg; +{ + if (!PyArg_NoArgs(arg)) + return (PyObject *)NULL; + scroll(self->win); + Py_INCREF(Py_None); + return (PyObject *)Py_None; +} + +static PyObject * +PyCursesWindow_TouchWin(self,arg) + PyCursesWindowObject *self; + PyObject * arg; +{ + if (!PyArg_NoArgs(arg)) + return (PyObject *)NULL; + touchwin(self->win); + Py_INCREF(Py_None); + return (PyObject *)Py_None; +} + +static PyObject * +PyCursesWindow_TouchLine(self,arg) + PyCursesWindowObject *self; + PyObject * arg; +{ + int st, cnt; + if (!PyArg_Parse(arg,"(ii);start, count",&st,&cnt)) + return (PyObject *)NULL; + touchline(self->win,st,cnt); + Py_INCREF(Py_None); + return (PyObject *)Py_None; +} + +static PyObject * +PyCursesWindow_GetCh(self,arg) + PyCursesWindowObject *self; + PyObject * arg; +{ + int x, y; + int use_xy = TRUE; + int rtn; + if (!PyArg_Parse(arg,"(ii);y,x",&y,&x)) + use_xy = FALSE; + if (use_xy == TRUE) + rtn = mvwgetch(self->win,y,x); + else + rtn = wgetch(self->win); + return (PyObject *)PyInt_FromLong(rtn); +} + +static PyObject * +PyCursesWindow_GetStr(self,arg) + PyCursesWindowObject *self; + PyObject * arg; +{ + int x, y; + int use_xy = TRUE; + char rtn[1024]; /* This should be big enough.. I hope */ + int rtn2; + if (!PyArg_Parse(arg,"(ii);y,x",&y,&x)) + use_xy = FALSE; + if (use_xy == TRUE) + rtn2 = mvwgetstr(self->win,y,x,rtn); + else + rtn2 = wgetstr(self->win,rtn); + if (rtn2 == ERR) + rtn[0] = 0; + return (PyObject *)PyString_FromString(rtn); +} + +static PyObject * +PyCursesWindow_InCh(self,arg) + PyCursesWindowObject *self; + PyObject * arg; +{ + int x, y; + int use_xy = TRUE; + int rtn; + if (!PyArg_Parse(arg,"(ii);y,x",&y,&x)) + use_xy = FALSE; + if (use_xy == TRUE) + rtn = mvwinch(self->win,y,x); + else + rtn = winch(self->win); + return (PyObject *)PyInt_FromLong(rtn); +} + +static PyObject * +PyCursesWindow_ClearOk(self,arg) + PyCursesWindowObject *self; + PyObject * arg; +{ + int val; + if (!PyArg_Parse(arg,"i;True(1) or False(0)",&val)) + return (PyObject *)NULL; + clearok(self->win,val); + Py_INCREF(Py_None); + return (PyObject *)Py_None; +} + +static PyObject * +PyCursesWindow_IdlOk(self,arg) + PyCursesWindowObject *self; + PyObject * arg; +{ + int val; + if (!PyArg_Parse(arg,"i;True(1) or False(0)",&val)) + return (PyObject *)NULL; + idlok(self->win,val); + Py_INCREF(Py_None); + return (PyObject *)Py_None; +} + +static PyObject * +PyCursesWindow_LeaveOk(self,arg) + PyCursesWindowObject *self; + PyObject * arg; +{ + int val; + if (!PyArg_Parse(arg,"i;True(1) or False(0)",&val)) + return (PyObject *)NULL; + leaveok(self->win,val); + Py_INCREF(Py_None); + return (PyObject *)Py_None; +} + +static PyObject * +PyCursesWindow_ScrollOk(self,arg) + PyCursesWindowObject *self; + PyObject * arg; +{ + int val; + if (!PyArg_Parse(arg,"i;True(1) or False(0)",&val)) + return (PyObject *)NULL; + scrollok(self->win,val); + Py_INCREF(Py_None); + return (PyObject *)Py_None; +} + +static PyObject * +PyCursesWindow_SetScrollRegion(self,arg) + PyCursesWindowObject *self; + PyObject * arg; +{ + int x, y; + if (!PyArg_Parse(arg,"(ii);top, bottom",&y,&x)) + return (PyObject *)NULL; + wsetscrreg(self->win,y,x); + Py_INCREF(Py_None); + return (PyObject *)Py_None; +} + +static PyObject * +PyCursesWindow_KeyPad(self,arg) + PyCursesWindowObject * self; + PyObject * arg; +{ + int ch; + if (!PyArg_Parse(arg,"i;True(1), False(0)",&ch)) + return (PyObject *)NULL; + keypad(self->win,ch); + Py_INCREF(Py_None); + return (PyObject *)Py_None; +} + +static PyObject * +PyCursesWindow_NoDelay(self,arg) + PyCursesWindowObject * self; + PyObject * arg; +{ + int ch; + if (!PyArg_Parse(arg,"i;True(1), False(0)",&ch)) + return (PyObject *)NULL; + nodelay(self->win,ch); + Py_INCREF(Py_None); + return (PyObject *)Py_None; +} + +static PyObject * +PyCursesWindow_NoTimeout(self,arg) + PyCursesWindowObject * self; + PyObject * arg; +{ + int ch; + if (!PyArg_Parse(arg,"i;True(1), False(0)",&ch)) + return (PyObject *)NULL; + notimeout(self->win,ch); + Py_INCREF(Py_None); + return (PyObject *)Py_None; +} + +static PyMethodDef PyCursesWindow_Methods[] = { + {"refresh", (PyCFunction)PyCursesWindow_Refresh}, + {"nooutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh}, + {"mvwin", (PyCFunction)PyCursesWindow_MoveWin}, + {"move", (PyCFunction)PyCursesWindow_Move}, + {"subwin", (PyCFunction)PyCursesWindow_SubWin}, + {"addch", (PyCFunction)PyCursesWindow_AddCh}, + {"insch", (PyCFunction)PyCursesWindow_InsCh}, + {"delch", (PyCFunction)PyCursesWindow_DelCh}, + {"echochar", (PyCFunction)PyCursesWindow_EchoChar}, + {"addstr", (PyCFunction)PyCursesWindow_AddStr}, + {"attron", (PyCFunction)PyCursesWindow_AttrOn}, + {"attroff", (PyCFunction)PyCursesWindow_AttrOff}, + {"attrset", (PyCFunction)PyCursesWindow_AttrSet}, + {"standend", (PyCFunction)PyCursesWindow_StandEnd}, + {"standout", (PyCFunction)PyCursesWindow_StandOut}, + {"box", (PyCFunction)PyCursesWindow_Box}, + {"erase", (PyCFunction)PyCursesWindow_Erase}, + {"deleteln", (PyCFunction)PyCursesWindow_DeleteLine}, + {"insertln", (PyCFunction)PyCursesWindow_InsertLine}, + {"getyx", (PyCFunction)PyCursesWindow_GetYX}, + {"getbegyx", (PyCFunction)PyCursesWindow_GetBegYX}, + {"getmaxyx", (PyCFunction)PyCursesWindow_GetMaxYX}, + {"clear", (PyCFunction)PyCursesWindow_Clear}, + {"clrtobot", (PyCFunction)PyCursesWindow_ClearToBottom}, + {"clrtoeol", (PyCFunction)PyCursesWindow_ClearToEOL}, + {"scroll", (PyCFunction)PyCursesWindow_Scroll}, + {"touchwin", (PyCFunction)PyCursesWindow_TouchWin}, + {"touchline", (PyCFunction)PyCursesWindow_TouchLine}, + {"getch", (PyCFunction)PyCursesWindow_GetCh}, + {"getstr", (PyCFunction)PyCursesWindow_GetStr}, + {"inch", (PyCFunction)PyCursesWindow_InCh}, + {"clearok", (PyCFunction)PyCursesWindow_ClearOk}, + {"idlok", (PyCFunction)PyCursesWindow_IdlOk}, + {"leaveok", (PyCFunction)PyCursesWindow_LeaveOk}, + {"scrollok", (PyCFunction)PyCursesWindow_ScrollOk}, + {"setscrreg", (PyCFunction)PyCursesWindow_SetScrollRegion}, + {"keypad", (PyCFunction)PyCursesWindow_KeyPad}, + {"nodelay", (PyCFunction)PyCursesWindow_NoDelay}, + {"notimeout", (PyCFunction)PyCursesWindow_NoTimeout}, + {NULL, (PyCFunction)NULL} /* sentinel */ +}; + +static PyObject * +PyCursesWindow_GetAttr(self, name) + PyCursesWindowObject *self; + char *name; +{ + return findmethod(PyCursesWindow_Methods, (PyObject *)self, name); +} + +/* --------------- PAD routines ---------------- */ +static PyObject * +PyCursesPad_New(pad) + WINDOW *pad; +{ + PyCursesPadObject *po; + po = (PyCursesPadObject *)PyObject_NEW(PyCursesPadObject, &PyCursesPad_Type); + if (po == NULL) + return NULL; + po->pad = pad; + return (PyObject *)po; +} + +/* -------------------------------------------------------*/ +static PyTypeObject PyCursesScreen_Type = { + PyObject_HEAD_INIT(&PyType_Type) + 0, /*ob_size*/ + "curses screen", /*tp_name*/ + sizeof(PyCursesScreenObject), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + /* methods */ + (destructor)0 /*PyCursesScreen_Dealloc*/, /*tp_dealloc*/ + 0, /*tp_print*/ + (getattrfunc)0, /*tp_getattr*/ + (setattrfunc)0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ +}; + +static PyTypeObject PyCursesWindow_Type = { + PyObject_HEAD_INIT(&PyType_Type) + 0, /*ob_size*/ + "curses window", /*tp_name*/ + sizeof(PyCursesWindowObject), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + /* methods */ + (destructor)PyCursesWindow_Dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + (getattrfunc)PyCursesWindow_GetAttr, /*tp_getattr*/ + (setattrfunc)0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ +}; + +static PyTypeObject PyCursesPad_Type = { + PyObject_HEAD_INIT(&PyType_Type) + 0, /*ob_size*/ + "curses pad", /*tp_name*/ + sizeof(PyCursesPadObject), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + /* methods */ + (destructor)0 /*PyCursesPad_Dealloc*/, /*tp_dealloc*/ + 0, /*tp_print*/ + (getattrfunc)0, /*tp_getattr*/ + (setattrfunc)0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ +}; + +/* -------------------------------------------------------*/ + +static PyObject * +PyCurses_InitScr(self, args) + PyObject * self; + PyObject * args; +{ + static int already_inited = FALSE; + if (!PyArg_NoArgs(args)) + return (PyObject *)NULL; + if (already_inited == TRUE) { + wrefresh(stdscr); + return (PyObject *)PyCursesWindow_New(stdscr); + } + already_inited = TRUE; + return (PyObject *)PyCursesWindow_New(initscr()); +} + +static PyObject * +PyCurses_EndWin(self, args) + PyObject * self; + PyObject * args; +{ + if (!PyArg_NoArgs(args)) + return (PyObject *)NULL; + endwin(); + Py_INCREF(Py_None); + return Py_None; +} + +static PyObject * +PyCurses_IsEndWin(self, args) + PyObject * self; + PyObject * args; +{ + if (!PyArg_NoArgs(args)) + return (PyObject *)NULL; + if (isendwin() == FALSE) { + Py_INCREF(Py_False); + return Py_False; + } + Py_INCREF(Py_True); + return Py_True; +} + +static PyObject * +PyCurses_DoUpdate(self,arg) + PyObject * self; + PyObject * arg; +{ + if (!PyArg_NoArgs(arg)) + return (PyObject *)NULL; + return (PyObject *)PyInt_FromLong(doupdate()); +} + +static PyObject * +PyCurses_NewWindow(self,arg) + PyObject * self; + PyObject * arg; +{ + WINDOW *win; + int nlines, ncols, begin_y, begin_x; + nlines = 0; + ncols = 0; + if (!PyArg_Parse(arg, + "(iiii);nlines,ncols,begin_y,begin_x", + &nlines,&ncols,&begin_y,&begin_x)) + if (!PyArg_Parse(arg,"(ii)",&begin_y,&begin_x)) + return (PyObject *)NULL; + win = newwin(nlines,ncols,begin_y,begin_x); + if (win == NULL) { + Py_INCREF(Py_None); + return (PyObject *)Py_None; + } + return (PyObject *)PyCursesWindow_New(win); +} + +static PyObject * +PyCurses_Beep(self,arg) + PyObject * self; + PyObject * arg; +{ + if (!PyArg_NoArgs(arg)) + return (PyObject *)NULL; + beep(); + Py_INCREF(Py_None); + return (PyObject *)Py_None; +} + +static PyObject * +PyCurses_Flash(self,arg) + PyObject * self; + PyObject * arg; +{ + if (!PyArg_NoArgs(arg)) + return (PyObject *)NULL; + flash(); + Py_INCREF(Py_None); + return (PyObject *)Py_None; +} + +static PyObject * +PyCurses_UngetCh(self,arg) + PyObject * self; + PyObject * arg; +{ + int ch; + if (!PyArg_Parse(arg,"i;integer",&ch)) + return (PyObject *)NULL; + ungetch(ch); + Py_INCREF(Py_None); + return (PyObject *)Py_None; +} + +static PyObject * +PyCurses_FlushInp(self,arg) + PyObject * self; + PyObject * arg; +{ + if (!PyArg_NoArgs(arg)) + return (PyObject *)NULL; + flushinp(); + Py_INCREF(Py_None); + return (PyObject *)Py_None; +} + +static PyObject * +PyCurses_CBreak(self,arg) + PyObject * self; + PyObject * arg; +{ + if (!PyArg_NoArgs(arg)) + return (PyObject *)NULL; + cbreak(); + Py_INCREF(Py_None); + return (PyObject *)Py_None; +} + +static PyObject * +PyCurses_NoCBreak(self,arg) + PyObject * self; + PyObject * arg; +{ + if (!PyArg_NoArgs(arg)) + return (PyObject *)NULL; + nocbreak(); + Py_INCREF(Py_None); + return (PyObject *)Py_None; +} + +static PyObject * +PyCurses_Echo(self,arg) + PyObject * self; + PyObject * arg; +{ + if (!PyArg_NoArgs(arg)) + return (PyObject *)NULL; + echo(); + Py_INCREF(Py_None); + return (PyObject *)Py_None; +} + +static PyObject * +PyCurses_NoEcho(self,arg) + PyObject * self; + PyObject * arg; +{ + if (!PyArg_NoArgs(arg)) + return (PyObject *)NULL; + noecho(); + Py_INCREF(Py_None); + return (PyObject *)Py_None; +} + +static PyObject * +PyCurses_Nl(self,arg) + PyObject * self; + PyObject * arg; +{ + if (!PyArg_NoArgs(arg)) + return (PyObject *)NULL; + nl(); + Py_INCREF(Py_None); + return (PyObject *)Py_None; +} + +static PyObject * +PyCurses_NoNl(self,arg) + PyObject * self; + PyObject * arg; +{ + if (!PyArg_NoArgs(arg)) + return (PyObject *)NULL; + nonl(); + Py_INCREF(Py_None); + return (PyObject *)Py_None; +} + +static PyObject * +PyCurses_Raw(self,arg) + PyObject * self; + PyObject * arg; +{ + if (!PyArg_NoArgs(arg)) + return (PyObject *)NULL; + raw(); + Py_INCREF(Py_None); + return (PyObject *)Py_None; +} + +static PyObject * +PyCurses_NoRaw(self,arg) + PyObject * self; + PyObject * arg; +{ + if (!PyArg_NoArgs(arg)) + return (PyObject *)NULL; + noraw(); + Py_INCREF(Py_None); + return (PyObject *)Py_None; +} + +static PyObject * +PyCurses_IntrFlush(self,arg) + PyObject * self; + PyObject * arg; +{ + int ch; + if (!PyArg_Parse(arg,"i;True(1), False(0)",&ch)) + return (PyObject *)NULL; + intrflush(NULL,ch); + Py_INCREF(Py_None); + return (PyObject *)Py_None; +} + +static PyObject * +PyCurses_Meta(self,arg) + PyObject * self; + PyObject * arg; +{ + int ch; + if (!PyArg_Parse(arg,"i;True(1), False(0)",&ch)) + return (PyObject *)NULL; + meta(NULL,ch); + Py_INCREF(Py_None); + return (PyObject *)Py_None; +} + +static PyObject * +PyCurses_KeyName(self,arg) + PyObject * self; + PyObject * arg; +{ + int ch; + if (!PyArg_Parse(arg,"i",&ch)) + return (PyObject *)NULL; + return PyString_FromString((char *)keyname(ch)); +} + +#ifdef NOT_YET +static PyObject * +PyCurses_NewTerm(self, args) + PyObject * self; + PyObject * args; +{ +} + +static PyObject * +PyCurses_SetTerm(self, args) + PyObject * self; + PyObject * args; +{ +} +#endif + +/* List of functions defined in the module */ + +static PyMethodDef PyCurses_methods[] = { + {"initscr", (PyCFunction)PyCurses_InitScr}, + {"endwin", (PyCFunction)PyCurses_EndWin}, + {"isendwin", (PyCFunction)PyCurses_IsEndWin}, + {"doupdate", (PyCFunction)PyCurses_DoUpdate}, + {"newwin", (PyCFunction)PyCurses_NewWindow}, + {"beep", (PyCFunction)PyCurses_Beep}, + {"flash", (PyCFunction)PyCurses_Flash}, + {"ungetch", (PyCFunction)PyCurses_UngetCh}, + {"flushinp", (PyCFunction)PyCurses_FlushInp}, + {"cbreak", (PyCFunction)PyCurses_CBreak}, + {"nocbreak", (PyCFunction)PyCurses_NoCBreak}, + {"echo", (PyCFunction)PyCurses_Echo}, + {"noecho", (PyCFunction)PyCurses_NoEcho}, + {"nl", (PyCFunction)PyCurses_Nl}, + {"nonl", (PyCFunction)PyCurses_NoNl}, + {"raw", (PyCFunction)PyCurses_Raw}, + {"noraw", (PyCFunction)PyCurses_NoRaw}, + {"intrflush", (PyCFunction)PyCurses_IntrFlush}, + {"meta", (PyCFunction)PyCurses_Meta}, + {"keyname", (PyCFunction)PyCurses_KeyName}, +#ifdef NOT_YET + {"newterm", (PyCFunction)PyCurses_NewTerm}, + {"set_term", (PyCFunction)PyCurses_SetTerm}, +#endif + {NULL, NULL} /* sentinel */ +}; + +/* Initialization function for the module */ + +void +initcurses() +{ + PyObject *m, *d, *x; + + /* Create the module and add the functions */ + m = Py_InitModule("ncurses", PyCurses_methods); + + PyCurses_OK = Py_True; + PyCurses_ERR = Py_False; + Py_INCREF(PyCurses_OK); + Py_INCREF(PyCurses_ERR); + /* Add some symbolic constants to the module */ + d = PyModule_GetDict(m); + /* Here are some defines */ + PyDict_SetItemString(d,"OK", PyCurses_OK); + PyDict_SetItemString(d,"ERR",PyCurses_ERR); + +#define SetDictChar(string,ch) \ + PyDict_SetItemString(d,string,PyInt_FromLong(ch)); + + /* Here are some graphic symbols you can use */ + SetDictChar("ACS_ULCORNER",(ACS_ULCORNER)); + SetDictChar("ACS_ULCORNER",(ACS_ULCORNER)); + SetDictChar("ACS_LLCORNER",(ACS_LLCORNER)); + SetDictChar("ACS_URCORNER",(ACS_URCORNER)); + SetDictChar("ACS_LRCORNER",(ACS_LRCORNER)); + SetDictChar("ACS_RTEE", (ACS_RTEE)); + SetDictChar("ACS_LTEE", (ACS_LTEE)); + SetDictChar("ACS_BTEE", (ACS_BTEE)); + SetDictChar("ACS_TTEE", (ACS_TTEE)); + SetDictChar("ACS_HLINE", (ACS_HLINE)); + SetDictChar("ACS_VLINE", (ACS_VLINE)); + SetDictChar("ACS_PLUS", (ACS_PLUS)); + SetDictChar("ACS_S1", (ACS_S1)); + SetDictChar("ACS_S9", (ACS_S9)); + SetDictChar("ACS_DIAMOND", (ACS_DIAMOND)); + SetDictChar("ACS_CKBOARD", (ACS_CKBOARD)); + SetDictChar("ACS_DEGREE", (ACS_DEGREE)); + SetDictChar("ACS_PLMINUS", (ACS_PLMINUS)); + SetDictChar("ACS_BULLET", (ACS_BULLET)); + SetDictChar("ACS_LARROW", (ACS_RARROW)); + SetDictChar("ACS_DARROW", (ACS_DARROW)); + SetDictChar("ACS_UARROW", (ACS_UARROW)); + SetDictChar("ACS_BOARD", (ACS_BOARD)); + SetDictChar("ACS_LANTERN", (ACS_LANTERN)); + SetDictChar("ACS_BLOCK", (ACS_BLOCK)); + + /* Here are some attributes you can add to chars to print */ + PyDict_SetItemString(d, "A_NORMAL", PyInt_FromLong(A_NORMAL)); + PyDict_SetItemString(d, "A_STANDOUT", PyInt_FromLong(A_STANDOUT)); + PyDict_SetItemString(d, "A_UNDERLINE", PyInt_FromLong(A_UNDERLINE)); + PyDict_SetItemString(d, "A_REVERSE", PyInt_FromLong(A_REVERSE)); + PyDict_SetItemString(d, "A_BLINK", PyInt_FromLong(A_BLINK)); + PyDict_SetItemString(d, "A_DIM", PyInt_FromLong(A_DIM)); + PyDict_SetItemString(d, "A_BOLD", PyInt_FromLong(A_BOLD)); + PyDict_SetItemString(d, "A_ALTCHARSET",PyInt_FromLong(A_ALTCHARSET)); + + /* Now set everything up for KEY_ variables */ + { + int key; + char *key_n; + char *key_n2; + for (key=KEY_MIN;key < KEY_MAX; key++) { + key_n = (char *)keyname(key); + if (strcmp(key_n,"UNKNOWN KEY")==0) + continue; + if (strncmp(key_n,"KEY_F(",6)==0) { + char *p1, *p2; + key_n2 = malloc(strlen(key_n)+1); + p1 = key_n; + p2 = key_n2; + while (*p1) { + if (*p1 != '(' && *p1 != ')') { + *p2 = *p1; + p2++; + } + p1++; + } + *p2 = (char)0; + } else + key_n2 = key_n; + PyDict_SetItemString(d,key_n2,PyInt_FromLong(key)); + if (key_n2 != key_n) + free(key_n2); + } + SetDictChar("KEY_MIN",KEY_MIN); + SetDictChar("KEY_MAX",KEY_MAX); + } + + /* Check for errors */ + if (PyErr_Occurred()) + Py_FatalError("can't initialize module syslog"); +} |