2 * This is a curses module for Python.
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.
8 * Version 1.5b1, heavily extended for ncurses by Oliver Andrich:
9 * Copyright 1996,1997 by Oliver Andrich, Koblenz, Germany.
11 * Tidied for Python 1.6, and currently maintained by <amk@amk.ca>.
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:
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
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.
38 A number of SysV or ncurses functions don't have wrappers yet; if you
39 need a given function, add it and send a patch. See
40 http://www.python.org/dev/patches/ for instructions on how to submit
43 Here's a list of currently unsupported functions:
45 addchnstr addchstr color_set define_key
46 del_curterm delscreen dupwin inchnstr inchstr innstr keyok
47 mcprint mvaddchnstr mvaddchstr mvcur mvinchnstr
48 mvinchstr mvinnstr mmvwaddchnstr mvwaddchstr
49 mvwinchnstr mvwinchstr mvwinnstr newterm
50 restartterm ripoffline scr_dump
51 scr_init scr_restore scr_set scrl set_curterm set_term setterm
52 tgetent tgetflag tgetnum tgetstr tgoto timeout tputs
53 vidattr vidputs waddchnstr waddchstr
54 wcolor_set winchnstr winchstr winnstr wmouse_trafo wscrl
57 slk_attr slk_attr_off slk_attr_on slk_attr_set slk_attroff
58 slk_attron slk_attrset slk_clear slk_color slk_init slk_label
59 slk_noutrefresh slk_refresh slk_restore slk_set slk_touch
61 Menu extension (ncurses and probably SYSV):
62 current_item free_item free_menu item_count item_description
63 item_index item_init item_name item_opts item_opts_off
64 item_opts_on item_term item_userptr item_value item_visible
65 menu_back menu_driver menu_fore menu_format menu_grey
66 menu_init menu_items menu_mark menu_opts menu_opts_off
67 menu_opts_on menu_pad menu_pattern menu_request_by_name
68 menu_request_name menu_spacing menu_sub menu_term menu_userptr
69 menu_win new_item new_menu pos_menu_cursor post_menu
70 scale_menu set_current_item set_item_init set_item_opts
71 set_item_term set_item_userptr set_item_value set_menu_back
72 set_menu_fore set_menu_format set_menu_grey set_menu_init
73 set_menu_items set_menu_mark set_menu_opts set_menu_pad
74 set_menu_pattern set_menu_spacing set_menu_sub set_menu_term
75 set_menu_userptr set_menu_win set_top_row top_row unpost_menu
77 Form extension (ncurses and probably SYSV):
78 current_field data_ahead data_behind dup_field
79 dynamic_fieldinfo field_arg field_back field_buffer
80 field_count field_fore field_index field_info field_init
81 field_just field_opts field_opts_off field_opts_on field_pad
82 field_status field_term field_type field_userptr form_driver
83 form_fields form_init form_opts form_opts_off form_opts_on
84 form_page form_request_by_name form_request_name form_sub
85 form_term form_userptr form_win free_field free_form
86 link_field link_fieldtype move_field new_field new_form
87 new_page pos_form_cursor post_form scale_form
88 set_current_field set_field_back set_field_buffer
89 set_field_fore set_field_init set_field_just set_field_opts
90 set_field_pad set_field_status set_field_term set_field_type
91 set_field_userptr set_fieldtype_arg set_fieldtype_choice
92 set_form_fields set_form_init set_form_opts set_form_page
93 set_form_sub set_form_term set_form_userptr set_form_win
94 set_max_field set_new_page unpost_form
101 char *PyCursesVersion
= "2.2";
108 #define STRICT_SYSV_CURSES /* Don't use ncurses extensions */
112 #define STRICT_SYSV_CURSES
115 #define CURSES_MODULE
116 #include "py_curses.h"
118 /* These prototypes are in <term.h>, but including this header
119 #defines many common symbols (such as "lines") which breaks the
120 curses module in other ways. So the code will just specify
121 explicit prototypes here. */
122 extern int setupterm(char *,int,int *);
127 #if !defined(HAVE_NCURSES_H) && (defined(sgi) || defined(__sun) || defined(SCO5))
128 #define STRICT_SYSV_CURSES /* Don't use ncurses extensions */
129 typedef chtype attr_t
; /* No attr_t type is available */
133 #define STRICT_SYSV_CURSES
136 /* Definition of exception curses.error */
138 static PyObject
*PyCursesError
;
140 /* Tells whether setupterm() has been called to initialise terminfo. */
141 static int initialised_setupterm
= FALSE
;
143 /* Tells whether initscr() has been called to initialise curses. */
144 static int initialised
= FALSE
;
146 /* Tells whether start_color() has been called to initialise color usage. */
147 static int initialisedcolors
= FALSE
;
150 #define PyCursesSetupTermCalled \
151 if (initialised_setupterm != TRUE) { \
152 PyErr_SetString(PyCursesError, \
153 "must call (at least) setupterm() first"); \
156 #define PyCursesInitialised \
157 if (initialised != TRUE) { \
158 PyErr_SetString(PyCursesError, \
159 "must call initscr() first"); \
162 #define PyCursesInitialisedColor \
163 if (initialisedcolors != TRUE) { \
164 PyErr_SetString(PyCursesError, \
165 "must call start_color() first"); \
169 #define MIN(x,y) ((x) < (y) ? (x) : (y))
172 /* Utility Functions */
175 * Check the return code from a curses function and return None
176 * or raise an exception as appropriate. These are exported using the
181 PyCursesCheckERR(int code
, char *fname
)
188 PyErr_SetString(PyCursesError
, catchall_ERR
);
190 PyErr_Format(PyCursesError
, "%s() returned ERR", fname
);
197 PyCurses_ConvertToChtype(PyObject
*obj
, chtype
*ch
)
199 if (PyInt_Check(obj
)) {
200 *ch
= (chtype
) PyInt_AsLong(obj
);
201 } else if(PyString_Check(obj
)
202 && (PyString_Size(obj
) == 1)) {
203 *ch
= (chtype
) *PyString_AsString(obj
);
210 /* Function versions of the 3 functions for tested whether curses has been
211 initialised or not. */
213 static int func_PyCursesSetupTermCalled(void)
215 PyCursesSetupTermCalled
;
219 static int func_PyCursesInitialised(void)
225 static int func_PyCursesInitialisedColor(void)
227 PyCursesInitialisedColor
;
231 /*****************************************************************************
233 ******************************************************************************/
235 /* Definition of the window type */
237 PyTypeObject PyCursesWindow_Type
;
239 /* Function prototype macros for Window object
242 TYPE - parameter Type
243 ERGSTR - format string for construction of the return value
244 PARSESTR - format string for argument parsing
247 #define Window_NoArgNoReturnFunction(X) \
248 static PyObject *PyCursesWindow_ ## X (PyCursesWindowObject *self, PyObject *args) \
249 { return PyCursesCheckERR(X(self->win), # X); }
251 #define Window_NoArgTrueFalseFunction(X) \
252 static PyObject * PyCursesWindow_ ## X (PyCursesWindowObject *self) \
254 if (X (self->win) == FALSE) { Py_INCREF(Py_False); return Py_False; } \
255 else { Py_INCREF(Py_True); return Py_True; } }
257 #define Window_NoArgNoReturnVoidFunction(X) \
258 static PyObject * PyCursesWindow_ ## X (PyCursesWindowObject *self) \
260 X(self->win); Py_INCREF(Py_None); return Py_None; }
262 #define Window_NoArg2TupleReturnFunction(X, TYPE, ERGSTR) \
263 static PyObject * PyCursesWindow_ ## X (PyCursesWindowObject *self) \
266 X(self->win,arg1,arg2); return Py_BuildValue(ERGSTR, arg1, arg2); }
268 #define Window_OneArgNoReturnVoidFunction(X, TYPE, PARSESTR) \
269 static PyObject * PyCursesWindow_ ## X (PyCursesWindowObject *self, PyObject *args) \
272 if (!PyArg_ParseTuple(args, PARSESTR, &arg1)) return NULL; \
273 X(self->win,arg1); Py_INCREF(Py_None); return Py_None; }
275 #define Window_OneArgNoReturnFunction(X, TYPE, PARSESTR) \
276 static PyObject * PyCursesWindow_ ## X (PyCursesWindowObject *self, PyObject *args) \
279 if (!PyArg_ParseTuple(args,PARSESTR, &arg1)) return NULL; \
280 return PyCursesCheckERR(X(self->win, arg1), # X); }
282 #define Window_TwoArgNoReturnFunction(X, TYPE, PARSESTR) \
283 static PyObject * PyCursesWindow_ ## X (PyCursesWindowObject *self, PyObject *args) \
286 if (!PyArg_ParseTuple(args,PARSESTR, &arg1, &arg2)) return NULL; \
287 return PyCursesCheckERR(X(self->win, arg1, arg2), # X); }
289 /* ------------- WINDOW routines --------------- */
291 Window_NoArgNoReturnFunction(untouchwin
)
292 Window_NoArgNoReturnFunction(touchwin
)
293 Window_NoArgNoReturnFunction(redrawwin
)
294 Window_NoArgNoReturnFunction(winsertln
)
295 Window_NoArgNoReturnFunction(werase
)
296 Window_NoArgNoReturnFunction(wdeleteln
)
298 Window_NoArgTrueFalseFunction(is_wintouched
)
300 Window_NoArgNoReturnVoidFunction(wsyncup
)
301 Window_NoArgNoReturnVoidFunction(wsyncdown
)
302 Window_NoArgNoReturnVoidFunction(wstandend
)
303 Window_NoArgNoReturnVoidFunction(wstandout
)
304 Window_NoArgNoReturnVoidFunction(wcursyncup
)
305 Window_NoArgNoReturnVoidFunction(wclrtoeol
)
306 Window_NoArgNoReturnVoidFunction(wclrtobot
)
307 Window_NoArgNoReturnVoidFunction(wclear
)
309 Window_OneArgNoReturnVoidFunction(idcok
, int, "i;True(1) or False(0)")
310 Window_OneArgNoReturnVoidFunction(immedok
, int, "i;True(1) or False(0)")
311 Window_OneArgNoReturnVoidFunction(wtimeout
, int, "i;delay")
313 Window_NoArg2TupleReturnFunction(getyx
, int, "ii")
314 Window_NoArg2TupleReturnFunction(getbegyx
, int, "ii")
315 Window_NoArg2TupleReturnFunction(getmaxyx
, int, "ii")
316 Window_NoArg2TupleReturnFunction(getparyx
, int, "ii")
318 Window_OneArgNoReturnFunction(clearok
, int, "i;True(1) or False(0)")
319 Window_OneArgNoReturnFunction(idlok
, int, "i;True(1) or False(0)")
320 #if defined(__NetBSD__)
321 Window_OneArgNoReturnVoidFunction(keypad
, int, "i;True(1) or False(0)")
323 Window_OneArgNoReturnFunction(keypad
, int, "i;True(1) or False(0)")
325 Window_OneArgNoReturnFunction(leaveok
, int, "i;True(1) or False(0)")
326 #if defined(__NetBSD__)
327 Window_OneArgNoReturnVoidFunction(nodelay
, int, "i;True(1) or False(0)")
329 Window_OneArgNoReturnFunction(nodelay
, int, "i;True(1) or False(0)")
331 Window_OneArgNoReturnFunction(notimeout
, int, "i;True(1) or False(0)")
332 Window_OneArgNoReturnFunction(scrollok
, int, "i;True(1) or False(0)")
333 Window_OneArgNoReturnFunction(winsdelln
, int, "i;nlines")
334 Window_OneArgNoReturnFunction(syncok
, int, "i;True(1) or False(0)")
336 Window_TwoArgNoReturnFunction(mvwin
, int, "ii;y,x")
337 Window_TwoArgNoReturnFunction(mvderwin
, int, "ii;y,x")
338 Window_TwoArgNoReturnFunction(wmove
, int, "ii;y,x")
339 #ifndef STRICT_SYSV_CURSES
340 Window_TwoArgNoReturnFunction(wresize
, int, "ii;lines,columns")
343 /* Allocation and deallocation of Window Objects */
346 PyCursesWindow_New(WINDOW
*win
)
348 PyCursesWindowObject
*wo
;
350 wo
= PyObject_NEW(PyCursesWindowObject
, &PyCursesWindow_Type
);
351 if (wo
== NULL
) return NULL
;
353 return (PyObject
*)wo
;
357 PyCursesWindow_Dealloc(PyCursesWindowObject
*wo
)
359 if (wo
->win
!= stdscr
) delwin(wo
->win
);
363 /* Addch, Addstr, Addnstr */
366 PyCursesWindow_AddCh(PyCursesWindowObject
*self
, PyObject
*args
)
368 int rtn
, x
, y
, use_xy
= FALSE
;
371 attr_t attr
= A_NORMAL
;
374 switch (PyTuple_Size(args
)) {
376 if (!PyArg_ParseTuple(args
, "O;ch or int", &temp
))
380 if (!PyArg_ParseTuple(args
, "Ol;ch or int,attr", &temp
, &lattr
))
385 if (!PyArg_ParseTuple(args
,"iiO;y,x,ch or int", &y
, &x
, &temp
))
390 if (!PyArg_ParseTuple(args
,"iiOl;y,x,ch or int, attr",
391 &y
, &x
, &temp
, &lattr
))
397 PyErr_SetString(PyExc_TypeError
, "addch requires 1 to 4 arguments");
401 if (!PyCurses_ConvertToChtype(temp
, &ch
)) {
402 PyErr_SetString(PyExc_TypeError
, "argument 1 or 3 must be a ch or an int");
407 rtn
= mvwaddch(self
->win
,y
,x
, ch
| attr
);
409 rtn
= waddch(self
->win
, ch
| attr
);
411 return PyCursesCheckERR(rtn
, "addch");
415 PyCursesWindow_AddStr(PyCursesWindowObject
*self
, PyObject
*args
)
420 attr_t attr
= A_NORMAL
, attr_old
= A_NORMAL
;
422 int use_xy
= FALSE
, use_attr
= FALSE
;
424 switch (PyTuple_Size(args
)) {
426 if (!PyArg_ParseTuple(args
,"s;str", &str
))
430 if (!PyArg_ParseTuple(args
,"sl;str,attr", &str
, &lattr
))
436 if (!PyArg_ParseTuple(args
,"iis;int,int,str", &y
, &x
, &str
))
441 if (!PyArg_ParseTuple(args
,"iisl;int,int,str,attr", &y
, &x
, &str
, &lattr
))
444 use_xy
= use_attr
= TRUE
;
447 PyErr_SetString(PyExc_TypeError
, "addstr requires 1 to 4 arguments");
451 if (use_attr
== TRUE
) {
452 attr_old
= getattrs(self
->win
);
453 wattrset(self
->win
,attr
);
456 rtn
= mvwaddstr(self
->win
,y
,x
,str
);
458 rtn
= waddstr(self
->win
,str
);
459 if (use_attr
== TRUE
)
460 wattrset(self
->win
,attr_old
);
461 return PyCursesCheckERR(rtn
, "addstr");
465 PyCursesWindow_AddNStr(PyCursesWindowObject
*self
, PyObject
*args
)
469 attr_t attr
= A_NORMAL
, attr_old
= A_NORMAL
;
471 int use_xy
= FALSE
, use_attr
= FALSE
;
473 switch (PyTuple_Size(args
)) {
475 if (!PyArg_ParseTuple(args
,"si;str,n", &str
, &n
))
479 if (!PyArg_ParseTuple(args
,"sil;str,n,attr", &str
, &n
, &lattr
))
485 if (!PyArg_ParseTuple(args
,"iisi;y,x,str,n", &y
, &x
, &str
, &n
))
490 if (!PyArg_ParseTuple(args
,"iisil;y,x,str,n,attr", &y
, &x
, &str
, &n
, &lattr
))
493 use_xy
= use_attr
= TRUE
;
496 PyErr_SetString(PyExc_TypeError
, "addnstr requires 2 to 5 arguments");
500 if (use_attr
== TRUE
) {
501 attr_old
= getattrs(self
->win
);
502 wattrset(self
->win
,attr
);
505 rtn
= mvwaddnstr(self
->win
,y
,x
,str
,n
);
507 rtn
= waddnstr(self
->win
,str
,n
);
508 if (use_attr
== TRUE
)
509 wattrset(self
->win
,attr_old
);
510 return PyCursesCheckERR(rtn
, "addnstr");
514 PyCursesWindow_Bkgd(PyCursesWindowObject
*self
, PyObject
*args
)
518 attr_t attr
= A_NORMAL
;
521 switch (PyTuple_Size(args
)) {
523 if (!PyArg_ParseTuple(args
, "O;ch or int", &temp
))
527 if (!PyArg_ParseTuple(args
,"Ol;ch or int,attr", &temp
, &lattr
))
532 PyErr_SetString(PyExc_TypeError
, "bkgd requires 1 or 2 arguments");
536 if (!PyCurses_ConvertToChtype(temp
, &bkgd
)) {
537 PyErr_SetString(PyExc_TypeError
, "argument 1 or 3 must be a ch or an int");
541 return PyCursesCheckERR(wbkgd(self
->win
, bkgd
| attr
), "bkgd");
545 PyCursesWindow_AttrOff(PyCursesWindowObject
*self
, PyObject
*args
)
548 if (!PyArg_ParseTuple(args
,"l;attr", &lattr
))
550 return PyCursesCheckERR(wattroff(self
->win
, (attr_t
)lattr
), "attroff");
554 PyCursesWindow_AttrOn(PyCursesWindowObject
*self
, PyObject
*args
)
557 if (!PyArg_ParseTuple(args
,"l;attr", &lattr
))
559 return PyCursesCheckERR(wattron(self
->win
, (attr_t
)lattr
), "attron");
563 PyCursesWindow_AttrSet(PyCursesWindowObject
*self
, PyObject
*args
)
566 if (!PyArg_ParseTuple(args
,"l;attr", &lattr
))
568 return PyCursesCheckERR(wattrset(self
->win
, (attr_t
)lattr
), "attrset");
572 PyCursesWindow_BkgdSet(PyCursesWindowObject
*self
, PyObject
*args
)
576 attr_t attr
= A_NORMAL
;
579 switch (PyTuple_Size(args
)) {
581 if (!PyArg_ParseTuple(args
, "O;ch or int", &temp
))
585 if (!PyArg_ParseTuple(args
,"Ol;ch or int,attr", &temp
, &lattr
))
590 PyErr_SetString(PyExc_TypeError
, "bkgdset requires 1 or 2 arguments");
594 if (!PyCurses_ConvertToChtype(temp
, &bkgd
)) {
595 PyErr_SetString(PyExc_TypeError
, "argument 1 must be a ch or an int");
599 wbkgdset(self
->win
, bkgd
| attr
);
600 return PyCursesCheckERR(0, "bkgdset");
604 PyCursesWindow_Border(PyCursesWindowObject
*self
, PyObject
*args
)
610 /* Clear the array of parameters */
616 if (!PyArg_ParseTuple(args
,"|OOOOOOOO;ls,rs,ts,bs,tl,tr,bl,br",
617 &temp
[0], &temp
[1], &temp
[2], &temp
[3],
618 &temp
[4], &temp
[5], &temp
[6], &temp
[7]))
622 if (temp
[i
] != NULL
&& !PyCurses_ConvertToChtype(temp
[i
], &ch
[i
])) {
623 PyErr_Format(PyExc_TypeError
,
624 "argument %i must be a ch or an int", i
+1);
630 ch
[0], ch
[1], ch
[2], ch
[3],
631 ch
[4], ch
[5], ch
[6], ch
[7]);
637 PyCursesWindow_Box(PyCursesWindowObject
*self
, PyObject
*args
)
640 switch(PyTuple_Size(args
)){
643 if (!PyArg_ParseTuple(args
,"ll;vertint,horint", &ch1
, &ch2
))
646 box(self
->win
,ch1
,ch2
);
651 #if defined(HAVE_NCURSES_H) || defined(MVWDELCH_IS_EXPRESSION)
652 #define py_mvwdelch mvwdelch
654 int py_mvwdelch(WINDOW
*w
, int y
, int x
)
657 /* On HP/UX, mvwdelch already returns. On other systems,
658 we may well run into this return statement. */
663 /* chgat, added by Fabian Kreutz <fabian.kreutz at gmx.net> */
666 PyCursesWindow_ChgAt(PyCursesWindowObject
*self
, PyObject
*args
)
672 attr_t attr
= A_NORMAL
;
676 switch (PyTuple_Size(args
)) {
678 if (!PyArg_ParseTuple(args
,"l;attr", &lattr
))
683 if (!PyArg_ParseTuple(args
,"il;n,attr", &num
, &lattr
))
688 if (!PyArg_ParseTuple(args
,"iil;int,int,attr", &y
, &x
, &lattr
))
694 if (!PyArg_ParseTuple(args
,"iiil;int,int,n,attr", &y
, &x
, &num
, &lattr
))
700 PyErr_SetString(PyExc_TypeError
, "chgat requires 1 to 4 arguments");
704 color
= (short)((attr
>> 8) & 0xff);
705 attr
= attr
- (color
<< 8);
707 if (use_xy
== TRUE
) {
708 rtn
= mvwchgat(self
->win
,y
,x
,num
,attr
,color
,NULL
);
709 touchline(self
->win
,y
,1);
711 getyx(self
->win
,y
,x
);
712 rtn
= wchgat(self
->win
,num
,attr
,color
,NULL
);
713 touchline(self
->win
,y
,1);
715 return PyCursesCheckERR(rtn
, "chgat");
720 PyCursesWindow_DelCh(PyCursesWindowObject
*self
, PyObject
*args
)
725 switch (PyTuple_Size(args
)) {
727 rtn
= wdelch(self
->win
);
730 if (!PyArg_ParseTuple(args
,"ii;y,x", &y
, &x
))
732 rtn
= py_mvwdelch(self
->win
,y
,x
);
735 PyErr_SetString(PyExc_TypeError
, "delch requires 0 or 2 arguments");
738 return PyCursesCheckERR(rtn
, "[mv]wdelch");
742 PyCursesWindow_DerWin(PyCursesWindowObject
*self
, PyObject
*args
)
745 int nlines
, ncols
, begin_y
, begin_x
;
749 switch (PyTuple_Size(args
)) {
751 if (!PyArg_ParseTuple(args
,"ii;begin_y,begin_x",&begin_y
,&begin_x
))
755 if (!PyArg_ParseTuple(args
, "iiii;nlines,ncols,begin_y,begin_x",
756 &nlines
,&ncols
,&begin_y
,&begin_x
))
760 PyErr_SetString(PyExc_TypeError
, "derwin requires 2 or 4 arguments");
764 win
= derwin(self
->win
,nlines
,ncols
,begin_y
,begin_x
);
767 PyErr_SetString(PyCursesError
, catchall_NULL
);
771 return (PyObject
*)PyCursesWindow_New(win
);
775 PyCursesWindow_EchoChar(PyCursesWindowObject
*self
, PyObject
*args
)
779 attr_t attr
= A_NORMAL
;
782 switch (PyTuple_Size(args
)) {
784 if (!PyArg_ParseTuple(args
,"O;ch or int", &temp
))
788 if (!PyArg_ParseTuple(args
,"Ol;ch or int,attr", &temp
, &lattr
))
793 PyErr_SetString(PyExc_TypeError
, "echochar requires 1 or 2 arguments");
799 if (!PyCurses_ConvertToChtype(temp
, &ch
)) {
800 PyErr_SetString(PyExc_TypeError
, "argument 1 must be a ch or an int");
804 #ifdef WINDOW_HAS_FLAGS
805 if (self
->win
->_flags
& _ISPAD
)
806 return PyCursesCheckERR(pechochar(self
->win
, ch
| attr
),
810 return PyCursesCheckERR(wechochar(self
->win
, ch
| attr
),
814 #ifdef NCURSES_MOUSE_VERSION
816 PyCursesWindow_Enclose(PyCursesWindowObject
*self
, PyObject
*args
)
819 if (!PyArg_ParseTuple(args
,"ii;y,x", &y
, &x
))
822 return PyInt_FromLong( wenclose(self
->win
,y
,x
) );
827 PyCursesWindow_GetBkgd(PyCursesWindowObject
*self
)
829 return PyInt_FromLong((long) getbkgd(self
->win
));
833 PyCursesWindow_GetCh(PyCursesWindowObject
*self
, PyObject
*args
)
838 switch (PyTuple_Size(args
)) {
840 Py_BEGIN_ALLOW_THREADS
841 rtn
= wgetch(self
->win
);
845 if (!PyArg_ParseTuple(args
,"ii;y,x",&y
,&x
))
847 Py_BEGIN_ALLOW_THREADS
848 rtn
= mvwgetch(self
->win
,y
,x
);
852 PyErr_SetString(PyExc_TypeError
, "getch requires 0 or 2 arguments");
855 return PyInt_FromLong((long)rtn
);
859 PyCursesWindow_GetKey(PyCursesWindowObject
*self
, PyObject
*args
)
864 switch (PyTuple_Size(args
)) {
866 Py_BEGIN_ALLOW_THREADS
867 rtn
= wgetch(self
->win
);
871 if (!PyArg_ParseTuple(args
,"ii;y,x",&y
,&x
))
873 Py_BEGIN_ALLOW_THREADS
874 rtn
= mvwgetch(self
->win
,y
,x
);
878 PyErr_SetString(PyExc_TypeError
, "getkey requires 0 or 2 arguments");
882 /* getch() returns ERR in nodelay mode */
883 PyErr_SetString(PyCursesError
, "no input");
886 return Py_BuildValue("c", rtn
);
888 #if defined(__NetBSD__)
889 return PyString_FromString(unctrl(rtn
));
891 return PyString_FromString((char *)keyname(rtn
));
896 PyCursesWindow_GetStr(PyCursesWindowObject
*self
, PyObject
*args
)
899 char rtn
[1024]; /* This should be big enough.. I hope */
902 switch (PyTuple_Size(args
)) {
904 Py_BEGIN_ALLOW_THREADS
905 rtn2
= wgetnstr(self
->win
,rtn
, 1023);
909 if (!PyArg_ParseTuple(args
,"i;n", &n
))
911 Py_BEGIN_ALLOW_THREADS
912 rtn2
= wgetnstr(self
->win
,rtn
,MIN(n
, 1023));
916 if (!PyArg_ParseTuple(args
,"ii;y,x",&y
,&x
))
918 Py_BEGIN_ALLOW_THREADS
919 #ifdef STRICT_SYSV_CURSES
920 rtn2
= wmove(self
->win
,y
,x
)==ERR
? ERR
: wgetnstr(self
->win
, rtn
, 1023);
922 rtn2
= mvwgetnstr(self
->win
,y
,x
,rtn
, 1023);
927 if (!PyArg_ParseTuple(args
,"iii;y,x,n", &y
, &x
, &n
))
929 #ifdef STRICT_SYSV_CURSES
930 Py_BEGIN_ALLOW_THREADS
931 rtn2
= wmove(self
->win
,y
,x
)==ERR
? ERR
:
932 wgetnstr(self
->win
, rtn
, MIN(n
, 1023));
935 Py_BEGIN_ALLOW_THREADS
936 rtn2
= mvwgetnstr(self
->win
, y
, x
, rtn
, MIN(n
, 1023));
941 PyErr_SetString(PyExc_TypeError
, "getstr requires 0 to 3 arguments");
946 return PyString_FromString(rtn
);
950 PyCursesWindow_Hline(PyCursesWindowObject
*self
, PyObject
*args
)
954 int n
, x
, y
, code
= OK
;
955 attr_t attr
= A_NORMAL
;
958 switch (PyTuple_Size(args
)) {
960 if (!PyArg_ParseTuple(args
, "Oi;ch or int,n", &temp
, &n
))
964 if (!PyArg_ParseTuple(args
, "Oil;ch or int,n,attr", &temp
, &n
, &lattr
))
969 if (!PyArg_ParseTuple(args
, "iiOi;y,x,ch or int,n", &y
, &x
, &temp
, &n
))
971 code
= wmove(self
->win
, y
, x
);
974 if (!PyArg_ParseTuple(args
, "iiOil; y,x,ch or int,n,attr",
975 &y
, &x
, &temp
, &n
, &lattr
))
978 code
= wmove(self
->win
, y
, x
);
981 PyErr_SetString(PyExc_TypeError
, "hline requires 2 to 5 arguments");
986 if (!PyCurses_ConvertToChtype(temp
, &ch
)) {
987 PyErr_SetString(PyExc_TypeError
,
988 "argument 1 or 3 must be a ch or an int");
991 return PyCursesCheckERR(whline(self
->win
, ch
| attr
, n
), "hline");
993 return PyCursesCheckERR(code
, "wmove");
997 PyCursesWindow_InsCh(PyCursesWindowObject
*self
, PyObject
*args
)
999 int rtn
, x
, y
, use_xy
= FALSE
;
1002 attr_t attr
= A_NORMAL
;
1005 switch (PyTuple_Size(args
)) {
1007 if (!PyArg_ParseTuple(args
, "O;ch or int", &temp
))
1011 if (!PyArg_ParseTuple(args
, "Ol;ch or int,attr", &temp
, &lattr
))
1016 if (!PyArg_ParseTuple(args
,"iiO;y,x,ch or int", &y
, &x
, &temp
))
1021 if (!PyArg_ParseTuple(args
,"iiOl;y,x,ch or int, attr", &y
, &x
, &temp
, &lattr
))
1027 PyErr_SetString(PyExc_TypeError
, "insch requires 1 or 4 arguments");
1031 if (!PyCurses_ConvertToChtype(temp
, &ch
)) {
1032 PyErr_SetString(PyExc_TypeError
,
1033 "argument 1 or 3 must be a ch or an int");
1038 rtn
= mvwinsch(self
->win
,y
,x
, ch
| attr
);
1040 rtn
= winsch(self
->win
, ch
| attr
);
1042 return PyCursesCheckERR(rtn
, "insch");
1046 PyCursesWindow_InCh(PyCursesWindowObject
*self
, PyObject
*args
)
1050 switch (PyTuple_Size(args
)) {
1052 rtn
= winch(self
->win
);
1055 if (!PyArg_ParseTuple(args
,"ii;y,x",&y
,&x
))
1057 rtn
= mvwinch(self
->win
,y
,x
);
1060 PyErr_SetString(PyExc_TypeError
, "inch requires 0 or 2 arguments");
1063 return PyInt_FromLong((long) rtn
);
1067 PyCursesWindow_InStr(PyCursesWindowObject
*self
, PyObject
*args
)
1070 char rtn
[1024]; /* This should be big enough.. I hope */
1073 switch (PyTuple_Size(args
)) {
1075 rtn2
= winnstr(self
->win
,rtn
, 1023);
1078 if (!PyArg_ParseTuple(args
,"i;n", &n
))
1080 rtn2
= winnstr(self
->win
,rtn
,MIN(n
,1023));
1083 if (!PyArg_ParseTuple(args
,"ii;y,x",&y
,&x
))
1085 rtn2
= mvwinnstr(self
->win
,y
,x
,rtn
,1023);
1088 if (!PyArg_ParseTuple(args
, "iii;y,x,n", &y
, &x
, &n
))
1090 rtn2
= mvwinnstr(self
->win
, y
, x
, rtn
, MIN(n
,1023));
1093 PyErr_SetString(PyExc_TypeError
, "instr requires 0 or 3 arguments");
1098 return PyString_FromString(rtn
);
1102 PyCursesWindow_InsStr(PyCursesWindowObject
*self
, PyObject
*args
)
1107 attr_t attr
= A_NORMAL
, attr_old
= A_NORMAL
;
1109 int use_xy
= FALSE
, use_attr
= FALSE
;
1111 switch (PyTuple_Size(args
)) {
1113 if (!PyArg_ParseTuple(args
,"s;str", &str
))
1117 if (!PyArg_ParseTuple(args
,"sl;str,attr", &str
, &lattr
))
1123 if (!PyArg_ParseTuple(args
,"iis;y,x,str", &y
, &x
, &str
))
1128 if (!PyArg_ParseTuple(args
,"iisl;y,x,str,attr", &y
, &x
, &str
, &lattr
))
1131 use_xy
= use_attr
= TRUE
;
1134 PyErr_SetString(PyExc_TypeError
, "insstr requires 1 to 4 arguments");
1138 if (use_attr
== TRUE
) {
1139 attr_old
= getattrs(self
->win
);
1140 wattrset(self
->win
,attr
);
1143 rtn
= mvwinsstr(self
->win
,y
,x
,str
);
1145 rtn
= winsstr(self
->win
,str
);
1146 if (use_attr
== TRUE
)
1147 wattrset(self
->win
,attr_old
);
1148 return PyCursesCheckERR(rtn
, "insstr");
1152 PyCursesWindow_InsNStr(PyCursesWindowObject
*self
, PyObject
*args
)
1156 attr_t attr
= A_NORMAL
, attr_old
= A_NORMAL
;
1158 int use_xy
= FALSE
, use_attr
= FALSE
;
1160 switch (PyTuple_Size(args
)) {
1162 if (!PyArg_ParseTuple(args
,"si;str,n", &str
, &n
))
1166 if (!PyArg_ParseTuple(args
,"sil;str,n,attr", &str
, &n
, &lattr
))
1172 if (!PyArg_ParseTuple(args
,"iisi;y,x,str,n", &y
, &x
, &str
, &n
))
1177 if (!PyArg_ParseTuple(args
,"iisil;y,x,str,n,attr", &y
, &x
, &str
, &n
, &lattr
))
1180 use_xy
= use_attr
= TRUE
;
1183 PyErr_SetString(PyExc_TypeError
, "insnstr requires 2 to 5 arguments");
1187 if (use_attr
== TRUE
) {
1188 attr_old
= getattrs(self
->win
);
1189 wattrset(self
->win
,attr
);
1192 rtn
= mvwinsnstr(self
->win
,y
,x
,str
,n
);
1194 rtn
= winsnstr(self
->win
,str
,n
);
1195 if (use_attr
== TRUE
)
1196 wattrset(self
->win
,attr_old
);
1197 return PyCursesCheckERR(rtn
, "insnstr");
1201 PyCursesWindow_Is_LineTouched(PyCursesWindowObject
*self
, PyObject
*args
)
1204 if (!PyArg_ParseTuple(args
,"i;line", &line
))
1206 erg
= is_linetouched(self
->win
, line
);
1208 PyErr_SetString(PyExc_TypeError
,
1209 "is_linetouched: line number outside of boundaries");
1213 Py_INCREF(Py_False
);
1222 PyCursesWindow_NoOutRefresh(PyCursesWindowObject
*self
, PyObject
*args
)
1224 int pminrow
,pmincol
,sminrow
,smincol
,smaxrow
,smaxcol
;
1227 #ifndef WINDOW_HAS_FLAGS
1230 if (self
->win
->_flags
& _ISPAD
) {
1232 switch(PyTuple_Size(args
)) {
1234 if (!PyArg_ParseTuple(args
,
1236 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1237 &pminrow
, &pmincol
, &sminrow
,
1238 &smincol
, &smaxrow
, &smaxcol
))
1240 Py_BEGIN_ALLOW_THREADS
1241 rtn
= pnoutrefresh(self
->win
,
1242 pminrow
, pmincol
, sminrow
,
1243 smincol
, smaxrow
, smaxcol
);
1244 Py_END_ALLOW_THREADS
1245 return PyCursesCheckERR(rtn
, "pnoutrefresh");
1247 PyErr_SetString(PyCursesError
,
1248 "noutrefresh() called for a pad "
1249 "requires 6 arguments");
1253 if (!PyArg_ParseTuple(args
, ":noutrefresh"))
1256 Py_BEGIN_ALLOW_THREADS
1257 rtn
= wnoutrefresh(self
->win
);
1258 Py_END_ALLOW_THREADS
1259 return PyCursesCheckERR(rtn
, "wnoutrefresh");
1264 PyCursesWindow_Overlay(PyCursesWindowObject
*self
, PyObject
*args
)
1266 PyCursesWindowObject
*temp
;
1267 int use_copywin
= FALSE
;
1268 int sminrow
, smincol
, dminrow
, dmincol
, dmaxrow
, dmaxcol
;
1271 switch (PyTuple_Size(args
)) {
1273 if (!PyArg_ParseTuple(args
, "O!;window object",
1274 &PyCursesWindow_Type
, &temp
))
1278 if (!PyArg_ParseTuple(args
, "O!iiiiii;window object, int, int, int, int, int, int",
1279 &PyCursesWindow_Type
, &temp
, &sminrow
, &smincol
,
1280 &dminrow
, &dmincol
, &dmaxrow
, &dmaxcol
))
1285 PyErr_SetString(PyExc_TypeError
,
1286 "overlay requires one or seven arguments");
1290 if (use_copywin
== TRUE
) {
1291 rtn
= copywin(self
->win
, temp
->win
, sminrow
, smincol
,
1292 dminrow
, dmincol
, dmaxrow
, dmaxcol
, TRUE
);
1293 return PyCursesCheckERR(rtn
, "copywin");
1296 rtn
= overlay(self
->win
, temp
->win
);
1297 return PyCursesCheckERR(rtn
, "overlay");
1302 PyCursesWindow_Overwrite(PyCursesWindowObject
*self
, PyObject
*args
)
1304 PyCursesWindowObject
*temp
;
1305 int use_copywin
= FALSE
;
1306 int sminrow
, smincol
, dminrow
, dmincol
, dmaxrow
, dmaxcol
;
1309 switch (PyTuple_Size(args
)) {
1311 if (!PyArg_ParseTuple(args
, "O!;window object",
1312 &PyCursesWindow_Type
, &temp
))
1316 if (!PyArg_ParseTuple(args
, "O!iiiiii;window object, int, int, int, int, int, int",
1317 &PyCursesWindow_Type
, &temp
, &sminrow
, &smincol
,
1318 &dminrow
, &dmincol
, &dmaxrow
, &dmaxcol
))
1323 PyErr_SetString(PyExc_TypeError
,
1324 "overwrite requires one or seven arguments");
1328 if (use_copywin
== TRUE
) {
1329 rtn
= copywin(self
->win
, temp
->win
, sminrow
, smincol
,
1330 dminrow
, dmincol
, dmaxrow
, dmaxcol
, FALSE
);
1331 return PyCursesCheckERR(rtn
, "copywin");
1334 rtn
= overwrite(self
->win
, temp
->win
);
1335 return PyCursesCheckERR(rtn
, "overwrite");
1340 PyCursesWindow_PutWin(PyCursesWindowObject
*self
, PyObject
*args
)
1344 if (!PyArg_ParseTuple(args
, "O;fileobj", &temp
))
1346 if (!PyFile_Check(temp
)) {
1347 PyErr_SetString(PyExc_TypeError
, "argument must be a file object");
1350 return PyCursesCheckERR(putwin(self
->win
, PyFile_AsFile(temp
)),
1355 PyCursesWindow_RedrawLine(PyCursesWindowObject
*self
, PyObject
*args
)
1358 if (!PyArg_ParseTuple(args
, "ii;beg,num", &beg
, &num
))
1360 return PyCursesCheckERR(wredrawln(self
->win
,beg
,num
), "redrawln");
1364 PyCursesWindow_Refresh(PyCursesWindowObject
*self
, PyObject
*args
)
1366 int pminrow
,pmincol
,sminrow
,smincol
,smaxrow
,smaxcol
;
1369 #ifndef WINDOW_HAS_FLAGS
1372 if (self
->win
->_flags
& _ISPAD
) {
1374 switch(PyTuple_Size(args
)) {
1376 if (!PyArg_ParseTuple(args
,
1378 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1379 &pminrow
, &pmincol
, &sminrow
,
1380 &smincol
, &smaxrow
, &smaxcol
))
1383 Py_BEGIN_ALLOW_THREADS
1384 rtn
= prefresh(self
->win
,
1385 pminrow
, pmincol
, sminrow
,
1386 smincol
, smaxrow
, smaxcol
);
1387 Py_END_ALLOW_THREADS
1388 return PyCursesCheckERR(rtn
, "prefresh");
1390 PyErr_SetString(PyCursesError
,
1391 "refresh() for a pad requires 6 arguments");
1395 if (!PyArg_ParseTuple(args
, ":refresh"))
1397 Py_BEGIN_ALLOW_THREADS
1398 rtn
= wrefresh(self
->win
);
1399 Py_END_ALLOW_THREADS
1400 return PyCursesCheckERR(rtn
, "prefresh");
1405 PyCursesWindow_SetScrollRegion(PyCursesWindowObject
*self
, PyObject
*args
)
1408 if (!PyArg_ParseTuple(args
,"ii;top, bottom",&y
,&x
))
1410 return PyCursesCheckERR(wsetscrreg(self
->win
,y
,x
), "wsetscrreg");
1414 PyCursesWindow_SubWin(PyCursesWindowObject
*self
, PyObject
*args
)
1417 int nlines
, ncols
, begin_y
, begin_x
;
1421 switch (PyTuple_Size(args
)) {
1423 if (!PyArg_ParseTuple(args
,"ii;begin_y,begin_x",&begin_y
,&begin_x
))
1427 if (!PyArg_ParseTuple(args
, "iiii;nlines,ncols,begin_y,begin_x",
1428 &nlines
,&ncols
,&begin_y
,&begin_x
))
1432 PyErr_SetString(PyExc_TypeError
, "subwin requires 2 or 4 arguments");
1436 /* printf("Subwin: %i %i %i %i \n", nlines, ncols, begin_y, begin_x); */
1437 #ifdef WINDOW_HAS_FLAGS
1438 if (self
->win
->_flags
& _ISPAD
)
1439 win
= subpad(self
->win
, nlines
, ncols
, begin_y
, begin_x
);
1442 win
= subwin(self
->win
, nlines
, ncols
, begin_y
, begin_x
);
1445 PyErr_SetString(PyCursesError
, catchall_NULL
);
1449 return (PyObject
*)PyCursesWindow_New(win
);
1453 PyCursesWindow_Scroll(PyCursesWindowObject
*self
, PyObject
*args
)
1456 switch(PyTuple_Size(args
)) {
1458 return PyCursesCheckERR(scroll(self
->win
), "scroll");
1460 if (!PyArg_ParseTuple(args
, "i;nlines", &nlines
))
1462 return PyCursesCheckERR(wscrl(self
->win
, nlines
), "scroll");
1464 PyErr_SetString(PyExc_TypeError
, "scroll requires 0 or 1 arguments");
1470 PyCursesWindow_TouchLine(PyCursesWindowObject
*self
, PyObject
*args
)
1473 switch (PyTuple_Size(args
)) {
1475 if (!PyArg_ParseTuple(args
,"ii;start,count",&st
,&cnt
))
1477 return PyCursesCheckERR(touchline(self
->win
,st
,cnt
), "touchline");
1479 if (!PyArg_ParseTuple(args
, "iii;start,count,val", &st
, &cnt
, &val
))
1481 return PyCursesCheckERR(wtouchln(self
->win
, st
, cnt
, val
), "touchline");
1483 PyErr_SetString(PyExc_TypeError
, "touchline requires 2 or 3 arguments");
1489 PyCursesWindow_Vline(PyCursesWindowObject
*self
, PyObject
*args
)
1493 int n
, x
, y
, code
= OK
;
1494 attr_t attr
= A_NORMAL
;
1497 switch (PyTuple_Size(args
)) {
1499 if (!PyArg_ParseTuple(args
, "Oi;ch or int,n", &temp
, &n
))
1503 if (!PyArg_ParseTuple(args
, "Oil;ch or int,n,attr", &temp
, &n
, &lattr
))
1508 if (!PyArg_ParseTuple(args
, "iiOi;y,x,ch or int,n", &y
, &x
, &temp
, &n
))
1510 code
= wmove(self
->win
, y
, x
);
1513 if (!PyArg_ParseTuple(args
, "iiOil; y,x,ch or int,n,attr",
1514 &y
, &x
, &temp
, &n
, &lattr
))
1517 code
= wmove(self
->win
, y
, x
);
1520 PyErr_SetString(PyExc_TypeError
, "vline requires 2 to 5 arguments");
1525 if (!PyCurses_ConvertToChtype(temp
, &ch
)) {
1526 PyErr_SetString(PyExc_TypeError
,
1527 "argument 1 or 3 must be a ch or an int");
1530 return PyCursesCheckERR(wvline(self
->win
, ch
| attr
, n
), "vline");
1532 return PyCursesCheckERR(code
, "wmove");
1535 static PyMethodDef PyCursesWindow_Methods
[] = {
1536 {"addch", (PyCFunction
)PyCursesWindow_AddCh
, METH_VARARGS
},
1537 {"addnstr", (PyCFunction
)PyCursesWindow_AddNStr
, METH_VARARGS
},
1538 {"addstr", (PyCFunction
)PyCursesWindow_AddStr
, METH_VARARGS
},
1539 {"attroff", (PyCFunction
)PyCursesWindow_AttrOff
, METH_VARARGS
},
1540 {"attron", (PyCFunction
)PyCursesWindow_AttrOn
, METH_VARARGS
},
1541 {"attrset", (PyCFunction
)PyCursesWindow_AttrSet
, METH_VARARGS
},
1542 {"bkgd", (PyCFunction
)PyCursesWindow_Bkgd
, METH_VARARGS
},
1543 {"chgat", (PyCFunction
)PyCursesWindow_ChgAt
, METH_VARARGS
},
1544 {"bkgdset", (PyCFunction
)PyCursesWindow_BkgdSet
, METH_VARARGS
},
1545 {"border", (PyCFunction
)PyCursesWindow_Border
, METH_VARARGS
},
1546 {"box", (PyCFunction
)PyCursesWindow_Box
, METH_VARARGS
},
1547 {"clear", (PyCFunction
)PyCursesWindow_wclear
, METH_NOARGS
},
1548 {"clearok", (PyCFunction
)PyCursesWindow_clearok
, METH_VARARGS
},
1549 {"clrtobot", (PyCFunction
)PyCursesWindow_wclrtobot
, METH_NOARGS
},
1550 {"clrtoeol", (PyCFunction
)PyCursesWindow_wclrtoeol
, METH_NOARGS
},
1551 {"cursyncup", (PyCFunction
)PyCursesWindow_wcursyncup
, METH_NOARGS
},
1552 {"delch", (PyCFunction
)PyCursesWindow_DelCh
, METH_VARARGS
},
1553 {"deleteln", (PyCFunction
)PyCursesWindow_wdeleteln
, METH_NOARGS
},
1554 {"derwin", (PyCFunction
)PyCursesWindow_DerWin
, METH_VARARGS
},
1555 {"echochar", (PyCFunction
)PyCursesWindow_EchoChar
, METH_VARARGS
},
1556 #ifdef NCURSES_MOUSE_VERSION
1557 {"enclose", (PyCFunction
)PyCursesWindow_Enclose
, METH_VARARGS
},
1559 {"erase", (PyCFunction
)PyCursesWindow_werase
, METH_NOARGS
},
1560 {"getbegyx", (PyCFunction
)PyCursesWindow_getbegyx
, METH_NOARGS
},
1561 {"getbkgd", (PyCFunction
)PyCursesWindow_GetBkgd
, METH_NOARGS
},
1562 {"getch", (PyCFunction
)PyCursesWindow_GetCh
, METH_VARARGS
},
1563 {"getkey", (PyCFunction
)PyCursesWindow_GetKey
, METH_VARARGS
},
1564 {"getmaxyx", (PyCFunction
)PyCursesWindow_getmaxyx
, METH_NOARGS
},
1565 {"getparyx", (PyCFunction
)PyCursesWindow_getparyx
, METH_NOARGS
},
1566 {"getstr", (PyCFunction
)PyCursesWindow_GetStr
, METH_VARARGS
},
1567 {"getyx", (PyCFunction
)PyCursesWindow_getyx
, METH_NOARGS
},
1568 {"hline", (PyCFunction
)PyCursesWindow_Hline
, METH_VARARGS
},
1569 {"idcok", (PyCFunction
)PyCursesWindow_idcok
, METH_VARARGS
},
1570 {"idlok", (PyCFunction
)PyCursesWindow_idlok
, METH_VARARGS
},
1571 {"immedok", (PyCFunction
)PyCursesWindow_immedok
, METH_VARARGS
},
1572 {"inch", (PyCFunction
)PyCursesWindow_InCh
, METH_VARARGS
},
1573 {"insch", (PyCFunction
)PyCursesWindow_InsCh
, METH_VARARGS
},
1574 {"insdelln", (PyCFunction
)PyCursesWindow_winsdelln
, METH_VARARGS
},
1575 {"insertln", (PyCFunction
)PyCursesWindow_winsertln
, METH_NOARGS
},
1576 {"insnstr", (PyCFunction
)PyCursesWindow_InsNStr
, METH_VARARGS
},
1577 {"insstr", (PyCFunction
)PyCursesWindow_InsStr
, METH_VARARGS
},
1578 {"instr", (PyCFunction
)PyCursesWindow_InStr
, METH_VARARGS
},
1579 {"is_linetouched", (PyCFunction
)PyCursesWindow_Is_LineTouched
, METH_VARARGS
},
1580 {"is_wintouched", (PyCFunction
)PyCursesWindow_is_wintouched
, METH_NOARGS
},
1581 {"keypad", (PyCFunction
)PyCursesWindow_keypad
, METH_VARARGS
},
1582 {"leaveok", (PyCFunction
)PyCursesWindow_leaveok
, METH_VARARGS
},
1583 {"move", (PyCFunction
)PyCursesWindow_wmove
, METH_VARARGS
},
1584 {"mvderwin", (PyCFunction
)PyCursesWindow_mvderwin
, METH_VARARGS
},
1585 {"mvwin", (PyCFunction
)PyCursesWindow_mvwin
, METH_VARARGS
},
1586 {"nodelay", (PyCFunction
)PyCursesWindow_nodelay
, METH_VARARGS
},
1587 {"notimeout", (PyCFunction
)PyCursesWindow_notimeout
, METH_VARARGS
},
1588 {"noutrefresh", (PyCFunction
)PyCursesWindow_NoOutRefresh
, METH_VARARGS
},
1589 /* Backward compatibility alias -- remove in Python 2.3 */
1590 {"nooutrefresh", (PyCFunction
)PyCursesWindow_NoOutRefresh
, METH_VARARGS
},
1591 {"overlay", (PyCFunction
)PyCursesWindow_Overlay
, METH_VARARGS
},
1592 {"overwrite", (PyCFunction
)PyCursesWindow_Overwrite
,
1594 {"putwin", (PyCFunction
)PyCursesWindow_PutWin
, METH_VARARGS
},
1595 {"redrawln", (PyCFunction
)PyCursesWindow_RedrawLine
, METH_VARARGS
},
1596 {"redrawwin", (PyCFunction
)PyCursesWindow_redrawwin
, METH_NOARGS
},
1597 {"refresh", (PyCFunction
)PyCursesWindow_Refresh
, METH_VARARGS
},
1598 #ifndef STRICT_SYSV_CURSES
1599 {"resize", (PyCFunction
)PyCursesWindow_wresize
, METH_VARARGS
},
1601 {"scroll", (PyCFunction
)PyCursesWindow_Scroll
, METH_VARARGS
},
1602 {"scrollok", (PyCFunction
)PyCursesWindow_scrollok
, METH_VARARGS
},
1603 {"setscrreg", (PyCFunction
)PyCursesWindow_SetScrollRegion
, METH_VARARGS
},
1604 {"standend", (PyCFunction
)PyCursesWindow_wstandend
, METH_NOARGS
},
1605 {"standout", (PyCFunction
)PyCursesWindow_wstandout
, METH_NOARGS
},
1606 {"subpad", (PyCFunction
)PyCursesWindow_SubWin
, METH_VARARGS
},
1607 {"subwin", (PyCFunction
)PyCursesWindow_SubWin
, METH_VARARGS
},
1608 {"syncdown", (PyCFunction
)PyCursesWindow_wsyncdown
, METH_NOARGS
},
1609 {"syncok", (PyCFunction
)PyCursesWindow_syncok
, METH_VARARGS
},
1610 {"syncup", (PyCFunction
)PyCursesWindow_wsyncup
, METH_NOARGS
},
1611 {"timeout", (PyCFunction
)PyCursesWindow_wtimeout
, METH_VARARGS
},
1612 {"touchline", (PyCFunction
)PyCursesWindow_TouchLine
, METH_VARARGS
},
1613 {"touchwin", (PyCFunction
)PyCursesWindow_touchwin
, METH_NOARGS
},
1614 {"untouchwin", (PyCFunction
)PyCursesWindow_untouchwin
, METH_NOARGS
},
1615 {"vline", (PyCFunction
)PyCursesWindow_Vline
, METH_VARARGS
},
1616 {NULL
, NULL
} /* sentinel */
1620 PyCursesWindow_GetAttr(PyCursesWindowObject
*self
, char *name
)
1622 return Py_FindMethod(PyCursesWindow_Methods
, (PyObject
*)self
, name
);
1625 /* -------------------------------------------------------*/
1627 PyTypeObject PyCursesWindow_Type
= {
1628 PyVarObject_HEAD_INIT(NULL
, 0)
1629 "_curses.curses window", /*tp_name*/
1630 sizeof(PyCursesWindowObject
), /*tp_basicsize*/
1633 (destructor
)PyCursesWindow_Dealloc
, /*tp_dealloc*/
1635 (getattrfunc
)PyCursesWindow_GetAttr
, /*tp_getattr*/
1636 (setattrfunc
)0, /*tp_setattr*/
1640 0, /*tp_as_sequence*/
1641 0, /*tp_as_mapping*/
1645 /*********************************************************************
1647 **********************************************************************/
1649 NoArgNoReturnFunction(beep
)
1650 NoArgNoReturnFunction(def_prog_mode
)
1651 NoArgNoReturnFunction(def_shell_mode
)
1652 NoArgNoReturnFunction(doupdate
)
1653 NoArgNoReturnFunction(endwin
)
1654 NoArgNoReturnFunction(flash
)
1655 NoArgNoReturnFunction(nocbreak
)
1656 NoArgNoReturnFunction(noecho
)
1657 NoArgNoReturnFunction(nonl
)
1658 NoArgNoReturnFunction(noraw
)
1659 NoArgNoReturnFunction(reset_prog_mode
)
1660 NoArgNoReturnFunction(reset_shell_mode
)
1661 NoArgNoReturnFunction(resetty
)
1662 NoArgNoReturnFunction(savetty
)
1664 NoArgOrFlagNoReturnFunction(cbreak
)
1665 NoArgOrFlagNoReturnFunction(echo
)
1666 NoArgOrFlagNoReturnFunction(nl
)
1667 NoArgOrFlagNoReturnFunction(raw
)
1669 NoArgReturnIntFunction(baudrate
)
1670 NoArgReturnIntFunction(termattrs
)
1672 NoArgReturnStringFunction(termname
)
1673 NoArgReturnStringFunction(longname
)
1675 NoArgTrueFalseFunction(can_change_color
)
1676 NoArgTrueFalseFunction(has_colors
)
1677 NoArgTrueFalseFunction(has_ic
)
1678 NoArgTrueFalseFunction(has_il
)
1679 NoArgTrueFalseFunction(isendwin
)
1680 NoArgNoReturnVoidFunction(flushinp
)
1681 NoArgNoReturnVoidFunction(noqiflush
)
1684 PyCurses_filter(PyObject
*self
)
1686 /* not checking for PyCursesInitialised here since filter() must
1687 be called before initscr() */
1694 PyCurses_Color_Content(PyObject
*self
, PyObject
*args
)
1699 PyCursesInitialisedColor
1701 if (!PyArg_ParseTuple(args
, "h:color_content", &color
)) return NULL
;
1703 if (color_content(color
, &r
, &g
, &b
) != ERR
)
1704 return Py_BuildValue("(iii)", r
, g
, b
);
1706 PyErr_SetString(PyCursesError
,
1707 "Argument 1 was out of range. Check value of COLORS.");
1713 PyCurses_color_pair(PyObject
*self
, PyObject
*args
)
1718 PyCursesInitialisedColor
1720 if (!PyArg_ParseTuple(args
, "i:color_pair", &n
)) return NULL
;
1721 return PyInt_FromLong((long) (n
<< 8));
1725 PyCurses_Curs_Set(PyObject
*self
, PyObject
*args
)
1731 if (!PyArg_ParseTuple(args
, "i:curs_set", &vis
)) return NULL
;
1733 erg
= curs_set(vis
);
1734 if (erg
== ERR
) return PyCursesCheckERR(erg
, "curs_set");
1736 return PyInt_FromLong((long) erg
);
1740 PyCurses_Delay_Output(PyObject
*self
, PyObject
*args
)
1746 if (!PyArg_ParseTuple(args
, "i:delay_output", &ms
)) return NULL
;
1748 return PyCursesCheckERR(delay_output(ms
), "delay_output");
1752 PyCurses_EraseChar(PyObject
*self
)
1760 return PyString_FromStringAndSize(&ch
, 1);
1764 PyCurses_getsyx(PyObject
*self
)
1772 return Py_BuildValue("(ii)", y
, x
);
1775 #ifdef NCURSES_MOUSE_VERSION
1777 PyCurses_GetMouse(PyObject
*self
)
1784 rtn
= getmouse( &event
);
1786 PyErr_SetString(PyCursesError
, "getmouse() returned ERR");
1789 return Py_BuildValue("(hiiil)",
1791 event
.x
, event
.y
, event
.z
,
1792 (long) event
.bstate
);
1796 PyCurses_UngetMouse(PyObject
*self
, PyObject
*args
)
1801 if (!PyArg_ParseTuple(args
, "hiiil",
1803 &event
.x
, &event
.y
, &event
.z
,
1804 (int *) &event
.bstate
))
1807 return PyCursesCheckERR(ungetmouse(&event
), "ungetmouse");
1812 PyCurses_GetWin(PyCursesWindowObject
*self
, PyObject
*temp
)
1818 if (!PyFile_Check(temp
)) {
1819 PyErr_SetString(PyExc_TypeError
, "argument must be a file object");
1823 win
= getwin(PyFile_AsFile(temp
));
1826 PyErr_SetString(PyCursesError
, catchall_NULL
);
1830 return PyCursesWindow_New(win
);
1834 PyCurses_HalfDelay(PyObject
*self
, PyObject
*args
)
1836 unsigned char tenths
;
1840 if (!PyArg_ParseTuple(args
, "b:halfdelay", &tenths
)) return NULL
;
1842 return PyCursesCheckERR(halfdelay(tenths
), "halfdelay");
1845 #ifndef STRICT_SYSV_CURSES
1847 static PyObject
* PyCurses_has_key(PyObject
*self
, PyObject
*args
)
1853 if (!PyArg_ParseTuple(args
,"i",&ch
)) return NULL
;
1855 if (has_key(ch
) == FALSE
) {
1856 Py_INCREF(Py_False
);
1862 #endif /* STRICT_SYSV_CURSES */
1865 PyCurses_Init_Color(PyObject
*self
, PyObject
*args
)
1867 short color
, r
, g
, b
;
1870 PyCursesInitialisedColor
1872 switch(PyTuple_Size(args
)) {
1874 if (!PyArg_ParseTuple(args
, "hhhh;color,r,g,b", &color
, &r
, &g
, &b
)) return NULL
;
1877 PyErr_SetString(PyExc_TypeError
, "init_color requires 4 arguments");
1881 return PyCursesCheckERR(init_color(color
, r
, g
, b
), "init_color");
1885 PyCurses_Init_Pair(PyObject
*self
, PyObject
*args
)
1890 PyCursesInitialisedColor
1892 if (PyTuple_Size(args
) != 3) {
1893 PyErr_SetString(PyExc_TypeError
, "init_pair requires 3 arguments");
1897 if (!PyArg_ParseTuple(args
, "hhh;pair, f, b", &pair
, &f
, &b
)) return NULL
;
1899 return PyCursesCheckERR(init_pair(pair
, f
, b
), "init_pair");
1902 static PyObject
*ModDict
;
1905 PyCurses_InitScr(PyObject
*self
)
1909 if (initialised
== TRUE
) {
1911 return (PyObject
*)PyCursesWindow_New(stdscr
);
1917 PyErr_SetString(PyCursesError
, catchall_NULL
);
1921 initialised
= initialised_setupterm
= TRUE
;
1923 /* This was moved from initcurses() because it core dumped on SGI,
1924 where they're not defined until you've called initscr() */
1925 #define SetDictInt(string,ch) \
1927 PyObject *o = PyInt_FromLong((long) (ch)); \
1928 if (o && PyDict_SetItemString(ModDict, string, o) == 0) { \
1933 /* Here are some graphic symbols you can use */
1934 SetDictInt("ACS_ULCORNER", (ACS_ULCORNER
));
1935 SetDictInt("ACS_LLCORNER", (ACS_LLCORNER
));
1936 SetDictInt("ACS_URCORNER", (ACS_URCORNER
));
1937 SetDictInt("ACS_LRCORNER", (ACS_LRCORNER
));
1938 SetDictInt("ACS_LTEE", (ACS_LTEE
));
1939 SetDictInt("ACS_RTEE", (ACS_RTEE
));
1940 SetDictInt("ACS_BTEE", (ACS_BTEE
));
1941 SetDictInt("ACS_TTEE", (ACS_TTEE
));
1942 SetDictInt("ACS_HLINE", (ACS_HLINE
));
1943 SetDictInt("ACS_VLINE", (ACS_VLINE
));
1944 SetDictInt("ACS_PLUS", (ACS_PLUS
));
1945 #if !defined(__hpux) || defined(HAVE_NCURSES_H)
1946 /* On HP/UX 11, these are of type cchar_t, which is not an
1947 integral type. If this is a problem on more platforms, a
1948 configure test should be added to determine whether ACS_S1
1949 is of integral type. */
1950 SetDictInt("ACS_S1", (ACS_S1
));
1951 SetDictInt("ACS_S9", (ACS_S9
));
1952 SetDictInt("ACS_DIAMOND", (ACS_DIAMOND
));
1953 SetDictInt("ACS_CKBOARD", (ACS_CKBOARD
));
1954 SetDictInt("ACS_DEGREE", (ACS_DEGREE
));
1955 SetDictInt("ACS_PLMINUS", (ACS_PLMINUS
));
1956 SetDictInt("ACS_BULLET", (ACS_BULLET
));
1957 SetDictInt("ACS_LARROW", (ACS_LARROW
));
1958 SetDictInt("ACS_RARROW", (ACS_RARROW
));
1959 SetDictInt("ACS_DARROW", (ACS_DARROW
));
1960 SetDictInt("ACS_UARROW", (ACS_UARROW
));
1961 SetDictInt("ACS_BOARD", (ACS_BOARD
));
1962 SetDictInt("ACS_LANTERN", (ACS_LANTERN
));
1963 SetDictInt("ACS_BLOCK", (ACS_BLOCK
));
1965 SetDictInt("ACS_BSSB", (ACS_ULCORNER
));
1966 SetDictInt("ACS_SSBB", (ACS_LLCORNER
));
1967 SetDictInt("ACS_BBSS", (ACS_URCORNER
));
1968 SetDictInt("ACS_SBBS", (ACS_LRCORNER
));
1969 SetDictInt("ACS_SBSS", (ACS_RTEE
));
1970 SetDictInt("ACS_SSSB", (ACS_LTEE
));
1971 SetDictInt("ACS_SSBS", (ACS_BTEE
));
1972 SetDictInt("ACS_BSSS", (ACS_TTEE
));
1973 SetDictInt("ACS_BSBS", (ACS_HLINE
));
1974 SetDictInt("ACS_SBSB", (ACS_VLINE
));
1975 SetDictInt("ACS_SSSS", (ACS_PLUS
));
1977 /* The following are never available with strict SYSV curses */
1979 SetDictInt("ACS_S3", (ACS_S3
));
1982 SetDictInt("ACS_S7", (ACS_S7
));
1985 SetDictInt("ACS_LEQUAL", (ACS_LEQUAL
));
1988 SetDictInt("ACS_GEQUAL", (ACS_GEQUAL
));
1991 SetDictInt("ACS_PI", (ACS_PI
));
1994 SetDictInt("ACS_NEQUAL", (ACS_NEQUAL
));
1997 SetDictInt("ACS_STERLING", (ACS_STERLING
));
2000 SetDictInt("LINES", LINES
);
2001 SetDictInt("COLS", COLS
);
2003 return (PyObject
*)PyCursesWindow_New(win
);
2007 PyCurses_setupterm(PyObject
* self
, PyObject
*args
, PyObject
* keywds
)
2011 char* termstr
= NULL
;
2013 static char *kwlist
[] = {"term", "fd", NULL
};
2015 if (!PyArg_ParseTupleAndKeywords(
2016 args
, keywds
, "|zi:setupterm", kwlist
, &termstr
, &fd
)) {
2021 PyObject
* sys_stdout
;
2023 sys_stdout
= PySys_GetObject("stdout");
2025 if (sys_stdout
== NULL
) {
2032 fd
= PyObject_AsFileDescriptor(sys_stdout
);
2039 if (setupterm(termstr
,fd
,&err
) == ERR
) {
2040 char* s
= "setupterm: unknown error";
2043 s
= "setupterm: could not find terminal";
2044 } else if (err
== -1) {
2045 s
= "setupterm: could not find terminfo database";
2048 PyErr_SetString(PyCursesError
,s
);
2052 initialised_setupterm
= TRUE
;
2059 PyCurses_IntrFlush(PyObject
*self
, PyObject
*args
)
2065 switch(PyTuple_Size(args
)) {
2067 if (!PyArg_ParseTuple(args
,"i;True(1), False(0)",&ch
)) return NULL
;
2070 PyErr_SetString(PyExc_TypeError
, "intrflush requires 1 argument");
2074 return PyCursesCheckERR(intrflush(NULL
,ch
), "intrflush");
2077 #ifdef HAVE_CURSES_IS_TERM_RESIZED
2079 PyCurses_Is_Term_Resized(PyObject
*self
, PyObject
*args
)
2087 if (!PyArg_ParseTuple(args
,"ii:is_term_resized", &lines
, &columns
))
2089 result
= is_term_resized(lines
, columns
);
2090 if (result
== TRUE
) {
2094 Py_INCREF(Py_False
);
2098 #endif /* HAVE_CURSES_IS_TERM_RESIZED */
2100 #if !defined(__NetBSD__)
2102 PyCurses_KeyName(PyObject
*self
, PyObject
*args
)
2109 if (!PyArg_ParseTuple(args
,"i",&ch
)) return NULL
;
2112 PyErr_SetString(PyExc_ValueError
, "invalid key number");
2117 return PyString_FromString((knp
== NULL
) ? "" : (char *)knp
);
2122 PyCurses_KillChar(PyObject
*self
)
2128 return PyString_FromStringAndSize(&ch
, 1);
2132 PyCurses_Meta(PyObject
*self
, PyObject
*args
)
2138 switch(PyTuple_Size(args
)) {
2140 if (!PyArg_ParseTuple(args
,"i;True(1), False(0)",&ch
)) return NULL
;
2143 PyErr_SetString(PyExc_TypeError
, "meta requires 1 argument");
2147 return PyCursesCheckERR(meta(stdscr
, ch
), "meta");
2150 #ifdef NCURSES_MOUSE_VERSION
2152 PyCurses_MouseInterval(PyObject
*self
, PyObject
*args
)
2157 if (!PyArg_ParseTuple(args
,"i;interval",&interval
))
2159 return PyCursesCheckERR(mouseinterval(interval
), "mouseinterval");
2163 PyCurses_MouseMask(PyObject
*self
, PyObject
*args
)
2166 mmask_t oldmask
, availmask
;
2169 if (!PyArg_ParseTuple(args
,"i;mousemask",&newmask
))
2171 availmask
= mousemask(newmask
, &oldmask
);
2172 return Py_BuildValue("(ll)", (long)availmask
, (long)oldmask
);
2177 PyCurses_Napms(PyObject
*self
, PyObject
*args
)
2182 if (!PyArg_ParseTuple(args
, "i;ms", &ms
)) return NULL
;
2184 return Py_BuildValue("i", napms(ms
));
2189 PyCurses_NewPad(PyObject
*self
, PyObject
*args
)
2196 if (!PyArg_ParseTuple(args
,"ii;nlines,ncols",&nlines
,&ncols
)) return NULL
;
2198 win
= newpad(nlines
, ncols
);
2201 PyErr_SetString(PyCursesError
, catchall_NULL
);
2205 return (PyObject
*)PyCursesWindow_New(win
);
2209 PyCurses_NewWindow(PyObject
*self
, PyObject
*args
)
2212 int nlines
, ncols
, begin_y
=0, begin_x
=0;
2216 switch (PyTuple_Size(args
)) {
2218 if (!PyArg_ParseTuple(args
,"ii;nlines,ncols",&nlines
,&ncols
))
2222 if (!PyArg_ParseTuple(args
, "iiii;nlines,ncols,begin_y,begin_x",
2223 &nlines
,&ncols
,&begin_y
,&begin_x
))
2227 PyErr_SetString(PyExc_TypeError
, "newwin requires 2 or 4 arguments");
2231 win
= newwin(nlines
,ncols
,begin_y
,begin_x
);
2233 PyErr_SetString(PyCursesError
, catchall_NULL
);
2237 return (PyObject
*)PyCursesWindow_New(win
);
2241 PyCurses_Pair_Content(PyObject
*self
, PyObject
*args
)
2246 PyCursesInitialisedColor
2248 switch(PyTuple_Size(args
)) {
2250 if (!PyArg_ParseTuple(args
, "h;pair", &pair
)) return NULL
;
2253 PyErr_SetString(PyExc_TypeError
, "pair_content requires 1 argument");
2257 if (pair_content(pair
, &f
, &b
)==ERR
) {
2258 PyErr_SetString(PyCursesError
,
2259 "Argument 1 was out of range. (1..COLOR_PAIRS-1)");
2263 return Py_BuildValue("(ii)", f
, b
);
2267 PyCurses_pair_number(PyObject
*self
, PyObject
*args
)
2272 PyCursesInitialisedColor
2274 switch(PyTuple_Size(args
)) {
2276 if (!PyArg_ParseTuple(args
, "i;pairvalue", &n
)) return NULL
;
2279 PyErr_SetString(PyExc_TypeError
,
2280 "pair_number requires 1 argument");
2284 return PyInt_FromLong((long) ((n
& A_COLOR
) >> 8));
2288 PyCurses_Putp(PyObject
*self
, PyObject
*args
)
2292 if (!PyArg_ParseTuple(args
,"s;str", &str
)) return NULL
;
2293 return PyCursesCheckERR(putp(str
), "putp");
2297 PyCurses_QiFlush(PyObject
*self
, PyObject
*args
)
2303 switch(PyTuple_Size(args
)) {
2309 if (!PyArg_ParseTuple(args
, "i;True(1) or False(0)", &flag
)) return NULL
;
2310 if (flag
) qiflush();
2315 PyErr_SetString(PyExc_TypeError
, "qiflush requires 0 or 1 arguments");
2320 /* Internal helper used for updating curses.LINES, curses.COLS, _curses.LINES
2321 * and _curses.COLS */
2322 #if defined(HAVE_CURSES_RESIZETERM) || defined(HAVE_CURSES_RESIZE_TERM)
2324 update_lines_cols(void)
2327 PyObject
*m
= PyImport_ImportModuleNoBlock("curses");
2332 o
= PyInt_FromLong(LINES
);
2337 if (PyObject_SetAttrString(m
, "LINES", o
)) {
2342 if (PyDict_SetItemString(ModDict
, "LINES", o
)) {
2348 o
= PyInt_FromLong(COLS
);
2353 if (PyObject_SetAttrString(m
, "COLS", o
)) {
2358 if (PyDict_SetItemString(ModDict
, "COLS", o
)) {
2369 #ifdef HAVE_CURSES_RESIZETERM
2371 PyCurses_ResizeTerm(PyObject
*self
, PyObject
*args
)
2379 if (!PyArg_ParseTuple(args
,"ii:resizeterm", &lines
, &columns
))
2382 result
= PyCursesCheckERR(resizeterm(lines
, columns
), "resizeterm");
2385 if (!update_lines_cols())
2392 #ifdef HAVE_CURSES_RESIZE_TERM
2394 PyCurses_Resize_Term(PyObject
*self
, PyObject
*args
)
2403 if (!PyArg_ParseTuple(args
,"ii:resize_term", &lines
, &columns
))
2406 result
= PyCursesCheckERR(resize_term(lines
, columns
), "resize_term");
2409 if (!update_lines_cols())
2413 #endif /* HAVE_CURSES_RESIZE_TERM */
2416 PyCurses_setsyx(PyObject
*self
, PyObject
*args
)
2422 if (PyTuple_Size(args
)!=2) {
2423 PyErr_SetString(PyExc_TypeError
, "setsyx requires 2 arguments");
2427 if (!PyArg_ParseTuple(args
, "ii;y, x", &y
, &x
)) return NULL
;
2436 PyCurses_Start_Color(PyObject
*self
)
2443 code
= start_color();
2445 initialisedcolors
= TRUE
;
2446 c
= PyInt_FromLong((long) COLORS
);
2447 PyDict_SetItemString(ModDict
, "COLORS", c
);
2449 cp
= PyInt_FromLong((long) COLOR_PAIRS
);
2450 PyDict_SetItemString(ModDict
, "COLOR_PAIRS", cp
);
2455 PyErr_SetString(PyCursesError
, "start_color() returned ERR");
2461 PyCurses_tigetflag(PyObject
*self
, PyObject
*args
)
2465 PyCursesSetupTermCalled
;
2467 if (!PyArg_ParseTuple(args
, "z", &capname
))
2470 return PyInt_FromLong( (long) tigetflag( capname
) );
2474 PyCurses_tigetnum(PyObject
*self
, PyObject
*args
)
2478 PyCursesSetupTermCalled
;
2480 if (!PyArg_ParseTuple(args
, "z", &capname
))
2483 return PyInt_FromLong( (long) tigetnum( capname
) );
2487 PyCurses_tigetstr(PyObject
*self
, PyObject
*args
)
2491 PyCursesSetupTermCalled
;
2493 if (!PyArg_ParseTuple(args
, "z", &capname
))
2496 capname
= tigetstr( capname
);
2497 if (capname
== 0 || capname
== (char*) -1) {
2501 return PyString_FromString( capname
);
2505 PyCurses_tparm(PyObject
*self
, PyObject
*args
)
2508 char* result
= NULL
;
2509 int i1
=0,i2
=0,i3
=0,i4
=0,i5
=0,i6
=0,i7
=0,i8
=0,i9
=0;
2511 PyCursesSetupTermCalled
;
2513 if (!PyArg_ParseTuple(args
, "s|iiiiiiiii:tparm",
2514 &fmt
, &i1
, &i2
, &i3
, &i4
,
2515 &i5
, &i6
, &i7
, &i8
, &i9
)) {
2519 result
= tparm(fmt
,i1
,i2
,i3
,i4
,i5
,i6
,i7
,i8
,i9
);
2521 PyErr_SetString(PyCursesError
, "tparm() returned NULL");
2525 return PyString_FromString(result
);
2529 PyCurses_TypeAhead(PyObject
*self
, PyObject
*args
)
2535 if (!PyArg_ParseTuple(args
,"i;fd",&fd
)) return NULL
;
2537 return PyCursesCheckERR(typeahead( fd
), "typeahead");
2541 PyCurses_UnCtrl(PyObject
*self
, PyObject
*args
)
2548 if (!PyArg_ParseTuple(args
,"O;ch or int",&temp
)) return NULL
;
2550 if (PyInt_Check(temp
))
2551 ch
= (chtype
) PyInt_AsLong(temp
);
2552 else if (PyString_Check(temp
))
2553 ch
= (chtype
) *PyString_AsString(temp
);
2555 PyErr_SetString(PyExc_TypeError
, "argument must be a ch or an int");
2559 return PyString_FromString(unctrl(ch
));
2563 PyCurses_UngetCh(PyObject
*self
, PyObject
*args
)
2570 if (!PyArg_ParseTuple(args
,"O;ch or int",&temp
)) return NULL
;
2572 if (PyInt_Check(temp
))
2573 ch
= (int) PyInt_AsLong(temp
);
2574 else if (PyString_Check(temp
))
2575 ch
= (int) *PyString_AsString(temp
);
2577 PyErr_SetString(PyExc_TypeError
, "argument must be a ch or an int");
2581 return PyCursesCheckERR(ungetch(ch
), "ungetch");
2585 PyCurses_Use_Env(PyObject
*self
, PyObject
*args
)
2591 switch(PyTuple_Size(args
)) {
2593 if (!PyArg_ParseTuple(args
,"i;True(1), False(0)",&flag
))
2597 PyErr_SetString(PyExc_TypeError
, "use_env requires 1 argument");
2605 #ifndef STRICT_SYSV_CURSES
2607 PyCurses_Use_Default_Colors(PyObject
*self
)
2612 PyCursesInitialisedColor
2614 code
= use_default_colors();
2619 PyErr_SetString(PyCursesError
, "use_default_colors() returned ERR");
2623 #endif /* STRICT_SYSV_CURSES */
2625 /* List of functions defined in the module */
2627 static PyMethodDef PyCurses_methods
[] = {
2628 {"baudrate", (PyCFunction
)PyCurses_baudrate
, METH_NOARGS
},
2629 {"beep", (PyCFunction
)PyCurses_beep
, METH_NOARGS
},
2630 {"can_change_color", (PyCFunction
)PyCurses_can_change_color
, METH_NOARGS
},
2631 {"cbreak", (PyCFunction
)PyCurses_cbreak
, METH_VARARGS
},
2632 {"color_content", (PyCFunction
)PyCurses_Color_Content
, METH_VARARGS
},
2633 {"color_pair", (PyCFunction
)PyCurses_color_pair
, METH_VARARGS
},
2634 {"curs_set", (PyCFunction
)PyCurses_Curs_Set
, METH_VARARGS
},
2635 {"def_prog_mode", (PyCFunction
)PyCurses_def_prog_mode
, METH_NOARGS
},
2636 {"def_shell_mode", (PyCFunction
)PyCurses_def_shell_mode
, METH_NOARGS
},
2637 {"delay_output", (PyCFunction
)PyCurses_Delay_Output
, METH_VARARGS
},
2638 {"doupdate", (PyCFunction
)PyCurses_doupdate
, METH_NOARGS
},
2639 {"echo", (PyCFunction
)PyCurses_echo
, METH_VARARGS
},
2640 {"endwin", (PyCFunction
)PyCurses_endwin
, METH_NOARGS
},
2641 {"erasechar", (PyCFunction
)PyCurses_EraseChar
, METH_NOARGS
},
2642 {"filter", (PyCFunction
)PyCurses_filter
, METH_NOARGS
},
2643 {"flash", (PyCFunction
)PyCurses_flash
, METH_NOARGS
},
2644 {"flushinp", (PyCFunction
)PyCurses_flushinp
, METH_NOARGS
},
2645 #ifdef NCURSES_MOUSE_VERSION
2646 {"getmouse", (PyCFunction
)PyCurses_GetMouse
, METH_NOARGS
},
2647 {"ungetmouse", (PyCFunction
)PyCurses_UngetMouse
, METH_VARARGS
},
2649 {"getsyx", (PyCFunction
)PyCurses_getsyx
, METH_NOARGS
},
2650 {"getwin", (PyCFunction
)PyCurses_GetWin
, METH_O
},
2651 {"has_colors", (PyCFunction
)PyCurses_has_colors
, METH_NOARGS
},
2652 {"has_ic", (PyCFunction
)PyCurses_has_ic
, METH_NOARGS
},
2653 {"has_il", (PyCFunction
)PyCurses_has_il
, METH_NOARGS
},
2654 #ifndef STRICT_SYSV_CURSES
2655 {"has_key", (PyCFunction
)PyCurses_has_key
, METH_VARARGS
},
2657 {"halfdelay", (PyCFunction
)PyCurses_HalfDelay
, METH_VARARGS
},
2658 {"init_color", (PyCFunction
)PyCurses_Init_Color
, METH_VARARGS
},
2659 {"init_pair", (PyCFunction
)PyCurses_Init_Pair
, METH_VARARGS
},
2660 {"initscr", (PyCFunction
)PyCurses_InitScr
, METH_NOARGS
},
2661 {"intrflush", (PyCFunction
)PyCurses_IntrFlush
, METH_VARARGS
},
2662 {"isendwin", (PyCFunction
)PyCurses_isendwin
, METH_NOARGS
},
2663 #ifdef HAVE_CURSES_IS_TERM_RESIZED
2664 {"is_term_resized", (PyCFunction
)PyCurses_Is_Term_Resized
, METH_VARARGS
},
2666 #if !defined(__NetBSD__)
2667 {"keyname", (PyCFunction
)PyCurses_KeyName
, METH_VARARGS
},
2669 {"killchar", (PyCFunction
)PyCurses_KillChar
, METH_NOARGS
},
2670 {"longname", (PyCFunction
)PyCurses_longname
, METH_NOARGS
},
2671 {"meta", (PyCFunction
)PyCurses_Meta
, METH_VARARGS
},
2672 #ifdef NCURSES_MOUSE_VERSION
2673 {"mouseinterval", (PyCFunction
)PyCurses_MouseInterval
, METH_VARARGS
},
2674 {"mousemask", (PyCFunction
)PyCurses_MouseMask
, METH_VARARGS
},
2676 {"napms", (PyCFunction
)PyCurses_Napms
, METH_VARARGS
},
2677 {"newpad", (PyCFunction
)PyCurses_NewPad
, METH_VARARGS
},
2678 {"newwin", (PyCFunction
)PyCurses_NewWindow
, METH_VARARGS
},
2679 {"nl", (PyCFunction
)PyCurses_nl
, METH_VARARGS
},
2680 {"nocbreak", (PyCFunction
)PyCurses_nocbreak
, METH_NOARGS
},
2681 {"noecho", (PyCFunction
)PyCurses_noecho
, METH_NOARGS
},
2682 {"nonl", (PyCFunction
)PyCurses_nonl
, METH_NOARGS
},
2683 {"noqiflush", (PyCFunction
)PyCurses_noqiflush
, METH_NOARGS
},
2684 {"noraw", (PyCFunction
)PyCurses_noraw
, METH_NOARGS
},
2685 {"pair_content", (PyCFunction
)PyCurses_Pair_Content
, METH_VARARGS
},
2686 {"pair_number", (PyCFunction
)PyCurses_pair_number
, METH_VARARGS
},
2687 {"putp", (PyCFunction
)PyCurses_Putp
, METH_VARARGS
},
2688 {"qiflush", (PyCFunction
)PyCurses_QiFlush
, METH_VARARGS
},
2689 {"raw", (PyCFunction
)PyCurses_raw
, METH_VARARGS
},
2690 {"reset_prog_mode", (PyCFunction
)PyCurses_reset_prog_mode
, METH_NOARGS
},
2691 {"reset_shell_mode", (PyCFunction
)PyCurses_reset_shell_mode
, METH_NOARGS
},
2692 {"resetty", (PyCFunction
)PyCurses_resetty
, METH_NOARGS
},
2693 #ifdef HAVE_CURSES_RESIZETERM
2694 {"resizeterm", (PyCFunction
)PyCurses_ResizeTerm
, METH_VARARGS
},
2696 #ifdef HAVE_CURSES_RESIZE_TERM
2697 {"resize_term", (PyCFunction
)PyCurses_Resize_Term
, METH_VARARGS
},
2699 {"savetty", (PyCFunction
)PyCurses_savetty
, METH_NOARGS
},
2700 {"setsyx", (PyCFunction
)PyCurses_setsyx
, METH_VARARGS
},
2701 {"setupterm", (PyCFunction
)PyCurses_setupterm
,
2702 METH_VARARGS
|METH_KEYWORDS
},
2703 {"start_color", (PyCFunction
)PyCurses_Start_Color
, METH_NOARGS
},
2704 {"termattrs", (PyCFunction
)PyCurses_termattrs
, METH_NOARGS
},
2705 {"termname", (PyCFunction
)PyCurses_termname
, METH_NOARGS
},
2706 {"tigetflag", (PyCFunction
)PyCurses_tigetflag
, METH_VARARGS
},
2707 {"tigetnum", (PyCFunction
)PyCurses_tigetnum
, METH_VARARGS
},
2708 {"tigetstr", (PyCFunction
)PyCurses_tigetstr
, METH_VARARGS
},
2709 {"tparm", (PyCFunction
)PyCurses_tparm
, METH_VARARGS
},
2710 {"typeahead", (PyCFunction
)PyCurses_TypeAhead
, METH_VARARGS
},
2711 {"unctrl", (PyCFunction
)PyCurses_UnCtrl
, METH_VARARGS
},
2712 {"ungetch", (PyCFunction
)PyCurses_UngetCh
, METH_VARARGS
},
2713 {"use_env", (PyCFunction
)PyCurses_Use_Env
, METH_VARARGS
},
2714 #ifndef STRICT_SYSV_CURSES
2715 {"use_default_colors", (PyCFunction
)PyCurses_Use_Default_Colors
, METH_NOARGS
},
2717 {NULL
, NULL
} /* sentinel */
2720 /* Initialization function for the module */
2725 PyObject
*m
, *d
, *v
, *c_api_object
;
2726 static void *PyCurses_API
[PyCurses_API_pointers
];
2728 /* Initialize object type */
2729 Py_TYPE(&PyCursesWindow_Type
) = &PyType_Type
;
2731 /* Initialize the C API pointer array */
2732 PyCurses_API
[0] = (void *)&PyCursesWindow_Type
;
2733 PyCurses_API
[1] = (void *)func_PyCursesSetupTermCalled
;
2734 PyCurses_API
[2] = (void *)func_PyCursesInitialised
;
2735 PyCurses_API
[3] = (void *)func_PyCursesInitialisedColor
;
2737 /* Create the module and add the functions */
2738 m
= Py_InitModule("_curses", PyCurses_methods
);
2742 /* Add some symbolic constants to the module */
2743 d
= PyModule_GetDict(m
);
2746 ModDict
= d
; /* For PyCurses_InitScr to use later */
2748 /* Add a CObject for the C API */
2749 c_api_object
= PyCObject_FromVoidPtr((void *)PyCurses_API
, NULL
);
2750 PyDict_SetItemString(d
, "_C_API", c_api_object
);
2751 Py_DECREF(c_api_object
);
2753 /* For exception curses.error */
2754 PyCursesError
= PyErr_NewException("_curses.error", NULL
, NULL
);
2755 PyDict_SetItemString(d
, "error", PyCursesError
);
2757 /* Make the version available */
2758 v
= PyString_FromString(PyCursesVersion
);
2759 PyDict_SetItemString(d
, "version", v
);
2760 PyDict_SetItemString(d
, "__version__", v
);
2763 SetDictInt("ERR", ERR
);
2764 SetDictInt("OK", OK
);
2766 /* Here are some attributes you can add to chars to print */
2768 SetDictInt("A_ATTRIBUTES", A_ATTRIBUTES
);
2769 SetDictInt("A_NORMAL", A_NORMAL
);
2770 SetDictInt("A_STANDOUT", A_STANDOUT
);
2771 SetDictInt("A_UNDERLINE", A_UNDERLINE
);
2772 SetDictInt("A_REVERSE", A_REVERSE
);
2773 SetDictInt("A_BLINK", A_BLINK
);
2774 SetDictInt("A_DIM", A_DIM
);
2775 SetDictInt("A_BOLD", A_BOLD
);
2776 SetDictInt("A_ALTCHARSET", A_ALTCHARSET
);
2777 #if !defined(__NetBSD__)
2778 SetDictInt("A_INVIS", A_INVIS
);
2780 SetDictInt("A_PROTECT", A_PROTECT
);
2781 SetDictInt("A_CHARTEXT", A_CHARTEXT
);
2782 SetDictInt("A_COLOR", A_COLOR
);
2784 /* The following are never available with strict SYSV curses */
2786 SetDictInt("A_HORIZONTAL", A_HORIZONTAL
);
2789 SetDictInt("A_LEFT", A_LEFT
);
2792 SetDictInt("A_LOW", A_LOW
);
2795 SetDictInt("A_RIGHT", A_RIGHT
);
2798 SetDictInt("A_TOP", A_TOP
);
2801 SetDictInt("A_VERTICAL", A_VERTICAL
);
2804 SetDictInt("COLOR_BLACK", COLOR_BLACK
);
2805 SetDictInt("COLOR_RED", COLOR_RED
);
2806 SetDictInt("COLOR_GREEN", COLOR_GREEN
);
2807 SetDictInt("COLOR_YELLOW", COLOR_YELLOW
);
2808 SetDictInt("COLOR_BLUE", COLOR_BLUE
);
2809 SetDictInt("COLOR_MAGENTA", COLOR_MAGENTA
);
2810 SetDictInt("COLOR_CYAN", COLOR_CYAN
);
2811 SetDictInt("COLOR_WHITE", COLOR_WHITE
);
2813 #ifdef NCURSES_MOUSE_VERSION
2814 /* Mouse-related constants */
2815 SetDictInt("BUTTON1_PRESSED", BUTTON1_PRESSED
);
2816 SetDictInt("BUTTON1_RELEASED", BUTTON1_RELEASED
);
2817 SetDictInt("BUTTON1_CLICKED", BUTTON1_CLICKED
);
2818 SetDictInt("BUTTON1_DOUBLE_CLICKED", BUTTON1_DOUBLE_CLICKED
);
2819 SetDictInt("BUTTON1_TRIPLE_CLICKED", BUTTON1_TRIPLE_CLICKED
);
2821 SetDictInt("BUTTON2_PRESSED", BUTTON2_PRESSED
);
2822 SetDictInt("BUTTON2_RELEASED", BUTTON2_RELEASED
);
2823 SetDictInt("BUTTON2_CLICKED", BUTTON2_CLICKED
);
2824 SetDictInt("BUTTON2_DOUBLE_CLICKED", BUTTON2_DOUBLE_CLICKED
);
2825 SetDictInt("BUTTON2_TRIPLE_CLICKED", BUTTON2_TRIPLE_CLICKED
);
2827 SetDictInt("BUTTON3_PRESSED", BUTTON3_PRESSED
);
2828 SetDictInt("BUTTON3_RELEASED", BUTTON3_RELEASED
);
2829 SetDictInt("BUTTON3_CLICKED", BUTTON3_CLICKED
);
2830 SetDictInt("BUTTON3_DOUBLE_CLICKED", BUTTON3_DOUBLE_CLICKED
);
2831 SetDictInt("BUTTON3_TRIPLE_CLICKED", BUTTON3_TRIPLE_CLICKED
);
2833 SetDictInt("BUTTON4_PRESSED", BUTTON4_PRESSED
);
2834 SetDictInt("BUTTON4_RELEASED", BUTTON4_RELEASED
);
2835 SetDictInt("BUTTON4_CLICKED", BUTTON4_CLICKED
);
2836 SetDictInt("BUTTON4_DOUBLE_CLICKED", BUTTON4_DOUBLE_CLICKED
);
2837 SetDictInt("BUTTON4_TRIPLE_CLICKED", BUTTON4_TRIPLE_CLICKED
);
2839 SetDictInt("BUTTON_SHIFT", BUTTON_SHIFT
);
2840 SetDictInt("BUTTON_CTRL", BUTTON_CTRL
);
2841 SetDictInt("BUTTON_ALT", BUTTON_ALT
);
2843 SetDictInt("ALL_MOUSE_EVENTS", ALL_MOUSE_EVENTS
);
2844 SetDictInt("REPORT_MOUSE_POSITION", REPORT_MOUSE_POSITION
);
2846 /* Now set everything up for KEY_ variables */
2851 #if !defined(__NetBSD__)
2852 for (key
=KEY_MIN
;key
< KEY_MAX
; key
++) {
2853 key_n
= (char *)keyname(key
);
2854 if (key_n
== NULL
|| strcmp(key_n
,"UNKNOWN KEY")==0)
2856 if (strncmp(key_n
,"KEY_F(",6)==0) {
2858 key_n2
= malloc(strlen(key_n
)+1);
2866 if (*p1
!= '(' && *p1
!= ')') {
2875 SetDictInt(key_n2
,key
);
2876 if (key_n2
!= key_n
)
2880 SetDictInt("KEY_MIN", KEY_MIN
);
2881 SetDictInt("KEY_MAX", KEY_MAX
);