mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 21:51:50 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			1605 lines
		
	
	
	
		
			40 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			1605 lines
		
	
	
	
		
			40 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /***********************************************************
 | |
| 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.
 | |
| 
 | |
| ******************************************************************/
 | |
| 
 | |
| /******************************************************************
 | |
| This is a curses implementation. I have tried to be as complete
 | |
| as possible. If there are functions you need that are not included,
 | |
| please let me know and/or send me some diffs.
 | |
| 
 | |
| There are 3 basic types exported by this module:
 | |
|    1) Screen - This is not currently used
 | |
|    2) Window - This is the basic type. This is equivalent to "WINDOW *".
 | |
|    3) Pad    - This is similar to Window, but works with Pads as defined
 | |
|                in curses.
 | |
| 
 | |
| Most of the routines can be looked up using the curses man page.
 | |
| 
 | |
| Here is a list of the currently supported methods and attributes
 | |
| in the curses module:
 | |
| 
 | |
| Return Value      Func/Attr            Description
 | |
| --------------------------------------------------------------------------
 | |
| StringObject      version              A string representing the current
 | |
|                                        version of this module.
 | |
| WindowObject      initscr()            This initializes the screen for use
 | |
| None              endwin()             Closes down the screen and returns
 | |
|                                        things as they were before calling
 | |
|                                        initscr()
 | |
| True/FalseObject  isendwin()           Has endwin() been called?
 | |
| None              doupdate()           Updates screen
 | |
| WindowObject      newwin(nlines,ncols,begin_y,begin_x)
 | |
|                   newwin(begin_y,begin_x)
 | |
|                                        newwin() creates and returns
 | |
|                                        a new window.
 | |
| None              beep()               Beep the screen if possible
 | |
| None              flash()              Flash the screen if possible
 | |
| None              ungetch(int)         Push the int back so next getch()
 | |
|                                        will return it.
 | |
|                                        Note: argument is an INT, not a CHAR
 | |
| None              flushinp()           Flush all input buffers
 | |
| None              cbreak()             Enter cbreak mode
 | |
| None              nocbreak()           Leave cbreak mode
 | |
| None              echo()               Enter echo mode
 | |
| None              noecho()             Leave echo mode
 | |
| None              nl()                 Enter nl mode
 | |
| None              nonl()               Leave nl mode
 | |
| None              raw()                Enter raw mode
 | |
| None              noraw()              Leave raw mode
 | |
| None              intrflush(int)       Set or reset interruptable flush
 | |
|                                        mode, int=1 if set, 0 if notset.
 | |
| None              meta(int)            Allow 8 bit or 7 bit chars.
 | |
|                                        int=1 is 8 bit, int=0 is 7 bit
 | |
| StringObject      keyname(int)         return the text representation
 | |
|                                        of a KEY_ value. (see below)
 | |
| 
 | |
| Here is a list of the currently supported methods and attributes
 | |
| in the WindowObject:
 | |
| 
 | |
| Return Value      Func/Attr            Description
 | |
| --------------------------------------------------------------------------
 | |
| None              refresh()            Do refresh
 | |
| None              nooutrefresh()       Mark for refresh but wait
 | |
| None              mvwin(new_y,new_x)   Move Window
 | |
| None              move(new_y,new_x)    Move Cursor
 | |
| WindowObject      subwin(nlines,ncols,begin_y,begin_x)
 | |
|                   subwin(begin_y,begin_x)
 | |
| None              addch(y,x,ch,attr)
 | |
|                   addch(y,x,ch)
 | |
|                   addch(ch,attr)
 | |
|                   addch(ch)
 | |
| None              insch(y,x,ch,attr)
 | |
|                   insch(y,x,ch)
 | |
|                   insch(ch,attr)
 | |
|                   insch(ch)
 | |
| None              delch(y,x)
 | |
|                   delch()
 | |
| None              echochar(ch,attr)
 | |
|                   echochar(ch)
 | |
| None              addstr(y,x,str,attr)
 | |
|                   addstr(y,x,str)
 | |
|                   addstr(str,attr)
 | |
|                   addstr(str)
 | |
| None              attron(attr)
 | |
| None              attroff(attr)
 | |
| None              attrset(sttr)
 | |
| None              standend()
 | |
| None              standout()
 | |
| None              border(ls,rs,ts,bs,tl,tr,bl,br)   (accepts 0-8 INT args)
 | |
| None              box(vertch,horch)    vertch and horch are INTS
 | |
|                   box()
 | |
| None              hline(y,x,ch,n)
 | |
|                   hline(ch,n)
 | |
| None              vline(y,x,ch,n)
 | |
|                   vline(ch,n)
 | |
| None              erase()
 | |
| None              deleteln()
 | |
| None              insertln()
 | |
| (y,x)             getyx()
 | |
| (y,x)             getbegyx()
 | |
| (y,x)             getmaxyx()
 | |
| None              clear()
 | |
| None              clrtobot()
 | |
| None              clrtoeol()
 | |
| None              scroll()
 | |
|                   scroll(nlines)
 | |
| None              touchwin()
 | |
| None              touchline(start,count)
 | |
| IntObject         getch(y,x)
 | |
|                   getch()
 | |
| StringObject      getstr(y,x)
 | |
|                   getstr()
 | |
| IntObject         inch(y,x)
 | |
|                   inch()
 | |
| None              clearok(int)      int=0 or int=1
 | |
| None              idlok(int)        int=0 or int=1
 | |
| None              leaveok(int)      int=0 or int=1
 | |
| None              scrollok(int)     int=0 or int=1
 | |
| None              setscrreg(top,bottom)
 | |
| None              keypad(int)       int=0 or int=1
 | |
| None              nodelay(int)      int=0 or int=1
 | |
| None              notimeout(int)    int=0 or int=1
 | |
| ******************************************************************/
 | |
