blob: 0cc04370c3c0d61e0efaf4e54c3c8639805d1df8 [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
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +000042 addchnstr addchstr chgat color_set define_key
Andrew M. Kuchlingfb6bbf52000-07-27 11:58:01 +000043 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. Kuchling9de6ffa2000-12-21 16:22:22 +000047 resizeterm restartterm ripoffline scr_dump
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +000048 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. Kuchling32552682000-12-22 21:52:27 +000098char *PyCursesVersion = "2.1";
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
Guido van Rossum858ca0f2001-04-10 19:53:37 +0000109#define CURSES_MODULE
110#include "py_curses.h"
111
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +0000112/* These prototypes are in <term.h>, but including this header
113 #defines many common symbols (such as "lines") which breaks the
114 curses module in other ways. So the code will just specify
115 explicit prototypes here. */
116extern int setupterm(char *,int,int *);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +0000117#ifdef sgi
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +0000118extern char *tigetstr(char *);
Andrew M. Kuchling399b8af2001-01-28 18:10:23 +0000119extern char *tparm(char *instring, ...);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +0000120#endif
121
122#if defined(sgi) || defined(__sun__)
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +0000123#define STRICT_SYSV_CURSES /* Don't use ncurses extensions */
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000124typedef chtype attr_t; /* No attr_t type is available */
Guido van Rossum1266a011996-02-25 04:50:31 +0000125#endif
Guido van Rossumf6971e21994-08-30 12:25:20 +0000126
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000127#if defined(_AIX)
128#define STRICT_SYSV_CURSES
129#endif
130
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000131/* Definition of exception curses.error */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000132
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000133static PyObject *PyCursesError;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000134
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +0000135/* Tells whether setupterm() has been called to initialise terminfo. */
136static int initialised_setupterm = FALSE;
137
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000138/* Tells whether initscr() has been called to initialise curses. */
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000139static int initialised = FALSE;
140
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000141/* Tells whether start_color() has been called to initialise color usage. */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000142static int initialisedcolors = FALSE;
143
144/* Utility Macros */
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +0000145#define PyCursesSetupTermCalled \
146 if (initialised_setupterm != TRUE) { \
147 PyErr_SetString(PyCursesError, \
148 "must call (at least) setupterm() first"); \
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000149 return 0; }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +0000150
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000151#define PyCursesInitialised \
152 if (initialised != TRUE) { \
153 PyErr_SetString(PyCursesError, \
154 "must call initscr() first"); \
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000155 return 0; }
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000156
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000157#define PyCursesInitialisedColor \
158 if (initialisedcolors != TRUE) { \
159 PyErr_SetString(PyCursesError, \
160 "must call start_color() first"); \
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000161 return 0; }
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000162
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000163/* Utility Functions */
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000164
Guido van Rossum85738471995-02-17 13:50:17 +0000165/*
166 * Check the return code from a curses function and return None
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000167 * or raise an exception as appropriate. These are exported using the
168 * CObject API.
Guido van Rossum85738471995-02-17 13:50:17 +0000169 */
170
171static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000172PyCursesCheckERR(int code, char *fname)
Guido van Rossum85738471995-02-17 13:50:17 +0000173{
Guido van Rossum85738471995-02-17 13:50:17 +0000174 if (code != ERR) {
175 Py_INCREF(Py_None);
176 return Py_None;
177 } else {
178 if (fname == NULL) {
179 PyErr_SetString(PyCursesError, catchall_ERR);
180 } else {
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000181 PyErr_Format(PyCursesError, "%s() returned ERR", fname);
Guido van Rossum85738471995-02-17 13:50:17 +0000182 }
183 return NULL;
184 }
185}
186
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000187static int
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000188PyCurses_ConvertToChtype(PyObject *obj, chtype *ch)
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000189{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000190 if (PyInt_Check(obj)) {
191 *ch = (chtype) PyInt_AsLong(obj);
192 } else if(PyString_Check(obj) &
193 (PyString_Size(obj) == 1)) {
194 *ch = (chtype) *PyString_AsString(obj);
195 } else {
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000196 return 0;
197 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000198 return 1;
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000199}
200
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000201/* Function versions of the 3 functions for tested whether curses has been
202 initialised or not. */
203
204static int func_PyCursesSetupTermCalled(void)
205{
206 PyCursesSetupTermCalled;
207 return 1;
208}
209
210static int func_PyCursesInitialised(void)
211{
212 PyCursesInitialised;
213 return 1;
214}
215
216static int func_PyCursesInitialisedColor(void)
217{
218 PyCursesInitialisedColor;
219 return 1;
220}
221
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000222/*****************************************************************************
223 The Window Object
224******************************************************************************/
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000225
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000226/* Definition of the window type */
Guido van Rossum85738471995-02-17 13:50:17 +0000227
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000228PyTypeObject PyCursesWindow_Type;
229
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000230/* Function prototype macros for Window object
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000231
232 X - function name
233 TYPE - parameter Type
234 ERGSTR - format string for construction of the return value
235 PARSESTR - format string for argument parsing
236 */
237
238#define Window_NoArgNoReturnFunction(X) \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000239static PyObject *PyCursesWindow_ ## X (PyCursesWindowObject *self, PyObject *args) \
240{ if (!PyArg_NoArgs(args)) return NULL; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000241 return PyCursesCheckERR(X(self->win), # X); }
242
243#define Window_NoArgTrueFalseFunction(X) \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000244static PyObject * PyCursesWindow_ ## X (PyCursesWindowObject *self, PyObject *args) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000245{ \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000246 if (!PyArg_NoArgs(args)) return NULL; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000247 if (X (self->win) == FALSE) { Py_INCREF(Py_False); return Py_False; } \
248 else { Py_INCREF(Py_True); return Py_True; } }
249
250#define Window_NoArgNoReturnVoidFunction(X) \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000251static PyObject * PyCursesWindow_ ## X (PyCursesWindowObject *self, PyObject *args) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000252{ \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000253 if (!PyArg_NoArgs(args)) return NULL; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000254 X(self->win); Py_INCREF(Py_None); return Py_None; }
255
256#define Window_NoArg2TupleReturnFunction(X, TYPE, ERGSTR) \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000257static PyObject * PyCursesWindow_ ## X (PyCursesWindowObject *self, PyObject *args) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000258{ \
259 TYPE arg1, arg2; \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000260 if (!PyArg_NoArgs(args)) return NULL; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000261 X(self->win,arg1,arg2); return Py_BuildValue(ERGSTR, arg1, arg2); }
262
263#define Window_OneArgNoReturnVoidFunction(X, TYPE, PARSESTR) \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000264static PyObject * PyCursesWindow_ ## X (PyCursesWindowObject *self, PyObject *args) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000265{ \
266 TYPE arg1; \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000267 if (!PyArg_Parse(args, PARSESTR, &arg1)) return NULL; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000268 X(self->win,arg1); Py_INCREF(Py_None); return Py_None; }
269
270#define Window_OneArgNoReturnFunction(X, TYPE, PARSESTR) \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000271static PyObject * PyCursesWindow_ ## X (PyCursesWindowObject *self, PyObject *args) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000272{ \
273 TYPE arg1; \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000274 if (!PyArg_Parse(args,PARSESTR, &arg1)) return NULL; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000275 return PyCursesCheckERR(X(self->win, arg1), # X); }
276
277#define Window_TwoArgNoReturnFunction(X, TYPE, PARSESTR) \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000278static PyObject * PyCursesWindow_ ## X (PyCursesWindowObject *self, PyObject *args) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000279{ \
280 TYPE arg1, arg2; \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000281 if (!PyArg_Parse(args,PARSESTR, &arg1, &arg2)) return NULL; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000282 return PyCursesCheckERR(X(self->win, arg1, arg2), # X); }
Guido van Rossum85738471995-02-17 13:50:17 +0000283
Guido van Rossumf6971e21994-08-30 12:25:20 +0000284/* ------------- WINDOW routines --------------- */
Guido van Rossum85738471995-02-17 13:50:17 +0000285
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000286Window_NoArgNoReturnFunction(untouchwin)
287Window_NoArgNoReturnFunction(touchwin)
288Window_NoArgNoReturnFunction(redrawwin)
289Window_NoArgNoReturnFunction(winsertln)
290Window_NoArgNoReturnFunction(werase)
291Window_NoArgNoReturnFunction(wdeleteln)
292
293Window_NoArgTrueFalseFunction(is_wintouched)
294
295Window_NoArgNoReturnVoidFunction(wsyncup)
296Window_NoArgNoReturnVoidFunction(wsyncdown)
297Window_NoArgNoReturnVoidFunction(wstandend)
298Window_NoArgNoReturnVoidFunction(wstandout)
299Window_NoArgNoReturnVoidFunction(wcursyncup)
300Window_NoArgNoReturnVoidFunction(wclrtoeol)
301Window_NoArgNoReturnVoidFunction(wclrtobot)
302Window_NoArgNoReturnVoidFunction(wclear)
303
304Window_OneArgNoReturnVoidFunction(idcok, int, "i;True(1) or False(0)")
305Window_OneArgNoReturnVoidFunction(immedok, int, "i;True(1) or False(0)")
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +0000306Window_OneArgNoReturnVoidFunction(wtimeout, int, "i;delay")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000307
308Window_NoArg2TupleReturnFunction(getyx, int, "(ii)")
309Window_NoArg2TupleReturnFunction(getbegyx, int, "(ii)")
310Window_NoArg2TupleReturnFunction(getmaxyx, int, "(ii)")
311Window_NoArg2TupleReturnFunction(getparyx, int, "(ii)")
312
313Window_OneArgNoReturnFunction(wattron, attr_t, "l;attr")
314Window_OneArgNoReturnFunction(wattroff, attr_t, "l;attr")
315Window_OneArgNoReturnFunction(wattrset, attr_t, "l;attr")
316Window_OneArgNoReturnFunction(clearok, int, "i;True(1) or False(0)")
317Window_OneArgNoReturnFunction(idlok, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000318#if defined(__NetBSD__)
319Window_OneArgNoReturnVoidFunction(keypad, int, "i;True(1) or False(0)")
320#else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000321Window_OneArgNoReturnFunction(keypad, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000322#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000323Window_OneArgNoReturnFunction(leaveok, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000324#if defined(__NetBSD__)
325Window_OneArgNoReturnVoidFunction(nodelay, int, "i;True(1) or False(0)")
326#else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000327Window_OneArgNoReturnFunction(nodelay, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000328#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000329Window_OneArgNoReturnFunction(notimeout, int, "i;True(1) or False(0)")
330Window_OneArgNoReturnFunction(scrollok, int, "i;True(1) or False(0)")
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000331Window_OneArgNoReturnFunction(winsdelln, int, "i;nlines")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000332Window_OneArgNoReturnFunction(syncok, int, "i;True(1) or False(0)")
333
334Window_TwoArgNoReturnFunction(mvwin, int, "(ii);y,x")
335Window_TwoArgNoReturnFunction(mvderwin, int, "(ii);y,x")
336Window_TwoArgNoReturnFunction(wmove, int, "(ii);y,x")
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000337#ifndef STRICT_SYSV_CURSES
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000338Window_TwoArgNoReturnFunction(wresize, int, "(ii);lines,columns")
339#endif
340
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000341/* Allocation and deallocation of Window Objects */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000342
Guido van Rossumf6971e21994-08-30 12:25:20 +0000343static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000344PyCursesWindow_New(WINDOW *win)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000345{
346 PyCursesWindowObject *wo;
Guido van Rossum85738471995-02-17 13:50:17 +0000347
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000348 wo = PyObject_NEW(PyCursesWindowObject, &PyCursesWindow_Type);
349 if (wo == NULL) return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000350 wo->win = win;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000351 return (PyObject *)wo;
352}
353
354static void
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000355PyCursesWindow_Dealloc(PyCursesWindowObject *wo)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000356{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000357 if (wo->win != stdscr) delwin(wo->win);
358 PyMem_DEL(wo);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000359}
360
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000361/* Addch, Addstr, Addnstr */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000362
363static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000364PyCursesWindow_AddCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000365{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000366 int rtn, x, y, use_xy = FALSE;
367 PyObject *temp;
368 chtype ch = 0;
369 attr_t attr = A_NORMAL;
370
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000371 switch (ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000372 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000373 if (!PyArg_Parse(args, "O;ch or int", &temp))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000374 return NULL;
375 break;
376 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000377 if (!PyArg_Parse(args, "(Ol);ch or int,attr", &temp, &attr))
Guido van Rossum85738471995-02-17 13:50:17 +0000378 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000379 break;
380 case 3:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000381 if (!PyArg_Parse(args,"(iiO);y,x,ch or int", &y, &x, &temp))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000382 return NULL;
383 use_xy = TRUE;
384 break;
385 case 4:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000386 if (!PyArg_Parse(args,"(iiOl);y,x,ch or int, attr",
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000387 &y, &x, &temp, &attr))
388 return NULL;
389 use_xy = TRUE;
390 break;
391 default:
392 PyErr_SetString(PyExc_TypeError, "addch requires 1 or 4 arguments");
393 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000394 }
Guido van Rossum85738471995-02-17 13:50:17 +0000395
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000396 if (!PyCurses_ConvertToChtype(temp, &ch)) {
397 PyErr_SetString(PyExc_TypeError, "argument 1 or 3 must be a ch or an int");
398 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000399 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000400
Guido van Rossumf6971e21994-08-30 12:25:20 +0000401 if (use_xy == TRUE)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000402 rtn = mvwaddch(self->win,y,x, ch | attr);
403 else {
404 rtn = waddch(self->win, ch | attr);
405 }
406 return PyCursesCheckERR(rtn, "addch");
Guido van Rossumf6971e21994-08-30 12:25:20 +0000407}
408
409static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000410PyCursesWindow_AddStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000411{
412 int rtn;
413 int x, y;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000414 char *str;
415 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
416 int use_xy = FALSE, use_attr = FALSE;
Guido van Rossum85738471995-02-17 13:50:17 +0000417
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000418 switch (ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000419 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000420 if (!PyArg_Parse(args,"s;str", &str))
Guido van Rossum85738471995-02-17 13:50:17 +0000421 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000422 break;
423 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000424 if (!PyArg_Parse(args,"(sl);str,attr", &str, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000425 return NULL;
426 use_attr = TRUE;
427 break;
428 case 3:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000429 if (!PyArg_Parse(args,"(iis);int,int,str", &y, &x, &str))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000430 return NULL;
431 use_xy = TRUE;
432 break;
433 case 4:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000434 if (!PyArg_Parse(args,"(iisl);int,int,str,attr", &y, &x, &str, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000435 return NULL;
436 use_xy = use_attr = TRUE;
437 break;
438 default:
439 PyErr_SetString(PyExc_TypeError, "addstr requires 1 to 4 arguments");
440 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000441 }
Guido van Rossum85738471995-02-17 13:50:17 +0000442
Guido van Rossumf6971e21994-08-30 12:25:20 +0000443 if (use_attr == TRUE) {
444 attr_old = getattrs(self->win);
445 wattrset(self->win,attr);
446 }
447 if (use_xy == TRUE)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000448 rtn = mvwaddstr(self->win,y,x,str);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000449 else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000450 rtn = waddstr(self->win,str);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000451 if (use_attr == TRUE)
452 wattrset(self->win,attr_old);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000453 return PyCursesCheckERR(rtn, "addstr");
454}
Guido van Rossum85738471995-02-17 13:50:17 +0000455
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000456static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000457PyCursesWindow_AddNStr(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000458{
459 int rtn, x, y, n;
460 char *str;
461 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
462 int use_xy = FALSE, use_attr = FALSE;
463
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000464 switch (ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000465 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000466 if (!PyArg_Parse(args,"(si);str,n", &str, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000467 return NULL;
468 break;
469 case 3:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000470 if (!PyArg_Parse(args,"(sil);str,n,attr", &str, &n, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000471 return NULL;
472 use_attr = TRUE;
473 break;
474 case 4:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000475 if (!PyArg_Parse(args,"(iisi);y,x,str,n", &y, &x, &str, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000476 return NULL;
477 use_xy = TRUE;
478 break;
479 case 5:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000480 if (!PyArg_Parse(args,"(iisil);y,x,str,n,attr", &y, &x, &str, &n, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000481 return NULL;
482 use_xy = use_attr = TRUE;
483 break;
484 default:
485 PyErr_SetString(PyExc_TypeError, "addnstr requires 2 to 5 arguments");
486 return NULL;
487 }
488
489 if (use_attr == TRUE) {
490 attr_old = getattrs(self->win);
491 wattrset(self->win,attr);
492 }
493 if (use_xy == TRUE)
494 rtn = mvwaddnstr(self->win,y,x,str,n);
495 else
496 rtn = waddnstr(self->win,str,n);
497 if (use_attr == TRUE)
498 wattrset(self->win,attr_old);
499 return PyCursesCheckERR(rtn, "addnstr");
500}
501
502static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000503PyCursesWindow_Bkgd(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000504{
505 PyObject *temp;
506 chtype bkgd;
507 attr_t attr = A_NORMAL;
508
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000509 switch (ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000510 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000511 if (!PyArg_Parse(args, "O;ch or int", &temp))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000512 return NULL;
513 break;
514 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000515 if (!PyArg_Parse(args,"(Ol);ch or int,attr", &temp, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000516 return NULL;
517 break;
518 default:
519 PyErr_SetString(PyExc_TypeError, "bkgd requires 1 or 2 arguments");
520 return NULL;
521 }
522
523 if (!PyCurses_ConvertToChtype(temp, &bkgd)) {
524 PyErr_SetString(PyExc_TypeError, "argument 1 or 3 must be a ch or an int");
525 return NULL;
526 }
527
528 return PyCursesCheckERR(wbkgd(self->win, bkgd | A_NORMAL), "bkgd");
529}
530
531static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000532PyCursesWindow_BkgdSet(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000533{
534 PyObject *temp;
535 chtype bkgd;
536 attr_t attr = A_NORMAL;
537
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000538 switch (ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000539 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000540 if (!PyArg_Parse(args, "O;ch or int", &temp))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000541 return NULL;
542 break;
543 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000544 if (!PyArg_Parse(args,"(Ol);ch or int,attr", &temp, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000545 return NULL;
546 break;
547 default:
548 PyErr_SetString(PyExc_TypeError, "bkgdset requires 1 or 2 arguments");
549 return NULL;
550 }
551
552 if (!PyCurses_ConvertToChtype(temp, &bkgd)) {
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000553 PyErr_SetString(PyExc_TypeError, "argument 1 must be a ch or an int");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000554 return NULL;
555 }
556
557 wbkgdset(self->win, bkgd | attr);
558 return PyCursesCheckERR(0, "bkgdset");
559}
560
561static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000562PyCursesWindow_Border(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000563{
564 chtype ls, rs, ts, bs, tl, tr, bl, br;
565 ls = rs = ts = bs = tl = tr = bl = br = 0;
566 if (!PyArg_Parse(args,"|llllllll;ls,rs,ts,bs,tl,tr,bl,br",
567 &ls, &rs, &ts, &bs, &tl, &tr, &bl, &br))
568 return NULL;
569 wborder(self->win, ls, rs, ts, bs, tl, tr, bl, br);
570 Py_INCREF(Py_None);
571 return Py_None;
572}
573
574static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000575PyCursesWindow_Box(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000576{
577 chtype ch1=0,ch2=0;
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000578 if (!PyArg_NoArgs(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000579 PyErr_Clear();
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000580 if (!PyArg_Parse(args,"(ll);vertint,horint", &ch1, &ch2))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000581 return NULL;
582 }
583 box(self->win,ch1,ch2);
584 Py_INCREF(Py_None);
585 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000586}
587
588static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000589PyCursesWindow_DelCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000590{
591 int rtn;
592 int x, y;
Guido van Rossum85738471995-02-17 13:50:17 +0000593
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000594 switch (ARG_COUNT(args)) {
Guido van Rossum85738471995-02-17 13:50:17 +0000595 case 0:
Guido van Rossumf6971e21994-08-30 12:25:20 +0000596 rtn = wdelch(self->win);
Guido van Rossum85738471995-02-17 13:50:17 +0000597 break;
598 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000599 if (!PyArg_Parse(args,"(ii);y,x", &y, &x))
Guido van Rossum85738471995-02-17 13:50:17 +0000600 return NULL;
601 rtn = mvwdelch(self->win,y,x);
602 break;
603 default:
604 PyErr_SetString(PyExc_TypeError, "delch requires 0 or 2 arguments");
605 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000606 }
Guido van Rossum85738471995-02-17 13:50:17 +0000607 return PyCursesCheckERR(rtn, "[mv]wdelch");
Guido van Rossumf6971e21994-08-30 12:25:20 +0000608}
609
610static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000611PyCursesWindow_DerWin(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000612{
613 WINDOW *win;
614 int nlines, ncols, begin_y, begin_x;
615
616 nlines = 0;
617 ncols = 0;
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000618 switch (ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000619 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000620 if (!PyArg_Parse(args,"(ii);begin_y,begin_x",&begin_y,&begin_x))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000621 return NULL;
622 break;
623 case 4:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000624 if (!PyArg_Parse(args, "(iiii);nlines,ncols,begin_y,begin_x",
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000625 &nlines,&ncols,&begin_y,&begin_x))
626 return NULL;
627 break;
628 default:
629 PyErr_SetString(PyExc_TypeError, "derwin requires 2 or 4 arguments");
630 return NULL;
631 }
632
633 win = derwin(self->win,nlines,ncols,begin_y,begin_x);
634
635 if (win == NULL) {
636 PyErr_SetString(PyCursesError, catchall_NULL);
637 return NULL;
638 }
639
640 return (PyObject *)PyCursesWindow_New(win);
641}
642
643static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000644PyCursesWindow_EchoChar(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000645{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000646 PyObject *temp;
647 chtype ch;
648 attr_t attr = A_NORMAL;
Guido van Rossum85738471995-02-17 13:50:17 +0000649
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000650 switch (ARG_COUNT(args)) {
Guido van Rossum85738471995-02-17 13:50:17 +0000651 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000652 if (!PyArg_Parse(args,"O;ch or int", &temp))
Guido van Rossum85738471995-02-17 13:50:17 +0000653 return NULL;
Guido van Rossum85738471995-02-17 13:50:17 +0000654 break;
655 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000656 if (!PyArg_Parse(args,"(Ol);ch or int,attr", &temp, &attr))
Guido van Rossum85738471995-02-17 13:50:17 +0000657 return NULL;
Guido van Rossum85738471995-02-17 13:50:17 +0000658 break;
659 default:
660 PyErr_SetString(PyExc_TypeError, "echochar requires 1 or 2 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000661
662
Guido van Rossum85738471995-02-17 13:50:17 +0000663 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000664 }
Guido van Rossum85738471995-02-17 13:50:17 +0000665
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000666 if (!PyCurses_ConvertToChtype(temp, &ch)) {
667 PyErr_SetString(PyExc_TypeError, "argument 1 must be a ch or an int");
Guido van Rossum85738471995-02-17 13:50:17 +0000668 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000669 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000670
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000671#if !defined(__NetBSD__)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000672 if (self->win->_flags & _ISPAD)
673 return PyCursesCheckERR(pechochar(self->win, ch | attr),
674 "echochar");
Guido van Rossumf6971e21994-08-30 12:25:20 +0000675 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000676#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000677 return PyCursesCheckERR(wechochar(self->win, ch | attr),
678 "echochar");
Guido van Rossumf6971e21994-08-30 12:25:20 +0000679}
680
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +0000681#ifdef NCURSES_MOUSE_VERSION
682static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000683PyCursesWindow_Enclose(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +0000684{
685 int x, y;
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000686 if (!PyArg_Parse(args,"(ii);y,x", &y, &x))
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +0000687 return NULL;
688
689 return PyInt_FromLong( wenclose(self->win,y,x) );
690}
691#endif
692
Guido van Rossumf6971e21994-08-30 12:25:20 +0000693static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000694PyCursesWindow_GetBkgd(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000695{
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000696 if (!PyArg_NoArgs(args))
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000697 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000698 return PyInt_FromLong((long) getbkgd(self->win));
Guido van Rossumf6971e21994-08-30 12:25:20 +0000699}
700
701static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000702PyCursesWindow_GetCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000703{
704 int x, y;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000705 chtype rtn;
Guido van Rossum85738471995-02-17 13:50:17 +0000706
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000707 switch (ARG_COUNT(args)) {
Guido van Rossum85738471995-02-17 13:50:17 +0000708 case 0:
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000709 Py_BEGIN_ALLOW_THREADS
Guido van Rossumf6971e21994-08-30 12:25:20 +0000710 rtn = wgetch(self->win);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000711 Py_END_ALLOW_THREADS
Guido van Rossum85738471995-02-17 13:50:17 +0000712 break;
713 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000714 if (!PyArg_Parse(args,"(ii);y,x",&y,&x))
Guido van Rossum85738471995-02-17 13:50:17 +0000715 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000716 Py_BEGIN_ALLOW_THREADS
Guido van Rossum85738471995-02-17 13:50:17 +0000717 rtn = mvwgetch(self->win,y,x);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000718 Py_END_ALLOW_THREADS
Guido van Rossum85738471995-02-17 13:50:17 +0000719 break;
720 default:
721 PyErr_SetString(PyExc_TypeError, "getch requires 0 or 2 arguments");
722 return NULL;
723 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000724 return PyInt_FromLong(rtn);
725}
Guido van Rossum85738471995-02-17 13:50:17 +0000726
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000727static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000728PyCursesWindow_GetKey(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000729{
730 int x, y;
731 chtype rtn;
732
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000733 switch (ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000734 case 0:
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000735 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000736 rtn = wgetch(self->win);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000737 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000738 break;
739 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000740 if (!PyArg_Parse(args,"(ii);y,x",&y,&x))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000741 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000742 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000743 rtn = mvwgetch(self->win,y,x);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000744 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000745 break;
746 default:
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000747 PyErr_SetString(PyExc_TypeError, "getkey requires 0 or 2 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000748 return NULL;
749 }
750 if (rtn<=255)
751 return Py_BuildValue("c", rtn);
752 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000753#if defined(__NetBSD__)
754 return PyString_FromString(unctrl(rtn));
755#else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000756 return PyString_FromString((char *)keyname(rtn));
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000757#endif
Guido van Rossumf6971e21994-08-30 12:25:20 +0000758}
759
760static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000761PyCursesWindow_GetStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000762{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000763 int x, y, n;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000764 char rtn[1024]; /* This should be big enough.. I hope */
765 int rtn2;
Guido van Rossum85738471995-02-17 13:50:17 +0000766
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000767 switch (ARG_COUNT(args)) {
Guido van Rossum85738471995-02-17 13:50:17 +0000768 case 0:
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000769 Py_BEGIN_ALLOW_THREADS
Guido van Rossumf6971e21994-08-30 12:25:20 +0000770 rtn2 = wgetstr(self->win,rtn);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000771 Py_END_ALLOW_THREADS
Guido van Rossum85738471995-02-17 13:50:17 +0000772 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000773 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000774 if (!PyArg_Parse(args,"i;n", &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000775 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000776 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000777 rtn2 = wgetnstr(self->win,rtn,n);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000778 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000779 break;
Guido van Rossum85738471995-02-17 13:50:17 +0000780 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000781 if (!PyArg_Parse(args,"(ii);y,x",&y,&x))
Guido van Rossum85738471995-02-17 13:50:17 +0000782 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000783 Py_BEGIN_ALLOW_THREADS
Guido van Rossum85738471995-02-17 13:50:17 +0000784 rtn2 = mvwgetstr(self->win,y,x,rtn);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000785 Py_END_ALLOW_THREADS
Guido van Rossum85738471995-02-17 13:50:17 +0000786 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000787 case 3:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000788 if (!PyArg_Parse(args,"(iii);y,x,n", &y, &x, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000789 return NULL;
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000790#ifdef STRICT_SYSV_CURSES
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000791 /* Untested */
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000792 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000793 rtn2 = wmove(self->win,y,x)==ERR ? ERR :
794 wgetnstr(self->win, rtn, n);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000795 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000796#else
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000797 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000798 rtn2 = mvwgetnstr(self->win, y, x, rtn, n);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000799 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000800#endif
801 break;
Guido van Rossum85738471995-02-17 13:50:17 +0000802 default:
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000803 PyErr_SetString(PyExc_TypeError, "getstr requires 0 to 2 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +0000804 return NULL;
805 }
Guido van Rossumf6971e21994-08-30 12:25:20 +0000806 if (rtn2 == ERR)
807 rtn[0] = 0;
Guido van Rossum85738471995-02-17 13:50:17 +0000808 return PyString_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000809}
810
811static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000812PyCursesWindow_Hline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000813{
814 PyObject *temp;
815 chtype ch;
816 int n, x, y, code = OK;
817 attr_t attr = A_NORMAL;
818
819 switch (ARG_COUNT(args)) {
820 case 2:
821 if (!PyArg_Parse(args, "(Oi);ch or int,n", &temp, &n))
822 return NULL;
823 break;
824 case 3:
825 if (!PyArg_Parse(args, "(Oil);ch or int,n,attr", &temp, &n, &attr))
826 return NULL;
827 break;
828 case 4:
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000829 if (!PyArg_Parse(args, "(iiOi);y,x,ch or int,n", &y, &x, &temp, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000830 return NULL;
831 code = wmove(self->win, y, x);
832 break;
833 case 5:
834 if (!PyArg_Parse(args, "(iiOil); y,x,ch or int,n,attr",
835 &y, &x, &temp, &n, &attr))
836 return NULL;
837 code = wmove(self->win, y, x);
838 default:
839 PyErr_SetString(PyExc_TypeError, "hline requires 2 or 5 arguments");
840 return NULL;
841 }
842
843 if (code != ERR) {
844 if (!PyCurses_ConvertToChtype(temp, &ch)) {
845 PyErr_SetString(PyExc_TypeError,
846 "argument 1 or 3 must be a ch or an int");
847 return NULL;
848 }
849 return PyCursesCheckERR(whline(self->win, ch | attr, n), "hline");
850 } else
851 return PyCursesCheckERR(code, "wmove");
852}
853
854static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000855PyCursesWindow_InsCh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000856{
857 int rtn, x, y, use_xy = FALSE;
858 PyObject *temp;
859 chtype ch = 0;
860 attr_t attr = A_NORMAL;
861
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000862 switch (ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000863 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000864 if (!PyArg_Parse(args, "O;ch or int", &temp))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000865 return NULL;
866 break;
867 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000868 if (!PyArg_Parse(args, "(Ol);ch or int,attr", &temp, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000869 return NULL;
870 break;
871 case 3:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000872 if (!PyArg_Parse(args,"(iiO);y,x,ch or int", &y, &x, &temp))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000873 return NULL;
874 use_xy = TRUE;
875 break;
876 case 4:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000877 if (!PyArg_Parse(args,"(iiOl);y,x,ch or int, attr", &y, &x, &temp, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000878 return NULL;
879 use_xy = TRUE;
880 break;
881 default:
882 PyErr_SetString(PyExc_TypeError, "insch requires 1 or 4 arguments");
883 return NULL;
884 }
885
886 if (!PyCurses_ConvertToChtype(temp, &ch)) {
887 PyErr_SetString(PyExc_TypeError,
888 "argument 1 or 3 must be a ch or an int");
889 return NULL;
890 }
891
892 if (use_xy == TRUE)
893 rtn = mvwinsch(self->win,y,x, ch | attr);
894 else {
895 rtn = winsch(self->win, ch | attr);
896 }
897 return PyCursesCheckERR(rtn, "insch");
898}
899
900static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000901PyCursesWindow_InCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000902{
Guido van Rossum85738471995-02-17 13:50:17 +0000903 int x, y, rtn;
904
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000905 switch (ARG_COUNT(args)) {
Guido van Rossum85738471995-02-17 13:50:17 +0000906 case 0:
Guido van Rossumf6971e21994-08-30 12:25:20 +0000907 rtn = winch(self->win);
Guido van Rossum85738471995-02-17 13:50:17 +0000908 break;
909 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000910 if (!PyArg_Parse(args,"(ii);y,x",&y,&x))
Guido van Rossum85738471995-02-17 13:50:17 +0000911 return NULL;
912 rtn = mvwinch(self->win,y,x);
913 break;
914 default:
915 PyErr_SetString(PyExc_TypeError, "inch requires 0 or 2 arguments");
916 return NULL;
917 }
Guido van Rossum85738471995-02-17 13:50:17 +0000918 return PyInt_FromLong((long) rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000919}
920
921static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000922PyCursesWindow_InStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000923{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000924 int x, y, n;
925 char rtn[1024]; /* This should be big enough.. I hope */
926 int rtn2;
927
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000928 switch (ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000929 case 0:
930 rtn2 = winstr(self->win,rtn);
931 break;
932 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000933 if (!PyArg_Parse(args,"i;n", &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000934 return NULL;
935 rtn2 = winnstr(self->win,rtn,n);
936 break;
937 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000938 if (!PyArg_Parse(args,"(ii);y,x",&y,&x))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000939 return NULL;
940 rtn2 = mvwinstr(self->win,y,x,rtn);
941 break;
942 case 3:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000943 if (!PyArg_Parse(args, "(iii);y,x,n", &y, &x, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000944 return NULL;
945 rtn2 = mvwinnstr(self->win, y, x, rtn, n);
946 break;
947 default:
948 PyErr_SetString(PyExc_TypeError, "instr requires 0 or 3 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +0000949 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000950 }
951 if (rtn2 == ERR)
952 rtn[0] = 0;
953 return PyString_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000954}
955
956static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000957PyCursesWindow_InsStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000958{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000959 int rtn;
960 int x, y;
961 char *str;
962 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
963 int use_xy = FALSE, use_attr = FALSE;
964
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000965 switch (ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000966 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000967 if (!PyArg_Parse(args,"s;str", &str))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000968 return NULL;
969 break;
970 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000971 if (!PyArg_Parse(args,"(sl);str,attr", &str, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000972 return NULL;
973 use_attr = TRUE;
974 break;
975 case 3:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000976 if (!PyArg_Parse(args,"(iis);y,x,str", &y, &x, &str))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000977 return NULL;
978 use_xy = TRUE;
979 break;
980 case 4:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000981 if (!PyArg_Parse(args,"(iisl);y,x,str,attr", &y, &x, &str, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000982 return NULL;
983 use_xy = use_attr = TRUE;
984 break;
985 default:
986 PyErr_SetString(PyExc_TypeError, "insstr requires 1 to 4 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +0000987 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000988 }
989
990 if (use_attr == TRUE) {
991 attr_old = getattrs(self->win);
992 wattrset(self->win,attr);
993 }
994 if (use_xy == TRUE)
995 rtn = mvwinsstr(self->win,y,x,str);
996 else
997 rtn = winsstr(self->win,str);
998 if (use_attr == TRUE)
999 wattrset(self->win,attr_old);
1000 return PyCursesCheckERR(rtn, "insstr");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001001}
1002
1003static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001004PyCursesWindow_InsNStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001005{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001006 int rtn, x, y, n;
1007 char *str;
1008 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
1009 int use_xy = FALSE, use_attr = FALSE;
1010
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001011 switch (ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001012 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001013 if (!PyArg_Parse(args,"(si);str,n", &str, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001014 return NULL;
1015 break;
1016 case 3:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001017 if (!PyArg_Parse(args,"(sil);str,n,attr", &str, &n, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001018 return NULL;
1019 use_attr = TRUE;
1020 break;
1021 case 4:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001022 if (!PyArg_Parse(args,"(iisi);y,x,str,n", &y, &x, &str, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001023 return NULL;
1024 use_xy = TRUE;
1025 break;
1026 case 5:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001027 if (!PyArg_Parse(args,"(iisil);y,x,str,n,attr", &y, &x, &str, &n, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001028 return NULL;
1029 use_xy = use_attr = TRUE;
1030 break;
1031 default:
1032 PyErr_SetString(PyExc_TypeError, "insnstr requires 2 to 5 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +00001033 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001034 }
1035
1036 if (use_attr == TRUE) {
1037 attr_old = getattrs(self->win);
1038 wattrset(self->win,attr);
1039 }
1040 if (use_xy == TRUE)
1041 rtn = mvwinsnstr(self->win,y,x,str,n);
1042 else
1043 rtn = winsnstr(self->win,str,n);
1044 if (use_attr == TRUE)
1045 wattrset(self->win,attr_old);
1046 return PyCursesCheckERR(rtn, "insnstr");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001047}
1048
1049static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001050PyCursesWindow_Is_LineTouched(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001051{
1052 int line, erg;
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001053 if (!PyArg_Parse(args,"i;line", &line))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001054 return NULL;
1055 erg = is_linetouched(self->win, line);
1056 if (erg == ERR) {
1057 PyErr_SetString(PyExc_TypeError,
1058 "is_linetouched: line number outside of boundaries");
1059 return NULL;
1060 } else
1061 if (erg == FALSE) {
1062 Py_INCREF(Py_False);
1063 return Py_False;
1064 } else {
1065 Py_INCREF(Py_True);
1066 return Py_True;
1067 }
1068}
1069
1070static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001071PyCursesWindow_NoOutRefresh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001072{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001073 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001074 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001075
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001076#if defined(__NetBSD__)
1077 if (0) {
1078#else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001079 if (self->win->_flags & _ISPAD) {
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001080#endif
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001081 switch(ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001082 case 6:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001083 if (!PyArg_Parse(args,
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001084 "(iiiiii);" \
1085 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1086 &pminrow, &pmincol, &sminrow,
1087 &smincol, &smaxrow, &smaxcol))
1088 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001089 Py_BEGIN_ALLOW_THREADS
1090 rtn = pnoutrefresh(self->win,
1091 pminrow, pmincol, sminrow,
Andrew M. Kuchlingb6e46872000-06-27 15:01:10 +00001092 smincol, smaxrow, smaxcol);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001093 Py_END_ALLOW_THREADS
1094 return PyCursesCheckERR(rtn, "pnoutrefresh");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001095 default:
1096 PyErr_SetString(PyCursesError,
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001097 "noutrefresh() called for a pad "
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001098 "requires 6 arguments");
1099 return NULL;
1100 }
1101 } else {
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001102 if (!PyArg_NoArgs(args))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001103 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001104
1105 Py_BEGIN_ALLOW_THREADS
1106 rtn = wnoutrefresh(self->win);
1107 Py_END_ALLOW_THREADS
1108 return PyCursesCheckERR(rtn, "wnoutrefresh");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001109 }
1110}
1111
1112static PyObject *
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001113PyCursesWindow_Overlay(PyCursesWindowObject *self, PyObject *args)
1114{
1115 PyCursesWindowObject *temp;
1116 int use_copywin = FALSE;
1117 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1118 int rtn;
1119
1120 switch (ARG_COUNT(args)) {
1121 case 1:
1122 if (!PyArg_ParseTuple(args, "O!;window object",
1123 &PyCursesWindow_Type, &temp))
1124 return NULL;
1125 break;
1126 case 7:
1127 if (!PyArg_ParseTuple(args, "(O!iiiiii);window object, int, int, int, int, int, int",
1128 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1129 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1130 return NULL;
1131 use_copywin = TRUE;
1132 break;
1133 default:
1134 PyErr_SetString(PyExc_TypeError,
1135 "overlay requires one or seven arguments");
1136 return NULL;
1137 }
1138
1139 if (use_copywin == TRUE) {
1140 rtn = copywin(self->win, temp->win, sminrow, smincol,
1141 dminrow, dmincol, dmaxrow, dmaxcol, TRUE);
1142 return PyCursesCheckERR(rtn, "copywin");
1143 }
1144 else {
1145 rtn = overlay(self->win, temp->win);
1146 return PyCursesCheckERR(rtn, "overlay");
1147 }
1148}
1149
1150static PyObject *
1151PyCursesWindow_Overwrite(PyCursesWindowObject *self, PyObject *args)
1152{
1153 PyCursesWindowObject *temp;
1154 int use_copywin = FALSE;
1155 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1156 int rtn;
1157
1158 switch (ARG_COUNT(args)) {
1159 case 1:
1160 if (!PyArg_ParseTuple(args, "O!;window object",
1161 &PyCursesWindow_Type, &temp))
1162 return NULL;
1163 break;
1164 case 7:
1165 if (!PyArg_ParseTuple(args, "(O!iiiiii);window object, int, int, int, int, int, int",
1166 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1167 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1168 return NULL;
1169 use_copywin = TRUE;
1170 break;
1171 default:
1172 PyErr_SetString(PyExc_TypeError,
1173 "overwrite requires one or seven arguments");
1174 return NULL;
1175 }
1176
1177 if (use_copywin == TRUE) {
1178 rtn = copywin(self->win, temp->win, sminrow, smincol,
1179 dminrow, dmincol, dmaxrow, dmaxcol, FALSE);
1180 return PyCursesCheckERR(rtn, "copywin");
1181 }
1182 else {
1183 rtn = overwrite(self->win, temp->win);
1184 return PyCursesCheckERR(rtn, "overwrite");
1185 }
1186}
1187
1188static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001189PyCursesWindow_PutWin(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001190{
1191 PyObject *temp;
1192
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001193 if (!PyArg_Parse(args, "O;fileobj", &temp))
Guido van Rossum85738471995-02-17 13:50:17 +00001194 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001195 if (!PyFile_Check(temp)) {
1196 PyErr_SetString(PyExc_TypeError, "argument must be a file object");
1197 return NULL;
1198 }
1199 return PyCursesCheckERR(putwin(self->win, PyFile_AsFile(temp)),
1200 "putwin");
1201}
1202
1203static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001204PyCursesWindow_RedrawLine(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001205{
1206 int beg, num;
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001207 if (!PyArg_Parse(args,"(ii);beg,num", &beg, &num))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001208 return NULL;
1209 return PyCursesCheckERR(wredrawln(self->win,beg,num), "redrawln");
1210}
1211
1212static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001213PyCursesWindow_Refresh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001214{
1215 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001216 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001217
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001218#if defined(__NetBSD__)
1219 if (0) {
1220#else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001221 if (self->win->_flags & _ISPAD) {
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001222#endif
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001223 switch(ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001224 case 6:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001225 if (!PyArg_Parse(args,
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001226 "(iiiiii);" \
1227 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1228 &pminrow, &pmincol, &sminrow,
1229 &smincol, &smaxrow, &smaxcol))
1230 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001231
1232 Py_BEGIN_ALLOW_THREADS
1233 rtn = prefresh(self->win,
1234 pminrow, pmincol, sminrow,
Andrew M. Kuchlingb6e46872000-06-27 15:01:10 +00001235 smincol, smaxrow, smaxcol);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001236 Py_END_ALLOW_THREADS
1237 return PyCursesCheckERR(rtn, "prefresh");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001238 default:
1239 PyErr_SetString(PyCursesError,
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001240 "refresh() for a pad requires 6 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001241 return NULL;
1242 }
1243 } else {
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001244 if (!PyArg_NoArgs(args))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001245 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001246 Py_BEGIN_ALLOW_THREADS
1247 rtn = wrefresh(self->win);
1248 Py_END_ALLOW_THREADS
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001249 return PyCursesCheckERR(rtn, "prefresh");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001250 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001251}
1252
1253static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001254PyCursesWindow_SetScrollRegion(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001255{
1256 int x, y;
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001257 if (!PyArg_Parse(args,"(ii);top, bottom",&y,&x))
Guido van Rossum85738471995-02-17 13:50:17 +00001258 return NULL;
1259 return PyCursesCheckERR(wsetscrreg(self->win,y,x), "wsetscrreg");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001260}
1261
1262static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001263PyCursesWindow_SubWin(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001264{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001265 WINDOW *win;
1266 int nlines, ncols, begin_y, begin_x;
1267
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001268 nlines = 0;
1269 ncols = 0;
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001270 switch (ARG_COUNT(args)) {
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001271 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001272 if (!PyArg_Parse(args,"(ii);begin_y,begin_x",&begin_y,&begin_x))
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001273 return NULL;
1274 break;
1275 case 4:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001276 if (!PyArg_Parse(args, "(iiii);nlines,ncols,begin_y,begin_x",
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001277 &nlines,&ncols,&begin_y,&begin_x))
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001278 return NULL;
1279 break;
1280 default:
1281 PyErr_SetString(PyExc_TypeError, "subwin requires 2 or 4 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +00001282 return NULL;
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001283 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001284
Andrew M. Kuchling8353f622000-07-26 18:36:27 +00001285 /* printf("Subwin: %i %i %i %i \n", nlines, ncols, begin_y, begin_x); */
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001286#if !defined(__NetBSD__)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001287 if (self->win->_flags & _ISPAD)
1288 win = subpad(self->win, nlines, ncols, begin_y, begin_x);
1289 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001290#endif
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001291 win = subwin(self->win, nlines, ncols, begin_y, begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001292
1293 if (win == NULL) {
1294 PyErr_SetString(PyCursesError, catchall_NULL);
1295 return NULL;
1296 }
1297
1298 return (PyObject *)PyCursesWindow_New(win);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001299}
1300
1301static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001302PyCursesWindow_Scroll(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001303{
Andrew M. Kuchlinge1c43522001-01-29 20:31:29 +00001304 int nlines;
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001305 switch(ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001306 case 0:
1307 return PyCursesCheckERR(scroll(self->win), "scroll");
1308 break;
1309 case 1:
Andrew M. Kuchlinge1c43522001-01-29 20:31:29 +00001310 if (!PyArg_Parse(args, "i;nlines", &nlines))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001311 return NULL;
Andrew M. Kuchlinge1c43522001-01-29 20:31:29 +00001312 return PyCursesCheckERR(wscrl(self->win, nlines), "scroll");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001313 default:
1314 PyErr_SetString(PyExc_TypeError, "scroll requires 0 or 1 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +00001315 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001316 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001317}
1318
1319static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001320PyCursesWindow_TouchLine(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001321{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001322 int st, cnt, val;
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001323 switch (ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001324 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001325 if (!PyArg_Parse(args,"(ii);start,count",&st,&cnt))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001326 return NULL;
1327 return PyCursesCheckERR(touchline(self->win,st,cnt), "touchline");
1328 break;
1329 case 3:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001330 if (!PyArg_Parse(args, "(iii);start,count,val", &st, &cnt, &val))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001331 return NULL;
1332 return PyCursesCheckERR(wtouchln(self->win, st, cnt, val), "touchline");
1333 default:
1334 PyErr_SetString(PyExc_TypeError, "touchline requires 2 or 3 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +00001335 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001336 }
1337}
1338
1339static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001340PyCursesWindow_Vline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001341{
1342 PyObject *temp;
1343 chtype ch;
1344 int n, x, y, code = OK;
1345 attr_t attr = A_NORMAL;
1346
1347 switch (ARG_COUNT(args)) {
1348 case 2:
1349 if (!PyArg_Parse(args, "(Oi);ch or int,n", &temp, &n))
1350 return NULL;
1351 break;
1352 case 3:
1353 if (!PyArg_Parse(args, "(Oil);ch or int,n,attr", &temp, &n, &attr))
1354 return NULL;
1355 break;
1356 case 4:
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001357 if (!PyArg_Parse(args, "(iiOi);y,x,ch or int,n", &y, &x, &temp, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001358 return NULL;
1359 code = wmove(self->win, y, x);
1360 break;
1361 case 5:
1362 if (!PyArg_Parse(args, "(iiOil); y,x,ch or int,n,attr",
1363 &y, &x, &temp, &n, &attr))
1364 return NULL;
1365 code = wmove(self->win, y, x);
1366 default:
1367 PyErr_SetString(PyExc_TypeError, "vline requires 2 or 5 arguments");
1368 return NULL;
1369 }
1370
1371 if (code != ERR) {
1372 if (!PyCurses_ConvertToChtype(temp, &ch)) {
1373 PyErr_SetString(PyExc_TypeError,
1374 "argument 1 or 3 must be a ch or an int");
1375 return NULL;
1376 }
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001377 return PyCursesCheckERR(wvline(self->win, ch | attr, n), "vline");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001378 } else
1379 return PyCursesCheckERR(code, "wmove");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001380}
1381
1382static PyMethodDef PyCursesWindow_Methods[] = {
Sjoerd Mullender14ece161995-03-17 12:18:38 +00001383 {"addch", (PyCFunction)PyCursesWindow_AddCh},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001384 {"addnstr", (PyCFunction)PyCursesWindow_AddNStr},
Sjoerd Mullender14ece161995-03-17 12:18:38 +00001385 {"addstr", (PyCFunction)PyCursesWindow_AddStr},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001386 {"attroff", (PyCFunction)PyCursesWindow_wattroff},
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001387 {"attron", (PyCFunction)PyCursesWindow_wattron},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001388 {"attrset", (PyCFunction)PyCursesWindow_wattrset},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001389 {"bkgd", (PyCFunction)PyCursesWindow_Bkgd},
1390 {"bkgdset", (PyCFunction)PyCursesWindow_BkgdSet},
Sjoerd Mullender14ece161995-03-17 12:18:38 +00001391 {"border", (PyCFunction)PyCursesWindow_Border, METH_VARARGS},
1392 {"box", (PyCFunction)PyCursesWindow_Box},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001393 {"clear", (PyCFunction)PyCursesWindow_wclear},
1394 {"clearok", (PyCFunction)PyCursesWindow_clearok},
1395 {"clrtobot", (PyCFunction)PyCursesWindow_wclrtobot},
1396 {"clrtoeol", (PyCFunction)PyCursesWindow_wclrtoeol},
1397 {"cursyncup", (PyCFunction)PyCursesWindow_wcursyncup},
1398 {"delch", (PyCFunction)PyCursesWindow_DelCh},
1399 {"deleteln", (PyCFunction)PyCursesWindow_wdeleteln},
1400 {"derwin", (PyCFunction)PyCursesWindow_DerWin},
1401 {"echochar", (PyCFunction)PyCursesWindow_EchoChar},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001402#ifdef NCURSES_MOUSE_VERSION
1403 {"enclose", (PyCFunction)PyCursesWindow_Enclose},
1404#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001405 {"erase", (PyCFunction)PyCursesWindow_werase},
1406 {"getbegyx", (PyCFunction)PyCursesWindow_getbegyx},
1407 {"getbkgd", (PyCFunction)PyCursesWindow_GetBkgd},
Sjoerd Mullender14ece161995-03-17 12:18:38 +00001408 {"getch", (PyCFunction)PyCursesWindow_GetCh},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001409 {"getkey", (PyCFunction)PyCursesWindow_GetKey},
1410 {"getmaxyx", (PyCFunction)PyCursesWindow_getmaxyx},
1411 {"getparyx", (PyCFunction)PyCursesWindow_getparyx},
Sjoerd Mullender14ece161995-03-17 12:18:38 +00001412 {"getstr", (PyCFunction)PyCursesWindow_GetStr},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001413 {"getyx", (PyCFunction)PyCursesWindow_getyx},
1414 {"hline", (PyCFunction)PyCursesWindow_Hline},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001415 {"idcok", (PyCFunction)PyCursesWindow_idcok},
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001416 {"idlok", (PyCFunction)PyCursesWindow_idlok},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001417 {"immedok", (PyCFunction)PyCursesWindow_immedok},
Sjoerd Mullender14ece161995-03-17 12:18:38 +00001418 {"inch", (PyCFunction)PyCursesWindow_InCh},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001419 {"insch", (PyCFunction)PyCursesWindow_InsCh},
1420 {"insdelln", (PyCFunction)PyCursesWindow_winsdelln},
1421 {"insertln", (PyCFunction)PyCursesWindow_winsertln},
1422 {"insnstr", (PyCFunction)PyCursesWindow_InsNStr},
1423 {"insstr", (PyCFunction)PyCursesWindow_InsStr},
1424 {"instr", (PyCFunction)PyCursesWindow_InStr},
1425 {"is_linetouched", (PyCFunction)PyCursesWindow_Is_LineTouched},
1426 {"is_wintouched", (PyCFunction)PyCursesWindow_is_wintouched},
1427 {"keypad", (PyCFunction)PyCursesWindow_keypad},
1428 {"leaveok", (PyCFunction)PyCursesWindow_leaveok},
1429 {"move", (PyCFunction)PyCursesWindow_wmove},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001430 {"mvderwin", (PyCFunction)PyCursesWindow_mvderwin},
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001431 {"mvwin", (PyCFunction)PyCursesWindow_mvwin},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001432 {"nodelay", (PyCFunction)PyCursesWindow_nodelay},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001433 {"notimeout", (PyCFunction)PyCursesWindow_notimeout},
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001434 {"noutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh},
Andrew M. Kuchlinga98e92b2000-08-20 23:37:02 +00001435 /* Backward compatibility alias -- remove in Python 2.1 */
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001436 {"nooutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh},
1437 {"overlay", (PyCFunction)PyCursesWindow_Overlay, METH_VARARGS},
1438 {"overwrite", (PyCFunction)PyCursesWindow_Overwrite, METH_VARARGS},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001439 {"putwin", (PyCFunction)PyCursesWindow_PutWin},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001440 {"redrawln", (PyCFunction)PyCursesWindow_RedrawLine},
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001441 {"redrawwin", (PyCFunction)PyCursesWindow_redrawwin},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001442 {"refresh", (PyCFunction)PyCursesWindow_Refresh},
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00001443#ifndef STRICT_SYSV_CURSES
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001444 {"resize", (PyCFunction)PyCursesWindow_wresize},
1445#endif
1446 {"scroll", (PyCFunction)PyCursesWindow_Scroll},
1447 {"scrollok", (PyCFunction)PyCursesWindow_scrollok},
Sjoerd Mullender14ece161995-03-17 12:18:38 +00001448 {"setscrreg", (PyCFunction)PyCursesWindow_SetScrollRegion},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001449 {"standend", (PyCFunction)PyCursesWindow_wstandend},
1450 {"standout", (PyCFunction)PyCursesWindow_wstandout},
1451 {"subpad", (PyCFunction)PyCursesWindow_SubWin},
1452 {"subwin", (PyCFunction)PyCursesWindow_SubWin},
1453 {"syncdown", (PyCFunction)PyCursesWindow_wsyncdown},
1454 {"syncok", (PyCFunction)PyCursesWindow_syncok},
1455 {"syncup", (PyCFunction)PyCursesWindow_wsyncup},
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00001456 {"timeout", (PyCFunction)PyCursesWindow_wtimeout},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001457 {"touchline", (PyCFunction)PyCursesWindow_TouchLine},
1458 {"touchwin", (PyCFunction)PyCursesWindow_touchwin},
1459 {"untouchwin", (PyCFunction)PyCursesWindow_untouchwin},
1460 {"vline", (PyCFunction)PyCursesWindow_Vline},
Guido van Rossum585c6dc1995-02-24 13:45:43 +00001461 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00001462};
1463
1464static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001465PyCursesWindow_GetAttr(PyCursesWindowObject *self, char *name)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001466{
Guido van Rossuma597dde1995-01-10 20:56:29 +00001467 return Py_FindMethod(PyCursesWindow_Methods, (PyObject *)self, name);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001468}
1469
Guido van Rossumf6971e21994-08-30 12:25:20 +00001470/* -------------------------------------------------------*/
Guido van Rossum85738471995-02-17 13:50:17 +00001471
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001472PyTypeObject PyCursesWindow_Type = {
Guido van Rossum6915c4d2001-01-19 00:28:08 +00001473 PyObject_HEAD_INIT(NULL)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001474 0, /*ob_size*/
1475 "curses window", /*tp_name*/
1476 sizeof(PyCursesWindowObject), /*tp_basicsize*/
1477 0, /*tp_itemsize*/
1478 /* methods */
1479 (destructor)PyCursesWindow_Dealloc, /*tp_dealloc*/
1480 0, /*tp_print*/
1481 (getattrfunc)PyCursesWindow_GetAttr, /*tp_getattr*/
1482 (setattrfunc)0, /*tp_setattr*/
1483 0, /*tp_compare*/
1484 0, /*tp_repr*/
1485 0, /*tp_as_number*/
1486 0, /*tp_as_sequence*/
1487 0, /*tp_as_mapping*/
1488 0, /*tp_hash*/
1489};
1490
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001491/*********************************************************************
1492 Global Functions
1493**********************************************************************/
Guido van Rossumf6971e21994-08-30 12:25:20 +00001494
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001495NoArgNoReturnFunction(beep)
1496NoArgNoReturnFunction(def_prog_mode)
1497NoArgNoReturnFunction(def_shell_mode)
1498NoArgNoReturnFunction(doupdate)
1499NoArgNoReturnFunction(endwin)
1500NoArgNoReturnFunction(flash)
1501NoArgNoReturnFunction(nocbreak)
1502NoArgNoReturnFunction(noecho)
1503NoArgNoReturnFunction(nonl)
1504NoArgNoReturnFunction(noraw)
1505NoArgNoReturnFunction(reset_prog_mode)
1506NoArgNoReturnFunction(reset_shell_mode)
1507NoArgNoReturnFunction(resetty)
1508NoArgNoReturnFunction(savetty)
1509
1510NoArgOrFlagNoReturnFunction(cbreak)
1511NoArgOrFlagNoReturnFunction(echo)
1512NoArgOrFlagNoReturnFunction(nl)
1513NoArgOrFlagNoReturnFunction(raw)
1514
1515NoArgReturnIntFunction(baudrate)
1516NoArgReturnIntFunction(termattrs)
1517
1518NoArgReturnStringFunction(termname)
1519NoArgReturnStringFunction(longname)
1520
1521NoArgTrueFalseFunction(can_change_color)
1522NoArgTrueFalseFunction(has_colors)
1523NoArgTrueFalseFunction(has_ic)
1524NoArgTrueFalseFunction(has_il)
1525NoArgTrueFalseFunction(isendwin)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001526NoArgNoReturnVoidFunction(filter)
1527NoArgNoReturnVoidFunction(flushinp)
1528NoArgNoReturnVoidFunction(noqiflush)
1529
1530static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001531PyCurses_Color_Content(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001532{
1533 short color,r,g,b;
1534
1535 PyCursesInitialised
1536 PyCursesInitialisedColor
1537
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001538 if (ARG_COUNT(args) != 1) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001539 PyErr_SetString(PyExc_TypeError,
1540 "color_content requires 1 argument");
1541 return NULL;
1542 }
1543
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001544 if (!PyArg_Parse(args, "h;color", &color)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001545
1546 if (color_content(color, &r, &g, &b) != ERR)
1547 return Py_BuildValue("(iii)", r, g, b);
1548 else {
1549 PyErr_SetString(PyCursesError,
1550 "Argument 1 was out of range. Check value of COLORS.");
1551 return NULL;
1552 }
1553}
1554
1555static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001556PyCurses_color_pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001557{
1558 int n;
1559
1560 PyCursesInitialised
1561 PyCursesInitialisedColor
1562
Andrew M. Kuchling4463acb2000-07-24 23:54:49 +00001563 if (ARG_COUNT(args) != 1) {
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001564 PyErr_SetString(PyExc_TypeError, "color_pair requires 1 argument");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001565 return NULL;
1566 }
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001567 if (!PyArg_Parse(args, "i;number", &n)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001568 return PyInt_FromLong((long) (n << 8));
1569}
1570
1571static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001572PyCurses_Curs_Set(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001573{
1574 int vis,erg;
1575
1576 PyCursesInitialised
1577
Andrew M. Kuchling4463acb2000-07-24 23:54:49 +00001578 if (ARG_COUNT(args)!=1) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001579 PyErr_SetString(PyExc_TypeError, "curs_set requires 1 argument");
1580 return NULL;
1581 }
1582
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001583 if (!PyArg_Parse(args, "i;int", &vis)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001584
1585 erg = curs_set(vis);
1586 if (erg == ERR) return PyCursesCheckERR(erg, "curs_set");
1587
1588 return PyInt_FromLong((long) erg);
1589}
1590
1591static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001592PyCurses_Delay_Output(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001593{
1594 int ms;
1595
1596 PyCursesInitialised
1597
Andrew M. Kuchling4463acb2000-07-24 23:54:49 +00001598 if (ARG_COUNT(args) != 1) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001599 PyErr_SetString(PyExc_TypeError, "delay_output requires 1 argument");
1600 return NULL;
1601 }
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001602 if (!PyArg_Parse(args, "i;ms", &ms)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001603
1604 return PyCursesCheckERR(delay_output(ms), "delay_output");
1605}
1606
1607static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001608PyCurses_EraseChar(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001609{
1610 char ch;
1611
1612 PyCursesInitialised
1613
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001614 if (!PyArg_NoArgs(args)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001615
1616 ch = erasechar();
1617
1618 return PyString_FromString(&ch);
1619}
1620
1621static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001622PyCurses_getsyx(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001623{
1624 int x,y;
1625
1626 PyCursesInitialised
1627
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001628 if (!PyArg_NoArgs(args)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001629
1630 getsyx(y, x);
1631
1632 return Py_BuildValue("(ii)", y, x);
1633}
1634
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001635#ifdef NCURSES_MOUSE_VERSION
1636static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001637PyCurses_GetMouse(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001638{
1639 int rtn;
1640 MEVENT event;
1641
1642 PyCursesInitialised
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001643 if (!PyArg_NoArgs(args)) return NULL;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001644
1645 rtn = getmouse( &event );
1646 if (rtn == ERR) {
1647 PyErr_SetString(PyCursesError, "getmouse() returned ERR");
1648 return NULL;
1649 }
1650 return Py_BuildValue("(hiiil)",
1651 (short)event.id,
1652 event.x, event.y, event.z,
1653 (long) event.bstate);
1654}
1655
1656static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001657PyCurses_UngetMouse(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001658{
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001659 MEVENT event;
1660
1661 PyCursesInitialised
1662 if (!PyArg_ParseTuple(args, "(hiiil)",
1663 &event.id,
1664 &event.x, &event.y, &event.z,
1665 (int *) &event.bstate))
1666 return NULL;
1667
1668 return PyCursesCheckERR(ungetmouse(&event), "ungetmouse");
1669}
1670#endif
1671
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001672static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001673PyCurses_GetWin(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001674{
1675 WINDOW *win;
1676 PyObject *temp;
1677
1678 PyCursesInitialised
1679
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001680 if (!PyArg_Parse(args, "O;fileobj", &temp)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001681
1682 if (!PyFile_Check(temp)) {
1683 PyErr_SetString(PyExc_TypeError, "argument must be a file object");
1684 return NULL;
1685 }
1686
1687 win = getwin(PyFile_AsFile(temp));
1688
1689 if (win == NULL) {
1690 PyErr_SetString(PyCursesError, catchall_NULL);
1691 return NULL;
1692 }
1693
1694 return PyCursesWindow_New(win);
1695}
1696
1697static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001698PyCurses_HalfDelay(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001699{
1700 unsigned char tenths;
1701
1702 PyCursesInitialised
1703
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001704 switch(ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001705 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001706 if (!PyArg_Parse(args, "b;tenths", &tenths)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001707 break;
1708 default:
1709 PyErr_SetString(PyExc_TypeError, "halfdelay requires 1 argument");
1710 return NULL;
1711 }
1712
1713 return PyCursesCheckERR(halfdelay(tenths), "halfdelay");
1714}
1715
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00001716#ifndef STRICT_SYSV_CURSES
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001717 /* No has_key! */
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001718static PyObject * PyCurses_has_key(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001719{
1720 int ch;
1721
1722 PyCursesInitialised
1723
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001724 if (!PyArg_Parse(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001725
1726 if (has_key(ch) == FALSE) {
1727 Py_INCREF(Py_False);
1728 return Py_False;
1729 }
1730 Py_INCREF(Py_True);
1731 return Py_True;
1732}
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00001733#endif /* STRICT_SYSV_CURSES */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001734
1735static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001736PyCurses_Init_Color(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001737{
1738 short color, r, g, b;
1739
1740 PyCursesInitialised
1741 PyCursesInitialisedColor
1742
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001743 switch(ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001744 case 4:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001745 if (!PyArg_Parse(args, "(hhhh);color,r,g,b", &color, &r, &g, &b)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001746 break;
1747 default:
1748 PyErr_SetString(PyExc_TypeError, "init_color requires 4 arguments");
1749 return NULL;
1750 }
1751
1752 return PyCursesCheckERR(init_color(color, r, g, b), "init_color");
1753}
1754
1755static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001756PyCurses_Init_Pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001757{
1758 short pair, f, b;
1759
1760 PyCursesInitialised
1761 PyCursesInitialisedColor
1762
Andrew M. Kuchling4463acb2000-07-24 23:54:49 +00001763 if (ARG_COUNT(args) != 3) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001764 PyErr_SetString(PyExc_TypeError, "init_pair requires 3 arguments");
1765 return NULL;
1766 }
1767
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001768 if (!PyArg_Parse(args, "(hhh);pair, f, b", &pair, &f, &b)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001769
1770 return PyCursesCheckERR(init_pair(pair, f, b), "init_pair");
1771}
1772
Andrew M. Kuchling32552682000-12-22 21:52:27 +00001773static PyObject *ModDict;
1774
Guido van Rossumf6971e21994-08-30 12:25:20 +00001775static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001776PyCurses_InitScr(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001777{
Guido van Rossum56bf2351994-08-31 22:06:24 +00001778 WINDOW *win;
Andrew M. Kuchlinge1c43522001-01-29 20:31:29 +00001779 PyObject *nlines, *cols;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001780
1781 if (!PyArg_NoArgs(args)) return NULL;
1782
Guido van Rossum585c6dc1995-02-24 13:45:43 +00001783 if (initialised == TRUE) {
Guido van Rossumf6971e21994-08-30 12:25:20 +00001784 wrefresh(stdscr);
1785 return (PyObject *)PyCursesWindow_New(stdscr);
1786 }
Guido van Rossum56bf2351994-08-31 22:06:24 +00001787
1788 win = initscr();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001789
Guido van Rossum85738471995-02-17 13:50:17 +00001790 if (win == NULL) {
1791 PyErr_SetString(PyCursesError, catchall_NULL);
1792 return NULL;
1793 }
1794
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00001795 initialised = initialised_setupterm = TRUE;
Guido van Rossum56bf2351994-08-31 22:06:24 +00001796
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001797/* This was moved from initcurses() because it core dumped on SGI,
1798 where they're not defined until you've called initscr() */
1799#define SetDictInt(string,ch) \
1800 PyDict_SetItemString(ModDict,string,PyInt_FromLong((long) (ch)));
1801
1802 /* Here are some graphic symbols you can use */
1803 SetDictInt("ACS_ULCORNER", (ACS_ULCORNER));
1804 SetDictInt("ACS_LLCORNER", (ACS_LLCORNER));
1805 SetDictInt("ACS_URCORNER", (ACS_URCORNER));
1806 SetDictInt("ACS_LRCORNER", (ACS_LRCORNER));
1807 SetDictInt("ACS_LTEE", (ACS_LTEE));
1808 SetDictInt("ACS_RTEE", (ACS_RTEE));
1809 SetDictInt("ACS_BTEE", (ACS_BTEE));
1810 SetDictInt("ACS_TTEE", (ACS_TTEE));
1811 SetDictInt("ACS_HLINE", (ACS_HLINE));
1812 SetDictInt("ACS_VLINE", (ACS_VLINE));
1813 SetDictInt("ACS_PLUS", (ACS_PLUS));
1814 SetDictInt("ACS_S1", (ACS_S1));
1815 SetDictInt("ACS_S9", (ACS_S9));
1816 SetDictInt("ACS_DIAMOND", (ACS_DIAMOND));
1817 SetDictInt("ACS_CKBOARD", (ACS_CKBOARD));
1818 SetDictInt("ACS_DEGREE", (ACS_DEGREE));
1819 SetDictInt("ACS_PLMINUS", (ACS_PLMINUS));
1820 SetDictInt("ACS_BULLET", (ACS_BULLET));
1821 SetDictInt("ACS_LARROW", (ACS_LARROW));
1822 SetDictInt("ACS_RARROW", (ACS_RARROW));
1823 SetDictInt("ACS_DARROW", (ACS_DARROW));
1824 SetDictInt("ACS_UARROW", (ACS_UARROW));
1825 SetDictInt("ACS_BOARD", (ACS_BOARD));
1826 SetDictInt("ACS_LANTERN", (ACS_LANTERN));
1827 SetDictInt("ACS_BLOCK", (ACS_BLOCK));
1828 SetDictInt("ACS_BSSB", (ACS_ULCORNER));
1829 SetDictInt("ACS_SSBB", (ACS_LLCORNER));
1830 SetDictInt("ACS_BBSS", (ACS_URCORNER));
1831 SetDictInt("ACS_SBBS", (ACS_LRCORNER));
1832 SetDictInt("ACS_SBSS", (ACS_RTEE));
1833 SetDictInt("ACS_SSSB", (ACS_LTEE));
1834 SetDictInt("ACS_SSBS", (ACS_BTEE));
1835 SetDictInt("ACS_BSSS", (ACS_TTEE));
1836 SetDictInt("ACS_BSBS", (ACS_HLINE));
1837 SetDictInt("ACS_SBSB", (ACS_VLINE));
1838 SetDictInt("ACS_SSSS", (ACS_PLUS));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001839
1840 /* The following are never available with strict SYSV curses */
1841#ifdef ACS_S3
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001842 SetDictInt("ACS_S3", (ACS_S3));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001843#endif
1844#ifdef ACS_S7
1845 SetDictInt("ACS_S7", (ACS_S7));
1846#endif
1847#ifdef ACS_LEQUAL
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001848 SetDictInt("ACS_LEQUAL", (ACS_LEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001849#endif
1850#ifdef ACS_GEQUAL
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001851 SetDictInt("ACS_GEQUAL", (ACS_GEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001852#endif
1853#ifdef ACS_PI
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001854 SetDictInt("ACS_PI", (ACS_PI));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001855#endif
1856#ifdef ACS_NEQUAL
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001857 SetDictInt("ACS_NEQUAL", (ACS_NEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001858#endif
1859#ifdef ACS_STERLING
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001860 SetDictInt("ACS_STERLING", (ACS_STERLING));
1861#endif
1862
Andrew M. Kuchlinge1c43522001-01-29 20:31:29 +00001863 nlines = PyInt_FromLong((long) LINES);
1864 PyDict_SetItemString(ModDict, "LINES", nlines);
1865 Py_DECREF(nlines);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001866 cols = PyInt_FromLong((long) COLS);
1867 PyDict_SetItemString(ModDict, "COLS", cols);
1868 Py_DECREF(cols);
Guido van Rossum56bf2351994-08-31 22:06:24 +00001869
1870 return (PyObject *)PyCursesWindow_New(win);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001871}
1872
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00001873static PyObject *
1874PyCurses_setupterm(PyObject* self, PyObject *args, PyObject* keywds)
1875{
1876 int fd = -1;
1877 int err;
1878 char* termstr = NULL;
1879
1880 static char *kwlist[] = {"term", "fd", NULL};
1881
1882 if (!PyArg_ParseTupleAndKeywords(
1883 args,keywds,"|zi:setupterm",kwlist,&termstr,&fd)) {
1884 return NULL;
1885 }
1886
1887 if (fd == -1) {
1888 PyObject* sys_stdout;
1889
1890 sys_stdout = PySys_GetObject("stdout");
1891
1892 if (sys_stdout == NULL) {
1893 PyErr_SetString(
1894 PyCursesError,
1895 "lost sys.stdout");
1896 return NULL;
1897 }
1898
1899 fd = PyObject_AsFileDescriptor(sys_stdout);
1900
1901 if (fd == -1) {
1902 return NULL;
1903 }
1904 }
1905
1906 if (setupterm(termstr,fd,&err) == ERR) {
1907 char* s = "setupterm: unknown error";
1908
1909 if (err == 0) {
1910 s = "setupterm: could not find terminal";
1911 } else if (err == -1) {
1912 s = "setupterm: could not find terminfo database";
1913 }
1914
1915 PyErr_SetString(PyCursesError,s);
1916 return NULL;
1917 }
1918
1919 initialised_setupterm = TRUE;
1920
1921 Py_INCREF(Py_None);
1922 return Py_None;
1923}
Guido van Rossumf6971e21994-08-30 12:25:20 +00001924
1925static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001926PyCurses_IntrFlush(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001927{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001928 int ch;
1929
1930 PyCursesInitialised
1931
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001932 switch(ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001933 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001934 if (!PyArg_Parse(args,"i;True(1), False(0)",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001935 break;
1936 default:
1937 PyErr_SetString(PyExc_TypeError, "intrflush requires 1 argument");
Guido van Rossum85738471995-02-17 13:50:17 +00001938 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001939 }
1940
1941 return PyCursesCheckERR(intrflush(NULL,ch), "intrflush");
1942}
1943
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001944#if !defined(__NetBSD__)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001945static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001946PyCurses_KeyName(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001947{
1948 const char *knp;
1949 int ch;
1950
1951 PyCursesInitialised
1952
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001953 if (!PyArg_Parse(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001954
1955 knp = keyname(ch);
1956
1957 return PyString_FromString((knp == NULL) ? "" : (char *)knp);
1958}
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001959#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001960
1961static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001962PyCurses_KillChar(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001963{
1964 char ch;
1965
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001966 if (!PyArg_NoArgs(args)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001967
1968 ch = killchar();
1969
1970 return PyString_FromString(&ch);
1971}
1972
1973static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001974PyCurses_Meta(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001975{
1976 int ch;
1977
1978 PyCursesInitialised
1979
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001980 switch(ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001981 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001982 if (!PyArg_Parse(args,"i;True(1), False(0)",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001983 break;
1984 default:
1985 PyErr_SetString(PyExc_TypeError, "meta requires 1 argument");
1986 return NULL;
1987 }
1988
1989 return PyCursesCheckERR(meta(stdscr, ch), "meta");
1990}
1991
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001992#ifdef NCURSES_MOUSE_VERSION
1993static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001994PyCurses_MouseInterval(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001995{
1996 int interval;
1997 PyCursesInitialised
1998
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001999 if (!PyArg_Parse(args,"i;interval",&interval))
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002000 return NULL;
2001 return PyCursesCheckERR(mouseinterval(interval), "mouseinterval");
2002}
2003
2004static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002005PyCurses_MouseMask(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002006{
Andrew M. Kuchling1a104002000-07-06 18:14:03 +00002007 int newmask;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002008 mmask_t oldmask, availmask;
2009
2010 PyCursesInitialised
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002011 if (!PyArg_Parse(args,"i;mousemask",&newmask))
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002012 return NULL;
2013 availmask = mousemask(newmask, &oldmask);
2014 return Py_BuildValue("(ll)", (long)availmask, (long)oldmask);
2015}
2016#endif
2017
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002018static PyObject *
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002019PyCurses_Napms(PyObject *self, PyObject *args)
2020{
2021 int ms;
2022
2023 PyCursesInitialised
2024 if (!PyArg_Parse(args, "i;ms", &ms)) return NULL;
2025
2026 return Py_BuildValue("i", napms(ms));
2027}
2028
2029
2030static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002031PyCurses_NewPad(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002032{
2033 WINDOW *win;
2034 int nlines, ncols;
2035
2036 PyCursesInitialised
2037
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002038 if (!PyArg_Parse(args,"(ii);nlines,ncols",&nlines,&ncols)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002039
2040 win = newpad(nlines, ncols);
2041
2042 if (win == NULL) {
2043 PyErr_SetString(PyCursesError, catchall_NULL);
2044 return NULL;
2045 }
2046
2047 return (PyObject *)PyCursesWindow_New(win);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002048}
2049
2050static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002051PyCurses_NewWindow(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002052{
2053 WINDOW *win;
2054 int nlines, ncols, begin_y, begin_x;
Guido van Rossum85738471995-02-17 13:50:17 +00002055
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002056 PyCursesInitialised
2057
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002058 switch (ARG_COUNT(args)) {
Guido van Rossum85738471995-02-17 13:50:17 +00002059 case 2:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002060 if (!PyArg_Parse(args,"(ii);nlines,ncols",&nlines,&ncols))
Guido van Rossum85738471995-02-17 13:50:17 +00002061 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002062 win = newpad(nlines, ncols);
Guido van Rossum85738471995-02-17 13:50:17 +00002063 break;
2064 case 4:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002065 if (!PyArg_Parse(args, "(iiii);nlines,ncols,begin_y,begin_x",
Guido van Rossumf6971e21994-08-30 12:25:20 +00002066 &nlines,&ncols,&begin_y,&begin_x))
Guido van Rossum85738471995-02-17 13:50:17 +00002067 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002068 win = newwin(nlines,ncols,begin_y,begin_x);
Guido van Rossum85738471995-02-17 13:50:17 +00002069 break;
2070 default:
2071 PyErr_SetString(PyExc_TypeError, "newwin requires 2 or 4 arguments");
2072 return NULL;
2073 }
2074
Guido van Rossumf6971e21994-08-30 12:25:20 +00002075 if (win == NULL) {
Guido van Rossum85738471995-02-17 13:50:17 +00002076 PyErr_SetString(PyCursesError, catchall_NULL);
2077 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002078 }
Guido van Rossum85738471995-02-17 13:50:17 +00002079
Guido van Rossumf6971e21994-08-30 12:25:20 +00002080 return (PyObject *)PyCursesWindow_New(win);
2081}
2082
2083static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002084PyCurses_Pair_Content(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002085{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002086 short pair,f,b;
2087
2088 PyCursesInitialised
2089 PyCursesInitialisedColor
2090
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002091 switch(ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002092 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002093 if (!PyArg_Parse(args, "h;pair", &pair)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002094 break;
2095 default:
2096 PyErr_SetString(PyExc_TypeError, "pair_content requires 1 argument");
Guido van Rossum85738471995-02-17 13:50:17 +00002097 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002098 }
2099
2100 if (!pair_content(pair, &f, &b)) {
2101 PyErr_SetString(PyCursesError,
2102 "Argument 1 was out of range. (1..COLOR_PAIRS-1)");
2103 return NULL;
2104 }
2105
2106 return Py_BuildValue("(ii)", f, b);
2107}
2108
2109static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002110PyCurses_pair_number(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002111{
2112 int n;
2113
2114 PyCursesInitialised
2115 PyCursesInitialisedColor
2116
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002117 switch(ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002118 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002119 if (!PyArg_Parse(args, "i;pairvalue", &n)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002120 break;
2121 default:
2122 PyErr_SetString(PyExc_TypeError,
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002123 "pair_number requires 1 argument");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002124 return NULL;
2125 }
2126
2127 return PyInt_FromLong((long) ((n & A_COLOR) >> 8));
2128}
2129
2130static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002131PyCurses_Putp(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002132{
2133 char *str;
2134
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002135 if (!PyArg_Parse(args,"s;str", &str)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002136 return PyCursesCheckERR(putp(str), "putp");
2137}
2138
2139static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002140PyCurses_QiFlush(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002141{
2142 int flag = 0;
2143
2144 PyCursesInitialised
2145
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002146 switch(ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002147 case 0:
2148 qiflush();
2149 Py_INCREF(Py_None);
2150 return Py_None;
2151 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002152 if (!PyArg_Parse(args, "i;True(1) or False(0)", &flag)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002153 if (flag) qiflush();
2154 else noqiflush();
2155 Py_INCREF(Py_None);
2156 return Py_None;
2157 default:
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002158 PyErr_SetString(PyExc_TypeError, "qiflush requires 0 or 1 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002159 return NULL;
2160 }
2161}
2162
2163static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002164PyCurses_setsyx(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002165{
2166 int y,x;
2167
2168 PyCursesInitialised
2169
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002170 if (ARG_COUNT(args)!=2) {
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002171 PyErr_SetString(PyExc_TypeError, "setsyx requires 2 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002172 return NULL;
2173 }
2174
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002175 if (!PyArg_Parse(args, "(ii);y, x", &y, &x)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002176
2177 setsyx(y,x);
2178
Guido van Rossumf6971e21994-08-30 12:25:20 +00002179 Py_INCREF(Py_None);
Guido van Rossum85738471995-02-17 13:50:17 +00002180 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002181}
2182
2183static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002184PyCurses_Start_Color(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002185{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002186 int code;
2187 PyObject *c, *cp;
2188
2189 PyCursesInitialised
2190
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002191 if (!PyArg_NoArgs(args)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002192
2193 code = start_color();
2194 if (code != ERR) {
2195 initialisedcolors = TRUE;
2196 c = PyInt_FromLong((long) COLORS);
2197 PyDict_SetItemString(ModDict, "COLORS", c);
2198 Py_DECREF(c);
2199 cp = PyInt_FromLong((long) COLOR_PAIRS);
2200 PyDict_SetItemString(ModDict, "COLOR_PAIRS", cp);
2201 Py_DECREF(cp);
2202 Py_INCREF(Py_None);
2203 return Py_None;
2204 } else {
2205 PyErr_SetString(PyCursesError, "start_color() returned ERR");
Guido van Rossum85738471995-02-17 13:50:17 +00002206 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002207 }
2208}
2209
2210static PyObject *
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002211PyCurses_tigetflag(PyObject *self, PyObject *args)
2212{
2213 char *capname;
2214
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002215 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002216
2217 if (!PyArg_ParseTuple(args, "z", &capname))
2218 return NULL;
2219
2220 return PyInt_FromLong( (long) tigetflag( capname ) );
2221}
2222
2223static PyObject *
2224PyCurses_tigetnum(PyObject *self, PyObject *args)
2225{
2226 char *capname;
2227
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002228 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002229
2230 if (!PyArg_ParseTuple(args, "z", &capname))
2231 return NULL;
2232
2233 return PyInt_FromLong( (long) tigetnum( capname ) );
2234}
2235
2236static PyObject *
2237PyCurses_tigetstr(PyObject *self, PyObject *args)
2238{
2239 char *capname;
2240
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002241 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002242
2243 if (!PyArg_ParseTuple(args, "z", &capname))
2244 return NULL;
2245
2246 capname = tigetstr( capname );
2247 if (capname == 0 || capname == (char*) -1) {
2248 Py_INCREF(Py_None);
2249 return Py_None;
2250 }
2251 return PyString_FromString( capname );
2252}
2253
2254static PyObject *
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00002255PyCurses_tparm(PyObject *self, PyObject *args)
2256{
2257 char* fmt;
2258 char* result = NULL;
2259 int i1,i2,i3,i4,i5,i6,i7,i8,i9;
2260
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002261 PyCursesSetupTermCalled;
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00002262
2263 if (!PyArg_ParseTuple(args, "s|iiiiiiiii:tparm",
2264 &fmt, &i1, &i2, &i3, &i4,
2265 &i5, &i6, &i7, &i8, &i9)) {
2266 return NULL;
2267 }
2268
2269 switch (PyTuple_GET_SIZE(args)) {
2270 case 1:
2271 result = tparm(fmt);
2272 break;
2273 case 2:
2274 result = tparm(fmt,i1);
2275 break;
2276 case 3:
2277 result = tparm(fmt,i1,i2);
2278 break;
2279 case 4:
2280 result = tparm(fmt,i1,i2,i3);
2281 break;
2282 case 5:
2283 result = tparm(fmt,i1,i2,i3,i4);
2284 break;
2285 case 6:
2286 result = tparm(fmt,i1,i2,i3,i4,i5);
2287 break;
2288 case 7:
2289 result = tparm(fmt,i1,i2,i3,i4,i5,i6);
2290 break;
2291 case 8:
2292 result = tparm(fmt,i1,i2,i3,i4,i5,i6,i7);
2293 break;
2294 case 9:
2295 result = tparm(fmt,i1,i2,i3,i4,i5,i6,i7,i8);
2296 break;
2297 case 10:
2298 result = tparm(fmt,i1,i2,i3,i4,i5,i6,i7,i8,i9);
2299 break;
2300 }
2301
2302 return PyString_FromString(result);
2303}
2304
2305static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002306PyCurses_TypeAhead(PyObject *self, PyObject *args)
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00002307{
Andrew M. Kuchling1a104002000-07-06 18:14:03 +00002308 int fd;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00002309
2310 PyCursesInitialised
2311
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002312 if (!PyArg_Parse(args,"i;fd",&fd)) return NULL;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00002313
2314 PyCursesCheckERR(typeahead( fd ), "typeahead");
2315 Py_INCREF(Py_None);
2316 return Py_None;
2317}
2318
2319static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002320PyCurses_UnCtrl(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002321{
2322 PyObject *temp;
2323 chtype ch;
2324
2325 PyCursesInitialised
2326
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002327 if (!PyArg_Parse(args,"O;ch or int",&temp)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002328
2329 if (PyInt_Check(temp))
2330 ch = (chtype) PyInt_AsLong(temp);
2331 else if (PyString_Check(temp))
2332 ch = (chtype) *PyString_AsString(temp);
2333 else {
2334 PyErr_SetString(PyExc_TypeError, "argument must be a ch or an int");
2335 return NULL;
2336 }
2337
2338 return PyString_FromString(unctrl(ch));
Guido van Rossumf6971e21994-08-30 12:25:20 +00002339}
2340
2341static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002342PyCurses_UngetCh(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002343{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002344 PyObject *temp;
2345 chtype ch;
2346
2347 PyCursesInitialised
2348
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002349 if (!PyArg_Parse(args,"O;ch or int",&temp)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002350
2351 if (PyInt_Check(temp))
2352 ch = (chtype) PyInt_AsLong(temp);
2353 else if (PyString_Check(temp))
2354 ch = (chtype) *PyString_AsString(temp);
2355 else {
2356 PyErr_SetString(PyExc_TypeError, "argument must be a ch or an int");
Guido van Rossum85738471995-02-17 13:50:17 +00002357 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002358 }
2359
Guido van Rossum85738471995-02-17 13:50:17 +00002360 return PyCursesCheckERR(ungetch(ch), "ungetch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00002361}
2362
2363static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002364PyCurses_Use_Env(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002365{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002366 int flag;
2367
2368 PyCursesInitialised
2369
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002370 switch(ARG_COUNT(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002371 case 1:
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002372 if (!PyArg_Parse(args,"i;True(1), False(0)",&flag))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002373 return NULL;
2374 break;
2375 default:
2376 PyErr_SetString(PyExc_TypeError, "use_env requires 1 argument");
Guido van Rossum85738471995-02-17 13:50:17 +00002377 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002378 }
2379 use_env(flag);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002380 Py_INCREF(Py_None);
Guido van Rossum85738471995-02-17 13:50:17 +00002381 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002382}
2383
Guido van Rossumf6971e21994-08-30 12:25:20 +00002384/* List of functions defined in the module */
2385
2386static PyMethodDef PyCurses_methods[] = {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002387 {"baudrate", (PyCFunction)PyCurses_baudrate},
2388 {"beep", (PyCFunction)PyCurses_beep},
2389 {"can_change_color", (PyCFunction)PyCurses_can_change_color},
2390 {"cbreak", (PyCFunction)PyCurses_cbreak},
2391 {"color_content", (PyCFunction)PyCurses_Color_Content},
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002392 {"color_pair", (PyCFunction)PyCurses_color_pair},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002393 {"curs_set", (PyCFunction)PyCurses_Curs_Set},
2394 {"def_prog_mode", (PyCFunction)PyCurses_def_prog_mode},
2395 {"def_shell_mode", (PyCFunction)PyCurses_def_shell_mode},
2396 {"delay_output", (PyCFunction)PyCurses_Delay_Output},
2397 {"doupdate", (PyCFunction)PyCurses_doupdate},
2398 {"echo", (PyCFunction)PyCurses_echo},
2399 {"endwin", (PyCFunction)PyCurses_endwin},
2400 {"erasechar", (PyCFunction)PyCurses_EraseChar},
2401 {"filter", (PyCFunction)PyCurses_filter},
2402 {"flash", (PyCFunction)PyCurses_flash},
2403 {"flushinp", (PyCFunction)PyCurses_flushinp},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002404#ifdef NCURSES_MOUSE_VERSION
2405 {"getmouse", (PyCFunction)PyCurses_GetMouse},
2406 {"ungetmouse", (PyCFunction)PyCurses_UngetMouse, METH_VARARGS},
2407#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002408 {"getsyx", (PyCFunction)PyCurses_getsyx},
2409 {"getwin", (PyCFunction)PyCurses_GetWin},
2410 {"has_colors", (PyCFunction)PyCurses_has_colors},
2411 {"has_ic", (PyCFunction)PyCurses_has_ic},
2412 {"has_il", (PyCFunction)PyCurses_has_il},
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00002413#ifndef STRICT_SYSV_CURSES
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002414 {"has_key", (PyCFunction)PyCurses_has_key},
Guido van Rossumf6971e21994-08-30 12:25:20 +00002415#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002416 {"halfdelay", (PyCFunction)PyCurses_HalfDelay},
2417 {"init_color", (PyCFunction)PyCurses_Init_Color},
2418 {"init_pair", (PyCFunction)PyCurses_Init_Pair},
2419 {"initscr", (PyCFunction)PyCurses_InitScr},
2420 {"intrflush", (PyCFunction)PyCurses_IntrFlush},
2421 {"isendwin", (PyCFunction)PyCurses_isendwin},
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002422#if !defined(__NetBSD__)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002423 {"keyname", (PyCFunction)PyCurses_KeyName},
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002424#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002425 {"killchar", (PyCFunction)PyCurses_KillChar},
2426 {"longname", (PyCFunction)PyCurses_longname},
2427 {"meta", (PyCFunction)PyCurses_Meta},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002428#ifdef NCURSES_MOUSE_VERSION
2429 {"mouseinterval", (PyCFunction)PyCurses_MouseInterval},
2430 {"mousemask", (PyCFunction)PyCurses_MouseMask},
2431#endif
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002432 {"napms", (PyCFunction)PyCurses_Napms},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002433 {"newpad", (PyCFunction)PyCurses_NewPad},
2434 {"newwin", (PyCFunction)PyCurses_NewWindow},
2435 {"nl", (PyCFunction)PyCurses_nl},
2436 {"nocbreak", (PyCFunction)PyCurses_nocbreak},
2437 {"noecho", (PyCFunction)PyCurses_noecho},
2438 {"nonl", (PyCFunction)PyCurses_nonl},
2439 {"noqiflush", (PyCFunction)PyCurses_noqiflush},
2440 {"noraw", (PyCFunction)PyCurses_noraw},
2441 {"pair_content", (PyCFunction)PyCurses_Pair_Content},
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002442 {"pair_number", (PyCFunction)PyCurses_pair_number},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002443 {"putp", (PyCFunction)PyCurses_Putp},
2444 {"qiflush", (PyCFunction)PyCurses_QiFlush},
2445 {"raw", (PyCFunction)PyCurses_raw},
2446 {"reset_prog_mode", (PyCFunction)PyCurses_reset_prog_mode},
2447 {"reset_shell_mode", (PyCFunction)PyCurses_reset_shell_mode},
Andrew M. Kuchling1a104002000-07-06 18:14:03 +00002448 {"resetty", (PyCFunction)PyCurses_resetty},
2449 {"savetty", (PyCFunction)PyCurses_savetty},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002450 {"setsyx", (PyCFunction)PyCurses_setsyx},
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002451 {"setupterm", (PyCFunction)PyCurses_setupterm, METH_VARARGS|METH_KEYWORDS},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002452 {"start_color", (PyCFunction)PyCurses_Start_Color},
2453 {"termattrs", (PyCFunction)PyCurses_termattrs},
2454 {"termname", (PyCFunction)PyCurses_termname},
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002455 {"tigetflag", (PyCFunction)PyCurses_tigetflag, METH_VARARGS},
2456 {"tigetnum", (PyCFunction)PyCurses_tigetnum, METH_VARARGS},
2457 {"tigetstr", (PyCFunction)PyCurses_tigetstr, METH_VARARGS},
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00002458 {"tparm", (PyCFunction)PyCurses_tparm, METH_VARARGS},
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00002459 {"typeahead", (PyCFunction)PyCurses_TypeAhead},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002460 {"unctrl", (PyCFunction)PyCurses_UnCtrl},
2461 {"ungetch", (PyCFunction)PyCurses_UngetCh},
2462 {"use_env", (PyCFunction)PyCurses_Use_Env},
2463 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002464};
2465
2466/* Initialization function for the module */
2467
Guido van Rossum6915c4d2001-01-19 00:28:08 +00002468DL_EXPORT(void)
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002469init_curses(void)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002470{
Andrew M. Kuchling32552682000-12-22 21:52:27 +00002471 PyObject *m, *d, *v, *c_api_object;
2472 static void *PyCurses_API[PyCurses_API_pointers];
2473
Guido van Rossum6915c4d2001-01-19 00:28:08 +00002474 /* Initialize object type */
2475 PyCursesWindow_Type.ob_type = &PyType_Type;
2476
Andrew M. Kuchling32552682000-12-22 21:52:27 +00002477 /* Initialize the C API pointer array */
2478 PyCurses_API[0] = (void *)&PyCursesWindow_Type;
2479 PyCurses_API[1] = (void *)func_PyCursesSetupTermCalled;
2480 PyCurses_API[2] = (void *)func_PyCursesInitialised;
2481 PyCurses_API[3] = (void *)func_PyCursesInitialisedColor;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002482
2483 /* Create the module and add the functions */
Andrew M. Kuchlingb7f198e2000-06-10 23:12:32 +00002484 m = Py_InitModule("_curses", PyCurses_methods);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002485
Guido van Rossumf6971e21994-08-30 12:25:20 +00002486 /* Add some symbolic constants to the module */
2487 d = PyModule_GetDict(m);
Andrew M. Kuchling32552682000-12-22 21:52:27 +00002488 ModDict = d; /* For PyCurses_InitScr to use later */
2489
2490 /* Add a CObject for the C API */
2491 c_api_object = PyCObject_FromVoidPtr((void *)PyCurses_API, NULL);
2492 PyDict_SetItemString(d, "_C_API", c_api_object);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00002493
Guido van Rossum85738471995-02-17 13:50:17 +00002494 /* For exception curses.error */
Fred Drake589c35b2000-07-06 19:38:49 +00002495 PyCursesError = PyErr_NewException("_curses.error", NULL, NULL);
Guido van Rossum85738471995-02-17 13:50:17 +00002496 PyDict_SetItemString(d, "error", PyCursesError);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00002497
Guido van Rossum85738471995-02-17 13:50:17 +00002498 /* Make the version available */
Guido van Rossum8fbf82b1995-02-17 13:54:04 +00002499 v = PyString_FromString(PyCursesVersion);
2500 PyDict_SetItemString(d, "version", v);
2501 PyDict_SetItemString(d, "__version__", v);
2502 Py_DECREF(v);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002503
Andrew M. Kuchlingcaefb372000-12-26 15:57:01 +00002504 SetDictInt("ERR", ERR);
2505 SetDictInt("OK", OK);
2506
Guido van Rossumf6971e21994-08-30 12:25:20 +00002507 /* Here are some attributes you can add to chars to print */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002508
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002509 SetDictInt("A_ATTRIBUTES", A_ATTRIBUTES);
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002510 SetDictInt("A_NORMAL", A_NORMAL);
2511 SetDictInt("A_STANDOUT", A_STANDOUT);
2512 SetDictInt("A_UNDERLINE", A_UNDERLINE);
2513 SetDictInt("A_REVERSE", A_REVERSE);
2514 SetDictInt("A_BLINK", A_BLINK);
2515 SetDictInt("A_DIM", A_DIM);
2516 SetDictInt("A_BOLD", A_BOLD);
2517 SetDictInt("A_ALTCHARSET", A_ALTCHARSET);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002518#if !defined(__NetBSD__)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002519 SetDictInt("A_INVIS", A_INVIS);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002520#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002521 SetDictInt("A_PROTECT", A_PROTECT);
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002522 SetDictInt("A_CHARTEXT", A_CHARTEXT);
2523 SetDictInt("A_COLOR", A_COLOR);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002524
2525 /* The following are never available with strict SYSV curses */
2526#ifdef A_HORIZONTAL
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002527 SetDictInt("A_HORIZONTAL", A_HORIZONTAL);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002528#endif
2529#ifdef A_LEFT
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002530 SetDictInt("A_LEFT", A_LEFT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002531#endif
2532#ifdef A_LOW
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002533 SetDictInt("A_LOW", A_LOW);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002534#endif
2535#ifdef A_RIGHT
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002536 SetDictInt("A_RIGHT", A_RIGHT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002537#endif
2538#ifdef A_TOP
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002539 SetDictInt("A_TOP", A_TOP);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002540#endif
2541#ifdef A_VERTICAL
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002542 SetDictInt("A_VERTICAL", A_VERTICAL);
2543#endif
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002544
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002545 SetDictInt("COLOR_BLACK", COLOR_BLACK);
2546 SetDictInt("COLOR_RED", COLOR_RED);
2547 SetDictInt("COLOR_GREEN", COLOR_GREEN);
2548 SetDictInt("COLOR_YELLOW", COLOR_YELLOW);
2549 SetDictInt("COLOR_BLUE", COLOR_BLUE);
2550 SetDictInt("COLOR_MAGENTA", COLOR_MAGENTA);
2551 SetDictInt("COLOR_CYAN", COLOR_CYAN);
2552 SetDictInt("COLOR_WHITE", COLOR_WHITE);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002553
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002554#ifdef NCURSES_MOUSE_VERSION
2555 /* Mouse-related constants */
2556 SetDictInt("BUTTON1_PRESSED", BUTTON1_PRESSED);
2557 SetDictInt("BUTTON1_RELEASED", BUTTON1_RELEASED);
2558 SetDictInt("BUTTON1_CLICKED", BUTTON1_CLICKED);
2559 SetDictInt("BUTTON1_DOUBLE_CLICKED", BUTTON1_DOUBLE_CLICKED);
2560 SetDictInt("BUTTON1_TRIPLE_CLICKED", BUTTON1_TRIPLE_CLICKED);
2561
2562 SetDictInt("BUTTON2_PRESSED", BUTTON2_PRESSED);
2563 SetDictInt("BUTTON2_RELEASED", BUTTON2_RELEASED);
2564 SetDictInt("BUTTON2_CLICKED", BUTTON2_CLICKED);
2565 SetDictInt("BUTTON2_DOUBLE_CLICKED", BUTTON2_DOUBLE_CLICKED);
2566 SetDictInt("BUTTON2_TRIPLE_CLICKED", BUTTON2_TRIPLE_CLICKED);
2567
2568 SetDictInt("BUTTON3_PRESSED", BUTTON3_PRESSED);
2569 SetDictInt("BUTTON3_RELEASED", BUTTON3_RELEASED);
2570 SetDictInt("BUTTON3_CLICKED", BUTTON3_CLICKED);
2571 SetDictInt("BUTTON3_DOUBLE_CLICKED", BUTTON3_DOUBLE_CLICKED);
2572 SetDictInt("BUTTON3_TRIPLE_CLICKED", BUTTON3_TRIPLE_CLICKED);
2573
2574 SetDictInt("BUTTON4_PRESSED", BUTTON4_PRESSED);
2575 SetDictInt("BUTTON4_RELEASED", BUTTON4_RELEASED);
2576 SetDictInt("BUTTON4_CLICKED", BUTTON4_CLICKED);
2577 SetDictInt("BUTTON4_DOUBLE_CLICKED", BUTTON4_DOUBLE_CLICKED);
2578 SetDictInt("BUTTON4_TRIPLE_CLICKED", BUTTON4_TRIPLE_CLICKED);
2579
2580 SetDictInt("BUTTON_SHIFT", BUTTON_SHIFT);
2581 SetDictInt("BUTTON_CTRL", BUTTON_CTRL);
2582 SetDictInt("BUTTON_ALT", BUTTON_ALT);
2583
2584 SetDictInt("ALL_MOUSE_EVENTS", ALL_MOUSE_EVENTS);
2585 SetDictInt("REPORT_MOUSE_POSITION", REPORT_MOUSE_POSITION);
2586#endif
Guido van Rossumf6971e21994-08-30 12:25:20 +00002587 /* Now set everything up for KEY_ variables */
2588 {
2589 int key;
2590 char *key_n;
2591 char *key_n2;
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002592#if !defined(__NetBSD__)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002593 for (key=KEY_MIN;key < KEY_MAX; key++) {
2594 key_n = (char *)keyname(key);
Guido van Rossumf5c6d471995-02-07 15:38:32 +00002595 if (key_n == NULL || strcmp(key_n,"UNKNOWN KEY")==0)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002596 continue;
2597 if (strncmp(key_n,"KEY_F(",6)==0) {
2598 char *p1, *p2;
2599 key_n2 = malloc(strlen(key_n)+1);
2600 p1 = key_n;
2601 p2 = key_n2;
2602 while (*p1) {
2603 if (*p1 != '(' && *p1 != ')') {
2604 *p2 = *p1;
2605 p2++;
2606 }
2607 p1++;
2608 }
2609 *p2 = (char)0;
2610 } else
2611 key_n2 = key_n;
Guido van Rossum85738471995-02-17 13:50:17 +00002612 PyDict_SetItemString(d,key_n2,PyInt_FromLong((long) key));
Guido van Rossumf6971e21994-08-30 12:25:20 +00002613 if (key_n2 != key_n)
2614 free(key_n2);
2615 }
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002616#endif
Guido van Rossum85738471995-02-17 13:50:17 +00002617 SetDictInt("KEY_MIN", KEY_MIN);
2618 SetDictInt("KEY_MAX", KEY_MAX);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002619 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00002620}