blob: 8796aafae0028c89ae55e9c3e08b0b0217e67044 [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. Kuchling22b88ce2000-05-23 16:18:03 +000036/* Release Number */
Guido van Rossumf6971e21994-08-30 12:25:20 +000037
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +000038char *PyCursesVersion = "1.6";
Guido van Rossumf6971e21994-08-30 12:25:20 +000039
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +000040/* Includes */
Guido van Rossumf6971e21994-08-30 12:25:20 +000041
Guido van Rossum602099a1994-09-14 13:32:22 +000042#include "Python.h"
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +000043
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +000044#ifdef HAVE_NCURSES_H
45#include <ncurses.h>
46#else
47#include <curses.h>
48#endif
49
50#if defined(__sgi__) || defined(__sun__)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +000051 /* No attr_t type is available */
52typedef chtype attr_t;
Guido van Rossum1266a011996-02-25 04:50:31 +000053#endif
Guido van Rossumf6971e21994-08-30 12:25:20 +000054
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +000055/* Definition of exception curses.error */
Guido van Rossumf6971e21994-08-30 12:25:20 +000056
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +000057static PyObject *PyCursesError;
Guido van Rossumf6971e21994-08-30 12:25:20 +000058
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +000059/* general error messages */
Guido van Rossum85738471995-02-17 13:50:17 +000060static char *catchall_ERR = "curses function returned ERR";
61static char *catchall_NULL = "curses function returned NULL";
62
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +000063/* Tells whether initscr() has been called to initialise curses. */
Guido van Rossum585c6dc1995-02-24 13:45:43 +000064static int initialised = FALSE;
65
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +000066/* Tells whether start_color() has been called to initialise colorusage. */
67static int initialisedcolors = FALSE;
68
69/* Utility Macros */
Guido van Rossum85738471995-02-17 13:50:17 +000070#define ARG_COUNT(X) \
71 (((X) == NULL) ? 0 : (PyTuple_Check(X) ? PyTuple_Size(X) : 1))
Guido van Rossumf6971e21994-08-30 12:25:20 +000072
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +000073#define PyCursesInitialised \
74 if (initialised != TRUE) { \
75 PyErr_SetString(PyCursesError, \
76 "must call initscr() first"); \
77 return NULL; }
Guido van Rossumfbea2f31994-08-31 22:05:27 +000078
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +000079#define PyCursesInitialisedColor \
80 if (initialisedcolors != TRUE) { \
81 PyErr_SetString(PyCursesError, \
82 "must call start_color() first"); \
83 return NULL; }
Guido van Rossumfbea2f31994-08-31 22:05:27 +000084
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +000085/* Utility Functions */
Guido van Rossumfbea2f31994-08-31 22:05:27 +000086
Guido van Rossum85738471995-02-17 13:50:17 +000087/*
88 * Check the return code from a curses function and return None
89 * or raise an exception as appropriate.
90 */
91
92static PyObject *
93PyCursesCheckERR(code, fname)
94 int code;
95 char *fname;
96{
Guido van Rossum85738471995-02-17 13:50:17 +000097 if (code != ERR) {
98 Py_INCREF(Py_None);
99 return Py_None;
100 } else {
101 if (fname == NULL) {
102 PyErr_SetString(PyCursesError, catchall_ERR);
103 } else {
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000104 PyErr_Format(PyCursesError, "%s() returned ERR", fname);
Guido van Rossum85738471995-02-17 13:50:17 +0000105 }
106 return NULL;
107 }
108}
109
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000110static int
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000111PyCurses_ConvertToChtype(obj, ch)
112 PyObject *obj;
113 chtype *ch;
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000114{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000115 if (PyInt_Check(obj)) {
116 *ch = (chtype) PyInt_AsLong(obj);
117 } else if(PyString_Check(obj) &
118 (PyString_Size(obj) == 1)) {
119 *ch = (chtype) *PyString_AsString(obj);
120 } else {
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000121 return 0;
122 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000123 return 1;
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000124}
125
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000126/*****************************************************************************
127 The Window Object
128******************************************************************************/
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000129
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000130/* Definition of the window object and window type */
Guido van Rossum85738471995-02-17 13:50:17 +0000131
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000132typedef struct {
133 PyObject_HEAD
134 WINDOW *win;
135} PyCursesWindowObject;
Guido van Rossum85738471995-02-17 13:50:17 +0000136
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000137PyTypeObject PyCursesWindow_Type;
138
139#define PyCursesWindow_Check(v) ((v)->ob_type == &PyCursesWindow_Type)
140
141/* Function Prototype Macros - They are ugly but very, very useful. ;-)
142
143 X - function name
144 TYPE - parameter Type
145 ERGSTR - format string for construction of the return value
146 PARSESTR - format string for argument parsing
147 */
148
149#define Window_NoArgNoReturnFunction(X) \
150static PyObject *PyCursesWindow_ ## X (self, arg) \
151 PyCursesWindowObject * self; PyObject * arg; \
152{ if (!PyArg_NoArgs(arg)) return NULL; \
153 return PyCursesCheckERR(X(self->win), # X); }
154
155#define Window_NoArgTrueFalseFunction(X) \
156static PyObject * PyCursesWindow_ ## X (self,arg) \
157 PyCursesWindowObject * self; PyObject * arg; \
158{ \
159 if (!PyArg_NoArgs(arg)) return NULL; \
160 if (X (self->win) == FALSE) { Py_INCREF(Py_False); return Py_False; } \
161 else { Py_INCREF(Py_True); return Py_True; } }
162
163#define Window_NoArgNoReturnVoidFunction(X) \
164static PyObject * PyCursesWindow_ ## X (self,arg) \
165 PyCursesWindowObject * self; \
166 PyObject * arg; \
167{ \
168 if (!PyArg_NoArgs(arg)) return NULL; \
169 X(self->win); Py_INCREF(Py_None); return Py_None; }
170
171#define Window_NoArg2TupleReturnFunction(X, TYPE, ERGSTR) \
172static PyObject * PyCursesWindow_ ## X (self, arg) \
173 PyCursesWindowObject *self; \
174 PyObject * arg; \
175{ \
176 TYPE arg1, arg2; \
177 if (!PyArg_NoArgs(arg)) return NULL; \
178 X(self->win,arg1,arg2); return Py_BuildValue(ERGSTR, arg1, arg2); }
179
180#define Window_OneArgNoReturnVoidFunction(X, TYPE, PARSESTR) \
181static PyObject * PyCursesWindow_ ## X (self, arg) \
182 PyCursesWindowObject *self; \
183 PyObject * arg; \
184{ \
185 TYPE arg1; \
186 if (!PyArg_Parse(arg, PARSESTR, &arg1)) return NULL; \
187 X(self->win,arg1); Py_INCREF(Py_None); return Py_None; }
188
189#define Window_OneArgNoReturnFunction(X, TYPE, PARSESTR) \
190static PyObject * PyCursesWindow_ ## X (self, arg) \
191 PyCursesWindowObject *self; \
192 PyObject * arg; \
193{ \
194 TYPE arg1; \
195 if (!PyArg_Parse(arg,PARSESTR, &arg1)) return NULL; \
196 return PyCursesCheckERR(X(self->win, arg1), # X); }
197
198#define Window_TwoArgNoReturnFunction(X, TYPE, PARSESTR) \
199static PyObject * PyCursesWindow_ ## X (self, arg) \
200 PyCursesWindowObject *self; \
201 PyObject * arg; \
202{ \
203 TYPE arg1, arg2; \
204 if (!PyArg_Parse(arg,PARSESTR, &arg1, &arg2)) return NULL; \
205 return PyCursesCheckERR(X(self->win, arg1, arg2), # X); }
Guido van Rossum85738471995-02-17 13:50:17 +0000206
Guido van Rossumf6971e21994-08-30 12:25:20 +0000207/* ------------- WINDOW routines --------------- */
Guido van Rossum85738471995-02-17 13:50:17 +0000208
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000209Window_NoArgNoReturnFunction(untouchwin)
210Window_NoArgNoReturnFunction(touchwin)
211Window_NoArgNoReturnFunction(redrawwin)
212Window_NoArgNoReturnFunction(winsertln)
213Window_NoArgNoReturnFunction(werase)
214Window_NoArgNoReturnFunction(wdeleteln)
215
216Window_NoArgTrueFalseFunction(is_wintouched)
217
218Window_NoArgNoReturnVoidFunction(wsyncup)
219Window_NoArgNoReturnVoidFunction(wsyncdown)
220Window_NoArgNoReturnVoidFunction(wstandend)
221Window_NoArgNoReturnVoidFunction(wstandout)
222Window_NoArgNoReturnVoidFunction(wcursyncup)
223Window_NoArgNoReturnVoidFunction(wclrtoeol)
224Window_NoArgNoReturnVoidFunction(wclrtobot)
225Window_NoArgNoReturnVoidFunction(wclear)
226
227Window_OneArgNoReturnVoidFunction(idcok, int, "i;True(1) or False(0)")
228Window_OneArgNoReturnVoidFunction(immedok, int, "i;True(1) or False(0)")
229
230Window_NoArg2TupleReturnFunction(getyx, int, "(ii)")
231Window_NoArg2TupleReturnFunction(getbegyx, int, "(ii)")
232Window_NoArg2TupleReturnFunction(getmaxyx, int, "(ii)")
233Window_NoArg2TupleReturnFunction(getparyx, int, "(ii)")
234
235Window_OneArgNoReturnFunction(wattron, attr_t, "l;attr")
236Window_OneArgNoReturnFunction(wattroff, attr_t, "l;attr")
237Window_OneArgNoReturnFunction(wattrset, attr_t, "l;attr")
238Window_OneArgNoReturnFunction(clearok, int, "i;True(1) or False(0)")
239Window_OneArgNoReturnFunction(idlok, int, "i;True(1) or False(0)")
240Window_OneArgNoReturnFunction(keypad, int, "i;True(1) or False(0)")
241Window_OneArgNoReturnFunction(leaveok, int, "i;True(1) or False(0)")
242Window_OneArgNoReturnFunction(nodelay, int, "i;True(1) or False(0)")
243Window_OneArgNoReturnFunction(notimeout, int, "i;True(1) or False(0)")
244Window_OneArgNoReturnFunction(scrollok, int, "i;True(1) or False(0)")
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000245Window_OneArgNoReturnFunction(winsdelln, int, "i;nlines")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000246Window_OneArgNoReturnFunction(syncok, int, "i;True(1) or False(0)")
247
248Window_TwoArgNoReturnFunction(mvwin, int, "(ii);y,x")
249Window_TwoArgNoReturnFunction(mvderwin, int, "(ii);y,x")
250Window_TwoArgNoReturnFunction(wmove, int, "(ii);y,x")
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000251#if !defined(__sgi__) && !defined(__sun__)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000252Window_TwoArgNoReturnFunction(wresize, int, "(ii);lines,columns")
253#endif
254
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000255/* Allocation and deallocation of Window Objects */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000256
Guido van Rossumf6971e21994-08-30 12:25:20 +0000257static PyObject *
258PyCursesWindow_New(win)
259 WINDOW *win;
260{
261 PyCursesWindowObject *wo;
Guido van Rossum85738471995-02-17 13:50:17 +0000262
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000263 wo = PyObject_NEW(PyCursesWindowObject, &PyCursesWindow_Type);
264 if (wo == NULL) return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000265 wo->win = win;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000266 return (PyObject *)wo;
267}
268
269static void
270PyCursesWindow_Dealloc(wo)
271 PyCursesWindowObject *wo;
272{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000273 if (wo->win != stdscr) delwin(wo->win);
274 PyMem_DEL(wo);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000275}
276
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000277/* Addch, Addstr, Addnstr */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000278
279static PyObject *
280PyCursesWindow_AddCh(self,arg)
281 PyCursesWindowObject *self;
282 PyObject * arg;
283{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000284 int rtn, x, y, use_xy = FALSE;
285 PyObject *temp;
286 chtype ch = 0;
287 attr_t attr = A_NORMAL;
288
Guido van Rossum85738471995-02-17 13:50:17 +0000289 switch (ARG_COUNT(arg)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000290 case 1:
291 if (!PyArg_Parse(arg, "O;ch or int", &temp))
292 return NULL;
293 break;
294 case 2:
295 if (!PyArg_Parse(arg, "(Ol);ch or int,attr", &temp, &attr))
Guido van Rossum85738471995-02-17 13:50:17 +0000296 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000297 break;
298 case 3:
299 if (!PyArg_Parse(arg,"(iiO);y,x,ch or int", &y, &x, &temp))
300 return NULL;
301 use_xy = TRUE;
302 break;
303 case 4:
304 if (!PyArg_Parse(arg,"(iiOl);y,x,ch or int, attr",
305 &y, &x, &temp, &attr))
306 return NULL;
307 use_xy = TRUE;
308 break;
309 default:
310 PyErr_SetString(PyExc_TypeError, "addch requires 1 or 4 arguments");
311 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000312 }
Guido van Rossum85738471995-02-17 13:50:17 +0000313
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000314 if (!PyCurses_ConvertToChtype(temp, &ch)) {
315 PyErr_SetString(PyExc_TypeError, "argument 1 or 3 must be a ch or an int");
316 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000317 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000318
Guido van Rossumf6971e21994-08-30 12:25:20 +0000319 if (use_xy == TRUE)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000320 rtn = mvwaddch(self->win,y,x, ch | attr);
321 else {
322 rtn = waddch(self->win, ch | attr);
323 }
324 return PyCursesCheckERR(rtn, "addch");
Guido van Rossumf6971e21994-08-30 12:25:20 +0000325}
326
327static PyObject *
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000328PyCursesWindow_AddStr(self,arg)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000329 PyCursesWindowObject *self;
330 PyObject * arg;
331{
332 int rtn;
333 int x, y;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000334 char *str;
335 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
336 int use_xy = FALSE, use_attr = FALSE;
Guido van Rossum85738471995-02-17 13:50:17 +0000337
338 switch (ARG_COUNT(arg)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000339 case 1:
340 if (!PyArg_Parse(arg,"s;str", &str))
Guido van Rossum85738471995-02-17 13:50:17 +0000341 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000342 break;
343 case 2:
344 if (!PyArg_Parse(arg,"(sl);str,attr", &str, &attr))
345 return NULL;
346 use_attr = TRUE;
347 break;
348 case 3:
349 if (!PyArg_Parse(arg,"(iis);int,int,str", &y, &x, &str))
350 return NULL;
351 use_xy = TRUE;
352 break;
353 case 4:
354 if (!PyArg_Parse(arg,"(iisl);int,int,str,attr", &y, &x, &str, &attr))
355 return NULL;
356 use_xy = use_attr = TRUE;
357 break;
358 default:
359 PyErr_SetString(PyExc_TypeError, "addstr requires 1 to 4 arguments");
360 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000361 }
Guido van Rossum85738471995-02-17 13:50:17 +0000362
Guido van Rossumf6971e21994-08-30 12:25:20 +0000363 if (use_attr == TRUE) {
364 attr_old = getattrs(self->win);
365 wattrset(self->win,attr);
366 }
367 if (use_xy == TRUE)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000368 rtn = mvwaddstr(self->win,y,x,str);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000369 else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000370 rtn = waddstr(self->win,str);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000371 if (use_attr == TRUE)
372 wattrset(self->win,attr_old);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000373 return PyCursesCheckERR(rtn, "addstr");
374}
Guido van Rossum85738471995-02-17 13:50:17 +0000375
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000376static PyObject *
377PyCursesWindow_AddNStr(self,arg)
378 PyCursesWindowObject *self;
379 PyObject * arg;
380{
381 int rtn, x, y, n;
382 char *str;
383 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
384 int use_xy = FALSE, use_attr = FALSE;
385
386 switch (ARG_COUNT(arg)) {
387 case 2:
388 if (!PyArg_Parse(arg,"(si);str,n", &str, &n))
389 return NULL;
390 break;
391 case 3:
392 if (!PyArg_Parse(arg,"(sil);str,n,attr", &str, &n, &attr))
393 return NULL;
394 use_attr = TRUE;
395 break;
396 case 4:
397 if (!PyArg_Parse(arg,"(iisi);y,x,str,n", &y, &x, &str, &n))
398 return NULL;
399 use_xy = TRUE;
400 break;
401 case 5:
402 if (!PyArg_Parse(arg,"(iisil);y,x,str,n,attr", &y, &x, &str, &n, &attr))
403 return NULL;
404 use_xy = use_attr = TRUE;
405 break;
406 default:
407 PyErr_SetString(PyExc_TypeError, "addnstr requires 2 to 5 arguments");
408 return NULL;
409 }
410
411 if (use_attr == TRUE) {
412 attr_old = getattrs(self->win);
413 wattrset(self->win,attr);
414 }
415 if (use_xy == TRUE)
416 rtn = mvwaddnstr(self->win,y,x,str,n);
417 else
418 rtn = waddnstr(self->win,str,n);
419 if (use_attr == TRUE)
420 wattrset(self->win,attr_old);
421 return PyCursesCheckERR(rtn, "addnstr");
422}
423
424static PyObject *
425PyCursesWindow_Bkgd(self,arg)
426 PyCursesWindowObject *self;
427 PyObject * arg;
428{
429 PyObject *temp;
430 chtype bkgd;
431 attr_t attr = A_NORMAL;
432
433 switch (ARG_COUNT(arg)) {
434 case 1:
435 if (!PyArg_Parse(arg, "O;ch or int", &temp))
436 return NULL;
437 break;
438 case 2:
439 if (!PyArg_Parse(arg,"(Ol);ch or int,attr", &temp, &attr))
440 return NULL;
441 break;
442 default:
443 PyErr_SetString(PyExc_TypeError, "bkgd requires 1 or 2 arguments");
444 return NULL;
445 }
446
447 if (!PyCurses_ConvertToChtype(temp, &bkgd)) {
448 PyErr_SetString(PyExc_TypeError, "argument 1 or 3 must be a ch or an int");
449 return NULL;
450 }
451
452 return PyCursesCheckERR(wbkgd(self->win, bkgd | A_NORMAL), "bkgd");
453}
454
455static PyObject *
456PyCursesWindow_BkgdSet(self,arg)
457 PyCursesWindowObject *self;
458 PyObject * arg;
459{
460 PyObject *temp;
461 chtype bkgd;
462 attr_t attr = A_NORMAL;
463
464 switch (ARG_COUNT(arg)) {
465 case 1:
466 if (!PyArg_Parse(arg, "O;ch or int", &temp))
467 return NULL;
468 break;
469 case 2:
470 if (!PyArg_Parse(arg,"(Ol);ch or int,attr", &temp, &attr))
471 return NULL;
472 break;
473 default:
474 PyErr_SetString(PyExc_TypeError, "bkgdset requires 1 or 2 arguments");
475 return NULL;
476 }
477
478 if (!PyCurses_ConvertToChtype(temp, &bkgd)) {
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000479 PyErr_SetString(PyExc_TypeError, "argument 1 must be a ch or an int");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000480 return NULL;
481 }
482
483 wbkgdset(self->win, bkgd | attr);
484 return PyCursesCheckERR(0, "bkgdset");
485}
486
487static PyObject *
488PyCursesWindow_Border(self, args)
489 PyCursesWindowObject *self;
490 PyObject *args;
491{
492 chtype ls, rs, ts, bs, tl, tr, bl, br;
493 ls = rs = ts = bs = tl = tr = bl = br = 0;
494 if (!PyArg_Parse(args,"|llllllll;ls,rs,ts,bs,tl,tr,bl,br",
495 &ls, &rs, &ts, &bs, &tl, &tr, &bl, &br))
496 return NULL;
497 wborder(self->win, ls, rs, ts, bs, tl, tr, bl, br);
498 Py_INCREF(Py_None);
499 return Py_None;
500}
501
502static PyObject *
503PyCursesWindow_Box(self,arg)
504 PyCursesWindowObject *self;
505 PyObject * arg;
506{
507 chtype ch1=0,ch2=0;
508 if (!PyArg_NoArgs(arg)) {
509 PyErr_Clear();
510 if (!PyArg_Parse(arg,"(ll);vertint,horint", &ch1, &ch2))
511 return NULL;
512 }
513 box(self->win,ch1,ch2);
514 Py_INCREF(Py_None);
515 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000516}
517
518static PyObject *
519PyCursesWindow_DelCh(self,arg)
520 PyCursesWindowObject *self;
521 PyObject * arg;
522{
523 int rtn;
524 int x, y;
Guido van Rossum85738471995-02-17 13:50:17 +0000525
526 switch (ARG_COUNT(arg)) {
527 case 0:
Guido van Rossumf6971e21994-08-30 12:25:20 +0000528 rtn = wdelch(self->win);
Guido van Rossum85738471995-02-17 13:50:17 +0000529 break;
530 case 2:
531 if (!PyArg_Parse(arg,"(ii);y,x", &y, &x))
532 return NULL;
533 rtn = mvwdelch(self->win,y,x);
534 break;
535 default:
536 PyErr_SetString(PyExc_TypeError, "delch requires 0 or 2 arguments");
537 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000538 }
Guido van Rossum85738471995-02-17 13:50:17 +0000539 return PyCursesCheckERR(rtn, "[mv]wdelch");
Guido van Rossumf6971e21994-08-30 12:25:20 +0000540}
541
542static PyObject *
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000543PyCursesWindow_DerWin(self,arg)
544 PyCursesWindowObject *self;
545 PyObject * arg;
546{
547 WINDOW *win;
548 int nlines, ncols, begin_y, begin_x;
549
550 nlines = 0;
551 ncols = 0;
552 switch (ARG_COUNT(arg)) {
553 case 2:
554 if (!PyArg_Parse(arg,"(ii);begin_y,begin_x",&begin_y,&begin_x))
555 return NULL;
556 break;
557 case 4:
558 if (!PyArg_Parse(arg, "(iiii);nlines,ncols,begin_y,begin_x",
559 &nlines,&ncols,&begin_y,&begin_x))
560 return NULL;
561 break;
562 default:
563 PyErr_SetString(PyExc_TypeError, "derwin requires 2 or 4 arguments");
564 return NULL;
565 }
566
567 win = derwin(self->win,nlines,ncols,begin_y,begin_x);
568
569 if (win == NULL) {
570 PyErr_SetString(PyCursesError, catchall_NULL);
571 return NULL;
572 }
573
574 return (PyObject *)PyCursesWindow_New(win);
575}
576
577static PyObject *
Guido van Rossumf6971e21994-08-30 12:25:20 +0000578PyCursesWindow_EchoChar(self,arg)
579 PyCursesWindowObject *self;
580 PyObject * arg;
581{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000582 PyObject *temp;
583 chtype ch;
584 attr_t attr = A_NORMAL;
Guido van Rossum85738471995-02-17 13:50:17 +0000585
586 switch (ARG_COUNT(arg)) {
587 case 1:
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000588 if (!PyArg_Parse(arg,"O;ch or int", &temp))
Guido van Rossum85738471995-02-17 13:50:17 +0000589 return NULL;
Guido van Rossum85738471995-02-17 13:50:17 +0000590 break;
591 case 2:
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000592 if (!PyArg_Parse(arg,"(Ol);ch or int,attr", &temp, &attr))
Guido van Rossum85738471995-02-17 13:50:17 +0000593 return NULL;
Guido van Rossum85738471995-02-17 13:50:17 +0000594 break;
595 default:
596 PyErr_SetString(PyExc_TypeError, "echochar requires 1 or 2 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000597
598
Guido van Rossum85738471995-02-17 13:50:17 +0000599 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000600 }
Guido van Rossum85738471995-02-17 13:50:17 +0000601
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000602 if (!PyCurses_ConvertToChtype(temp, &ch)) {
603 PyErr_SetString(PyExc_TypeError, "argument 1 must be a ch or an int");
Guido van Rossum85738471995-02-17 13:50:17 +0000604 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000605 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000606
607 if (self->win->_flags & _ISPAD)
608 return PyCursesCheckERR(pechochar(self->win, ch | attr),
609 "echochar");
Guido van Rossumf6971e21994-08-30 12:25:20 +0000610 else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000611 return PyCursesCheckERR(wechochar(self->win, ch | attr),
612 "echochar");
Guido van Rossumf6971e21994-08-30 12:25:20 +0000613}
614
615static PyObject *
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000616PyCursesWindow_GetBkgd(self, arg)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000617 PyCursesWindowObject *self;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000618 PyObject *arg;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000619{
Guido van Rossumf6971e21994-08-30 12:25:20 +0000620 if (!PyArg_NoArgs(arg))
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000621 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000622 return PyInt_FromLong((long) getbkgd(self->win));
Guido van Rossumf6971e21994-08-30 12:25:20 +0000623}
624
625static PyObject *
626PyCursesWindow_GetCh(self,arg)
627 PyCursesWindowObject *self;
628 PyObject * arg;
629{
630 int x, y;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000631 chtype rtn;
Guido van Rossum85738471995-02-17 13:50:17 +0000632
633 switch (ARG_COUNT(arg)) {
634 case 0:
Guido van Rossumf6971e21994-08-30 12:25:20 +0000635 rtn = wgetch(self->win);
Guido van Rossum85738471995-02-17 13:50:17 +0000636 break;
637 case 2:
638 if (!PyArg_Parse(arg,"(ii);y,x",&y,&x))
639 return NULL;
640 rtn = mvwgetch(self->win,y,x);
641 break;
642 default:
643 PyErr_SetString(PyExc_TypeError, "getch requires 0 or 2 arguments");
644 return NULL;
645 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000646 return PyInt_FromLong(rtn);
647}
Guido van Rossum85738471995-02-17 13:50:17 +0000648
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000649static PyObject *
650PyCursesWindow_GetKey(self,arg)
651 PyCursesWindowObject *self;
652 PyObject * arg;
653{
654 int x, y;
655 chtype rtn;
656
657 switch (ARG_COUNT(arg)) {
658 case 0:
659 rtn = wgetch(self->win);
660 break;
661 case 2:
662 if (!PyArg_Parse(arg,"(ii);y,x",&y,&x))
663 return NULL;
664 rtn = mvwgetch(self->win,y,x);
665 break;
666 default:
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000667 PyErr_SetString(PyExc_TypeError, "getkey requires 0 or 2 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000668 return NULL;
669 }
670 if (rtn<=255)
671 return Py_BuildValue("c", rtn);
672 else
673 return PyString_FromString((char *)keyname(rtn));
Guido van Rossumf6971e21994-08-30 12:25:20 +0000674}
675
676static PyObject *
677PyCursesWindow_GetStr(self,arg)
678 PyCursesWindowObject *self;
679 PyObject * arg;
680{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000681 int x, y, n;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000682 char rtn[1024]; /* This should be big enough.. I hope */
683 int rtn2;
Guido van Rossum85738471995-02-17 13:50:17 +0000684
685 switch (ARG_COUNT(arg)) {
686 case 0:
Guido van Rossumf6971e21994-08-30 12:25:20 +0000687 rtn2 = wgetstr(self->win,rtn);
Guido van Rossum85738471995-02-17 13:50:17 +0000688 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000689 case 1:
690 if (!PyArg_Parse(arg,"i;n", &n))
691 return NULL;
692 rtn2 = wgetnstr(self->win,rtn,n);
693 break;
Guido van Rossum85738471995-02-17 13:50:17 +0000694 case 2:
695 if (!PyArg_Parse(arg,"(ii);y,x",&y,&x))
696 return NULL;
697 rtn2 = mvwgetstr(self->win,y,x,rtn);
698 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000699 case 3:
700 if (!PyArg_Parse(arg,"(iii);y,x,n", &y, &x, &n))
701 return NULL;
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000702#if defined(__sgi__) || defined(__sun__)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000703 /* Untested */
704 rtn2 = wmove(self->win,y,x)==ERR ? ERR :
705 wgetnstr(self->win, rtn, n);
706#else
707 rtn2 = mvwgetnstr(self->win, y, x, rtn, n);
708#endif
709 break;
Guido van Rossum85738471995-02-17 13:50:17 +0000710 default:
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000711 PyErr_SetString(PyExc_TypeError, "getstr requires 0 to 2 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +0000712 return NULL;
713 }
Guido van Rossumf6971e21994-08-30 12:25:20 +0000714 if (rtn2 == ERR)
715 rtn[0] = 0;
Guido van Rossum85738471995-02-17 13:50:17 +0000716 return PyString_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000717}
718
719static PyObject *
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000720PyCursesWindow_Hline(self, args)
721 PyCursesWindowObject *self;
722 PyObject *args;
723{
724 PyObject *temp;
725 chtype ch;
726 int n, x, y, code = OK;
727 attr_t attr = A_NORMAL;
728
729 switch (ARG_COUNT(args)) {
730 case 2:
731 if (!PyArg_Parse(args, "(Oi);ch or int,n", &temp, &n))
732 return NULL;
733 break;
734 case 3:
735 if (!PyArg_Parse(args, "(Oil);ch or int,n,attr", &temp, &n, &attr))
736 return NULL;
737 break;
738 case 4:
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000739 if (!PyArg_Parse(args, "(iiOi);y,x,ch or int,n", &y, &x, &temp, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000740 return NULL;
741 code = wmove(self->win, y, x);
742 break;
743 case 5:
744 if (!PyArg_Parse(args, "(iiOil); y,x,ch or int,n,attr",
745 &y, &x, &temp, &n, &attr))
746 return NULL;
747 code = wmove(self->win, y, x);
748 default:
749 PyErr_SetString(PyExc_TypeError, "hline requires 2 or 5 arguments");
750 return NULL;
751 }
752
753 if (code != ERR) {
754 if (!PyCurses_ConvertToChtype(temp, &ch)) {
755 PyErr_SetString(PyExc_TypeError,
756 "argument 1 or 3 must be a ch or an int");
757 return NULL;
758 }
759 return PyCursesCheckERR(whline(self->win, ch | attr, n), "hline");
760 } else
761 return PyCursesCheckERR(code, "wmove");
762}
763
764static PyObject *
765PyCursesWindow_InsCh(self,arg)
766 PyCursesWindowObject *self;
767 PyObject * arg;
768{
769 int rtn, x, y, use_xy = FALSE;
770 PyObject *temp;
771 chtype ch = 0;
772 attr_t attr = A_NORMAL;
773
774 switch (ARG_COUNT(arg)) {
775 case 1:
776 if (!PyArg_Parse(arg, "O;ch or int", &temp))
777 return NULL;
778 break;
779 case 2:
780 if (!PyArg_Parse(arg, "(Ol);ch or int,attr", &temp, &attr))
781 return NULL;
782 break;
783 case 3:
784 if (!PyArg_Parse(arg,"(iiO);y,x,ch or int", &y, &x, &temp))
785 return NULL;
786 use_xy = TRUE;
787 break;
788 case 4:
789 if (!PyArg_Parse(arg,"(iiOl);y,x,ch or int, attr", &y, &x, &temp, &attr))
790 return NULL;
791 use_xy = TRUE;
792 break;
793 default:
794 PyErr_SetString(PyExc_TypeError, "insch requires 1 or 4 arguments");
795 return NULL;
796 }
797
798 if (!PyCurses_ConvertToChtype(temp, &ch)) {
799 PyErr_SetString(PyExc_TypeError,
800 "argument 1 or 3 must be a ch or an int");
801 return NULL;
802 }
803
804 if (use_xy == TRUE)
805 rtn = mvwinsch(self->win,y,x, ch | attr);
806 else {
807 rtn = winsch(self->win, ch | attr);
808 }
809 return PyCursesCheckERR(rtn, "insch");
810}
811
812static PyObject *
Guido van Rossumf6971e21994-08-30 12:25:20 +0000813PyCursesWindow_InCh(self,arg)
814 PyCursesWindowObject *self;
815 PyObject * arg;
816{
Guido van Rossum85738471995-02-17 13:50:17 +0000817 int x, y, rtn;
818
819 switch (ARG_COUNT(arg)) {
820 case 0:
Guido van Rossumf6971e21994-08-30 12:25:20 +0000821 rtn = winch(self->win);
Guido van Rossum85738471995-02-17 13:50:17 +0000822 break;
823 case 2:
824 if (!PyArg_Parse(arg,"(ii);y,x",&y,&x))
825 return NULL;
826 rtn = mvwinch(self->win,y,x);
827 break;
828 default:
829 PyErr_SetString(PyExc_TypeError, "inch requires 0 or 2 arguments");
830 return NULL;
831 }
Guido van Rossum85738471995-02-17 13:50:17 +0000832 return PyInt_FromLong((long) rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000833}
834
835static PyObject *
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000836PyCursesWindow_InStr(self,arg)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000837 PyCursesWindowObject *self;
838 PyObject * arg;
839{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000840 int x, y, n;
841 char rtn[1024]; /* This should be big enough.. I hope */
842 int rtn2;
843
844 switch (ARG_COUNT(arg)) {
845 case 0:
846 rtn2 = winstr(self->win,rtn);
847 break;
848 case 1:
849 if (!PyArg_Parse(arg,"i;n", &n))
850 return NULL;
851 rtn2 = winnstr(self->win,rtn,n);
852 break;
853 case 2:
854 if (!PyArg_Parse(arg,"(ii);y,x",&y,&x))
855 return NULL;
856 rtn2 = mvwinstr(self->win,y,x,rtn);
857 break;
858 case 3:
859 if (!PyArg_Parse(arg, "(iii);y,x,n", &y, &x, &n))
860 return NULL;
861 rtn2 = mvwinnstr(self->win, y, x, rtn, n);
862 break;
863 default:
864 PyErr_SetString(PyExc_TypeError, "instr requires 0 or 3 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +0000865 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000866 }
867 if (rtn2 == ERR)
868 rtn[0] = 0;
869 return PyString_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000870}
871
872static PyObject *
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000873PyCursesWindow_InsStr(self,arg)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000874 PyCursesWindowObject *self;
875 PyObject * arg;
876{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000877 int rtn;
878 int x, y;
879 char *str;
880 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
881 int use_xy = FALSE, use_attr = FALSE;
882
883 switch (ARG_COUNT(arg)) {
884 case 1:
885 if (!PyArg_Parse(arg,"s;str", &str))
886 return NULL;
887 break;
888 case 2:
889 if (!PyArg_Parse(arg,"(sl);str,attr", &str, &attr))
890 return NULL;
891 use_attr = TRUE;
892 break;
893 case 3:
894 if (!PyArg_Parse(arg,"(iis);y,x,str", &y, &x, &str))
895 return NULL;
896 use_xy = TRUE;
897 break;
898 case 4:
899 if (!PyArg_Parse(arg,"(iisl);y,x,str,attr", &y, &x, &str, &attr))
900 return NULL;
901 use_xy = use_attr = TRUE;
902 break;
903 default:
904 PyErr_SetString(PyExc_TypeError, "insstr requires 1 to 4 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +0000905 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000906 }
907
908 if (use_attr == TRUE) {
909 attr_old = getattrs(self->win);
910 wattrset(self->win,attr);
911 }
912 if (use_xy == TRUE)
913 rtn = mvwinsstr(self->win,y,x,str);
914 else
915 rtn = winsstr(self->win,str);
916 if (use_attr == TRUE)
917 wattrset(self->win,attr_old);
918 return PyCursesCheckERR(rtn, "insstr");
Guido van Rossumf6971e21994-08-30 12:25:20 +0000919}
920
921static PyObject *
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000922PyCursesWindow_InsNStr(self,arg)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000923 PyCursesWindowObject *self;
924 PyObject * arg;
925{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000926 int rtn, x, y, n;
927 char *str;
928 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
929 int use_xy = FALSE, use_attr = FALSE;
930
931 switch (ARG_COUNT(arg)) {
932 case 2:
933 if (!PyArg_Parse(arg,"(si);str,n", &str, &n))
934 return NULL;
935 break;
936 case 3:
937 if (!PyArg_Parse(arg,"(sil);str,n,attr", &str, &n, &attr))
938 return NULL;
939 use_attr = TRUE;
940 break;
941 case 4:
942 if (!PyArg_Parse(arg,"(iisi);y,x,str,n", &y, &x, &str, &n))
943 return NULL;
944 use_xy = TRUE;
945 break;
946 case 5:
947 if (!PyArg_Parse(arg,"(iisil);y,x,str,n,attr", &y, &x, &str, &n, &attr))
948 return NULL;
949 use_xy = use_attr = TRUE;
950 break;
951 default:
952 PyErr_SetString(PyExc_TypeError, "insnstr requires 2 to 5 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +0000953 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000954 }
955
956 if (use_attr == TRUE) {
957 attr_old = getattrs(self->win);
958 wattrset(self->win,attr);
959 }
960 if (use_xy == TRUE)
961 rtn = mvwinsnstr(self->win,y,x,str,n);
962 else
963 rtn = winsnstr(self->win,str,n);
964 if (use_attr == TRUE)
965 wattrset(self->win,attr_old);
966 return PyCursesCheckERR(rtn, "insnstr");
Guido van Rossumf6971e21994-08-30 12:25:20 +0000967}
968
969static PyObject *
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000970PyCursesWindow_Is_LineTouched(self,arg)
971 PyCursesWindowObject * self;
972 PyObject * arg;
973{
974 int line, erg;
975 if (!PyArg_Parse(arg,"i;line", &line))
976 return NULL;
977 erg = is_linetouched(self->win, line);
978 if (erg == ERR) {
979 PyErr_SetString(PyExc_TypeError,
980 "is_linetouched: line number outside of boundaries");
981 return NULL;
982 } else
983 if (erg == FALSE) {
984 Py_INCREF(Py_False);
985 return Py_False;
986 } else {
987 Py_INCREF(Py_True);
988 return Py_True;
989 }
990}
991
992static PyObject *
993PyCursesWindow_NoOutRefresh(self,arg)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000994 PyCursesWindowObject *self;
995 PyObject * arg;
996{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000997 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
998
999 if (self->win->_flags & _ISPAD) {
1000 switch(ARG_COUNT(arg)) {
1001 case 6:
1002 if (!PyArg_Parse(arg,
1003 "(iiiiii);" \
1004 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1005 &pminrow, &pmincol, &sminrow,
1006 &smincol, &smaxrow, &smaxcol))
1007 return NULL;
1008 return PyCursesCheckERR(pnoutrefresh(self->win,
1009 pminrow, pmincol, sminrow,
1010 smincol, smaxrow, smaxcol),
1011 "pnoutrefresh");
1012 default:
1013 PyErr_SetString(PyCursesError,
1014 "noutrefresh was called for a pad;" \
1015 "requires 6 arguments");
1016 return NULL;
1017 }
1018 } else {
1019 if (!PyArg_NoArgs(arg))
1020 return NULL;
1021 return PyCursesCheckERR(wnoutrefresh(self->win), "wnoutrefresh");
1022 }
1023}
1024
1025static PyObject *
1026PyCursesWindow_PutWin(self, arg)
1027 PyCursesWindowObject *self;
1028 PyObject *arg;
1029{
1030 PyObject *temp;
1031
1032 if (!PyArg_Parse(arg, "O;fileobj", &temp))
Guido van Rossum85738471995-02-17 13:50:17 +00001033 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001034 if (!PyFile_Check(temp)) {
1035 PyErr_SetString(PyExc_TypeError, "argument must be a file object");
1036 return NULL;
1037 }
1038 return PyCursesCheckERR(putwin(self->win, PyFile_AsFile(temp)),
1039 "putwin");
1040}
1041
1042static PyObject *
1043PyCursesWindow_RedrawLine(self,arg)
1044 PyCursesWindowObject *self;
1045 PyObject * arg;
1046{
1047 int beg, num;
1048 if (!PyArg_Parse(arg,"(ii);beg,num", &beg, &num))
1049 return NULL;
1050 return PyCursesCheckERR(wredrawln(self->win,beg,num), "redrawln");
1051}
1052
1053static PyObject *
1054PyCursesWindow_Refresh(self,arg)
1055 PyCursesWindowObject *self;
1056 PyObject * arg;
1057{
1058 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
1059
1060 if (self->win->_flags & _ISPAD) {
1061 switch(ARG_COUNT(arg)) {
1062 case 6:
1063 if (!PyArg_Parse(arg,
1064 "(iiiiii);" \
1065 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1066 &pminrow, &pmincol, &sminrow,
1067 &smincol, &smaxrow, &smaxcol))
1068 return NULL;
1069 return PyCursesCheckERR(prefresh(self->win,
1070 pminrow, pmincol, sminrow,
1071 smincol, smaxrow, smaxcol),
1072 "prefresh");
1073 default:
1074 PyErr_SetString(PyCursesError,
1075 "refresh was called for a pad; requires 6 arguments");
1076 return NULL;
1077 }
1078 } else {
1079 if (!PyArg_NoArgs(arg))
1080 return NULL;
1081 return PyCursesCheckERR(wrefresh(self->win), "wrefresh");
1082 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001083}
1084
1085static PyObject *
1086PyCursesWindow_SetScrollRegion(self,arg)
1087 PyCursesWindowObject *self;
1088 PyObject * arg;
1089{
1090 int x, y;
1091 if (!PyArg_Parse(arg,"(ii);top, bottom",&y,&x))
Guido van Rossum85738471995-02-17 13:50:17 +00001092 return NULL;
1093 return PyCursesCheckERR(wsetscrreg(self->win,y,x), "wsetscrreg");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001094}
1095
1096static PyObject *
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001097PyCursesWindow_SubWin(self,arg)
1098 PyCursesWindowObject *self;
Guido van Rossumf6971e21994-08-30 12:25:20 +00001099 PyObject * arg;
1100{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001101 WINDOW *win;
1102 int nlines, ncols, begin_y, begin_x;
1103
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001104 nlines = 0;
1105 ncols = 0;
1106 switch (ARG_COUNT(arg)) {
1107 case 2:
1108 if (!PyArg_Parse(arg,"(ii);begin_y,begin_x",&begin_y,&begin_x))
1109 return NULL;
1110 break;
1111 case 4:
1112 if (!PyArg_Parse(arg, "(iiii);nlines,ncols,begin_y,begin_x",
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001113 &nlines,&ncols,&begin_y,&begin_x))
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001114 return NULL;
1115 break;
1116 default:
1117 PyErr_SetString(PyExc_TypeError, "subwin requires 2 or 4 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +00001118 return NULL;
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001119 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001120
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001121 printf("Subwin: %i %i %i %i \n", nlines, ncols, begin_y, begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001122 if (self->win->_flags & _ISPAD)
1123 win = subpad(self->win, nlines, ncols, begin_y, begin_x);
1124 else
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001125 win = subwin(self->win, nlines, ncols, begin_y, begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001126
1127 if (win == NULL) {
1128 PyErr_SetString(PyCursesError, catchall_NULL);
1129 return NULL;
1130 }
1131
1132 return (PyObject *)PyCursesWindow_New(win);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001133}
1134
1135static PyObject *
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001136PyCursesWindow_Scroll(self,arg)
1137 PyCursesWindowObject *self;
Guido van Rossumf6971e21994-08-30 12:25:20 +00001138 PyObject * arg;
1139{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001140 int lines;
1141 switch(ARG_COUNT(arg)) {
1142 case 0:
1143 return PyCursesCheckERR(scroll(self->win), "scroll");
1144 break;
1145 case 1:
1146 if (!PyArg_Parse(arg, "i;lines", &lines))
1147 return NULL;
1148 return PyCursesCheckERR(wscrl(self->win, lines), "scroll");
1149 default:
1150 PyErr_SetString(PyExc_TypeError, "scroll requires 0 or 1 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +00001151 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001152 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001153}
1154
1155static PyObject *
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001156PyCursesWindow_TouchLine(self,arg)
1157 PyCursesWindowObject *self;
Guido van Rossumf6971e21994-08-30 12:25:20 +00001158 PyObject * arg;
1159{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001160 int st, cnt, val;
1161 switch (ARG_COUNT(arg)) {
1162 case 2:
1163 if (!PyArg_Parse(arg,"(ii);start,count",&st,&cnt))
1164 return NULL;
1165 return PyCursesCheckERR(touchline(self->win,st,cnt), "touchline");
1166 break;
1167 case 3:
1168 if (!PyArg_Parse(arg, "(iii);start,count,val", &st, &cnt, &val))
1169 return NULL;
1170 return PyCursesCheckERR(wtouchln(self->win, st, cnt, val), "touchline");
1171 default:
1172 PyErr_SetString(PyExc_TypeError, "touchline requires 2 or 3 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +00001173 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001174 }
1175}
1176
1177static PyObject *
1178PyCursesWindow_Vline(self, args)
1179 PyCursesWindowObject *self;
1180 PyObject *args;
1181{
1182 PyObject *temp;
1183 chtype ch;
1184 int n, x, y, code = OK;
1185 attr_t attr = A_NORMAL;
1186
1187 switch (ARG_COUNT(args)) {
1188 case 2:
1189 if (!PyArg_Parse(args, "(Oi);ch or int,n", &temp, &n))
1190 return NULL;
1191 break;
1192 case 3:
1193 if (!PyArg_Parse(args, "(Oil);ch or int,n,attr", &temp, &n, &attr))
1194 return NULL;
1195 break;
1196 case 4:
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001197 if (!PyArg_Parse(args, "(iiOi);y,x,ch or int,n", &y, &x, &temp, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001198 return NULL;
1199 code = wmove(self->win, y, x);
1200 break;
1201 case 5:
1202 if (!PyArg_Parse(args, "(iiOil); y,x,ch or int,n,attr",
1203 &y, &x, &temp, &n, &attr))
1204 return NULL;
1205 code = wmove(self->win, y, x);
1206 default:
1207 PyErr_SetString(PyExc_TypeError, "vline requires 2 or 5 arguments");
1208 return NULL;
1209 }
1210
1211 if (code != ERR) {
1212 if (!PyCurses_ConvertToChtype(temp, &ch)) {
1213 PyErr_SetString(PyExc_TypeError,
1214 "argument 1 or 3 must be a ch or an int");
1215 return NULL;
1216 }
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001217 return PyCursesCheckERR(wvline(self->win, ch | attr, n), "vline");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001218 } else
1219 return PyCursesCheckERR(code, "wmove");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001220}
1221
1222static PyMethodDef PyCursesWindow_Methods[] = {
Sjoerd Mullender14ece161995-03-17 12:18:38 +00001223 {"addch", (PyCFunction)PyCursesWindow_AddCh},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001224 {"addnstr", (PyCFunction)PyCursesWindow_AddNStr},
Sjoerd Mullender14ece161995-03-17 12:18:38 +00001225 {"addstr", (PyCFunction)PyCursesWindow_AddStr},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001226 {"attroff", (PyCFunction)PyCursesWindow_wattroff},
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001227 {"attron", (PyCFunction)PyCursesWindow_wattron},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001228 {"attrset", (PyCFunction)PyCursesWindow_wattrset},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001229 {"bkgd", (PyCFunction)PyCursesWindow_Bkgd},
1230 {"bkgdset", (PyCFunction)PyCursesWindow_BkgdSet},
Sjoerd Mullender14ece161995-03-17 12:18:38 +00001231 {"border", (PyCFunction)PyCursesWindow_Border, METH_VARARGS},
1232 {"box", (PyCFunction)PyCursesWindow_Box},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001233 {"clear", (PyCFunction)PyCursesWindow_wclear},
1234 {"clearok", (PyCFunction)PyCursesWindow_clearok},
1235 {"clrtobot", (PyCFunction)PyCursesWindow_wclrtobot},
1236 {"clrtoeol", (PyCFunction)PyCursesWindow_wclrtoeol},
1237 {"cursyncup", (PyCFunction)PyCursesWindow_wcursyncup},
1238 {"delch", (PyCFunction)PyCursesWindow_DelCh},
1239 {"deleteln", (PyCFunction)PyCursesWindow_wdeleteln},
1240 {"derwin", (PyCFunction)PyCursesWindow_DerWin},
1241 {"echochar", (PyCFunction)PyCursesWindow_EchoChar},
1242 {"erase", (PyCFunction)PyCursesWindow_werase},
1243 {"getbegyx", (PyCFunction)PyCursesWindow_getbegyx},
1244 {"getbkgd", (PyCFunction)PyCursesWindow_GetBkgd},
Sjoerd Mullender14ece161995-03-17 12:18:38 +00001245 {"getch", (PyCFunction)PyCursesWindow_GetCh},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001246 {"getkey", (PyCFunction)PyCursesWindow_GetKey},
1247 {"getmaxyx", (PyCFunction)PyCursesWindow_getmaxyx},
1248 {"getparyx", (PyCFunction)PyCursesWindow_getparyx},
Sjoerd Mullender14ece161995-03-17 12:18:38 +00001249 {"getstr", (PyCFunction)PyCursesWindow_GetStr},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001250 {"getyx", (PyCFunction)PyCursesWindow_getyx},
1251 {"hline", (PyCFunction)PyCursesWindow_Hline},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001252 {"idcok", (PyCFunction)PyCursesWindow_idcok},
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001253 {"idlok", (PyCFunction)PyCursesWindow_idlok},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001254 {"immedok", (PyCFunction)PyCursesWindow_immedok},
Sjoerd Mullender14ece161995-03-17 12:18:38 +00001255 {"inch", (PyCFunction)PyCursesWindow_InCh},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001256 {"insch", (PyCFunction)PyCursesWindow_InsCh},
1257 {"insdelln", (PyCFunction)PyCursesWindow_winsdelln},
1258 {"insertln", (PyCFunction)PyCursesWindow_winsertln},
1259 {"insnstr", (PyCFunction)PyCursesWindow_InsNStr},
1260 {"insstr", (PyCFunction)PyCursesWindow_InsStr},
1261 {"instr", (PyCFunction)PyCursesWindow_InStr},
1262 {"is_linetouched", (PyCFunction)PyCursesWindow_Is_LineTouched},
1263 {"is_wintouched", (PyCFunction)PyCursesWindow_is_wintouched},
1264 {"keypad", (PyCFunction)PyCursesWindow_keypad},
1265 {"leaveok", (PyCFunction)PyCursesWindow_leaveok},
1266 {"move", (PyCFunction)PyCursesWindow_wmove},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001267 {"mvderwin", (PyCFunction)PyCursesWindow_mvderwin},
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001268 {"mvwin", (PyCFunction)PyCursesWindow_mvwin},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001269 {"nodelay", (PyCFunction)PyCursesWindow_nodelay},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001270 {"notimeout", (PyCFunction)PyCursesWindow_notimeout},
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001271 {"noutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001272 {"putwin", (PyCFunction)PyCursesWindow_PutWin},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001273 {"redrawln", (PyCFunction)PyCursesWindow_RedrawLine},
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001274 {"redrawwin", (PyCFunction)PyCursesWindow_redrawwin},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001275 {"refresh", (PyCFunction)PyCursesWindow_Refresh},
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001276#if !defined(__sgi__) && !defined(__sun__)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001277 {"resize", (PyCFunction)PyCursesWindow_wresize},
1278#endif
1279 {"scroll", (PyCFunction)PyCursesWindow_Scroll},
1280 {"scrollok", (PyCFunction)PyCursesWindow_scrollok},
Sjoerd Mullender14ece161995-03-17 12:18:38 +00001281 {"setscrreg", (PyCFunction)PyCursesWindow_SetScrollRegion},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001282 {"standend", (PyCFunction)PyCursesWindow_wstandend},
1283 {"standout", (PyCFunction)PyCursesWindow_wstandout},
1284 {"subpad", (PyCFunction)PyCursesWindow_SubWin},
1285 {"subwin", (PyCFunction)PyCursesWindow_SubWin},
1286 {"syncdown", (PyCFunction)PyCursesWindow_wsyncdown},
1287 {"syncok", (PyCFunction)PyCursesWindow_syncok},
1288 {"syncup", (PyCFunction)PyCursesWindow_wsyncup},
1289 {"touchline", (PyCFunction)PyCursesWindow_TouchLine},
1290 {"touchwin", (PyCFunction)PyCursesWindow_touchwin},
1291 {"untouchwin", (PyCFunction)PyCursesWindow_untouchwin},
1292 {"vline", (PyCFunction)PyCursesWindow_Vline},
Guido van Rossum585c6dc1995-02-24 13:45:43 +00001293 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00001294};
1295
1296static PyObject *
1297PyCursesWindow_GetAttr(self, name)
1298 PyCursesWindowObject *self;
1299 char *name;
1300{
Guido van Rossuma597dde1995-01-10 20:56:29 +00001301 return Py_FindMethod(PyCursesWindow_Methods, (PyObject *)self, name);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001302}
1303
Guido van Rossumf6971e21994-08-30 12:25:20 +00001304/* -------------------------------------------------------*/
Guido van Rossum85738471995-02-17 13:50:17 +00001305
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001306PyTypeObject PyCursesWindow_Type = {
Guido van Rossumf6971e21994-08-30 12:25:20 +00001307 PyObject_HEAD_INIT(&PyType_Type)
1308 0, /*ob_size*/
1309 "curses window", /*tp_name*/
1310 sizeof(PyCursesWindowObject), /*tp_basicsize*/
1311 0, /*tp_itemsize*/
1312 /* methods */
1313 (destructor)PyCursesWindow_Dealloc, /*tp_dealloc*/
1314 0, /*tp_print*/
1315 (getattrfunc)PyCursesWindow_GetAttr, /*tp_getattr*/
1316 (setattrfunc)0, /*tp_setattr*/
1317 0, /*tp_compare*/
1318 0, /*tp_repr*/
1319 0, /*tp_as_number*/
1320 0, /*tp_as_sequence*/
1321 0, /*tp_as_mapping*/
1322 0, /*tp_hash*/
1323};
1324
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001325/*********************************************************************
1326 Global Functions
1327**********************************************************************/
Guido van Rossumf6971e21994-08-30 12:25:20 +00001328
Guido van Rossume4485b01994-09-07 14:32:49 +00001329static PyObject *ModDict;
1330
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001331/* Function Prototype Macros - They are ugly but very, very useful. ;-)
1332
1333 X - function name
1334 TYPE - parameter Type
1335 ERGSTR - format string for construction of the return value
1336 PARSESTR - format string for argument parsing
1337 */
1338
1339#define NoArgNoReturnFunction(X) \
1340static PyObject *PyCurses_ ## X (self, arg) \
1341 PyObject * self; \
1342 PyObject * arg; \
1343{ \
1344 PyCursesInitialised \
1345 if (!PyArg_NoArgs(arg)) return NULL; \
1346 return PyCursesCheckERR(X(), # X); }
1347
1348#define NoArgOrFlagNoReturnFunction(X) \
1349static PyObject *PyCurses_ ## X (self, arg) \
1350 PyObject * self; \
1351 PyObject * arg; \
1352{ \
1353 int flag = 0; \
1354 PyCursesInitialised \
1355 switch(ARG_COUNT(arg)) { \
1356 case 0: \
1357 return PyCursesCheckERR(X(), # X); \
1358 case 1: \
1359 if (!PyArg_Parse(arg, "i;True(1) or False(0)", &flag)) return NULL; \
1360 if (flag) return PyCursesCheckERR(X(), # X); \
1361 else return PyCursesCheckERR(no ## X (), # X); \
1362 default: \
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001363 PyErr_SetString(PyExc_TypeError, # X " requires 0 or 1 arguments"); \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001364 return NULL; } }
1365
1366#define NoArgReturnIntFunction(X) \
1367static PyObject *PyCurses_ ## X (self, arg) \
1368 PyObject * self; \
1369 PyObject * arg; \
1370{ \
1371 PyCursesInitialised \
1372 if (!PyArg_NoArgs(arg)) return NULL; \
1373 return PyInt_FromLong((long) X()); }
1374
1375
1376#define NoArgReturnStringFunction(X) \
1377static PyObject *PyCurses_ ## X (self, arg) \
1378 PyObject * self; \
1379 PyObject * arg; \
1380{ \
1381 PyCursesInitialised \
1382 if (!PyArg_NoArgs(arg)) return NULL; \
1383 return PyString_FromString(X()); }
1384
1385#define NoArgTrueFalseFunction(X) \
1386static PyObject * PyCurses_ ## X (self,arg) \
1387 PyObject * self; \
1388 PyObject * arg; \
1389{ \
1390 PyCursesInitialised \
1391 if (!PyArg_NoArgs(arg)) return NULL; \
1392 if (X () == FALSE) { \
1393 Py_INCREF(Py_False); \
1394 return Py_False; \
1395 } \
1396 Py_INCREF(Py_True); \
1397 return Py_True; }
1398
1399#define NoArgNoReturnVoidFunction(X) \
1400static PyObject * PyCurses_ ## X (self,arg) \
1401 PyObject * self; \
1402 PyObject * arg; \
1403{ \
1404 PyCursesInitialised \
1405 if (!PyArg_NoArgs(arg)) return NULL; \
1406 X(); \
1407 Py_INCREF(Py_None); \
1408 return Py_None; }
1409
1410NoArgNoReturnFunction(beep)
1411NoArgNoReturnFunction(def_prog_mode)
1412NoArgNoReturnFunction(def_shell_mode)
1413NoArgNoReturnFunction(doupdate)
1414NoArgNoReturnFunction(endwin)
1415NoArgNoReturnFunction(flash)
1416NoArgNoReturnFunction(nocbreak)
1417NoArgNoReturnFunction(noecho)
1418NoArgNoReturnFunction(nonl)
1419NoArgNoReturnFunction(noraw)
1420NoArgNoReturnFunction(reset_prog_mode)
1421NoArgNoReturnFunction(reset_shell_mode)
1422NoArgNoReturnFunction(resetty)
1423NoArgNoReturnFunction(savetty)
1424
1425NoArgOrFlagNoReturnFunction(cbreak)
1426NoArgOrFlagNoReturnFunction(echo)
1427NoArgOrFlagNoReturnFunction(nl)
1428NoArgOrFlagNoReturnFunction(raw)
1429
1430NoArgReturnIntFunction(baudrate)
1431NoArgReturnIntFunction(termattrs)
1432
1433NoArgReturnStringFunction(termname)
1434NoArgReturnStringFunction(longname)
1435
1436NoArgTrueFalseFunction(can_change_color)
1437NoArgTrueFalseFunction(has_colors)
1438NoArgTrueFalseFunction(has_ic)
1439NoArgTrueFalseFunction(has_il)
1440NoArgTrueFalseFunction(isendwin)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001441NoArgNoReturnVoidFunction(filter)
1442NoArgNoReturnVoidFunction(flushinp)
1443NoArgNoReturnVoidFunction(noqiflush)
1444
1445static PyObject *
1446PyCurses_Color_Content(self, arg)
1447 PyObject * self;
1448 PyObject * arg;
1449{
1450 short color,r,g,b;
1451
1452 PyCursesInitialised
1453 PyCursesInitialisedColor
1454
1455 if (ARG_COUNT(arg) != 1) {
1456 PyErr_SetString(PyExc_TypeError,
1457 "color_content requires 1 argument");
1458 return NULL;
1459 }
1460
1461 if (!PyArg_Parse(arg, "h;color", &color)) return NULL;
1462
1463 if (color_content(color, &r, &g, &b) != ERR)
1464 return Py_BuildValue("(iii)", r, g, b);
1465 else {
1466 PyErr_SetString(PyCursesError,
1467 "Argument 1 was out of range. Check value of COLORS.");
1468 return NULL;
1469 }
1470}
1471
1472static PyObject *
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001473PyCurses_color_pair(self, arg)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001474 PyObject * self;
1475 PyObject * arg;
1476{
1477 int n;
1478
1479 PyCursesInitialised
1480 PyCursesInitialisedColor
1481
1482 if (ARG_COUNT(arg)!=1) {
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001483 PyErr_SetString(PyExc_TypeError, "color_pair requires 1 argument");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001484 return NULL;
1485 }
1486 if (!PyArg_Parse(arg, "i;number", &n)) return NULL;
1487 return PyInt_FromLong((long) (n << 8));
1488}
1489
1490static PyObject *
1491PyCurses_Curs_Set(self, arg)
1492 PyObject * self;
1493 PyObject * arg;
1494{
1495 int vis,erg;
1496
1497 PyCursesInitialised
1498
1499 if (ARG_COUNT(arg)==1) {
1500 PyErr_SetString(PyExc_TypeError, "curs_set requires 1 argument");
1501 return NULL;
1502 }
1503
1504 if (!PyArg_Parse(arg, "i;int", &vis)) return NULL;
1505
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 *
1513PyCurses_Delay_Output(self,arg)
1514 PyObject * self;
1515 PyObject * arg;
1516{
1517 int ms;
1518
1519 PyCursesInitialised
1520
1521 if (ARG_COUNT(arg)==1) {
1522 PyErr_SetString(PyExc_TypeError, "delay_output requires 1 argument");
1523 return NULL;
1524 }
1525 if (!PyArg_Parse(arg, "i;ms", &ms)) return NULL;
1526
1527 return PyCursesCheckERR(delay_output(ms), "delay_output");
1528}
1529
1530static PyObject *
1531PyCurses_EraseChar(self,arg)
1532 PyObject * self;
1533 PyObject * arg;
1534{
1535 char ch;
1536
1537 PyCursesInitialised
1538
1539 if (!PyArg_NoArgs(arg)) return NULL;
1540
1541 ch = erasechar();
1542
1543 return PyString_FromString(&ch);
1544}
1545
1546static PyObject *
1547PyCurses_getsyx(self, arg)
1548 PyObject * self;
1549 PyObject * arg;
1550{
1551 int x,y;
1552
1553 PyCursesInitialised
1554
1555 if (!PyArg_NoArgs(arg)) return NULL;
1556
1557 getsyx(y, x);
1558
1559 return Py_BuildValue("(ii)", y, x);
1560}
1561
1562static PyObject *
1563PyCurses_GetWin(self,arg)
1564 PyCursesWindowObject *self;
1565 PyObject * arg;
1566{
1567 WINDOW *win;
1568 PyObject *temp;
1569
1570 PyCursesInitialised
1571
1572 if (!PyArg_Parse(arg, "O;fileobj", &temp)) return NULL;
1573
1574 if (!PyFile_Check(temp)) {
1575 PyErr_SetString(PyExc_TypeError, "argument must be a file object");
1576 return NULL;
1577 }
1578
1579 win = getwin(PyFile_AsFile(temp));
1580
1581 if (win == NULL) {
1582 PyErr_SetString(PyCursesError, catchall_NULL);
1583 return NULL;
1584 }
1585
1586 return PyCursesWindow_New(win);
1587}
1588
1589static PyObject *
1590PyCurses_HalfDelay(self,arg)
1591 PyObject * self;
1592 PyObject * arg;
1593{
1594 unsigned char tenths;
1595
1596 PyCursesInitialised
1597
1598 switch(ARG_COUNT(arg)) {
1599 case 1:
1600 if (!PyArg_Parse(arg, "b;tenths", &tenths)) return NULL;
1601 break;
1602 default:
1603 PyErr_SetString(PyExc_TypeError, "halfdelay requires 1 argument");
1604 return NULL;
1605 }
1606
1607 return PyCursesCheckERR(halfdelay(tenths), "halfdelay");
1608}
1609
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001610#if !defined(__sgi__) && !defined(__sun__)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001611 /* No has_key! */
1612static PyObject * PyCurses_has_key(self,arg)
1613 PyObject * self;
1614 PyObject * arg;
1615{
1616 int ch;
1617
1618 PyCursesInitialised
1619
1620 if (!PyArg_Parse(arg,"i",&ch)) return NULL;
1621
1622 if (has_key(ch) == FALSE) {
1623 Py_INCREF(Py_False);
1624 return Py_False;
1625 }
1626 Py_INCREF(Py_True);
1627 return Py_True;
1628}
1629#endif
1630
1631static PyObject *
1632PyCurses_Init_Color(self, arg)
1633 PyObject * self;
1634 PyObject * arg;
1635{
1636 short color, r, g, b;
1637
1638 PyCursesInitialised
1639 PyCursesInitialisedColor
1640
1641 switch(ARG_COUNT(arg)) {
1642 case 4:
1643 if (!PyArg_Parse(arg, "(hhhh);color,r,g,b", &color, &r, &g, &b)) return NULL;
1644 break;
1645 default:
1646 PyErr_SetString(PyExc_TypeError, "init_color requires 4 arguments");
1647 return NULL;
1648 }
1649
1650 return PyCursesCheckERR(init_color(color, r, g, b), "init_color");
1651}
1652
1653static PyObject *
1654PyCurses_Init_Pair(self, arg)
1655 PyObject * self;
1656 PyObject * arg;
1657{
1658 short pair, f, b;
1659
1660 PyCursesInitialised
1661 PyCursesInitialisedColor
1662
1663 if (ARG_COUNT(arg) == 3) {
1664 PyErr_SetString(PyExc_TypeError, "init_pair requires 3 arguments");
1665 return NULL;
1666 }
1667
1668 if (!PyArg_Parse(arg, "(hhh);pair, f, b", &pair, &f, &b)) return NULL;
1669
1670 return PyCursesCheckERR(init_pair(pair, f, b), "init_pair");
1671}
1672
Guido van Rossumf6971e21994-08-30 12:25:20 +00001673static PyObject *
1674PyCurses_InitScr(self, args)
1675 PyObject * self;
1676 PyObject * args;
1677{
Guido van Rossum56bf2351994-08-31 22:06:24 +00001678 WINDOW *win;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001679 PyObject *lines, *cols;
1680
1681 if (!PyArg_NoArgs(args)) return NULL;
1682
Guido van Rossum585c6dc1995-02-24 13:45:43 +00001683 if (initialised == TRUE) {
Guido van Rossumf6971e21994-08-30 12:25:20 +00001684 wrefresh(stdscr);
1685 return (PyObject *)PyCursesWindow_New(stdscr);
1686 }
Guido van Rossum56bf2351994-08-31 22:06:24 +00001687
1688 win = initscr();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001689
Guido van Rossum85738471995-02-17 13:50:17 +00001690 if (win == NULL) {
1691 PyErr_SetString(PyCursesError, catchall_NULL);
1692 return NULL;
1693 }
1694
Guido van Rossum585c6dc1995-02-24 13:45:43 +00001695 initialised = TRUE;
Guido van Rossum56bf2351994-08-31 22:06:24 +00001696
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001697/* This was moved from initcurses() because it core dumped on SGI,
1698 where they're not defined until you've called initscr() */
1699#define SetDictInt(string,ch) \
1700 PyDict_SetItemString(ModDict,string,PyInt_FromLong((long) (ch)));
1701
1702 /* Here are some graphic symbols you can use */
1703 SetDictInt("ACS_ULCORNER", (ACS_ULCORNER));
1704 SetDictInt("ACS_LLCORNER", (ACS_LLCORNER));
1705 SetDictInt("ACS_URCORNER", (ACS_URCORNER));
1706 SetDictInt("ACS_LRCORNER", (ACS_LRCORNER));
1707 SetDictInt("ACS_LTEE", (ACS_LTEE));
1708 SetDictInt("ACS_RTEE", (ACS_RTEE));
1709 SetDictInt("ACS_BTEE", (ACS_BTEE));
1710 SetDictInt("ACS_TTEE", (ACS_TTEE));
1711 SetDictInt("ACS_HLINE", (ACS_HLINE));
1712 SetDictInt("ACS_VLINE", (ACS_VLINE));
1713 SetDictInt("ACS_PLUS", (ACS_PLUS));
1714 SetDictInt("ACS_S1", (ACS_S1));
1715 SetDictInt("ACS_S9", (ACS_S9));
1716 SetDictInt("ACS_DIAMOND", (ACS_DIAMOND));
1717 SetDictInt("ACS_CKBOARD", (ACS_CKBOARD));
1718 SetDictInt("ACS_DEGREE", (ACS_DEGREE));
1719 SetDictInt("ACS_PLMINUS", (ACS_PLMINUS));
1720 SetDictInt("ACS_BULLET", (ACS_BULLET));
1721 SetDictInt("ACS_LARROW", (ACS_LARROW));
1722 SetDictInt("ACS_RARROW", (ACS_RARROW));
1723 SetDictInt("ACS_DARROW", (ACS_DARROW));
1724 SetDictInt("ACS_UARROW", (ACS_UARROW));
1725 SetDictInt("ACS_BOARD", (ACS_BOARD));
1726 SetDictInt("ACS_LANTERN", (ACS_LANTERN));
1727 SetDictInt("ACS_BLOCK", (ACS_BLOCK));
1728 SetDictInt("ACS_BSSB", (ACS_ULCORNER));
1729 SetDictInt("ACS_SSBB", (ACS_LLCORNER));
1730 SetDictInt("ACS_BBSS", (ACS_URCORNER));
1731 SetDictInt("ACS_SBBS", (ACS_LRCORNER));
1732 SetDictInt("ACS_SBSS", (ACS_RTEE));
1733 SetDictInt("ACS_SSSB", (ACS_LTEE));
1734 SetDictInt("ACS_SSBS", (ACS_BTEE));
1735 SetDictInt("ACS_BSSS", (ACS_TTEE));
1736 SetDictInt("ACS_BSBS", (ACS_HLINE));
1737 SetDictInt("ACS_SBSB", (ACS_VLINE));
1738 SetDictInt("ACS_SSSS", (ACS_PLUS));
1739#if !defined(__sgi__) && !defined(__sun__)
1740 /* The following are never available on IRIX 5.3 */
1741 SetDictInt("ACS_S3", (ACS_S3));
1742 SetDictInt("ACS_LEQUAL", (ACS_LEQUAL));
1743 SetDictInt("ACS_GEQUAL", (ACS_GEQUAL));
1744 SetDictInt("ACS_PI", (ACS_PI));
1745 SetDictInt("ACS_NEQUAL", (ACS_NEQUAL));
1746 SetDictInt("ACS_STERLING", (ACS_STERLING));
1747#endif
1748
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001749 lines = PyInt_FromLong((long) LINES);
1750 PyDict_SetItemString(ModDict, "LINES", lines);
1751 Py_DECREF(lines);
1752 cols = PyInt_FromLong((long) COLS);
1753 PyDict_SetItemString(ModDict, "COLS", cols);
1754 Py_DECREF(cols);
Guido van Rossum56bf2351994-08-31 22:06:24 +00001755
1756 return (PyObject *)PyCursesWindow_New(win);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001757}
1758
Guido van Rossumf6971e21994-08-30 12:25:20 +00001759
1760static PyObject *
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001761PyCurses_IntrFlush(self,arg)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001762 PyObject * self;
1763 PyObject * arg;
1764{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001765 int ch;
1766
1767 PyCursesInitialised
1768
1769 switch(ARG_COUNT(arg)) {
1770 case 1:
1771 if (!PyArg_Parse(arg,"i;True(1), False(0)",&ch)) return NULL;
1772 break;
1773 default:
1774 PyErr_SetString(PyExc_TypeError, "intrflush requires 1 argument");
Guido van Rossum85738471995-02-17 13:50:17 +00001775 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001776 }
1777
1778 return PyCursesCheckERR(intrflush(NULL,ch), "intrflush");
1779}
1780
1781static PyObject *
1782PyCurses_KeyName(self,arg)
1783 PyObject * self;
1784 PyObject * arg;
1785{
1786 const char *knp;
1787 int ch;
1788
1789 PyCursesInitialised
1790
1791 if (!PyArg_Parse(arg,"i",&ch)) return NULL;
1792
1793 knp = keyname(ch);
1794
1795 return PyString_FromString((knp == NULL) ? "" : (char *)knp);
1796}
1797
1798static PyObject *
1799PyCurses_KillChar(self,arg)
1800PyObject * self;
1801PyObject * arg;
1802{
1803 char ch;
1804
1805 if (!PyArg_NoArgs(arg)) return NULL;
1806
1807 ch = killchar();
1808
1809 return PyString_FromString(&ch);
1810}
1811
1812static PyObject *
1813PyCurses_Meta(self,arg)
1814 PyObject * self;
1815 PyObject * arg;
1816{
1817 int ch;
1818
1819 PyCursesInitialised
1820
1821 switch(ARG_COUNT(arg)) {
1822 case 1:
1823 if (!PyArg_Parse(arg,"i;True(1), False(0)",&ch)) return NULL;
1824 break;
1825 default:
1826 PyErr_SetString(PyExc_TypeError, "meta requires 1 argument");
1827 return NULL;
1828 }
1829
1830 return PyCursesCheckERR(meta(stdscr, ch), "meta");
1831}
1832
1833static PyObject *
1834PyCurses_NewPad(self,arg)
1835 PyObject * self;
1836 PyObject * arg;
1837{
1838 WINDOW *win;
1839 int nlines, ncols;
1840
1841 PyCursesInitialised
1842
1843 if (!PyArg_Parse(arg,"(ii);nlines,ncols",&nlines,&ncols)) return NULL;
1844
1845 win = newpad(nlines, ncols);
1846
1847 if (win == NULL) {
1848 PyErr_SetString(PyCursesError, catchall_NULL);
1849 return NULL;
1850 }
1851
1852 return (PyObject *)PyCursesWindow_New(win);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001853}
1854
1855static PyObject *
1856PyCurses_NewWindow(self,arg)
1857 PyObject * self;
1858 PyObject * arg;
1859{
1860 WINDOW *win;
1861 int nlines, ncols, begin_y, begin_x;
Guido van Rossum85738471995-02-17 13:50:17 +00001862
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001863 PyCursesInitialised
1864
Guido van Rossum85738471995-02-17 13:50:17 +00001865 switch (ARG_COUNT(arg)) {
1866 case 2:
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001867 if (!PyArg_Parse(arg,"(ii);nlines,ncols",&nlines,&ncols))
Guido van Rossum85738471995-02-17 13:50:17 +00001868 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001869 win = newpad(nlines, ncols);
Guido van Rossum85738471995-02-17 13:50:17 +00001870 break;
1871 case 4:
1872 if (!PyArg_Parse(arg, "(iiii);nlines,ncols,begin_y,begin_x",
Guido van Rossumf6971e21994-08-30 12:25:20 +00001873 &nlines,&ncols,&begin_y,&begin_x))
Guido van Rossum85738471995-02-17 13:50:17 +00001874 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001875 win = newwin(nlines,ncols,begin_y,begin_x);
Guido van Rossum85738471995-02-17 13:50:17 +00001876 break;
1877 default:
1878 PyErr_SetString(PyExc_TypeError, "newwin requires 2 or 4 arguments");
1879 return NULL;
1880 }
1881
Guido van Rossumf6971e21994-08-30 12:25:20 +00001882 if (win == NULL) {
Guido van Rossum85738471995-02-17 13:50:17 +00001883 PyErr_SetString(PyCursesError, catchall_NULL);
1884 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +00001885 }
Guido van Rossum85738471995-02-17 13:50:17 +00001886
Guido van Rossumf6971e21994-08-30 12:25:20 +00001887 return (PyObject *)PyCursesWindow_New(win);
1888}
1889
1890static PyObject *
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001891PyCurses_Pair_Content(self, arg)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001892 PyObject * self;
1893 PyObject * arg;
1894{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001895 short pair,f,b;
1896
1897 PyCursesInitialised
1898 PyCursesInitialisedColor
1899
1900 switch(ARG_COUNT(arg)) {
1901 case 1:
1902 if (!PyArg_Parse(arg, "h;pair", &pair)) return NULL;
1903 break;
1904 default:
1905 PyErr_SetString(PyExc_TypeError, "pair_content requires 1 argument");
Guido van Rossum85738471995-02-17 13:50:17 +00001906 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001907 }
1908
1909 if (!pair_content(pair, &f, &b)) {
1910 PyErr_SetString(PyCursesError,
1911 "Argument 1 was out of range. (1..COLOR_PAIRS-1)");
1912 return NULL;
1913 }
1914
1915 return Py_BuildValue("(ii)", f, b);
1916}
1917
1918static PyObject *
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001919PyCurses_pair_number(self, arg)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001920 PyObject * self;
1921 PyObject * arg;
1922{
1923 int n;
1924
1925 PyCursesInitialised
1926 PyCursesInitialisedColor
1927
1928 switch(ARG_COUNT(arg)) {
1929 case 1:
1930 if (!PyArg_Parse(arg, "i;pairvalue", &n)) return NULL;
1931 break;
1932 default:
1933 PyErr_SetString(PyExc_TypeError,
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001934 "pair_number requires 1 argument");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001935 return NULL;
1936 }
1937
1938 return PyInt_FromLong((long) ((n & A_COLOR) >> 8));
1939}
1940
1941static PyObject *
1942PyCurses_Putp(self,arg)
1943 PyObject *self;
1944 PyObject *arg;
1945{
1946 char *str;
1947
1948 if (!PyArg_Parse(arg,"s;str", &str)) return NULL;
1949 return PyCursesCheckERR(putp(str), "putp");
1950}
1951
1952static PyObject *
1953PyCurses_QiFlush(self, arg)
1954 PyObject * self;
1955 PyObject * arg;
1956{
1957 int flag = 0;
1958
1959 PyCursesInitialised
1960
1961 switch(ARG_COUNT(arg)) {
1962 case 0:
1963 qiflush();
1964 Py_INCREF(Py_None);
1965 return Py_None;
1966 case 1:
1967 if (!PyArg_Parse(arg, "i;True(1) or False(0)", &flag)) return NULL;
1968 if (flag) qiflush();
1969 else noqiflush();
1970 Py_INCREF(Py_None);
1971 return Py_None;
1972 default:
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001973 PyErr_SetString(PyExc_TypeError, "qiflush requires 0 or 1 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001974 return NULL;
1975 }
1976}
1977
1978static PyObject *
1979PyCurses_setsyx(self, arg)
1980 PyObject * self;
1981 PyObject * arg;
1982{
1983 int y,x;
1984
1985 PyCursesInitialised
1986
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001987 if (ARG_COUNT(arg)!=2) {
1988 PyErr_SetString(PyExc_TypeError, "setsyx requires 2 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001989 return NULL;
1990 }
1991
1992 if (!PyArg_Parse(arg, "(ii);y, x", &y, &x)) return NULL;
1993
1994 setsyx(y,x);
1995
Guido van Rossumf6971e21994-08-30 12:25:20 +00001996 Py_INCREF(Py_None);
Guido van Rossum85738471995-02-17 13:50:17 +00001997 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00001998}
1999
2000static PyObject *
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002001PyCurses_Start_Color(self,arg)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002002 PyObject * self;
2003 PyObject * arg;
2004{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002005 int code;
2006 PyObject *c, *cp;
2007
2008 PyCursesInitialised
2009
2010 if (!PyArg_NoArgs(arg)) return NULL;
2011
2012 code = start_color();
2013 if (code != ERR) {
2014 initialisedcolors = TRUE;
2015 c = PyInt_FromLong((long) COLORS);
2016 PyDict_SetItemString(ModDict, "COLORS", c);
2017 Py_DECREF(c);
2018 cp = PyInt_FromLong((long) COLOR_PAIRS);
2019 PyDict_SetItemString(ModDict, "COLOR_PAIRS", cp);
2020 Py_DECREF(cp);
2021 Py_INCREF(Py_None);
2022 return Py_None;
2023 } else {
2024 PyErr_SetString(PyCursesError, "start_color() returned ERR");
Guido van Rossum85738471995-02-17 13:50:17 +00002025 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002026 }
2027}
2028
2029static PyObject *
2030PyCurses_UnCtrl(self,arg)
2031 PyObject * self;
2032 PyObject * arg;
2033{
2034 PyObject *temp;
2035 chtype ch;
2036
2037 PyCursesInitialised
2038
2039 if (!PyArg_Parse(arg,"O;ch or int",&temp)) return NULL;
2040
2041 if (PyInt_Check(temp))
2042 ch = (chtype) PyInt_AsLong(temp);
2043 else if (PyString_Check(temp))
2044 ch = (chtype) *PyString_AsString(temp);
2045 else {
2046 PyErr_SetString(PyExc_TypeError, "argument must be a ch or an int");
2047 return NULL;
2048 }
2049
2050 return PyString_FromString(unctrl(ch));
Guido van Rossumf6971e21994-08-30 12:25:20 +00002051}
2052
2053static PyObject *
2054PyCurses_UngetCh(self,arg)
2055 PyObject * self;
2056 PyObject * arg;
2057{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002058 PyObject *temp;
2059 chtype ch;
2060
2061 PyCursesInitialised
2062
2063 if (!PyArg_Parse(arg,"O;ch or int",&temp)) return NULL;
2064
2065 if (PyInt_Check(temp))
2066 ch = (chtype) PyInt_AsLong(temp);
2067 else if (PyString_Check(temp))
2068 ch = (chtype) *PyString_AsString(temp);
2069 else {
2070 PyErr_SetString(PyExc_TypeError, "argument must be a ch or an int");
Guido van Rossum85738471995-02-17 13:50:17 +00002071 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002072 }
2073
Guido van Rossum85738471995-02-17 13:50:17 +00002074 return PyCursesCheckERR(ungetch(ch), "ungetch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00002075}
2076
2077static PyObject *
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002078PyCurses_Use_Env(self,arg)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002079 PyObject * self;
2080 PyObject * arg;
2081{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002082 int flag;
2083
2084 PyCursesInitialised
2085
2086 switch(ARG_COUNT(arg)) {
2087 case 1:
2088 if (!PyArg_Parse(arg,"i;True(1), False(0)",&flag))
2089 return NULL;
2090 break;
2091 default:
2092 PyErr_SetString(PyExc_TypeError, "use_env requires 1 argument");
Guido van Rossum85738471995-02-17 13:50:17 +00002093 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002094 }
2095 use_env(flag);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002096 Py_INCREF(Py_None);
Guido van Rossum85738471995-02-17 13:50:17 +00002097 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002098}
2099
Guido van Rossumf6971e21994-08-30 12:25:20 +00002100/* List of functions defined in the module */
2101
2102static PyMethodDef PyCurses_methods[] = {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002103 {"baudrate", (PyCFunction)PyCurses_baudrate},
2104 {"beep", (PyCFunction)PyCurses_beep},
2105 {"can_change_color", (PyCFunction)PyCurses_can_change_color},
2106 {"cbreak", (PyCFunction)PyCurses_cbreak},
2107 {"color_content", (PyCFunction)PyCurses_Color_Content},
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002108 {"color_pair", (PyCFunction)PyCurses_color_pair},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002109 {"curs_set", (PyCFunction)PyCurses_Curs_Set},
2110 {"def_prog_mode", (PyCFunction)PyCurses_def_prog_mode},
2111 {"def_shell_mode", (PyCFunction)PyCurses_def_shell_mode},
2112 {"delay_output", (PyCFunction)PyCurses_Delay_Output},
2113 {"doupdate", (PyCFunction)PyCurses_doupdate},
2114 {"echo", (PyCFunction)PyCurses_echo},
2115 {"endwin", (PyCFunction)PyCurses_endwin},
2116 {"erasechar", (PyCFunction)PyCurses_EraseChar},
2117 {"filter", (PyCFunction)PyCurses_filter},
2118 {"flash", (PyCFunction)PyCurses_flash},
2119 {"flushinp", (PyCFunction)PyCurses_flushinp},
2120 {"getsyx", (PyCFunction)PyCurses_getsyx},
2121 {"getwin", (PyCFunction)PyCurses_GetWin},
2122 {"has_colors", (PyCFunction)PyCurses_has_colors},
2123 {"has_ic", (PyCFunction)PyCurses_has_ic},
2124 {"has_il", (PyCFunction)PyCurses_has_il},
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002125#if !defined(__sgi__) && !defined(__sun__)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002126 {"has_key", (PyCFunction)PyCurses_has_key},
Guido van Rossumf6971e21994-08-30 12:25:20 +00002127#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002128 {"halfdelay", (PyCFunction)PyCurses_HalfDelay},
2129 {"init_color", (PyCFunction)PyCurses_Init_Color},
2130 {"init_pair", (PyCFunction)PyCurses_Init_Pair},
2131 {"initscr", (PyCFunction)PyCurses_InitScr},
2132 {"intrflush", (PyCFunction)PyCurses_IntrFlush},
2133 {"isendwin", (PyCFunction)PyCurses_isendwin},
2134 {"keyname", (PyCFunction)PyCurses_KeyName},
2135 {"killchar", (PyCFunction)PyCurses_KillChar},
2136 {"longname", (PyCFunction)PyCurses_longname},
2137 {"meta", (PyCFunction)PyCurses_Meta},
2138 {"newpad", (PyCFunction)PyCurses_NewPad},
2139 {"newwin", (PyCFunction)PyCurses_NewWindow},
2140 {"nl", (PyCFunction)PyCurses_nl},
2141 {"nocbreak", (PyCFunction)PyCurses_nocbreak},
2142 {"noecho", (PyCFunction)PyCurses_noecho},
2143 {"nonl", (PyCFunction)PyCurses_nonl},
2144 {"noqiflush", (PyCFunction)PyCurses_noqiflush},
2145 {"noraw", (PyCFunction)PyCurses_noraw},
2146 {"pair_content", (PyCFunction)PyCurses_Pair_Content},
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002147 {"pair_number", (PyCFunction)PyCurses_pair_number},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002148 {"putp", (PyCFunction)PyCurses_Putp},
2149 {"qiflush", (PyCFunction)PyCurses_QiFlush},
2150 {"raw", (PyCFunction)PyCurses_raw},
2151 {"reset_prog_mode", (PyCFunction)PyCurses_reset_prog_mode},
2152 {"reset_shell_mode", (PyCFunction)PyCurses_reset_shell_mode},
2153 {"setsyx", (PyCFunction)PyCurses_setsyx},
2154 {"start_color", (PyCFunction)PyCurses_Start_Color},
2155 {"termattrs", (PyCFunction)PyCurses_termattrs},
2156 {"termname", (PyCFunction)PyCurses_termname},
2157 {"unctrl", (PyCFunction)PyCurses_UnCtrl},
2158 {"ungetch", (PyCFunction)PyCurses_UngetCh},
2159 {"use_env", (PyCFunction)PyCurses_Use_Env},
2160 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002161};
2162
2163/* Initialization function for the module */
2164
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002165void
Guido van Rossum56bf2351994-08-31 22:06:24 +00002166initcurses()
Guido van Rossumf6971e21994-08-30 12:25:20 +00002167{
Guido van Rossum8fbf82b1995-02-17 13:54:04 +00002168 PyObject *m, *d, *v;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002169
2170 /* Create the module and add the functions */
Guido van Rossum56bf2351994-08-31 22:06:24 +00002171 m = Py_InitModule("curses", PyCurses_methods);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002172
Guido van Rossumf6971e21994-08-30 12:25:20 +00002173 /* Add some symbolic constants to the module */
2174 d = PyModule_GetDict(m);
Guido van Rossume4485b01994-09-07 14:32:49 +00002175 ModDict = d; /* For PyCurses_InitScr */
Guido van Rossumfbea2f31994-08-31 22:05:27 +00002176
Guido van Rossum85738471995-02-17 13:50:17 +00002177 /* For exception curses.error */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002178 PyCursesError = PyString_FromString("curses.error");
Guido van Rossum85738471995-02-17 13:50:17 +00002179 PyDict_SetItemString(d, "error", PyCursesError);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00002180
Guido van Rossum85738471995-02-17 13:50:17 +00002181 /* Make the version available */
Guido van Rossum8fbf82b1995-02-17 13:54:04 +00002182 v = PyString_FromString(PyCursesVersion);
2183 PyDict_SetItemString(d, "version", v);
2184 PyDict_SetItemString(d, "__version__", v);
2185 Py_DECREF(v);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002186
Guido van Rossumf6971e21994-08-30 12:25:20 +00002187 /* Here are some attributes you can add to chars to print */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002188
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002189 SetDictInt("A_ATTRIBUTES", A_ATTRIBUTES);
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002190 SetDictInt("A_NORMAL", A_NORMAL);
2191 SetDictInt("A_STANDOUT", A_STANDOUT);
2192 SetDictInt("A_UNDERLINE", A_UNDERLINE);
2193 SetDictInt("A_REVERSE", A_REVERSE);
2194 SetDictInt("A_BLINK", A_BLINK);
2195 SetDictInt("A_DIM", A_DIM);
2196 SetDictInt("A_BOLD", A_BOLD);
2197 SetDictInt("A_ALTCHARSET", A_ALTCHARSET);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002198 SetDictInt("A_INVIS", A_INVIS);
2199 SetDictInt("A_PROTECT", A_PROTECT);
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002200 SetDictInt("A_CHARTEXT", A_CHARTEXT);
2201 SetDictInt("A_COLOR", A_COLOR);
2202#if !defined(__sgi__) && !defined(__sun__)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002203 SetDictInt("A_HORIZONTAL", A_HORIZONTAL);
2204 SetDictInt("A_LEFT", A_LEFT);
2205 SetDictInt("A_LOW", A_LOW);
2206 SetDictInt("A_RIGHT", A_RIGHT);
2207 SetDictInt("A_TOP", A_TOP);
2208 SetDictInt("A_VERTICAL", A_VERTICAL);
2209#endif
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002210
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002211 SetDictInt("COLOR_BLACK", COLOR_BLACK);
2212 SetDictInt("COLOR_RED", COLOR_RED);
2213 SetDictInt("COLOR_GREEN", COLOR_GREEN);
2214 SetDictInt("COLOR_YELLOW", COLOR_YELLOW);
2215 SetDictInt("COLOR_BLUE", COLOR_BLUE);
2216 SetDictInt("COLOR_MAGENTA", COLOR_MAGENTA);
2217 SetDictInt("COLOR_CYAN", COLOR_CYAN);
2218 SetDictInt("COLOR_WHITE", COLOR_WHITE);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002219
2220 /* Now set everything up for KEY_ variables */
2221 {
2222 int key;
2223 char *key_n;
2224 char *key_n2;
2225 for (key=KEY_MIN;key < KEY_MAX; key++) {
2226 key_n = (char *)keyname(key);
Guido van Rossumf5c6d471995-02-07 15:38:32 +00002227 if (key_n == NULL || strcmp(key_n,"UNKNOWN KEY")==0)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002228 continue;
2229 if (strncmp(key_n,"KEY_F(",6)==0) {
2230 char *p1, *p2;
2231 key_n2 = malloc(strlen(key_n)+1);
2232 p1 = key_n;
2233 p2 = key_n2;
2234 while (*p1) {
2235 if (*p1 != '(' && *p1 != ')') {
2236 *p2 = *p1;
2237 p2++;
2238 }
2239 p1++;
2240 }
2241 *p2 = (char)0;
2242 } else
2243 key_n2 = key_n;
Guido van Rossum85738471995-02-17 13:50:17 +00002244 PyDict_SetItemString(d,key_n2,PyInt_FromLong((long) key));
Guido van Rossumf6971e21994-08-30 12:25:20 +00002245 if (key_n2 != key_n)
2246 free(key_n2);
2247 }
Guido van Rossum85738471995-02-17 13:50:17 +00002248 SetDictInt("KEY_MIN", KEY_MIN);
2249 SetDictInt("KEY_MAX", KEY_MAX);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002250 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002251
2252 /* Check for errors */
2253 if (PyErr_Occurred())
2254 Py_FatalError("can't initialize module curses");
Guido van Rossumf6971e21994-08-30 12:25:20 +00002255}