| 
 | |
| 
 | |
| /* curses module */
 | |
| 
 | |
| #include "Python.h"
 | |
| 
 | |
| #ifdef HAVE_NCURSES_H
 | |
| /* Now let's hope there aren't systems that have a broken ncurses.h */
 | |
| #include <ncurses.h>
 | |
| #else
 | |
| #include <curses.h>
 | |
| #endif
 | |
| 
 | |
| typedef struct {
 | |
| 	PyObject_HEAD
 | |
| 	SCREEN *scr;
 | |
| } PyCursesScreenObject;
 | |
| 
 | |
| typedef struct {
 | |
| 	PyObject_HEAD
 | |
| 	WINDOW *win;
 | |
| 	WINDOW *parent;
 | |
| } PyCursesWindowObject;
 | |
| 
 | |
| typedef struct {
 | |
| 	PyObject_HEAD
 | |
| 	WINDOW *pad;
 | |
| } PyCursesPadObject;
 | |
| 
 | |
| #if 0
 | |
| staticforward PyTypeObject PyCursesScreen_Type;
 | |
| #endif
 | |
| staticforward PyTypeObject PyCursesWindow_Type;
 | |
| #if 0
 | |
| staticforward PyTypeObject PyCursesPad_Type;
 | |
| #endif
 | |
| 
 | |
| #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 */
 | |
| static PyObject *PyCursesError;		/* For exception curses.error */
 | |
| 
 | |
| /* Catch-all error messages */
 | |
| static char *catchall_ERR  = "curses function returned ERR";
 | |
| static char *catchall_NULL = "curses function returned NULL";
 | |
| 
 | |
| /* Tells whether initscr() has been called to initialise curses  */
 | |
| static int initialised = FALSE;
 | |
| 
 | |
| #define ARG_COUNT(X) \
 | |
| 	(((X) == NULL) ? 0 : (PyTuple_Check(X) ? PyTuple_Size(X) : 1))
 | |
| 
 | |
| /******************************************************************
 | |
| 
 | |
| Change Log:
 | |
| 
 | |
| Version 1.2: 95/02/23 (Steve Clift)
 | |
|     Fixed several potential core-dumping bugs.
 | |
|     Reworked arg parsing where variable arg lists are used.
 | |
|     Generate exceptions when ERR or NULL is returned by curses functions.
 | |
|     Changed return types to match SysV Curses manual descriptions.
 | |
|     Added keypad() to window method list.
 | |
|     Added border(), hline() and vline() window methods.
 | |
| 
 | |
| Version 1.1: 94/08/31:
 | |
|     Minor fixes given by Guido.
 | |
|     Changed 'ncurses' to 'curses'
 | |
|     Changed '__version__' to 'version'
 | |
|     Added PyErr_Clear() where needed
 | |
|     Moved ACS_* attribute initialization to PyCurses_InitScr() to fix
 | |
|         crash on SGI
 | |
| 
 | |
| Version 1.0: 94/08/30:
 | |
|     This is the first release of this software.
 | |
|     Released to the Internet via python-list@cwi.nl
 | |
| 
 | |
| ******************************************************************/
 | |
| 
 | |
| static char *PyCursesVersion = "1.2";
 | |
| 
 | |
| /*
 | |
|  * Check the return code from a curses function and return None 
 | |
|  * or raise an exception as appropriate.
 | |
|  */
 | |
| 
 | |
| static PyObject *
 | |
| PyCursesCheckERR(code, fname)
 | |
|      int code;
 | |
|      char *fname;
 | |
| {
 | |
|   char buf[100];
 | |
| 
 | |
|   if (code != ERR) {
 | |
|     Py_INCREF(Py_None);
 | |
|     return Py_None;
 | |
|   } else {
 | |
|     if (fname == NULL) {
 | |
|       PyErr_SetString(PyCursesError, catchall_ERR);
 | |
|     } else {
 | |
|       strcpy(buf, fname);
 | |
|       strcat(buf, "() returned ERR");
 | |
|       PyErr_SetString(PyCursesError, buf);
 | |
|     }
 | |
|     return NULL;
 | |
|   }
 | |
| }
 | |
| 
 | |
| 
 | |
| static int
 | |
| PyCursesInitialised()
 | |
| {
 | |
|   if (initialised == TRUE)
 | |
|     return 1;
 | |
|   else {
 | |
|     PyErr_SetString(PyCursesError, "must call initscr() first");
 | |
|     return 0;
 | |
|   }
 | |
| }
 | |
| 
 | |
| 
 | |
