blob: 0a6d2c9ecb1f1097c3a0e2de4a3c5247244fb3f4 [file] [log] [blame]
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001/*
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002 * This is a curses module for Python.
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003 *
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00004 * 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.
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00007 *
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00008 * 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 (amk1@bigfoot.com)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +000012 *
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 */
Guido van Rossumf6971e21994-08-30 12:25:20 +000033
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +000034/* CVS: $Id$ */
Guido van Rossumf6971e21994-08-30 12:25:20 +000035
Andrew M. Kuchlingfb6bbf52000-07-27 11:58:01 +000036/*
37
38A number of SysV or ncurses functions don't have wrappers yet; if you need
39a given function, add it and send a patch. Here's a list of currently
40unsupported functions:
41
42 addchnstr addchstr chgat color_set copywin define_key
43 del_curterm delscreen dupwin inchnstr inchstr innstr keyok
44 mcprint mvaddchnstr mvaddchstr mvchgat mvcur mvinchnstr
45 mvinchstr mvinnstr mmvwaddchnstr mvwaddchstr mvwchgat
46 mvwgetnstr mvwinchnstr mvwinchstr mvwinnstr napms newterm
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +000047 overlay overwrite resizeterm restartterm ripoffline scr_dump
48 scr_init scr_restore scr_set scrl set_curterm set_term setterm
49 tgetent tgetflag tgetnum tgetstr tgoto timeout tputs
50 use_default_colors vidattr vidputs waddchnstr waddchstr wchgat
51 wcolor_set winchnstr winchstr winnstr wmouse_trafo wscrl
Andrew M. Kuchlingfb6bbf52000-07-27 11:58:01 +000052
53Low-priority:
54 slk_attr slk_attr_off slk_attr_on slk_attr_set slk_attroff
55 slk_attron slk_attrset slk_clear slk_color slk_init slk_label
56 slk_noutrefresh slk_refresh slk_restore slk_set slk_touch
57
58 */
59
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +000060/* Release Number */
Guido van Rossumf6971e21994-08-30 12:25:20 +000061
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +000062char *PyCursesVersion = "1.6";
Guido van Rossumf6971e21994-08-30 12:25:20 +000063
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +000064/* Includes */
Guido van Rossumf6971e21994-08-30 12:25:20 +000065
Guido van Rossum602099a1994-09-14 13:32:22 +000066#include "Python.h"
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +000067
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +000068#ifdef __osf__
69#define _XOPEN_SOURCE_EXTENDED /* Define macro for OSF/1 */
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +000070#define STRICT_SYSV_CURSES /* Don't use ncurses extensions */
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +000071#endif
72
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +000073#ifdef HAVE_NCURSES_H
74#include <ncurses.h>
75#else
76#include <curses.h>
77#endif
78
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +000079/* These prototypes are in <term.h>, but including this header
80 #defines many common symbols (such as "lines") which breaks the
81 curses module in other ways. So the code will just specify
82 explicit prototypes here. */
83extern int setupterm(char *,int,int *);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +000084#ifdef sgi
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +000085extern char *tigetstr(char *);
86#endif
87
88#if defined(sgi) || defined(__sun__)
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +000089#define STRICT_SYSV_CURSES /* Don't use ncurses extensions */
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +000090typedef chtype attr_t; /* No attr_t type is available */
Guido van Rossum1266a011996-02-25 04:50:31 +000091#endif
Guido van Rossumf6971e21994-08-30 12:25:20 +000092
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +000093/* Definition of exception curses.error */
Guido van Rossumf6971e21994-08-30 12:25:20 +000094
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +000095static PyObject *PyCursesError;
Guido van Rossumf6971e21994-08-30 12:25:20 +000096
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +000097/* general error messages */
Guido van Rossum85738471995-02-17 13:50:17 +000098static char *catchall_ERR = "curses function returned ERR";
99static char *catchall_NULL = "curses function returned NULL";
100
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +0000101/* Tells whether setupterm() has been called to initialise terminfo. */
102static int initialised_setupterm = FALSE;
103
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000104/* Tells whether initscr() has been called to initialise curses. */
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000105static int initialised = FALSE;
106
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000107/* Tells whether start_color() has been called to initialise colorusage. */
108static int initialisedcolors = FALSE;
109
110/* Utility Macros */
Guido van Rossum85738471995-02-17 13:50:17 +0000111#define ARG_COUNT(X) \
112 (((X) == NULL) ? 0 : (PyTuple_Check(X) ? PyTuple_Size(X) : 1))
Guido van Rossumf6971e21994-08-30 12:25:20 +0000113
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +0000114#define PyCursesSetupTermCalled \
115 if (initialised_setupterm != TRUE) { \
116 PyErr_SetString(PyCursesError, \
117 "must call (at least) setupterm() first"); \
118 return NULL; }
119
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000120#define PyCursesInitialised \
121 if (initialised != TRUE) { \
122 PyErr_SetString(PyCursesError, \
123 "must call initscr() first"); \
124 return NULL; }
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000125
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000126#define PyCursesInitialisedColor \
127 if (initialisedcolors != TRUE) { \
128 PyErr_SetString(PyCursesError, \
129 "must call start_color() first"); \
130 return NULL; }
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000131
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000132/* Utility Functions */
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000133
Guido van Rossum85738471995-02-17 13:50:17 +0000134/*
135 * Check the return code from a curses function and return None
136 * or raise an exception as appropriate.
137 */
138
139static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000140PyCursesCheckERR(int code, char *fname)
Guido van Rossum85738471995-02-17 13:50:17 +0000141{
Guido van Rossum85738471995-02-17 13:50:17 +0000142 if (code != ERR) {
143 Py_INCREF(Py_None);
144 return Py_None;
145 } else {
146 if (fname == NULL) {
147 PyErr_SetString(PyCursesError, catchall_ERR);
148 } else {
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000149 PyErr_Format(PyCursesError, "%s() returned ERR", fname);
Guido van Rossum85738471995-02-17 13:50:17 +0000150 }
151 return NULL;
152 }
153}
154
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000155static int
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000156PyCurses_ConvertToChtype(PyObject *obj, chtype *ch)
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000157{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000158 if (PyInt_Check(obj)) {
159 *ch = (chtype) PyInt_AsLong(obj);
160 } else if(PyString_Check(obj) &
161 (PyString_Size(obj) == 1)) {
162 *ch = (chtype) *PyString_AsString(obj);
163 } else {
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000164 return 0;
165 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000166 return 1;
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000167}
168
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000169/*****************************************************************************
170 The Window Object
171******************************************************************************/
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000172
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000173/* Definition of the window object and window type */
Guido van Rossum85738471995-02-17 13:50:17 +0000174
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000175typedef struct {
176 PyObject_HEAD
177 WINDOW *win;
178} PyCursesWindowObject;
Guido van Rossum85738471995-02-17 13:50:17 +0000179
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000180PyTypeObject PyCursesWindow_Type;
181
182#define PyCursesWindow_Check(v) ((v)->ob_type == &PyCursesWindow_Type)
183
184/* Function Prototype Macros - They are ugly but very, very useful. ;-)
185
186 X - function name
187 TYPE - parameter Type
188 ERGSTR - format string for construction of the return value
189 PARSESTR - format string for argument parsing
190 */
191
192#define Window_NoArgNoReturnFunction(X) \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000193static PyObject *PyCursesWindow_ ## X (PyCursesWindowObject *self, PyObject *args) \
194{ if (!PyArg_NoArgs(args)) return NULL; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000195 return PyCursesCheckERR(X(self->win), # X); }
196
197#define Window_NoArgTrueFalseFunction(X) \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000198static PyObject * PyCursesWindow_ ## X (PyCursesWindowObject *self, PyObject *args) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000199{ \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000200 if (!PyArg_NoArgs(args)) return NULL; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000201 if (X (self->win) == FALSE) { Py_INCREF(Py_False); return Py_False; } \
202 else { Py_INCREF(Py_True); return Py_True; } }
203
204#define Window_NoArgNoReturnVoidFunction(X) \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000205static PyObject * PyCursesWindow_ ## X (PyCursesWindowObject *self, PyObject *args) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000206{ \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000207 if (!PyArg_NoArgs(args)) return NULL; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000208 X(self->win); Py_INCREF(Py_None); return Py_None; }
209
210#define Window_NoArg2TupleReturnFunction(X, TYPE, ERGSTR) \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000211static PyObject * PyCursesWindow_ ## X (PyCursesWindowObject *self, PyObject *args) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000212{ \
213 TYPE arg1, arg2; \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000214 if (!PyArg_NoArgs(args)) return NULL; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000215 X(self->win,arg1,arg2); return Py_BuildValue(ERGSTR, arg1, arg2); }
216
217#define Window_OneArgNoReturnVoidFunction(X, TYPE, PARSESTR) \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000218static PyObject * PyCursesWindow_ ## X (PyCursesWindowObject *self, PyObject *args) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000219{ \
220 TYPE arg1; \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000221 if (!PyArg_Parse(args, PARSESTR, &arg1)) return NULL; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000222 X(self->win,arg1); Py_INCREF(Py_None); return Py_None; }
223
224#define Window_OneArgNoReturnFunction(X, TYPE, PARSESTR) \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000225static PyObject * PyCursesWindow_ ## X (PyCursesWindowObject *self, PyObject *args) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000226{ \
227 TYPE arg1; \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000228 if (!PyArg_Parse(args,PARSESTR, &arg1)) return NULL; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000229 return PyCursesCheckERR(X(self->win, arg1), # X); }
230
231#define Window_TwoArgNoReturnFunction(X, TYPE, PARSESTR) \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000232static PyObject * PyCursesWindow_ ## X (PyCursesWindowObject *self, PyObject *args) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000233{ \
234 TYPE arg1, arg2; \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000235 if (!PyArg_Parse(args,PARSESTR, &arg1, &arg2)) return NULL; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000236 return PyCursesCheckERR(X(self->win, arg1, arg2), # X); }
Guido van Rossum85738471995-02-17 13:50:17 +0000237
Guido van Rossumf6971e21994-08-30 12:25:20 +0000238/* ------------- WINDOW routines --------------- */
Guido van Rossum85738471995-02-17 13:50:17 +0000239
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000240Window_NoArgNoReturnFunction(untouchwin)
241Window_NoArgNoReturnFunction(touchwin)
242Window_NoArgNoReturnFunction(redrawwin)
243Window_NoArgNoReturnFunction(winsertln)
244Window_NoArgNoReturnFunction(werase)
245Window_NoArgNoReturnFunction(wdeleteln)
246
247Window_NoArgTrueFalseFunction(is_wintouched)
248
249Window_NoArgNoReturnVoidFunction(wsyncup)
250Window_NoArgNoReturnVoidFunction(wsyncdown)
251Window_NoArgNoReturnVoidFunction(wstandend)
252Window_NoArgNoReturnVoidFunction(wstandout)
253Window_NoArgNoReturnVoidFunction(wcursyncup)
254Window_NoArgNoReturnVoidFunction(wclrtoeol)
255Window_NoArgNoReturnVoidFunction(wclrtobot)
256Window_NoArgNoReturnVoidFunction(wclear)
257
258Window_OneArgNoReturnVoidFunction(idcok, int, "i;True(1) or False(0)")
259Window_OneArgNoReturnVoidFunction(immedok, int, "i;True(1) or False(0)")
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +0000260Window_OneArgNoReturnVoidFunction(wtimeout, int, "i;delay")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000261
262Window_NoArg2TupleReturnFunction(getyx, int, "(ii)")
263Window_NoArg2TupleReturnFunction(getbegyx, int, "(ii)")
264Window_NoArg2TupleReturnFunction(getmaxyx, int, "(ii)")
265Window_NoArg2TupleReturnFunction(getparyx, int, "(ii)")
266
267Window_OneArgNoReturnFunction(wattron, attr_t, "l;attr")
268Window_OneArgNoReturnFunction(wattroff, attr_t, "l;attr")
269Window_OneArgNoReturnFunction(wattrset, attr_t, "l;attr")
270Window_OneArgNoReturnFunction(clearok, int, "i;True(1) or False(0)")
271Window_OneArgNoReturnFunction(idlok, int, "i;True(1) or False(0)")
272Window_OneArgNoReturnFunction(keypad, int, "i;True(1) or False(0)")
273Window_OneArgNoReturnFunction(leaveok, int, "i;True(1) or False(0)")
274Window_OneArgNoReturnFunction(nodelay, int, "i;True(1) or False(0)")
275Window_OneArgNoReturnFunction(notimeout, int, "i;True(1) or False(0)")
276Window_OneArgNoReturnFunction(scrollok, int, "i;True(1) or False(0)")
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000277Window_OneArgNoReturnFunction(winsdelln, int, "i;nlines")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000278Window_OneArgNoReturnFunction(syncok, int, "i;True(1) or False(0)")
279
280Window_TwoArgNoReturnFunction(mvwin, int, "(ii);y,x")
281Window_TwoArgNoReturnFunction(mvderwin, int, "(ii);y,x")
282Window_TwoArgNoReturnFunction(wmove, int, "(ii);y,x")
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000283#ifndef STRICT_SYSV_CURSES
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000284Window_TwoArgNoReturnFunction(wresize, int, "(ii);lines,columns")
285#endif
286
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000287/* Allocation and deallocation of Window Objects */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000288
Guido van Rossumf6971e21994-08-30 12:25:20 +0000289static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000290PyCursesWindow_New(WINDOW *win)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000291{
292 PyCursesWindowObject *wo;
Guido van Rossum85738471995-02-17 13:50:17 +0000293
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000294 wo = PyObject_NEW(PyCursesWindowObject, &PyCursesWindow_Type);
295 if (wo == NULL) return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000296 wo->win = win;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000297 return (PyObject *)wo;
298}
299
300static void
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000301PyCursesWindow_Dealloc(PyCursesWindowObject *wo)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000302{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000303 if (wo->win != stdscr) delwin(wo->win);
304 PyMem_DEL(wo);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000305}
306
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000307/* Addch, Addstr, Addnstr */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000308
309static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000310PyCursesWindow_AddCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000311{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000312 int rtn, x, y, use_xy = FALSE;
313 PyObject *temp;
314 chtype ch = 0;
315 attr_t attr = A_NORMAL;
316
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000317 switch (ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000318 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000319 if (!PyArg_Parse(args, "O;ch or int", &temp))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000320 return NULL;
321 break;
322 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000323 if (!PyArg_Parse(args, "(Ol);ch or int,attr", &temp, &attr))
Guido van Rossum85738471995-02-17 13:50:17 +0000324 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000325 break;
326 case 3:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000327 if (!PyArg_Parse(args,"(iiO);y,x,ch or int", &y, &x, &temp))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000328 return NULL;
329 use_xy = TRUE;
330 break;
331 case 4:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000332 if (!PyArg_Parse(args,"(iiOl);y,x,ch or int, attr",
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000333 &y, &x, &temp, &attr))
334 return NULL;
335 use_xy = TRUE;
336 break;
337 default:
338 PyErr_SetString(PyExc_TypeError, "addch requires 1 or 4 arguments");
339 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000340 }
Guido van Rossum85738471995-02-17 13:50:17 +0000341
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000342 if (!PyCurses_ConvertToChtype(temp, &ch)) {
343 PyErr_SetString(PyExc_TypeError, "argument 1 or 3 must be a ch or an int");
344 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000345 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000346
Guido van Rossumf6971e21994-08-30 12:25:20 +0000347 if (use_xy == TRUE)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000348 rtn = mvwaddch(self->win,y,x, ch | attr);
349 else {
350 rtn = waddch(self->win, ch | attr);
351 }
352 return PyCursesCheckERR(rtn, "addch");
Guido van Rossumf6971e21994-08-30 12:25:20 +0000353}
354
355static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000356PyCursesWindow_AddStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000357{
358 int rtn;
359 int x, y;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000360 char *str;
361 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
362 int use_xy = FALSE, use_attr = FALSE;
Guido van Rossum85738471995-02-17 13:50:17 +0000363
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000364 switch (ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000365 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000366 if (!PyArg_Parse(args,"s;str", &str))
Guido van Rossum85738471995-02-17 13:50:17 +0000367 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000368 break;
369 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000370 if (!PyArg_Parse(args,"(sl);str,attr", &str, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000371 return NULL;
372 use_attr = TRUE;
373 break;
374 case 3:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000375 if (!PyArg_Parse(args,"(iis);int,int,str", &y, &x, &str))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000376 return NULL;
377 use_xy = TRUE;
378 break;
379 case 4:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000380 if (!PyArg_Parse(args,"(iisl);int,int,str,attr", &y, &x, &str, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000381 return NULL;
382 use_xy = use_attr = TRUE;
383 break;
384 default:
385 PyErr_SetString(PyExc_TypeError, "addstr requires 1 to 4 arguments");
386 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000387 }
Guido van Rossum85738471995-02-17 13:50:17 +0000388
Guido van Rossumf6971e21994-08-30 12:25:20 +0000389 if (use_attr == TRUE) {
390 attr_old = getattrs(self->win);
391 wattrset(self->win,attr);
392 }
393 if (use_xy == TRUE)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000394 rtn = mvwaddstr(self->win,y,x,str);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000395 else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000396 rtn = waddstr(self->win,str);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000397 if (use_attr == TRUE)
398 wattrset(self->win,attr_old);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000399 return PyCursesCheckERR(rtn, "addstr");
400}
Guido van Rossum85738471995-02-17 13:50:17 +0000401
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000402static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000403PyCursesWindow_AddNStr(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000404{
405 int rtn, x, y, n;
406 char *str;
407 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
408 int use_xy = FALSE, use_attr = FALSE;
409
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000410 switch (ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000411 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000412 if (!PyArg_Parse(args,"(si);str,n", &str, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000413 return NULL;
414 break;
415 case 3:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000416 if (!PyArg_Parse(args,"(sil);str,n,attr", &str, &n, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000417 return NULL;
418 use_attr = TRUE;
419 break;
420 case 4:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000421 if (!PyArg_Parse(args,"(iisi);y,x,str,n", &y, &x, &str, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000422 return NULL;
423 use_xy = TRUE;
424 break;
425 case 5:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000426 if (!PyArg_Parse(args,"(iisil);y,x,str,n,attr", &y, &x, &str, &n, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000427 return NULL;
428 use_xy = use_attr = TRUE;
429 break;
430 default:
431 PyErr_SetString(PyExc_TypeError, "addnstr requires 2 to 5 arguments");
432 return NULL;
433 }
434
435 if (use_attr == TRUE) {
436 attr_old = getattrs(self->win);
437 wattrset(self->win,attr);
438 }
439 if (use_xy == TRUE)
440 rtn = mvwaddnstr(self->win,y,x,str,n);
441 else
442 rtn = waddnstr(self->win,str,n);
443 if (use_attr == TRUE)
444 wattrset(self->win,attr_old);
445 return PyCursesCheckERR(rtn, "addnstr");
446}
447
448static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000449PyCursesWindow_Bkgd(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000450{
451 PyObject *temp;
452 chtype bkgd;
453 attr_t attr = A_NORMAL;
454
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000455 switch (ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000456 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000457 if (!PyArg_Parse(args, "O;ch or int", &temp))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000458 return NULL;
459 break;
460 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000461 if (!PyArg_Parse(args,"(Ol);ch or int,attr", &temp, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000462 return NULL;
463 break;
464 default:
465 PyErr_SetString(PyExc_TypeError, "bkgd requires 1 or 2 arguments");
466 return NULL;
467 }
468
469 if (!PyCurses_ConvertToChtype(temp, &bkgd)) {
470 PyErr_SetString(PyExc_TypeError, "argument 1 or 3 must be a ch or an int");
471 return NULL;
472 }
473
474 return PyCursesCheckERR(wbkgd(self->win, bkgd | A_NORMAL), "bkgd");
475}
476
477static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000478PyCursesWindow_BkgdSet(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000479{
480 PyObject *temp;
481 chtype bkgd;
482 attr_t attr = A_NORMAL;
483
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000484 switch (ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000485 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000486 if (!PyArg_Parse(args, "O;ch or int", &temp))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000487 return NULL;
488 break;
489 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000490 if (!PyArg_Parse(args,"(Ol);ch or int,attr", &temp, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000491 return NULL;
492 break;
493 default:
494 PyErr_SetString(PyExc_TypeError, "bkgdset requires 1 or 2 arguments");
495 return NULL;
496 }
497
498 if (!PyCurses_ConvertToChtype(temp, &bkgd)) {
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000499 PyErr_SetString(PyExc_TypeError, "argument 1 must be a ch or an int");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000500 return NULL;
501 }
502
503 wbkgdset(self->win, bkgd | attr);
504 return PyCursesCheckERR(0, "bkgdset");
505}
506
507static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000508PyCursesWindow_Border(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000509{
510 chtype ls, rs, ts, bs, tl, tr, bl, br;
511 ls = rs = ts = bs = tl = tr = bl = br = 0;
512 if (!PyArg_Parse(args,"|llllllll;ls,rs,ts,bs,tl,tr,bl,br",
513 &ls, &rs, &ts, &bs, &tl, &tr, &bl, &br))
514 return NULL;
515 wborder(self->win, ls, rs, ts, bs, tl, tr, bl, br);
516 Py_INCREF(Py_None);
517 return Py_None;
518}
519
520static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000521PyCursesWindow_Box(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000522{
523 chtype ch1=0,ch2=0;
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000524 if (!PyArg_NoArgs(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000525 PyErr_Clear();
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000526 if (!PyArg_Parse(args,"(ll);vertint,horint", &ch1, &ch2))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000527 return NULL;
528 }
529 box(self->win,ch1,ch2);
530 Py_INCREF(Py_None);
531 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000532}
533
534static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000535PyCursesWindow_DelCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000536{
537 int rtn;
538 int x, y;
Guido van Rossum85738471995-02-17 13:50:17 +0000539
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000540 switch (ARG_COUNT(args)) {
Guido van Rossum85738471995-02-17 13:50:17 +0000541 case 0:
Guido van Rossumf6971e21994-08-30 12:25:20 +0000542 rtn = wdelch(self->win);
Guido van Rossum85738471995-02-17 13:50:17 +0000543 break;
544 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000545 if (!PyArg_Parse(args,"(ii);y,x", &y, &x))
Guido van Rossum85738471995-02-17 13:50:17 +0000546 return NULL;
547 rtn = mvwdelch(self->win,y,x);
548 break;
549 default:
550 PyErr_SetString(PyExc_TypeError, "delch requires 0 or 2 arguments");
551 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000552 }
Guido van Rossum85738471995-02-17 13:50:17 +0000553 return PyCursesCheckERR(rtn, "[mv]wdelch");
Guido van Rossumf6971e21994-08-30 12:25:20 +0000554}
555
556static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000557PyCursesWindow_DerWin(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000558{
559 WINDOW *win;
560 int nlines, ncols, begin_y, begin_x;
561
562 nlines = 0;
563 ncols = 0;
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000564 switch (ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000565 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000566 if (!PyArg_Parse(args,"(ii);begin_y,begin_x",&begin_y,&begin_x))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000567 return NULL;
568 break;
569 case 4:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000570 if (!PyArg_Parse(args, "(iiii);nlines,ncols,begin_y,begin_x",
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000571 &nlines,&ncols,&begin_y,&begin_x))
572 return NULL;
573 break;
574 default:
575 PyErr_SetString(PyExc_TypeError, "derwin requires 2 or 4 arguments");
576 return NULL;
577 }
578
579 win = derwin(self->win,nlines,ncols,begin_y,begin_x);
580
581 if (win == NULL) {
582 PyErr_SetString(PyCursesError, catchall_NULL);
583 return NULL;
584 }
585
586 return (PyObject *)PyCursesWindow_New(win);
587}
588
589static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000590PyCursesWindow_EchoChar(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000591{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000592 PyObject *temp;
593 chtype ch;
594 attr_t attr = A_NORMAL;
Guido van Rossum85738471995-02-17 13:50:17 +0000595
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000596 switch (ARG_COUNT(args)) {
Guido van Rossum85738471995-02-17 13:50:17 +0000597 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000598 if (!PyArg_Parse(args,"O;ch or int", &temp))
Guido van Rossum85738471995-02-17 13:50:17 +0000599 return NULL;
Guido van Rossum85738471995-02-17 13:50:17 +0000600 break;
601 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000602 if (!PyArg_Parse(args,"(Ol);ch or int,attr", &temp, &attr))
Guido van Rossum85738471995-02-17 13:50:17 +0000603 return NULL;
Guido van Rossum85738471995-02-17 13:50:17 +0000604 break;
605 default:
606 PyErr_SetString(PyExc_TypeError, "echochar requires 1 or 2 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000607
608
Guido van Rossum85738471995-02-17 13:50:17 +0000609 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000610 }
Guido van Rossum85738471995-02-17 13:50:17 +0000611
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000612 if (!PyCurses_ConvertToChtype(temp, &ch)) {
613 PyErr_SetString(PyExc_TypeError, "argument 1 must be a ch or an int");
Guido van Rossum85738471995-02-17 13:50:17 +0000614 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000615 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000616
617 if (self->win->_flags & _ISPAD)
618 return PyCursesCheckERR(pechochar(self->win, ch | attr),
619 "echochar");
Guido van Rossumf6971e21994-08-30 12:25:20 +0000620 else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000621 return PyCursesCheckERR(wechochar(self->win, ch | attr),
622 "echochar");
Guido van Rossumf6971e21994-08-30 12:25:20 +0000623}
624
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +0000625#ifdef NCURSES_MOUSE_VERSION
626static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000627PyCursesWindow_Enclose(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +0000628{
629 int x, y;
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000630 if (!PyArg_Parse(args,"(ii);y,x", &y, &x))
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +0000631 return NULL;
632
633 return PyInt_FromLong( wenclose(self->win,y,x) );
634}
635#endif
636
Guido van Rossumf6971e21994-08-30 12:25:20 +0000637static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000638PyCursesWindow_GetBkgd(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000639{
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000640 if (!PyArg_NoArgs(args))
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000641 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000642 return PyInt_FromLong((long) getbkgd(self->win));
Guido van Rossumf6971e21994-08-30 12:25:20 +0000643}
644
645static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000646PyCursesWindow_GetCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000647{
648 int x, y;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000649 chtype rtn;
Guido van Rossum85738471995-02-17 13:50:17 +0000650
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000651 switch (ARG_COUNT(args)) {
Guido van Rossum85738471995-02-17 13:50:17 +0000652 case 0:
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000653 Py_BEGIN_ALLOW_THREADS
Guido van Rossumf6971e21994-08-30 12:25:20 +0000654 rtn = wgetch(self->win);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000655 Py_END_ALLOW_THREADS
Guido van Rossum85738471995-02-17 13:50:17 +0000656 break;
657 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000658 if (!PyArg_Parse(args,"(ii);y,x",&y,&x))
Guido van Rossum85738471995-02-17 13:50:17 +0000659 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000660 Py_BEGIN_ALLOW_THREADS
Guido van Rossum85738471995-02-17 13:50:17 +0000661 rtn = mvwgetch(self->win,y,x);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000662 Py_END_ALLOW_THREADS
Guido van Rossum85738471995-02-17 13:50:17 +0000663 break;
664 default:
665 PyErr_SetString(PyExc_TypeError, "getch requires 0 or 2 arguments");
666 return NULL;
667 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000668 return PyInt_FromLong(rtn);
669}
Guido van Rossum85738471995-02-17 13:50:17 +0000670
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000671static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000672PyCursesWindow_GetKey(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000673{
674 int x, y;
675 chtype rtn;
676
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000677 switch (ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000678 case 0:
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000679 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000680 rtn = wgetch(self->win);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000681 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000682 break;
683 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000684 if (!PyArg_Parse(args,"(ii);y,x",&y,&x))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000685 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000686 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000687 rtn = mvwgetch(self->win,y,x);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000688 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000689 break;
690 default:
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000691 PyErr_SetString(PyExc_TypeError, "getkey requires 0 or 2 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000692 return NULL;
693 }
694 if (rtn<=255)
695 return Py_BuildValue("c", rtn);
696 else
697 return PyString_FromString((char *)keyname(rtn));
Guido van Rossumf6971e21994-08-30 12:25:20 +0000698}
699
700static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000701PyCursesWindow_GetStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000702{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000703 int x, y, n;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000704 char rtn[1024]; /* This should be big enough.. I hope */
705 int rtn2;
Guido van Rossum85738471995-02-17 13:50:17 +0000706
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000707 switch (ARG_COUNT(args)) {
Guido van Rossum85738471995-02-17 13:50:17 +0000708 case 0:
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000709 Py_BEGIN_ALLOW_THREADS
Guido van Rossumf6971e21994-08-30 12:25:20 +0000710 rtn2 = wgetstr(self->win,rtn);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000711 Py_END_ALLOW_THREADS
Guido van Rossum85738471995-02-17 13:50:17 +0000712 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000713 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000714 if (!PyArg_Parse(args,"i;n", &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000715 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000716 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000717 rtn2 = wgetnstr(self->win,rtn,n);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000718 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000719 break;
Guido van Rossum85738471995-02-17 13:50:17 +0000720 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000721 if (!PyArg_Parse(args,"(ii);y,x",&y,&x))
Guido van Rossum85738471995-02-17 13:50:17 +0000722 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000723 Py_BEGIN_ALLOW_THREADS
Guido van Rossum85738471995-02-17 13:50:17 +0000724 rtn2 = mvwgetstr(self->win,y,x,rtn);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000725 Py_END_ALLOW_THREADS
Guido van Rossum85738471995-02-17 13:50:17 +0000726 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000727 case 3:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000728 if (!PyArg_Parse(args,"(iii);y,x,n", &y, &x, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000729 return NULL;
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000730#ifdef STRICT_SYSV_CURSES
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000731 /* Untested */
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000732 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000733 rtn2 = wmove(self->win,y,x)==ERR ? ERR :
734 wgetnstr(self->win, rtn, n);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000735 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000736#else
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000737 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000738 rtn2 = mvwgetnstr(self->win, y, x, rtn, n);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000739 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000740#endif
741 break;
Guido van Rossum85738471995-02-17 13:50:17 +0000742 default:
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000743 PyErr_SetString(PyExc_TypeError, "getstr requires 0 to 2 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +0000744 return NULL;
745 }
Guido van Rossumf6971e21994-08-30 12:25:20 +0000746 if (rtn2 == ERR)
747 rtn[0] = 0;
Guido van Rossum85738471995-02-17 13:50:17 +0000748 return PyString_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000749}
750
751static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000752PyCursesWindow_Hline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000753{
754 PyObject *temp;
755 chtype ch;
756 int n, x, y, code = OK;
757 attr_t attr = A_NORMAL;
758
759 switch (ARG_COUNT(args)) {
760 case 2:
761 if (!PyArg_Parse(args, "(Oi);ch or int,n", &temp, &n))
762 return NULL;
763 break;
764 case 3:
765 if (!PyArg_Parse(args, "(Oil);ch or int,n,attr", &temp, &n, &attr))
766 return NULL;
767 break;
768 case 4:
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000769 if (!PyArg_Parse(args, "(iiOi);y,x,ch or int,n", &y, &x, &temp, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000770 return NULL;
771 code = wmove(self->win, y, x);
772 break;
773 case 5:
774 if (!PyArg_Parse(args, "(iiOil); y,x,ch or int,n,attr",
775 &y, &x, &temp, &n, &attr))
776 return NULL;
777 code = wmove(self->win, y, x);
778 default:
779 PyErr_SetString(PyExc_TypeError, "hline requires 2 or 5 arguments");
780 return NULL;
781 }
782
783 if (code != ERR) {
784 if (!PyCurses_ConvertToChtype(temp, &ch)) {
785 PyErr_SetString(PyExc_TypeError,
786 "argument 1 or 3 must be a ch or an int");
787 return NULL;
788 }
789 return PyCursesCheckERR(whline(self->win, ch | attr, n), "hline");
790 } else
791 return PyCursesCheckERR(code, "wmove");
792}
793
794static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000795PyCursesWindow_InsCh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000796{
797 int rtn, x, y, use_xy = FALSE;
798 PyObject *temp;
799 chtype ch = 0;
800 attr_t attr = A_NORMAL;
801
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000802 switch (ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000803 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000804 if (!PyArg_Parse(args, "O;ch or int", &temp))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000805 return NULL;
806 break;
807 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000808 if (!PyArg_Parse(args, "(Ol);ch or int,attr", &temp, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000809 return NULL;
810 break;
811 case 3:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000812 if (!PyArg_Parse(args,"(iiO);y,x,ch or int", &y, &x, &temp))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000813 return NULL;
814 use_xy = TRUE;
815 break;
816 case 4:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000817 if (!PyArg_Parse(args,"(iiOl);y,x,ch or int, attr", &y, &x, &temp, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000818 return NULL;
819 use_xy = TRUE;
820 break;
821 default:
822 PyErr_SetString(PyExc_TypeError, "insch requires 1 or 4 arguments");
823 return NULL;
824 }
825
826 if (!PyCurses_ConvertToChtype(temp, &ch)) {
827 PyErr_SetString(PyExc_TypeError,
828 "argument 1 or 3 must be a ch or an int");
829 return NULL;
830 }
831
832 if (use_xy == TRUE)
833 rtn = mvwinsch(self->win,y,x, ch | attr);
834 else {
835 rtn = winsch(self->win, ch | attr);
836 }
837 return PyCursesCheckERR(rtn, "insch");
838}
839
840static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000841PyCursesWindow_InCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000842{
Guido van Rossum85738471995-02-17 13:50:17 +0000843 int x, y, rtn;
844
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000845 switch (ARG_COUNT(args)) {
Guido van Rossum85738471995-02-17 13:50:17 +0000846 case 0:
Guido van Rossumf6971e21994-08-30 12:25:20 +0000847 rtn = winch(self->win);
Guido van Rossum85738471995-02-17 13:50:17 +0000848 break;
849 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000850 if (!PyArg_Parse(args,"(ii);y,x",&y,&x))
Guido van Rossum85738471995-02-17 13:50:17 +0000851 return NULL;
852 rtn = mvwinch(self->win,y,x);
853 break;
854 default:
855 PyErr_SetString(PyExc_TypeError, "inch requires 0 or 2 arguments");
856 return NULL;
857 }
Guido van Rossum85738471995-02-17 13:50:17 +0000858 return PyInt_FromLong((long) rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000859}
860
861static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000862PyCursesWindow_InStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000863{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000864 int x, y, n;
865 char rtn[1024]; /* This should be big enough.. I hope */
866 int rtn2;
867
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000868 switch (ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000869 case 0:
870 rtn2 = winstr(self->win,rtn);
871 break;
872 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000873 if (!PyArg_Parse(args,"i;n", &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000874 return NULL;
875 rtn2 = winnstr(self->win,rtn,n);
876 break;
877 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000878 if (!PyArg_Parse(args,"(ii);y,x",&y,&x))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000879 return NULL;
880 rtn2 = mvwinstr(self->win,y,x,rtn);
881 break;
882 case 3:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000883 if (!PyArg_Parse(args, "(iii);y,x,n", &y, &x, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000884 return NULL;
885 rtn2 = mvwinnstr(self->win, y, x, rtn, n);
886 break;
887 default:
888 PyErr_SetString(PyExc_TypeError, "instr requires 0 or 3 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +0000889 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000890 }
891 if (rtn2 == ERR)
892 rtn[0] = 0;
893 return PyString_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000894}
895
896static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000897PyCursesWindow_InsStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000898{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000899 int rtn;
900 int x, y;
901 char *str;
902 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
903 int use_xy = FALSE, use_attr = FALSE;
904
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000905 switch (ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000906 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000907 if (!PyArg_Parse(args,"s;str", &str))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000908 return NULL;
909 break;
910 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000911 if (!PyArg_Parse(args,"(sl);str,attr", &str, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000912 return NULL;
913 use_attr = TRUE;
914 break;
915 case 3:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000916 if (!PyArg_Parse(args,"(iis);y,x,str", &y, &x, &str))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000917 return NULL;
918 use_xy = TRUE;
919 break;
920 case 4:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000921 if (!PyArg_Parse(args,"(iisl);y,x,str,attr", &y, &x, &str, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000922 return NULL;
923 use_xy = use_attr = TRUE;
924 break;
925 default:
926 PyErr_SetString(PyExc_TypeError, "insstr requires 1 to 4 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +0000927 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000928 }
929
930 if (use_attr == TRUE) {
931 attr_old = getattrs(self->win);
932 wattrset(self->win,attr);
933 }
934 if (use_xy == TRUE)
935 rtn = mvwinsstr(self->win,y,x,str);
936 else
937 rtn = winsstr(self->win,str);
938 if (use_attr == TRUE)
939 wattrset(self->win,attr_old);
940 return PyCursesCheckERR(rtn, "insstr");
Guido van Rossumf6971e21994-08-30 12:25:20 +0000941}
942
943static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000944PyCursesWindow_InsNStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000945{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000946 int rtn, x, y, n;
947 char *str;
948 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
949 int use_xy = FALSE, use_attr = FALSE;
950
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000951 switch (ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000952 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000953 if (!PyArg_Parse(args,"(si);str,n", &str, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000954 return NULL;
955 break;
956 case 3:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000957 if (!PyArg_Parse(args,"(sil);str,n,attr", &str, &n, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000958 return NULL;
959 use_attr = TRUE;
960 break;
961 case 4:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000962 if (!PyArg_Parse(args,"(iisi);y,x,str,n", &y, &x, &str, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000963 return NULL;
964 use_xy = TRUE;
965 break;
966 case 5:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000967 if (!PyArg_Parse(args,"(iisil);y,x,str,n,attr", &y, &x, &str, &n, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000968 return NULL;
969 use_xy = use_attr = TRUE;
970 break;
971 default:
972 PyErr_SetString(PyExc_TypeError, "insnstr requires 2 to 5 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +0000973 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000974 }
975
976 if (use_attr == TRUE) {
977 attr_old = getattrs(self->win);
978 wattrset(self->win,attr);
979 }
980 if (use_xy == TRUE)
981 rtn = mvwinsnstr(self->win,y,x,str,n);
982 else
983 rtn = winsnstr(self->win,str,n);
984 if (use_attr == TRUE)
985 wattrset(self->win,attr_old);
986 return PyCursesCheckERR(rtn, "insnstr");
Guido van Rossumf6971e21994-08-30 12:25:20 +0000987}
988
989static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000990PyCursesWindow_Is_LineTouched(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000991{
992 int line, erg;
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000993 if (!PyArg_Parse(args,"i;line", &line))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000994 return NULL;
995 erg = is_linetouched(self->win, line);
996 if (erg == ERR) {
997 PyErr_SetString(PyExc_TypeError,
998 "is_linetouched: line number outside of boundaries");
999 return NULL;
1000 } else
1001 if (erg == FALSE) {
1002 Py_INCREF(Py_False);
1003 return Py_False;
1004 } else {
1005 Py_INCREF(Py_True);
1006 return Py_True;
1007 }
1008}
1009
1010static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001011PyCursesWindow_NoOutRefresh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001012{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001013 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001014 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001015
1016 if (self->win->_flags & _ISPAD) {
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001017 switch(ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001018 case 6:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001019 if (!PyArg_Parse(args,
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001020 "(iiiiii);" \
1021 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1022 &pminrow, &pmincol, &sminrow,
1023 &smincol, &smaxrow, &smaxcol))
1024 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001025 Py_BEGIN_ALLOW_THREADS
1026 rtn = pnoutrefresh(self->win,
1027 pminrow, pmincol, sminrow,
Andrew M. Kuchlingb6e46872000-06-27 15:01:10 +00001028 smincol, smaxrow, smaxcol);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001029 Py_END_ALLOW_THREADS
1030 return PyCursesCheckERR(rtn, "pnoutrefresh");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001031 default:
1032 PyErr_SetString(PyCursesError,
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001033 "noutrefresh() called for a pad "
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001034 "requires 6 arguments");
1035 return NULL;
1036 }
1037 } else {
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001038 if (!PyArg_NoArgs(args))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001039 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001040
1041 Py_BEGIN_ALLOW_THREADS
1042 rtn = wnoutrefresh(self->win);
1043 Py_END_ALLOW_THREADS
1044 return PyCursesCheckERR(rtn, "wnoutrefresh");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001045 }
1046}
1047
1048static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001049PyCursesWindow_PutWin(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001050{
1051 PyObject *temp;
1052
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001053 if (!PyArg_Parse(args, "O;fileobj", &temp))
Guido van Rossum85738471995-02-17 13:50:17 +00001054 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001055 if (!PyFile_Check(temp)) {
1056 PyErr_SetString(PyExc_TypeError, "argument must be a file object");
1057 return NULL;
1058 }
1059 return PyCursesCheckERR(putwin(self->win, PyFile_AsFile(temp)),
1060 "putwin");
1061}
1062
1063static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001064PyCursesWindow_RedrawLine(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001065{
1066 int beg, num;
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001067 if (!PyArg_Parse(args,"(ii);beg,num", &beg, &num))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001068 return NULL;
1069 return PyCursesCheckERR(wredrawln(self->win,beg,num), "redrawln");
1070}
1071
1072static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001073PyCursesWindow_Refresh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001074{
1075 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001076 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001077
1078 if (self->win->_flags & _ISPAD) {
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001079 switch(ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001080 case 6:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001081 if (!PyArg_Parse(args,
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001082 "(iiiiii);" \
1083 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1084 &pminrow, &pmincol, &sminrow,
1085 &smincol, &smaxrow, &smaxcol))
1086 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001087
1088 Py_BEGIN_ALLOW_THREADS
1089 rtn = prefresh(self->win,
1090 pminrow, pmincol, sminrow,
Andrew M. Kuchlingb6e46872000-06-27 15:01:10 +00001091 smincol, smaxrow, smaxcol);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001092 Py_END_ALLOW_THREADS
1093 return PyCursesCheckERR(rtn, "prefresh");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001094 default:
1095 PyErr_SetString(PyCursesError,
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001096 "refresh() for a pad requires 6 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001097 return NULL;
1098 }
1099 } else {
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001100 if (!PyArg_NoArgs(args))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001101 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001102 Py_BEGIN_ALLOW_THREADS
1103 rtn = wrefresh(self->win);
1104 Py_END_ALLOW_THREADS
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001105 return PyCursesCheckERR(rtn, "prefresh");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001106 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001107}
1108
1109static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001110PyCursesWindow_SetScrollRegion(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001111{
1112 int x, y;
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001113 if (!PyArg_Parse(args,"(ii);top, bottom",&y,&x))
Guido van Rossum85738471995-02-17 13:50:17 +00001114 return NULL;
1115 return PyCursesCheckERR(wsetscrreg(self->win,y,x), "wsetscrreg");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001116}
1117
1118static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001119PyCursesWindow_SubWin(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001120{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001121 WINDOW *win;
1122 int nlines, ncols, begin_y, begin_x;
1123
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001124 nlines = 0;
1125 ncols = 0;
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001126 switch (ARG_COUNT(args)) {
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001127 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001128 if (!PyArg_Parse(args,"(ii);begin_y,begin_x",&begin_y,&begin_x))
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001129 return NULL;
1130 break;
1131 case 4:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001132 if (!PyArg_Parse(args, "(iiii);nlines,ncols,begin_y,begin_x",
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001133 &nlines,&ncols,&begin_y,&begin_x))
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001134 return NULL;
1135 break;
1136 default:
1137 PyErr_SetString(PyExc_TypeError, "subwin requires 2 or 4 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +00001138 return NULL;
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001139 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001140
Andrew M. Kuchling8353f622000-07-26 18:36:27 +00001141 /* printf("Subwin: %i %i %i %i \n", nlines, ncols, begin_y, begin_x); */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001142 if (self->win->_flags & _ISPAD)
1143 win = subpad(self->win, nlines, ncols, begin_y, begin_x);
1144 else
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001145 win = subwin(self->win, nlines, ncols, begin_y, begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001146
1147 if (win == NULL) {
1148 PyErr_SetString(PyCursesError, catchall_NULL);
1149 return NULL;
1150 }
1151
1152 return (PyObject *)PyCursesWindow_New(win);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001153}
1154
1155static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001156PyCursesWindow_Scroll(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001157{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001158 int lines;
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001159 switch(ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001160 case 0:
1161 return PyCursesCheckERR(scroll(self->win), "scroll");
1162 break;
1163 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001164 if (!PyArg_Parse(args, "i;lines", &lines))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001165 return NULL;
1166 return PyCursesCheckERR(wscrl(self->win, lines), "scroll");
1167 default:
1168 PyErr_SetString(PyExc_TypeError, "scroll requires 0 or 1 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +00001169 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001170 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001171}
1172
1173static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001174PyCursesWindow_TouchLine(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001175{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001176 int st, cnt, val;
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001177 switch (ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001178 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001179 if (!PyArg_Parse(args,"(ii);start,count",&st,&cnt))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001180 return NULL;
1181 return PyCursesCheckERR(touchline(self->win,st,cnt), "touchline");
1182 break;
1183 case 3:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001184 if (!PyArg_Parse(args, "(iii);start,count,val", &st, &cnt, &val))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001185 return NULL;
1186 return PyCursesCheckERR(wtouchln(self->win, st, cnt, val), "touchline");
1187 default:
1188 PyErr_SetString(PyExc_TypeError, "touchline requires 2 or 3 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +00001189 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001190 }
1191}
1192
1193static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001194PyCursesWindow_Vline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001195{
1196 PyObject *temp;
1197 chtype ch;
1198 int n, x, y, code = OK;
1199 attr_t attr = A_NORMAL;
1200
1201 switch (ARG_COUNT(args)) {
1202 case 2:
1203 if (!PyArg_Parse(args, "(Oi);ch or int,n", &temp, &n))
1204 return NULL;
1205 break;
1206 case 3:
1207 if (!PyArg_Parse(args, "(Oil);ch or int,n,attr", &temp, &n, &attr))
1208 return NULL;
1209 break;
1210 case 4:
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001211 if (!PyArg_Parse(args, "(iiOi);y,x,ch or int,n", &y, &x, &temp, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001212 return NULL;
1213 code = wmove(self->win, y, x);
1214 break;
1215 case 5:
1216 if (!PyArg_Parse(args, "(iiOil); y,x,ch or int,n,attr",
1217 &y, &x, &temp, &n, &attr))
1218 return NULL;
1219 code = wmove(self->win, y, x);
1220 default:
1221 PyErr_SetString(PyExc_TypeError, "vline requires 2 or 5 arguments");
1222 return NULL;
1223 }
1224
1225 if (code != ERR) {
1226 if (!PyCurses_ConvertToChtype(temp, &ch)) {
1227 PyErr_SetString(PyExc_TypeError,
1228 "argument 1 or 3 must be a ch or an int");
1229 return NULL;
1230 }
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001231 return PyCursesCheckERR(wvline(self->win, ch | attr, n), "vline");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001232 } else
1233 return PyCursesCheckERR(code, "wmove");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001234}
1235
1236static PyMethodDef PyCursesWindow_Methods[] = {
Sjoerd Mullender14ece161995-03-17 12:18:38 +00001237 {"addch", (PyCFunction)PyCursesWindow_AddCh},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001238 {"addnstr", (PyCFunction)PyCursesWindow_AddNStr},
Sjoerd Mullender14ece161995-03-17 12:18:38 +00001239 {"addstr", (PyCFunction)PyCursesWindow_AddStr},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001240 {"attroff", (PyCFunction)PyCursesWindow_wattroff},
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001241 {"attron", (PyCFunction)PyCursesWindow_wattron},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001242 {"attrset", (PyCFunction)PyCursesWindow_wattrset},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001243 {"bkgd", (PyCFunction)PyCursesWindow_Bkgd},
1244 {"bkgdset", (PyCFunction)PyCursesWindow_BkgdSet},
Sjoerd Mullender14ece161995-03-17 12:18:38 +00001245 {"border", (PyCFunction)PyCursesWindow_Border, METH_VARARGS},
1246 {"box", (PyCFunction)PyCursesWindow_Box},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001247 {"clear", (PyCFunction)PyCursesWindow_wclear},
1248 {"clearok", (PyCFunction)PyCursesWindow_clearok},
1249 {"clrtobot", (PyCFunction)PyCursesWindow_wclrtobot},
1250 {"clrtoeol", (PyCFunction)PyCursesWindow_wclrtoeol},
1251 {"cursyncup", (PyCFunction)PyCursesWindow_wcursyncup},
1252 {"delch", (PyCFunction)PyCursesWindow_DelCh},
1253 {"deleteln", (PyCFunction)PyCursesWindow_wdeleteln},
1254 {"derwin", (PyCFunction)PyCursesWindow_DerWin},
1255 {"echochar", (PyCFunction)PyCursesWindow_EchoChar},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001256#ifdef NCURSES_MOUSE_VERSION
1257 {"enclose", (PyCFunction)PyCursesWindow_Enclose},
1258#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001259 {"erase", (PyCFunction)PyCursesWindow_werase},
1260 {"getbegyx", (PyCFunction)PyCursesWindow_getbegyx},
1261 {"getbkgd", (PyCFunction)PyCursesWindow_GetBkgd},
Sjoerd Mullender14ece161995-03-17 12:18:38 +00001262 {"getch", (PyCFunction)PyCursesWindow_GetCh},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001263 {"getkey", (PyCFunction)PyCursesWindow_GetKey},
1264 {"getmaxyx", (PyCFunction)PyCursesWindow_getmaxyx},
1265 {"getparyx", (PyCFunction)PyCursesWindow_getparyx},
Sjoerd Mullender14ece161995-03-17 12:18:38 +00001266 {"getstr", (PyCFunction)PyCursesWindow_GetStr},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001267 {"getyx", (PyCFunction)PyCursesWindow_getyx},
1268 {"hline", (PyCFunction)PyCursesWindow_Hline},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001269 {"idcok", (PyCFunction)PyCursesWindow_idcok},
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001270 {"idlok", (PyCFunction)PyCursesWindow_idlok},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001271 {"immedok", (PyCFunction)PyCursesWindow_immedok},
Sjoerd Mullender14ece161995-03-17 12:18:38 +00001272 {"inch", (PyCFunction)PyCursesWindow_InCh},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001273 {"insch", (PyCFunction)PyCursesWindow_InsCh},
1274 {"insdelln", (PyCFunction)PyCursesWindow_winsdelln},
1275 {"insertln", (PyCFunction)PyCursesWindow_winsertln},
1276 {"insnstr", (PyCFunction)PyCursesWindow_InsNStr},
1277 {"insstr", (PyCFunction)PyCursesWindow_InsStr},
1278 {"instr", (PyCFunction)PyCursesWindow_InStr},
1279 {"is_linetouched", (PyCFunction)PyCursesWindow_Is_LineTouched},
1280 {"is_wintouched", (PyCFunction)PyCursesWindow_is_wintouched},
1281 {"keypad", (PyCFunction)PyCursesWindow_keypad},
1282 {"leaveok", (PyCFunction)PyCursesWindow_leaveok},
1283 {"move", (PyCFunction)PyCursesWindow_wmove},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001284 {"mvderwin", (PyCFunction)PyCursesWindow_mvderwin},
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001285 {"mvwin", (PyCFunction)PyCursesWindow_mvwin},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001286 {"nodelay", (PyCFunction)PyCursesWindow_nodelay},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001287 {"notimeout", (PyCFunction)PyCursesWindow_notimeout},
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001288 {"noutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh},
Andrew M. Kuchlinga98e92b2000-08-20 23:37:02 +00001289 /* Backward compatibility alias -- remove in Python 2.1 */
1290 {"nooutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001291 {"putwin", (PyCFunction)PyCursesWindow_PutWin},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001292 {"redrawln", (PyCFunction)PyCursesWindow_RedrawLine},
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001293 {"redrawwin", (PyCFunction)PyCursesWindow_redrawwin},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001294 {"refresh", (PyCFunction)PyCursesWindow_Refresh},
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00001295#ifndef STRICT_SYSV_CURSES
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001296 {"resize", (PyCFunction)PyCursesWindow_wresize},
1297#endif
1298 {"scroll", (PyCFunction)PyCursesWindow_Scroll},
1299 {"scrollok", (PyCFunction)PyCursesWindow_scrollok},
Sjoerd Mullender14ece161995-03-17 12:18:38 +00001300 {"setscrreg", (PyCFunction)PyCursesWindow_SetScrollRegion},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001301 {"standend", (PyCFunction)PyCursesWindow_wstandend},
1302 {"standout", (PyCFunction)PyCursesWindow_wstandout},
1303 {"subpad", (PyCFunction)PyCursesWindow_SubWin},
1304 {"subwin", (PyCFunction)PyCursesWindow_SubWin},
1305 {"syncdown", (PyCFunction)PyCursesWindow_wsyncdown},
1306 {"syncok", (PyCFunction)PyCursesWindow_syncok},
1307 {"syncup", (PyCFunction)PyCursesWindow_wsyncup},
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00001308 {"timeout", (PyCFunction)PyCursesWindow_wtimeout},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001309 {"touchline", (PyCFunction)PyCursesWindow_TouchLine},
1310 {"touchwin", (PyCFunction)PyCursesWindow_touchwin},
1311 {"untouchwin", (PyCFunction)PyCursesWindow_untouchwin},
1312 {"vline", (PyCFunction)PyCursesWindow_Vline},
Guido van Rossum585c6dc1995-02-24 13:45:43 +00001313 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00001314};
1315
1316static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001317PyCursesWindow_GetAttr(PyCursesWindowObject *self, char *name)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001318{
Guido van Rossuma597dde1995-01-10 20:56:29 +00001319 return Py_FindMethod(PyCursesWindow_Methods, (PyObject *)self, name);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001320}
1321
Guido van Rossumf6971e21994-08-30 12:25:20 +00001322/* -------------------------------------------------------*/
Guido van Rossum85738471995-02-17 13:50:17 +00001323
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001324PyTypeObject PyCursesWindow_Type = {
Guido van Rossumf6971e21994-08-30 12:25:20 +00001325 PyObject_HEAD_INIT(&PyType_Type)
1326 0, /*ob_size*/
1327 "curses window", /*tp_name*/
1328 sizeof(PyCursesWindowObject), /*tp_basicsize*/
1329 0, /*tp_itemsize*/
1330 /* methods */
1331 (destructor)PyCursesWindow_Dealloc, /*tp_dealloc*/
1332 0, /*tp_print*/
1333 (getattrfunc)PyCursesWindow_GetAttr, /*tp_getattr*/
1334 (setattrfunc)0, /*tp_setattr*/
1335 0, /*tp_compare*/
1336 0, /*tp_repr*/
1337 0, /*tp_as_number*/
1338 0, /*tp_as_sequence*/
1339 0, /*tp_as_mapping*/
1340 0, /*tp_hash*/
1341};
1342
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001343/*********************************************************************
1344 Global Functions
1345**********************************************************************/
Guido van Rossumf6971e21994-08-30 12:25:20 +00001346
Guido van Rossume4485b01994-09-07 14:32:49 +00001347static PyObject *ModDict;
1348
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001349/* Function Prototype Macros - They are ugly but very, very useful. ;-)
1350
1351 X - function name
1352 TYPE - parameter Type
1353 ERGSTR - format string for construction of the return value
1354 PARSESTR - format string for argument parsing
1355 */
1356
1357#define NoArgNoReturnFunction(X) \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001358static PyObject *PyCurses_ ## X (PyObject *self, PyObject *args) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001359{ \
1360 PyCursesInitialised \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001361 if (!PyArg_NoArgs(args)) return NULL; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001362 return PyCursesCheckERR(X(), # X); }
1363
1364#define NoArgOrFlagNoReturnFunction(X) \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001365static PyObject *PyCurses_ ## X (PyObject *self, PyObject *args) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001366{ \
1367 int flag = 0; \
1368 PyCursesInitialised \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001369 switch(ARG_COUNT(args)) { \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001370 case 0: \
1371 return PyCursesCheckERR(X(), # X); \
1372 case 1: \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001373 if (!PyArg_Parse(args, "i;True(1) or False(0)", &flag)) return NULL; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001374 if (flag) return PyCursesCheckERR(X(), # X); \
1375 else return PyCursesCheckERR(no ## X (), # X); \
1376 default: \
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001377 PyErr_SetString(PyExc_TypeError, # X " requires 0 or 1 arguments"); \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001378 return NULL; } }
1379
1380#define NoArgReturnIntFunction(X) \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001381static PyObject *PyCurses_ ## X (PyObject *self, PyObject *args) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001382{ \
1383 PyCursesInitialised \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001384 if (!PyArg_NoArgs(args)) return NULL; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001385 return PyInt_FromLong((long) X()); }
1386
1387
1388#define NoArgReturnStringFunction(X) \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001389static PyObject *PyCurses_ ## X (PyObject *self, PyObject *args) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001390{ \
1391 PyCursesInitialised \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001392 if (!PyArg_NoArgs(args)) return NULL; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001393 return PyString_FromString(X()); }
1394
1395#define NoArgTrueFalseFunction(X) \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001396static PyObject *PyCurses_ ## X (PyObject *self, PyObject *args) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001397{ \
1398 PyCursesInitialised \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001399 if (!PyArg_NoArgs(args)) return NULL; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001400 if (X () == FALSE) { \
1401 Py_INCREF(Py_False); \
1402 return Py_False; \
1403 } \
1404 Py_INCREF(Py_True); \
1405 return Py_True; }
1406
1407#define NoArgNoReturnVoidFunction(X) \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001408static PyObject *PyCurses_ ## X (PyObject *self, PyObject *args) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001409{ \
1410 PyCursesInitialised \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001411 if (!PyArg_NoArgs(args)) return NULL; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001412 X(); \
1413 Py_INCREF(Py_None); \
1414 return Py_None; }
1415
1416NoArgNoReturnFunction(beep)
1417NoArgNoReturnFunction(def_prog_mode)
1418NoArgNoReturnFunction(def_shell_mode)
1419NoArgNoReturnFunction(doupdate)
1420NoArgNoReturnFunction(endwin)
1421NoArgNoReturnFunction(flash)
1422NoArgNoReturnFunction(nocbreak)
1423NoArgNoReturnFunction(noecho)
1424NoArgNoReturnFunction(nonl)
1425NoArgNoReturnFunction(noraw)
1426NoArgNoReturnFunction(reset_prog_mode)
1427NoArgNoReturnFunction(reset_shell_mode)
1428NoArgNoReturnFunction(resetty)
1429NoArgNoReturnFunction(savetty)
1430
1431NoArgOrFlagNoReturnFunction(cbreak)
1432NoArgOrFlagNoReturnFunction(echo)
1433NoArgOrFlagNoReturnFunction(nl)
1434NoArgOrFlagNoReturnFunction(raw)
1435
1436NoArgReturnIntFunction(baudrate)
1437NoArgReturnIntFunction(termattrs)
1438
1439NoArgReturnStringFunction(termname)
1440NoArgReturnStringFunction(longname)
1441
1442NoArgTrueFalseFunction(can_change_color)
1443NoArgTrueFalseFunction(has_colors)
1444NoArgTrueFalseFunction(has_ic)
1445NoArgTrueFalseFunction(has_il)
1446NoArgTrueFalseFunction(isendwin)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001447NoArgNoReturnVoidFunction(filter)
1448NoArgNoReturnVoidFunction(flushinp)
1449NoArgNoReturnVoidFunction(noqiflush)
1450
1451static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001452PyCurses_Color_Content(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001453{
1454 short color,r,g,b;
1455
1456 PyCursesInitialised
1457 PyCursesInitialisedColor
1458
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001459 if (ARG_COUNT(args) != 1) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001460 PyErr_SetString(PyExc_TypeError,
1461 "color_content requires 1 argument");
1462 return NULL;
1463 }
1464
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001465 if (!PyArg_Parse(args, "h;color", &color)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001466
1467 if (color_content(color, &r, &g, &b) != ERR)
1468 return Py_BuildValue("(iii)", r, g, b);
1469 else {
1470 PyErr_SetString(PyCursesError,
1471 "Argument 1 was out of range. Check value of COLORS.");
1472 return NULL;
1473 }
1474}
1475
1476static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001477PyCurses_color_pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001478{
1479 int n;
1480
1481 PyCursesInitialised
1482 PyCursesInitialisedColor
1483
Andrew M. Kuchling4463acb2000-07-24 23:54:49 +00001484 if (ARG_COUNT(args) != 1) {
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001485 PyErr_SetString(PyExc_TypeError, "color_pair requires 1 argument");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001486 return NULL;
1487 }
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001488 if (!PyArg_Parse(args, "i;number", &n)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001489 return PyInt_FromLong((long) (n << 8));
1490}
1491
1492static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001493PyCurses_Curs_Set(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001494{
1495 int vis,erg;
1496
1497 PyCursesInitialised
1498
Andrew M. Kuchling4463acb2000-07-24 23:54:49 +00001499 if (ARG_COUNT(args)!=1) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001500 PyErr_SetString(PyExc_TypeError, "curs_set requires 1 argument");
1501 return NULL;
1502 }
1503
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001504 if (!PyArg_Parse(args, "i;int", &vis)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001505
1506 erg = curs_set(vis);
1507 if (erg == ERR) return PyCursesCheckERR(erg, "curs_set");
1508
1509 return PyInt_FromLong((long) erg);
1510}
1511
1512static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001513PyCurses_Delay_Output(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001514{
1515 int ms;
1516
1517 PyCursesInitialised
1518
Andrew M. Kuchling4463acb2000-07-24 23:54:49 +00001519 if (ARG_COUNT(args) != 1) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001520 PyErr_SetString(PyExc_TypeError, "delay_output requires 1 argument");
1521 return NULL;
1522 }
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001523 if (!PyArg_Parse(args, "i;ms", &ms)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001524
1525 return PyCursesCheckERR(delay_output(ms), "delay_output");
1526}
1527
1528static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001529PyCurses_EraseChar(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001530{
1531 char ch;
1532
1533 PyCursesInitialised
1534
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001535 if (!PyArg_NoArgs(args)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001536
1537 ch = erasechar();
1538
1539 return PyString_FromString(&ch);
1540}
1541
1542static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001543PyCurses_getsyx(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001544{
1545 int x,y;
1546
1547 PyCursesInitialised
1548
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001549 if (!PyArg_NoArgs(args)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001550
1551 getsyx(y, x);
1552
1553 return Py_BuildValue("(ii)", y, x);
1554}
1555
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001556#ifdef NCURSES_MOUSE_VERSION
1557static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001558PyCurses_GetMouse(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001559{
1560 int rtn;
1561 MEVENT event;
1562
1563 PyCursesInitialised
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001564 if (!PyArg_NoArgs(args)) return NULL;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001565
1566 rtn = getmouse( &event );
1567 if (rtn == ERR) {
1568 PyErr_SetString(PyCursesError, "getmouse() returned ERR");
1569 return NULL;
1570 }
1571 return Py_BuildValue("(hiiil)",
1572 (short)event.id,
1573 event.x, event.y, event.z,
1574 (long) event.bstate);
1575}
1576
1577static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001578PyCurses_UngetMouse(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001579{
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001580 MEVENT event;
1581
1582 PyCursesInitialised
1583 if (!PyArg_ParseTuple(args, "(hiiil)",
1584 &event.id,
1585 &event.x, &event.y, &event.z,
1586 (int *) &event.bstate))
1587 return NULL;
1588
1589 return PyCursesCheckERR(ungetmouse(&event), "ungetmouse");
1590}
1591#endif
1592
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001593static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001594PyCurses_GetWin(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001595{
1596 WINDOW *win;
1597 PyObject *temp;
1598
1599 PyCursesInitialised
1600
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001601 if (!PyArg_Parse(args, "O;fileobj", &temp)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001602
1603 if (!PyFile_Check(temp)) {
1604 PyErr_SetString(PyExc_TypeError, "argument must be a file object");
1605 return NULL;
1606 }
1607
1608 win = getwin(PyFile_AsFile(temp));
1609
1610 if (win == NULL) {
1611 PyErr_SetString(PyCursesError, catchall_NULL);
1612 return NULL;
1613 }
1614
1615 return PyCursesWindow_New(win);
1616}
1617
1618static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001619PyCurses_HalfDelay(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001620{
1621 unsigned char tenths;
1622
1623 PyCursesInitialised
1624
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001625 switch(ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001626 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001627 if (!PyArg_Parse(args, "b;tenths", &tenths)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001628 break;
1629 default:
1630 PyErr_SetString(PyExc_TypeError, "halfdelay requires 1 argument");
1631 return NULL;
1632 }
1633
1634 return PyCursesCheckERR(halfdelay(tenths), "halfdelay");
1635}
1636
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00001637#ifndef STRICT_SYSV_CURSES
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001638 /* No has_key! */
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001639static PyObject * PyCurses_has_key(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001640{
1641 int ch;
1642
1643 PyCursesInitialised
1644
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001645 if (!PyArg_Parse(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001646
1647 if (has_key(ch) == FALSE) {
1648 Py_INCREF(Py_False);
1649 return Py_False;
1650 }
1651 Py_INCREF(Py_True);
1652 return Py_True;
1653}
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00001654#endif /* STRICT_SYSV_CURSES */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001655
1656static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001657PyCurses_Init_Color(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001658{
1659 short color, r, g, b;
1660
1661 PyCursesInitialised
1662 PyCursesInitialisedColor
1663
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001664 switch(ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001665 case 4:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001666 if (!PyArg_Parse(args, "(hhhh);color,r,g,b", &color, &r, &g, &b)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001667 break;
1668 default:
1669 PyErr_SetString(PyExc_TypeError, "init_color requires 4 arguments");
1670 return NULL;
1671 }
1672
1673 return PyCursesCheckERR(init_color(color, r, g, b), "init_color");
1674}
1675
1676static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001677PyCurses_Init_Pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001678{
1679 short pair, f, b;
1680
1681 PyCursesInitialised
1682 PyCursesInitialisedColor
1683
Andrew M. Kuchling4463acb2000-07-24 23:54:49 +00001684 if (ARG_COUNT(args) != 3) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001685 PyErr_SetString(PyExc_TypeError, "init_pair requires 3 arguments");
1686 return NULL;
1687 }
1688
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001689 if (!PyArg_Parse(args, "(hhh);pair, f, b", &pair, &f, &b)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001690
1691 return PyCursesCheckERR(init_pair(pair, f, b), "init_pair");
1692}
1693
Guido van Rossumf6971e21994-08-30 12:25:20 +00001694static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001695PyCurses_InitScr(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001696{
Guido van Rossum56bf2351994-08-31 22:06:24 +00001697 WINDOW *win;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001698 PyObject *lines, *cols;
1699
1700 if (!PyArg_NoArgs(args)) return NULL;
1701
Guido van Rossum585c6dc1995-02-24 13:45:43 +00001702 if (initialised == TRUE) {
Guido van Rossumf6971e21994-08-30 12:25:20 +00001703 wrefresh(stdscr);
1704 return (PyObject *)PyCursesWindow_New(stdscr);
1705 }
Guido van Rossum56bf2351994-08-31 22:06:24 +00001706
1707 win = initscr();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001708
Guido van Rossum85738471995-02-17 13:50:17 +00001709 if (win == NULL) {
1710 PyErr_SetString(PyCursesError, catchall_NULL);
1711 return NULL;
1712 }
1713
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00001714 initialised = initialised_setupterm = TRUE;
Guido van Rossum56bf2351994-08-31 22:06:24 +00001715
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001716/* This was moved from initcurses() because it core dumped on SGI,
1717 where they're not defined until you've called initscr() */
1718#define SetDictInt(string,ch) \
1719 PyDict_SetItemString(ModDict,string,PyInt_FromLong((long) (ch)));
1720
1721 /* Here are some graphic symbols you can use */
1722 SetDictInt("ACS_ULCORNER", (ACS_ULCORNER));
1723 SetDictInt("ACS_LLCORNER", (ACS_LLCORNER));
1724 SetDictInt("ACS_URCORNER", (ACS_URCORNER));
1725 SetDictInt("ACS_LRCORNER", (ACS_LRCORNER));
1726 SetDictInt("ACS_LTEE", (ACS_LTEE));
1727 SetDictInt("ACS_RTEE", (ACS_RTEE));
1728 SetDictInt("ACS_BTEE", (ACS_BTEE));
1729 SetDictInt("ACS_TTEE", (ACS_TTEE));
1730 SetDictInt("ACS_HLINE", (ACS_HLINE));
1731 SetDictInt("ACS_VLINE", (ACS_VLINE));
1732 SetDictInt("ACS_PLUS", (ACS_PLUS));
1733 SetDictInt("ACS_S1", (ACS_S1));
1734 SetDictInt("ACS_S9", (ACS_S9));
1735 SetDictInt("ACS_DIAMOND", (ACS_DIAMOND));
1736 SetDictInt("ACS_CKBOARD", (ACS_CKBOARD));
1737 SetDictInt("ACS_DEGREE", (ACS_DEGREE));
1738 SetDictInt("ACS_PLMINUS", (ACS_PLMINUS));
1739 SetDictInt("ACS_BULLET", (ACS_BULLET));
1740 SetDictInt("ACS_LARROW", (ACS_LARROW));
1741 SetDictInt("ACS_RARROW", (ACS_RARROW));
1742 SetDictInt("ACS_DARROW", (ACS_DARROW));
1743 SetDictInt("ACS_UARROW", (ACS_UARROW));
1744 SetDictInt("ACS_BOARD", (ACS_BOARD));
1745 SetDictInt("ACS_LANTERN", (ACS_LANTERN));
1746 SetDictInt("ACS_BLOCK", (ACS_BLOCK));
1747 SetDictInt("ACS_BSSB", (ACS_ULCORNER));
1748 SetDictInt("ACS_SSBB", (ACS_LLCORNER));
1749 SetDictInt("ACS_BBSS", (ACS_URCORNER));
1750 SetDictInt("ACS_SBBS", (ACS_LRCORNER));
1751 SetDictInt("ACS_SBSS", (ACS_RTEE));
1752 SetDictInt("ACS_SSSB", (ACS_LTEE));
1753 SetDictInt("ACS_SSBS", (ACS_BTEE));
1754 SetDictInt("ACS_BSSS", (ACS_TTEE));
1755 SetDictInt("ACS_BSBS", (ACS_HLINE));
1756 SetDictInt("ACS_SBSB", (ACS_VLINE));
1757 SetDictInt("ACS_SSSS", (ACS_PLUS));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001758
1759 /* The following are never available with strict SYSV curses */
1760#ifdef ACS_S3
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001761 SetDictInt("ACS_S3", (ACS_S3));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001762#endif
1763#ifdef ACS_S7
1764 SetDictInt("ACS_S7", (ACS_S7));
1765#endif
1766#ifdef ACS_LEQUAL
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001767 SetDictInt("ACS_LEQUAL", (ACS_LEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001768#endif
1769#ifdef ACS_GEQUAL
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001770 SetDictInt("ACS_GEQUAL", (ACS_GEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001771#endif
1772#ifdef ACS_PI
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001773 SetDictInt("ACS_PI", (ACS_PI));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001774#endif
1775#ifdef ACS_NEQUAL
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001776 SetDictInt("ACS_NEQUAL", (ACS_NEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001777#endif
1778#ifdef ACS_STERLING
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001779 SetDictInt("ACS_STERLING", (ACS_STERLING));
1780#endif
1781
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001782 lines = PyInt_FromLong((long) LINES);
1783 PyDict_SetItemString(ModDict, "LINES", lines);
1784 Py_DECREF(lines);
1785 cols = PyInt_FromLong((long) COLS);
1786 PyDict_SetItemString(ModDict, "COLS", cols);
1787 Py_DECREF(cols);
Guido van Rossum56bf2351994-08-31 22:06:24 +00001788
1789 return (PyObject *)PyCursesWindow_New(win);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001790}
1791
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00001792static PyObject *
1793PyCurses_setupterm(PyObject* self, PyObject *args, PyObject* keywds)
1794{
1795 int fd = -1;
1796 int err;
1797 char* termstr = NULL;
1798
1799 static char *kwlist[] = {"term", "fd", NULL};
1800
1801 if (!PyArg_ParseTupleAndKeywords(
1802 args,keywds,"|zi:setupterm",kwlist,&termstr,&fd)) {
1803 return NULL;
1804 }
1805
1806 if (fd == -1) {
1807 PyObject* sys_stdout;
1808
1809 sys_stdout = PySys_GetObject("stdout");
1810
1811 if (sys_stdout == NULL) {
1812 PyErr_SetString(
1813 PyCursesError,
1814 "lost sys.stdout");
1815 return NULL;
1816 }
1817
1818 fd = PyObject_AsFileDescriptor(sys_stdout);
1819
1820 if (fd == -1) {
1821 return NULL;
1822 }
1823 }
1824
1825 if (setupterm(termstr,fd,&err) == ERR) {
1826 char* s = "setupterm: unknown error";
1827
1828 if (err == 0) {
1829 s = "setupterm: could not find terminal";
1830 } else if (err == -1) {
1831 s = "setupterm: could not find terminfo database";
1832 }
1833
1834 PyErr_SetString(PyCursesError,s);
1835 return NULL;
1836 }
1837
1838 initialised_setupterm = TRUE;
1839
1840 Py_INCREF(Py_None);
1841 return Py_None;
1842}
Guido van Rossumf6971e21994-08-30 12:25:20 +00001843
1844static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001845PyCurses_IntrFlush(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001846{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001847 int ch;
1848
1849 PyCursesInitialised
1850
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001851 switch(ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001852 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001853 if (!PyArg_Parse(args,"i;True(1), False(0)",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001854 break;
1855 default:
1856 PyErr_SetString(PyExc_TypeError, "intrflush requires 1 argument");
Guido van Rossum85738471995-02-17 13:50:17 +00001857 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001858 }
1859
1860 return PyCursesCheckERR(intrflush(NULL,ch), "intrflush");
1861}
1862
1863static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001864PyCurses_KeyName(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001865{
1866 const char *knp;
1867 int ch;
1868
1869 PyCursesInitialised
1870
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001871 if (!PyArg_Parse(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001872
1873 knp = keyname(ch);
1874
1875 return PyString_FromString((knp == NULL) ? "" : (char *)knp);
1876}
1877
1878static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001879PyCurses_KillChar(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001880{
1881 char ch;
1882
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001883 if (!PyArg_NoArgs(args)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001884
1885 ch = killchar();
1886
1887 return PyString_FromString(&ch);
1888}
1889
1890static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001891PyCurses_Meta(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001892{
1893 int ch;
1894
1895 PyCursesInitialised
1896
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001897 switch(ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001898 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001899 if (!PyArg_Parse(args,"i;True(1), False(0)",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001900 break;
1901 default:
1902 PyErr_SetString(PyExc_TypeError, "meta requires 1 argument");
1903 return NULL;
1904 }
1905
1906 return PyCursesCheckERR(meta(stdscr, ch), "meta");
1907}
1908
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001909#ifdef NCURSES_MOUSE_VERSION
1910static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001911PyCurses_MouseInterval(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001912{
1913 int interval;
1914 PyCursesInitialised
1915
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001916 if (!PyArg_Parse(args,"i;interval",&interval))
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001917 return NULL;
1918 return PyCursesCheckERR(mouseinterval(interval), "mouseinterval");
1919}
1920
1921static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001922PyCurses_MouseMask(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001923{
Andrew M. Kuchling1a104002000-07-06 18:14:03 +00001924 int newmask;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001925 mmask_t oldmask, availmask;
1926
1927 PyCursesInitialised
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001928 if (!PyArg_Parse(args,"i;mousemask",&newmask))
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001929 return NULL;
1930 availmask = mousemask(newmask, &oldmask);
1931 return Py_BuildValue("(ll)", (long)availmask, (long)oldmask);
1932}
1933#endif
1934
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001935static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001936PyCurses_NewPad(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001937{
1938 WINDOW *win;
1939 int nlines, ncols;
1940
1941 PyCursesInitialised
1942
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001943 if (!PyArg_Parse(args,"(ii);nlines,ncols",&nlines,&ncols)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001944
1945 win = newpad(nlines, ncols);
1946
1947 if (win == NULL) {
1948 PyErr_SetString(PyCursesError, catchall_NULL);
1949 return NULL;
1950 }
1951
1952 return (PyObject *)PyCursesWindow_New(win);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001953}
1954
1955static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001956PyCurses_NewWindow(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001957{
1958 WINDOW *win;
1959 int nlines, ncols, begin_y, begin_x;
Guido van Rossum85738471995-02-17 13:50:17 +00001960
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001961 PyCursesInitialised
1962
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001963 switch (ARG_COUNT(args)) {
Guido van Rossum85738471995-02-17 13:50:17 +00001964 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001965 if (!PyArg_Parse(args,"(ii);nlines,ncols",&nlines,&ncols))
Guido van Rossum85738471995-02-17 13:50:17 +00001966 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001967 win = newpad(nlines, ncols);
Guido van Rossum85738471995-02-17 13:50:17 +00001968 break;
1969 case 4:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001970 if (!PyArg_Parse(args, "(iiii);nlines,ncols,begin_y,begin_x",
Guido van Rossumf6971e21994-08-30 12:25:20 +00001971 &nlines,&ncols,&begin_y,&begin_x))
Guido van Rossum85738471995-02-17 13:50:17 +00001972 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001973 win = newwin(nlines,ncols,begin_y,begin_x);
Guido van Rossum85738471995-02-17 13:50:17 +00001974 break;
1975 default:
1976 PyErr_SetString(PyExc_TypeError, "newwin requires 2 or 4 arguments");
1977 return NULL;
1978 }
1979
Guido van Rossumf6971e21994-08-30 12:25:20 +00001980 if (win == NULL) {
Guido van Rossum85738471995-02-17 13:50:17 +00001981 PyErr_SetString(PyCursesError, catchall_NULL);
1982 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +00001983 }
Guido van Rossum85738471995-02-17 13:50:17 +00001984
Guido van Rossumf6971e21994-08-30 12:25:20 +00001985 return (PyObject *)PyCursesWindow_New(win);
1986}
1987
1988static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001989PyCurses_Pair_Content(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001990{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001991 short pair,f,b;
1992
1993 PyCursesInitialised
1994 PyCursesInitialisedColor
1995
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001996 switch(ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001997 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001998 if (!PyArg_Parse(args, "h;pair", &pair)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001999 break;
2000 default:
2001 PyErr_SetString(PyExc_TypeError, "pair_content requires 1 argument");
Guido van Rossum85738471995-02-17 13:50:17 +00002002 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002003 }
2004
2005 if (!pair_content(pair, &f, &b)) {
2006 PyErr_SetString(PyCursesError,
2007 "Argument 1 was out of range. (1..COLOR_PAIRS-1)");
2008 return NULL;
2009 }
2010
2011 return Py_BuildValue("(ii)", f, b);
2012}
2013
2014static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002015PyCurses_pair_number(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002016{
2017 int n;
2018
2019 PyCursesInitialised
2020 PyCursesInitialisedColor
2021
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002022 switch(ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002023 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002024 if (!PyArg_Parse(args, "i;pairvalue", &n)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002025 break;
2026 default:
2027 PyErr_SetString(PyExc_TypeError,
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002028 "pair_number requires 1 argument");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002029 return NULL;
2030 }
2031
2032 return PyInt_FromLong((long) ((n & A_COLOR) >> 8));
2033}
2034
2035static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002036PyCurses_Putp(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002037{
2038 char *str;
2039
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002040 if (!PyArg_Parse(args,"s;str", &str)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002041 return PyCursesCheckERR(putp(str), "putp");
2042}
2043
2044static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002045PyCurses_QiFlush(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002046{
2047 int flag = 0;
2048
2049 PyCursesInitialised
2050
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002051 switch(ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002052 case 0:
2053 qiflush();
2054 Py_INCREF(Py_None);
2055 return Py_None;
2056 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002057 if (!PyArg_Parse(args, "i;True(1) or False(0)", &flag)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002058 if (flag) qiflush();
2059 else noqiflush();
2060 Py_INCREF(Py_None);
2061 return Py_None;
2062 default:
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002063 PyErr_SetString(PyExc_TypeError, "qiflush requires 0 or 1 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002064 return NULL;
2065 }
2066}
2067
2068static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002069PyCurses_setsyx(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002070{
2071 int y,x;
2072
2073 PyCursesInitialised
2074
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002075 if (ARG_COUNT(args)!=2) {
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002076 PyErr_SetString(PyExc_TypeError, "setsyx requires 2 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002077 return NULL;
2078 }
2079
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002080 if (!PyArg_Parse(args, "(ii);y, x", &y, &x)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002081
2082 setsyx(y,x);
2083
Guido van Rossumf6971e21994-08-30 12:25:20 +00002084 Py_INCREF(Py_None);
Guido van Rossum85738471995-02-17 13:50:17 +00002085 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002086}
2087
2088static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002089PyCurses_Start_Color(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002090{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002091 int code;
2092 PyObject *c, *cp;
2093
2094 PyCursesInitialised
2095
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002096 if (!PyArg_NoArgs(args)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002097
2098 code = start_color();
2099 if (code != ERR) {
2100 initialisedcolors = TRUE;
2101 c = PyInt_FromLong((long) COLORS);
2102 PyDict_SetItemString(ModDict, "COLORS", c);
2103 Py_DECREF(c);
2104 cp = PyInt_FromLong((long) COLOR_PAIRS);
2105 PyDict_SetItemString(ModDict, "COLOR_PAIRS", cp);
2106 Py_DECREF(cp);
2107 Py_INCREF(Py_None);
2108 return Py_None;
2109 } else {
2110 PyErr_SetString(PyCursesError, "start_color() returned ERR");
Guido van Rossum85738471995-02-17 13:50:17 +00002111 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002112 }
2113}
2114
2115static PyObject *
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002116PyCurses_tigetflag(PyObject *self, PyObject *args)
2117{
2118 char *capname;
2119
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002120 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002121
2122 if (!PyArg_ParseTuple(args, "z", &capname))
2123 return NULL;
2124
2125 return PyInt_FromLong( (long) tigetflag( capname ) );
2126}
2127
2128static PyObject *
2129PyCurses_tigetnum(PyObject *self, PyObject *args)
2130{
2131 char *capname;
2132
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002133 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002134
2135 if (!PyArg_ParseTuple(args, "z", &capname))
2136 return NULL;
2137
2138 return PyInt_FromLong( (long) tigetnum( capname ) );
2139}
2140
2141static PyObject *
2142PyCurses_tigetstr(PyObject *self, PyObject *args)
2143{
2144 char *capname;
2145
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002146 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002147
2148 if (!PyArg_ParseTuple(args, "z", &capname))
2149 return NULL;
2150
2151 capname = tigetstr( capname );
2152 if (capname == 0 || capname == (char*) -1) {
2153 Py_INCREF(Py_None);
2154 return Py_None;
2155 }
2156 return PyString_FromString( capname );
2157}
2158
2159static PyObject *
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00002160PyCurses_tparm(PyObject *self, PyObject *args)
2161{
2162 char* fmt;
2163 char* result = NULL;
2164 int i1,i2,i3,i4,i5,i6,i7,i8,i9;
2165
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002166 PyCursesSetupTermCalled;
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00002167
2168 if (!PyArg_ParseTuple(args, "s|iiiiiiiii:tparm",
2169 &fmt, &i1, &i2, &i3, &i4,
2170 &i5, &i6, &i7, &i8, &i9)) {
2171 return NULL;
2172 }
2173
2174 switch (PyTuple_GET_SIZE(args)) {
2175 case 1:
2176 result = tparm(fmt);
2177 break;
2178 case 2:
2179 result = tparm(fmt,i1);
2180 break;
2181 case 3:
2182 result = tparm(fmt,i1,i2);
2183 break;
2184 case 4:
2185 result = tparm(fmt,i1,i2,i3);
2186 break;
2187 case 5:
2188 result = tparm(fmt,i1,i2,i3,i4);
2189 break;
2190 case 6:
2191 result = tparm(fmt,i1,i2,i3,i4,i5);
2192 break;
2193 case 7:
2194 result = tparm(fmt,i1,i2,i3,i4,i5,i6);
2195 break;
2196 case 8:
2197 result = tparm(fmt,i1,i2,i3,i4,i5,i6,i7);
2198 break;
2199 case 9:
2200 result = tparm(fmt,i1,i2,i3,i4,i5,i6,i7,i8);
2201 break;
2202 case 10:
2203 result = tparm(fmt,i1,i2,i3,i4,i5,i6,i7,i8,i9);
2204 break;
2205 }
2206
2207 return PyString_FromString(result);
2208}
2209
2210static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002211PyCurses_TypeAhead(PyObject *self, PyObject *args)
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00002212{
Andrew M. Kuchling1a104002000-07-06 18:14:03 +00002213 int fd;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00002214
2215 PyCursesInitialised
2216
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002217 if (!PyArg_Parse(args,"i;fd",&fd)) return NULL;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00002218
2219 PyCursesCheckERR(typeahead( fd ), "typeahead");
2220 Py_INCREF(Py_None);
2221 return Py_None;
2222}
2223
2224static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002225PyCurses_UnCtrl(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002226{
2227 PyObject *temp;
2228 chtype ch;
2229
2230 PyCursesInitialised
2231
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002232 if (!PyArg_Parse(args,"O;ch or int",&temp)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002233
2234 if (PyInt_Check(temp))
2235 ch = (chtype) PyInt_AsLong(temp);
2236 else if (PyString_Check(temp))
2237 ch = (chtype) *PyString_AsString(temp);
2238 else {
2239 PyErr_SetString(PyExc_TypeError, "argument must be a ch or an int");
2240 return NULL;
2241 }
2242
2243 return PyString_FromString(unctrl(ch));
Guido van Rossumf6971e21994-08-30 12:25:20 +00002244}
2245
2246static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002247PyCurses_UngetCh(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002248{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002249 PyObject *temp;
2250 chtype ch;
2251
2252 PyCursesInitialised
2253
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002254 if (!PyArg_Parse(args,"O;ch or int",&temp)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002255
2256 if (PyInt_Check(temp))
2257 ch = (chtype) PyInt_AsLong(temp);
2258 else if (PyString_Check(temp))
2259 ch = (chtype) *PyString_AsString(temp);
2260 else {
2261 PyErr_SetString(PyExc_TypeError, "argument must be a ch or an int");
Guido van Rossum85738471995-02-17 13:50:17 +00002262 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002263 }
2264
Guido van Rossum85738471995-02-17 13:50:17 +00002265 return PyCursesCheckERR(ungetch(ch), "ungetch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00002266}
2267
2268static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002269PyCurses_Use_Env(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002270{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002271 int flag;
2272
2273 PyCursesInitialised
2274
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002275 switch(ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002276 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002277 if (!PyArg_Parse(args,"i;True(1), False(0)",&flag))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002278 return NULL;
2279 break;
2280 default:
2281 PyErr_SetString(PyExc_TypeError, "use_env requires 1 argument");
Guido van Rossum85738471995-02-17 13:50:17 +00002282 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002283 }
2284 use_env(flag);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002285 Py_INCREF(Py_None);
Guido van Rossum85738471995-02-17 13:50:17 +00002286 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002287}
2288
Guido van Rossumf6971e21994-08-30 12:25:20 +00002289/* List of functions defined in the module */
2290
2291static PyMethodDef PyCurses_methods[] = {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002292 {"baudrate", (PyCFunction)PyCurses_baudrate},
2293 {"beep", (PyCFunction)PyCurses_beep},
2294 {"can_change_color", (PyCFunction)PyCurses_can_change_color},
2295 {"cbreak", (PyCFunction)PyCurses_cbreak},
2296 {"color_content", (PyCFunction)PyCurses_Color_Content},
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002297 {"color_pair", (PyCFunction)PyCurses_color_pair},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002298 {"curs_set", (PyCFunction)PyCurses_Curs_Set},
2299 {"def_prog_mode", (PyCFunction)PyCurses_def_prog_mode},
2300 {"def_shell_mode", (PyCFunction)PyCurses_def_shell_mode},
2301 {"delay_output", (PyCFunction)PyCurses_Delay_Output},
2302 {"doupdate", (PyCFunction)PyCurses_doupdate},
2303 {"echo", (PyCFunction)PyCurses_echo},
2304 {"endwin", (PyCFunction)PyCurses_endwin},
2305 {"erasechar", (PyCFunction)PyCurses_EraseChar},
2306 {"filter", (PyCFunction)PyCurses_filter},
2307 {"flash", (PyCFunction)PyCurses_flash},
2308 {"flushinp", (PyCFunction)PyCurses_flushinp},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002309#ifdef NCURSES_MOUSE_VERSION
2310 {"getmouse", (PyCFunction)PyCurses_GetMouse},
2311 {"ungetmouse", (PyCFunction)PyCurses_UngetMouse, METH_VARARGS},
2312#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002313 {"getsyx", (PyCFunction)PyCurses_getsyx},
2314 {"getwin", (PyCFunction)PyCurses_GetWin},
2315 {"has_colors", (PyCFunction)PyCurses_has_colors},
2316 {"has_ic", (PyCFunction)PyCurses_has_ic},
2317 {"has_il", (PyCFunction)PyCurses_has_il},
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00002318#ifndef STRICT_SYSV_CURSES
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002319 {"has_key", (PyCFunction)PyCurses_has_key},
Guido van Rossumf6971e21994-08-30 12:25:20 +00002320#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002321 {"halfdelay", (PyCFunction)PyCurses_HalfDelay},
2322 {"init_color", (PyCFunction)PyCurses_Init_Color},
2323 {"init_pair", (PyCFunction)PyCurses_Init_Pair},
2324 {"initscr", (PyCFunction)PyCurses_InitScr},
2325 {"intrflush", (PyCFunction)PyCurses_IntrFlush},
2326 {"isendwin", (PyCFunction)PyCurses_isendwin},
2327 {"keyname", (PyCFunction)PyCurses_KeyName},
2328 {"killchar", (PyCFunction)PyCurses_KillChar},
2329 {"longname", (PyCFunction)PyCurses_longname},
2330 {"meta", (PyCFunction)PyCurses_Meta},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002331#ifdef NCURSES_MOUSE_VERSION
2332 {"mouseinterval", (PyCFunction)PyCurses_MouseInterval},
2333 {"mousemask", (PyCFunction)PyCurses_MouseMask},
2334#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002335 {"newpad", (PyCFunction)PyCurses_NewPad},
2336 {"newwin", (PyCFunction)PyCurses_NewWindow},
2337 {"nl", (PyCFunction)PyCurses_nl},
2338 {"nocbreak", (PyCFunction)PyCurses_nocbreak},
2339 {"noecho", (PyCFunction)PyCurses_noecho},
2340 {"nonl", (PyCFunction)PyCurses_nonl},
2341 {"noqiflush", (PyCFunction)PyCurses_noqiflush},
2342 {"noraw", (PyCFunction)PyCurses_noraw},
2343 {"pair_content", (PyCFunction)PyCurses_Pair_Content},
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002344 {"pair_number", (PyCFunction)PyCurses_pair_number},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002345 {"putp", (PyCFunction)PyCurses_Putp},
2346 {"qiflush", (PyCFunction)PyCurses_QiFlush},
2347 {"raw", (PyCFunction)PyCurses_raw},
2348 {"reset_prog_mode", (PyCFunction)PyCurses_reset_prog_mode},
2349 {"reset_shell_mode", (PyCFunction)PyCurses_reset_shell_mode},
Andrew M. Kuchling1a104002000-07-06 18:14:03 +00002350 {"resetty", (PyCFunction)PyCurses_resetty},
2351 {"savetty", (PyCFunction)PyCurses_savetty},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002352 {"setsyx", (PyCFunction)PyCurses_setsyx},
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002353 {"setupterm", (PyCFunction)PyCurses_setupterm, METH_VARARGS|METH_KEYWORDS},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002354 {"start_color", (PyCFunction)PyCurses_Start_Color},
2355 {"termattrs", (PyCFunction)PyCurses_termattrs},
2356 {"termname", (PyCFunction)PyCurses_termname},
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002357 {"tigetflag", (PyCFunction)PyCurses_tigetflag, METH_VARARGS},
2358 {"tigetnum", (PyCFunction)PyCurses_tigetnum, METH_VARARGS},
2359 {"tigetstr", (PyCFunction)PyCurses_tigetstr, METH_VARARGS},
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00002360 {"tparm", (PyCFunction)PyCurses_tparm, METH_VARARGS},
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00002361 {"typeahead", (PyCFunction)PyCurses_TypeAhead},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002362 {"unctrl", (PyCFunction)PyCurses_UnCtrl},
2363 {"ungetch", (PyCFunction)PyCurses_UngetCh},
2364 {"use_env", (PyCFunction)PyCurses_Use_Env},
2365 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002366};
2367
2368/* Initialization function for the module */
2369
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002370void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002371init_curses(void)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002372{
Guido van Rossum8fbf82b1995-02-17 13:54:04 +00002373 PyObject *m, *d, *v;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002374
2375 /* Create the module and add the functions */
Andrew M. Kuchlingb7f198e2000-06-10 23:12:32 +00002376 m = Py_InitModule("_curses", PyCurses_methods);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002377
Guido van Rossumf6971e21994-08-30 12:25:20 +00002378 /* Add some symbolic constants to the module */
2379 d = PyModule_GetDict(m);
Guido van Rossume4485b01994-09-07 14:32:49 +00002380 ModDict = d; /* For PyCurses_InitScr */
Guido van Rossumfbea2f31994-08-31 22:05:27 +00002381
Guido van Rossum85738471995-02-17 13:50:17 +00002382 /* For exception curses.error */
Fred Drake589c35b2000-07-06 19:38:49 +00002383 PyCursesError = PyErr_NewException("_curses.error", NULL, NULL);
Guido van Rossum85738471995-02-17 13:50:17 +00002384 PyDict_SetItemString(d, "error", PyCursesError);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00002385
Guido van Rossum85738471995-02-17 13:50:17 +00002386 /* Make the version available */
Guido van Rossum8fbf82b1995-02-17 13:54:04 +00002387 v = PyString_FromString(PyCursesVersion);
2388 PyDict_SetItemString(d, "version", v);
2389 PyDict_SetItemString(d, "__version__", v);
2390 Py_DECREF(v);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002391
Guido van Rossumf6971e21994-08-30 12:25:20 +00002392 /* Here are some attributes you can add to chars to print */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002393
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002394 SetDictInt("A_ATTRIBUTES", A_ATTRIBUTES);
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002395 SetDictInt("A_NORMAL", A_NORMAL);
2396 SetDictInt("A_STANDOUT", A_STANDOUT);
2397 SetDictInt("A_UNDERLINE", A_UNDERLINE);
2398 SetDictInt("A_REVERSE", A_REVERSE);
2399 SetDictInt("A_BLINK", A_BLINK);
2400 SetDictInt("A_DIM", A_DIM);
2401 SetDictInt("A_BOLD", A_BOLD);
2402 SetDictInt("A_ALTCHARSET", A_ALTCHARSET);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002403 SetDictInt("A_INVIS", A_INVIS);
2404 SetDictInt("A_PROTECT", A_PROTECT);
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002405 SetDictInt("A_CHARTEXT", A_CHARTEXT);
2406 SetDictInt("A_COLOR", A_COLOR);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002407
2408 /* The following are never available with strict SYSV curses */
2409#ifdef A_HORIZONTAL
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002410 SetDictInt("A_HORIZONTAL", A_HORIZONTAL);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002411#endif
2412#ifdef A_LEFT
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002413 SetDictInt("A_LEFT", A_LEFT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002414#endif
2415#ifdef A_LOW
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002416 SetDictInt("A_LOW", A_LOW);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002417#endif
2418#ifdef A_RIGHT
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002419 SetDictInt("A_RIGHT", A_RIGHT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002420#endif
2421#ifdef A_TOP
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002422 SetDictInt("A_TOP", A_TOP);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002423#endif
2424#ifdef A_VERTICAL
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002425 SetDictInt("A_VERTICAL", A_VERTICAL);
2426#endif
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002427
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002428 SetDictInt("COLOR_BLACK", COLOR_BLACK);
2429 SetDictInt("COLOR_RED", COLOR_RED);
2430 SetDictInt("COLOR_GREEN", COLOR_GREEN);
2431 SetDictInt("COLOR_YELLOW", COLOR_YELLOW);
2432 SetDictInt("COLOR_BLUE", COLOR_BLUE);
2433 SetDictInt("COLOR_MAGENTA", COLOR_MAGENTA);
2434 SetDictInt("COLOR_CYAN", COLOR_CYAN);
2435 SetDictInt("COLOR_WHITE", COLOR_WHITE);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002436
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002437#ifdef NCURSES_MOUSE_VERSION
2438 /* Mouse-related constants */
2439 SetDictInt("BUTTON1_PRESSED", BUTTON1_PRESSED);
2440 SetDictInt("BUTTON1_RELEASED", BUTTON1_RELEASED);
2441 SetDictInt("BUTTON1_CLICKED", BUTTON1_CLICKED);
2442 SetDictInt("BUTTON1_DOUBLE_CLICKED", BUTTON1_DOUBLE_CLICKED);
2443 SetDictInt("BUTTON1_TRIPLE_CLICKED", BUTTON1_TRIPLE_CLICKED);
2444
2445 SetDictInt("BUTTON2_PRESSED", BUTTON2_PRESSED);
2446 SetDictInt("BUTTON2_RELEASED", BUTTON2_RELEASED);
2447 SetDictInt("BUTTON2_CLICKED", BUTTON2_CLICKED);
2448 SetDictInt("BUTTON2_DOUBLE_CLICKED", BUTTON2_DOUBLE_CLICKED);
2449 SetDictInt("BUTTON2_TRIPLE_CLICKED", BUTTON2_TRIPLE_CLICKED);
2450
2451 SetDictInt("BUTTON3_PRESSED", BUTTON3_PRESSED);
2452 SetDictInt("BUTTON3_RELEASED", BUTTON3_RELEASED);
2453 SetDictInt("BUTTON3_CLICKED", BUTTON3_CLICKED);
2454 SetDictInt("BUTTON3_DOUBLE_CLICKED", BUTTON3_DOUBLE_CLICKED);
2455 SetDictInt("BUTTON3_TRIPLE_CLICKED", BUTTON3_TRIPLE_CLICKED);
2456
2457 SetDictInt("BUTTON4_PRESSED", BUTTON4_PRESSED);
2458 SetDictInt("BUTTON4_RELEASED", BUTTON4_RELEASED);
2459 SetDictInt("BUTTON4_CLICKED", BUTTON4_CLICKED);
2460 SetDictInt("BUTTON4_DOUBLE_CLICKED", BUTTON4_DOUBLE_CLICKED);
2461 SetDictInt("BUTTON4_TRIPLE_CLICKED", BUTTON4_TRIPLE_CLICKED);
2462
2463 SetDictInt("BUTTON_SHIFT", BUTTON_SHIFT);
2464 SetDictInt("BUTTON_CTRL", BUTTON_CTRL);
2465 SetDictInt("BUTTON_ALT", BUTTON_ALT);
2466
2467 SetDictInt("ALL_MOUSE_EVENTS", ALL_MOUSE_EVENTS);
2468 SetDictInt("REPORT_MOUSE_POSITION", REPORT_MOUSE_POSITION);
2469#endif
Guido van Rossumf6971e21994-08-30 12:25:20 +00002470 /* Now set everything up for KEY_ variables */
2471 {
2472 int key;
2473 char *key_n;
2474 char *key_n2;
2475 for (key=KEY_MIN;key < KEY_MAX; key++) {
2476 key_n = (char *)keyname(key);
Guido van Rossumf5c6d471995-02-07 15:38:32 +00002477 if (key_n == NULL || strcmp(key_n,"UNKNOWN KEY")==0)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002478 continue;
2479 if (strncmp(key_n,"KEY_F(",6)==0) {
2480 char *p1, *p2;
2481 key_n2 = malloc(strlen(key_n)+1);
2482 p1 = key_n;
2483 p2 = key_n2;
2484 while (*p1) {
2485 if (*p1 != '(' && *p1 != ')') {
2486 *p2 = *p1;
2487 p2++;
2488 }
2489 p1++;
2490 }
2491 *p2 = (char)0;
2492 } else
2493 key_n2 = key_n;
Guido van Rossum85738471995-02-17 13:50:17 +00002494 PyDict_SetItemString(d,key_n2,PyInt_FromLong((long) key));
Guido van Rossumf6971e21994-08-30 12:25:20 +00002495 if (key_n2 != key_n)
2496 free(key_n2);
2497 }
Guido van Rossum85738471995-02-17 13:50:17 +00002498 SetDictInt("KEY_MIN", KEY_MIN);
2499 SetDictInt("KEY_MAX", KEY_MAX);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002500 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00002501}