Home | History | Annotate | Download | only in Modules
      1 /*
      2  *   This is a curses module for Python.
      3  *
      4  *   Based on prior work by Lance Ellinghaus and Oliver Andrich
      5  *   Version 1.2 of this module: Copyright 1994 by Lance Ellinghouse,
      6  *    Cathedral City, California Republic, United States of America.
      7  *
      8  *   Version 1.5b1, heavily extended for ncurses by Oliver Andrich:
      9  *   Copyright 1996,1997 by Oliver Andrich, Koblenz, Germany.
     10  *
     11  *   Tidied for Python 1.6, and currently maintained by <amk (at) amk.ca>.
     12  *
     13  *   Permission is hereby granted, free of charge, to any person obtaining
     14  *   a copy of this source file to use, copy, modify, merge, or publish it
     15  *   subject to the following conditions:
     16  *
     17  *   The above copyright notice and this permission notice shall be included
     18  *   in all copies or in any new file that contains a substantial portion of
     19  *   this file.
     20  *
     21  *   THE  AUTHOR  MAKES  NO  REPRESENTATIONS ABOUT  THE  SUITABILITY  OF
     22  *   THE  SOFTWARE FOR  ANY  PURPOSE.  IT IS  PROVIDED  "AS IS"  WITHOUT
     23  *   EXPRESS OR  IMPLIED WARRANTY.  THE AUTHOR DISCLAIMS  ALL WARRANTIES
     24  *   WITH  REGARD TO  THIS  SOFTWARE, INCLUDING  ALL IMPLIED  WARRANTIES
     25  *   OF   MERCHANTABILITY,  FITNESS   FOR  A   PARTICULAR  PURPOSE   AND
     26  *   NON-INFRINGEMENT  OF THIRD  PARTY  RIGHTS. IN  NO  EVENT SHALL  THE
     27  *   AUTHOR  BE LIABLE  TO  YOU  OR ANY  OTHER  PARTY  FOR ANY  SPECIAL,
     28  *   INDIRECT,  OR  CONSEQUENTIAL  DAMAGES  OR  ANY  DAMAGES  WHATSOEVER
     29  *   WHETHER IN AN  ACTION OF CONTRACT, NEGLIGENCE,  STRICT LIABILITY OR
     30  *   ANY OTHER  ACTION ARISING OUT OF  OR IN CONNECTION WITH  THE USE OR
     31  *   PERFORMANCE OF THIS SOFTWARE.
     32  */
     33 
     34 /*
     35 
     36   A number of SysV or ncurses functions don't have wrappers yet; if you
     37   need a given function, add it and send a patch.  See
     38   http://www.python.org/dev/patches/ for instructions on how to submit
     39   patches to Python.
     40 
     41   Here's a list of currently unsupported functions:
     42 
     43   addchnstr addchstr color_set define_key
     44   del_curterm delscreen dupwin inchnstr inchstr innstr keyok
     45   mcprint mvaddchnstr mvaddchstr mvcur mvinchnstr
     46   mvinchstr mvinnstr mmvwaddchnstr mvwaddchstr
     47   mvwinchnstr mvwinchstr mvwinnstr newterm
     48   restartterm ripoffline scr_dump
     49   scr_init scr_restore scr_set scrl set_curterm set_term setterm
     50   tgetent tgetflag tgetnum tgetstr tgoto timeout tputs
     51   vidattr vidputs waddchnstr waddchstr
     52   wcolor_set winchnstr winchstr winnstr wmouse_trafo wscrl
     53 
     54   Low-priority:
     55   slk_attr slk_attr_off slk_attr_on slk_attr_set slk_attroff
     56   slk_attron slk_attrset slk_clear slk_color slk_init slk_label
     57   slk_noutrefresh slk_refresh slk_restore slk_set slk_touch
     58 
     59   Menu extension (ncurses and probably SYSV):
     60   current_item free_item free_menu item_count item_description
     61   item_index item_init item_name item_opts item_opts_off
     62   item_opts_on item_term item_userptr item_value item_visible
     63   menu_back menu_driver menu_fore menu_format menu_grey
     64   menu_init menu_items menu_mark menu_opts menu_opts_off
     65   menu_opts_on menu_pad menu_pattern menu_request_by_name
     66   menu_request_name menu_spacing menu_sub menu_term menu_userptr
     67   menu_win new_item new_menu pos_menu_cursor post_menu
     68   scale_menu set_current_item set_item_init set_item_opts
     69   set_item_term set_item_userptr set_item_value set_menu_back
     70   set_menu_fore set_menu_format set_menu_grey set_menu_init
     71   set_menu_items set_menu_mark set_menu_opts set_menu_pad
     72   set_menu_pattern set_menu_spacing set_menu_sub set_menu_term
     73   set_menu_userptr set_menu_win set_top_row top_row unpost_menu
     74 
     75   Form extension (ncurses and probably SYSV):
     76   current_field data_ahead data_behind dup_field
     77   dynamic_fieldinfo field_arg field_back field_buffer
     78   field_count field_fore field_index field_info field_init
     79   field_just field_opts field_opts_off field_opts_on field_pad
     80   field_status field_term field_type field_userptr form_driver
     81   form_fields form_init form_opts form_opts_off form_opts_on
     82   form_page form_request_by_name form_request_name form_sub
     83   form_term form_userptr form_win free_field free_form
     84   link_field link_fieldtype move_field new_field new_form
     85   new_page pos_form_cursor post_form scale_form
     86   set_current_field set_field_back set_field_buffer
     87   set_field_fore set_field_init set_field_just set_field_opts
     88   set_field_pad set_field_status set_field_term set_field_type
     89   set_field_userptr set_fieldtype_arg set_fieldtype_choice
     90   set_form_fields set_form_init set_form_opts set_form_page
     91   set_form_sub set_form_term set_form_userptr set_form_win
     92   set_max_field set_new_page unpost_form
     93 
     94 
     95 */
     96 
     97 /* Release Number */
     98 
     99 char *PyCursesVersion = "2.2";
    100 
    101 /* Includes */
    102 
    103 #include "Python.h"
    104 
    105 #ifdef __osf__
    106 #define STRICT_SYSV_CURSES      /* Don't use ncurses extensions */
    107 #endif
    108 
    109 #ifdef __hpux
    110 #define STRICT_SYSV_CURSES
    111 #endif
    112 
    113 #define CURSES_MODULE
    114 #include "py_curses.h"
    115 
    116 #if defined(HAVE_TERM_H) || defined(__sgi)
    117 /* For termname, longname, putp, tigetflag, tigetnum, tigetstr, tparm
    118    which are not declared in SysV curses and for setupterm. */
    119 #include <term.h>
    120 /* Including <term.h> #defines many common symbols. */
    121 #undef lines
    122 #undef columns
    123 #endif
    124 
    125 #if !defined(HAVE_NCURSES_H) && (defined(sgi) || defined(__sun) || defined(SCO5))
    126 #define STRICT_SYSV_CURSES       /* Don't use ncurses extensions */
    127 typedef chtype attr_t;           /* No attr_t type is available */
    128 #endif
    129 
    130 #if defined(_AIX)
    131 #define STRICT_SYSV_CURSES
    132 #endif
    133 
    134 /* Definition of exception curses.error */
    135 
    136 static PyObject *PyCursesError;
    137 
    138 /* Tells whether setupterm() has been called to initialise terminfo.  */
    139 static int initialised_setupterm = FALSE;
    140 
    141 /* Tells whether initscr() has been called to initialise curses.  */
    142 static int initialised = FALSE;
    143 
    144 /* Tells whether start_color() has been called to initialise color usage. */
    145 static int initialisedcolors = FALSE;
    146 
    147 /* Utility Macros */
    148 #define PyCursesSetupTermCalled                                         \
    149     if (initialised_setupterm != TRUE) {                                \
    150         PyErr_SetString(PyCursesError,                                  \
    151                         "must call (at least) setupterm() first");      \
    152         return 0; }
    153 
    154 #define PyCursesInitialised                             \
    155     if (initialised != TRUE) {                          \
    156         PyErr_SetString(PyCursesError,                  \
    157                         "must call initscr() first");   \
    158         return 0; }
    159 
    160 #define PyCursesInitialisedColor                                \
    161     if (initialisedcolors != TRUE) {                            \
    162         PyErr_SetString(PyCursesError,                          \
    163                         "must call start_color() first");       \
    164         return 0; }
    165 
    166 #ifndef MIN
    167 #define MIN(x,y) ((x) < (y) ? (x) : (y))
    168 #endif
    169 
    170 /* Utility Functions */
    171 
    172 /*
    173  * Check the return code from a curses function and return None
    174  * or raise an exception as appropriate.  These are exported using the
    175  * capsule API.
    176  */
    177 
    178 static PyObject *
    179 PyCursesCheckERR(int code, char *fname)
    180 {
    181     if (code != ERR) {
    182         Py_INCREF(Py_None);
    183         return Py_None;
    184     } else {
    185         if (fname == NULL) {
    186             PyErr_SetString(PyCursesError, catchall_ERR);
    187         } else {
    188             PyErr_Format(PyCursesError, "%s() returned ERR", fname);
    189         }
    190         return NULL;
    191     }
    192 }
    193 
    194 static int
    195 PyCurses_ConvertToChtype(PyObject *obj, chtype *ch)
    196 {
    197     if (_PyAnyInt_Check(obj)) {
    198         *ch = (chtype) PyInt_AsLong(obj);
    199         if (*ch == (chtype) -1 && PyErr_Occurred())
    200             return 0;
    201     } else if(PyString_Check(obj)
    202               && (PyString_Size(obj) == 1)) {
    203         *ch = (chtype) *PyString_AsString(obj);
    204     } else {
    205         return 0;
    206     }
    207     return 1;
    208 }
    209 
    210 /* Function versions of the 3 functions for testing whether curses has been
    211    initialised or not. */
    212 
    213 static int func_PyCursesSetupTermCalled(void)
    214 {
    215     PyCursesSetupTermCalled;
    216     return 1;
    217 }
    218 
    219 static int func_PyCursesInitialised(void)
    220 {
    221     PyCursesInitialised;
    222     return 1;
    223 }
    224 
    225 static int func_PyCursesInitialisedColor(void)
    226 {
    227     PyCursesInitialisedColor;
    228     return 1;
    229 }
    230 
    231 /*****************************************************************************
    232  The Window Object
    233 ******************************************************************************/
    234 
    235 /* Definition of the window type */
    236 
    237 PyTypeObject PyCursesWindow_Type;
    238 
    239 /* Function prototype macros for Window object
    240 
    241    X - function name
    242    TYPE - parameter Type
    243    ERGSTR - format string for construction of the return value
    244    PARSESTR - format string for argument parsing
    245 */
    246 
    247 #define Window_NoArgNoReturnFunction(X)                 \
    248     static PyObject *PyCursesWindow_ ## X               \
    249     (PyCursesWindowObject *self, PyObject *args)        \
    250     { return PyCursesCheckERR(X(self->win), # X); }
    251 
    252 #define Window_NoArgTrueFalseFunction(X)                                \
    253     static PyObject * PyCursesWindow_ ## X                              \
    254     (PyCursesWindowObject *self)                                        \
    255     {                                                                   \
    256         if (X (self->win) == FALSE) { Py_INCREF(Py_False); return Py_False; } \
    257         else { Py_INCREF(Py_True); return Py_True; } }
    258 
    259 #define Window_NoArgNoReturnVoidFunction(X)                     \
    260     static PyObject * PyCursesWindow_ ## X                      \
    261     (PyCursesWindowObject *self)                                \
    262     {                                                           \
    263         X(self->win); Py_INCREF(Py_None); return Py_None; }
    264 
    265 #define Window_NoArg2TupleReturnFunction(X, TYPE, ERGSTR)               \
    266     static PyObject * PyCursesWindow_ ## X                              \
    267     (PyCursesWindowObject *self)                                        \
    268     {                                                                   \
    269         TYPE arg1, arg2;                                                \
    270         X(self->win,arg1,arg2); return Py_BuildValue(ERGSTR, arg1, arg2); }
    271 
    272 #define Window_OneArgNoReturnVoidFunction(X, TYPE, PARSESTR)            \
    273     static PyObject * PyCursesWindow_ ## X                              \
    274     (PyCursesWindowObject *self, PyObject *args)                        \
    275     {                                                                   \
    276         TYPE arg1;                                                      \
    277         if (!PyArg_ParseTuple(args, PARSESTR, &arg1)) return NULL;      \
    278         X(self->win,arg1); Py_INCREF(Py_None); return Py_None; }
    279 
    280 #define Window_OneArgNoReturnFunction(X, TYPE, PARSESTR)                \
    281     static PyObject * PyCursesWindow_ ## X                              \
    282     (PyCursesWindowObject *self, PyObject *args)                        \
    283     {                                                                   \
    284         TYPE arg1;                                                      \
    285         if (!PyArg_ParseTuple(args,PARSESTR, &arg1)) return NULL;       \
    286         return PyCursesCheckERR(X(self->win, arg1), # X); }
    287 
    288 #define Window_TwoArgNoReturnFunction(X, TYPE, PARSESTR)                \
    289     static PyObject * PyCursesWindow_ ## X                              \
    290     (PyCursesWindowObject *self, PyObject *args)                        \
    291     {                                                                   \
    292         TYPE arg1, arg2;                                                \
    293         if (!PyArg_ParseTuple(args,PARSESTR, &arg1, &arg2)) return NULL; \
    294         return PyCursesCheckERR(X(self->win, arg1, arg2), # X); }
    295 
    296 /* ------------- WINDOW routines --------------- */
    297 
    298 Window_NoArgNoReturnFunction(untouchwin)
    299 Window_NoArgNoReturnFunction(touchwin)
    300 Window_NoArgNoReturnFunction(redrawwin)
    301 Window_NoArgNoReturnFunction(winsertln)
    302 Window_NoArgNoReturnFunction(werase)
    303 Window_NoArgNoReturnFunction(wdeleteln)
    304 
    305 Window_NoArgTrueFalseFunction(is_wintouched)
    306 
    307 Window_NoArgNoReturnVoidFunction(wsyncup)
    308 Window_NoArgNoReturnVoidFunction(wsyncdown)
    309 Window_NoArgNoReturnVoidFunction(wstandend)
    310 Window_NoArgNoReturnVoidFunction(wstandout)
    311 Window_NoArgNoReturnVoidFunction(wcursyncup)
    312 Window_NoArgNoReturnVoidFunction(wclrtoeol)
    313 Window_NoArgNoReturnVoidFunction(wclrtobot)
    314 Window_NoArgNoReturnVoidFunction(wclear)
    315 
    316 Window_OneArgNoReturnVoidFunction(idcok, int, "i;True(1) or False(0)")
    317 #ifdef HAVE_CURSES_IMMEDOK
    318 Window_OneArgNoReturnVoidFunction(immedok, int, "i;True(1) or False(0)")
    319 #endif
    320 Window_OneArgNoReturnVoidFunction(wtimeout, int, "i;delay")
    321 
    322 Window_NoArg2TupleReturnFunction(getyx, int, "ii")
    323 Window_NoArg2TupleReturnFunction(getbegyx, int, "ii")
    324 Window_NoArg2TupleReturnFunction(getmaxyx, int, "ii")
    325 Window_NoArg2TupleReturnFunction(getparyx, int, "ii")
    326 
    327 Window_OneArgNoReturnFunction(clearok, int, "i;True(1) or False(0)")
    328 Window_OneArgNoReturnFunction(idlok, int, "i;True(1) or False(0)")
    329 Window_OneArgNoReturnFunction(keypad, int, "i;True(1) or False(0)")
    330 Window_OneArgNoReturnFunction(leaveok, int, "i;True(1) or False(0)")
    331 Window_OneArgNoReturnFunction(nodelay, int, "i;True(1) or False(0)")
    332 Window_OneArgNoReturnFunction(notimeout, int, "i;True(1) or False(0)")
    333 Window_OneArgNoReturnFunction(scrollok, int, "i;True(1) or False(0)")
    334 Window_OneArgNoReturnFunction(winsdelln, int, "i;nlines")
    335 #ifdef HAVE_CURSES_SYNCOK
    336 Window_OneArgNoReturnFunction(syncok, int, "i;True(1) or False(0)")
    337 #endif
    338 
    339 Window_TwoArgNoReturnFunction(mvwin, int, "ii;y,x")
    340 Window_TwoArgNoReturnFunction(mvderwin, int, "ii;y,x")
    341 Window_TwoArgNoReturnFunction(wmove, int, "ii;y,x")
    342 #ifndef STRICT_SYSV_CURSES
    343 Window_TwoArgNoReturnFunction(wresize, int, "ii;lines,columns")
    344 #endif
    345 
    346 /* Allocation and deallocation of Window Objects */
    347 
    348 static PyObject *
    349 PyCursesWindow_New(WINDOW *win)
    350 {
    351     PyCursesWindowObject *wo;
    352 
    353     wo = PyObject_NEW(PyCursesWindowObject, &PyCursesWindow_Type);
    354     if (wo == NULL) return NULL;
    355     wo->win = win;
    356     return (PyObject *)wo;
    357 }
    358 
    359 static void
    360 PyCursesWindow_Dealloc(PyCursesWindowObject *wo)
    361 {
    362     if (wo->win != stdscr) delwin(wo->win);
    363     PyObject_DEL(wo);
    364 }
    365 
    366 /* Addch, Addstr, Addnstr */
    367 
    368 static PyObject *
    369 PyCursesWindow_AddCh(PyCursesWindowObject *self, PyObject *args)
    370 {
    371     int rtn, x, y, use_xy = FALSE;
    372     PyObject *temp;
    373     chtype ch = 0;
    374     attr_t attr = A_NORMAL;
    375     long lattr;
    376 
    377     switch (PyTuple_Size(args)) {
    378     case 1:
    379         if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
    380             return NULL;
    381         break;
    382     case 2:
    383         if (!PyArg_ParseTuple(args, "Ol;ch or int,attr", &temp, &lattr))
    384             return NULL;
    385         attr = lattr;
    386         break;
    387     case 3:
    388         if (!PyArg_ParseTuple(args,"iiO;y,x,ch or int", &y, &x, &temp))
    389             return NULL;
    390         use_xy = TRUE;
    391         break;
    392     case 4:
    393         if (!PyArg_ParseTuple(args,"iiOl;y,x,ch or int, attr",
    394                               &y, &x, &temp, &lattr))
    395             return NULL;
    396         attr = lattr;
    397         use_xy = TRUE;
    398         break;
    399     default:
    400         PyErr_SetString(PyExc_TypeError, "addch requires 1 to 4 arguments");
    401         return NULL;
    402     }
    403 
    404     if (!PyCurses_ConvertToChtype(temp, &ch)) {
    405         PyErr_SetString(PyExc_TypeError, "argument 1 or 3 must be a ch or an int");
    406         return NULL;
    407     }
    408 
    409     if (use_xy == TRUE)
    410         rtn = mvwaddch(self->win,y,x, ch | attr);
    411     else {
    412         rtn = waddch(self->win, ch | attr);
    413     }
    414     return PyCursesCheckERR(rtn, "addch");
    415 }
    416 
    417 static PyObject *
    418 PyCursesWindow_AddStr(PyCursesWindowObject *self, PyObject *args)
    419 {
    420     int rtn;
    421     int x, y;
    422     char *str;
    423     attr_t attr = A_NORMAL , attr_old = A_NORMAL;
    424     long lattr;
    425     int use_xy = FALSE, use_attr = FALSE;
    426 
    427     switch (PyTuple_Size(args)) {
    428     case 1:
    429         if (!PyArg_ParseTuple(args,"s;str", &str))
    430             return NULL;
    431         break;
    432     case 2:
    433         if (!PyArg_ParseTuple(args,"sl;str,attr", &str, &lattr))
    434             return NULL;
    435         attr = lattr;
    436         use_attr = TRUE;
    437         break;
    438     case 3:
    439         if (!PyArg_ParseTuple(args,"iis;int,int,str", &y, &x, &str))
    440             return NULL;
    441         use_xy = TRUE;
    442         break;
    443     case 4:
    444         if (!PyArg_ParseTuple(args,"iisl;int,int,str,attr", &y, &x, &str, &lattr))
    445             return NULL;
    446         attr = lattr;
    447         use_xy = use_attr = TRUE;
    448         break;
    449     default:
    450         PyErr_SetString(PyExc_TypeError, "addstr requires 1 to 4 arguments");
    451         return NULL;
    452     }
    453 
    454     if (use_attr == TRUE) {
    455         attr_old = getattrs(self->win);
    456         (void)wattrset(self->win,attr);
    457     }
    458     if (use_xy == TRUE)
    459         rtn = mvwaddstr(self->win,y,x,str);
    460     else
    461         rtn = waddstr(self->win,str);
    462     if (use_attr == TRUE)
    463         (void)wattrset(self->win,attr_old);
    464     return PyCursesCheckERR(rtn, "addstr");
    465 }
    466 
    467 static PyObject *
    468 PyCursesWindow_AddNStr(PyCursesWindowObject *self, PyObject *args)
    469 {
    470     int rtn, x, y, n;
    471     char *str;
    472     attr_t attr = A_NORMAL , attr_old = A_NORMAL;
    473     long lattr;
    474     int use_xy = FALSE, use_attr = FALSE;
    475 
    476     switch (PyTuple_Size(args)) {
    477     case 2:
    478         if (!PyArg_ParseTuple(args,"si;str,n", &str, &n))
    479             return NULL;
    480         break;
    481     case 3:
    482         if (!PyArg_ParseTuple(args,"sil;str,n,attr", &str, &n, &lattr))
    483             return NULL;
    484         attr = lattr;
    485         use_attr = TRUE;
    486         break;
    487     case 4:
    488         if (!PyArg_ParseTuple(args,"iisi;y,x,str,n", &y, &x, &str, &n))
    489             return NULL;
    490         use_xy = TRUE;
    491         break;
    492     case 5:
    493         if (!PyArg_ParseTuple(args,"iisil;y,x,str,n,attr", &y, &x, &str, &n, &lattr))
    494             return NULL;
    495         attr = lattr;
    496         use_xy = use_attr = TRUE;
    497         break;
    498     default:
    499         PyErr_SetString(PyExc_TypeError, "addnstr requires 2 to 5 arguments");
    500         return NULL;
    501     }
    502 
    503     if (use_attr == TRUE) {
    504         attr_old = getattrs(self->win);
    505         (void)wattrset(self->win,attr);
    506     }
    507     if (use_xy == TRUE)
    508         rtn = mvwaddnstr(self->win,y,x,str,n);
    509     else
    510         rtn = waddnstr(self->win,str,n);
    511     if (use_attr == TRUE)
    512         (void)wattrset(self->win,attr_old);
    513     return PyCursesCheckERR(rtn, "addnstr");
    514 }
    515 
    516 static PyObject *
    517 PyCursesWindow_Bkgd(PyCursesWindowObject *self, PyObject *args)
    518 {
    519     PyObject *temp;
    520     chtype bkgd;
    521     attr_t attr = A_NORMAL;
    522     long lattr;
    523 
    524     switch (PyTuple_Size(args)) {
    525     case 1:
    526         if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
    527             return NULL;
    528         break;
    529     case 2:
    530         if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
    531             return NULL;
    532         attr = lattr;
    533         break;
    534     default:
    535         PyErr_SetString(PyExc_TypeError, "bkgd requires 1 or 2 arguments");
    536         return NULL;
    537     }
    538 
    539     if (!PyCurses_ConvertToChtype(temp, &bkgd)) {
    540         PyErr_SetString(PyExc_TypeError, "argument 1 or 3 must be a ch or an int");
    541         return NULL;
    542     }
    543 
    544     return PyCursesCheckERR(wbkgd(self->win, bkgd | attr), "bkgd");
    545 }
    546 
    547 static PyObject *
    548 PyCursesWindow_AttrOff(PyCursesWindowObject *self, PyObject *args)
    549 {
    550     long lattr;
    551     if (!PyArg_ParseTuple(args,"l;attr", &lattr))
    552         return NULL;
    553     return PyCursesCheckERR(wattroff(self->win, (attr_t)lattr), "attroff");
    554 }
    555 
    556 static PyObject *
    557 PyCursesWindow_AttrOn(PyCursesWindowObject *self, PyObject *args)
    558 {
    559     long lattr;
    560     if (!PyArg_ParseTuple(args,"l;attr", &lattr))
    561         return NULL;
    562     return PyCursesCheckERR(wattron(self->win, (attr_t)lattr), "attron");
    563 }
    564 
    565 static PyObject *
    566 PyCursesWindow_AttrSet(PyCursesWindowObject *self, PyObject *args)
    567 {
    568     long lattr;
    569     if (!PyArg_ParseTuple(args,"l;attr", &lattr))
    570         return NULL;
    571     return PyCursesCheckERR(wattrset(self->win, (attr_t)lattr), "attrset");
    572 }
    573 
    574 static PyObject *
    575 PyCursesWindow_BkgdSet(PyCursesWindowObject *self, PyObject *args)
    576 {
    577     PyObject *temp;
    578     chtype bkgd;
    579     attr_t attr = A_NORMAL;
    580     long lattr;
    581 
    582     switch (PyTuple_Size(args)) {
    583     case 1:
    584         if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
    585             return NULL;
    586         break;
    587     case 2:
    588         if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
    589             return NULL;
    590         attr = lattr;
    591         break;
    592     default:
    593         PyErr_SetString(PyExc_TypeError, "bkgdset requires 1 or 2 arguments");
    594         return NULL;
    595     }
    596 
    597     if (!PyCurses_ConvertToChtype(temp, &bkgd)) {
    598         PyErr_SetString(PyExc_TypeError, "argument 1 must be a ch or an int");
    599         return NULL;
    600     }
    601 
    602     wbkgdset(self->win, bkgd | attr);
    603     return PyCursesCheckERR(0, "bkgdset");
    604 }
    605 
    606 static PyObject *
    607 PyCursesWindow_Border(PyCursesWindowObject *self, PyObject *args)
    608 {
    609     PyObject *temp[8];
    610     chtype ch[8];
    611     int i;
    612 
    613     /* Clear the array of parameters */
    614     for(i=0; i<8; i++) {
    615         temp[i] = NULL;
    616         ch[i] = 0;
    617     }
    618 
    619     if (!PyArg_ParseTuple(args,"|OOOOOOOO;ls,rs,ts,bs,tl,tr,bl,br",
    620                           &temp[0], &temp[1], &temp[2], &temp[3],
    621                           &temp[4], &temp[5], &temp[6], &temp[7]))
    622         return NULL;
    623 
    624     for(i=0; i<8; i++) {
    625         if (temp[i] != NULL && !PyCurses_ConvertToChtype(temp[i], &ch[i])) {
    626             PyErr_Format(PyExc_TypeError,
    627                          "argument %i must be a ch or an int", i+1);
    628             return NULL;
    629         }
    630     }
    631 
    632     wborder(self->win,
    633             ch[0], ch[1], ch[2], ch[3],
    634             ch[4], ch[5], ch[6], ch[7]);
    635     Py_INCREF(Py_None);
    636     return Py_None;
    637 }
    638 
    639 static PyObject *
    640 PyCursesWindow_Box(PyCursesWindowObject *self, PyObject *args)
    641 {
    642     PyObject *temp1, *temp2;
    643     chtype ch1=0,ch2=0;
    644     switch(PyTuple_Size(args)){
    645     case 0: break;
    646     default:
    647         if (!PyArg_ParseTuple(args,"OO;verch,horch", &temp1, &temp2))
    648             return NULL;
    649         if (!PyCurses_ConvertToChtype(temp1, &ch1)) {
    650             return NULL;
    651         }
    652         if (!PyCurses_ConvertToChtype(temp2, &ch2)) {
    653             return NULL;
    654         }
    655     }
    656     box(self->win,ch1,ch2);
    657     Py_INCREF(Py_None);
    658     return Py_None;
    659 }
    660 
    661 #if defined(HAVE_NCURSES_H) || defined(MVWDELCH_IS_EXPRESSION)
    662 #define py_mvwdelch mvwdelch
    663 #else
    664 int py_mvwdelch(WINDOW *w, int y, int x)
    665 {
    666     mvwdelch(w,y,x);
    667     /* On HP/UX, mvwdelch already returns. On other systems,
    668        we may well run into this return statement. */
    669     return 0;
    670 }
    671 #endif
    672 
    673 #if defined(HAVE_CURSES_IS_PAD)
    674 #define py_is_pad(win)      is_pad(win)
    675 #elif defined(WINDOW_HAS_FLAGS)
    676 #define py_is_pad(win)      ((win) ? ((win)->_flags & _ISPAD) != 0 : FALSE)
    677 #endif
    678 
    679 /* chgat, added by Fabian Kreutz <fabian.kreutz at gmx.net> */
    680 #ifdef HAVE_CURSES_WCHGAT
    681 static PyObject *
    682 PyCursesWindow_ChgAt(PyCursesWindowObject *self, PyObject *args)
    683 {
    684     int rtn;
    685     int x, y;
    686     int num = -1;
    687     short color;
    688     attr_t attr = A_NORMAL;
    689     long lattr;
    690     int use_xy = FALSE;
    691 
    692     switch (PyTuple_Size(args)) {
    693     case 1:
    694         if (!PyArg_ParseTuple(args,"l;attr", &lattr))
    695             return NULL;
    696         attr = lattr;
    697         break;
    698     case 2:
    699         if (!PyArg_ParseTuple(args,"il;n,attr", &num, &lattr))
    700             return NULL;
    701         attr = lattr;
    702         break;
    703     case 3:
    704         if (!PyArg_ParseTuple(args,"iil;int,int,attr", &y, &x, &lattr))
    705             return NULL;
    706         attr = lattr;
    707         use_xy = TRUE;
    708         break;
    709     case 4:
    710         if (!PyArg_ParseTuple(args,"iiil;int,int,n,attr", &y, &x, &num, &lattr))
    711             return NULL;
    712         attr = lattr;
    713         use_xy = TRUE;
    714         break;
    715     default:
    716         PyErr_SetString(PyExc_TypeError, "chgat requires 1 to 4 arguments");
    717         return NULL;
    718     }
    719 
    720     color = (short)((attr >> 8) & 0xff);
    721     attr = attr - (color << 8);
    722 
    723     if (use_xy == TRUE) {
    724         rtn = mvwchgat(self->win,y,x,num,attr,color,NULL);
    725         touchline(self->win,y,1);
    726     } else {
    727         getyx(self->win,y,x);
    728         rtn = wchgat(self->win,num,attr,color,NULL);
    729         touchline(self->win,y,1);
    730     }
    731     return PyCursesCheckERR(rtn, "chgat");
    732 }
    733 #endif
    734 
    735 static PyObject *
    736 PyCursesWindow_DelCh(PyCursesWindowObject *self, PyObject *args)
    737 {
    738     int rtn;
    739     int x, y;
    740 
    741     switch (PyTuple_Size(args)) {
    742     case 0:
    743         rtn = wdelch(self->win);
    744         break;
    745     case 2:
    746         if (!PyArg_ParseTuple(args,"ii;y,x", &y, &x))
    747             return NULL;
    748         rtn = py_mvwdelch(self->win,y,x);
    749         break;
    750     default:
    751         PyErr_SetString(PyExc_TypeError, "delch requires 0 or 2 arguments");
    752         return NULL;
    753     }
    754     return PyCursesCheckERR(rtn, "[mv]wdelch");
    755 }
    756 
    757 static PyObject *
    758 PyCursesWindow_DerWin(PyCursesWindowObject *self, PyObject *args)
    759 {
    760     WINDOW *win;
    761     int nlines, ncols, begin_y, begin_x;
    762 
    763     nlines = 0;
    764     ncols  = 0;
    765     switch (PyTuple_Size(args)) {
    766     case 2:
    767         if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
    768             return NULL;
    769         break;
    770     case 4:
    771         if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
    772                               &nlines,&ncols,&begin_y,&begin_x))
    773             return NULL;
    774         break;
    775     default:
    776         PyErr_SetString(PyExc_TypeError, "derwin requires 2 or 4 arguments");
    777         return NULL;
    778     }
    779 
    780     win = derwin(self->win,nlines,ncols,begin_y,begin_x);
    781 
    782     if (win == NULL) {
    783         PyErr_SetString(PyCursesError, catchall_NULL);
    784         return NULL;
    785     }
    786 
    787     return (PyObject *)PyCursesWindow_New(win);
    788 }
    789 
    790 static PyObject *
    791 PyCursesWindow_EchoChar(PyCursesWindowObject *self, PyObject *args)
    792 {
    793     PyObject *temp;
    794     chtype ch;
    795     attr_t attr = A_NORMAL;
    796     long lattr;
    797 
    798     switch (PyTuple_Size(args)) {
    799     case 1:
    800         if (!PyArg_ParseTuple(args,"O;ch or int", &temp))
    801             return NULL;
    802         break;
    803     case 2:
    804         if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
    805             return NULL;
    806         attr = lattr;
    807         break;
    808     default:
    809         PyErr_SetString(PyExc_TypeError, "echochar requires 1 or 2 arguments");
    810 
    811 
    812         return NULL;
    813     }
    814 
    815     if (!PyCurses_ConvertToChtype(temp, &ch)) {
    816         PyErr_SetString(PyExc_TypeError, "argument 1 must be a ch or an int");
    817         return NULL;
    818     }
    819 
    820 #ifdef py_is_pad
    821     if (py_is_pad(self->win)) {
    822         return PyCursesCheckERR(pechochar(self->win, ch | attr),
    823                                 "echochar");
    824     }
    825     else
    826 #endif
    827         return PyCursesCheckERR(wechochar(self->win, ch | attr),
    828                                 "echochar");
    829 }
    830 
    831 #ifdef NCURSES_MOUSE_VERSION
    832 static PyObject *
    833 PyCursesWindow_Enclose(PyCursesWindowObject *self, PyObject *args)
    834 {
    835     int x, y;
    836     if (!PyArg_ParseTuple(args,"ii;y,x", &y, &x))
    837         return NULL;
    838 
    839     return PyInt_FromLong( wenclose(self->win,y,x) );
    840 }
    841 #endif
    842 
    843 static PyObject *
    844 PyCursesWindow_GetBkgd(PyCursesWindowObject *self)
    845 {
    846     return PyInt_FromLong((long) getbkgd(self->win));
    847 }
    848 
    849 static PyObject *
    850 PyCursesWindow_GetCh(PyCursesWindowObject *self, PyObject *args)
    851 {
    852     int x, y;
    853     int rtn;
    854 
    855     switch (PyTuple_Size(args)) {
    856     case 0:
    857         Py_BEGIN_ALLOW_THREADS
    858         rtn = wgetch(self->win);
    859         Py_END_ALLOW_THREADS
    860         break;
    861     case 2:
    862         if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
    863             return NULL;
    864         Py_BEGIN_ALLOW_THREADS
    865         rtn = mvwgetch(self->win,y,x);
    866         Py_END_ALLOW_THREADS
    867         break;
    868     default:
    869         PyErr_SetString(PyExc_TypeError, "getch requires 0 or 2 arguments");
    870         return NULL;
    871     }
    872     return PyInt_FromLong((long)rtn);
    873 }
    874 
    875 static PyObject *
    876 PyCursesWindow_GetKey(PyCursesWindowObject *self, PyObject *args)
    877 {
    878     int x, y;
    879     int rtn;
    880 
    881     switch (PyTuple_Size(args)) {
    882     case 0:
    883         Py_BEGIN_ALLOW_THREADS
    884         rtn = wgetch(self->win);
    885         Py_END_ALLOW_THREADS
    886         break;
    887     case 2:
    888         if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
    889             return NULL;
    890         Py_BEGIN_ALLOW_THREADS
    891         rtn = mvwgetch(self->win,y,x);
    892         Py_END_ALLOW_THREADS
    893         break;
    894     default:
    895         PyErr_SetString(PyExc_TypeError, "getkey requires 0 or 2 arguments");
    896         return NULL;
    897     }
    898     if (rtn == ERR) {
    899         /* getch() returns ERR in nodelay mode */
    900         PyErr_CheckSignals();
    901         if (!PyErr_Occurred())
    902             PyErr_SetString(PyCursesError, "no input");
    903         return NULL;
    904     } else if (rtn<=255) {
    905         return Py_BuildValue("c", rtn);
    906     } else {
    907         const char *knp = keyname(rtn);
    908         return PyString_FromString((knp == NULL) ? "" : knp);
    909     }
    910 }
    911 
    912 static PyObject *
    913 PyCursesWindow_GetStr(PyCursesWindowObject *self, PyObject *args)
    914 {
    915     int x, y, n;
    916     char rtn[1024]; /* This should be big enough.. I hope */
    917     int rtn2;
    918 
    919     switch (PyTuple_Size(args)) {
    920     case 0:
    921         Py_BEGIN_ALLOW_THREADS
    922         rtn2 = wgetnstr(self->win,rtn, 1023);
    923         Py_END_ALLOW_THREADS
    924         break;
    925     case 1:
    926         if (!PyArg_ParseTuple(args,"i;n", &n))
    927             return NULL;
    928         if (n < 0) {
    929             PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
    930             return NULL;
    931         }
    932         Py_BEGIN_ALLOW_THREADS
    933         rtn2 = wgetnstr(self->win,rtn,MIN(n, 1023));
    934         Py_END_ALLOW_THREADS
    935         break;
    936     case 2:
    937         if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
    938             return NULL;
    939         Py_BEGIN_ALLOW_THREADS
    940 #ifdef STRICT_SYSV_CURSES
    941         rtn2 = wmove(self->win,y,x)==ERR ? ERR : wgetnstr(self->win, rtn, 1023);
    942 #else
    943         rtn2 = mvwgetnstr(self->win,y,x,rtn, 1023);
    944 #endif
    945         Py_END_ALLOW_THREADS
    946         break;
    947     case 3:
    948         if (!PyArg_ParseTuple(args,"iii;y,x,n", &y, &x, &n))
    949             return NULL;
    950         if (n < 0) {
    951             PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
    952             return NULL;
    953         }
    954 #ifdef STRICT_SYSV_CURSES
    955         Py_BEGIN_ALLOW_THREADS
    956         rtn2 = wmove(self->win,y,x)==ERR ? ERR :
    957         wgetnstr(self->win, rtn, MIN(n, 1023));
    958         Py_END_ALLOW_THREADS
    959 #else
    960         Py_BEGIN_ALLOW_THREADS
    961         rtn2 = mvwgetnstr(self->win, y, x, rtn, MIN(n, 1023));
    962         Py_END_ALLOW_THREADS
    963 #endif
    964         break;
    965     default:
    966         PyErr_SetString(PyExc_TypeError, "getstr requires 0 to 3 arguments");
    967         return NULL;
    968     }
    969     if (rtn2 == ERR)
    970         rtn[0] = 0;
    971     return PyString_FromString(rtn);
    972 }
    973 
    974 static PyObject *
    975 PyCursesWindow_Hline(PyCursesWindowObject *self, PyObject *args)
    976 {
    977     PyObject *temp;
    978     chtype ch;
    979     int n, x, y, code = OK;
    980     attr_t attr = A_NORMAL;
    981     long lattr;
    982 
    983     switch (PyTuple_Size(args)) {
    984     case 2:
    985         if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
    986             return NULL;
    987         break;
    988     case 3:
    989         if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &lattr))
    990             return NULL;
    991         attr = lattr;
    992         break;
    993     case 4:
    994         if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
    995             return NULL;
    996         code = wmove(self->win, y, x);
    997         break;
    998     case 5:
    999         if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
   1000                               &y, &x, &temp, &n, &lattr))
   1001             return NULL;
   1002         attr = lattr;
   1003         code = wmove(self->win, y, x);
   1004         break;
   1005     default:
   1006         PyErr_SetString(PyExc_TypeError, "hline requires 2 to 5 arguments");
   1007         return NULL;
   1008     }
   1009 
   1010     if (code != ERR) {
   1011         if (!PyCurses_ConvertToChtype(temp, &ch)) {
   1012             PyErr_SetString(PyExc_TypeError,
   1013                             "argument 1 or 3 must be a ch or an int");
   1014             return NULL;
   1015         }
   1016         return PyCursesCheckERR(whline(self->win, ch | attr, n), "hline");
   1017     } else
   1018         return PyCursesCheckERR(code, "wmove");
   1019 }
   1020 
   1021 static PyObject *
   1022 PyCursesWindow_InsCh(PyCursesWindowObject *self, PyObject *args)
   1023 {
   1024     int rtn, x, y, use_xy = FALSE;
   1025     PyObject *temp;
   1026     chtype ch = 0;
   1027     attr_t attr = A_NORMAL;
   1028     long lattr;
   1029 
   1030     switch (PyTuple_Size(args)) {
   1031     case 1:
   1032         if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
   1033             return NULL;
   1034         break;
   1035     case 2:
   1036         if (!PyArg_ParseTuple(args, "Ol;ch or int,attr", &temp, &lattr))
   1037             return NULL;
   1038         attr = lattr;
   1039         break;
   1040     case 3:
   1041         if (!PyArg_ParseTuple(args,"iiO;y,x,ch or int", &y, &x, &temp))
   1042             return NULL;
   1043         use_xy = TRUE;
   1044         break;
   1045     case 4:
   1046         if (!PyArg_ParseTuple(args,"iiOl;y,x,ch or int, attr", &y, &x, &temp, &lattr))
   1047             return NULL;
   1048         attr = lattr;
   1049         use_xy = TRUE;
   1050         break;
   1051     default:
   1052         PyErr_SetString(PyExc_TypeError, "insch requires 1 to 4 arguments");
   1053         return NULL;
   1054     }
   1055 
   1056     if (!PyCurses_ConvertToChtype(temp, &ch)) {
   1057         PyErr_SetString(PyExc_TypeError,
   1058                         "argument 1 or 3 must be a ch or an int");
   1059         return NULL;
   1060     }
   1061 
   1062     if (use_xy == TRUE)
   1063         rtn = mvwinsch(self->win,y,x, ch | attr);
   1064     else {
   1065         rtn = winsch(self->win, ch | attr);
   1066     }
   1067     return PyCursesCheckERR(rtn, "insch");
   1068 }
   1069 
   1070 static PyObject *
   1071 PyCursesWindow_InCh(PyCursesWindowObject *self, PyObject *args)
   1072 {
   1073     int x, y, rtn;
   1074 
   1075     switch (PyTuple_Size(args)) {
   1076     case 0:
   1077         rtn = winch(self->win);
   1078         break;
   1079     case 2:
   1080         if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
   1081             return NULL;
   1082         rtn = mvwinch(self->win,y,x);
   1083         break;
   1084     default:
   1085         PyErr_SetString(PyExc_TypeError, "inch requires 0 to 2 arguments");
   1086         return NULL;
   1087     }
   1088     return PyInt_FromLong((long) rtn);
   1089 }
   1090 
   1091 static PyObject *
   1092 PyCursesWindow_InStr(PyCursesWindowObject *self, PyObject *args)
   1093 {
   1094     int x, y, n;
   1095     char rtn[1024]; /* This should be big enough.. I hope */
   1096     int rtn2;
   1097 
   1098     switch (PyTuple_Size(args)) {
   1099     case 0:
   1100         rtn2 = winnstr(self->win,rtn, 1023);
   1101         break;
   1102     case 1:
   1103         if (!PyArg_ParseTuple(args,"i;n", &n))
   1104             return NULL;
   1105         if (n < 0) {
   1106             PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
   1107             return NULL;
   1108         }
   1109         rtn2 = winnstr(self->win,rtn,MIN(n,1023));
   1110         break;
   1111     case 2:
   1112         if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
   1113             return NULL;
   1114         rtn2 = mvwinnstr(self->win,y,x,rtn,1023);
   1115         break;
   1116     case 3:
   1117         if (!PyArg_ParseTuple(args, "iii;y,x,n", &y, &x, &n))
   1118             return NULL;
   1119         if (n < 0) {
   1120             PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
   1121             return NULL;
   1122         }
   1123         rtn2 = mvwinnstr(self->win, y, x, rtn, MIN(n,1023));
   1124         break;
   1125     default:
   1126         PyErr_SetString(PyExc_TypeError, "instr requires 0 or 3 arguments");
   1127         return NULL;
   1128     }
   1129     if (rtn2 == ERR)
   1130         rtn[0] = 0;
   1131     return PyString_FromString(rtn);
   1132 }
   1133 
   1134 static PyObject *
   1135 PyCursesWindow_InsStr(PyCursesWindowObject *self, PyObject *args)
   1136 {
   1137     int rtn;
   1138     int x, y;
   1139     char *str;
   1140     attr_t attr = A_NORMAL , attr_old = A_NORMAL;
   1141     long lattr;
   1142     int use_xy = FALSE, use_attr = FALSE;
   1143 
   1144     switch (PyTuple_Size(args)) {
   1145     case 1:
   1146         if (!PyArg_ParseTuple(args,"s;str", &str))
   1147             return NULL;
   1148         break;
   1149     case 2:
   1150         if (!PyArg_ParseTuple(args,"sl;str,attr", &str, &lattr))
   1151             return NULL;
   1152         attr = lattr;
   1153         use_attr = TRUE;
   1154         break;
   1155     case 3:
   1156         if (!PyArg_ParseTuple(args,"iis;y,x,str", &y, &x, &str))
   1157             return NULL;
   1158         use_xy = TRUE;
   1159         break;
   1160     case 4:
   1161         if (!PyArg_ParseTuple(args,"iisl;y,x,str,attr", &y, &x, &str, &lattr))
   1162             return NULL;
   1163         attr = lattr;
   1164         use_xy = use_attr = TRUE;
   1165         break;
   1166     default:
   1167         PyErr_SetString(PyExc_TypeError, "insstr requires 1 to 4 arguments");
   1168         return NULL;
   1169     }
   1170 
   1171     if (use_attr == TRUE) {
   1172         attr_old = getattrs(self->win);
   1173         (void)wattrset(self->win,attr);
   1174     }
   1175     if (use_xy == TRUE)
   1176         rtn = mvwinsstr(self->win,y,x,str);
   1177     else
   1178         rtn = winsstr(self->win,str);
   1179     if (use_attr == TRUE)
   1180         (void)wattrset(self->win,attr_old);
   1181     return PyCursesCheckERR(rtn, "insstr");
   1182 }
   1183 
   1184 static PyObject *
   1185 PyCursesWindow_InsNStr(PyCursesWindowObject *self, PyObject *args)
   1186 {
   1187     int rtn, x, y, n;
   1188     char *str;
   1189     attr_t attr = A_NORMAL , attr_old = A_NORMAL;
   1190     long lattr;
   1191     int use_xy = FALSE, use_attr = FALSE;
   1192 
   1193     switch (PyTuple_Size(args)) {
   1194     case 2:
   1195         if (!PyArg_ParseTuple(args,"si;str,n", &str, &n))
   1196             return NULL;
   1197         break;
   1198     case 3:
   1199         if (!PyArg_ParseTuple(args,"sil;str,n,attr", &str, &n, &lattr))
   1200             return NULL;
   1201         attr = lattr;
   1202         use_attr = TRUE;
   1203         break;
   1204     case 4:
   1205         if (!PyArg_ParseTuple(args,"iisi;y,x,str,n", &y, &x, &str, &n))
   1206             return NULL;
   1207         use_xy = TRUE;
   1208         break;
   1209     case 5:
   1210         if (!PyArg_ParseTuple(args,"iisil;y,x,str,n,attr", &y, &x, &str, &n, &lattr))
   1211             return NULL;
   1212         attr = lattr;
   1213         use_xy = use_attr = TRUE;
   1214         break;
   1215     default:
   1216         PyErr_SetString(PyExc_TypeError, "insnstr requires 2 to 5 arguments");
   1217         return NULL;
   1218     }
   1219 
   1220     if (use_attr == TRUE) {
   1221         attr_old = getattrs(self->win);
   1222         (void)wattrset(self->win,attr);
   1223     }
   1224     if (use_xy == TRUE)
   1225         rtn = mvwinsnstr(self->win,y,x,str,n);
   1226     else
   1227         rtn = winsnstr(self->win,str,n);
   1228     if (use_attr == TRUE)
   1229         (void)wattrset(self->win,attr_old);
   1230     return PyCursesCheckERR(rtn, "insnstr");
   1231 }
   1232 
   1233 static PyObject *
   1234 PyCursesWindow_Is_LineTouched(PyCursesWindowObject *self, PyObject *args)
   1235 {
   1236     int line, erg;
   1237     if (!PyArg_ParseTuple(args,"i;line", &line))
   1238         return NULL;
   1239     erg = is_linetouched(self->win, line);
   1240     if (erg == ERR) {
   1241         PyErr_SetString(PyExc_TypeError,
   1242                         "is_linetouched: line number outside of boundaries");
   1243         return NULL;
   1244     } else
   1245         if (erg == FALSE) {
   1246             Py_INCREF(Py_False);
   1247             return Py_False;
   1248         } else {
   1249             Py_INCREF(Py_True);
   1250             return Py_True;
   1251         }
   1252 }
   1253 
   1254 static PyObject *
   1255 PyCursesWindow_NoOutRefresh(PyCursesWindowObject *self, PyObject *args)
   1256 {
   1257     int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
   1258     int rtn;
   1259 
   1260 #ifndef py_is_pad
   1261     if (0)
   1262 #else
   1263         if (py_is_pad(self->win))
   1264 #endif
   1265         {
   1266             switch(PyTuple_Size(args)) {
   1267             case 6:
   1268                 if (!PyArg_ParseTuple(args,
   1269                                       "iiiiii;" \
   1270                                       "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
   1271                                       &pminrow, &pmincol, &sminrow,
   1272                                       &smincol, &smaxrow, &smaxcol))
   1273                     return NULL;
   1274                 Py_BEGIN_ALLOW_THREADS
   1275                 rtn = pnoutrefresh(self->win,
   1276                                    pminrow, pmincol, sminrow,
   1277                                    smincol, smaxrow, smaxcol);
   1278                 Py_END_ALLOW_THREADS
   1279                 return PyCursesCheckERR(rtn, "pnoutrefresh");
   1280             default:
   1281                 PyErr_SetString(PyCursesError,
   1282                                 "noutrefresh() called for a pad "
   1283                                 "requires 6 arguments");
   1284                 return NULL;
   1285             }
   1286         } else {
   1287             if (!PyArg_ParseTuple(args, ":noutrefresh"))
   1288                 return NULL;
   1289 
   1290             Py_BEGIN_ALLOW_THREADS
   1291             rtn = wnoutrefresh(self->win);
   1292             Py_END_ALLOW_THREADS
   1293             return PyCursesCheckERR(rtn, "wnoutrefresh");
   1294         }
   1295 }
   1296 
   1297 static PyObject *
   1298 PyCursesWindow_Overlay(PyCursesWindowObject *self, PyObject *args)
   1299 {
   1300     PyCursesWindowObject *temp;
   1301     int use_copywin = FALSE;
   1302     int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
   1303     int rtn;
   1304 
   1305     switch (PyTuple_Size(args)) {
   1306     case 1:
   1307         if (!PyArg_ParseTuple(args, "O!;window object",
   1308                               &PyCursesWindow_Type, &temp))
   1309             return NULL;
   1310         break;
   1311     case 7:
   1312         if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
   1313                               &PyCursesWindow_Type, &temp, &sminrow, &smincol,
   1314                               &dminrow, &dmincol, &dmaxrow, &dmaxcol))
   1315             return NULL;
   1316         use_copywin = TRUE;
   1317         break;
   1318     default:
   1319         PyErr_SetString(PyExc_TypeError,
   1320                         "overlay requires one or seven arguments");
   1321         return NULL;
   1322     }
   1323 
   1324     if (use_copywin == TRUE) {
   1325         rtn = copywin(self->win, temp->win, sminrow, smincol,
   1326                       dminrow, dmincol, dmaxrow, dmaxcol, TRUE);
   1327         return PyCursesCheckERR(rtn, "copywin");
   1328     }
   1329     else {
   1330         rtn = overlay(self->win, temp->win);
   1331         return PyCursesCheckERR(rtn, "overlay");
   1332     }
   1333 }
   1334 
   1335 static PyObject *
   1336 PyCursesWindow_Overwrite(PyCursesWindowObject *self, PyObject *args)
   1337 {
   1338     PyCursesWindowObject *temp;
   1339     int use_copywin = FALSE;
   1340     int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
   1341     int rtn;
   1342 
   1343     switch (PyTuple_Size(args)) {
   1344     case 1:
   1345         if (!PyArg_ParseTuple(args, "O!;window object",
   1346                               &PyCursesWindow_Type, &temp))
   1347             return NULL;
   1348         break;
   1349     case 7:
   1350         if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
   1351                               &PyCursesWindow_Type, &temp, &sminrow, &smincol,
   1352                               &dminrow, &dmincol, &dmaxrow, &dmaxcol))
   1353             return NULL;
   1354         use_copywin = TRUE;
   1355         break;
   1356     default:
   1357         PyErr_SetString(PyExc_TypeError,
   1358                         "overwrite requires one or seven arguments");
   1359         return NULL;
   1360     }
   1361 
   1362     if (use_copywin == TRUE) {
   1363         rtn = copywin(self->win, temp->win, sminrow, smincol,
   1364                       dminrow, dmincol, dmaxrow, dmaxcol, FALSE);
   1365         return PyCursesCheckERR(rtn, "copywin");
   1366     }
   1367     else {
   1368         rtn = overwrite(self->win, temp->win);
   1369         return PyCursesCheckERR(rtn, "overwrite");
   1370     }
   1371 }
   1372 
   1373 static PyObject *
   1374 PyCursesWindow_PutWin(PyCursesWindowObject *self, PyObject *args)
   1375 {
   1376     PyObject *temp;
   1377 
   1378     if (!PyArg_ParseTuple(args, "O;fileobj", &temp))
   1379         return NULL;
   1380     if (!PyFile_Check(temp)) {
   1381         PyErr_SetString(PyExc_TypeError, "argument must be a file object");
   1382         return NULL;
   1383     }
   1384     return PyCursesCheckERR(putwin(self->win, PyFile_AsFile(temp)),
   1385                             "putwin");
   1386 }
   1387 
   1388 static PyObject *
   1389 PyCursesWindow_RedrawLine(PyCursesWindowObject *self, PyObject *args)
   1390 {
   1391     int beg, num;
   1392     if (!PyArg_ParseTuple(args, "ii;beg,num", &beg, &num))
   1393         return NULL;
   1394     return PyCursesCheckERR(wredrawln(self->win,beg,num), "redrawln");
   1395 }
   1396 
   1397 static PyObject *
   1398 PyCursesWindow_Refresh(PyCursesWindowObject *self, PyObject *args)
   1399 {
   1400     int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
   1401     int rtn;
   1402 
   1403 #ifndef py_is_pad
   1404     if (0)
   1405 #else
   1406         if (py_is_pad(self->win))
   1407 #endif
   1408         {
   1409             switch(PyTuple_Size(args)) {
   1410             case 6:
   1411                 if (!PyArg_ParseTuple(args,
   1412                                       "iiiiii;" \
   1413                                       "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
   1414                                       &pminrow, &pmincol, &sminrow,
   1415                                       &smincol, &smaxrow, &smaxcol))
   1416                     return NULL;
   1417 
   1418                 Py_BEGIN_ALLOW_THREADS
   1419                 rtn = prefresh(self->win,
   1420                                pminrow, pmincol, sminrow,
   1421                                smincol, smaxrow, smaxcol);
   1422                 Py_END_ALLOW_THREADS
   1423                 return PyCursesCheckERR(rtn, "prefresh");
   1424             default:
   1425                 PyErr_SetString(PyCursesError,
   1426                                 "refresh() for a pad requires 6 arguments");
   1427                 return NULL;
   1428             }
   1429         } else {
   1430             if (!PyArg_ParseTuple(args, ":refresh"))
   1431                 return NULL;
   1432             Py_BEGIN_ALLOW_THREADS
   1433             rtn = wrefresh(self->win);
   1434             Py_END_ALLOW_THREADS
   1435             return PyCursesCheckERR(rtn, "prefresh");
   1436         }
   1437 }
   1438 
   1439 static PyObject *
   1440 PyCursesWindow_SetScrollRegion(PyCursesWindowObject *self, PyObject *args)
   1441 {
   1442     int x, y;
   1443     if (!PyArg_ParseTuple(args,"ii;top, bottom",&y,&x))
   1444         return NULL;
   1445     return PyCursesCheckERR(wsetscrreg(self->win,y,x), "wsetscrreg");
   1446 }
   1447 
   1448 static PyObject *
   1449 PyCursesWindow_SubWin(PyCursesWindowObject *self, PyObject *args)
   1450 {
   1451     WINDOW *win;
   1452     int nlines, ncols, begin_y, begin_x;
   1453 
   1454     nlines = 0;
   1455     ncols  = 0;
   1456     switch (PyTuple_Size(args)) {
   1457     case 2:
   1458         if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
   1459             return NULL;
   1460         break;
   1461     case 4:
   1462         if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
   1463                               &nlines,&ncols,&begin_y,&begin_x))
   1464             return NULL;
   1465         break;
   1466     default:
   1467         PyErr_SetString(PyExc_TypeError, "subwin requires 2 or 4 arguments");
   1468         return NULL;
   1469     }
   1470 
   1471     /* printf("Subwin: %i %i %i %i   \n", nlines, ncols, begin_y, begin_x); */
   1472 #ifdef py_is_pad
   1473     if (py_is_pad(self->win)) {
   1474         win = subpad(self->win, nlines, ncols, begin_y, begin_x);
   1475     }
   1476     else
   1477 #endif
   1478         win = subwin(self->win, nlines, ncols, begin_y, begin_x);
   1479 
   1480     if (win == NULL) {
   1481         PyErr_SetString(PyCursesError, catchall_NULL);
   1482         return NULL;
   1483     }
   1484 
   1485     return (PyObject *)PyCursesWindow_New(win);
   1486 }
   1487 
   1488 static PyObject *
   1489 PyCursesWindow_Scroll(PyCursesWindowObject *self, PyObject *args)
   1490 {
   1491     int nlines;
   1492     switch(PyTuple_Size(args)) {
   1493     case 0:
   1494         return PyCursesCheckERR(scroll(self->win), "scroll");
   1495     case 1:
   1496         if (!PyArg_ParseTuple(args, "i;nlines", &nlines))
   1497             return NULL;
   1498         return PyCursesCheckERR(wscrl(self->win, nlines), "scroll");
   1499     default:
   1500         PyErr_SetString(PyExc_TypeError, "scroll requires 0 or 1 arguments");
   1501         return NULL;
   1502     }
   1503 }
   1504 
   1505 static PyObject *
   1506 PyCursesWindow_TouchLine(PyCursesWindowObject *self, PyObject *args)
   1507 {
   1508     int st, cnt, val;
   1509     switch (PyTuple_Size(args)) {
   1510     case 2:
   1511         if (!PyArg_ParseTuple(args,"ii;start,count",&st,&cnt))
   1512             return NULL;
   1513         return PyCursesCheckERR(touchline(self->win,st,cnt), "touchline");
   1514     case 3:
   1515         if (!PyArg_ParseTuple(args, "iii;start,count,val", &st, &cnt, &val))
   1516             return NULL;
   1517         return PyCursesCheckERR(wtouchln(self->win, st, cnt, val), "touchline");
   1518     default:
   1519         PyErr_SetString(PyExc_TypeError, "touchline requires 2 or 3 arguments");
   1520         return NULL;
   1521     }
   1522 }
   1523 
   1524 static PyObject *
   1525 PyCursesWindow_Vline(PyCursesWindowObject *self, PyObject *args)
   1526 {
   1527     PyObject *temp;
   1528     chtype ch;
   1529     int n, x, y, code = OK;
   1530     attr_t attr = A_NORMAL;
   1531     long lattr;
   1532 
   1533     switch (PyTuple_Size(args)) {
   1534     case 2:
   1535         if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
   1536             return NULL;
   1537         break;
   1538     case 3:
   1539         if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &lattr))
   1540             return NULL;
   1541         attr = lattr;
   1542         break;
   1543     case 4:
   1544         if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
   1545             return NULL;
   1546         code = wmove(self->win, y, x);
   1547         break;
   1548     case 5:
   1549         if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
   1550                               &y, &x, &temp, &n, &lattr))
   1551             return NULL;
   1552         attr = lattr;
   1553         code = wmove(self->win, y, x);
   1554         break;
   1555     default:
   1556         PyErr_SetString(PyExc_TypeError, "vline requires 2 to 5 arguments");
   1557         return NULL;
   1558     }
   1559 
   1560     if (code != ERR) {
   1561         if (!PyCurses_ConvertToChtype(temp, &ch)) {
   1562             PyErr_SetString(PyExc_TypeError,
   1563                             "argument 1 or 3 must be a ch or an int");
   1564             return NULL;
   1565         }
   1566         return PyCursesCheckERR(wvline(self->win, ch | attr, n), "vline");
   1567     } else
   1568         return PyCursesCheckERR(code, "wmove");
   1569 }
   1570 
   1571 static PyMethodDef PyCursesWindow_Methods[] = {
   1572     {"addch",           (PyCFunction)PyCursesWindow_AddCh, METH_VARARGS},
   1573     {"addnstr",         (PyCFunction)PyCursesWindow_AddNStr, METH_VARARGS},
   1574     {"addstr",          (PyCFunction)PyCursesWindow_AddStr, METH_VARARGS},
   1575     {"attroff",         (PyCFunction)PyCursesWindow_AttrOff, METH_VARARGS},
   1576     {"attron",          (PyCFunction)PyCursesWindow_AttrOn, METH_VARARGS},
   1577     {"attrset",         (PyCFunction)PyCursesWindow_AttrSet, METH_VARARGS},
   1578     {"bkgd",            (PyCFunction)PyCursesWindow_Bkgd, METH_VARARGS},
   1579 #ifdef HAVE_CURSES_WCHGAT
   1580     {"chgat",           (PyCFunction)PyCursesWindow_ChgAt, METH_VARARGS},
   1581 #endif
   1582     {"bkgdset",         (PyCFunction)PyCursesWindow_BkgdSet, METH_VARARGS},
   1583     {"border",          (PyCFunction)PyCursesWindow_Border, METH_VARARGS},
   1584     {"box",             (PyCFunction)PyCursesWindow_Box, METH_VARARGS},
   1585     {"clear",           (PyCFunction)PyCursesWindow_wclear, METH_NOARGS},
   1586     {"clearok",         (PyCFunction)PyCursesWindow_clearok, METH_VARARGS},
   1587     {"clrtobot",        (PyCFunction)PyCursesWindow_wclrtobot, METH_NOARGS},
   1588     {"clrtoeol",        (PyCFunction)PyCursesWindow_wclrtoeol, METH_NOARGS},
   1589     {"cursyncup",       (PyCFunction)PyCursesWindow_wcursyncup, METH_NOARGS},
   1590     {"delch",           (PyCFunction)PyCursesWindow_DelCh, METH_VARARGS},
   1591     {"deleteln",        (PyCFunction)PyCursesWindow_wdeleteln, METH_NOARGS},
   1592     {"derwin",          (PyCFunction)PyCursesWindow_DerWin, METH_VARARGS},
   1593     {"echochar",        (PyCFunction)PyCursesWindow_EchoChar, METH_VARARGS},
   1594 #ifdef NCURSES_MOUSE_VERSION
   1595     {"enclose",         (PyCFunction)PyCursesWindow_Enclose, METH_VARARGS},
   1596 #endif
   1597     {"erase",           (PyCFunction)PyCursesWindow_werase, METH_NOARGS},
   1598     {"getbegyx",        (PyCFunction)PyCursesWindow_getbegyx, METH_NOARGS},
   1599     {"getbkgd",         (PyCFunction)PyCursesWindow_GetBkgd, METH_NOARGS},
   1600     {"getch",           (PyCFunction)PyCursesWindow_GetCh, METH_VARARGS},
   1601     {"getkey",          (PyCFunction)PyCursesWindow_GetKey, METH_VARARGS},
   1602     {"getmaxyx",        (PyCFunction)PyCursesWindow_getmaxyx, METH_NOARGS},
   1603     {"getparyx",        (PyCFunction)PyCursesWindow_getparyx, METH_NOARGS},
   1604     {"getstr",          (PyCFunction)PyCursesWindow_GetStr, METH_VARARGS},
   1605     {"getyx",           (PyCFunction)PyCursesWindow_getyx, METH_NOARGS},
   1606     {"hline",           (PyCFunction)PyCursesWindow_Hline, METH_VARARGS},
   1607     {"idcok",           (PyCFunction)PyCursesWindow_idcok, METH_VARARGS},
   1608     {"idlok",           (PyCFunction)PyCursesWindow_idlok, METH_VARARGS},
   1609 #ifdef HAVE_CURSES_IMMEDOK
   1610     {"immedok",         (PyCFunction)PyCursesWindow_immedok, METH_VARARGS},
   1611 #endif
   1612     {"inch",            (PyCFunction)PyCursesWindow_InCh, METH_VARARGS},
   1613     {"insch",           (PyCFunction)PyCursesWindow_InsCh, METH_VARARGS},
   1614     {"insdelln",        (PyCFunction)PyCursesWindow_winsdelln, METH_VARARGS},
   1615     {"insertln",        (PyCFunction)PyCursesWindow_winsertln, METH_NOARGS},
   1616     {"insnstr",         (PyCFunction)PyCursesWindow_InsNStr, METH_VARARGS},
   1617     {"insstr",          (PyCFunction)PyCursesWindow_InsStr, METH_VARARGS},
   1618     {"instr",           (PyCFunction)PyCursesWindow_InStr, METH_VARARGS},
   1619     {"is_linetouched",  (PyCFunction)PyCursesWindow_Is_LineTouched, METH_VARARGS},
   1620     {"is_wintouched",   (PyCFunction)PyCursesWindow_is_wintouched, METH_NOARGS},
   1621     {"keypad",          (PyCFunction)PyCursesWindow_keypad, METH_VARARGS},
   1622     {"leaveok",         (PyCFunction)PyCursesWindow_leaveok, METH_VARARGS},
   1623     {"move",            (PyCFunction)PyCursesWindow_wmove, METH_VARARGS},
   1624     {"mvderwin",        (PyCFunction)PyCursesWindow_mvderwin, METH_VARARGS},
   1625     {"mvwin",           (PyCFunction)PyCursesWindow_mvwin, METH_VARARGS},
   1626     {"nodelay",         (PyCFunction)PyCursesWindow_nodelay, METH_VARARGS},
   1627     {"notimeout",       (PyCFunction)PyCursesWindow_notimeout, METH_VARARGS},
   1628     {"noutrefresh",     (PyCFunction)PyCursesWindow_NoOutRefresh, METH_VARARGS},
   1629     /* Backward compatibility alias -- remove in Python 2.3 */
   1630     {"nooutrefresh",    (PyCFunction)PyCursesWindow_NoOutRefresh, METH_VARARGS},
   1631     {"overlay",         (PyCFunction)PyCursesWindow_Overlay, METH_VARARGS},
   1632     {"overwrite",       (PyCFunction)PyCursesWindow_Overwrite,
   1633      METH_VARARGS},
   1634     {"putwin",          (PyCFunction)PyCursesWindow_PutWin, METH_VARARGS},
   1635     {"redrawln",        (PyCFunction)PyCursesWindow_RedrawLine, METH_VARARGS},
   1636     {"redrawwin",       (PyCFunction)PyCursesWindow_redrawwin, METH_NOARGS},
   1637     {"refresh",         (PyCFunction)PyCursesWindow_Refresh, METH_VARARGS},
   1638 #ifndef STRICT_SYSV_CURSES
   1639     {"resize",          (PyCFunction)PyCursesWindow_wresize, METH_VARARGS},
   1640 #endif
   1641     {"scroll",          (PyCFunction)PyCursesWindow_Scroll, METH_VARARGS},
   1642     {"scrollok",        (PyCFunction)PyCursesWindow_scrollok, METH_VARARGS},
   1643     {"setscrreg",       (PyCFunction)PyCursesWindow_SetScrollRegion, METH_VARARGS},
   1644     {"standend",        (PyCFunction)PyCursesWindow_wstandend, METH_NOARGS},
   1645     {"standout",        (PyCFunction)PyCursesWindow_wstandout, METH_NOARGS},
   1646     {"subpad",          (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
   1647     {"subwin",          (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
   1648     {"syncdown",        (PyCFunction)PyCursesWindow_wsyncdown, METH_NOARGS},
   1649 #ifdef HAVE_CURSES_SYNCOK
   1650     {"syncok",          (PyCFunction)PyCursesWindow_syncok, METH_VARARGS},
   1651 #endif
   1652     {"syncup",          (PyCFunction)PyCursesWindow_wsyncup, METH_NOARGS},
   1653     {"timeout",         (PyCFunction)PyCursesWindow_wtimeout, METH_VARARGS},
   1654     {"touchline",       (PyCFunction)PyCursesWindow_TouchLine, METH_VARARGS},
   1655     {"touchwin",        (PyCFunction)PyCursesWindow_touchwin, METH_NOARGS},
   1656     {"untouchwin",      (PyCFunction)PyCursesWindow_untouchwin, METH_NOARGS},
   1657     {"vline",           (PyCFunction)PyCursesWindow_Vline, METH_VARARGS},
   1658     {NULL,                  NULL}   /* sentinel */
   1659 };
   1660 
   1661 static PyObject *
   1662 PyCursesWindow_GetAttr(PyCursesWindowObject *self, char *name)
   1663 {
   1664     return Py_FindMethod(PyCursesWindow_Methods, (PyObject *)self, name);
   1665 }
   1666 
   1667 /* -------------------------------------------------------*/
   1668 
   1669 PyTypeObject PyCursesWindow_Type = {
   1670     PyVarObject_HEAD_INIT(NULL, 0)
   1671     "_curses.curses window",            /*tp_name*/
   1672     sizeof(PyCursesWindowObject),       /*tp_basicsize*/
   1673     0,                          /*tp_itemsize*/
   1674     /* methods */
   1675     (destructor)PyCursesWindow_Dealloc, /*tp_dealloc*/
   1676     0,                          /*tp_print*/
   1677     (getattrfunc)PyCursesWindow_GetAttr, /*tp_getattr*/
   1678     (setattrfunc)0, /*tp_setattr*/
   1679     0,                          /*tp_compare*/
   1680     0,                          /*tp_repr*/
   1681     0,                          /*tp_as_number*/
   1682     0,                          /*tp_as_sequence*/
   1683     0,                          /*tp_as_mapping*/
   1684     0,                          /*tp_hash*/
   1685 };
   1686 
   1687 /*********************************************************************
   1688  Global Functions
   1689 **********************************************************************/
   1690 
   1691 NoArgNoReturnFunction(beep)
   1692 NoArgNoReturnFunction(def_prog_mode)
   1693 NoArgNoReturnFunction(def_shell_mode)
   1694 NoArgNoReturnFunction(doupdate)
   1695 NoArgNoReturnFunction(endwin)
   1696 NoArgNoReturnFunction(flash)
   1697 NoArgNoReturnFunction(nocbreak)
   1698 NoArgNoReturnFunction(noecho)
   1699 NoArgNoReturnFunction(nonl)
   1700 NoArgNoReturnFunction(noraw)
   1701 NoArgNoReturnFunction(reset_prog_mode)
   1702 NoArgNoReturnFunction(reset_shell_mode)
   1703 NoArgNoReturnFunction(resetty)
   1704 NoArgNoReturnFunction(savetty)
   1705 
   1706 NoArgOrFlagNoReturnFunction(cbreak)
   1707 NoArgOrFlagNoReturnFunction(echo)
   1708 NoArgOrFlagNoReturnFunction(nl)
   1709 NoArgOrFlagNoReturnFunction(raw)
   1710 
   1711 NoArgReturnIntFunction(baudrate)
   1712 NoArgReturnIntFunction(termattrs)
   1713 
   1714 NoArgReturnStringFunction(termname)
   1715 NoArgReturnStringFunction(longname)
   1716 
   1717 NoArgTrueFalseFunction(can_change_color)
   1718 NoArgTrueFalseFunction(has_colors)
   1719 NoArgTrueFalseFunction(has_ic)
   1720 NoArgTrueFalseFunction(has_il)
   1721 NoArgTrueFalseFunction(isendwin)
   1722 NoArgNoReturnVoidFunction(flushinp)
   1723 NoArgNoReturnVoidFunction(noqiflush)
   1724 
   1725 #ifdef HAVE_CURSES_FILTER
   1726 static PyObject *
   1727 PyCurses_filter(PyObject *self)
   1728 {
   1729     /* not checking for PyCursesInitialised here since filter() must
   1730        be called before initscr() */
   1731     filter();
   1732     Py_INCREF(Py_None);
   1733     return Py_None;
   1734 }
   1735 #endif
   1736 
   1737 static PyObject *
   1738 PyCurses_Color_Content(PyObject *self, PyObject *args)
   1739 {
   1740     short color,r,g,b;
   1741 
   1742     PyCursesInitialised;
   1743     PyCursesInitialisedColor;
   1744 
   1745     if (!PyArg_ParseTuple(args, "h:color_content", &color)) return NULL;
   1746 
   1747     if (color_content(color, &r, &g, &b) != ERR)
   1748         return Py_BuildValue("(iii)", r, g, b);
   1749     else {
   1750         PyErr_SetString(PyCursesError,
   1751                         "Argument 1 was out of range. Check value of COLORS.");
   1752         return NULL;
   1753     }
   1754 }
   1755 
   1756 static PyObject *
   1757 PyCurses_color_pair(PyObject *self, PyObject *args)
   1758 {
   1759     int n;
   1760 
   1761     PyCursesInitialised;
   1762     PyCursesInitialisedColor;
   1763 
   1764     if (!PyArg_ParseTuple(args, "i:color_pair", &n)) return NULL;
   1765     return PyInt_FromLong((long) (n << 8));
   1766 }
   1767 
   1768 static PyObject *
   1769 PyCurses_Curs_Set(PyObject *self, PyObject *args)
   1770 {
   1771     int vis,erg;
   1772 
   1773     PyCursesInitialised;
   1774 
   1775     if (!PyArg_ParseTuple(args, "i:curs_set", &vis)) return NULL;
   1776 
   1777     erg = curs_set(vis);
   1778     if (erg == ERR) return PyCursesCheckERR(erg, "curs_set");
   1779 
   1780     return PyInt_FromLong((long) erg);
   1781 }
   1782 
   1783 static PyObject *
   1784 PyCurses_Delay_Output(PyObject *self, PyObject *args)
   1785 {
   1786     int ms;
   1787 
   1788     PyCursesInitialised;
   1789 
   1790     if (!PyArg_ParseTuple(args, "i:delay_output", &ms)) return NULL;
   1791 
   1792     return PyCursesCheckERR(delay_output(ms), "delay_output");
   1793 }
   1794 
   1795 static PyObject *
   1796 PyCurses_EraseChar(PyObject *self)
   1797 {
   1798     char ch;
   1799 
   1800     PyCursesInitialised;
   1801 
   1802     ch = erasechar();
   1803 
   1804     return PyString_FromStringAndSize(&ch, 1);
   1805 }
   1806 
   1807 #ifdef getsyx
   1808 static PyObject *
   1809 PyCurses_getsyx(PyObject *self)
   1810 {
   1811     int x = 0;
   1812     int y = 0;
   1813 
   1814     PyCursesInitialised;
   1815 
   1816     getsyx(y, x);
   1817 
   1818     return Py_BuildValue("(ii)", y, x);
   1819 }
   1820 #endif
   1821 
   1822 #ifdef NCURSES_MOUSE_VERSION
   1823 static PyObject *
   1824 PyCurses_GetMouse(PyObject *self)
   1825 {
   1826     int rtn;
   1827     MEVENT event;
   1828 
   1829     PyCursesInitialised;
   1830 
   1831     rtn = getmouse( &event );
   1832     if (rtn == ERR) {
   1833         PyErr_SetString(PyCursesError, "getmouse() returned ERR");
   1834         return NULL;
   1835     }
   1836     return Py_BuildValue("(hiiik)",
   1837                          (short)event.id,
   1838                          (int)event.x, (int)event.y, (int)event.z,
   1839                          (unsigned long) event.bstate);
   1840 }
   1841 
   1842 static PyObject *
   1843 PyCurses_UngetMouse(PyObject *self, PyObject *args)
   1844 {
   1845     MEVENT event;
   1846     short id;
   1847     int x, y, z;
   1848     unsigned long bstate;
   1849 
   1850     PyCursesInitialised;
   1851     if (!PyArg_ParseTuple(args, "hiiik",
   1852                           &id, &x, &y, &z, &bstate))
   1853         return NULL;
   1854 
   1855     event.id = id;
   1856     event.x = x;
   1857     event.y = y;
   1858     event.z = z;
   1859     event.bstate = bstate;
   1860     return PyCursesCheckERR(ungetmouse(&event), "ungetmouse");
   1861 }
   1862 #endif
   1863 
   1864 static PyObject *
   1865 PyCurses_GetWin(PyCursesWindowObject *self, PyObject *temp)
   1866 {
   1867     WINDOW *win;
   1868 
   1869     PyCursesInitialised;
   1870 
   1871     if (!PyFile_Check(temp)) {
   1872         PyErr_SetString(PyExc_TypeError, "argument must be a file object");
   1873         return NULL;
   1874     }
   1875 
   1876     win = getwin(PyFile_AsFile(temp));
   1877 
   1878     if (win == NULL) {
   1879         PyErr_SetString(PyCursesError, catchall_NULL);
   1880         return NULL;
   1881     }
   1882 
   1883     return PyCursesWindow_New(win);
   1884 }
   1885 
   1886 static PyObject *
   1887 PyCurses_HalfDelay(PyObject *self, PyObject *args)
   1888 {
   1889     unsigned char tenths;
   1890 
   1891     PyCursesInitialised;
   1892 
   1893     if (!PyArg_ParseTuple(args, "b:halfdelay", &tenths)) return NULL;
   1894 
   1895     return PyCursesCheckERR(halfdelay(tenths), "halfdelay");
   1896 }
   1897 
   1898 #ifdef HAVE_CURSES_HAS_KEY
   1899 static PyObject *
   1900 PyCurses_has_key(PyObject *self, PyObject *args)
   1901 {
   1902     int ch;
   1903 
   1904     PyCursesInitialised;
   1905 
   1906     if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
   1907 
   1908     if (has_key(ch) == FALSE) {
   1909         Py_INCREF(Py_False);
   1910         return Py_False;
   1911     }
   1912     Py_INCREF(Py_True);
   1913     return Py_True;
   1914 }
   1915 #endif
   1916 
   1917 static PyObject *
   1918 PyCurses_Init_Color(PyObject *self, PyObject *args)
   1919 {
   1920     short color, r, g, b;
   1921 
   1922     PyCursesInitialised;
   1923     PyCursesInitialisedColor;
   1924 
   1925     switch(PyTuple_Size(args)) {
   1926     case 4:
   1927         if (!PyArg_ParseTuple(args, "hhhh;color,r,g,b", &color, &r, &g, &b)) return NULL;
   1928         break;
   1929     default:
   1930         PyErr_SetString(PyExc_TypeError, "init_color requires 4 arguments");
   1931         return NULL;
   1932     }
   1933 
   1934     return PyCursesCheckERR(init_color(color, r, g, b), "init_color");
   1935 }
   1936 
   1937 static PyObject *
   1938 PyCurses_Init_Pair(PyObject *self, PyObject *args)
   1939 {
   1940     short pair, f, b;
   1941 
   1942     PyCursesInitialised;
   1943     PyCursesInitialisedColor;
   1944 
   1945     if (PyTuple_Size(args) != 3) {
   1946         PyErr_SetString(PyExc_TypeError, "init_pair requires 3 arguments");
   1947         return NULL;
   1948     }
   1949 
   1950     if (!PyArg_ParseTuple(args, "hhh;pair, f, b", &pair, &f, &b)) return NULL;
   1951 
   1952     return PyCursesCheckERR(init_pair(pair, f, b), "init_pair");
   1953 }
   1954 
   1955 static PyObject *ModDict;
   1956 
   1957 static PyObject *
   1958 PyCurses_InitScr(PyObject *self)
   1959 {
   1960     WINDOW *win;
   1961 
   1962     if (initialised == TRUE) {
   1963         wrefresh(stdscr);
   1964         return (PyObject *)PyCursesWindow_New(stdscr);
   1965     }
   1966 
   1967     win = initscr();
   1968 
   1969     if (win == NULL) {
   1970         PyErr_SetString(PyCursesError, catchall_NULL);
   1971         return NULL;
   1972     }
   1973 
   1974     initialised = initialised_setupterm = TRUE;
   1975 
   1976 /* This was moved from initcurses() because it core dumped on SGI,
   1977    where they're not defined until you've called initscr() */
   1978 #define SetDictInt(string,ch)                                           \
   1979     do {                                                                \
   1980         PyObject *o = PyInt_FromLong((long) (ch));                      \
   1981         if (o && PyDict_SetItemString(ModDict, string, o) == 0)     {   \
   1982             Py_DECREF(o);                                               \
   1983         }                                                               \
   1984     } while (0)
   1985 
   1986     /* Here are some graphic symbols you can use */
   1987     SetDictInt("ACS_ULCORNER",      (ACS_ULCORNER));
   1988     SetDictInt("ACS_LLCORNER",      (ACS_LLCORNER));
   1989     SetDictInt("ACS_URCORNER",      (ACS_URCORNER));
   1990     SetDictInt("ACS_LRCORNER",      (ACS_LRCORNER));
   1991     SetDictInt("ACS_LTEE",          (ACS_LTEE));
   1992     SetDictInt("ACS_RTEE",          (ACS_RTEE));
   1993     SetDictInt("ACS_BTEE",          (ACS_BTEE));
   1994     SetDictInt("ACS_TTEE",          (ACS_TTEE));
   1995     SetDictInt("ACS_HLINE",         (ACS_HLINE));
   1996     SetDictInt("ACS_VLINE",         (ACS_VLINE));
   1997     SetDictInt("ACS_PLUS",          (ACS_PLUS));
   1998 #if !defined(__hpux) || defined(HAVE_NCURSES_H)
   1999     /* On HP/UX 11, these are of type cchar_t, which is not an
   2000        integral type. If this is a problem on more platforms, a
   2001        configure test should be added to determine whether ACS_S1
   2002        is of integral type. */
   2003     SetDictInt("ACS_S1",            (ACS_S1));
   2004     SetDictInt("ACS_S9",            (ACS_S9));
   2005     SetDictInt("ACS_DIAMOND",       (ACS_DIAMOND));
   2006     SetDictInt("ACS_CKBOARD",       (ACS_CKBOARD));
   2007     SetDictInt("ACS_DEGREE",        (ACS_DEGREE));
   2008     SetDictInt("ACS_PLMINUS",       (ACS_PLMINUS));
   2009     SetDictInt("ACS_BULLET",        (ACS_BULLET));
   2010     SetDictInt("ACS_LARROW",        (ACS_LARROW));
   2011     SetDictInt("ACS_RARROW",        (ACS_RARROW));
   2012     SetDictInt("ACS_DARROW",        (ACS_DARROW));
   2013     SetDictInt("ACS_UARROW",        (ACS_UARROW));
   2014     SetDictInt("ACS_BOARD",         (ACS_BOARD));
   2015     SetDictInt("ACS_LANTERN",       (ACS_LANTERN));
   2016     SetDictInt("ACS_BLOCK",         (ACS_BLOCK));
   2017 #endif
   2018     SetDictInt("ACS_BSSB",          (ACS_ULCORNER));
   2019     SetDictInt("ACS_SSBB",          (ACS_LLCORNER));
   2020     SetDictInt("ACS_BBSS",          (ACS_URCORNER));
   2021     SetDictInt("ACS_SBBS",          (ACS_LRCORNER));
   2022     SetDictInt("ACS_SBSS",          (ACS_RTEE));
   2023     SetDictInt("ACS_SSSB",          (ACS_LTEE));
   2024     SetDictInt("ACS_SSBS",          (ACS_BTEE));
   2025     SetDictInt("ACS_BSSS",          (ACS_TTEE));
   2026     SetDictInt("ACS_BSBS",          (ACS_HLINE));
   2027     SetDictInt("ACS_SBSB",          (ACS_VLINE));
   2028     SetDictInt("ACS_SSSS",          (ACS_PLUS));
   2029 
   2030     /* The following are never available with strict SYSV curses */
   2031 #ifdef ACS_S3
   2032     SetDictInt("ACS_S3",            (ACS_S3));
   2033 #endif
   2034 #ifdef ACS_S7
   2035     SetDictInt("ACS_S7",            (ACS_S7));
   2036 #endif
   2037 #ifdef ACS_LEQUAL
   2038     SetDictInt("ACS_LEQUAL",        (ACS_LEQUAL));
   2039 #endif
   2040 #ifdef ACS_GEQUAL
   2041     SetDictInt("ACS_GEQUAL",        (ACS_GEQUAL));
   2042 #endif
   2043 #ifdef ACS_PI
   2044     SetDictInt("ACS_PI",            (ACS_PI));
   2045 #endif
   2046 #ifdef ACS_NEQUAL
   2047     SetDictInt("ACS_NEQUAL",        (ACS_NEQUAL));
   2048 #endif
   2049 #ifdef ACS_STERLING
   2050     SetDictInt("ACS_STERLING",      (ACS_STERLING));
   2051 #endif
   2052 
   2053     SetDictInt("LINES", LINES);
   2054     SetDictInt("COLS", COLS);
   2055 
   2056     return (PyObject *)PyCursesWindow_New(win);
   2057 }
   2058 
   2059 static PyObject *
   2060 PyCurses_setupterm(PyObject* self, PyObject *args, PyObject* keywds)
   2061 {
   2062     int fd = -1;
   2063     int err;
   2064     char* termstr = NULL;
   2065 
   2066     static char *kwlist[] = {"term", "fd", NULL};
   2067 
   2068     if (!PyArg_ParseTupleAndKeywords(
   2069             args, keywds, "|zi:setupterm", kwlist, &termstr, &fd)) {
   2070         return NULL;
   2071     }
   2072 
   2073     if (fd == -1) {
   2074         PyObject* sys_stdout;
   2075 
   2076         sys_stdout = PySys_GetObject("stdout");
   2077 
   2078         if (sys_stdout == NULL) {
   2079             PyErr_SetString(
   2080                 PyCursesError,
   2081                 "lost sys.stdout");
   2082             return NULL;
   2083         }
   2084 
   2085         fd = PyObject_AsFileDescriptor(sys_stdout);
   2086 
   2087         if (fd == -1) {
   2088             return NULL;
   2089         }
   2090     }
   2091 
   2092     if (!initialised_setupterm && setupterm(termstr,fd,&err) == ERR) {
   2093         char* s = "setupterm: unknown error";
   2094 
   2095         if (err == 0) {
   2096             s = "setupterm: could not find terminal";
   2097         } else if (err == -1) {
   2098             s = "setupterm: could not find terminfo database";
   2099         }
   2100 
   2101         PyErr_SetString(PyCursesError,s);
   2102         return NULL;
   2103     }
   2104 
   2105     initialised_setupterm = TRUE;
   2106 
   2107     Py_INCREF(Py_None);
   2108     return Py_None;
   2109 }
   2110 
   2111 static PyObject *
   2112 PyCurses_IntrFlush(PyObject *self, PyObject *args)
   2113 {
   2114     int ch;
   2115 
   2116     PyCursesInitialised;
   2117 
   2118     switch(PyTuple_Size(args)) {
   2119     case 1:
   2120         if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
   2121         break;
   2122     default:
   2123         PyErr_SetString(PyExc_TypeError, "intrflush requires 1 argument");
   2124         return NULL;
   2125     }
   2126 
   2127     return PyCursesCheckERR(intrflush(NULL,ch), "intrflush");
   2128 }
   2129 
   2130 #ifdef HAVE_CURSES_IS_TERM_RESIZED
   2131 static PyObject *
   2132 PyCurses_Is_Term_Resized(PyObject *self, PyObject *args)
   2133 {
   2134     int lines;
   2135     int columns;
   2136     int result;
   2137 
   2138     PyCursesInitialised;
   2139 
   2140     if (!PyArg_ParseTuple(args,"ii:is_term_resized", &lines, &columns))
   2141         return NULL;
   2142     result = is_term_resized(lines, columns);
   2143     if (result == TRUE) {
   2144         Py_INCREF(Py_True);
   2145         return Py_True;
   2146     } else {
   2147         Py_INCREF(Py_False);
   2148         return Py_False;
   2149     }
   2150 }
   2151 #endif /* HAVE_CURSES_IS_TERM_RESIZED */
   2152 
   2153 static PyObject *
   2154 PyCurses_KeyName(PyObject *self, PyObject *args)
   2155 {
   2156     const char *knp;
   2157     int ch;
   2158 
   2159     PyCursesInitialised;
   2160 
   2161     if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
   2162 
   2163     if (ch < 0) {
   2164         PyErr_SetString(PyExc_ValueError, "invalid key number");
   2165         return NULL;
   2166     }
   2167     knp = keyname(ch);
   2168 
   2169     return PyString_FromString((knp == NULL) ? "" : (char *)knp);
   2170 }
   2171 
   2172 static PyObject *
   2173 PyCurses_KillChar(PyObject *self)
   2174 {
   2175     char ch;
   2176 
   2177     ch = killchar();
   2178 
   2179     return PyString_FromStringAndSize(&ch, 1);
   2180 }
   2181 
   2182 static PyObject *
   2183 PyCurses_Meta(PyObject *self, PyObject *args)
   2184 {
   2185     int ch;
   2186 
   2187     PyCursesInitialised;
   2188 
   2189     switch(PyTuple_Size(args)) {
   2190     case 1:
   2191         if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
   2192         break;
   2193     default:
   2194         PyErr_SetString(PyExc_TypeError, "meta requires 1 argument");
   2195         return NULL;
   2196     }
   2197 
   2198     return PyCursesCheckERR(meta(stdscr, ch), "meta");
   2199 }
   2200 
   2201 #ifdef NCURSES_MOUSE_VERSION
   2202 static PyObject *
   2203 PyCurses_MouseInterval(PyObject *self, PyObject *args)
   2204 {
   2205     int interval;
   2206     PyCursesInitialised;
   2207 
   2208     if (!PyArg_ParseTuple(args,"i;interval",&interval))
   2209         return NULL;
   2210     return PyCursesCheckERR(mouseinterval(interval), "mouseinterval");
   2211 }
   2212 
   2213 static PyObject *
   2214 PyCurses_MouseMask(PyObject *self, PyObject *args)
   2215 {
   2216     unsigned long newmask;
   2217     mmask_t oldmask, availmask;
   2218 
   2219     PyCursesInitialised;
   2220     if (!PyArg_ParseTuple(args,"k;mousemask",&newmask))
   2221         return NULL;
   2222     availmask = mousemask((mmask_t)newmask, &oldmask);
   2223     return Py_BuildValue("(kk)",
   2224                          (unsigned long)availmask, (unsigned long)oldmask);
   2225 }
   2226 #endif
   2227 
   2228 static PyObject *
   2229 PyCurses_Napms(PyObject *self, PyObject *args)
   2230 {
   2231     int ms;
   2232 
   2233     PyCursesInitialised;
   2234     if (!PyArg_ParseTuple(args, "i;ms", &ms)) return NULL;
   2235 
   2236     return Py_BuildValue("i", napms(ms));
   2237 }
   2238 
   2239 
   2240 static PyObject *
   2241 PyCurses_NewPad(PyObject *self, PyObject *args)
   2242 {
   2243     WINDOW *win;
   2244     int nlines, ncols;
   2245 
   2246     PyCursesInitialised;
   2247 
   2248     if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols)) return NULL;
   2249 
   2250     win = newpad(nlines, ncols);
   2251 
   2252     if (win == NULL) {
   2253         PyErr_SetString(PyCursesError, catchall_NULL);
   2254         return NULL;
   2255     }
   2256 
   2257     return (PyObject *)PyCursesWindow_New(win);
   2258 }
   2259 
   2260 static PyObject *
   2261 PyCurses_NewWindow(PyObject *self, PyObject *args)
   2262 {
   2263     WINDOW *win;
   2264     int nlines, ncols, begin_y=0, begin_x=0;
   2265 
   2266     PyCursesInitialised;
   2267 
   2268     switch (PyTuple_Size(args)) {
   2269     case 2:
   2270         if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols))
   2271             return NULL;
   2272         break;
   2273     case 4:
   2274         if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
   2275                               &nlines,&ncols,&begin_y,&begin_x))
   2276             return NULL;
   2277         break;
   2278     default:
   2279         PyErr_SetString(PyExc_TypeError, "newwin requires 2 or 4 arguments");
   2280         return NULL;
   2281     }
   2282 
   2283     win = newwin(nlines,ncols,begin_y,begin_x);
   2284     if (win == NULL) {
   2285         PyErr_SetString(PyCursesError, catchall_NULL);
   2286         return NULL;
   2287     }
   2288 
   2289     return (PyObject *)PyCursesWindow_New(win);
   2290 }
   2291 
   2292 static PyObject *
   2293 PyCurses_Pair_Content(PyObject *self, PyObject *args)
   2294 {
   2295     short pair,f,b;
   2296 
   2297     PyCursesInitialised;
   2298     PyCursesInitialisedColor;
   2299 
   2300     switch(PyTuple_Size(args)) {
   2301     case 1:
   2302         if (!PyArg_ParseTuple(args, "h;pair", &pair)) return NULL;
   2303         break;
   2304     default:
   2305         PyErr_SetString(PyExc_TypeError, "pair_content requires 1 argument");
   2306         return NULL;
   2307     }
   2308 
   2309     if (pair_content(pair, &f, &b)==ERR) {
   2310         PyErr_SetString(PyCursesError,
   2311                         "Argument 1 was out of range. (1..COLOR_PAIRS-1)");
   2312         return NULL;
   2313     }
   2314 
   2315     return Py_BuildValue("(ii)", f, b);
   2316 }
   2317 
   2318 static PyObject *
   2319 PyCurses_pair_number(PyObject *self, PyObject *args)
   2320 {
   2321     int n;
   2322 
   2323     PyCursesInitialised;
   2324     PyCursesInitialisedColor;
   2325 
   2326     switch(PyTuple_Size(args)) {
   2327     case 1:
   2328         if (!PyArg_ParseTuple(args, "i;pairvalue", &n)) return NULL;
   2329         break;
   2330     default:
   2331         PyErr_SetString(PyExc_TypeError,
   2332                         "pair_number requires 1 argument");
   2333         return NULL;
   2334     }
   2335 
   2336     return PyInt_FromLong((long) ((n & A_COLOR) >> 8));
   2337 }
   2338 
   2339 static PyObject *
   2340 PyCurses_Putp(PyObject *self, PyObject *args)
   2341 {
   2342     char *str;
   2343 
   2344     if (!PyArg_ParseTuple(args,"s;str", &str)) return NULL;
   2345     return PyCursesCheckERR(putp(str), "putp");
   2346 }
   2347 
   2348 static PyObject *
   2349 PyCurses_QiFlush(PyObject *self, PyObject *args)
   2350 {
   2351     int flag = 0;
   2352 
   2353     PyCursesInitialised;
   2354 
   2355     switch(PyTuple_Size(args)) {
   2356     case 0:
   2357         qiflush();
   2358         Py_INCREF(Py_None);
   2359         return Py_None;
   2360     case 1:
   2361         if (!PyArg_ParseTuple(args, "i;True(1) or False(0)", &flag)) return NULL;
   2362         if (flag) qiflush();
   2363         else noqiflush();
   2364         Py_INCREF(Py_None);
   2365         return Py_None;
   2366     default:
   2367         PyErr_SetString(PyExc_TypeError, "qiflush requires 0 or 1 arguments");
   2368         return NULL;
   2369     }
   2370 }
   2371 
   2372 /* Internal helper used for updating curses.LINES, curses.COLS, _curses.LINES
   2373  * and _curses.COLS */
   2374 #if defined(HAVE_CURSES_RESIZETERM) || defined(HAVE_CURSES_RESIZE_TERM)
   2375 static int
   2376 update_lines_cols(void)
   2377 {
   2378     PyObject *o;
   2379     PyObject *m = PyImport_ImportModuleNoBlock("curses");
   2380 
   2381     if (!m)
   2382         return 0;
   2383 
   2384     o = PyInt_FromLong(LINES);
   2385     if (!o) {
   2386         Py_DECREF(m);
   2387         return 0;
   2388     }
   2389     if (PyObject_SetAttrString(m, "LINES", o)) {
   2390         Py_DECREF(m);
   2391         Py_DECREF(o);
   2392         return 0;
   2393     }
   2394     if (PyDict_SetItemString(ModDict, "LINES", o)) {
   2395         Py_DECREF(m);
   2396         Py_DECREF(o);
   2397         return 0;
   2398     }
   2399     Py_DECREF(o);
   2400     o = PyInt_FromLong(COLS);
   2401     if (!o) {
   2402         Py_DECREF(m);
   2403         return 0;
   2404     }
   2405     if (PyObject_SetAttrString(m, "COLS", o)) {
   2406         Py_DECREF(m);
   2407         Py_DECREF(o);
   2408         return 0;
   2409     }
   2410     if (PyDict_SetItemString(ModDict, "COLS", o)) {
   2411         Py_DECREF(m);
   2412         Py_DECREF(o);
   2413         return 0;
   2414     }
   2415     Py_DECREF(o);
   2416     Py_DECREF(m);
   2417     return 1;
   2418 }
   2419 #endif
   2420 
   2421 #ifdef HAVE_CURSES_RESIZETERM
   2422 static PyObject *
   2423 PyCurses_ResizeTerm(PyObject *self, PyObject *args)
   2424 {
   2425     int lines;
   2426     int columns;
   2427     PyObject *result;
   2428 
   2429     PyCursesInitialised;
   2430 
   2431     if (!PyArg_ParseTuple(args,"ii:resizeterm", &lines, &columns))
   2432         return NULL;
   2433 
   2434     result = PyCursesCheckERR(resizeterm(lines, columns), "resizeterm");
   2435     if (!result)
   2436         return NULL;
   2437     if (!update_lines_cols())
   2438         return NULL;
   2439     return result;
   2440 }
   2441 
   2442 #endif
   2443 
   2444 #ifdef HAVE_CURSES_RESIZE_TERM
   2445 static PyObject *
   2446 PyCurses_Resize_Term(PyObject *self, PyObject *args)
   2447 {
   2448     int lines;
   2449     int columns;
   2450 
   2451     PyObject *result;
   2452 
   2453     PyCursesInitialised;
   2454 
   2455     if (!PyArg_ParseTuple(args,"ii:resize_term", &lines, &columns))
   2456         return NULL;
   2457 
   2458     result = PyCursesCheckERR(resize_term(lines, columns), "resize_term");
   2459     if (!result)
   2460         return NULL;
   2461     if (!update_lines_cols())
   2462         return NULL;
   2463     return result;
   2464 }
   2465 #endif /* HAVE_CURSES_RESIZE_TERM */
   2466 
   2467 #ifdef getsyx
   2468 static PyObject *
   2469 PyCurses_setsyx(PyObject *self, PyObject *args)
   2470 {
   2471     int y,x;
   2472 
   2473     PyCursesInitialised;
   2474 
   2475     if (PyTuple_Size(args)!=2) {
   2476         PyErr_SetString(PyExc_TypeError, "setsyx requires 2 arguments");
   2477         return NULL;
   2478     }
   2479 
   2480     if (!PyArg_ParseTuple(args, "ii;y, x", &y, &x)) return NULL;
   2481 
   2482     setsyx(y,x);
   2483 
   2484     Py_INCREF(Py_None);
   2485     return Py_None;
   2486 }
   2487 #endif
   2488 
   2489 static PyObject *
   2490 PyCurses_Start_Color(PyObject *self)
   2491 {
   2492     int code;
   2493     PyObject *c, *cp;
   2494 
   2495     PyCursesInitialised;
   2496 
   2497     code = start_color();
   2498     if (code != ERR) {
   2499         initialisedcolors = TRUE;
   2500         c = PyInt_FromLong((long) COLORS);
   2501         PyDict_SetItemString(ModDict, "COLORS", c);
   2502         Py_DECREF(c);
   2503         cp = PyInt_FromLong((long) COLOR_PAIRS);
   2504         PyDict_SetItemString(ModDict, "COLOR_PAIRS", cp);
   2505         Py_DECREF(cp);
   2506         Py_INCREF(Py_None);
   2507         return Py_None;
   2508     } else {
   2509         PyErr_SetString(PyCursesError, "start_color() returned ERR");
   2510         return NULL;
   2511     }
   2512 }
   2513 
   2514 static PyObject *
   2515 PyCurses_tigetflag(PyObject *self, PyObject *args)
   2516 {
   2517     char *capname;
   2518 
   2519     PyCursesSetupTermCalled;
   2520 
   2521     if (!PyArg_ParseTuple(args, "s", &capname))
   2522         return NULL;
   2523 
   2524     return PyInt_FromLong( (long) tigetflag( capname ) );
   2525 }
   2526 
   2527 static PyObject *
   2528 PyCurses_tigetnum(PyObject *self, PyObject *args)
   2529 {
   2530     char *capname;
   2531 
   2532     PyCursesSetupTermCalled;
   2533 
   2534     if (!PyArg_ParseTuple(args, "s", &capname))
   2535         return NULL;
   2536 
   2537     return PyInt_FromLong( (long) tigetnum( capname ) );
   2538 }
   2539 
   2540 static PyObject *
   2541 PyCurses_tigetstr(PyObject *self, PyObject *args)
   2542 {
   2543     char *capname;
   2544 
   2545     PyCursesSetupTermCalled;
   2546 
   2547     if (!PyArg_ParseTuple(args, "s", &capname))
   2548         return NULL;
   2549 
   2550     capname = tigetstr( capname );
   2551     if (capname == 0 || capname == (char*) -1) {
   2552         Py_INCREF(Py_None);
   2553         return Py_None;
   2554     }
   2555     return PyString_FromString( capname );
   2556 }
   2557 
   2558 static PyObject *
   2559 PyCurses_tparm(PyObject *self, PyObject *args)
   2560 {
   2561     char* fmt;
   2562     char* result = NULL;
   2563     int i1=0,i2=0,i3=0,i4=0,i5=0,i6=0,i7=0,i8=0,i9=0;
   2564 
   2565     PyCursesSetupTermCalled;
   2566 
   2567     if (!PyArg_ParseTuple(args, "s|iiiiiiiii:tparm",
   2568                           &fmt, &i1, &i2, &i3, &i4,
   2569                           &i5, &i6, &i7, &i8, &i9)) {
   2570         return NULL;
   2571     }
   2572 
   2573     result = tparm(fmt,i1,i2,i3,i4,i5,i6,i7,i8,i9);
   2574     if (!result) {
   2575         PyErr_SetString(PyCursesError, "tparm() returned NULL");
   2576         return NULL;
   2577     }
   2578 
   2579     return PyString_FromString(result);
   2580 }
   2581 
   2582 #ifdef HAVE_CURSES_TYPEAHEAD
   2583 static PyObject *
   2584 PyCurses_TypeAhead(PyObject *self, PyObject *args)
   2585 {
   2586     int fd;
   2587 
   2588     PyCursesInitialised;
   2589 
   2590     if (!PyArg_ParseTuple(args,"i;fd",&fd)) return NULL;
   2591 
   2592     return PyCursesCheckERR(typeahead( fd ), "typeahead");
   2593 }
   2594 #endif
   2595 
   2596 static PyObject *
   2597 PyCurses_UnCtrl(PyObject *self, PyObject *args)
   2598 {
   2599     PyObject *temp;
   2600     chtype ch;
   2601 
   2602     PyCursesInitialised;
   2603 
   2604     if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL;
   2605 
   2606     if (_PyAnyInt_Check(temp)) {
   2607         ch = (chtype) PyInt_AsLong(temp);
   2608         if (ch == (chtype) -1 && PyErr_Occurred())
   2609             return NULL;
   2610     }
   2611     else if (PyString_Check(temp))
   2612         ch = (chtype) *PyString_AsString(temp);
   2613     else {
   2614         PyErr_SetString(PyExc_TypeError, "argument must be a ch or an int");
   2615         return NULL;
   2616     }
   2617 
   2618     return PyString_FromString(unctrl(ch));
   2619 }
   2620 
   2621 static PyObject *
   2622 PyCurses_UngetCh(PyObject *self, PyObject *args)
   2623 {
   2624     PyObject *temp;
   2625     int ch;
   2626 
   2627     PyCursesInitialised;
   2628 
   2629     if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL;
   2630 
   2631     if (_PyAnyInt_Check(temp)) {
   2632         ch = (int) PyInt_AsLong(temp);
   2633         if (ch == -1 && PyErr_Occurred())
   2634             return NULL;
   2635     }
   2636     else if (PyString_Check(temp))
   2637         ch = (int) *PyString_AsString(temp);
   2638     else {
   2639         PyErr_SetString(PyExc_TypeError, "argument must be a ch or an int");
   2640         return NULL;
   2641     }
   2642 
   2643     return PyCursesCheckERR(ungetch(ch), "ungetch");
   2644 }
   2645 
   2646 #ifdef HAVE_CURSES_TYPEAHEAD
   2647 static PyObject *
   2648 PyCurses_Use_Env(PyObject *self, PyObject *args)
   2649 {
   2650     int flag;
   2651 
   2652     switch(PyTuple_Size(args)) {
   2653     case 1:
   2654         if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&flag))
   2655             return NULL;
   2656         break;
   2657     default:
   2658         PyErr_SetString(PyExc_TypeError, "use_env requires 1 argument");
   2659         return NULL;
   2660     }
   2661     use_env(flag);
   2662     Py_INCREF(Py_None);
   2663     return Py_None;
   2664 }
   2665 #endif
   2666 
   2667 #ifndef STRICT_SYSV_CURSES
   2668 static PyObject *
   2669 PyCurses_Use_Default_Colors(PyObject *self)
   2670 {
   2671     int code;
   2672 
   2673     PyCursesInitialised;
   2674     PyCursesInitialisedColor;
   2675 
   2676     code = use_default_colors();
   2677     if (code != ERR) {
   2678         Py_INCREF(Py_None);
   2679         return Py_None;
   2680     } else {
   2681         PyErr_SetString(PyCursesError, "use_default_colors() returned ERR");
   2682         return NULL;
   2683     }
   2684 }
   2685 #endif /* STRICT_SYSV_CURSES */
   2686 
   2687 /* List of functions defined in the module */
   2688 
   2689 static PyMethodDef PyCurses_methods[] = {
   2690     {"baudrate",            (PyCFunction)PyCurses_baudrate, METH_NOARGS},
   2691     {"beep",                (PyCFunction)PyCurses_beep, METH_NOARGS},
   2692     {"can_change_color",    (PyCFunction)PyCurses_can_change_color, METH_NOARGS},
   2693     {"cbreak",              (PyCFunction)PyCurses_cbreak, METH_VARARGS},
   2694     {"color_content",       (PyCFunction)PyCurses_Color_Content, METH_VARARGS},
   2695     {"color_pair",          (PyCFunction)PyCurses_color_pair, METH_VARARGS},
   2696     {"curs_set",            (PyCFunction)PyCurses_Curs_Set, METH_VARARGS},
   2697     {"def_prog_mode",       (PyCFunction)PyCurses_def_prog_mode, METH_NOARGS},
   2698     {"def_shell_mode",      (PyCFunction)PyCurses_def_shell_mode, METH_NOARGS},
   2699     {"delay_output",        (PyCFunction)PyCurses_Delay_Output, METH_VARARGS},
   2700     {"doupdate",            (PyCFunction)PyCurses_doupdate, METH_NOARGS},
   2701     {"echo",                (PyCFunction)PyCurses_echo, METH_VARARGS},
   2702     {"endwin",              (PyCFunction)PyCurses_endwin, METH_NOARGS},
   2703     {"erasechar",           (PyCFunction)PyCurses_EraseChar, METH_NOARGS},
   2704 #ifdef HAVE_CURSES_FILTER
   2705     {"filter",              (PyCFunction)PyCurses_filter, METH_NOARGS},
   2706 #endif
   2707     {"flash",               (PyCFunction)PyCurses_flash, METH_NOARGS},
   2708     {"flushinp",            (PyCFunction)PyCurses_flushinp, METH_NOARGS},
   2709 #ifdef NCURSES_MOUSE_VERSION
   2710     {"getmouse",            (PyCFunction)PyCurses_GetMouse, METH_NOARGS},
   2711     {"ungetmouse",          (PyCFunction)PyCurses_UngetMouse, METH_VARARGS},
   2712 #endif
   2713 #ifdef getsyx
   2714     {"getsyx",              (PyCFunction)PyCurses_getsyx, METH_NOARGS},
   2715 #endif
   2716     {"getwin",              (PyCFunction)PyCurses_GetWin, METH_O},
   2717     {"has_colors",          (PyCFunction)PyCurses_has_colors, METH_NOARGS},
   2718     {"has_ic",              (PyCFunction)PyCurses_has_ic, METH_NOARGS},
   2719     {"has_il",              (PyCFunction)PyCurses_has_il, METH_NOARGS},
   2720 #ifdef HAVE_CURSES_HAS_KEY
   2721     {"has_key",             (PyCFunction)PyCurses_has_key, METH_VARARGS},
   2722 #endif
   2723     {"halfdelay",           (PyCFunction)PyCurses_HalfDelay, METH_VARARGS},
   2724     {"init_color",          (PyCFunction)PyCurses_Init_Color, METH_VARARGS},
   2725     {"init_pair",           (PyCFunction)PyCurses_Init_Pair, METH_VARARGS},
   2726     {"initscr",             (PyCFunction)PyCurses_InitScr, METH_NOARGS},
   2727     {"intrflush",           (PyCFunction)PyCurses_IntrFlush, METH_VARARGS},
   2728     {"isendwin",            (PyCFunction)PyCurses_isendwin, METH_NOARGS},
   2729 #ifdef HAVE_CURSES_IS_TERM_RESIZED
   2730     {"is_term_resized",     (PyCFunction)PyCurses_Is_Term_Resized, METH_VARARGS},
   2731 #endif
   2732     {"keyname",             (PyCFunction)PyCurses_KeyName, METH_VARARGS},
   2733     {"killchar",            (PyCFunction)PyCurses_KillChar, METH_NOARGS},
   2734     {"longname",            (PyCFunction)PyCurses_longname, METH_NOARGS},
   2735     {"meta",                (PyCFunction)PyCurses_Meta, METH_VARARGS},
   2736 #ifdef NCURSES_MOUSE_VERSION
   2737     {"mouseinterval",       (PyCFunction)PyCurses_MouseInterval, METH_VARARGS},
   2738     {"mousemask",           (PyCFunction)PyCurses_MouseMask, METH_VARARGS},
   2739 #endif
   2740     {"napms",               (PyCFunction)PyCurses_Napms, METH_VARARGS},
   2741     {"newpad",              (PyCFunction)PyCurses_NewPad, METH_VARARGS},
   2742     {"newwin",              (PyCFunction)PyCurses_NewWindow, METH_VARARGS},
   2743     {"nl",                  (PyCFunction)PyCurses_nl, METH_VARARGS},
   2744     {"nocbreak",            (PyCFunction)PyCurses_nocbreak, METH_NOARGS},
   2745     {"noecho",              (PyCFunction)PyCurses_noecho, METH_NOARGS},
   2746     {"nonl",                (PyCFunction)PyCurses_nonl, METH_NOARGS},
   2747     {"noqiflush",           (PyCFunction)PyCurses_noqiflush, METH_NOARGS},
   2748     {"noraw",               (PyCFunction)PyCurses_noraw, METH_NOARGS},
   2749     {"pair_content",        (PyCFunction)PyCurses_Pair_Content, METH_VARARGS},
   2750     {"pair_number",         (PyCFunction)PyCurses_pair_number, METH_VARARGS},
   2751     {"putp",                (PyCFunction)PyCurses_Putp, METH_VARARGS},
   2752     {"qiflush",             (PyCFunction)PyCurses_QiFlush, METH_VARARGS},
   2753     {"raw",                 (PyCFunction)PyCurses_raw, METH_VARARGS},
   2754     {"reset_prog_mode",     (PyCFunction)PyCurses_reset_prog_mode, METH_NOARGS},
   2755     {"reset_shell_mode",    (PyCFunction)PyCurses_reset_shell_mode, METH_NOARGS},
   2756     {"resetty",             (PyCFunction)PyCurses_resetty, METH_NOARGS},
   2757 #ifdef HAVE_CURSES_RESIZETERM
   2758     {"resizeterm",          (PyCFunction)PyCurses_ResizeTerm, METH_VARARGS},
   2759 #endif
   2760 #ifdef HAVE_CURSES_RESIZE_TERM
   2761     {"resize_term",         (PyCFunction)PyCurses_Resize_Term, METH_VARARGS},
   2762 #endif
   2763     {"savetty",             (PyCFunction)PyCurses_savetty, METH_NOARGS},
   2764 #ifdef getsyx
   2765     {"setsyx",              (PyCFunction)PyCurses_setsyx, METH_VARARGS},
   2766 #endif
   2767     {"setupterm",           (PyCFunction)PyCurses_setupterm,
   2768      METH_VARARGS|METH_KEYWORDS},
   2769     {"start_color",         (PyCFunction)PyCurses_Start_Color, METH_NOARGS},
   2770     {"termattrs",           (PyCFunction)PyCurses_termattrs, METH_NOARGS},
   2771     {"termname",            (PyCFunction)PyCurses_termname, METH_NOARGS},
   2772     {"tigetflag",           (PyCFunction)PyCurses_tigetflag, METH_VARARGS},
   2773     {"tigetnum",            (PyCFunction)PyCurses_tigetnum, METH_VARARGS},
   2774     {"tigetstr",            (PyCFunction)PyCurses_tigetstr, METH_VARARGS},
   2775     {"tparm",               (PyCFunction)PyCurses_tparm, METH_VARARGS},
   2776 #ifdef HAVE_CURSES_TYPEAHEAD
   2777     {"typeahead",           (PyCFunction)PyCurses_TypeAhead, METH_VARARGS},
   2778 #endif
   2779     {"unctrl",              (PyCFunction)PyCurses_UnCtrl, METH_VARARGS},
   2780     {"ungetch",             (PyCFunction)PyCurses_UngetCh, METH_VARARGS},
   2781 #ifdef HAVE_CURSES_USE_ENV
   2782     {"use_env",             (PyCFunction)PyCurses_Use_Env, METH_VARARGS},
   2783 #endif
   2784 #ifndef STRICT_SYSV_CURSES
   2785     {"use_default_colors",  (PyCFunction)PyCurses_Use_Default_Colors, METH_NOARGS},
   2786 #endif
   2787     {NULL,                  NULL}         /* sentinel */
   2788 };
   2789 
   2790 /* Initialization function for the module */
   2791 
   2792 PyMODINIT_FUNC
   2793 init_curses(void)
   2794 {
   2795     PyObject *m, *d, *v, *c_api_object;
   2796     static void *PyCurses_API[PyCurses_API_pointers];
   2797 
   2798     /* Initialize object type */
   2799     Py_TYPE(&PyCursesWindow_Type) = &PyType_Type;
   2800 
   2801     /* Initialize the C API pointer array */
   2802     PyCurses_API[0] = (void *)&PyCursesWindow_Type;
   2803     PyCurses_API[1] = (void *)func_PyCursesSetupTermCalled;
   2804     PyCurses_API[2] = (void *)func_PyCursesInitialised;
   2805     PyCurses_API[3] = (void *)func_PyCursesInitialisedColor;
   2806 
   2807     /* Create the module and add the functions */
   2808     m = Py_InitModule("_curses", PyCurses_methods);
   2809     if (m == NULL)
   2810         return;
   2811 
   2812     /* Add some symbolic constants to the module */
   2813     d = PyModule_GetDict(m);
   2814     if (d == NULL)
   2815         return;
   2816     ModDict = d; /* For PyCurses_InitScr to use later */
   2817 
   2818     /* Add a capsule for the C API */
   2819     c_api_object = PyCapsule_New(PyCurses_API, PyCurses_CAPSULE_NAME, NULL);
   2820     PyDict_SetItemString(d, "_C_API", c_api_object);
   2821     Py_DECREF(c_api_object);
   2822 
   2823     /* For exception curses.error */
   2824     PyCursesError = PyErr_NewException("_curses.error", NULL, NULL);
   2825     PyDict_SetItemString(d, "error", PyCursesError);
   2826 
   2827     /* Make the version available */
   2828     v = PyString_FromString(PyCursesVersion);
   2829     PyDict_SetItemString(d, "version", v);
   2830     PyDict_SetItemString(d, "__version__", v);
   2831     Py_DECREF(v);
   2832 
   2833     SetDictInt("ERR", ERR);
   2834     SetDictInt("OK", OK);
   2835 
   2836     /* Here are some attributes you can add to chars to print */
   2837 
   2838     SetDictInt("A_ATTRIBUTES",      A_ATTRIBUTES);
   2839     SetDictInt("A_NORMAL",              A_NORMAL);
   2840     SetDictInt("A_STANDOUT",            A_STANDOUT);
   2841     SetDictInt("A_UNDERLINE",           A_UNDERLINE);
   2842     SetDictInt("A_REVERSE",             A_REVERSE);
   2843     SetDictInt("A_BLINK",               A_BLINK);
   2844     SetDictInt("A_DIM",                 A_DIM);
   2845     SetDictInt("A_BOLD",                A_BOLD);
   2846     SetDictInt("A_ALTCHARSET",          A_ALTCHARSET);
   2847     SetDictInt("A_INVIS",           A_INVIS);
   2848     SetDictInt("A_PROTECT",         A_PROTECT);
   2849     SetDictInt("A_CHARTEXT",        A_CHARTEXT);
   2850     SetDictInt("A_COLOR",           A_COLOR);
   2851 
   2852     /* The following are never available with strict SYSV curses */
   2853 #ifdef A_HORIZONTAL
   2854     SetDictInt("A_HORIZONTAL",      A_HORIZONTAL);
   2855 #endif
   2856 #ifdef A_LEFT
   2857     SetDictInt("A_LEFT",            A_LEFT);
   2858 #endif
   2859 #ifdef A_LOW
   2860     SetDictInt("A_LOW",             A_LOW);
   2861 #endif
   2862 #ifdef A_RIGHT
   2863     SetDictInt("A_RIGHT",           A_RIGHT);
   2864 #endif
   2865 #ifdef A_TOP
   2866     SetDictInt("A_TOP",             A_TOP);
   2867 #endif
   2868 #ifdef A_VERTICAL
   2869     SetDictInt("A_VERTICAL",        A_VERTICAL);
   2870 #endif
   2871 
   2872     SetDictInt("COLOR_BLACK",       COLOR_BLACK);
   2873     SetDictInt("COLOR_RED",         COLOR_RED);
   2874     SetDictInt("COLOR_GREEN",       COLOR_GREEN);
   2875     SetDictInt("COLOR_YELLOW",      COLOR_YELLOW);
   2876     SetDictInt("COLOR_BLUE",        COLOR_BLUE);
   2877     SetDictInt("COLOR_MAGENTA",     COLOR_MAGENTA);
   2878     SetDictInt("COLOR_CYAN",        COLOR_CYAN);
   2879     SetDictInt("COLOR_WHITE",       COLOR_WHITE);
   2880 
   2881 #ifdef NCURSES_MOUSE_VERSION
   2882     /* Mouse-related constants */
   2883     SetDictInt("BUTTON1_PRESSED",          BUTTON1_PRESSED);
   2884     SetDictInt("BUTTON1_RELEASED",         BUTTON1_RELEASED);
   2885     SetDictInt("BUTTON1_CLICKED",          BUTTON1_CLICKED);
   2886     SetDictInt("BUTTON1_DOUBLE_CLICKED",   BUTTON1_DOUBLE_CLICKED);
   2887     SetDictInt("BUTTON1_TRIPLE_CLICKED",   BUTTON1_TRIPLE_CLICKED);
   2888 
   2889     SetDictInt("BUTTON2_PRESSED",          BUTTON2_PRESSED);
   2890     SetDictInt("BUTTON2_RELEASED",         BUTTON2_RELEASED);
   2891     SetDictInt("BUTTON2_CLICKED",          BUTTON2_CLICKED);
   2892     SetDictInt("BUTTON2_DOUBLE_CLICKED",   BUTTON2_DOUBLE_CLICKED);
   2893     SetDictInt("BUTTON2_TRIPLE_CLICKED",   BUTTON2_TRIPLE_CLICKED);
   2894 
   2895     SetDictInt("BUTTON3_PRESSED",          BUTTON3_PRESSED);
   2896     SetDictInt("BUTTON3_RELEASED",         BUTTON3_RELEASED);
   2897     SetDictInt("BUTTON3_CLICKED",          BUTTON3_CLICKED);
   2898     SetDictInt("BUTTON3_DOUBLE_CLICKED",   BUTTON3_DOUBLE_CLICKED);
   2899     SetDictInt("BUTTON3_TRIPLE_CLICKED",   BUTTON3_TRIPLE_CLICKED);
   2900 
   2901     SetDictInt("BUTTON4_PRESSED",          BUTTON4_PRESSED);
   2902     SetDictInt("BUTTON4_RELEASED",         BUTTON4_RELEASED);
   2903     SetDictInt("BUTTON4_CLICKED",          BUTTON4_CLICKED);
   2904     SetDictInt("BUTTON4_DOUBLE_CLICKED",   BUTTON4_DOUBLE_CLICKED);
   2905     SetDictInt("BUTTON4_TRIPLE_CLICKED",   BUTTON4_TRIPLE_CLICKED);
   2906 
   2907     SetDictInt("BUTTON_SHIFT",             BUTTON_SHIFT);
   2908     SetDictInt("BUTTON_CTRL",              BUTTON_CTRL);
   2909     SetDictInt("BUTTON_ALT",               BUTTON_ALT);
   2910 
   2911     SetDictInt("ALL_MOUSE_EVENTS",         ALL_MOUSE_EVENTS);
   2912     SetDictInt("REPORT_MOUSE_POSITION",    REPORT_MOUSE_POSITION);
   2913 #endif
   2914     /* Now set everything up for KEY_ variables */
   2915     {
   2916         int key;
   2917         char *key_n;
   2918         char *key_n2;
   2919         for (key=KEY_MIN;key < KEY_MAX; key++) {
   2920             key_n = (char *)keyname(key);
   2921             if (key_n == NULL || strcmp(key_n,"UNKNOWN KEY")==0)
   2922                 continue;
   2923             if (strncmp(key_n,"KEY_F(",6)==0) {
   2924                 char *p1, *p2;
   2925                 key_n2 = malloc(strlen(key_n)+1);
   2926                 if (!key_n2) {
   2927                     PyErr_NoMemory();
   2928                     break;
   2929                 }
   2930                 p1 = key_n;
   2931                 p2 = key_n2;
   2932                 while (*p1) {
   2933                     if (*p1 != '(' && *p1 != ')') {
   2934                         *p2 = *p1;
   2935                         p2++;
   2936                     }
   2937                     p1++;
   2938                 }
   2939                 *p2 = (char)0;
   2940             } else
   2941                 key_n2 = key_n;
   2942             SetDictInt(key_n2,key);
   2943             if (key_n2 != key_n)
   2944                 free(key_n2);
   2945         }
   2946         SetDictInt("KEY_MIN", KEY_MIN);
   2947         SetDictInt("KEY_MAX", KEY_MAX);
   2948     }
   2949 }
   2950