| /* ------------- 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_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 = 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 NULL;
 | |
|   return PyCursesCheckERR(wrefresh(self->win), "wrefresh");
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCursesWindow_NoOutRefresh(self,arg)
 | |
|      PyCursesWindowObject *self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   if (!PyArg_NoArgs(arg))
 | |
|     return NULL;
 | |
|   return PyCursesCheckERR(wnoutrefresh(self->win), "wnoutrefresh");
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCursesWindow_MoveWin(self,arg)
 | |
|      PyCursesWindowObject *self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   int x, y;
 | |
|   if (!PyArg_Parse(arg,"(ii);y,x", &y, &x))
 | |
|     return NULL;
 | |
|   return PyCursesCheckERR(mvwin(self->win,y,x), "mvwin");
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCursesWindow_Move(self,arg)
 | |
|      PyCursesWindowObject *self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   int x, y;
 | |
|   if (!PyArg_Parse(arg,"(ii);y,x", &y, &x))
 | |
|     return NULL;
 | |
|   return PyCursesCheckERR(wmove(self->win,y,x), "wmove");
 | |
| }
 | |
| 
 | |
| 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;
 | |
|   switch (ARG_COUNT(arg)) {
 | |
|   case 2:
 | |
|     if (!PyArg_Parse(arg,"(ii);begin_y,begin_x",&begin_y,&begin_x))
 | |
|       return NULL;
 | |
|     break;
 | |
|   case 4:
 | |
|     if (!PyArg_Parse(arg, "(iiii);nlines,ncols,begin_y,begin_x",
 | |
| 		   &nlines,&ncols,&begin_y,&begin_x))
 | |
|       return NULL;
 | |
|     break;
 | |
|   default:
 | |
|     PyErr_SetString(PyExc_TypeError, "subwin requires 2 or 4 arguments");
 | |
|     return NULL;
 | |
|   }
 | |
|   win = subwin(self->win,nlines,ncols,begin_y,begin_x);
 | |
|   if (win == NULL) {
 | |
|     PyErr_SetString(PyCursesError, catchall_NULL);
 | |
|     return NULL;
 | |
|   }
 | |
|   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, attr_old = 0;
 | |
|   int use_xy = FALSE, use_attr = FALSE;
 | |
| 
 | |
|   switch (ARG_COUNT(arg)) {
 | |
|     case 1:
 | |
|       if (!PyArg_Parse(arg, "i;ch", &ch))
 | |
|         return NULL;
 | |
|       break;
 | |
|     case 2:
 | |
|       if (!PyArg_Parse(arg,"(ii);ch,attr", &ch, &attr))
 | |
|         return NULL;
 | |
|       use_attr = TRUE;
 | |
|       break;
 | |
|     case 3:
 | |
|       if (!PyArg_Parse(arg,"(iii);y,x,ch", &y, &x, &ch))
 | |
|         return NULL;
 | |
|       use_xy = TRUE;
 | |
|       break;
 | |
|     case 4:
 | |
|       if (!PyArg_Parse(arg,"(iiii);y,x,ch,attr", &y, &x, &ch, &attr))
 | |
|         return NULL;
 | |
|       use_xy = use_attr = TRUE;
 | |
|       break;
 | |
|     default:
 | |
|       PyErr_SetString(PyExc_TypeError, "addch requires 1 to 4 arguments");
 | |
|       return 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);
 | |
| 
 | |
|   return PyCursesCheckERR(rtn, "[mv]waddch");
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCursesWindow_InsCh(self,arg)
 | |
|      PyCursesWindowObject *self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   int rtn;
 | |
|   int x, y;
 | |
|   int ch;
 | |
|   int attr, attr_old = 0;
 | |
|   int use_xy = TRUE, use_attr = FALSE;
 | |
| 
 | |
|   switch (ARG_COUNT(arg)) {
 | |
|     case 1:
 | |
|       if (!PyArg_Parse(arg, "i;ch", &ch))
 | |
|         return NULL;
 | |
|       break;
 | |
|     case 2:
 | |
|       if (!PyArg_Parse(arg,"(ii);ch,attr", &ch, &attr))
 | |
|         return NULL;
 | |
|       use_attr = TRUE;
 | |
|       break;
 | |
|     case 3:
 | |
|       if (!PyArg_Parse(arg,"(iii);y,x,ch", &y, &x, &ch))
 | |
|         return NULL;
 | |
|       use_xy = TRUE;
 | |
|       break;
 | |
|     case 4:
 | |
|       if (!PyArg_Parse(arg,"(iiii);y,x,ch,attr", &y, &x, &ch, &attr))
 | |
|         return NULL;
 | |
|       use_xy = use_attr = TRUE;
 | |
|       break;
 | |
|     default:
 | |
|       PyErr_SetString(PyExc_TypeError, "insch requires 1 to 4 arguments");
 | |
|       return 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);
 | |
| 
 | |
|   return PyCursesCheckERR(rtn, "[mv]winsch");
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCursesWindow_DelCh(self,arg)
 | |
|      PyCursesWindowObject *self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   int rtn;
 | |
|   int x, y;
 | |
| 
 | |
|   switch (ARG_COUNT(arg)) {
 | |
|   case 0:
 | |
|     rtn = wdelch(self->win);
 | |
|     break;
 | |
|   case 2:
 | |
|     if (!PyArg_Parse(arg,"(ii);y,x", &y, &x))
 | |
|       return NULL;
 | |
|     rtn = mvwdelch(self->win,y,x);
 | |
|     break;
 | |
|   default:
 | |
|     PyErr_SetString(PyExc_TypeError, "delch requires 0 or 2 arguments");
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   return PyCursesCheckERR(rtn, "[mv]wdelch");
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCursesWindow_EchoChar(self,arg)
 | |
|      PyCursesWindowObject *self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   int rtn;
 | |
|   int ch;
 | |
|   int attr, attr_old;
 | |
| 
 | |
|   switch (ARG_COUNT(arg)) {
 | |
|   case 1:
 | |
|     if (!PyArg_Parse(arg,"i;ch", &ch))
 | |
|       return NULL;
 | |
|     rtn = wechochar(self->win,ch);
 | |
|     break;
 | |
|   case 2:
 | |
|     if (!PyArg_Parse(arg,"(ii);ch,attr", &ch, &attr))
 | |
|       return NULL;
 | |
|     attr_old = getattrs(self->win);
 | |
|     wattrset(self->win,attr);
 | |
|     rtn = wechochar(self->win,ch);
 | |
|     wattrset(self->win,attr_old);
 | |
|     break;
 | |
|   default:
 | |
|     PyErr_SetString(PyExc_TypeError, "echochar requires 1 or 2 arguments");
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   return PyCursesCheckERR(rtn, "wechochar");
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCursesWindow_AddStr(self,arg)
 | |
|      PyCursesWindowObject *self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   int rtn;
 | |
|   int x, y;
 | |
|   char *str;
 | |
|   int attr, attr_old = 0;
 | |
|   int use_xy = FALSE, use_attr = FALSE;
 | |
| 
 | |
|   switch (ARG_COUNT(arg)) {
 | |
|   case 1:
 | |
|     if (!PyArg_Parse(arg,"s;str", &str))
 | |
|       return NULL;
 | |
|     break;
 | |
|   case 2:
 | |
|     if (!PyArg_Parse(arg,"(si);str,attr", &str, &attr))
 | |
|       return NULL;
 | |
|     use_attr = TRUE;
 | |
|     break;
 | |
|   case 3:
 | |
|     if (!PyArg_Parse(arg,"(iis);y,x,str", &y, &x, &str))
 | |
|       return NULL;
 | |
|     use_xy = TRUE;
 | |
|     break;
 | |
|   case 4:
 | |
|     if (!PyArg_Parse(arg,"(iisi);y,x,str,attr", &y, &x, &str, &attr))
 | |
|       return NULL;
 | |
|     use_xy = use_attr = TRUE;
 | |
|     break;
 | |
|   default:
 | |
|     PyErr_SetString(PyExc_TypeError, "addstr requires 1 to 4 arguments");
 | |
|     return 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);
 | |
| 
 | |
|   return PyCursesCheckERR(rtn, "[mv]waddstr");
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCursesWindow_AttrOn(self,arg)
 | |
|      PyCursesWindowObject *self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   int ch;
 | |
|   if (!PyArg_Parse(arg,"i;attr", &ch))
 | |
|       return NULL;
 | |
|   wattron(self->win,ch);
 | |
|   Py_INCREF(Py_None);
 | |
|   return Py_None;
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCursesWindow_AttrOff(self,arg)
 | |
|      PyCursesWindowObject *self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   int ch;
 | |
|   if (!PyArg_Parse(arg,"i;attr", &ch))
 | |
|       return NULL;
 | |
|   wattroff(self->win,ch);
 | |
|   Py_INCREF(Py_None);
 | |
|   return Py_None;
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCursesWindow_AttrSet(self,arg)
 | |
|      PyCursesWindowObject *self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   int ch;
 | |
|   if (!PyArg_Parse(arg,"i;attr", &ch))
 | |
|       return NULL;
 | |
|   wattrset(self->win,ch);
 | |
|   Py_INCREF(Py_None);
 | |
|   return Py_None;
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCursesWindow_StandEnd(self,arg)
 | |
|      PyCursesWindowObject *self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   if (!PyArg_NoArgs(arg))
 | |
|       return NULL;
 | |
|   wstandend(self->win);
 | |
|   Py_INCREF(Py_None);
 | |
|   return Py_None;
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCursesWindow_StandOut(self,arg)
 | |
|      PyCursesWindowObject *self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   if (!PyArg_NoArgs(arg))
 | |
|       return NULL;
 | |
|   wstandout(self->win);
 | |
|   Py_INCREF(Py_None);
 | |
|   return Py_None;
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCursesWindow_Border(self, args)
 | |
|      PyCursesWindowObject *self;
 | |
|      PyObject *args;
 | |
| {
 | |
|   int ls, rs, ts, bs, tl, tr, bl, br;
 | |
|   ls = rs = ts = bs = tl = tr = bl = br = 0;
 | |
|   if (!PyArg_ParseTuple(args,"|iiiiiiii;ls,rs,ts,bs,tl,tr,bl,br",
 | |
|                         &ls, &rs, &ts, &bs, &tl, &tr, &bl, &br))
 | |
|     return NULL;
 | |
|   wborder(self->win, ls, rs, ts, bs, tl, tr, bl, br);
 | |
|   Py_INCREF(Py_None);
 | |
|   return Py_None;
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCursesWindow_Box(self,arg)
 | |
|      PyCursesWindowObject *self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   int ch1=0,ch2=0;
 | |
|   if (!PyArg_NoArgs(arg)) {
 | |
|     PyErr_Clear();
 | |
|     if (!PyArg_Parse(arg,"(ii);vertch,horch", &ch1, &ch2))
 | |
|       return NULL;
 | |
|   }
 | |
|   box(self->win,ch1,ch2);
 | |
|   Py_INCREF(Py_None);
 | |
|   return Py_None;
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCursesWindow_Hline(self, args)
 | |
|      PyCursesWindowObject *self;
 | |
|      PyObject *args;
 | |
| {
 | |
|   int ch, n, x, y, code = OK;
 | |
|   switch (ARG_COUNT(args)) {
 | |
|   case 2:
 | |
|     if (!PyArg_Parse(args, "(ii);ch,n", &ch, &n))
 | |
|       return NULL;
 | |
|     break;
 | |
|   case 4:
 | |
|     if (!PyArg_Parse(args, "(iiii);y,x,ch,n", &y, &x, &ch, &n))
 | |
|       return NULL;
 | |
|     code = wmove(self->win, y, x);
 | |
|     break;
 | |
|   default:
 | |
|     PyErr_SetString(PyExc_TypeError, "hline requires 2 or 4 arguments");
 | |
|     return NULL;
 | |
|   }
 | |
|   if (code != ERR)
 | |
|     whline(self->win, ch, n);
 | |
|   return PyCursesCheckERR(code, "wmove");
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCursesWindow_Vline(self, args)
 | |
|      PyCursesWindowObject *self;
 | |
|      PyObject *args;
 | |
| {
 | |
|   int ch, n, x, y, code = OK;
 | |
|   switch (ARG_COUNT(args)) {
 | |
|   case 2:
 | |
|     if (!PyArg_Parse(args, "(ii);ch,n", &ch, &n))
 | |
|       return NULL;
 | |
|     break;
 | |
|   case 4:
 | |
|     if (!PyArg_Parse(args, "(iiii);y,x,ch,n", &y, &x, &ch, &n))
 | |
|       return NULL;
 | |
|     code = wmove(self->win, y, x);
 | |
|     break;
 | |
|   default:
 | |
|     PyErr_SetString(PyExc_TypeError, "vline requires 2 or 4 arguments");
 | |
|     return NULL;
 | |
|   }
 | |
|   if (code != ERR)
 | |
|     wvline(self->win, ch, n);
 | |
|   return PyCursesCheckERR(code, "wmove");
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCursesWindow_Erase(self,arg)
 | |
|      PyCursesWindowObject *self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   if (!PyArg_NoArgs(arg))
 | |
|       return NULL;
 | |
|   werase(self->win);
 | |
|   Py_INCREF(Py_None);
 | |
|   return Py_None;
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCursesWindow_DeleteLine(self,arg)
 | |
|      PyCursesWindowObject *self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   if (!PyArg_NoArgs(arg))
 | |
|       return NULL;
 | |
|   return PyCursesCheckERR(wdeleteln(self->win), "wdeleteln");
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCursesWindow_InsertLine(self,arg)
 | |
|      PyCursesWindowObject *self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   if (!PyArg_NoArgs(arg))
 | |
|       return NULL;
 | |
|   return PyCursesCheckERR(winsertln(self->win), "winsertln");
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCursesWindow_GetYX(self,arg)
 | |
|      PyCursesWindowObject *self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   int x, y;
 | |
|   if (!PyArg_NoArgs(arg))
 | |
|       return NULL;
 | |
|   getyx(self->win,y,x);
 | |
|   return Py_BuildValue("(ii)", y, x);
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCursesWindow_GetBegYX(self,arg)
 | |
|      PyCursesWindowObject *self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   int x, y;
 | |
|   if (!PyArg_NoArgs(arg))
 | |
|       return NULL;
 | |
|   getbegyx(self->win,y,x);
 | |
|   return Py_BuildValue("(ii)", y, x);
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCursesWindow_GetMaxYX(self,arg)
 | |
|      PyCursesWindowObject *self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   int x, y;
 | |
|   if (!PyArg_NoArgs(arg))
 | |
|       return NULL;
 | |
|   getmaxyx(self->win,y,x);
 | |
|   return Py_BuildValue("(ii)", y, x);
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCursesWindow_Clear(self,arg)
 | |
|      PyCursesWindowObject *self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   if (!PyArg_NoArgs(arg))
 | |
|       return NULL;
 | |
|   wclear(self->win);
 | |
|   Py_INCREF(Py_None);
 | |
|   return Py_None;
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCursesWindow_ClearToBottom(self,arg)
 | |
|      PyCursesWindowObject *self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   if (!PyArg_NoArgs(arg))
 | |
|       return NULL;
 | |
|   wclrtobot(self->win);
 | |
|   Py_INCREF(Py_None);
 | |
|   return Py_None;
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCursesWindow_ClearToEOL(self,arg)
 | |
|      PyCursesWindowObject *self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   if (!PyArg_NoArgs(arg))
 | |
|       return NULL;
 | |
|   wclrtoeol(self->win);
 | |
|   Py_INCREF(Py_None);
 | |
|   return Py_None;
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCursesWindow_Scroll(self,arg)
 | |
|      PyCursesWindowObject *self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   int nlines;
 | |
|   int use_nlines = FALSE;
 | |
|   switch (ARG_COUNT(arg)) {
 | |
|   case 0:
 | |
|     break;
 | |
|   case 1:
 | |
|     if (!PyArg_Parse(arg, "i;nlines", &nlines))
 | |
|       return NULL;
 | |
|     use_nlines = TRUE;
 | |
|     break;
 | |
|   default:
 | |
|     PyErr_SetString(PyExc_TypeError, "scroll requires 0 or 1 arguments");
 | |
|     return NULL;
 | |
|   }
 | |
|   if (use_nlines)
 | |
|     return PyCursesCheckERR(wscrl(self->win, nlines), "scroll");
 | |
|   else
 | |
|     return PyCursesCheckERR(scroll(self->win), "scroll");
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCursesWindow_TouchWin(self,arg)
 | |
|      PyCursesWindowObject *self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   if (!PyArg_NoArgs(arg))
 | |
|       return NULL;
 | |
|   return PyCursesCheckERR(touchwin(self->win), "touchwin");
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCursesWindow_TouchLine(self,arg)
 | |
|      PyCursesWindowObject *self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   int st, cnt;
 | |
|   if (!PyArg_Parse(arg,"(ii);start,count",&st,&cnt))
 | |
|       return NULL;
 | |
|   return PyCursesCheckERR(touchline(self->win,st,cnt), "touchline");
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCursesWindow_GetCh(self,arg)
 | |
|      PyCursesWindowObject *self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   int x, y;
 | |
|   int rtn;
 | |
| 
 | |
|   switch (ARG_COUNT(arg)) {
 | |
|   case 0:
 | |
|     rtn = wgetch(self->win);
 | |
|     break;
 | |
|   case 2:
 | |
|     if (!PyArg_Parse(arg,"(ii);y,x",&y,&x))
 | |
|       return NULL;
 | |
|     rtn = mvwgetch(self->win,y,x);
 | |
|     break;
 | |
|   default:
 | |
|     PyErr_SetString(PyExc_TypeError, "getch requires 0 or 2 arguments");
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   return PyInt_FromLong((long) rtn);
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCursesWindow_GetStr(self,arg)
 | |
|      PyCursesWindowObject *self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   int x, y;
 | |
|   char rtn[1024]; /* This should be big enough.. I hope */
 | |
