blob: f31c6ee33bcf6e6970edb56ba87e43dcecaf941b [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
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +000046 mvwgetnstr mvwinchnstr mvwinchstr mvwinnstr 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
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +000058Menu extension (ncurses and probably SYSV):
59 current_item free_item free_menu item_count item_description
60 item_index item_init item_name item_opts item_opts_off
61 item_opts_on item_term item_userptr item_value item_visible
62 menu_back menu_driver menu_fore menu_format menu_grey
63 menu_init menu_items menu_mark menu_opts menu_opts_off
64 menu_opts_on menu_pad menu_pattern menu_request_by_name
65 menu_request_name menu_spacing menu_sub menu_term menu_userptr
66 menu_win new_item new_menu pos_menu_cursor post_menu
67 scale_menu set_current_item set_item_init set_item_opts
68 set_item_term set_item_userptr set_item_value set_menu_back
69 set_menu_fore set_menu_format set_menu_grey set_menu_init
70 set_menu_items set_menu_mark set_menu_opts set_menu_pad
71 set_menu_pattern set_menu_spacing set_menu_sub set_menu_term
72 set_menu_userptr set_menu_win set_top_row top_row unpost_menu
73
74Form extension (ncurses and probably SYSV):
75 current_field data_ahead data_behind dup_field
76 dynamic_fieldinfo field_arg field_back field_buffer
77 field_count field_fore field_index field_info field_init
78 field_just field_opts field_opts_off field_opts_on field_pad
79 field_status field_term field_type field_userptr form_driver
80 form_fields form_init form_opts form_opts_off form_opts_on
81 form_page form_request_by_name form_request_name form_sub
82 form_term form_userptr form_win free_field free_form
83 link_field link_fieldtype move_field new_field new_form
84 new_page pos_form_cursor post_form scale_form
85 set_current_field set_field_back set_field_buffer
86 set_field_fore set_field_init set_field_just set_field_opts
87 set_field_pad set_field_status set_field_term set_field_type
88 set_field_userptr set_fieldtype_arg set_fieldtype_choice
89 set_form_fields set_form_init set_form_opts set_form_page
90 set_form_sub set_form_term set_form_userptr set_form_win
91 set_max_field set_new_page unpost_form
92
93
Andrew M. Kuchlingfb6bbf52000-07-27 11:58:01 +000094 */
95
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +000096/* Release Number */
Guido van Rossumf6971e21994-08-30 12:25:20 +000097
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +000098char *PyCursesVersion = "1.6";
Guido van Rossumf6971e21994-08-30 12:25:20 +000099
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000100/* Includes */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000101
Guido van Rossum602099a1994-09-14 13:32:22 +0000102#include "Python.h"
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000103
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000104#ifdef __osf__
105#define _XOPEN_SOURCE_EXTENDED /* Define macro for OSF/1 */
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +0000106#define STRICT_SYSV_CURSES /* Don't use ncurses extensions */
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000107#endif
108
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000109#ifdef HAVE_NCURSES_H
110#include <ncurses.h>
111#else
112#include <curses.h>
113#endif
114
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +0000115/* These prototypes are in <term.h>, but including this header
116 #defines many common symbols (such as "lines") which breaks the
117 curses module in other ways. So the code will just specify
118 explicit prototypes here. */
119extern int setupterm(char *,int,int *);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +0000120#ifdef sgi
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +0000121extern char *tigetstr(char *);
122#endif
123
124#if defined(sgi) || defined(__sun__)
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +0000125#define STRICT_SYSV_CURSES /* Don't use ncurses extensions */
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000126typedef chtype attr_t; /* No attr_t type is available */
Guido van Rossum1266a011996-02-25 04:50:31 +0000127#endif
Guido van Rossumf6971e21994-08-30 12:25:20 +0000128
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000129/* Definition of exception curses.error */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000130
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000131static PyObject *PyCursesError;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000132
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000133/* general error messages */
Guido van Rossum85738471995-02-17 13:50:17 +0000134static char *catchall_ERR = "curses function returned ERR";
135static char *catchall_NULL = "curses function returned NULL";
136
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +0000137/* Tells whether setupterm() has been called to initialise terminfo. */
138static int initialised_setupterm = FALSE;
139
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000140/* Tells whether initscr() has been called to initialise curses. */
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000141static int initialised = FALSE;
142
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000143/* Tells whether start_color() has been called to initialise colorusage. */
144static int initialisedcolors = FALSE;
145
146/* Utility Macros */
Guido van Rossum85738471995-02-17 13:50:17 +0000147#define ARG_COUNT(X) \
148 (((X) == NULL) ? 0 : (PyTuple_Check(X) ? PyTuple_Size(X) : 1))
Guido van Rossumf6971e21994-08-30 12:25:20 +0000149
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +0000150#define PyCursesSetupTermCalled \
151 if (initialised_setupterm != TRUE) { \
152 PyErr_SetString(PyCursesError, \
153 "must call (at least) setupterm() first"); \
154 return NULL; }
155
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000156#define PyCursesInitialised \
157 if (initialised != TRUE) { \
158 PyErr_SetString(PyCursesError, \
159 "must call initscr() first"); \
160 return NULL; }
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000161
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000162#define PyCursesInitialisedColor \
163 if (initialisedcolors != TRUE) { \
164 PyErr_SetString(PyCursesError, \
165 "must call start_color() first"); \
166 return NULL; }
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000167
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000168/* Utility Functions */
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000169
Guido van Rossum85738471995-02-17 13:50:17 +0000170/*
171 * Check the return code from a curses function and return None
172 * or raise an exception as appropriate.
173 */
174
175static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000176PyCursesCheckERR(int code, char *fname)
Guido van Rossum85738471995-02-17 13:50:17 +0000177{
Guido van Rossum85738471995-02-17 13:50:17 +0000178 if (code != ERR) {
179 Py_INCREF(Py_None);
180 return Py_None;
181 } else {
182 if (fname == NULL) {
183 PyErr_SetString(PyCursesError, catchall_ERR);
184 } else {
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000185 PyErr_Format(PyCursesError, "%s() returned ERR", fname);
Guido van Rossum85738471995-02-17 13:50:17 +0000186 }
187 return NULL;
188 }
189}
190
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000191static int
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000192PyCurses_ConvertToChtype(PyObject *obj, chtype *ch)
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000193{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000194 if (PyInt_Check(obj)) {
195 *ch = (chtype) PyInt_AsLong(obj);
196 } else if(PyString_Check(obj) &
197 (PyString_Size(obj) == 1)) {
198 *ch = (chtype) *PyString_AsString(obj);
199 } else {
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000200 return 0;
201 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000202 return 1;
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000203}
204
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000205/*****************************************************************************
206 The Window Object
207******************************************************************************/
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000208
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000209/* Definition of the window object and window type */
Guido van Rossum85738471995-02-17 13:50:17 +0000210
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000211typedef struct {
212 PyObject_HEAD
213 WINDOW *win;
214} PyCursesWindowObject;
Guido van Rossum85738471995-02-17 13:50:17 +0000215
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000216PyTypeObject PyCursesWindow_Type;
217
218#define PyCursesWindow_Check(v) ((v)->ob_type == &PyCursesWindow_Type)
219
220/* Function Prototype Macros - They are ugly but very, very useful. ;-)
221
222 X - function name
223 TYPE - parameter Type
224 ERGSTR - format string for construction of the return value
225 PARSESTR - format string for argument parsing
226 */
227
228#define Window_NoArgNoReturnFunction(X) \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000229static PyObject *PyCursesWindow_ ## X (PyCursesWindowObject *self, PyObject *args) \
230{ if (!PyArg_NoArgs(args)) return NULL; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000231 return PyCursesCheckERR(X(self->win), # X); }
232
233#define Window_NoArgTrueFalseFunction(X) \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000234static PyObject * PyCursesWindow_ ## X (PyCursesWindowObject *self, PyObject *args) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000235{ \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000236 if (!PyArg_NoArgs(args)) return NULL; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000237 if (X (self->win) == FALSE) { Py_INCREF(Py_False); return Py_False; } \
238 else { Py_INCREF(Py_True); return Py_True; } }
239
240#define Window_NoArgNoReturnVoidFunction(X) \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000241static PyObject * PyCursesWindow_ ## X (PyCursesWindowObject *self, PyObject *args) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000242{ \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000243 if (!PyArg_NoArgs(args)) return NULL; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000244 X(self->win); Py_INCREF(Py_None); return Py_None; }
245
246#define Window_NoArg2TupleReturnFunction(X, TYPE, ERGSTR) \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000247static PyObject * PyCursesWindow_ ## X (PyCursesWindowObject *self, PyObject *args) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000248{ \
249 TYPE arg1, arg2; \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000250 if (!PyArg_NoArgs(args)) return NULL; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000251 X(self->win,arg1,arg2); return Py_BuildValue(ERGSTR, arg1, arg2); }
252
253#define Window_OneArgNoReturnVoidFunction(X, TYPE, PARSESTR) \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000254static PyObject * PyCursesWindow_ ## X (PyCursesWindowObject *self, PyObject *args) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000255{ \
256 TYPE arg1; \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000257 if (!PyArg_Parse(args, PARSESTR, &arg1)) return NULL; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000258 X(self->win,arg1); Py_INCREF(Py_None); return Py_None; }
259
260#define Window_OneArgNoReturnFunction(X, TYPE, PARSESTR) \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000261static PyObject * PyCursesWindow_ ## X (PyCursesWindowObject *self, PyObject *args) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000262{ \
263 TYPE arg1; \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000264 if (!PyArg_Parse(args,PARSESTR, &arg1)) return NULL; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000265 return PyCursesCheckERR(X(self->win, arg1), # X); }
266
267#define Window_TwoArgNoReturnFunction(X, TYPE, PARSESTR) \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000268static PyObject * PyCursesWindow_ ## X (PyCursesWindowObject *self, PyObject *args) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000269{ \
270 TYPE arg1, arg2; \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000271 if (!PyArg_Parse(args,PARSESTR, &arg1, &arg2)) return NULL; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000272 return PyCursesCheckERR(X(self->win, arg1, arg2), # X); }
Guido van Rossum85738471995-02-17 13:50:17 +0000273
Guido van Rossumf6971e21994-08-30 12:25:20 +0000274/* ------------- WINDOW routines --------------- */
Guido van Rossum85738471995-02-17 13:50:17 +0000275
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000276Window_NoArgNoReturnFunction(untouchwin)
277Window_NoArgNoReturnFunction(touchwin)
278Window_NoArgNoReturnFunction(redrawwin)
279Window_NoArgNoReturnFunction(winsertln)
280Window_NoArgNoReturnFunction(werase)
281Window_NoArgNoReturnFunction(wdeleteln)
282
283Window_NoArgTrueFalseFunction(is_wintouched)
284
285Window_NoArgNoReturnVoidFunction(wsyncup)
286Window_NoArgNoReturnVoidFunction(wsyncdown)
287Window_NoArgNoReturnVoidFunction(wstandend)
288Window_NoArgNoReturnVoidFunction(wstandout)
289Window_NoArgNoReturnVoidFunction(wcursyncup)
290Window_NoArgNoReturnVoidFunction(wclrtoeol)
291Window_NoArgNoReturnVoidFunction(wclrtobot)
292Window_NoArgNoReturnVoidFunction(wclear)
293
294Window_OneArgNoReturnVoidFunction(idcok, int, "i;True(1) or False(0)")
295Window_OneArgNoReturnVoidFunction(immedok, int, "i;True(1) or False(0)")
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +0000296Window_OneArgNoReturnVoidFunction(wtimeout, int, "i;delay")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000297
298Window_NoArg2TupleReturnFunction(getyx, int, "(ii)")
299Window_NoArg2TupleReturnFunction(getbegyx, int, "(ii)")
300Window_NoArg2TupleReturnFunction(getmaxyx, int, "(ii)")
301Window_NoArg2TupleReturnFunction(getparyx, int, "(ii)")
302
303Window_OneArgNoReturnFunction(wattron, attr_t, "l;attr")
304Window_OneArgNoReturnFunction(wattroff, attr_t, "l;attr")
305Window_OneArgNoReturnFunction(wattrset, attr_t, "l;attr")
306Window_OneArgNoReturnFunction(clearok, int, "i;True(1) or False(0)")
307Window_OneArgNoReturnFunction(idlok, int, "i;True(1) or False(0)")
308Window_OneArgNoReturnFunction(keypad, int, "i;True(1) or False(0)")
309Window_OneArgNoReturnFunction(leaveok, int, "i;True(1) or False(0)")
310Window_OneArgNoReturnFunction(nodelay, int, "i;True(1) or False(0)")
311Window_OneArgNoReturnFunction(notimeout, int, "i;True(1) or False(0)")
312Window_OneArgNoReturnFunction(scrollok, int, "i;True(1) or False(0)")
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000313Window_OneArgNoReturnFunction(winsdelln, int, "i;nlines")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000314Window_OneArgNoReturnFunction(syncok, int, "i;True(1) or False(0)")
315
316Window_TwoArgNoReturnFunction(mvwin, int, "(ii);y,x")
317Window_TwoArgNoReturnFunction(mvderwin, int, "(ii);y,x")
318Window_TwoArgNoReturnFunction(wmove, int, "(ii);y,x")
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000319#ifndef STRICT_SYSV_CURSES
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000320Window_TwoArgNoReturnFunction(wresize, int, "(ii);lines,columns")
321#endif
322
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000323/* Allocation and deallocation of Window Objects */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000324
Guido van Rossumf6971e21994-08-30 12:25:20 +0000325static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000326PyCursesWindow_New(WINDOW *win)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000327{
328 PyCursesWindowObject *wo;
Guido van Rossum85738471995-02-17 13:50:17 +0000329
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000330 wo = PyObject_NEW(PyCursesWindowObject, &PyCursesWindow_Type);
331 if (wo == NULL) return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000332 wo->win = win;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000333 return (PyObject *)wo;
334}
335
336static void
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000337PyCursesWindow_Dealloc(PyCursesWindowObject *wo)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000338{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000339 if (wo->win != stdscr) delwin(wo->win);
340 PyMem_DEL(wo);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000341}
342
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000343/* Addch, Addstr, Addnstr */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000344
345static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000346PyCursesWindow_AddCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000347{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000348 int rtn, x, y, use_xy = FALSE;
349 PyObject *temp;
350 chtype ch = 0;
351 attr_t attr = A_NORMAL;
352
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000353 switch (ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000354 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000355 if (!PyArg_Parse(args, "O;ch or int", &temp))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000356 return NULL;
357 break;
358 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000359 if (!PyArg_Parse(args, "(Ol);ch or int,attr", &temp, &attr))
Guido van Rossum85738471995-02-17 13:50:17 +0000360 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000361 break;
362 case 3:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000363 if (!PyArg_Parse(args,"(iiO);y,x,ch or int", &y, &x, &temp))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000364 return NULL;
365 use_xy = TRUE;
366 break;
367 case 4:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000368 if (!PyArg_Parse(args,"(iiOl);y,x,ch or int, attr",
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000369 &y, &x, &temp, &attr))
370 return NULL;
371 use_xy = TRUE;
372 break;
373 default:
374 PyErr_SetString(PyExc_TypeError, "addch requires 1 or 4 arguments");
375 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000376 }
Guido van Rossum85738471995-02-17 13:50:17 +0000377
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000378 if (!PyCurses_ConvertToChtype(temp, &ch)) {
379 PyErr_SetString(PyExc_TypeError, "argument 1 or 3 must be a ch or an int");
380 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000381 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000382
Guido van Rossumf6971e21994-08-30 12:25:20 +0000383 if (use_xy == TRUE)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000384 rtn = mvwaddch(self->win,y,x, ch | attr);
385 else {
386 rtn = waddch(self->win, ch | attr);
387 }
388 return PyCursesCheckERR(rtn, "addch");
Guido van Rossumf6971e21994-08-30 12:25:20 +0000389}
390
391static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000392PyCursesWindow_AddStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000393{
394 int rtn;
395 int x, y;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000396 char *str;
397 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
398 int use_xy = FALSE, use_attr = FALSE;
Guido van Rossum85738471995-02-17 13:50:17 +0000399
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000400 switch (ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000401 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000402 if (!PyArg_Parse(args,"s;str", &str))
Guido van Rossum85738471995-02-17 13:50:17 +0000403 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000404 break;
405 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000406 if (!PyArg_Parse(args,"(sl);str,attr", &str, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000407 return NULL;
408 use_attr = TRUE;
409 break;
410 case 3:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000411 if (!PyArg_Parse(args,"(iis);int,int,str", &y, &x, &str))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000412 return NULL;
413 use_xy = TRUE;
414 break;
415 case 4:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000416 if (!PyArg_Parse(args,"(iisl);int,int,str,attr", &y, &x, &str, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000417 return NULL;
418 use_xy = use_attr = TRUE;
419 break;
420 default:
421 PyErr_SetString(PyExc_TypeError, "addstr requires 1 to 4 arguments");
422 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000423 }
Guido van Rossum85738471995-02-17 13:50:17 +0000424
Guido van Rossumf6971e21994-08-30 12:25:20 +0000425 if (use_attr == TRUE) {
426 attr_old = getattrs(self->win);
427 wattrset(self->win,attr);
428 }
429 if (use_xy == TRUE)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000430 rtn = mvwaddstr(self->win,y,x,str);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000431 else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000432 rtn = waddstr(self->win,str);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000433 if (use_attr == TRUE)
434 wattrset(self->win,attr_old);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000435 return PyCursesCheckERR(rtn, "addstr");
436}
Guido van Rossum85738471995-02-17 13:50:17 +0000437
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000438static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000439PyCursesWindow_AddNStr(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000440{
441 int rtn, x, y, n;
442 char *str;
443 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
444 int use_xy = FALSE, use_attr = FALSE;
445
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000446 switch (ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000447 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000448 if (!PyArg_Parse(args,"(si);str,n", &str, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000449 return NULL;
450 break;
451 case 3:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000452 if (!PyArg_Parse(args,"(sil);str,n,attr", &str, &n, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000453 return NULL;
454 use_attr = TRUE;
455 break;
456 case 4:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000457 if (!PyArg_Parse(args,"(iisi);y,x,str,n", &y, &x, &str, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000458 return NULL;
459 use_xy = TRUE;
460 break;
461 case 5:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000462 if (!PyArg_Parse(args,"(iisil);y,x,str,n,attr", &y, &x, &str, &n, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000463 return NULL;
464 use_xy = use_attr = TRUE;
465 break;
466 default:
467 PyErr_SetString(PyExc_TypeError, "addnstr requires 2 to 5 arguments");
468 return NULL;
469 }
470
471 if (use_attr == TRUE) {
472 attr_old = getattrs(self->win);
473 wattrset(self->win,attr);
474 }
475 if (use_xy == TRUE)
476 rtn = mvwaddnstr(self->win,y,x,str,n);
477 else
478 rtn = waddnstr(self->win,str,n);
479 if (use_attr == TRUE)
480 wattrset(self->win,attr_old);
481 return PyCursesCheckERR(rtn, "addnstr");
482}
483
484static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000485PyCursesWindow_Bkgd(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000486{
487 PyObject *temp;
488 chtype bkgd;
489 attr_t attr = A_NORMAL;
490
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000491 switch (ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000492 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000493 if (!PyArg_Parse(args, "O;ch or int", &temp))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000494 return NULL;
495 break;
496 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000497 if (!PyArg_Parse(args,"(Ol);ch or int,attr", &temp, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000498 return NULL;
499 break;
500 default:
501 PyErr_SetString(PyExc_TypeError, "bkgd requires 1 or 2 arguments");
502 return NULL;
503 }
504
505 if (!PyCurses_ConvertToChtype(temp, &bkgd)) {
506 PyErr_SetString(PyExc_TypeError, "argument 1 or 3 must be a ch or an int");
507 return NULL;
508 }
509
510 return PyCursesCheckERR(wbkgd(self->win, bkgd | A_NORMAL), "bkgd");
511}
512
513static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000514PyCursesWindow_BkgdSet(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000515{
516 PyObject *temp;
517 chtype bkgd;
518 attr_t attr = A_NORMAL;
519
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000520 switch (ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000521 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000522 if (!PyArg_Parse(args, "O;ch or int", &temp))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000523 return NULL;
524 break;
525 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000526 if (!PyArg_Parse(args,"(Ol);ch or int,attr", &temp, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000527 return NULL;
528 break;
529 default:
530 PyErr_SetString(PyExc_TypeError, "bkgdset requires 1 or 2 arguments");
531 return NULL;
532 }
533
534 if (!PyCurses_ConvertToChtype(temp, &bkgd)) {
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000535 PyErr_SetString(PyExc_TypeError, "argument 1 must be a ch or an int");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000536 return NULL;
537 }
538
539 wbkgdset(self->win, bkgd | attr);
540 return PyCursesCheckERR(0, "bkgdset");
541}
542
543static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000544PyCursesWindow_Border(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000545{
546 chtype ls, rs, ts, bs, tl, tr, bl, br;
547 ls = rs = ts = bs = tl = tr = bl = br = 0;
548 if (!PyArg_Parse(args,"|llllllll;ls,rs,ts,bs,tl,tr,bl,br",
549 &ls, &rs, &ts, &bs, &tl, &tr, &bl, &br))
550 return NULL;
551 wborder(self->win, ls, rs, ts, bs, tl, tr, bl, br);
552 Py_INCREF(Py_None);
553 return Py_None;
554}
555
556static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000557PyCursesWindow_Box(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000558{
559 chtype ch1=0,ch2=0;
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000560 if (!PyArg_NoArgs(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000561 PyErr_Clear();
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000562 if (!PyArg_Parse(args,"(ll);vertint,horint", &ch1, &ch2))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000563 return NULL;
564 }
565 box(self->win,ch1,ch2);
566 Py_INCREF(Py_None);
567 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000568}
569
570static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000571PyCursesWindow_DelCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000572{
573 int rtn;
574 int x, y;
Guido van Rossum85738471995-02-17 13:50:17 +0000575
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000576 switch (ARG_COUNT(args)) {
Guido van Rossum85738471995-02-17 13:50:17 +0000577 case 0:
Guido van Rossumf6971e21994-08-30 12:25:20 +0000578 rtn = wdelch(self->win);
Guido van Rossum85738471995-02-17 13:50:17 +0000579 break;
580 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000581 if (!PyArg_Parse(args,"(ii);y,x", &y, &x))
Guido van Rossum85738471995-02-17 13:50:17 +0000582 return NULL;
583 rtn = mvwdelch(self->win,y,x);
584 break;
585 default:
586 PyErr_SetString(PyExc_TypeError, "delch requires 0 or 2 arguments");
587 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000588 }
Guido van Rossum85738471995-02-17 13:50:17 +0000589 return PyCursesCheckERR(rtn, "[mv]wdelch");
Guido van Rossumf6971e21994-08-30 12:25:20 +0000590}
591
592static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000593PyCursesWindow_DerWin(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000594{
595 WINDOW *win;
596 int nlines, ncols, begin_y, begin_x;
597
598 nlines = 0;
599 ncols = 0;
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000600 switch (ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000601 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000602 if (!PyArg_Parse(args,"(ii);begin_y,begin_x",&begin_y,&begin_x))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000603 return NULL;
604 break;
605 case 4:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000606 if (!PyArg_Parse(args, "(iiii);nlines,ncols,begin_y,begin_x",
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000607 &nlines,&ncols,&begin_y,&begin_x))
608 return NULL;
609 break;
610 default:
611 PyErr_SetString(PyExc_TypeError, "derwin requires 2 or 4 arguments");
612 return NULL;
613 }
614
615 win = derwin(self->win,nlines,ncols,begin_y,begin_x);
616
617 if (win == NULL) {
618 PyErr_SetString(PyCursesError, catchall_NULL);
619 return NULL;
620 }
621
622 return (PyObject *)PyCursesWindow_New(win);
623}
624
625static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000626PyCursesWindow_EchoChar(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000627{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000628 PyObject *temp;
629 chtype ch;
630 attr_t attr = A_NORMAL;
Guido van Rossum85738471995-02-17 13:50:17 +0000631
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000632 switch (ARG_COUNT(args)) {
Guido van Rossum85738471995-02-17 13:50:17 +0000633 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000634 if (!PyArg_Parse(args,"O;ch or int", &temp))
Guido van Rossum85738471995-02-17 13:50:17 +0000635 return NULL;
Guido van Rossum85738471995-02-17 13:50:17 +0000636 break;
637 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000638 if (!PyArg_Parse(args,"(Ol);ch or int,attr", &temp, &attr))
Guido van Rossum85738471995-02-17 13:50:17 +0000639 return NULL;
Guido van Rossum85738471995-02-17 13:50:17 +0000640 break;
641 default:
642 PyErr_SetString(PyExc_TypeError, "echochar requires 1 or 2 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000643
644
Guido van Rossum85738471995-02-17 13:50:17 +0000645 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000646 }
Guido van Rossum85738471995-02-17 13:50:17 +0000647
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000648 if (!PyCurses_ConvertToChtype(temp, &ch)) {
649 PyErr_SetString(PyExc_TypeError, "argument 1 must be a ch or an int");
Guido van Rossum85738471995-02-17 13:50:17 +0000650 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000651 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000652
653 if (self->win->_flags & _ISPAD)
654 return PyCursesCheckERR(pechochar(self->win, ch | attr),
655 "echochar");
Guido van Rossumf6971e21994-08-30 12:25:20 +0000656 else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000657 return PyCursesCheckERR(wechochar(self->win, ch | attr),
658 "echochar");
Guido van Rossumf6971e21994-08-30 12:25:20 +0000659}
660
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +0000661#ifdef NCURSES_MOUSE_VERSION
662static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000663PyCursesWindow_Enclose(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +0000664{
665 int x, y;
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000666 if (!PyArg_Parse(args,"(ii);y,x", &y, &x))
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +0000667 return NULL;
668
669 return PyInt_FromLong( wenclose(self->win,y,x) );
670}
671#endif
672
Guido van Rossumf6971e21994-08-30 12:25:20 +0000673static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000674PyCursesWindow_GetBkgd(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000675{
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000676 if (!PyArg_NoArgs(args))
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000677 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000678 return PyInt_FromLong((long) getbkgd(self->win));
Guido van Rossumf6971e21994-08-30 12:25:20 +0000679}
680
681static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000682PyCursesWindow_GetCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000683{
684 int x, y;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000685 chtype rtn;
Guido van Rossum85738471995-02-17 13:50:17 +0000686
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000687 switch (ARG_COUNT(args)) {
Guido van Rossum85738471995-02-17 13:50:17 +0000688 case 0:
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000689 Py_BEGIN_ALLOW_THREADS
Guido van Rossumf6971e21994-08-30 12:25:20 +0000690 rtn = wgetch(self->win);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000691 Py_END_ALLOW_THREADS
Guido van Rossum85738471995-02-17 13:50:17 +0000692 break;
693 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000694 if (!PyArg_Parse(args,"(ii);y,x",&y,&x))
Guido van Rossum85738471995-02-17 13:50:17 +0000695 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000696 Py_BEGIN_ALLOW_THREADS
Guido van Rossum85738471995-02-17 13:50:17 +0000697 rtn = mvwgetch(self->win,y,x);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000698 Py_END_ALLOW_THREADS
Guido van Rossum85738471995-02-17 13:50:17 +0000699 break;
700 default:
701 PyErr_SetString(PyExc_TypeError, "getch requires 0 or 2 arguments");
702 return NULL;
703 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000704 return PyInt_FromLong(rtn);
705}
Guido van Rossum85738471995-02-17 13:50:17 +0000706
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000707static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000708PyCursesWindow_GetKey(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000709{
710 int x, y;
711 chtype rtn;
712
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000713 switch (ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000714 case 0:
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000715 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000716 rtn = wgetch(self->win);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000717 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000718 break;
719 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000720 if (!PyArg_Parse(args,"(ii);y,x",&y,&x))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000721 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000722 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000723 rtn = mvwgetch(self->win,y,x);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000724 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000725 break;
726 default:
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000727 PyErr_SetString(PyExc_TypeError, "getkey requires 0 or 2 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000728 return NULL;
729 }
730 if (rtn<=255)
731 return Py_BuildValue("c", rtn);
732 else
733 return PyString_FromString((char *)keyname(rtn));
Guido van Rossumf6971e21994-08-30 12:25:20 +0000734}
735
736static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000737PyCursesWindow_GetStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000738{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000739 int x, y, n;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000740 char rtn[1024]; /* This should be big enough.. I hope */
741 int rtn2;
Guido van Rossum85738471995-02-17 13:50:17 +0000742
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000743 switch (ARG_COUNT(args)) {
Guido van Rossum85738471995-02-17 13:50:17 +0000744 case 0:
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000745 Py_BEGIN_ALLOW_THREADS
Guido van Rossumf6971e21994-08-30 12:25:20 +0000746 rtn2 = wgetstr(self->win,rtn);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000747 Py_END_ALLOW_THREADS
Guido van Rossum85738471995-02-17 13:50:17 +0000748 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000749 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000750 if (!PyArg_Parse(args,"i;n", &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000751 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000752 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000753 rtn2 = wgetnstr(self->win,rtn,n);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000754 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000755 break;
Guido van Rossum85738471995-02-17 13:50:17 +0000756 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000757 if (!PyArg_Parse(args,"(ii);y,x",&y,&x))
Guido van Rossum85738471995-02-17 13:50:17 +0000758 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000759 Py_BEGIN_ALLOW_THREADS
Guido van Rossum85738471995-02-17 13:50:17 +0000760 rtn2 = mvwgetstr(self->win,y,x,rtn);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000761 Py_END_ALLOW_THREADS
Guido van Rossum85738471995-02-17 13:50:17 +0000762 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000763 case 3:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000764 if (!PyArg_Parse(args,"(iii);y,x,n", &y, &x, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000765 return NULL;
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000766#ifdef STRICT_SYSV_CURSES
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000767 /* Untested */
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000768 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000769 rtn2 = wmove(self->win,y,x)==ERR ? ERR :
770 wgetnstr(self->win, rtn, n);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000771 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000772#else
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000773 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000774 rtn2 = mvwgetnstr(self->win, y, x, rtn, n);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000775 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000776#endif
777 break;
Guido van Rossum85738471995-02-17 13:50:17 +0000778 default:
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000779 PyErr_SetString(PyExc_TypeError, "getstr requires 0 to 2 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +0000780 return NULL;
781 }
Guido van Rossumf6971e21994-08-30 12:25:20 +0000782 if (rtn2 == ERR)
783 rtn[0] = 0;
Guido van Rossum85738471995-02-17 13:50:17 +0000784 return PyString_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000785}
786
787static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000788PyCursesWindow_Hline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000789{
790 PyObject *temp;
791 chtype ch;
792 int n, x, y, code = OK;
793 attr_t attr = A_NORMAL;
794
795 switch (ARG_COUNT(args)) {
796 case 2:
797 if (!PyArg_Parse(args, "(Oi);ch or int,n", &temp, &n))
798 return NULL;
799 break;
800 case 3:
801 if (!PyArg_Parse(args, "(Oil);ch or int,n,attr", &temp, &n, &attr))
802 return NULL;
803 break;
804 case 4:
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000805 if (!PyArg_Parse(args, "(iiOi);y,x,ch or int,n", &y, &x, &temp, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000806 return NULL;
807 code = wmove(self->win, y, x);
808 break;
809 case 5:
810 if (!PyArg_Parse(args, "(iiOil); y,x,ch or int,n,attr",
811 &y, &x, &temp, &n, &attr))
812 return NULL;
813 code = wmove(self->win, y, x);
814 default:
815 PyErr_SetString(PyExc_TypeError, "hline requires 2 or 5 arguments");
816 return NULL;
817 }
818
819 if (code != ERR) {
820 if (!PyCurses_ConvertToChtype(temp, &ch)) {
821 PyErr_SetString(PyExc_TypeError,
822 "argument 1 or 3 must be a ch or an int");
823 return NULL;
824 }
825 return PyCursesCheckERR(whline(self->win, ch | attr, n), "hline");
826 } else
827 return PyCursesCheckERR(code, "wmove");
828}
829
830static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000831PyCursesWindow_InsCh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000832{
833 int rtn, x, y, use_xy = FALSE;
834 PyObject *temp;
835 chtype ch = 0;
836 attr_t attr = A_NORMAL;
837
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000838 switch (ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000839 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000840 if (!PyArg_Parse(args, "O;ch or int", &temp))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000841 return NULL;
842 break;
843 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000844 if (!PyArg_Parse(args, "(Ol);ch or int,attr", &temp, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000845 return NULL;
846 break;
847 case 3:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000848 if (!PyArg_Parse(args,"(iiO);y,x,ch or int", &y, &x, &temp))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000849 return NULL;
850 use_xy = TRUE;
851 break;
852 case 4:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000853 if (!PyArg_Parse(args,"(iiOl);y,x,ch or int, attr", &y, &x, &temp, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000854 return NULL;
855 use_xy = TRUE;
856 break;
857 default:
858 PyErr_SetString(PyExc_TypeError, "insch requires 1 or 4 arguments");
859 return NULL;
860 }
861
862 if (!PyCurses_ConvertToChtype(temp, &ch)) {
863 PyErr_SetString(PyExc_TypeError,
864 "argument 1 or 3 must be a ch or an int");
865 return NULL;
866 }
867
868 if (use_xy == TRUE)
869 rtn = mvwinsch(self->win,y,x, ch | attr);
870 else {
871 rtn = winsch(self->win, ch | attr);
872 }
873 return PyCursesCheckERR(rtn, "insch");
874}
875
876static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000877PyCursesWindow_InCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000878{
Guido van Rossum85738471995-02-17 13:50:17 +0000879 int x, y, rtn;
880
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000881 switch (ARG_COUNT(args)) {
Guido van Rossum85738471995-02-17 13:50:17 +0000882 case 0:
Guido van Rossumf6971e21994-08-30 12:25:20 +0000883 rtn = winch(self->win);
Guido van Rossum85738471995-02-17 13:50:17 +0000884 break;
885 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000886 if (!PyArg_Parse(args,"(ii);y,x",&y,&x))
Guido van Rossum85738471995-02-17 13:50:17 +0000887 return NULL;
888 rtn = mvwinch(self->win,y,x);
889 break;
890 default:
891 PyErr_SetString(PyExc_TypeError, "inch requires 0 or 2 arguments");
892 return NULL;
893 }
Guido van Rossum85738471995-02-17 13:50:17 +0000894 return PyInt_FromLong((long) rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000895}
896
897static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000898PyCursesWindow_InStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000899{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000900 int x, y, n;
901 char rtn[1024]; /* This should be big enough.. I hope */
902 int rtn2;
903
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000904 switch (ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000905 case 0:
906 rtn2 = winstr(self->win,rtn);
907 break;
908 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000909 if (!PyArg_Parse(args,"i;n", &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000910 return NULL;
911 rtn2 = winnstr(self->win,rtn,n);
912 break;
913 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000914 if (!PyArg_Parse(args,"(ii);y,x",&y,&x))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000915 return NULL;
916 rtn2 = mvwinstr(self->win,y,x,rtn);
917 break;
918 case 3:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000919 if (!PyArg_Parse(args, "(iii);y,x,n", &y, &x, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000920 return NULL;
921 rtn2 = mvwinnstr(self->win, y, x, rtn, n);
922 break;
923 default:
924 PyErr_SetString(PyExc_TypeError, "instr requires 0 or 3 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +0000925 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000926 }
927 if (rtn2 == ERR)
928 rtn[0] = 0;
929 return PyString_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000930}
931
932static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000933PyCursesWindow_InsStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000934{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000935 int rtn;
936 int x, y;
937 char *str;
938 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
939 int use_xy = FALSE, use_attr = FALSE;
940
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000941 switch (ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000942 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000943 if (!PyArg_Parse(args,"s;str", &str))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000944 return NULL;
945 break;
946 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000947 if (!PyArg_Parse(args,"(sl);str,attr", &str, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000948 return NULL;
949 use_attr = TRUE;
950 break;
951 case 3:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000952 if (!PyArg_Parse(args,"(iis);y,x,str", &y, &x, &str))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000953 return NULL;
954 use_xy = TRUE;
955 break;
956 case 4:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000957 if (!PyArg_Parse(args,"(iisl);y,x,str,attr", &y, &x, &str, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000958 return NULL;
959 use_xy = use_attr = TRUE;
960 break;
961 default:
962 PyErr_SetString(PyExc_TypeError, "insstr requires 1 to 4 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +0000963 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000964 }
965
966 if (use_attr == TRUE) {
967 attr_old = getattrs(self->win);
968 wattrset(self->win,attr);
969 }
970 if (use_xy == TRUE)
971 rtn = mvwinsstr(self->win,y,x,str);
972 else
973 rtn = winsstr(self->win,str);
974 if (use_attr == TRUE)
975 wattrset(self->win,attr_old);
976 return PyCursesCheckERR(rtn, "insstr");
Guido van Rossumf6971e21994-08-30 12:25:20 +0000977}
978
979static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000980PyCursesWindow_InsNStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000981{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000982 int rtn, x, y, n;
983 char *str;
984 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
985 int use_xy = FALSE, use_attr = FALSE;
986
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000987 switch (ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000988 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000989 if (!PyArg_Parse(args,"(si);str,n", &str, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000990 return NULL;
991 break;
992 case 3:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000993 if (!PyArg_Parse(args,"(sil);str,n,attr", &str, &n, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000994 return NULL;
995 use_attr = TRUE;
996 break;
997 case 4:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000998 if (!PyArg_Parse(args,"(iisi);y,x,str,n", &y, &x, &str, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000999 return NULL;
1000 use_xy = TRUE;
1001 break;
1002 case 5:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001003 if (!PyArg_Parse(args,"(iisil);y,x,str,n,attr", &y, &x, &str, &n, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001004 return NULL;
1005 use_xy = use_attr = TRUE;
1006 break;
1007 default:
1008 PyErr_SetString(PyExc_TypeError, "insnstr requires 2 to 5 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +00001009 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001010 }
1011
1012 if (use_attr == TRUE) {
1013 attr_old = getattrs(self->win);
1014 wattrset(self->win,attr);
1015 }
1016 if (use_xy == TRUE)
1017 rtn = mvwinsnstr(self->win,y,x,str,n);
1018 else
1019 rtn = winsnstr(self->win,str,n);
1020 if (use_attr == TRUE)
1021 wattrset(self->win,attr_old);
1022 return PyCursesCheckERR(rtn, "insnstr");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001023}
1024
1025static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001026PyCursesWindow_Is_LineTouched(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001027{
1028 int line, erg;
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001029 if (!PyArg_Parse(args,"i;line", &line))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001030 return NULL;
1031 erg = is_linetouched(self->win, line);
1032 if (erg == ERR) {
1033 PyErr_SetString(PyExc_TypeError,
1034 "is_linetouched: line number outside of boundaries");
1035 return NULL;
1036 } else
1037 if (erg == FALSE) {
1038 Py_INCREF(Py_False);
1039 return Py_False;
1040 } else {
1041 Py_INCREF(Py_True);
1042 return Py_True;
1043 }
1044}
1045
1046static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001047PyCursesWindow_NoOutRefresh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001048{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001049 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001050 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001051
1052 if (self->win->_flags & _ISPAD) {
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001053 switch(ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001054 case 6:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001055 if (!PyArg_Parse(args,
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001056 "(iiiiii);" \
1057 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1058 &pminrow, &pmincol, &sminrow,
1059 &smincol, &smaxrow, &smaxcol))
1060 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001061 Py_BEGIN_ALLOW_THREADS
1062 rtn = pnoutrefresh(self->win,
1063 pminrow, pmincol, sminrow,
Andrew M. Kuchlingb6e46872000-06-27 15:01:10 +00001064 smincol, smaxrow, smaxcol);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001065 Py_END_ALLOW_THREADS
1066 return PyCursesCheckERR(rtn, "pnoutrefresh");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001067 default:
1068 PyErr_SetString(PyCursesError,
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001069 "noutrefresh() called for a pad "
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001070 "requires 6 arguments");
1071 return NULL;
1072 }
1073 } else {
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001074 if (!PyArg_NoArgs(args))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001075 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001076
1077 Py_BEGIN_ALLOW_THREADS
1078 rtn = wnoutrefresh(self->win);
1079 Py_END_ALLOW_THREADS
1080 return PyCursesCheckERR(rtn, "wnoutrefresh");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001081 }
1082}
1083
1084static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001085PyCursesWindow_PutWin(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001086{
1087 PyObject *temp;
1088
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001089 if (!PyArg_Parse(args, "O;fileobj", &temp))
Guido van Rossum85738471995-02-17 13:50:17 +00001090 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001091 if (!PyFile_Check(temp)) {
1092 PyErr_SetString(PyExc_TypeError, "argument must be a file object");
1093 return NULL;
1094 }
1095 return PyCursesCheckERR(putwin(self->win, PyFile_AsFile(temp)),
1096 "putwin");
1097}
1098
1099static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001100PyCursesWindow_RedrawLine(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001101{
1102 int beg, num;
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001103 if (!PyArg_Parse(args,"(ii);beg,num", &beg, &num))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001104 return NULL;
1105 return PyCursesCheckERR(wredrawln(self->win,beg,num), "redrawln");
1106}
1107
1108static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001109PyCursesWindow_Refresh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001110{
1111 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001112 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001113
1114 if (self->win->_flags & _ISPAD) {
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001115 switch(ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001116 case 6:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001117 if (!PyArg_Parse(args,
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001118 "(iiiiii);" \
1119 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1120 &pminrow, &pmincol, &sminrow,
1121 &smincol, &smaxrow, &smaxcol))
1122 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001123
1124 Py_BEGIN_ALLOW_THREADS
1125 rtn = prefresh(self->win,
1126 pminrow, pmincol, sminrow,
Andrew M. Kuchlingb6e46872000-06-27 15:01:10 +00001127 smincol, smaxrow, smaxcol);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001128 Py_END_ALLOW_THREADS
1129 return PyCursesCheckERR(rtn, "prefresh");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001130 default:
1131 PyErr_SetString(PyCursesError,
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001132 "refresh() for a pad requires 6 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001133 return NULL;
1134 }
1135 } else {
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001136 if (!PyArg_NoArgs(args))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001137 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001138 Py_BEGIN_ALLOW_THREADS
1139 rtn = wrefresh(self->win);
1140 Py_END_ALLOW_THREADS
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001141 return PyCursesCheckERR(rtn, "prefresh");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001142 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001143}
1144
1145static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001146PyCursesWindow_SetScrollRegion(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001147{
1148 int x, y;
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001149 if (!PyArg_Parse(args,"(ii);top, bottom",&y,&x))
Guido van Rossum85738471995-02-17 13:50:17 +00001150 return NULL;
1151 return PyCursesCheckERR(wsetscrreg(self->win,y,x), "wsetscrreg");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001152}
1153
1154static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001155PyCursesWindow_SubWin(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001156{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001157 WINDOW *win;
1158 int nlines, ncols, begin_y, begin_x;
1159
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001160 nlines = 0;
1161 ncols = 0;
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001162 switch (ARG_COUNT(args)) {
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001163 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001164 if (!PyArg_Parse(args,"(ii);begin_y,begin_x",&begin_y,&begin_x))
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001165 return NULL;
1166 break;
1167 case 4:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001168 if (!PyArg_Parse(args, "(iiii);nlines,ncols,begin_y,begin_x",
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001169 &nlines,&ncols,&begin_y,&begin_x))
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001170 return NULL;
1171 break;
1172 default:
1173 PyErr_SetString(PyExc_TypeError, "subwin requires 2 or 4 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +00001174 return NULL;
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001175 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001176
Andrew M. Kuchling8353f622000-07-26 18:36:27 +00001177 /* printf("Subwin: %i %i %i %i \n", nlines, ncols, begin_y, begin_x); */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001178 if (self->win->_flags & _ISPAD)
1179 win = subpad(self->win, nlines, ncols, begin_y, begin_x);
1180 else
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001181 win = subwin(self->win, nlines, ncols, begin_y, begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001182
1183 if (win == NULL) {
1184 PyErr_SetString(PyCursesError, catchall_NULL);
1185 return NULL;
1186 }
1187
1188 return (PyObject *)PyCursesWindow_New(win);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001189}
1190
1191static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001192PyCursesWindow_Scroll(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001193{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001194 int lines;
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001195 switch(ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001196 case 0:
1197 return PyCursesCheckERR(scroll(self->win), "scroll");
1198 break;
1199 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001200 if (!PyArg_Parse(args, "i;lines", &lines))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001201 return NULL;
1202 return PyCursesCheckERR(wscrl(self->win, lines), "scroll");
1203 default:
1204 PyErr_SetString(PyExc_TypeError, "scroll requires 0 or 1 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +00001205 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001206 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001207}
1208
1209static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001210PyCursesWindow_TouchLine(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001211{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001212 int st, cnt, val;
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001213 switch (ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001214 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001215 if (!PyArg_Parse(args,"(ii);start,count",&st,&cnt))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001216 return NULL;
1217 return PyCursesCheckERR(touchline(self->win,st,cnt), "touchline");
1218 break;
1219 case 3:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001220 if (!PyArg_Parse(args, "(iii);start,count,val", &st, &cnt, &val))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001221 return NULL;
1222 return PyCursesCheckERR(wtouchln(self->win, st, cnt, val), "touchline");
1223 default:
1224 PyErr_SetString(PyExc_TypeError, "touchline requires 2 or 3 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +00001225 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001226 }
1227}
1228
1229static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001230PyCursesWindow_Vline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001231{
1232 PyObject *temp;
1233 chtype ch;
1234 int n, x, y, code = OK;
1235 attr_t attr = A_NORMAL;
1236
1237 switch (ARG_COUNT(args)) {
1238 case 2:
1239 if (!PyArg_Parse(args, "(Oi);ch or int,n", &temp, &n))
1240 return NULL;
1241 break;
1242 case 3:
1243 if (!PyArg_Parse(args, "(Oil);ch or int,n,attr", &temp, &n, &attr))
1244 return NULL;
1245 break;
1246 case 4:
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001247 if (!PyArg_Parse(args, "(iiOi);y,x,ch or int,n", &y, &x, &temp, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001248 return NULL;
1249 code = wmove(self->win, y, x);
1250 break;
1251 case 5:
1252 if (!PyArg_Parse(args, "(iiOil); y,x,ch or int,n,attr",
1253 &y, &x, &temp, &n, &attr))
1254 return NULL;
1255 code = wmove(self->win, y, x);
1256 default:
1257 PyErr_SetString(PyExc_TypeError, "vline requires 2 or 5 arguments");
1258 return NULL;
1259 }
1260
1261 if (code != ERR) {
1262 if (!PyCurses_ConvertToChtype(temp, &ch)) {
1263 PyErr_SetString(PyExc_TypeError,
1264 "argument 1 or 3 must be a ch or an int");
1265 return NULL;
1266 }
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001267 return PyCursesCheckERR(wvline(self->win, ch | attr, n), "vline");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001268 } else
1269 return PyCursesCheckERR(code, "wmove");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001270}
1271
1272static PyMethodDef PyCursesWindow_Methods[] = {
Sjoerd Mullender14ece161995-03-17 12:18:38 +00001273 {"addch", (PyCFunction)PyCursesWindow_AddCh},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001274 {"addnstr", (PyCFunction)PyCursesWindow_AddNStr},
Sjoerd Mullender14ece161995-03-17 12:18:38 +00001275 {"addstr", (PyCFunction)PyCursesWindow_AddStr},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001276 {"attroff", (PyCFunction)PyCursesWindow_wattroff},
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001277 {"attron", (PyCFunction)PyCursesWindow_wattron},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001278 {"attrset", (PyCFunction)PyCursesWindow_wattrset},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001279 {"bkgd", (PyCFunction)PyCursesWindow_Bkgd},
1280 {"bkgdset", (PyCFunction)PyCursesWindow_BkgdSet},
Sjoerd Mullender14ece161995-03-17 12:18:38 +00001281 {"border", (PyCFunction)PyCursesWindow_Border, METH_VARARGS},
1282 {"box", (PyCFunction)PyCursesWindow_Box},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001283 {"clear", (PyCFunction)PyCursesWindow_wclear},
1284 {"clearok", (PyCFunction)PyCursesWindow_clearok},
1285 {"clrtobot", (PyCFunction)PyCursesWindow_wclrtobot},
1286 {"clrtoeol", (PyCFunction)PyCursesWindow_wclrtoeol},
1287 {"cursyncup", (PyCFunction)PyCursesWindow_wcursyncup},
1288 {"delch", (PyCFunction)PyCursesWindow_DelCh},
1289 {"deleteln", (PyCFunction)PyCursesWindow_wdeleteln},
1290 {"derwin", (PyCFunction)PyCursesWindow_DerWin},
1291 {"echochar", (PyCFunction)PyCursesWindow_EchoChar},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001292#ifdef NCURSES_MOUSE_VERSION
1293 {"enclose", (PyCFunction)PyCursesWindow_Enclose},
1294#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001295 {"erase", (PyCFunction)PyCursesWindow_werase},
1296 {"getbegyx", (PyCFunction)PyCursesWindow_getbegyx},
1297 {"getbkgd", (PyCFunction)PyCursesWindow_GetBkgd},
Sjoerd Mullender14ece161995-03-17 12:18:38 +00001298 {"getch", (PyCFunction)PyCursesWindow_GetCh},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001299 {"getkey", (PyCFunction)PyCursesWindow_GetKey},
1300 {"getmaxyx", (PyCFunction)PyCursesWindow_getmaxyx},
1301 {"getparyx", (PyCFunction)PyCursesWindow_getparyx},
Sjoerd Mullender14ece161995-03-17 12:18:38 +00001302 {"getstr", (PyCFunction)PyCursesWindow_GetStr},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001303 {"getyx", (PyCFunction)PyCursesWindow_getyx},
1304 {"hline", (PyCFunction)PyCursesWindow_Hline},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001305 {"idcok", (PyCFunction)PyCursesWindow_idcok},
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001306 {"idlok", (PyCFunction)PyCursesWindow_idlok},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001307 {"immedok", (PyCFunction)PyCursesWindow_immedok},
Sjoerd Mullender14ece161995-03-17 12:18:38 +00001308 {"inch", (PyCFunction)PyCursesWindow_InCh},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001309 {"insch", (PyCFunction)PyCursesWindow_InsCh},
1310 {"insdelln", (PyCFunction)PyCursesWindow_winsdelln},
1311 {"insertln", (PyCFunction)PyCursesWindow_winsertln},
1312 {"insnstr", (PyCFunction)PyCursesWindow_InsNStr},
1313 {"insstr", (PyCFunction)PyCursesWindow_InsStr},
1314 {"instr", (PyCFunction)PyCursesWindow_InStr},
1315 {"is_linetouched", (PyCFunction)PyCursesWindow_Is_LineTouched},
1316 {"is_wintouched", (PyCFunction)PyCursesWindow_is_wintouched},
1317 {"keypad", (PyCFunction)PyCursesWindow_keypad},
1318 {"leaveok", (PyCFunction)PyCursesWindow_leaveok},
1319 {"move", (PyCFunction)PyCursesWindow_wmove},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001320 {"mvderwin", (PyCFunction)PyCursesWindow_mvderwin},
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001321 {"mvwin", (PyCFunction)PyCursesWindow_mvwin},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001322 {"nodelay", (PyCFunction)PyCursesWindow_nodelay},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001323 {"notimeout", (PyCFunction)PyCursesWindow_notimeout},
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001324 {"noutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh},
Andrew M. Kuchlinga98e92b2000-08-20 23:37:02 +00001325 /* Backward compatibility alias -- remove in Python 2.1 */
1326 {"nooutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001327 {"putwin", (PyCFunction)PyCursesWindow_PutWin},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001328 {"redrawln", (PyCFunction)PyCursesWindow_RedrawLine},
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001329 {"redrawwin", (PyCFunction)PyCursesWindow_redrawwin},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001330 {"refresh", (PyCFunction)PyCursesWindow_Refresh},
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00001331#ifndef STRICT_SYSV_CURSES
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001332 {"resize", (PyCFunction)PyCursesWindow_wresize},
1333#endif
1334 {"scroll", (PyCFunction)PyCursesWindow_Scroll},
1335 {"scrollok", (PyCFunction)PyCursesWindow_scrollok},
Sjoerd Mullender14ece161995-03-17 12:18:38 +00001336 {"setscrreg", (PyCFunction)PyCursesWindow_SetScrollRegion},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001337 {"standend", (PyCFunction)PyCursesWindow_wstandend},
1338 {"standout", (PyCFunction)PyCursesWindow_wstandout},
1339 {"subpad", (PyCFunction)PyCursesWindow_SubWin},
1340 {"subwin", (PyCFunction)PyCursesWindow_SubWin},
1341 {"syncdown", (PyCFunction)PyCursesWindow_wsyncdown},
1342 {"syncok", (PyCFunction)PyCursesWindow_syncok},
1343 {"syncup", (PyCFunction)PyCursesWindow_wsyncup},
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00001344 {"timeout", (PyCFunction)PyCursesWindow_wtimeout},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001345 {"touchline", (PyCFunction)PyCursesWindow_TouchLine},
1346 {"touchwin", (PyCFunction)PyCursesWindow_touchwin},
1347 {"untouchwin", (PyCFunction)PyCursesWindow_untouchwin},
1348 {"vline", (PyCFunction)PyCursesWindow_Vline},
Guido van Rossum585c6dc1995-02-24 13:45:43 +00001349 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00001350};
1351
1352static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001353PyCursesWindow_GetAttr(PyCursesWindowObject *self, char *name)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001354{
Guido van Rossuma597dde1995-01-10 20:56:29 +00001355 return Py_FindMethod(PyCursesWindow_Methods, (PyObject *)self, name);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001356}
1357
Guido van Rossumf6971e21994-08-30 12:25:20 +00001358/* -------------------------------------------------------*/
Guido van Rossum85738471995-02-17 13:50:17 +00001359
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001360PyTypeObject PyCursesWindow_Type = {
Guido van Rossumf6971e21994-08-30 12:25:20 +00001361 PyObject_HEAD_INIT(&PyType_Type)
1362 0, /*ob_size*/
1363 "curses window", /*tp_name*/
1364 sizeof(PyCursesWindowObject), /*tp_basicsize*/
1365 0, /*tp_itemsize*/
1366 /* methods */
1367 (destructor)PyCursesWindow_Dealloc, /*tp_dealloc*/
1368 0, /*tp_print*/
1369 (getattrfunc)PyCursesWindow_GetAttr, /*tp_getattr*/
1370 (setattrfunc)0, /*tp_setattr*/
1371 0, /*tp_compare*/
1372 0, /*tp_repr*/
1373 0, /*tp_as_number*/
1374 0, /*tp_as_sequence*/
1375 0, /*tp_as_mapping*/
1376 0, /*tp_hash*/
1377};
1378
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001379/*********************************************************************
1380 Global Functions
1381**********************************************************************/
Guido van Rossumf6971e21994-08-30 12:25:20 +00001382
Guido van Rossume4485b01994-09-07 14:32:49 +00001383static PyObject *ModDict;
1384
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001385/* Function Prototype Macros - They are ugly but very, very useful. ;-)
1386
1387 X - function name
1388 TYPE - parameter Type
1389 ERGSTR - format string for construction of the return value
1390 PARSESTR - format string for argument parsing
1391 */
1392
1393#define NoArgNoReturnFunction(X) \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001394static PyObject *PyCurses_ ## X (PyObject *self, PyObject *args) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001395{ \
1396 PyCursesInitialised \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001397 if (!PyArg_NoArgs(args)) return NULL; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001398 return PyCursesCheckERR(X(), # X); }
1399
1400#define NoArgOrFlagNoReturnFunction(X) \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001401static PyObject *PyCurses_ ## X (PyObject *self, PyObject *args) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001402{ \
1403 int flag = 0; \
1404 PyCursesInitialised \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001405 switch(ARG_COUNT(args)) { \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001406 case 0: \
1407 return PyCursesCheckERR(X(), # X); \
1408 case 1: \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001409 if (!PyArg_Parse(args, "i;True(1) or False(0)", &flag)) return NULL; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001410 if (flag) return PyCursesCheckERR(X(), # X); \
1411 else return PyCursesCheckERR(no ## X (), # X); \
1412 default: \
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001413 PyErr_SetString(PyExc_TypeError, # X " requires 0 or 1 arguments"); \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001414 return NULL; } }
1415
1416#define NoArgReturnIntFunction(X) \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001417static PyObject *PyCurses_ ## X (PyObject *self, PyObject *args) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001418{ \
1419 PyCursesInitialised \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001420 if (!PyArg_NoArgs(args)) return NULL; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001421 return PyInt_FromLong((long) X()); }
1422
1423
1424#define NoArgReturnStringFunction(X) \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001425static PyObject *PyCurses_ ## X (PyObject *self, PyObject *args) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001426{ \
1427 PyCursesInitialised \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001428 if (!PyArg_NoArgs(args)) return NULL; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001429 return PyString_FromString(X()); }
1430
1431#define NoArgTrueFalseFunction(X) \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001432static PyObject *PyCurses_ ## X (PyObject *self, PyObject *args) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001433{ \
1434 PyCursesInitialised \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001435 if (!PyArg_NoArgs(args)) return NULL; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001436 if (X () == FALSE) { \
1437 Py_INCREF(Py_False); \
1438 return Py_False; \
1439 } \
1440 Py_INCREF(Py_True); \
1441 return Py_True; }
1442
1443#define NoArgNoReturnVoidFunction(X) \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001444static PyObject *PyCurses_ ## X (PyObject *self, PyObject *args) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001445{ \
1446 PyCursesInitialised \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001447 if (!PyArg_NoArgs(args)) return NULL; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001448 X(); \
1449 Py_INCREF(Py_None); \
1450 return Py_None; }
1451
1452NoArgNoReturnFunction(beep)
1453NoArgNoReturnFunction(def_prog_mode)
1454NoArgNoReturnFunction(def_shell_mode)
1455NoArgNoReturnFunction(doupdate)
1456NoArgNoReturnFunction(endwin)
1457NoArgNoReturnFunction(flash)
1458NoArgNoReturnFunction(nocbreak)
1459NoArgNoReturnFunction(noecho)
1460NoArgNoReturnFunction(nonl)
1461NoArgNoReturnFunction(noraw)
1462NoArgNoReturnFunction(reset_prog_mode)
1463NoArgNoReturnFunction(reset_shell_mode)
1464NoArgNoReturnFunction(resetty)
1465NoArgNoReturnFunction(savetty)
1466
1467NoArgOrFlagNoReturnFunction(cbreak)
1468NoArgOrFlagNoReturnFunction(echo)
1469NoArgOrFlagNoReturnFunction(nl)
1470NoArgOrFlagNoReturnFunction(raw)
1471
1472NoArgReturnIntFunction(baudrate)
1473NoArgReturnIntFunction(termattrs)
1474
1475NoArgReturnStringFunction(termname)
1476NoArgReturnStringFunction(longname)
1477
1478NoArgTrueFalseFunction(can_change_color)
1479NoArgTrueFalseFunction(has_colors)
1480NoArgTrueFalseFunction(has_ic)
1481NoArgTrueFalseFunction(has_il)
1482NoArgTrueFalseFunction(isendwin)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001483NoArgNoReturnVoidFunction(filter)
1484NoArgNoReturnVoidFunction(flushinp)
1485NoArgNoReturnVoidFunction(noqiflush)
1486
1487static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001488PyCurses_Color_Content(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001489{
1490 short color,r,g,b;
1491
1492 PyCursesInitialised
1493 PyCursesInitialisedColor
1494
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001495 if (ARG_COUNT(args) != 1) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001496 PyErr_SetString(PyExc_TypeError,
1497 "color_content requires 1 argument");
1498 return NULL;
1499 }
1500
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001501 if (!PyArg_Parse(args, "h;color", &color)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001502
1503 if (color_content(color, &r, &g, &b) != ERR)
1504 return Py_BuildValue("(iii)", r, g, b);
1505 else {
1506 PyErr_SetString(PyCursesError,
1507 "Argument 1 was out of range. Check value of COLORS.");
1508 return NULL;
1509 }
1510}
1511
1512static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001513PyCurses_color_pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001514{
1515 int n;
1516
1517 PyCursesInitialised
1518 PyCursesInitialisedColor
1519
Andrew M. Kuchling4463acb2000-07-24 23:54:49 +00001520 if (ARG_COUNT(args) != 1) {
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001521 PyErr_SetString(PyExc_TypeError, "color_pair requires 1 argument");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001522 return NULL;
1523 }
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001524 if (!PyArg_Parse(args, "i;number", &n)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001525 return PyInt_FromLong((long) (n << 8));
1526}
1527
1528static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001529PyCurses_Curs_Set(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001530{
1531 int vis,erg;
1532
1533 PyCursesInitialised
1534
Andrew M. Kuchling4463acb2000-07-24 23:54:49 +00001535 if (ARG_COUNT(args)!=1) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001536 PyErr_SetString(PyExc_TypeError, "curs_set requires 1 argument");
1537 return NULL;
1538 }
1539
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001540 if (!PyArg_Parse(args, "i;int", &vis)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001541
1542 erg = curs_set(vis);
1543 if (erg == ERR) return PyCursesCheckERR(erg, "curs_set");
1544
1545 return PyInt_FromLong((long) erg);
1546}
1547
1548static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001549PyCurses_Delay_Output(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001550{
1551 int ms;
1552
1553 PyCursesInitialised
1554
Andrew M. Kuchling4463acb2000-07-24 23:54:49 +00001555 if (ARG_COUNT(args) != 1) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001556 PyErr_SetString(PyExc_TypeError, "delay_output requires 1 argument");
1557 return NULL;
1558 }
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001559 if (!PyArg_Parse(args, "i;ms", &ms)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001560
1561 return PyCursesCheckERR(delay_output(ms), "delay_output");
1562}
1563
1564static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001565PyCurses_EraseChar(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001566{
1567 char ch;
1568
1569 PyCursesInitialised
1570
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001571 if (!PyArg_NoArgs(args)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001572
1573 ch = erasechar();
1574
1575 return PyString_FromString(&ch);
1576}
1577
1578static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001579PyCurses_getsyx(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001580{
1581 int x,y;
1582
1583 PyCursesInitialised
1584
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001585 if (!PyArg_NoArgs(args)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001586
1587 getsyx(y, x);
1588
1589 return Py_BuildValue("(ii)", y, x);
1590}
1591
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001592#ifdef NCURSES_MOUSE_VERSION
1593static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001594PyCurses_GetMouse(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001595{
1596 int rtn;
1597 MEVENT event;
1598
1599 PyCursesInitialised
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001600 if (!PyArg_NoArgs(args)) return NULL;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001601
1602 rtn = getmouse( &event );
1603 if (rtn == ERR) {
1604 PyErr_SetString(PyCursesError, "getmouse() returned ERR");
1605 return NULL;
1606 }
1607 return Py_BuildValue("(hiiil)",
1608 (short)event.id,
1609 event.x, event.y, event.z,
1610 (long) event.bstate);
1611}
1612
1613static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001614PyCurses_UngetMouse(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001615{
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001616 MEVENT event;
1617
1618 PyCursesInitialised
1619 if (!PyArg_ParseTuple(args, "(hiiil)",
1620 &event.id,
1621 &event.x, &event.y, &event.z,
1622 (int *) &event.bstate))
1623 return NULL;
1624
1625 return PyCursesCheckERR(ungetmouse(&event), "ungetmouse");
1626}
1627#endif
1628
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001629static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001630PyCurses_GetWin(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001631{
1632 WINDOW *win;
1633 PyObject *temp;
1634
1635 PyCursesInitialised
1636
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001637 if (!PyArg_Parse(args, "O;fileobj", &temp)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001638
1639 if (!PyFile_Check(temp)) {
1640 PyErr_SetString(PyExc_TypeError, "argument must be a file object");
1641 return NULL;
1642 }
1643
1644 win = getwin(PyFile_AsFile(temp));
1645
1646 if (win == NULL) {
1647 PyErr_SetString(PyCursesError, catchall_NULL);
1648 return NULL;
1649 }
1650
1651 return PyCursesWindow_New(win);
1652}
1653
1654static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001655PyCurses_HalfDelay(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001656{
1657 unsigned char tenths;
1658
1659 PyCursesInitialised
1660
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001661 switch(ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001662 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001663 if (!PyArg_Parse(args, "b;tenths", &tenths)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001664 break;
1665 default:
1666 PyErr_SetString(PyExc_TypeError, "halfdelay requires 1 argument");
1667 return NULL;
1668 }
1669
1670 return PyCursesCheckERR(halfdelay(tenths), "halfdelay");
1671}
1672
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00001673#ifndef STRICT_SYSV_CURSES
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001674 /* No has_key! */
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001675static PyObject * PyCurses_has_key(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001676{
1677 int ch;
1678
1679 PyCursesInitialised
1680
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001681 if (!PyArg_Parse(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001682
1683 if (has_key(ch) == FALSE) {
1684 Py_INCREF(Py_False);
1685 return Py_False;
1686 }
1687 Py_INCREF(Py_True);
1688 return Py_True;
1689}
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00001690#endif /* STRICT_SYSV_CURSES */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001691
1692static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001693PyCurses_Init_Color(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001694{
1695 short color, r, g, b;
1696
1697 PyCursesInitialised
1698 PyCursesInitialisedColor
1699
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001700 switch(ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001701 case 4:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001702 if (!PyArg_Parse(args, "(hhhh);color,r,g,b", &color, &r, &g, &b)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001703 break;
1704 default:
1705 PyErr_SetString(PyExc_TypeError, "init_color requires 4 arguments");
1706 return NULL;
1707 }
1708
1709 return PyCursesCheckERR(init_color(color, r, g, b), "init_color");
1710}
1711
1712static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001713PyCurses_Init_Pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001714{
1715 short pair, f, b;
1716
1717 PyCursesInitialised
1718 PyCursesInitialisedColor
1719
Andrew M. Kuchling4463acb2000-07-24 23:54:49 +00001720 if (ARG_COUNT(args) != 3) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001721 PyErr_SetString(PyExc_TypeError, "init_pair requires 3 arguments");
1722 return NULL;
1723 }
1724
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001725 if (!PyArg_Parse(args, "(hhh);pair, f, b", &pair, &f, &b)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001726
1727 return PyCursesCheckERR(init_pair(pair, f, b), "init_pair");
1728}
1729
Guido van Rossumf6971e21994-08-30 12:25:20 +00001730static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001731PyCurses_InitScr(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001732{
Guido van Rossum56bf2351994-08-31 22:06:24 +00001733 WINDOW *win;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001734 PyObject *lines, *cols;
1735
1736 if (!PyArg_NoArgs(args)) return NULL;
1737
Guido van Rossum585c6dc1995-02-24 13:45:43 +00001738 if (initialised == TRUE) {
Guido van Rossumf6971e21994-08-30 12:25:20 +00001739 wrefresh(stdscr);
1740 return (PyObject *)PyCursesWindow_New(stdscr);
1741 }
Guido van Rossum56bf2351994-08-31 22:06:24 +00001742
1743 win = initscr();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001744
Guido van Rossum85738471995-02-17 13:50:17 +00001745 if (win == NULL) {
1746 PyErr_SetString(PyCursesError, catchall_NULL);
1747 return NULL;
1748 }
1749
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00001750 initialised = initialised_setupterm = TRUE;
Guido van Rossum56bf2351994-08-31 22:06:24 +00001751
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001752/* This was moved from initcurses() because it core dumped on SGI,
1753 where they're not defined until you've called initscr() */
1754#define SetDictInt(string,ch) \
1755 PyDict_SetItemString(ModDict,string,PyInt_FromLong((long) (ch)));
1756
1757 /* Here are some graphic symbols you can use */
1758 SetDictInt("ACS_ULCORNER", (ACS_ULCORNER));
1759 SetDictInt("ACS_LLCORNER", (ACS_LLCORNER));
1760 SetDictInt("ACS_URCORNER", (ACS_URCORNER));
1761 SetDictInt("ACS_LRCORNER", (ACS_LRCORNER));
1762 SetDictInt("ACS_LTEE", (ACS_LTEE));
1763 SetDictInt("ACS_RTEE", (ACS_RTEE));
1764 SetDictInt("ACS_BTEE", (ACS_BTEE));
1765 SetDictInt("ACS_TTEE", (ACS_TTEE));
1766 SetDictInt("ACS_HLINE", (ACS_HLINE));
1767 SetDictInt("ACS_VLINE", (ACS_VLINE));
1768 SetDictInt("ACS_PLUS", (ACS_PLUS));
1769 SetDictInt("ACS_S1", (ACS_S1));
1770 SetDictInt("ACS_S9", (ACS_S9));
1771 SetDictInt("ACS_DIAMOND", (ACS_DIAMOND));
1772 SetDictInt("ACS_CKBOARD", (ACS_CKBOARD));
1773 SetDictInt("ACS_DEGREE", (ACS_DEGREE));
1774 SetDictInt("ACS_PLMINUS", (ACS_PLMINUS));
1775 SetDictInt("ACS_BULLET", (ACS_BULLET));
1776 SetDictInt("ACS_LARROW", (ACS_LARROW));
1777 SetDictInt("ACS_RARROW", (ACS_RARROW));
1778 SetDictInt("ACS_DARROW", (ACS_DARROW));
1779 SetDictInt("ACS_UARROW", (ACS_UARROW));
1780 SetDictInt("ACS_BOARD", (ACS_BOARD));
1781 SetDictInt("ACS_LANTERN", (ACS_LANTERN));
1782 SetDictInt("ACS_BLOCK", (ACS_BLOCK));
1783 SetDictInt("ACS_BSSB", (ACS_ULCORNER));
1784 SetDictInt("ACS_SSBB", (ACS_LLCORNER));
1785 SetDictInt("ACS_BBSS", (ACS_URCORNER));
1786 SetDictInt("ACS_SBBS", (ACS_LRCORNER));
1787 SetDictInt("ACS_SBSS", (ACS_RTEE));
1788 SetDictInt("ACS_SSSB", (ACS_LTEE));
1789 SetDictInt("ACS_SSBS", (ACS_BTEE));
1790 SetDictInt("ACS_BSSS", (ACS_TTEE));
1791 SetDictInt("ACS_BSBS", (ACS_HLINE));
1792 SetDictInt("ACS_SBSB", (ACS_VLINE));
1793 SetDictInt("ACS_SSSS", (ACS_PLUS));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001794
1795 /* The following are never available with strict SYSV curses */
1796#ifdef ACS_S3
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001797 SetDictInt("ACS_S3", (ACS_S3));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001798#endif
1799#ifdef ACS_S7
1800 SetDictInt("ACS_S7", (ACS_S7));
1801#endif
1802#ifdef ACS_LEQUAL
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001803 SetDictInt("ACS_LEQUAL", (ACS_LEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001804#endif
1805#ifdef ACS_GEQUAL
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001806 SetDictInt("ACS_GEQUAL", (ACS_GEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001807#endif
1808#ifdef ACS_PI
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001809 SetDictInt("ACS_PI", (ACS_PI));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001810#endif
1811#ifdef ACS_NEQUAL
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001812 SetDictInt("ACS_NEQUAL", (ACS_NEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001813#endif
1814#ifdef ACS_STERLING
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001815 SetDictInt("ACS_STERLING", (ACS_STERLING));
1816#endif
1817
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001818 lines = PyInt_FromLong((long) LINES);
1819 PyDict_SetItemString(ModDict, "LINES", lines);
1820 Py_DECREF(lines);
1821 cols = PyInt_FromLong((long) COLS);
1822 PyDict_SetItemString(ModDict, "COLS", cols);
1823 Py_DECREF(cols);
Guido van Rossum56bf2351994-08-31 22:06:24 +00001824
1825 return (PyObject *)PyCursesWindow_New(win);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001826}
1827
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00001828static PyObject *
1829PyCurses_setupterm(PyObject* self, PyObject *args, PyObject* keywds)
1830{
1831 int fd = -1;
1832 int err;
1833 char* termstr = NULL;
1834
1835 static char *kwlist[] = {"term", "fd", NULL};
1836
1837 if (!PyArg_ParseTupleAndKeywords(
1838 args,keywds,"|zi:setupterm",kwlist,&termstr,&fd)) {
1839 return NULL;
1840 }
1841
1842 if (fd == -1) {
1843 PyObject* sys_stdout;
1844
1845 sys_stdout = PySys_GetObject("stdout");
1846
1847 if (sys_stdout == NULL) {
1848 PyErr_SetString(
1849 PyCursesError,
1850 "lost sys.stdout");
1851 return NULL;
1852 }
1853
1854 fd = PyObject_AsFileDescriptor(sys_stdout);
1855
1856 if (fd == -1) {
1857 return NULL;
1858 }
1859 }
1860
1861 if (setupterm(termstr,fd,&err) == ERR) {
1862 char* s = "setupterm: unknown error";
1863
1864 if (err == 0) {
1865 s = "setupterm: could not find terminal";
1866 } else if (err == -1) {
1867 s = "setupterm: could not find terminfo database";
1868 }
1869
1870 PyErr_SetString(PyCursesError,s);
1871 return NULL;
1872 }
1873
1874 initialised_setupterm = TRUE;
1875
1876 Py_INCREF(Py_None);
1877 return Py_None;
1878}
Guido van Rossumf6971e21994-08-30 12:25:20 +00001879
1880static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001881PyCurses_IntrFlush(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001882{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001883 int ch;
1884
1885 PyCursesInitialised
1886
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001887 switch(ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001888 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001889 if (!PyArg_Parse(args,"i;True(1), False(0)",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001890 break;
1891 default:
1892 PyErr_SetString(PyExc_TypeError, "intrflush requires 1 argument");
Guido van Rossum85738471995-02-17 13:50:17 +00001893 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001894 }
1895
1896 return PyCursesCheckERR(intrflush(NULL,ch), "intrflush");
1897}
1898
1899static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001900PyCurses_KeyName(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001901{
1902 const char *knp;
1903 int ch;
1904
1905 PyCursesInitialised
1906
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001907 if (!PyArg_Parse(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001908
1909 knp = keyname(ch);
1910
1911 return PyString_FromString((knp == NULL) ? "" : (char *)knp);
1912}
1913
1914static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001915PyCurses_KillChar(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001916{
1917 char ch;
1918
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001919 if (!PyArg_NoArgs(args)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001920
1921 ch = killchar();
1922
1923 return PyString_FromString(&ch);
1924}
1925
1926static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001927PyCurses_Meta(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001928{
1929 int ch;
1930
1931 PyCursesInitialised
1932
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001933 switch(ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001934 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001935 if (!PyArg_Parse(args,"i;True(1), False(0)",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001936 break;
1937 default:
1938 PyErr_SetString(PyExc_TypeError, "meta requires 1 argument");
1939 return NULL;
1940 }
1941
1942 return PyCursesCheckERR(meta(stdscr, ch), "meta");
1943}
1944
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001945#ifdef NCURSES_MOUSE_VERSION
1946static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001947PyCurses_MouseInterval(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001948{
1949 int interval;
1950 PyCursesInitialised
1951
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001952 if (!PyArg_Parse(args,"i;interval",&interval))
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001953 return NULL;
1954 return PyCursesCheckERR(mouseinterval(interval), "mouseinterval");
1955}
1956
1957static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001958PyCurses_MouseMask(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001959{
Andrew M. Kuchling1a104002000-07-06 18:14:03 +00001960 int newmask;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001961 mmask_t oldmask, availmask;
1962
1963 PyCursesInitialised
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001964 if (!PyArg_Parse(args,"i;mousemask",&newmask))
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001965 return NULL;
1966 availmask = mousemask(newmask, &oldmask);
1967 return Py_BuildValue("(ll)", (long)availmask, (long)oldmask);
1968}
1969#endif
1970
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001971static PyObject *
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00001972PyCurses_Napms(PyObject *self, PyObject *args)
1973{
1974 int ms;
1975
1976 PyCursesInitialised
1977 if (!PyArg_Parse(args, "i;ms", &ms)) return NULL;
1978
1979 return Py_BuildValue("i", napms(ms));
1980}
1981
1982
1983static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001984PyCurses_NewPad(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001985{
1986 WINDOW *win;
1987 int nlines, ncols;
1988
1989 PyCursesInitialised
1990
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001991 if (!PyArg_Parse(args,"(ii);nlines,ncols",&nlines,&ncols)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001992
1993 win = newpad(nlines, ncols);
1994
1995 if (win == NULL) {
1996 PyErr_SetString(PyCursesError, catchall_NULL);
1997 return NULL;
1998 }
1999
2000 return (PyObject *)PyCursesWindow_New(win);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002001}
2002
2003static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002004PyCurses_NewWindow(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002005{
2006 WINDOW *win;
2007 int nlines, ncols, begin_y, begin_x;
Guido van Rossum85738471995-02-17 13:50:17 +00002008
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002009 PyCursesInitialised
2010
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002011 switch (ARG_COUNT(args)) {
Guido van Rossum85738471995-02-17 13:50:17 +00002012 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002013 if (!PyArg_Parse(args,"(ii);nlines,ncols",&nlines,&ncols))
Guido van Rossum85738471995-02-17 13:50:17 +00002014 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002015 win = newpad(nlines, ncols);
Guido van Rossum85738471995-02-17 13:50:17 +00002016 break;
2017 case 4:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002018 if (!PyArg_Parse(args, "(iiii);nlines,ncols,begin_y,begin_x",
Guido van Rossumf6971e21994-08-30 12:25:20 +00002019 &nlines,&ncols,&begin_y,&begin_x))
Guido van Rossum85738471995-02-17 13:50:17 +00002020 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002021 win = newwin(nlines,ncols,begin_y,begin_x);
Guido van Rossum85738471995-02-17 13:50:17 +00002022 break;
2023 default:
2024 PyErr_SetString(PyExc_TypeError, "newwin requires 2 or 4 arguments");
2025 return NULL;
2026 }
2027
Guido van Rossumf6971e21994-08-30 12:25:20 +00002028 if (win == NULL) {
Guido van Rossum85738471995-02-17 13:50:17 +00002029 PyErr_SetString(PyCursesError, catchall_NULL);
2030 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002031 }
Guido van Rossum85738471995-02-17 13:50:17 +00002032
Guido van Rossumf6971e21994-08-30 12:25:20 +00002033 return (PyObject *)PyCursesWindow_New(win);
2034}
2035
2036static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002037PyCurses_Pair_Content(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002038{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002039 short pair,f,b;
2040
2041 PyCursesInitialised
2042 PyCursesInitialisedColor
2043
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002044 switch(ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002045 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002046 if (!PyArg_Parse(args, "h;pair", &pair)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002047 break;
2048 default:
2049 PyErr_SetString(PyExc_TypeError, "pair_content requires 1 argument");
Guido van Rossum85738471995-02-17 13:50:17 +00002050 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002051 }
2052
2053 if (!pair_content(pair, &f, &b)) {
2054 PyErr_SetString(PyCursesError,
2055 "Argument 1 was out of range. (1..COLOR_PAIRS-1)");
2056 return NULL;
2057 }
2058
2059 return Py_BuildValue("(ii)", f, b);
2060}
2061
2062static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002063PyCurses_pair_number(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002064{
2065 int n;
2066
2067 PyCursesInitialised
2068 PyCursesInitialisedColor
2069
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002070 switch(ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002071 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002072 if (!PyArg_Parse(args, "i;pairvalue", &n)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002073 break;
2074 default:
2075 PyErr_SetString(PyExc_TypeError,
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002076 "pair_number requires 1 argument");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002077 return NULL;
2078 }
2079
2080 return PyInt_FromLong((long) ((n & A_COLOR) >> 8));
2081}
2082
2083static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002084PyCurses_Putp(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002085{
2086 char *str;
2087
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002088 if (!PyArg_Parse(args,"s;str", &str)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002089 return PyCursesCheckERR(putp(str), "putp");
2090}
2091
2092static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002093PyCurses_QiFlush(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002094{
2095 int flag = 0;
2096
2097 PyCursesInitialised
2098
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002099 switch(ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002100 case 0:
2101 qiflush();
2102 Py_INCREF(Py_None);
2103 return Py_None;
2104 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002105 if (!PyArg_Parse(args, "i;True(1) or False(0)", &flag)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002106 if (flag) qiflush();
2107 else noqiflush();
2108 Py_INCREF(Py_None);
2109 return Py_None;
2110 default:
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002111 PyErr_SetString(PyExc_TypeError, "qiflush requires 0 or 1 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002112 return NULL;
2113 }
2114}
2115
2116static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002117PyCurses_setsyx(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002118{
2119 int y,x;
2120
2121 PyCursesInitialised
2122
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002123 if (ARG_COUNT(args)!=2) {
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002124 PyErr_SetString(PyExc_TypeError, "setsyx requires 2 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002125 return NULL;
2126 }
2127
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002128 if (!PyArg_Parse(args, "(ii);y, x", &y, &x)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002129
2130 setsyx(y,x);
2131
Guido van Rossumf6971e21994-08-30 12:25:20 +00002132 Py_INCREF(Py_None);
Guido van Rossum85738471995-02-17 13:50:17 +00002133 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002134}
2135
2136static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002137PyCurses_Start_Color(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002138{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002139 int code;
2140 PyObject *c, *cp;
2141
2142 PyCursesInitialised
2143
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002144 if (!PyArg_NoArgs(args)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002145
2146 code = start_color();
2147 if (code != ERR) {
2148 initialisedcolors = TRUE;
2149 c = PyInt_FromLong((long) COLORS);
2150 PyDict_SetItemString(ModDict, "COLORS", c);
2151 Py_DECREF(c);
2152 cp = PyInt_FromLong((long) COLOR_PAIRS);
2153 PyDict_SetItemString(ModDict, "COLOR_PAIRS", cp);
2154 Py_DECREF(cp);
2155 Py_INCREF(Py_None);
2156 return Py_None;
2157 } else {
2158 PyErr_SetString(PyCursesError, "start_color() returned ERR");
Guido van Rossum85738471995-02-17 13:50:17 +00002159 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002160 }
2161}
2162
2163static PyObject *
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002164PyCurses_tigetflag(PyObject *self, PyObject *args)
2165{
2166 char *capname;
2167
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002168 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002169
2170 if (!PyArg_ParseTuple(args, "z", &capname))
2171 return NULL;
2172
2173 return PyInt_FromLong( (long) tigetflag( capname ) );
2174}
2175
2176static PyObject *
2177PyCurses_tigetnum(PyObject *self, PyObject *args)
2178{
2179 char *capname;
2180
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002181 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002182
2183 if (!PyArg_ParseTuple(args, "z", &capname))
2184 return NULL;
2185
2186 return PyInt_FromLong( (long) tigetnum( capname ) );
2187}
2188
2189static PyObject *
2190PyCurses_tigetstr(PyObject *self, PyObject *args)
2191{
2192 char *capname;
2193
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002194 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002195
2196 if (!PyArg_ParseTuple(args, "z", &capname))
2197 return NULL;
2198
2199 capname = tigetstr( capname );
2200 if (capname == 0 || capname == (char*) -1) {
2201 Py_INCREF(Py_None);
2202 return Py_None;
2203 }
2204 return PyString_FromString( capname );
2205}
2206
2207static PyObject *
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00002208PyCurses_tparm(PyObject *self, PyObject *args)
2209{
2210 char* fmt;
2211 char* result = NULL;
2212 int i1,i2,i3,i4,i5,i6,i7,i8,i9;
2213
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002214 PyCursesSetupTermCalled;
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00002215
2216 if (!PyArg_ParseTuple(args, "s|iiiiiiiii:tparm",
2217 &fmt, &i1, &i2, &i3, &i4,
2218 &i5, &i6, &i7, &i8, &i9)) {
2219 return NULL;
2220 }
2221
2222 switch (PyTuple_GET_SIZE(args)) {
2223 case 1:
2224 result = tparm(fmt);
2225 break;
2226 case 2:
2227 result = tparm(fmt,i1);
2228 break;
2229 case 3:
2230 result = tparm(fmt,i1,i2);
2231 break;
2232 case 4:
2233 result = tparm(fmt,i1,i2,i3);
2234 break;
2235 case 5:
2236 result = tparm(fmt,i1,i2,i3,i4);
2237 break;
2238 case 6:
2239 result = tparm(fmt,i1,i2,i3,i4,i5);
2240 break;
2241 case 7:
2242 result = tparm(fmt,i1,i2,i3,i4,i5,i6);
2243 break;
2244 case 8:
2245 result = tparm(fmt,i1,i2,i3,i4,i5,i6,i7);
2246 break;
2247 case 9:
2248 result = tparm(fmt,i1,i2,i3,i4,i5,i6,i7,i8);
2249 break;
2250 case 10:
2251 result = tparm(fmt,i1,i2,i3,i4,i5,i6,i7,i8,i9);
2252 break;
2253 }
2254
2255 return PyString_FromString(result);
2256}
2257
2258static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002259PyCurses_TypeAhead(PyObject *self, PyObject *args)
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00002260{
Andrew M. Kuchling1a104002000-07-06 18:14:03 +00002261 int fd;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00002262
2263 PyCursesInitialised
2264
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002265 if (!PyArg_Parse(args,"i;fd",&fd)) return NULL;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00002266
2267 PyCursesCheckERR(typeahead( fd ), "typeahead");
2268 Py_INCREF(Py_None);
2269 return Py_None;
2270}
2271
2272static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002273PyCurses_UnCtrl(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002274{
2275 PyObject *temp;
2276 chtype ch;
2277
2278 PyCursesInitialised
2279
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002280 if (!PyArg_Parse(args,"O;ch or int",&temp)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002281
2282 if (PyInt_Check(temp))
2283 ch = (chtype) PyInt_AsLong(temp);
2284 else if (PyString_Check(temp))
2285 ch = (chtype) *PyString_AsString(temp);
2286 else {
2287 PyErr_SetString(PyExc_TypeError, "argument must be a ch or an int");
2288 return NULL;
2289 }
2290
2291 return PyString_FromString(unctrl(ch));
Guido van Rossumf6971e21994-08-30 12:25:20 +00002292}
2293
2294static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002295PyCurses_UngetCh(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002296{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002297 PyObject *temp;
2298 chtype ch;
2299
2300 PyCursesInitialised
2301
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002302 if (!PyArg_Parse(args,"O;ch or int",&temp)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002303
2304 if (PyInt_Check(temp))
2305 ch = (chtype) PyInt_AsLong(temp);
2306 else if (PyString_Check(temp))
2307 ch = (chtype) *PyString_AsString(temp);
2308 else {
2309 PyErr_SetString(PyExc_TypeError, "argument must be a ch or an int");
Guido van Rossum85738471995-02-17 13:50:17 +00002310 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002311 }
2312
Guido van Rossum85738471995-02-17 13:50:17 +00002313 return PyCursesCheckERR(ungetch(ch), "ungetch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00002314}
2315
2316static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002317PyCurses_Use_Env(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002318{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002319 int flag;
2320
2321 PyCursesInitialised
2322
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002323 switch(ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002324 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002325 if (!PyArg_Parse(args,"i;True(1), False(0)",&flag))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002326 return NULL;
2327 break;
2328 default:
2329 PyErr_SetString(PyExc_TypeError, "use_env requires 1 argument");
Guido van Rossum85738471995-02-17 13:50:17 +00002330 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002331 }
2332 use_env(flag);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002333 Py_INCREF(Py_None);
Guido van Rossum85738471995-02-17 13:50:17 +00002334 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002335}
2336
Guido van Rossumf6971e21994-08-30 12:25:20 +00002337/* List of functions defined in the module */
2338
2339static PyMethodDef PyCurses_methods[] = {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002340 {"baudrate", (PyCFunction)PyCurses_baudrate},
2341 {"beep", (PyCFunction)PyCurses_beep},
2342 {"can_change_color", (PyCFunction)PyCurses_can_change_color},
2343 {"cbreak", (PyCFunction)PyCurses_cbreak},
2344 {"color_content", (PyCFunction)PyCurses_Color_Content},
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002345 {"color_pair", (PyCFunction)PyCurses_color_pair},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002346 {"curs_set", (PyCFunction)PyCurses_Curs_Set},
2347 {"def_prog_mode", (PyCFunction)PyCurses_def_prog_mode},
2348 {"def_shell_mode", (PyCFunction)PyCurses_def_shell_mode},
2349 {"delay_output", (PyCFunction)PyCurses_Delay_Output},
2350 {"doupdate", (PyCFunction)PyCurses_doupdate},
2351 {"echo", (PyCFunction)PyCurses_echo},
2352 {"endwin", (PyCFunction)PyCurses_endwin},
2353 {"erasechar", (PyCFunction)PyCurses_EraseChar},
2354 {"filter", (PyCFunction)PyCurses_filter},
2355 {"flash", (PyCFunction)PyCurses_flash},
2356 {"flushinp", (PyCFunction)PyCurses_flushinp},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002357#ifdef NCURSES_MOUSE_VERSION
2358 {"getmouse", (PyCFunction)PyCurses_GetMouse},
2359 {"ungetmouse", (PyCFunction)PyCurses_UngetMouse, METH_VARARGS},
2360#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002361 {"getsyx", (PyCFunction)PyCurses_getsyx},
2362 {"getwin", (PyCFunction)PyCurses_GetWin},
2363 {"has_colors", (PyCFunction)PyCurses_has_colors},
2364 {"has_ic", (PyCFunction)PyCurses_has_ic},
2365 {"has_il", (PyCFunction)PyCurses_has_il},
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00002366#ifndef STRICT_SYSV_CURSES
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002367 {"has_key", (PyCFunction)PyCurses_has_key},
Guido van Rossumf6971e21994-08-30 12:25:20 +00002368#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002369 {"halfdelay", (PyCFunction)PyCurses_HalfDelay},
2370 {"init_color", (PyCFunction)PyCurses_Init_Color},
2371 {"init_pair", (PyCFunction)PyCurses_Init_Pair},
2372 {"initscr", (PyCFunction)PyCurses_InitScr},
2373 {"intrflush", (PyCFunction)PyCurses_IntrFlush},
2374 {"isendwin", (PyCFunction)PyCurses_isendwin},
2375 {"keyname", (PyCFunction)PyCurses_KeyName},
2376 {"killchar", (PyCFunction)PyCurses_KillChar},
2377 {"longname", (PyCFunction)PyCurses_longname},
2378 {"meta", (PyCFunction)PyCurses_Meta},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002379#ifdef NCURSES_MOUSE_VERSION
2380 {"mouseinterval", (PyCFunction)PyCurses_MouseInterval},
2381 {"mousemask", (PyCFunction)PyCurses_MouseMask},
2382#endif
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002383 {"napms", (PyCFunction)PyCurses_Napms},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002384 {"newpad", (PyCFunction)PyCurses_NewPad},
2385 {"newwin", (PyCFunction)PyCurses_NewWindow},
2386 {"nl", (PyCFunction)PyCurses_nl},
2387 {"nocbreak", (PyCFunction)PyCurses_nocbreak},
2388 {"noecho", (PyCFunction)PyCurses_noecho},
2389 {"nonl", (PyCFunction)PyCurses_nonl},
2390 {"noqiflush", (PyCFunction)PyCurses_noqiflush},
2391 {"noraw", (PyCFunction)PyCurses_noraw},
2392 {"pair_content", (PyCFunction)PyCurses_Pair_Content},
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002393 {"pair_number", (PyCFunction)PyCurses_pair_number},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002394 {"putp", (PyCFunction)PyCurses_Putp},
2395 {"qiflush", (PyCFunction)PyCurses_QiFlush},
2396 {"raw", (PyCFunction)PyCurses_raw},
2397 {"reset_prog_mode", (PyCFunction)PyCurses_reset_prog_mode},
2398 {"reset_shell_mode", (PyCFunction)PyCurses_reset_shell_mode},
Andrew M. Kuchling1a104002000-07-06 18:14:03 +00002399 {"resetty", (PyCFunction)PyCurses_resetty},
2400 {"savetty", (PyCFunction)PyCurses_savetty},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002401 {"setsyx", (PyCFunction)PyCurses_setsyx},
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002402 {"setupterm", (PyCFunction)PyCurses_setupterm, METH_VARARGS|METH_KEYWORDS},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002403 {"start_color", (PyCFunction)PyCurses_Start_Color},
2404 {"termattrs", (PyCFunction)PyCurses_termattrs},
2405 {"termname", (PyCFunction)PyCurses_termname},
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002406 {"tigetflag", (PyCFunction)PyCurses_tigetflag, METH_VARARGS},
2407 {"tigetnum", (PyCFunction)PyCurses_tigetnum, METH_VARARGS},
2408 {"tigetstr", (PyCFunction)PyCurses_tigetstr, METH_VARARGS},
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00002409 {"tparm", (PyCFunction)PyCurses_tparm, METH_VARARGS},
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00002410 {"typeahead", (PyCFunction)PyCurses_TypeAhead},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002411 {"unctrl", (PyCFunction)PyCurses_UnCtrl},
2412 {"ungetch", (PyCFunction)PyCurses_UngetCh},
2413 {"use_env", (PyCFunction)PyCurses_Use_Env},
2414 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002415};
2416
2417/* Initialization function for the module */
2418
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002419void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002420init_curses(void)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002421{
Guido van Rossum8fbf82b1995-02-17 13:54:04 +00002422 PyObject *m, *d, *v;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002423
2424 /* Create the module and add the functions */
Andrew M. Kuchlingb7f198e2000-06-10 23:12:32 +00002425 m = Py_InitModule("_curses", PyCurses_methods);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002426
Guido van Rossumf6971e21994-08-30 12:25:20 +00002427 /* Add some symbolic constants to the module */
2428 d = PyModule_GetDict(m);
Guido van Rossume4485b01994-09-07 14:32:49 +00002429 ModDict = d; /* For PyCurses_InitScr */
Guido van Rossumfbea2f31994-08-31 22:05:27 +00002430
Guido van Rossum85738471995-02-17 13:50:17 +00002431 /* For exception curses.error */
Fred Drake589c35b2000-07-06 19:38:49 +00002432 PyCursesError = PyErr_NewException("_curses.error", NULL, NULL);
Guido van Rossum85738471995-02-17 13:50:17 +00002433 PyDict_SetItemString(d, "error", PyCursesError);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00002434
Guido van Rossum85738471995-02-17 13:50:17 +00002435 /* Make the version available */
Guido van Rossum8fbf82b1995-02-17 13:54:04 +00002436 v = PyString_FromString(PyCursesVersion);
2437 PyDict_SetItemString(d, "version", v);
2438 PyDict_SetItemString(d, "__version__", v);
2439 Py_DECREF(v);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002440
Guido van Rossumf6971e21994-08-30 12:25:20 +00002441 /* Here are some attributes you can add to chars to print */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002442
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002443 SetDictInt("A_ATTRIBUTES", A_ATTRIBUTES);
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002444 SetDictInt("A_NORMAL", A_NORMAL);
2445 SetDictInt("A_STANDOUT", A_STANDOUT);
2446 SetDictInt("A_UNDERLINE", A_UNDERLINE);
2447 SetDictInt("A_REVERSE", A_REVERSE);
2448 SetDictInt("A_BLINK", A_BLINK);
2449 SetDictInt("A_DIM", A_DIM);
2450 SetDictInt("A_BOLD", A_BOLD);
2451 SetDictInt("A_ALTCHARSET", A_ALTCHARSET);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002452 SetDictInt("A_INVIS", A_INVIS);
2453 SetDictInt("A_PROTECT", A_PROTECT);
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002454 SetDictInt("A_CHARTEXT", A_CHARTEXT);
2455 SetDictInt("A_COLOR", A_COLOR);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002456
2457 /* The following are never available with strict SYSV curses */
2458#ifdef A_HORIZONTAL
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002459 SetDictInt("A_HORIZONTAL", A_HORIZONTAL);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002460#endif
2461#ifdef A_LEFT
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002462 SetDictInt("A_LEFT", A_LEFT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002463#endif
2464#ifdef A_LOW
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002465 SetDictInt("A_LOW", A_LOW);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002466#endif
2467#ifdef A_RIGHT
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002468 SetDictInt("A_RIGHT", A_RIGHT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002469#endif
2470#ifdef A_TOP
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002471 SetDictInt("A_TOP", A_TOP);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002472#endif
2473#ifdef A_VERTICAL
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002474 SetDictInt("A_VERTICAL", A_VERTICAL);
2475#endif
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002476
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002477 SetDictInt("COLOR_BLACK", COLOR_BLACK);
2478 SetDictInt("COLOR_RED", COLOR_RED);
2479 SetDictInt("COLOR_GREEN", COLOR_GREEN);
2480 SetDictInt("COLOR_YELLOW", COLOR_YELLOW);
2481 SetDictInt("COLOR_BLUE", COLOR_BLUE);
2482 SetDictInt("COLOR_MAGENTA", COLOR_MAGENTA);
2483 SetDictInt("COLOR_CYAN", COLOR_CYAN);
2484 SetDictInt("COLOR_WHITE", COLOR_WHITE);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002485
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002486#ifdef NCURSES_MOUSE_VERSION
2487 /* Mouse-related constants */
2488 SetDictInt("BUTTON1_PRESSED", BUTTON1_PRESSED);
2489 SetDictInt("BUTTON1_RELEASED", BUTTON1_RELEASED);
2490 SetDictInt("BUTTON1_CLICKED", BUTTON1_CLICKED);
2491 SetDictInt("BUTTON1_DOUBLE_CLICKED", BUTTON1_DOUBLE_CLICKED);
2492 SetDictInt("BUTTON1_TRIPLE_CLICKED", BUTTON1_TRIPLE_CLICKED);
2493
2494 SetDictInt("BUTTON2_PRESSED", BUTTON2_PRESSED);
2495 SetDictInt("BUTTON2_RELEASED", BUTTON2_RELEASED);
2496 SetDictInt("BUTTON2_CLICKED", BUTTON2_CLICKED);
2497 SetDictInt("BUTTON2_DOUBLE_CLICKED", BUTTON2_DOUBLE_CLICKED);
2498 SetDictInt("BUTTON2_TRIPLE_CLICKED", BUTTON2_TRIPLE_CLICKED);
2499
2500 SetDictInt("BUTTON3_PRESSED", BUTTON3_PRESSED);
2501 SetDictInt("BUTTON3_RELEASED", BUTTON3_RELEASED);
2502 SetDictInt("BUTTON3_CLICKED", BUTTON3_CLICKED);
2503 SetDictInt("BUTTON3_DOUBLE_CLICKED", BUTTON3_DOUBLE_CLICKED);
2504 SetDictInt("BUTTON3_TRIPLE_CLICKED", BUTTON3_TRIPLE_CLICKED);
2505
2506 SetDictInt("BUTTON4_PRESSED", BUTTON4_PRESSED);
2507 SetDictInt("BUTTON4_RELEASED", BUTTON4_RELEASED);
2508 SetDictInt("BUTTON4_CLICKED", BUTTON4_CLICKED);
2509 SetDictInt("BUTTON4_DOUBLE_CLICKED", BUTTON4_DOUBLE_CLICKED);
2510 SetDictInt("BUTTON4_TRIPLE_CLICKED", BUTTON4_TRIPLE_CLICKED);
2511
2512 SetDictInt("BUTTON_SHIFT", BUTTON_SHIFT);
2513 SetDictInt("BUTTON_CTRL", BUTTON_CTRL);
2514 SetDictInt("BUTTON_ALT", BUTTON_ALT);
2515
2516 SetDictInt("ALL_MOUSE_EVENTS", ALL_MOUSE_EVENTS);
2517 SetDictInt("REPORT_MOUSE_POSITION", REPORT_MOUSE_POSITION);
2518#endif
Guido van Rossumf6971e21994-08-30 12:25:20 +00002519 /* Now set everything up for KEY_ variables */
2520 {
2521 int key;
2522 char *key_n;
2523 char *key_n2;
2524 for (key=KEY_MIN;key < KEY_MAX; key++) {
2525 key_n = (char *)keyname(key);
Guido van Rossumf5c6d471995-02-07 15:38:32 +00002526 if (key_n == NULL || strcmp(key_n,"UNKNOWN KEY")==0)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002527 continue;
2528 if (strncmp(key_n,"KEY_F(",6)==0) {
2529 char *p1, *p2;
2530 key_n2 = malloc(strlen(key_n)+1);
2531 p1 = key_n;
2532 p2 = key_n2;
2533 while (*p1) {
2534 if (*p1 != '(' && *p1 != ')') {
2535 *p2 = *p1;
2536 p2++;
2537 }
2538 p1++;
2539 }
2540 *p2 = (char)0;
2541 } else
2542 key_n2 = key_n;
Guido van Rossum85738471995-02-17 13:50:17 +00002543 PyDict_SetItemString(d,key_n2,PyInt_FromLong((long) key));
Guido van Rossumf6971e21994-08-30 12:25:20 +00002544 if (key_n2 != key_n)
2545 free(key_n2);
2546 }
Guido van Rossum85738471995-02-17 13:50:17 +00002547 SetDictInt("KEY_MIN", KEY_MIN);
2548 SetDictInt("KEY_MAX", KEY_MAX);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002549 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00002550}