|   int rtn2;
 | |
| 
 | |
|   switch (ARG_COUNT(arg)) {
 | |
|   case 0:
 | |
|     rtn2 = wgetstr(self->win,rtn);
 | |
|     break;
 | |
|   case 2:
 | |
|     if (!PyArg_Parse(arg,"(ii);y,x",&y,&x))
 | |
|       return NULL;
 | |
|     rtn2 = mvwgetstr(self->win,y,x,rtn);
 | |
|     break;
 | |
|   default:
 | |
|     PyErr_SetString(PyExc_TypeError, "getstr requires 0 or 2 arguments");
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   if (rtn2 == ERR)
 | |
|     rtn[0] = 0;
 | |
|   return PyString_FromString(rtn);
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCursesWindow_InCh(self,arg)
 | |
|      PyCursesWindowObject *self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   int x, y, rtn;
 | |
| 
 | |
|   switch (ARG_COUNT(arg)) {
 | |
|   case 0:
 | |
|     rtn = winch(self->win);
 | |
|     break;
 | |
|   case 2:
 | |
|     if (!PyArg_Parse(arg,"(ii);y,x",&y,&x))
 | |
|       return NULL;
 | |
|     rtn = mvwinch(self->win,y,x);
 | |
|     break;
 | |
|   default:
 | |
|     PyErr_SetString(PyExc_TypeError, "inch requires 0 or 2 arguments");
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   return PyInt_FromLong((long) 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 NULL;
 | |
|   clearok(self->win,val);
 | |
|   Py_INCREF(Py_None);
 | |
|   return 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 NULL;
 | |
|   idlok(self->win,val);
 | |
|   Py_INCREF(Py_None);
 | |
|   return 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 NULL;
 | |
|   leaveok(self->win,val);
 | |
|   Py_INCREF(Py_None);
 | |
|   return 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 NULL;
 | |
|   scrollok(self->win,val);
 | |
|   Py_INCREF(Py_None);
 | |
|   return 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 NULL;
 | |
|   return PyCursesCheckERR(wsetscrreg(self->win,y,x), "wsetscrreg");
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCursesWindow_KeyPad(self,arg)
 | |
|      PyCursesWindowObject * self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   int ch;
 | |
|   if (!PyArg_Parse(arg,"i;True(1), False(0)",&ch))
 | |
|     return NULL;
 | |
|   keypad(self->win,ch);
 | |
|   Py_INCREF(Py_None);
 | |
|   return 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 NULL;
 | |
|   nodelay(self->win,ch);
 | |
|   Py_INCREF(Py_None);
 | |
|   return 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 NULL;
 | |
|   notimeout(self->win,ch);
 | |
|   Py_INCREF(Py_None);
 | |
|   return 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},
 | |
| 	{"border",          (PyCFunction)PyCursesWindow_Border, METH_VARARGS},
 | |
| 	{"box",             (PyCFunction)PyCursesWindow_Box},
 | |
| 	{"hline",           (PyCFunction)PyCursesWindow_Hline},
 | |
| 	{"vline",           (PyCFunction)PyCursesWindow_Vline},
 | |
| 	{"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,		        NULL}   /* sentinel */
 | |
| };
 | |
| 
 | |
| static PyObject *
 | |
| PyCursesWindow_GetAttr(self, name)
 | |
| 	PyCursesWindowObject *self;
 | |
| 	char *name;
 | |
| {
 | |
|   return Py_FindMethod(PyCursesWindow_Methods, (PyObject *)self, name);
 | |
| }
 | |
| 
 | |
| 
 | |
| /* --------------- PAD routines ---------------- */
 | |
| 
 | |
| #ifdef NOT_YET
 | |
| static PyObject *
 | |
| PyCursesPad_New(pad)
 | |
| 	WINDOW *pad;
 | |
| {
 | |
| 	PyCursesPadObject *po;
 | |
| 	po = PyObject_NEW(PyCursesPadObject, &PyCursesPad_Type);
 | |
| 	if (po == NULL)
 | |
| 		return NULL;
 | |
| 	po->pad = pad;
 | |
| 	return (PyObject *)po;
 | |
| }
 | |
| #endif
 | |
| 
 | |
| 
 | |
| /* -------------------------------------------------------*/
 | |
| 
 | |
| #if 0
 | |
| 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*/
 | |
| };
 | |
| #endif
 | |
| 
 | |
| 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*/
 | |
| };
 | |
| 
 | |
| #if 0
 | |
| 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*/
 | |
| };
 | |
| #endif
 | |
| 
 | |
| 
 | |
| /* -------------------------------------------------------*/
 | |
| 
 | |
| static PyObject *ModDict;
 | |
| 
 | |
| static PyObject * 
 | |
| PyCurses_InitScr(self, args)
 | |
|      PyObject * self;
 | |
|      PyObject * args;
 | |
| {
 | |
|   WINDOW *win;
 | |
|   if (!PyArg_NoArgs(args))
 | |
|     return NULL;
 | |
|   if (initialised == TRUE) {
 | |
|     wrefresh(stdscr);
 | |
|     return (PyObject *)PyCursesWindow_New(stdscr);
 | |
|   }
 | |
| 
 | |
|   win = initscr();
 | |
|   if (win == NULL) {
 | |
|     PyErr_SetString(PyCursesError, catchall_NULL);
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   initialised = TRUE;
 | |
| 
 | |
| /* This was moved from initcurses() because core dumped on SGI */
 | |
| /* Also, they are probably not defined until you've called initscr() */
 | |
| #define SetDictInt(string,ch) \
 | |
| 	PyDict_SetItemString(ModDict,string,PyInt_FromLong((long) (ch)));
 | |
|  
 | |
| 	/* Here are some graphic symbols you can use */
 | |
|         SetDictInt("ACS_ULCORNER",(ACS_ULCORNER));
 | |
| 	SetDictInt("ACS_ULCORNER",(ACS_ULCORNER));
 | |
| 	SetDictInt("ACS_LLCORNER",(ACS_LLCORNER));
 | |
| 	SetDictInt("ACS_URCORNER",(ACS_URCORNER));
 | |
| 	SetDictInt("ACS_LRCORNER",(ACS_LRCORNER));
 | |
| 	SetDictInt("ACS_RTEE",    (ACS_RTEE));
 | |
| 	SetDictInt("ACS_LTEE",    (ACS_LTEE));
 | |
| 	SetDictInt("ACS_BTEE",    (ACS_BTEE));
 | |
| 	SetDictInt("ACS_TTEE",    (ACS_TTEE));
 | |
| 	SetDictInt("ACS_HLINE",   (ACS_HLINE));
 | |
| 	SetDictInt("ACS_VLINE",   (ACS_VLINE));
 | |
| 	SetDictInt("ACS_PLUS",    (ACS_PLUS));
 | |
| 	SetDictInt("ACS_S1",      (ACS_S1));
 | |
| 	SetDictInt("ACS_S9",      (ACS_S9));
 | |
| 	SetDictInt("ACS_DIAMOND", (ACS_DIAMOND));
 | |
| 	SetDictInt("ACS_CKBOARD", (ACS_CKBOARD));
 | |
| 	SetDictInt("ACS_DEGREE",  (ACS_DEGREE));
 | |
| 	SetDictInt("ACS_PLMINUS", (ACS_PLMINUS));
 | |
| 	SetDictInt("ACS_BULLET",  (ACS_BULLET));
 | |
| 	SetDictInt("ACS_LARROW",  (ACS_LARROW));
 | |
| 	SetDictInt("ACS_RARROW",  (ACS_RARROW));
 | |
| 	SetDictInt("ACS_DARROW",  (ACS_DARROW));
 | |
| 	SetDictInt("ACS_UARROW",  (ACS_UARROW));
 | |
| 	SetDictInt("ACS_BOARD",   (ACS_BOARD));
 | |
| 	SetDictInt("ACS_LANTERN", (ACS_LANTERN));
 | |
| 	SetDictInt("ACS_BLOCK",   (ACS_BLOCK));
 | |
| 
 | |
|   return (PyObject *)PyCursesWindow_New(win);
 | |
| }
 | |
| 
 | |
| static PyObject * 
 | |
| PyCurses_EndWin(self, args)
 | |
|      PyObject * self;
 | |
|      PyObject * args;
 | |
| {
 | |
|   if (!PyArg_NoArgs(args) || !PyCursesInitialised())
 | |
|     return NULL;
 | |
|   return PyCursesCheckERR(endwin(), "endwin");
 | |
| }
 | |
| 
 | |
| static PyObject * 
 | |
| PyCurses_IsEndWin(self, args)
 | |
|      PyObject * self;
 | |
|      PyObject * args;
 | |
| {
 | |
|   if (!PyArg_NoArgs(args))
 | |
|     return 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) || !PyCursesInitialised())
 | |
|     return NULL;
 | |
|   return PyCursesCheckERR(doupdate(), "doupdate");
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCurses_NewWindow(self,arg)
 | |
|      PyObject * self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   WINDOW *win;
 | |
|   int nlines, ncols, begin_y, begin_x;
 | |
| 
 | |
|   if (!PyCursesInitialised())
 | |
|     return NULL;
 | |
|   nlines = ncols = 0;
 | |
|   switch (ARG_COUNT(arg)) {
 | |
|   case 2:
 | |
|     if (!PyArg_Parse(arg,"(ii);begin)_y,begin_x",&begin_y,&begin_x))
 | |
|       return NULL;
 | |
|     break;
 | |
|   case 4:
 | |
|     if (!PyArg_Parse(arg, "(iiii);nlines,ncols,begin_y,begin_x",
 | |
| 		   &nlines,&ncols,&begin_y,&begin_x))
 | |
|       return NULL;
 | |
|     break;
 | |
|   default:
 | |
|     PyErr_SetString(PyExc_TypeError, "newwin requires 2 or 4 arguments");
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   win = newwin(nlines,ncols,begin_y,begin_x);
 | |
|   if (win == NULL) {
 | |
|     PyErr_SetString(PyCursesError, catchall_NULL);
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   return (PyObject *)PyCursesWindow_New(win);
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCurses_Beep(self,arg)
 | |
|      PyObject * self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   if (!PyArg_NoArgs(arg) || !PyCursesInitialised())
 | |
|     return NULL;
 | |
|   beep();
 | |
|   Py_INCREF(Py_None);
 | |
|   return Py_None;
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCurses_Flash(self,arg)
 | |
|      PyObject * self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   if (!PyArg_NoArgs(arg) || !PyCursesInitialised())
 | |
|     return NULL;
 | |
|   flash();
 | |
|   Py_INCREF(Py_None);
 | |
|   return Py_None;
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCurses_UngetCh(self,arg)
 | |
|      PyObject * self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   int ch;
 | |
|   if (!PyArg_Parse(arg,"i;integer",&ch) || !PyCursesInitialised())
 | |
|     return NULL;
 | |
|   return PyCursesCheckERR(ungetch(ch), "ungetch");
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCurses_FlushInp(self,arg)
 | |
|      PyObject * self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   if (!PyArg_NoArgs(arg) || !PyCursesInitialised())
 | |
|     return NULL;
 | |
|   flushinp();
 | |
|   Py_INCREF(Py_None);
 | |
|   return Py_None;
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCurses_CBreak(self,arg)
 | |
|      PyObject * self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   if (!PyArg_NoArgs(arg) || !PyCursesInitialised())
 | |
|     return NULL;
 | |
|   return PyCursesCheckERR(cbreak(), "cbreak");
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCurses_NoCBreak(self,arg)
 | |
|      PyObject * self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   if (!PyArg_NoArgs(arg) || !PyCursesInitialised())
 | |
|     return NULL;
 | |
|   return PyCursesCheckERR(nocbreak(), "nocbreak");
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCurses_Echo(self,arg)
 | |
|      PyObject * self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   if (!PyArg_NoArgs(arg) || !PyCursesInitialised())
 | |
|     return NULL;
 | |
|   return PyCursesCheckERR(echo(), "echo");
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCurses_NoEcho(self,arg)
 | |
|      PyObject * self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   if (!PyArg_NoArgs(arg) || !PyCursesInitialised())
 | |
|     return NULL;
 | |
|   return PyCursesCheckERR(noecho(), "noecho");
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCurses_Nl(self,arg)
 | |
|      PyObject * self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   if (!PyArg_NoArgs(arg) || !PyCursesInitialised())
 | |
|     return NULL;
 | |
|   return PyCursesCheckERR(nl(), "nl");
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCurses_NoNl(self,arg)
 | |
|      PyObject * self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   if (!PyArg_NoArgs(arg) || !PyCursesInitialised())
 | |
|     return NULL;
 | |
|   return PyCursesCheckERR(nonl(), "nonl");
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCurses_Raw(self,arg)
 | |
|      PyObject * self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   if (!PyArg_NoArgs(arg) || !PyCursesInitialised())
 | |
|     return NULL;
 | |
|   return PyCursesCheckERR(raw(), "raw");
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCurses_NoRaw(self,arg)
 | |
|      PyObject * self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   if (!PyArg_NoArgs(arg) || !PyCursesInitialised())
 | |
|     return NULL;
 | |
|   return PyCursesCheckERR(noraw(), "noraw");
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCurses_IntrFlush(self,arg)
 | |
|      PyObject * self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   int ch;
 | |
|   if (!PyArg_Parse(arg,"i;True(1), False(0)",&ch))
 | |
|     return NULL;
 | |
|   return PyCursesCheckERR(intrflush(NULL,ch), "intrflush");
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCurses_Meta(self,arg)
 | |
|      PyObject * self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   int ch;
 | |
|   if (!PyArg_Parse(arg,"i;True(1), False(0)",&ch) || !PyCursesInitialised())
 | |
|     return NULL;
 | |
|   return PyCursesCheckERR(meta(stdscr, ch), "meta");
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| PyCurses_KeyName(self,arg)
 | |
|      PyObject * self;
 | |
|      PyObject * arg;
 | |
| {
 | |
|   const char *knp;
 | |
|   int ch;
 | |
|   if (!PyArg_Parse(arg,"i",&ch))
 | |
|     return NULL;
 | |
|   knp = keyname(ch);
 | |
|   return PyString_FromString((knp == NULL) ? "" : knp);
 | |
| }
 | |
| 
 | |
| #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 */
 | |
| 
 | |
| DL_EXPORT(void)
 | |
| initcurses()
 | |
| {
 | |
| 	PyObject *m, *d, *v;
 | |
| 
 | |
| 	/* Create the module and add the functions */
 | |
| 	m = Py_InitModule("curses", PyCurses_methods);
 | |
| 
 | |
| 	/* Add some symbolic constants to the module */
 | |
| 	d = PyModule_GetDict(m);
 | |
| 	ModDict = d; /* For PyCurses_InitScr */
 | |
| 
 | |
| 	/* For exception curses.error */
 | |
| 	PyCursesError = PyErr_NewException("curses.error", NULL, NULL);
 | |
| 	PyDict_SetItemString(d, "error", PyCursesError);
 | |
| 
 | |
| 	/* Make the version available */
 | |
| 	v = PyString_FromString(PyCursesVersion);
 | |
| 	PyDict_SetItemString(d, "version", v);
 | |
| 	PyDict_SetItemString(d, "__version__", v);
 | |
| 	Py_DECREF(v);
 | |
| 
 | |
| 	/* Here are some attributes you can add to chars to print */
 | |
| 	SetDictInt("A_NORMAL",		A_NORMAL);
 | |
| 	SetDictInt("A_STANDOUT",	A_STANDOUT);
 | |
| 	SetDictInt("A_UNDERLINE",	A_UNDERLINE);
 | |
| 	SetDictInt("A_REVERSE",		A_REVERSE);
 | |
| 	SetDictInt("A_BLINK",		A_BLINK);
 | |
| 	SetDictInt("A_DIM",		A_DIM);
 | |
| 	SetDictInt("A_BOLD",		A_BOLD);
 | |
| 	SetDictInt("A_ALTCHARSET",	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 (key_n == NULL || 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((long) key));
 | |
| 	    if (key_n2 != key_n)
 | |
| 	      free(key_n2);
 | |
| 	  }
 | |
| 	  SetDictInt("KEY_MIN", KEY_MIN);
 | |
| 	  SetDictInt("KEY_MAX", KEY_MAX);
 | |
| 	}
 | |
| }
 | 
