blob: 1fc7da7f1b378ccee06f72a4411b9bc7fda101bd [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 *
Andrew M. Kuchling3adefcc2002-10-30 21:08:34 +000011 * Tidied for Python 1.6, and currently maintained by <amk@amk.ca>.
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
Guido van Rossumd8faa362007-04-27 19:54:29 +000038A number of SysV or ncurses functions don't have wrappers yet; if you
39need a given function, add it and send a patch. See
40http://www.python.org/dev/patches/ for instructions on how to submit
41patches to Python.
Andrew M. Kuchlingfb6bbf52000-07-27 11:58:01 +000042
Guido van Rossumd8faa362007-04-27 19:54:29 +000043Here's a list of currently unsupported functions:
44
45 addchnstr addchstr color_set define_key
Andrew M. Kuchlingfb6bbf52000-07-27 11:58:01 +000046 del_curterm delscreen dupwin inchnstr inchstr innstr keyok
Guido van Rossumd8faa362007-04-27 19:54:29 +000047 mcprint mvaddchnstr mvaddchstr mvcur mvinchnstr
48 mvinchstr mvinnstr mmvwaddchnstr mvwaddchstr
Thomas Wouters0e3f5912006-08-11 14:57:12 +000049 mvwinchnstr mvwinchstr mvwinnstr newterm
50 restartterm ripoffline scr_dump
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +000051 scr_init scr_restore scr_set scrl set_curterm set_term setterm
52 tgetent tgetflag tgetnum tgetstr tgoto timeout tputs
Guido van Rossumd8faa362007-04-27 19:54:29 +000053 vidattr vidputs waddchnstr waddchstr
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +000054 wcolor_set winchnstr winchstr winnstr wmouse_trafo wscrl
Andrew M. Kuchlingfb6bbf52000-07-27 11:58:01 +000055
56Low-priority:
57 slk_attr slk_attr_off slk_attr_on slk_attr_set slk_attroff
58 slk_attron slk_attrset slk_clear slk_color slk_init slk_label
59 slk_noutrefresh slk_refresh slk_restore slk_set slk_touch
60
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +000061Menu extension (ncurses and probably SYSV):
62 current_item free_item free_menu item_count item_description
63 item_index item_init item_name item_opts item_opts_off
64 item_opts_on item_term item_userptr item_value item_visible
65 menu_back menu_driver menu_fore menu_format menu_grey
66 menu_init menu_items menu_mark menu_opts menu_opts_off
67 menu_opts_on menu_pad menu_pattern menu_request_by_name
68 menu_request_name menu_spacing menu_sub menu_term menu_userptr
69 menu_win new_item new_menu pos_menu_cursor post_menu
70 scale_menu set_current_item set_item_init set_item_opts
71 set_item_term set_item_userptr set_item_value set_menu_back
72 set_menu_fore set_menu_format set_menu_grey set_menu_init
73 set_menu_items set_menu_mark set_menu_opts set_menu_pad
74 set_menu_pattern set_menu_spacing set_menu_sub set_menu_term
75 set_menu_userptr set_menu_win set_top_row top_row unpost_menu
76
77Form extension (ncurses and probably SYSV):
78 current_field data_ahead data_behind dup_field
79 dynamic_fieldinfo field_arg field_back field_buffer
80 field_count field_fore field_index field_info field_init
81 field_just field_opts field_opts_off field_opts_on field_pad
82 field_status field_term field_type field_userptr form_driver
83 form_fields form_init form_opts form_opts_off form_opts_on
84 form_page form_request_by_name form_request_name form_sub
85 form_term form_userptr form_win free_field free_form
86 link_field link_fieldtype move_field new_field new_form
87 new_page pos_form_cursor post_form scale_form
88 set_current_field set_field_back set_field_buffer
89 set_field_fore set_field_init set_field_just set_field_opts
90 set_field_pad set_field_status set_field_term set_field_type
91 set_field_userptr set_fieldtype_arg set_fieldtype_choice
92 set_form_fields set_form_init set_form_opts set_form_page
93 set_form_sub set_form_term set_form_userptr set_form_win
94 set_max_field set_new_page unpost_form
95
96
Andrew M. Kuchlingfb6bbf52000-07-27 11:58:01 +000097 */
98
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +000099/* Release Number */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000100
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000101char *PyCursesVersion = "2.2";
Guido van Rossumf6971e21994-08-30 12:25:20 +0000102
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000103/* Includes */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000104
Guido van Rossum602099a1994-09-14 13:32:22 +0000105#include "Python.h"
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000106
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000107#ifdef __osf__
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +0000108#define STRICT_SYSV_CURSES /* Don't use ncurses extensions */
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000109#endif
110
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000111#ifdef __hpux
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000112#define STRICT_SYSV_CURSES
113#endif
114
Guido van Rossum858ca0f2001-04-10 19:53:37 +0000115#define CURSES_MODULE
116#include "py_curses.h"
117
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +0000118/* These prototypes are in <term.h>, but including this header
119 #defines many common symbols (such as "lines") which breaks the
120 curses module in other ways. So the code will just specify
121 explicit prototypes here. */
122extern int setupterm(char *,int,int *);
Fred Drake0368bc42001-07-19 20:48:32 +0000123#ifdef __sgi
124#include <term.h>
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +0000125#endif
126
Martin v. Löwis21ee4092002-09-30 16:19:48 +0000127#if !defined(HAVE_NCURSES_H) && (defined(sgi) || defined(__sun) || defined(SCO5))
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +0000128#define STRICT_SYSV_CURSES /* Don't use ncurses extensions */
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000129typedef chtype attr_t; /* No attr_t type is available */
Guido van Rossum1266a011996-02-25 04:50:31 +0000130#endif
Guido van Rossumf6971e21994-08-30 12:25:20 +0000131
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000132#if defined(_AIX)
133#define STRICT_SYSV_CURSES
134#endif
135
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000136/* Definition of exception curses.error */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000137
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000138static PyObject *PyCursesError;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000139
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +0000140/* Tells whether setupterm() has been called to initialise terminfo. */
141static int initialised_setupterm = FALSE;
142
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000143/* Tells whether initscr() has been called to initialise curses. */
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000144static int initialised = FALSE;
145
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000146/* Tells whether start_color() has been called to initialise color usage. */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000147static int initialisedcolors = FALSE;
148
149/* Utility Macros */
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +0000150#define PyCursesSetupTermCalled \
151 if (initialised_setupterm != TRUE) { \
152 PyErr_SetString(PyCursesError, \
153 "must call (at least) setupterm() first"); \
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000154 return 0; }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +0000155
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000156#define PyCursesInitialised \
157 if (initialised != TRUE) { \
158 PyErr_SetString(PyCursesError, \
159 "must call initscr() first"); \
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000160 return 0; }
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000161
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000162#define PyCursesInitialisedColor \
163 if (initialisedcolors != TRUE) { \
164 PyErr_SetString(PyCursesError, \
165 "must call start_color() first"); \
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000166 return 0; }
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000167
Andrew M. Kuchling52a14c32005-06-09 17:53:27 +0000168#ifndef MIN
169#define MIN(x,y) ((x) < (y) ? (x) : (y))
170#endif
171
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000172/* Utility Functions */
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000173
Guido van Rossum85738471995-02-17 13:50:17 +0000174/*
175 * Check the return code from a curses function and return None
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000176 * or raise an exception as appropriate. These are exported using the
177 * CObject API.
Guido van Rossum85738471995-02-17 13:50:17 +0000178 */
179
180static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000181PyCursesCheckERR(int code, char *fname)
Guido van Rossum85738471995-02-17 13:50:17 +0000182{
Guido van Rossum85738471995-02-17 13:50:17 +0000183 if (code != ERR) {
184 Py_INCREF(Py_None);
185 return Py_None;
186 } else {
187 if (fname == NULL) {
188 PyErr_SetString(PyCursesError, catchall_ERR);
189 } else {
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000190 PyErr_Format(PyCursesError, "%s() returned ERR", fname);
Guido van Rossum85738471995-02-17 13:50:17 +0000191 }
192 return NULL;
193 }
194}
195
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000196static int
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000197PyCurses_ConvertToChtype(PyObject *obj, chtype *ch)
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000198{
Guido van Rossumddefaf32007-01-14 03:31:43 +0000199 if (PyInt_CheckExact(obj)) {
Christian Heimes217cfd12007-12-02 14:31:20 +0000200 *ch = (chtype) PyLong_AsLong(obj);
Martin v. Löwisbfdf4ec2001-06-23 19:58:46 +0000201 } else if(PyString_Check(obj)
202 && (PyString_Size(obj) == 1)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000203 *ch = (chtype) *PyString_AsString(obj);
Guido van Rossum6c95da32007-07-24 00:16:38 +0000204 } else if (PyUnicode_Check(obj) && PyUnicode_GetSize(obj) == 1) {
205 *ch = (chtype) *PyUnicode_AS_UNICODE(obj);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000206 } else {
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000207 return 0;
208 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000209 return 1;
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000210}
211
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000212/* Function versions of the 3 functions for tested whether curses has been
213 initialised or not. */
214
215static int func_PyCursesSetupTermCalled(void)
216{
217 PyCursesSetupTermCalled;
218 return 1;
219}
220
221static int func_PyCursesInitialised(void)
222{
223 PyCursesInitialised;
224 return 1;
225}
226
227static int func_PyCursesInitialisedColor(void)
228{
229 PyCursesInitialisedColor;
230 return 1;
231}
232
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000233/*****************************************************************************
234 The Window Object
235******************************************************************************/
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000236
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000237/* Definition of the window type */
Guido van Rossum85738471995-02-17 13:50:17 +0000238
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000239PyTypeObject PyCursesWindow_Type;
240
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000241/* Function prototype macros for Window object
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000242
243 X - function name
244 TYPE - parameter Type
245 ERGSTR - format string for construction of the return value
246 PARSESTR - format string for argument parsing
247 */
248
249#define Window_NoArgNoReturnFunction(X) \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000250static PyObject *PyCursesWindow_ ## X (PyCursesWindowObject *self, PyObject *args) \
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000251{ return PyCursesCheckERR(X(self->win), # X); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000252
253#define Window_NoArgTrueFalseFunction(X) \
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000254static PyObject * PyCursesWindow_ ## X (PyCursesWindowObject *self) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000255{ \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000256 if (X (self->win) == FALSE) { Py_INCREF(Py_False); return Py_False; } \
257 else { Py_INCREF(Py_True); return Py_True; } }
258
259#define Window_NoArgNoReturnVoidFunction(X) \
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000260static PyObject * PyCursesWindow_ ## X (PyCursesWindowObject *self) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000261{ \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000262 X(self->win); Py_INCREF(Py_None); return Py_None; }
263
264#define Window_NoArg2TupleReturnFunction(X, TYPE, ERGSTR) \
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000265static PyObject * PyCursesWindow_ ## X (PyCursesWindowObject *self) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000266{ \
267 TYPE arg1, arg2; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000268 X(self->win,arg1,arg2); return Py_BuildValue(ERGSTR, arg1, arg2); }
269
270#define Window_OneArgNoReturnVoidFunction(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; \
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000274 if (!PyArg_ParseTuple(args, PARSESTR, &arg1)) return NULL; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000275 X(self->win,arg1); Py_INCREF(Py_None); return Py_None; }
276
277#define Window_OneArgNoReturnFunction(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; \
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000281 if (!PyArg_ParseTuple(args,PARSESTR, &arg1)) return NULL; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000282 return PyCursesCheckERR(X(self->win, arg1), # X); }
283
284#define Window_TwoArgNoReturnFunction(X, TYPE, PARSESTR) \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000285static PyObject * PyCursesWindow_ ## X (PyCursesWindowObject *self, PyObject *args) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000286{ \
287 TYPE arg1, arg2; \
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000288 if (!PyArg_ParseTuple(args,PARSESTR, &arg1, &arg2)) return NULL; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000289 return PyCursesCheckERR(X(self->win, arg1, arg2), # X); }
Guido van Rossum85738471995-02-17 13:50:17 +0000290
Guido van Rossumf6971e21994-08-30 12:25:20 +0000291/* ------------- WINDOW routines --------------- */
Guido van Rossum85738471995-02-17 13:50:17 +0000292
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000293Window_NoArgNoReturnFunction(untouchwin)
294Window_NoArgNoReturnFunction(touchwin)
295Window_NoArgNoReturnFunction(redrawwin)
296Window_NoArgNoReturnFunction(winsertln)
297Window_NoArgNoReturnFunction(werase)
298Window_NoArgNoReturnFunction(wdeleteln)
299
300Window_NoArgTrueFalseFunction(is_wintouched)
301
302Window_NoArgNoReturnVoidFunction(wsyncup)
303Window_NoArgNoReturnVoidFunction(wsyncdown)
304Window_NoArgNoReturnVoidFunction(wstandend)
305Window_NoArgNoReturnVoidFunction(wstandout)
306Window_NoArgNoReturnVoidFunction(wcursyncup)
307Window_NoArgNoReturnVoidFunction(wclrtoeol)
308Window_NoArgNoReturnVoidFunction(wclrtobot)
309Window_NoArgNoReturnVoidFunction(wclear)
310
311Window_OneArgNoReturnVoidFunction(idcok, int, "i;True(1) or False(0)")
312Window_OneArgNoReturnVoidFunction(immedok, int, "i;True(1) or False(0)")
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +0000313Window_OneArgNoReturnVoidFunction(wtimeout, int, "i;delay")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000314
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000315Window_NoArg2TupleReturnFunction(getyx, int, "ii")
316Window_NoArg2TupleReturnFunction(getbegyx, int, "ii")
317Window_NoArg2TupleReturnFunction(getmaxyx, int, "ii")
318Window_NoArg2TupleReturnFunction(getparyx, int, "ii")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000319
320Window_OneArgNoReturnFunction(wattron, attr_t, "l;attr")
321Window_OneArgNoReturnFunction(wattroff, attr_t, "l;attr")
322Window_OneArgNoReturnFunction(wattrset, attr_t, "l;attr")
323Window_OneArgNoReturnFunction(clearok, int, "i;True(1) or False(0)")
324Window_OneArgNoReturnFunction(idlok, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000325#if defined(__NetBSD__)
326Window_OneArgNoReturnVoidFunction(keypad, int, "i;True(1) or False(0)")
327#else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000328Window_OneArgNoReturnFunction(keypad, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000329#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000330Window_OneArgNoReturnFunction(leaveok, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000331#if defined(__NetBSD__)
332Window_OneArgNoReturnVoidFunction(nodelay, int, "i;True(1) or False(0)")
333#else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000334Window_OneArgNoReturnFunction(nodelay, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000335#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000336Window_OneArgNoReturnFunction(notimeout, int, "i;True(1) or False(0)")
337Window_OneArgNoReturnFunction(scrollok, int, "i;True(1) or False(0)")
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000338Window_OneArgNoReturnFunction(winsdelln, int, "i;nlines")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000339Window_OneArgNoReturnFunction(syncok, int, "i;True(1) or False(0)")
340
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000341Window_TwoArgNoReturnFunction(mvwin, int, "ii;y,x")
342Window_TwoArgNoReturnFunction(mvderwin, int, "ii;y,x")
343Window_TwoArgNoReturnFunction(wmove, int, "ii;y,x")
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000344#ifndef STRICT_SYSV_CURSES
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000345Window_TwoArgNoReturnFunction(wresize, int, "ii;lines,columns")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000346#endif
347
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000348/* Allocation and deallocation of Window Objects */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000349
Guido van Rossumf6971e21994-08-30 12:25:20 +0000350static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000351PyCursesWindow_New(WINDOW *win)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000352{
353 PyCursesWindowObject *wo;
Guido van Rossum85738471995-02-17 13:50:17 +0000354
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000355 wo = PyObject_NEW(PyCursesWindowObject, &PyCursesWindow_Type);
356 if (wo == NULL) return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000357 wo->win = win;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000358 return (PyObject *)wo;
359}
360
361static void
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000362PyCursesWindow_Dealloc(PyCursesWindowObject *wo)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000363{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000364 if (wo->win != stdscr) delwin(wo->win);
Michael W. Hudson67fb0c32002-01-30 15:39:28 +0000365 PyObject_DEL(wo);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000366}
367
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000368/* Addch, Addstr, Addnstr */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000369
370static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000371PyCursesWindow_AddCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000372{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000373 int rtn, x, y, use_xy = FALSE;
374 PyObject *temp;
375 chtype ch = 0;
376 attr_t attr = A_NORMAL;
377
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000378 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000379 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000380 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000381 return NULL;
382 break;
383 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000384 if (!PyArg_ParseTuple(args, "Ol;ch or int,attr", &temp, &attr))
Guido van Rossum85738471995-02-17 13:50:17 +0000385 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000386 break;
387 case 3:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000388 if (!PyArg_ParseTuple(args,"iiO;y,x,ch or int", &y, &x, &temp))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000389 return NULL;
390 use_xy = TRUE;
391 break;
392 case 4:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000393 if (!PyArg_ParseTuple(args,"iiOl;y,x,ch or int, attr",
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000394 &y, &x, &temp, &attr))
395 return NULL;
396 use_xy = TRUE;
397 break;
398 default:
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000399 PyErr_SetString(PyExc_TypeError, "addch requires 1 to 4 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000400 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000401 }
Guido van Rossum85738471995-02-17 13:50:17 +0000402
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000403 if (!PyCurses_ConvertToChtype(temp, &ch)) {
404 PyErr_SetString(PyExc_TypeError, "argument 1 or 3 must be a ch or an int");
405 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000406 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000407
Guido van Rossumf6971e21994-08-30 12:25:20 +0000408 if (use_xy == TRUE)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000409 rtn = mvwaddch(self->win,y,x, ch | attr);
410 else {
411 rtn = waddch(self->win, ch | attr);
412 }
413 return PyCursesCheckERR(rtn, "addch");
Guido van Rossumf6971e21994-08-30 12:25:20 +0000414}
415
416static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000417PyCursesWindow_AddStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000418{
419 int rtn;
420 int x, y;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000421 char *str;
422 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
423 int use_xy = FALSE, use_attr = FALSE;
Guido van Rossum85738471995-02-17 13:50:17 +0000424
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000425 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000426 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000427 if (!PyArg_ParseTuple(args,"s;str", &str))
Guido van Rossum85738471995-02-17 13:50:17 +0000428 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000429 break;
430 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000431 if (!PyArg_ParseTuple(args,"sl;str,attr", &str, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000432 return NULL;
433 use_attr = TRUE;
434 break;
435 case 3:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000436 if (!PyArg_ParseTuple(args,"iis;int,int,str", &y, &x, &str))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000437 return NULL;
438 use_xy = TRUE;
439 break;
440 case 4:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000441 if (!PyArg_ParseTuple(args,"iisl;int,int,str,attr", &y, &x, &str, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000442 return NULL;
443 use_xy = use_attr = TRUE;
444 break;
445 default:
446 PyErr_SetString(PyExc_TypeError, "addstr requires 1 to 4 arguments");
447 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000448 }
Guido van Rossum85738471995-02-17 13:50:17 +0000449
Guido van Rossumf6971e21994-08-30 12:25:20 +0000450 if (use_attr == TRUE) {
451 attr_old = getattrs(self->win);
452 wattrset(self->win,attr);
453 }
454 if (use_xy == TRUE)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000455 rtn = mvwaddstr(self->win,y,x,str);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000456 else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000457 rtn = waddstr(self->win,str);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000458 if (use_attr == TRUE)
459 wattrset(self->win,attr_old);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000460 return PyCursesCheckERR(rtn, "addstr");
461}
Guido van Rossum85738471995-02-17 13:50:17 +0000462
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000463static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000464PyCursesWindow_AddNStr(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000465{
466 int rtn, x, y, n;
467 char *str;
468 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
469 int use_xy = FALSE, use_attr = FALSE;
470
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000471 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000472 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000473 if (!PyArg_ParseTuple(args,"si;str,n", &str, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000474 return NULL;
475 break;
476 case 3:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000477 if (!PyArg_ParseTuple(args,"sil;str,n,attr", &str, &n, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000478 return NULL;
479 use_attr = TRUE;
480 break;
481 case 4:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000482 if (!PyArg_ParseTuple(args,"iisi;y,x,str,n", &y, &x, &str, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000483 return NULL;
484 use_xy = TRUE;
485 break;
486 case 5:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000487 if (!PyArg_ParseTuple(args,"iisil;y,x,str,n,attr", &y, &x, &str, &n, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000488 return NULL;
489 use_xy = use_attr = TRUE;
490 break;
491 default:
492 PyErr_SetString(PyExc_TypeError, "addnstr requires 2 to 5 arguments");
493 return NULL;
494 }
495
496 if (use_attr == TRUE) {
497 attr_old = getattrs(self->win);
498 wattrset(self->win,attr);
499 }
500 if (use_xy == TRUE)
501 rtn = mvwaddnstr(self->win,y,x,str,n);
502 else
503 rtn = waddnstr(self->win,str,n);
504 if (use_attr == TRUE)
505 wattrset(self->win,attr_old);
506 return PyCursesCheckERR(rtn, "addnstr");
507}
508
509static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000510PyCursesWindow_Bkgd(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000511{
512 PyObject *temp;
513 chtype bkgd;
514 attr_t attr = A_NORMAL;
515
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000516 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000517 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000518 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000519 return NULL;
520 break;
521 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000522 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000523 return NULL;
524 break;
525 default:
526 PyErr_SetString(PyExc_TypeError, "bkgd requires 1 or 2 arguments");
527 return NULL;
528 }
529
530 if (!PyCurses_ConvertToChtype(temp, &bkgd)) {
531 PyErr_SetString(PyExc_TypeError, "argument 1 or 3 must be a ch or an int");
532 return NULL;
533 }
534
Andrew M. Kuchling4a596e32001-09-04 19:34:32 +0000535 return PyCursesCheckERR(wbkgd(self->win, bkgd | attr), "bkgd");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000536}
537
538static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000539PyCursesWindow_BkgdSet(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000540{
541 PyObject *temp;
542 chtype bkgd;
543 attr_t attr = A_NORMAL;
544
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000545 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000546 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000547 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000548 return NULL;
549 break;
550 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000551 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000552 return NULL;
553 break;
554 default:
555 PyErr_SetString(PyExc_TypeError, "bkgdset requires 1 or 2 arguments");
556 return NULL;
557 }
558
559 if (!PyCurses_ConvertToChtype(temp, &bkgd)) {
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000560 PyErr_SetString(PyExc_TypeError, "argument 1 must be a ch or an int");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000561 return NULL;
562 }
563
564 wbkgdset(self->win, bkgd | attr);
565 return PyCursesCheckERR(0, "bkgdset");
566}
567
568static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000569PyCursesWindow_Border(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000570{
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000571 PyObject *temp[8];
572 chtype ch[8];
573 int i;
574
575 /* Clear the array of parameters */
576 for(i=0; i<8; i++) {
577 temp[i] = NULL;
578 ch[i] = 0;
579 }
580
581 if (!PyArg_ParseTuple(args,"|OOOOOOOO;ls,rs,ts,bs,tl,tr,bl,br",
582 &temp[0], &temp[1], &temp[2], &temp[3],
583 &temp[4], &temp[5], &temp[6], &temp[7]))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000584 return NULL;
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000585
586 for(i=0; i<8; i++) {
587 if (temp[i] != NULL && !PyCurses_ConvertToChtype(temp[i], &ch[i])) {
588 PyErr_Format(PyExc_TypeError,
589 "argument %i must be a ch or an int", i+1);
590 return NULL;
591 }
592 }
593
594 wborder(self->win,
595 ch[0], ch[1], ch[2], ch[3],
596 ch[4], ch[5], ch[6], ch[7]);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000597 Py_INCREF(Py_None);
598 return Py_None;
599}
600
601static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000602PyCursesWindow_Box(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000603{
604 chtype ch1=0,ch2=0;
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000605 switch(PyTuple_Size(args)){
606 case 0: break;
607 default:
608 if (!PyArg_ParseTuple(args,"ll;vertint,horint", &ch1, &ch2))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000609 return NULL;
610 }
611 box(self->win,ch1,ch2);
612 Py_INCREF(Py_None);
613 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000614}
615
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000616#if defined(HAVE_NCURSES_H) || defined(MVWDELCH_IS_EXPRESSION)
617#define py_mvwdelch mvwdelch
618#else
619int py_mvwdelch(WINDOW *w, int y, int x)
620{
621 mvwdelch(w,y,x);
622 /* On HP/UX, mvwdelch already returns. On other systems,
623 we may well run into this return statement. */
624 return 0;
625}
626#endif
627
Guido van Rossumd8faa362007-04-27 19:54:29 +0000628/* chgat, added by Fabian Kreutz <fabian.kreutz at gmx.net> */
629
630static PyObject *
631PyCursesWindow_ChgAt(PyCursesWindowObject *self, PyObject *args)
632{
633 int rtn;
634 int x, y;
635 int num = -1;
636 short color;
637 attr_t attr = A_NORMAL;
638 int use_xy = FALSE;
639
640 switch (PyTuple_Size(args)) {
641 case 1:
642 if (!PyArg_ParseTuple(args,"l;attr", &attr))
643 return NULL;
644 break;
645 case 2:
646 if (!PyArg_ParseTuple(args,"il;n,attr", &num, &attr))
647 return NULL;
648 break;
649 case 3:
650 if (!PyArg_ParseTuple(args,"iil;int,int,attr", &y, &x, &attr))
651 return NULL;
652 use_xy = TRUE;
653 break;
654 case 4:
655 if (!PyArg_ParseTuple(args,"iiil;int,int,n,attr", &y, &x, &num, &attr))
656 return NULL;
657 use_xy = TRUE;
658 break;
659 default:
660 PyErr_SetString(PyExc_TypeError, "chgat requires 1 to 4 arguments");
661 return NULL;
662 }
663
664 color = (short)((attr >> 8) & 0xff);
665 attr = attr - (color << 8);
666
667 if (use_xy == TRUE) {
668 rtn = mvwchgat(self->win,y,x,num,attr,color,NULL);
669 touchline(self->win,y,1);
670 } else {
671 getyx(self->win,y,x);
672 rtn = wchgat(self->win,num,attr,color,NULL);
673 touchline(self->win,y,1);
674 }
675 return PyCursesCheckERR(rtn, "chgat");
676}
677
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000678
Guido van Rossumf6971e21994-08-30 12:25:20 +0000679static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000680PyCursesWindow_DelCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000681{
682 int rtn;
683 int x, y;
Guido van Rossum85738471995-02-17 13:50:17 +0000684
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000685 switch (PyTuple_Size(args)) {
Guido van Rossum85738471995-02-17 13:50:17 +0000686 case 0:
Guido van Rossumf6971e21994-08-30 12:25:20 +0000687 rtn = wdelch(self->win);
Guido van Rossum85738471995-02-17 13:50:17 +0000688 break;
689 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000690 if (!PyArg_ParseTuple(args,"ii;y,x", &y, &x))
Guido van Rossum85738471995-02-17 13:50:17 +0000691 return NULL;
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000692 rtn = py_mvwdelch(self->win,y,x);
Guido van Rossum85738471995-02-17 13:50:17 +0000693 break;
694 default:
695 PyErr_SetString(PyExc_TypeError, "delch requires 0 or 2 arguments");
696 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000697 }
Guido van Rossum85738471995-02-17 13:50:17 +0000698 return PyCursesCheckERR(rtn, "[mv]wdelch");
Guido van Rossumf6971e21994-08-30 12:25:20 +0000699}
700
701static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000702PyCursesWindow_DerWin(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000703{
704 WINDOW *win;
705 int nlines, ncols, begin_y, begin_x;
706
707 nlines = 0;
708 ncols = 0;
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000709 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000710 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000711 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000712 return NULL;
713 break;
714 case 4:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000715 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000716 &nlines,&ncols,&begin_y,&begin_x))
717 return NULL;
718 break;
719 default:
720 PyErr_SetString(PyExc_TypeError, "derwin requires 2 or 4 arguments");
721 return NULL;
722 }
723
724 win = derwin(self->win,nlines,ncols,begin_y,begin_x);
725
726 if (win == NULL) {
727 PyErr_SetString(PyCursesError, catchall_NULL);
728 return NULL;
729 }
730
731 return (PyObject *)PyCursesWindow_New(win);
732}
733
734static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000735PyCursesWindow_EchoChar(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000736{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000737 PyObject *temp;
738 chtype ch;
739 attr_t attr = A_NORMAL;
Guido van Rossum85738471995-02-17 13:50:17 +0000740
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000741 switch (PyTuple_Size(args)) {
Guido van Rossum85738471995-02-17 13:50:17 +0000742 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000743 if (!PyArg_ParseTuple(args,"O;ch or int", &temp))
Guido van Rossum85738471995-02-17 13:50:17 +0000744 return NULL;
Guido van Rossum85738471995-02-17 13:50:17 +0000745 break;
746 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000747 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &attr))
Guido van Rossum85738471995-02-17 13:50:17 +0000748 return NULL;
Guido van Rossum85738471995-02-17 13:50:17 +0000749 break;
750 default:
751 PyErr_SetString(PyExc_TypeError, "echochar requires 1 or 2 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000752
753
Guido van Rossum85738471995-02-17 13:50:17 +0000754 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000755 }
Guido van Rossum85738471995-02-17 13:50:17 +0000756
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000757 if (!PyCurses_ConvertToChtype(temp, &ch)) {
758 PyErr_SetString(PyExc_TypeError, "argument 1 must be a ch or an int");
Guido van Rossum85738471995-02-17 13:50:17 +0000759 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000760 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000761
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000762#ifdef WINDOW_HAS_FLAGS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000763 if (self->win->_flags & _ISPAD)
764 return PyCursesCheckERR(pechochar(self->win, ch | attr),
765 "echochar");
Guido van Rossumf6971e21994-08-30 12:25:20 +0000766 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000767#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000768 return PyCursesCheckERR(wechochar(self->win, ch | attr),
769 "echochar");
Guido van Rossumf6971e21994-08-30 12:25:20 +0000770}
771
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +0000772#ifdef NCURSES_MOUSE_VERSION
773static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000774PyCursesWindow_Enclose(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +0000775{
776 int x, y;
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000777 if (!PyArg_ParseTuple(args,"ii;y,x", &y, &x))
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +0000778 return NULL;
779
Christian Heimes217cfd12007-12-02 14:31:20 +0000780 return PyLong_FromLong( wenclose(self->win,y,x) );
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +0000781}
782#endif
783
Guido van Rossumf6971e21994-08-30 12:25:20 +0000784static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000785PyCursesWindow_GetBkgd(PyCursesWindowObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000786{
Christian Heimes217cfd12007-12-02 14:31:20 +0000787 return PyLong_FromLong((long) getbkgd(self->win));
Guido van Rossumf6971e21994-08-30 12:25:20 +0000788}
789
790static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000791PyCursesWindow_GetCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000792{
793 int x, y;
Andrew M. Kuchling7e23f002002-11-06 14:15:36 +0000794 int rtn;
Guido van Rossum85738471995-02-17 13:50:17 +0000795
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000796 switch (PyTuple_Size(args)) {
Guido van Rossum85738471995-02-17 13:50:17 +0000797 case 0:
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000798 Py_BEGIN_ALLOW_THREADS
Guido van Rossumf6971e21994-08-30 12:25:20 +0000799 rtn = wgetch(self->win);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000800 Py_END_ALLOW_THREADS
Guido van Rossum85738471995-02-17 13:50:17 +0000801 break;
802 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000803 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
Guido van Rossum85738471995-02-17 13:50:17 +0000804 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000805 Py_BEGIN_ALLOW_THREADS
Guido van Rossum85738471995-02-17 13:50:17 +0000806 rtn = mvwgetch(self->win,y,x);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000807 Py_END_ALLOW_THREADS
Guido van Rossum85738471995-02-17 13:50:17 +0000808 break;
809 default:
810 PyErr_SetString(PyExc_TypeError, "getch requires 0 or 2 arguments");
811 return NULL;
812 }
Christian Heimes217cfd12007-12-02 14:31:20 +0000813 return PyLong_FromLong((long)rtn);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000814}
Guido van Rossum85738471995-02-17 13:50:17 +0000815
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000816static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000817PyCursesWindow_GetKey(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000818{
819 int x, y;
Andrew M. Kuchling7e23f002002-11-06 14:15:36 +0000820 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000821
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000822 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000823 case 0:
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000824 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000825 rtn = wgetch(self->win);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000826 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000827 break;
828 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000829 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000830 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000831 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000832 rtn = mvwgetch(self->win,y,x);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000833 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000834 break;
835 default:
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000836 PyErr_SetString(PyExc_TypeError, "getkey requires 0 or 2 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000837 return NULL;
838 }
Andrew M. Kuchling7e23f002002-11-06 14:15:36 +0000839 if (rtn == ERR) {
840 /* getch() returns ERR in nodelay mode */
841 PyErr_SetString(PyCursesError, "no input");
842 return NULL;
843 } else if (rtn<=255)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000844 return Py_BuildValue("c", rtn);
845 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000846#if defined(__NetBSD__)
Neal Norwitz9af3ae42007-08-24 00:06:36 +0000847 return PyUnicode_FromString(unctrl(rtn));
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000848#else
Neal Norwitz9af3ae42007-08-24 00:06:36 +0000849 return PyUnicode_FromString((const char *)keyname(rtn));
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000850#endif
Guido van Rossumf6971e21994-08-30 12:25:20 +0000851}
852
853static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000854PyCursesWindow_GetStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000855{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000856 int x, y, n;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000857 char rtn[1024]; /* This should be big enough.. I hope */
858 int rtn2;
Guido van Rossum85738471995-02-17 13:50:17 +0000859
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000860 switch (PyTuple_Size(args)) {
Guido van Rossum85738471995-02-17 13:50:17 +0000861 case 0:
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000862 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling52a14c32005-06-09 17:53:27 +0000863 rtn2 = wgetnstr(self->win,rtn, 1023);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000864 Py_END_ALLOW_THREADS
Guido van Rossum85738471995-02-17 13:50:17 +0000865 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000866 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000867 if (!PyArg_ParseTuple(args,"i;n", &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000868 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000869 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling52a14c32005-06-09 17:53:27 +0000870 rtn2 = wgetnstr(self->win,rtn,MIN(n, 1023));
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000871 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000872 break;
Guido van Rossum85738471995-02-17 13:50:17 +0000873 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000874 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
Guido van Rossum85738471995-02-17 13:50:17 +0000875 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000876 Py_BEGIN_ALLOW_THREADS
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000877#ifdef STRICT_SYSV_CURSES
878 rtn2 = wmove(self->win,y,x)==ERR ? ERR : wgetnstr(self->win, rtn, 1023);
879#else
Andrew M. Kuchling52a14c32005-06-09 17:53:27 +0000880 rtn2 = mvwgetnstr(self->win,y,x,rtn, 1023);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000881#endif
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000882 Py_END_ALLOW_THREADS
Guido van Rossum85738471995-02-17 13:50:17 +0000883 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000884 case 3:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000885 if (!PyArg_ParseTuple(args,"iii;y,x,n", &y, &x, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000886 return NULL;
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000887#ifdef STRICT_SYSV_CURSES
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000888 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000889 rtn2 = wmove(self->win,y,x)==ERR ? ERR :
Andrew M. Kuchling52a14c32005-06-09 17:53:27 +0000890 wgetnstr(self->win, rtn, MIN(n, 1023));
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000891 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000892#else
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000893 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling52a14c32005-06-09 17:53:27 +0000894 rtn2 = mvwgetnstr(self->win, y, x, rtn, MIN(n, 1023));
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000895 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000896#endif
897 break;
Guido van Rossum85738471995-02-17 13:50:17 +0000898 default:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000899 PyErr_SetString(PyExc_TypeError, "getstr requires 0 to 3 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +0000900 return NULL;
901 }
Guido van Rossumf6971e21994-08-30 12:25:20 +0000902 if (rtn2 == ERR)
903 rtn[0] = 0;
Guido van Rossum85738471995-02-17 13:50:17 +0000904 return PyString_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000905}
906
907static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000908PyCursesWindow_Hline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000909{
910 PyObject *temp;
911 chtype ch;
912 int n, x, y, code = OK;
913 attr_t attr = A_NORMAL;
914
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000915 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000916 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000917 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000918 return NULL;
919 break;
920 case 3:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000921 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000922 return NULL;
923 break;
924 case 4:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000925 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000926 return NULL;
927 code = wmove(self->win, y, x);
928 break;
929 case 5:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000930 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000931 &y, &x, &temp, &n, &attr))
932 return NULL;
933 code = wmove(self->win, y, x);
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000934 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000935 default:
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000936 PyErr_SetString(PyExc_TypeError, "hline requires 2 to 5 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000937 return NULL;
938 }
939
940 if (code != ERR) {
941 if (!PyCurses_ConvertToChtype(temp, &ch)) {
942 PyErr_SetString(PyExc_TypeError,
943 "argument 1 or 3 must be a ch or an int");
944 return NULL;
945 }
946 return PyCursesCheckERR(whline(self->win, ch | attr, n), "hline");
947 } else
948 return PyCursesCheckERR(code, "wmove");
949}
950
951static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000952PyCursesWindow_InsCh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000953{
954 int rtn, x, y, use_xy = FALSE;
955 PyObject *temp;
956 chtype ch = 0;
957 attr_t attr = A_NORMAL;
958
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000959 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000960 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000961 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000962 return NULL;
963 break;
964 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000965 if (!PyArg_ParseTuple(args, "Ol;ch or int,attr", &temp, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000966 return NULL;
967 break;
968 case 3:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000969 if (!PyArg_ParseTuple(args,"iiO;y,x,ch or int", &y, &x, &temp))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000970 return NULL;
971 use_xy = TRUE;
972 break;
973 case 4:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000974 if (!PyArg_ParseTuple(args,"iiOl;y,x,ch or int, attr", &y, &x, &temp, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000975 return NULL;
976 use_xy = TRUE;
977 break;
978 default:
979 PyErr_SetString(PyExc_TypeError, "insch requires 1 or 4 arguments");
980 return NULL;
981 }
982
983 if (!PyCurses_ConvertToChtype(temp, &ch)) {
984 PyErr_SetString(PyExc_TypeError,
985 "argument 1 or 3 must be a ch or an int");
986 return NULL;
987 }
988
989 if (use_xy == TRUE)
990 rtn = mvwinsch(self->win,y,x, ch | attr);
991 else {
992 rtn = winsch(self->win, ch | attr);
993 }
994 return PyCursesCheckERR(rtn, "insch");
995}
996
997static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000998PyCursesWindow_InCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000999{
Guido van Rossum85738471995-02-17 13:50:17 +00001000 int x, y, rtn;
1001
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001002 switch (PyTuple_Size(args)) {
Guido van Rossum85738471995-02-17 13:50:17 +00001003 case 0:
Guido van Rossumf6971e21994-08-30 12:25:20 +00001004 rtn = winch(self->win);
Guido van Rossum85738471995-02-17 13:50:17 +00001005 break;
1006 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001007 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
Guido van Rossum85738471995-02-17 13:50:17 +00001008 return NULL;
1009 rtn = mvwinch(self->win,y,x);
1010 break;
1011 default:
1012 PyErr_SetString(PyExc_TypeError, "inch requires 0 or 2 arguments");
1013 return NULL;
1014 }
Christian Heimes217cfd12007-12-02 14:31:20 +00001015 return PyLong_FromLong((long) rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001016}
1017
1018static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001019PyCursesWindow_InStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001020{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001021 int x, y, n;
1022 char rtn[1024]; /* This should be big enough.. I hope */
1023 int rtn2;
1024
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001025 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001026 case 0:
Andrew M. Kuchling52a14c32005-06-09 17:53:27 +00001027 rtn2 = winnstr(self->win,rtn, 1023);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001028 break;
1029 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001030 if (!PyArg_ParseTuple(args,"i;n", &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001031 return NULL;
Andrew M. Kuchling52a14c32005-06-09 17:53:27 +00001032 rtn2 = winnstr(self->win,rtn,MIN(n,1023));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001033 break;
1034 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001035 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001036 return NULL;
Andrew M. Kuchling52a14c32005-06-09 17:53:27 +00001037 rtn2 = mvwinnstr(self->win,y,x,rtn,1023);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001038 break;
1039 case 3:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001040 if (!PyArg_ParseTuple(args, "iii;y,x,n", &y, &x, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001041 return NULL;
Andrew M. Kuchling52a14c32005-06-09 17:53:27 +00001042 rtn2 = mvwinnstr(self->win, y, x, rtn, MIN(n,1023));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001043 break;
1044 default:
1045 PyErr_SetString(PyExc_TypeError, "instr requires 0 or 3 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +00001046 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001047 }
1048 if (rtn2 == ERR)
1049 rtn[0] = 0;
1050 return PyString_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001051}
1052
1053static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001054PyCursesWindow_InsStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001055{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001056 int rtn;
1057 int x, y;
1058 char *str;
1059 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
1060 int use_xy = FALSE, use_attr = FALSE;
1061
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001062 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001063 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001064 if (!PyArg_ParseTuple(args,"s;str", &str))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001065 return NULL;
1066 break;
1067 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001068 if (!PyArg_ParseTuple(args,"sl;str,attr", &str, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001069 return NULL;
1070 use_attr = TRUE;
1071 break;
1072 case 3:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001073 if (!PyArg_ParseTuple(args,"iis;y,x,str", &y, &x, &str))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001074 return NULL;
1075 use_xy = TRUE;
1076 break;
1077 case 4:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001078 if (!PyArg_ParseTuple(args,"iisl;y,x,str,attr", &y, &x, &str, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001079 return NULL;
1080 use_xy = use_attr = TRUE;
1081 break;
1082 default:
1083 PyErr_SetString(PyExc_TypeError, "insstr requires 1 to 4 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +00001084 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001085 }
1086
1087 if (use_attr == TRUE) {
1088 attr_old = getattrs(self->win);
1089 wattrset(self->win,attr);
1090 }
1091 if (use_xy == TRUE)
1092 rtn = mvwinsstr(self->win,y,x,str);
1093 else
1094 rtn = winsstr(self->win,str);
1095 if (use_attr == TRUE)
1096 wattrset(self->win,attr_old);
1097 return PyCursesCheckERR(rtn, "insstr");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001098}
1099
1100static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001101PyCursesWindow_InsNStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001102{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001103 int rtn, x, y, n;
1104 char *str;
1105 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
1106 int use_xy = FALSE, use_attr = FALSE;
1107
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001108 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001109 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001110 if (!PyArg_ParseTuple(args,"si;str,n", &str, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001111 return NULL;
1112 break;
1113 case 3:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001114 if (!PyArg_ParseTuple(args,"sil;str,n,attr", &str, &n, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001115 return NULL;
1116 use_attr = TRUE;
1117 break;
1118 case 4:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001119 if (!PyArg_ParseTuple(args,"iisi;y,x,str,n", &y, &x, &str, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001120 return NULL;
1121 use_xy = TRUE;
1122 break;
1123 case 5:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001124 if (!PyArg_ParseTuple(args,"iisil;y,x,str,n,attr", &y, &x, &str, &n, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001125 return NULL;
1126 use_xy = use_attr = TRUE;
1127 break;
1128 default:
1129 PyErr_SetString(PyExc_TypeError, "insnstr requires 2 to 5 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +00001130 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001131 }
1132
1133 if (use_attr == TRUE) {
1134 attr_old = getattrs(self->win);
1135 wattrset(self->win,attr);
1136 }
1137 if (use_xy == TRUE)
1138 rtn = mvwinsnstr(self->win,y,x,str,n);
1139 else
1140 rtn = winsnstr(self->win,str,n);
1141 if (use_attr == TRUE)
1142 wattrset(self->win,attr_old);
1143 return PyCursesCheckERR(rtn, "insnstr");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001144}
1145
1146static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001147PyCursesWindow_Is_LineTouched(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001148{
1149 int line, erg;
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001150 if (!PyArg_ParseTuple(args,"i;line", &line))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001151 return NULL;
1152 erg = is_linetouched(self->win, line);
1153 if (erg == ERR) {
1154 PyErr_SetString(PyExc_TypeError,
1155 "is_linetouched: line number outside of boundaries");
1156 return NULL;
1157 } else
1158 if (erg == FALSE) {
1159 Py_INCREF(Py_False);
1160 return Py_False;
1161 } else {
1162 Py_INCREF(Py_True);
1163 return Py_True;
1164 }
1165}
1166
1167static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001168PyCursesWindow_NoOutRefresh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001169{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001170 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001171 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001172
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001173#ifndef WINDOW_HAS_FLAGS
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001174 if (0) {
1175#else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001176 if (self->win->_flags & _ISPAD) {
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001177#endif
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001178 switch(PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001179 case 6:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001180 if (!PyArg_ParseTuple(args,
1181 "iiiiii;" \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001182 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1183 &pminrow, &pmincol, &sminrow,
1184 &smincol, &smaxrow, &smaxcol))
1185 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001186 Py_BEGIN_ALLOW_THREADS
1187 rtn = pnoutrefresh(self->win,
1188 pminrow, pmincol, sminrow,
Andrew M. Kuchlingb6e46872000-06-27 15:01:10 +00001189 smincol, smaxrow, smaxcol);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001190 Py_END_ALLOW_THREADS
1191 return PyCursesCheckERR(rtn, "pnoutrefresh");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001192 default:
1193 PyErr_SetString(PyCursesError,
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001194 "noutrefresh() called for a pad "
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001195 "requires 6 arguments");
1196 return NULL;
1197 }
1198 } else {
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001199 if (!PyArg_ParseTuple(args, ":noutrefresh"))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001200 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001201
1202 Py_BEGIN_ALLOW_THREADS
1203 rtn = wnoutrefresh(self->win);
1204 Py_END_ALLOW_THREADS
1205 return PyCursesCheckERR(rtn, "wnoutrefresh");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001206 }
1207}
1208
1209static PyObject *
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001210PyCursesWindow_Overlay(PyCursesWindowObject *self, PyObject *args)
1211{
1212 PyCursesWindowObject *temp;
1213 int use_copywin = FALSE;
1214 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1215 int rtn;
1216
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001217 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001218 case 1:
1219 if (!PyArg_ParseTuple(args, "O!;window object",
1220 &PyCursesWindow_Type, &temp))
1221 return NULL;
1222 break;
1223 case 7:
Neal Norwitz88bbd732006-01-10 07:05:44 +00001224 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001225 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1226 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1227 return NULL;
1228 use_copywin = TRUE;
1229 break;
1230 default:
1231 PyErr_SetString(PyExc_TypeError,
1232 "overlay requires one or seven arguments");
1233 return NULL;
1234 }
1235
1236 if (use_copywin == TRUE) {
1237 rtn = copywin(self->win, temp->win, sminrow, smincol,
1238 dminrow, dmincol, dmaxrow, dmaxcol, TRUE);
1239 return PyCursesCheckERR(rtn, "copywin");
1240 }
1241 else {
1242 rtn = overlay(self->win, temp->win);
1243 return PyCursesCheckERR(rtn, "overlay");
1244 }
1245}
1246
1247static PyObject *
1248PyCursesWindow_Overwrite(PyCursesWindowObject *self, PyObject *args)
1249{
1250 PyCursesWindowObject *temp;
1251 int use_copywin = FALSE;
1252 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1253 int rtn;
1254
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001255 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001256 case 1:
1257 if (!PyArg_ParseTuple(args, "O!;window object",
1258 &PyCursesWindow_Type, &temp))
1259 return NULL;
1260 break;
1261 case 7:
Neal Norwitz88bbd732006-01-10 07:05:44 +00001262 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001263 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1264 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1265 return NULL;
1266 use_copywin = TRUE;
1267 break;
1268 default:
1269 PyErr_SetString(PyExc_TypeError,
1270 "overwrite requires one or seven arguments");
1271 return NULL;
1272 }
1273
1274 if (use_copywin == TRUE) {
1275 rtn = copywin(self->win, temp->win, sminrow, smincol,
1276 dminrow, dmincol, dmaxrow, dmaxcol, FALSE);
1277 return PyCursesCheckERR(rtn, "copywin");
1278 }
1279 else {
1280 rtn = overwrite(self->win, temp->win);
1281 return PyCursesCheckERR(rtn, "overwrite");
1282 }
1283}
1284
1285static PyObject *
Guido van Rossum6c95da32007-07-24 00:16:38 +00001286PyCursesWindow_PutWin(PyCursesWindowObject *self, PyObject *stream)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001287{
Guido van Rossum6c95da32007-07-24 00:16:38 +00001288 /* We have to simulate this by writing to a temporary FILE*,
1289 then reading back, then writing to the argument stream. */
1290 char fn[100];
1291 int fd;
1292 FILE *fp;
1293 PyObject *res;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00001294
Guido van Rossum6c95da32007-07-24 00:16:38 +00001295 strcpy(fn, "/tmp/py.curses.putwin.XXXXXX");
1296 fd = mkstemp(fn);
1297 if (fd < 0)
1298 return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
1299 fp = fdopen(fd, "wb+");
1300 if (fp == NULL) {
1301 close(fd);
Guido van Rossum150b7d72007-08-30 23:34:01 +00001302 remove(fn);
Guido van Rossum6c95da32007-07-24 00:16:38 +00001303 return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
1304 }
1305 res = PyCursesCheckERR(putwin(self->win, fp), "putwin");
1306 if (res == NULL) {
1307 fclose(fp);
Guido van Rossum150b7d72007-08-30 23:34:01 +00001308 remove(fn);
Guido van Rossum6c95da32007-07-24 00:16:38 +00001309 return res;
1310 }
1311 fseek(fp, 0, 0);
1312 while (1) {
1313 char buf[BUFSIZ];
1314 int n = fread(buf, 1, BUFSIZ, fp);
1315 if (n <= 0)
1316 break;
1317 Py_DECREF(res);
1318 res = PyObject_CallMethod(stream, "write", "y#", buf, n);
1319 if (res == NULL)
1320 break;
1321 }
1322 fclose(fp);
1323 remove(fn);
1324 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001325}
1326
1327static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001328PyCursesWindow_RedrawLine(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001329{
1330 int beg, num;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001331 if (!PyArg_ParseTuple(args, "ii;beg,num", &beg, &num))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001332 return NULL;
1333 return PyCursesCheckERR(wredrawln(self->win,beg,num), "redrawln");
1334}
1335
1336static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001337PyCursesWindow_Refresh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001338{
1339 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001340 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001341
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001342#ifndef WINDOW_HAS_FLAGS
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001343 if (0) {
1344#else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001345 if (self->win->_flags & _ISPAD) {
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001346#endif
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001347 switch(PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001348 case 6:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001349 if (!PyArg_ParseTuple(args,
1350 "iiiiii;" \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001351 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1352 &pminrow, &pmincol, &sminrow,
1353 &smincol, &smaxrow, &smaxcol))
1354 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001355
1356 Py_BEGIN_ALLOW_THREADS
1357 rtn = prefresh(self->win,
1358 pminrow, pmincol, sminrow,
Andrew M. Kuchlingb6e46872000-06-27 15:01:10 +00001359 smincol, smaxrow, smaxcol);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001360 Py_END_ALLOW_THREADS
1361 return PyCursesCheckERR(rtn, "prefresh");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001362 default:
1363 PyErr_SetString(PyCursesError,
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001364 "refresh() for a pad requires 6 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001365 return NULL;
1366 }
1367 } else {
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001368 if (!PyArg_ParseTuple(args, ":refresh"))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001369 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001370 Py_BEGIN_ALLOW_THREADS
1371 rtn = wrefresh(self->win);
1372 Py_END_ALLOW_THREADS
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001373 return PyCursesCheckERR(rtn, "prefresh");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001374 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001375}
1376
1377static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001378PyCursesWindow_SetScrollRegion(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001379{
1380 int x, y;
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001381 if (!PyArg_ParseTuple(args,"ii;top, bottom",&y,&x))
Guido van Rossum85738471995-02-17 13:50:17 +00001382 return NULL;
1383 return PyCursesCheckERR(wsetscrreg(self->win,y,x), "wsetscrreg");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001384}
1385
1386static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001387PyCursesWindow_SubWin(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001388{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001389 WINDOW *win;
1390 int nlines, ncols, begin_y, begin_x;
1391
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001392 nlines = 0;
1393 ncols = 0;
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001394 switch (PyTuple_Size(args)) {
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001395 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001396 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001397 return NULL;
1398 break;
1399 case 4:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001400 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001401 &nlines,&ncols,&begin_y,&begin_x))
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001402 return NULL;
1403 break;
1404 default:
1405 PyErr_SetString(PyExc_TypeError, "subwin requires 2 or 4 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +00001406 return NULL;
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001407 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001408
Andrew M. Kuchling8353f622000-07-26 18:36:27 +00001409 /* printf("Subwin: %i %i %i %i \n", nlines, ncols, begin_y, begin_x); */
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001410#ifdef WINDOW_HAS_FLAGS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001411 if (self->win->_flags & _ISPAD)
1412 win = subpad(self->win, nlines, ncols, begin_y, begin_x);
1413 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001414#endif
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001415 win = subwin(self->win, nlines, ncols, begin_y, begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001416
1417 if (win == NULL) {
1418 PyErr_SetString(PyCursesError, catchall_NULL);
1419 return NULL;
1420 }
1421
1422 return (PyObject *)PyCursesWindow_New(win);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001423}
1424
1425static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001426PyCursesWindow_Scroll(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001427{
Andrew M. Kuchlinge1c43522001-01-29 20:31:29 +00001428 int nlines;
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001429 switch(PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001430 case 0:
1431 return PyCursesCheckERR(scroll(self->win), "scroll");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001432 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001433 if (!PyArg_ParseTuple(args, "i;nlines", &nlines))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001434 return NULL;
Andrew M. Kuchlinge1c43522001-01-29 20:31:29 +00001435 return PyCursesCheckERR(wscrl(self->win, nlines), "scroll");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001436 default:
1437 PyErr_SetString(PyExc_TypeError, "scroll requires 0 or 1 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +00001438 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001439 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001440}
1441
1442static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001443PyCursesWindow_TouchLine(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001444{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001445 int st, cnt, val;
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001446 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001447 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001448 if (!PyArg_ParseTuple(args,"ii;start,count",&st,&cnt))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001449 return NULL;
1450 return PyCursesCheckERR(touchline(self->win,st,cnt), "touchline");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001451 case 3:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001452 if (!PyArg_ParseTuple(args, "iii;start,count,val", &st, &cnt, &val))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001453 return NULL;
1454 return PyCursesCheckERR(wtouchln(self->win, st, cnt, val), "touchline");
1455 default:
1456 PyErr_SetString(PyExc_TypeError, "touchline requires 2 or 3 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +00001457 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001458 }
1459}
1460
1461static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001462PyCursesWindow_Vline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001463{
1464 PyObject *temp;
1465 chtype ch;
1466 int n, x, y, code = OK;
1467 attr_t attr = A_NORMAL;
1468
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001469 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001470 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001471 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001472 return NULL;
1473 break;
1474 case 3:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001475 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001476 return NULL;
1477 break;
1478 case 4:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001479 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001480 return NULL;
1481 code = wmove(self->win, y, x);
1482 break;
1483 case 5:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001484 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001485 &y, &x, &temp, &n, &attr))
1486 return NULL;
1487 code = wmove(self->win, y, x);
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +00001488 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001489 default:
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +00001490 PyErr_SetString(PyExc_TypeError, "vline requires 2 to 5 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001491 return NULL;
1492 }
1493
1494 if (code != ERR) {
1495 if (!PyCurses_ConvertToChtype(temp, &ch)) {
1496 PyErr_SetString(PyExc_TypeError,
1497 "argument 1 or 3 must be a ch or an int");
1498 return NULL;
1499 }
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001500 return PyCursesCheckERR(wvline(self->win, ch | attr, n), "vline");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001501 } else
1502 return PyCursesCheckERR(code, "wmove");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001503}
1504
1505static PyMethodDef PyCursesWindow_Methods[] = {
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001506 {"addch", (PyCFunction)PyCursesWindow_AddCh, METH_VARARGS},
1507 {"addnstr", (PyCFunction)PyCursesWindow_AddNStr, METH_VARARGS},
1508 {"addstr", (PyCFunction)PyCursesWindow_AddStr, METH_VARARGS},
1509 {"attroff", (PyCFunction)PyCursesWindow_wattroff, METH_VARARGS},
1510 {"attron", (PyCFunction)PyCursesWindow_wattron, METH_VARARGS},
1511 {"attrset", (PyCFunction)PyCursesWindow_wattrset, METH_VARARGS},
1512 {"bkgd", (PyCFunction)PyCursesWindow_Bkgd, METH_VARARGS},
Guido van Rossumd8faa362007-04-27 19:54:29 +00001513 {"chgat", (PyCFunction)PyCursesWindow_ChgAt, METH_VARARGS},
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001514 {"bkgdset", (PyCFunction)PyCursesWindow_BkgdSet, METH_VARARGS},
Sjoerd Mullender14ece161995-03-17 12:18:38 +00001515 {"border", (PyCFunction)PyCursesWindow_Border, METH_VARARGS},
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001516 {"box", (PyCFunction)PyCursesWindow_Box, METH_VARARGS},
1517 {"clear", (PyCFunction)PyCursesWindow_wclear, METH_NOARGS},
1518 {"clearok", (PyCFunction)PyCursesWindow_clearok, METH_VARARGS},
1519 {"clrtobot", (PyCFunction)PyCursesWindow_wclrtobot, METH_NOARGS},
1520 {"clrtoeol", (PyCFunction)PyCursesWindow_wclrtoeol, METH_NOARGS},
1521 {"cursyncup", (PyCFunction)PyCursesWindow_wcursyncup, METH_NOARGS},
1522 {"delch", (PyCFunction)PyCursesWindow_DelCh, METH_VARARGS},
1523 {"deleteln", (PyCFunction)PyCursesWindow_wdeleteln, METH_NOARGS},
1524 {"derwin", (PyCFunction)PyCursesWindow_DerWin, METH_VARARGS},
1525 {"echochar", (PyCFunction)PyCursesWindow_EchoChar, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001526#ifdef NCURSES_MOUSE_VERSION
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001527 {"enclose", (PyCFunction)PyCursesWindow_Enclose, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001528#endif
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001529 {"erase", (PyCFunction)PyCursesWindow_werase, METH_NOARGS},
1530 {"getbegyx", (PyCFunction)PyCursesWindow_getbegyx, METH_NOARGS},
1531 {"getbkgd", (PyCFunction)PyCursesWindow_GetBkgd, METH_NOARGS},
1532 {"getch", (PyCFunction)PyCursesWindow_GetCh, METH_VARARGS},
1533 {"getkey", (PyCFunction)PyCursesWindow_GetKey, METH_VARARGS},
1534 {"getmaxyx", (PyCFunction)PyCursesWindow_getmaxyx, METH_NOARGS},
1535 {"getparyx", (PyCFunction)PyCursesWindow_getparyx, METH_NOARGS},
1536 {"getstr", (PyCFunction)PyCursesWindow_GetStr, METH_VARARGS},
1537 {"getyx", (PyCFunction)PyCursesWindow_getyx, METH_NOARGS},
1538 {"hline", (PyCFunction)PyCursesWindow_Hline, METH_VARARGS},
1539 {"idcok", (PyCFunction)PyCursesWindow_idcok, METH_VARARGS},
1540 {"idlok", (PyCFunction)PyCursesWindow_idlok, METH_VARARGS},
1541 {"immedok", (PyCFunction)PyCursesWindow_immedok, METH_VARARGS},
1542 {"inch", (PyCFunction)PyCursesWindow_InCh, METH_VARARGS},
1543 {"insch", (PyCFunction)PyCursesWindow_InsCh, METH_VARARGS},
1544 {"insdelln", (PyCFunction)PyCursesWindow_winsdelln, METH_VARARGS},
1545 {"insertln", (PyCFunction)PyCursesWindow_winsertln, METH_NOARGS},
1546 {"insnstr", (PyCFunction)PyCursesWindow_InsNStr, METH_VARARGS},
1547 {"insstr", (PyCFunction)PyCursesWindow_InsStr, METH_VARARGS},
1548 {"instr", (PyCFunction)PyCursesWindow_InStr, METH_VARARGS},
1549 {"is_linetouched", (PyCFunction)PyCursesWindow_Is_LineTouched, METH_VARARGS},
1550 {"is_wintouched", (PyCFunction)PyCursesWindow_is_wintouched, METH_NOARGS},
1551 {"keypad", (PyCFunction)PyCursesWindow_keypad, METH_VARARGS},
1552 {"leaveok", (PyCFunction)PyCursesWindow_leaveok, METH_VARARGS},
1553 {"move", (PyCFunction)PyCursesWindow_wmove, METH_VARARGS},
1554 {"mvderwin", (PyCFunction)PyCursesWindow_mvderwin, METH_VARARGS},
1555 {"mvwin", (PyCFunction)PyCursesWindow_mvwin, METH_VARARGS},
1556 {"nodelay", (PyCFunction)PyCursesWindow_nodelay, METH_VARARGS},
1557 {"notimeout", (PyCFunction)PyCursesWindow_notimeout, METH_VARARGS},
1558 {"noutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh, METH_VARARGS},
1559 /* Backward compatibility alias -- remove in Python 2.3 */
1560 {"nooutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh, METH_VARARGS},
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +00001561 {"overlay", (PyCFunction)PyCursesWindow_Overlay, METH_VARARGS},
1562 {"overwrite", (PyCFunction)PyCursesWindow_Overwrite,
1563 METH_VARARGS},
Guido van Rossum6c95da32007-07-24 00:16:38 +00001564 {"putwin", (PyCFunction)PyCursesWindow_PutWin, METH_O},
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001565 {"redrawln", (PyCFunction)PyCursesWindow_RedrawLine, METH_VARARGS},
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001566 {"redrawwin", (PyCFunction)PyCursesWindow_redrawwin, METH_NOARGS},
1567 {"refresh", (PyCFunction)PyCursesWindow_Refresh, METH_VARARGS},
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00001568#ifndef STRICT_SYSV_CURSES
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001569 {"resize", (PyCFunction)PyCursesWindow_wresize, METH_VARARGS},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001570#endif
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001571 {"scroll", (PyCFunction)PyCursesWindow_Scroll, METH_VARARGS},
1572 {"scrollok", (PyCFunction)PyCursesWindow_scrollok, METH_VARARGS},
1573 {"setscrreg", (PyCFunction)PyCursesWindow_SetScrollRegion, METH_VARARGS},
1574 {"standend", (PyCFunction)PyCursesWindow_wstandend, METH_NOARGS},
1575 {"standout", (PyCFunction)PyCursesWindow_wstandout, METH_NOARGS},
1576 {"subpad", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
1577 {"subwin", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
1578 {"syncdown", (PyCFunction)PyCursesWindow_wsyncdown, METH_NOARGS},
1579 {"syncok", (PyCFunction)PyCursesWindow_syncok, METH_VARARGS},
1580 {"syncup", (PyCFunction)PyCursesWindow_wsyncup, METH_NOARGS},
1581 {"timeout", (PyCFunction)PyCursesWindow_wtimeout, METH_VARARGS},
1582 {"touchline", (PyCFunction)PyCursesWindow_TouchLine, METH_VARARGS},
1583 {"touchwin", (PyCFunction)PyCursesWindow_touchwin, METH_NOARGS},
1584 {"untouchwin", (PyCFunction)PyCursesWindow_untouchwin, METH_NOARGS},
1585 {"vline", (PyCFunction)PyCursesWindow_Vline, METH_VARARGS},
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +00001586 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00001587};
1588
1589static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001590PyCursesWindow_GetAttr(PyCursesWindowObject *self, char *name)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001591{
Guido van Rossuma597dde1995-01-10 20:56:29 +00001592 return Py_FindMethod(PyCursesWindow_Methods, (PyObject *)self, name);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001593}
1594
Guido van Rossumf6971e21994-08-30 12:25:20 +00001595/* -------------------------------------------------------*/
Guido van Rossum85738471995-02-17 13:50:17 +00001596
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001597PyTypeObject PyCursesWindow_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001598 PyVarObject_HEAD_INIT(NULL, 0)
Guido van Rossum14648392001-12-08 18:02:58 +00001599 "_curses.curses window", /*tp_name*/
Guido van Rossumf6971e21994-08-30 12:25:20 +00001600 sizeof(PyCursesWindowObject), /*tp_basicsize*/
1601 0, /*tp_itemsize*/
1602 /* methods */
1603 (destructor)PyCursesWindow_Dealloc, /*tp_dealloc*/
1604 0, /*tp_print*/
1605 (getattrfunc)PyCursesWindow_GetAttr, /*tp_getattr*/
1606 (setattrfunc)0, /*tp_setattr*/
1607 0, /*tp_compare*/
1608 0, /*tp_repr*/
1609 0, /*tp_as_number*/
1610 0, /*tp_as_sequence*/
1611 0, /*tp_as_mapping*/
1612 0, /*tp_hash*/
1613};
1614
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001615/*********************************************************************
1616 Global Functions
1617**********************************************************************/
Guido van Rossumf6971e21994-08-30 12:25:20 +00001618
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001619NoArgNoReturnFunction(beep)
1620NoArgNoReturnFunction(def_prog_mode)
1621NoArgNoReturnFunction(def_shell_mode)
1622NoArgNoReturnFunction(doupdate)
1623NoArgNoReturnFunction(endwin)
1624NoArgNoReturnFunction(flash)
1625NoArgNoReturnFunction(nocbreak)
1626NoArgNoReturnFunction(noecho)
1627NoArgNoReturnFunction(nonl)
1628NoArgNoReturnFunction(noraw)
1629NoArgNoReturnFunction(reset_prog_mode)
1630NoArgNoReturnFunction(reset_shell_mode)
1631NoArgNoReturnFunction(resetty)
1632NoArgNoReturnFunction(savetty)
1633
1634NoArgOrFlagNoReturnFunction(cbreak)
1635NoArgOrFlagNoReturnFunction(echo)
1636NoArgOrFlagNoReturnFunction(nl)
1637NoArgOrFlagNoReturnFunction(raw)
1638
1639NoArgReturnIntFunction(baudrate)
1640NoArgReturnIntFunction(termattrs)
1641
1642NoArgReturnStringFunction(termname)
1643NoArgReturnStringFunction(longname)
1644
1645NoArgTrueFalseFunction(can_change_color)
1646NoArgTrueFalseFunction(has_colors)
1647NoArgTrueFalseFunction(has_ic)
1648NoArgTrueFalseFunction(has_il)
1649NoArgTrueFalseFunction(isendwin)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001650NoArgNoReturnVoidFunction(filter)
1651NoArgNoReturnVoidFunction(flushinp)
1652NoArgNoReturnVoidFunction(noqiflush)
1653
1654static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001655PyCurses_Color_Content(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001656{
1657 short color,r,g,b;
1658
1659 PyCursesInitialised
1660 PyCursesInitialisedColor
1661
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001662 if (!PyArg_ParseTuple(args, "h:color_content", &color)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001663
1664 if (color_content(color, &r, &g, &b) != ERR)
1665 return Py_BuildValue("(iii)", r, g, b);
1666 else {
1667 PyErr_SetString(PyCursesError,
1668 "Argument 1 was out of range. Check value of COLORS.");
1669 return NULL;
1670 }
1671}
1672
1673static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001674PyCurses_color_pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001675{
1676 int n;
1677
1678 PyCursesInitialised
1679 PyCursesInitialisedColor
1680
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001681 if (!PyArg_ParseTuple(args, "i:color_pair", &n)) return NULL;
Christian Heimes217cfd12007-12-02 14:31:20 +00001682 return PyLong_FromLong((long) (n << 8));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001683}
1684
1685static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001686PyCurses_Curs_Set(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001687{
1688 int vis,erg;
1689
1690 PyCursesInitialised
1691
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001692 if (!PyArg_ParseTuple(args, "i:curs_set", &vis)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001693
1694 erg = curs_set(vis);
1695 if (erg == ERR) return PyCursesCheckERR(erg, "curs_set");
1696
Christian Heimes217cfd12007-12-02 14:31:20 +00001697 return PyLong_FromLong((long) erg);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001698}
1699
1700static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001701PyCurses_Delay_Output(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001702{
1703 int ms;
1704
1705 PyCursesInitialised
1706
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001707 if (!PyArg_ParseTuple(args, "i:delay_output", &ms)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001708
1709 return PyCursesCheckERR(delay_output(ms), "delay_output");
1710}
1711
1712static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001713PyCurses_EraseChar(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001714{
1715 char ch;
1716
1717 PyCursesInitialised
1718
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001719 ch = erasechar();
1720
Martin v. Löwis43f2dc62001-11-11 14:49:15 +00001721 return PyString_FromStringAndSize(&ch, 1);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001722}
1723
1724static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001725PyCurses_getsyx(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001726{
1727 int x,y;
1728
1729 PyCursesInitialised
1730
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001731 getsyx(y, x);
1732
1733 return Py_BuildValue("(ii)", y, x);
1734}
1735
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001736#ifdef NCURSES_MOUSE_VERSION
1737static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001738PyCurses_GetMouse(PyObject *self)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001739{
1740 int rtn;
1741 MEVENT event;
1742
1743 PyCursesInitialised
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001744
1745 rtn = getmouse( &event );
1746 if (rtn == ERR) {
1747 PyErr_SetString(PyCursesError, "getmouse() returned ERR");
1748 return NULL;
1749 }
1750 return Py_BuildValue("(hiiil)",
1751 (short)event.id,
1752 event.x, event.y, event.z,
1753 (long) event.bstate);
1754}
1755
1756static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001757PyCurses_UngetMouse(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001758{
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001759 MEVENT event;
1760
1761 PyCursesInitialised
Neal Norwitz88bbd732006-01-10 07:05:44 +00001762 if (!PyArg_ParseTuple(args, "hiiil",
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001763 &event.id,
1764 &event.x, &event.y, &event.z,
1765 (int *) &event.bstate))
1766 return NULL;
1767
1768 return PyCursesCheckERR(ungetmouse(&event), "ungetmouse");
1769}
1770#endif
1771
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001772static PyObject *
Guido van Rossum6c95da32007-07-24 00:16:38 +00001773PyCurses_GetWin(PyCursesWindowObject *self, PyObject *stream)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001774{
Guido van Rossum6c95da32007-07-24 00:16:38 +00001775 char fn[100];
1776 int fd;
1777 FILE *fp;
1778 PyObject *data;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001779 WINDOW *win;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001780
1781 PyCursesInitialised
1782
Guido van Rossum6c95da32007-07-24 00:16:38 +00001783 strcpy(fn, "/tmp/py.curses.getwin.XXXXXX");
1784 fd = mkstemp(fn);
1785 if (fd < 0)
1786 return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
1787 fp = fdopen(fd, "wb+");
1788 if (fp == NULL) {
1789 close(fd);
Guido van Rossum150b7d72007-08-30 23:34:01 +00001790 remove(fn);
Guido van Rossum6c95da32007-07-24 00:16:38 +00001791 return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
1792 }
1793 data = PyObject_CallMethod(stream, "read", "");
1794 if (data == NULL) {
1795 fclose(fp);
Guido van Rossum150b7d72007-08-30 23:34:01 +00001796 remove(fn);
Guido van Rossum6c95da32007-07-24 00:16:38 +00001797 return NULL;
1798 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00001799 if (!PyString_Check(data)) {
Guido van Rossum6c95da32007-07-24 00:16:38 +00001800 PyErr_Format(PyExc_TypeError,
1801 "f.read() returned %.100s instead of bytes",
1802 data->ob_type->tp_name);
1803 Py_DECREF(data);
1804 fclose(fp);
Guido van Rossum150b7d72007-08-30 23:34:01 +00001805 remove(fn);
Guido van Rossum6c95da32007-07-24 00:16:38 +00001806 return NULL;
1807 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00001808 fwrite(PyString_AS_STRING(data), 1, PyString_GET_SIZE(data), fp);
Guido van Rossum6c95da32007-07-24 00:16:38 +00001809 Py_DECREF(data);
1810 fseek(fp, 0, 0);
1811 win = getwin(fp);
1812 fclose(fp);
Guido van Rossum150b7d72007-08-30 23:34:01 +00001813 remove(fn);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001814 if (win == NULL) {
1815 PyErr_SetString(PyCursesError, catchall_NULL);
1816 return NULL;
1817 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001818 return PyCursesWindow_New(win);
1819}
1820
1821static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001822PyCurses_HalfDelay(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001823{
1824 unsigned char tenths;
1825
1826 PyCursesInitialised
1827
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001828 if (!PyArg_ParseTuple(args, "b:halfdelay", &tenths)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001829
1830 return PyCursesCheckERR(halfdelay(tenths), "halfdelay");
1831}
1832
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00001833#ifndef STRICT_SYSV_CURSES
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001834 /* No has_key! */
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001835static PyObject * PyCurses_has_key(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001836{
1837 int ch;
1838
1839 PyCursesInitialised
1840
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001841 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001842
1843 if (has_key(ch) == FALSE) {
1844 Py_INCREF(Py_False);
1845 return Py_False;
1846 }
1847 Py_INCREF(Py_True);
1848 return Py_True;
1849}
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00001850#endif /* STRICT_SYSV_CURSES */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001851
1852static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001853PyCurses_Init_Color(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001854{
1855 short color, r, g, b;
1856
1857 PyCursesInitialised
1858 PyCursesInitialisedColor
1859
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001860 switch(PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001861 case 4:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001862 if (!PyArg_ParseTuple(args, "hhhh;color,r,g,b", &color, &r, &g, &b)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001863 break;
1864 default:
1865 PyErr_SetString(PyExc_TypeError, "init_color requires 4 arguments");
1866 return NULL;
1867 }
1868
1869 return PyCursesCheckERR(init_color(color, r, g, b), "init_color");
1870}
1871
1872static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001873PyCurses_Init_Pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001874{
1875 short pair, f, b;
1876
1877 PyCursesInitialised
1878 PyCursesInitialisedColor
1879
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001880 if (PyTuple_Size(args) != 3) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001881 PyErr_SetString(PyExc_TypeError, "init_pair requires 3 arguments");
1882 return NULL;
1883 }
1884
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001885 if (!PyArg_ParseTuple(args, "hhh;pair, f, b", &pair, &f, &b)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001886
1887 return PyCursesCheckERR(init_pair(pair, f, b), "init_pair");
1888}
1889
Andrew M. Kuchling32552682000-12-22 21:52:27 +00001890static PyObject *ModDict;
1891
Guido van Rossumf6971e21994-08-30 12:25:20 +00001892static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001893PyCurses_InitScr(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001894{
Guido van Rossum56bf2351994-08-31 22:06:24 +00001895 WINDOW *win;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001896
Guido van Rossum585c6dc1995-02-24 13:45:43 +00001897 if (initialised == TRUE) {
Guido van Rossumf6971e21994-08-30 12:25:20 +00001898 wrefresh(stdscr);
1899 return (PyObject *)PyCursesWindow_New(stdscr);
1900 }
Guido van Rossum56bf2351994-08-31 22:06:24 +00001901
1902 win = initscr();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001903
Guido van Rossum85738471995-02-17 13:50:17 +00001904 if (win == NULL) {
1905 PyErr_SetString(PyCursesError, catchall_NULL);
1906 return NULL;
1907 }
1908
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00001909 initialised = initialised_setupterm = TRUE;
Guido van Rossum56bf2351994-08-31 22:06:24 +00001910
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001911/* This was moved from initcurses() because it core dumped on SGI,
1912 where they're not defined until you've called initscr() */
1913#define SetDictInt(string,ch) \
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001914 do { \
Christian Heimes217cfd12007-12-02 14:31:20 +00001915 PyObject *o = PyLong_FromLong((long) (ch)); \
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001916 if (o && PyDict_SetItemString(ModDict, string, o) == 0) { \
1917 Py_DECREF(o); \
1918 } \
1919 } while (0)
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001920
1921 /* Here are some graphic symbols you can use */
1922 SetDictInt("ACS_ULCORNER", (ACS_ULCORNER));
1923 SetDictInt("ACS_LLCORNER", (ACS_LLCORNER));
1924 SetDictInt("ACS_URCORNER", (ACS_URCORNER));
1925 SetDictInt("ACS_LRCORNER", (ACS_LRCORNER));
1926 SetDictInt("ACS_LTEE", (ACS_LTEE));
1927 SetDictInt("ACS_RTEE", (ACS_RTEE));
1928 SetDictInt("ACS_BTEE", (ACS_BTEE));
1929 SetDictInt("ACS_TTEE", (ACS_TTEE));
1930 SetDictInt("ACS_HLINE", (ACS_HLINE));
1931 SetDictInt("ACS_VLINE", (ACS_VLINE));
1932 SetDictInt("ACS_PLUS", (ACS_PLUS));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001933#if !defined(__hpux) || defined(HAVE_NCURSES_H)
1934 /* On HP/UX 11, these are of type cchar_t, which is not an
1935 integral type. If this is a problem on more platforms, a
1936 configure test should be added to determine whether ACS_S1
1937 is of integral type. */
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001938 SetDictInt("ACS_S1", (ACS_S1));
1939 SetDictInt("ACS_S9", (ACS_S9));
1940 SetDictInt("ACS_DIAMOND", (ACS_DIAMOND));
1941 SetDictInt("ACS_CKBOARD", (ACS_CKBOARD));
1942 SetDictInt("ACS_DEGREE", (ACS_DEGREE));
1943 SetDictInt("ACS_PLMINUS", (ACS_PLMINUS));
1944 SetDictInt("ACS_BULLET", (ACS_BULLET));
1945 SetDictInt("ACS_LARROW", (ACS_LARROW));
1946 SetDictInt("ACS_RARROW", (ACS_RARROW));
1947 SetDictInt("ACS_DARROW", (ACS_DARROW));
1948 SetDictInt("ACS_UARROW", (ACS_UARROW));
1949 SetDictInt("ACS_BOARD", (ACS_BOARD));
1950 SetDictInt("ACS_LANTERN", (ACS_LANTERN));
1951 SetDictInt("ACS_BLOCK", (ACS_BLOCK));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001952#endif
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001953 SetDictInt("ACS_BSSB", (ACS_ULCORNER));
1954 SetDictInt("ACS_SSBB", (ACS_LLCORNER));
1955 SetDictInt("ACS_BBSS", (ACS_URCORNER));
1956 SetDictInt("ACS_SBBS", (ACS_LRCORNER));
1957 SetDictInt("ACS_SBSS", (ACS_RTEE));
1958 SetDictInt("ACS_SSSB", (ACS_LTEE));
1959 SetDictInt("ACS_SSBS", (ACS_BTEE));
1960 SetDictInt("ACS_BSSS", (ACS_TTEE));
1961 SetDictInt("ACS_BSBS", (ACS_HLINE));
1962 SetDictInt("ACS_SBSB", (ACS_VLINE));
1963 SetDictInt("ACS_SSSS", (ACS_PLUS));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001964
1965 /* The following are never available with strict SYSV curses */
1966#ifdef ACS_S3
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001967 SetDictInt("ACS_S3", (ACS_S3));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001968#endif
1969#ifdef ACS_S7
1970 SetDictInt("ACS_S7", (ACS_S7));
1971#endif
1972#ifdef ACS_LEQUAL
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001973 SetDictInt("ACS_LEQUAL", (ACS_LEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001974#endif
1975#ifdef ACS_GEQUAL
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001976 SetDictInt("ACS_GEQUAL", (ACS_GEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001977#endif
1978#ifdef ACS_PI
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001979 SetDictInt("ACS_PI", (ACS_PI));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001980#endif
1981#ifdef ACS_NEQUAL
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001982 SetDictInt("ACS_NEQUAL", (ACS_NEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001983#endif
1984#ifdef ACS_STERLING
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001985 SetDictInt("ACS_STERLING", (ACS_STERLING));
1986#endif
1987
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001988 SetDictInt("LINES", LINES);
1989 SetDictInt("COLS", COLS);
Guido van Rossum56bf2351994-08-31 22:06:24 +00001990
1991 return (PyObject *)PyCursesWindow_New(win);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001992}
1993
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00001994static PyObject *
1995PyCurses_setupterm(PyObject* self, PyObject *args, PyObject* keywds)
1996{
1997 int fd = -1;
1998 int err;
1999 char* termstr = NULL;
2000
Martin v. Löwis15e62742006-02-27 16:46:16 +00002001 static char *kwlist[] = {"term", "fd", NULL};
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002002
2003 if (!PyArg_ParseTupleAndKeywords(
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00002004 args, keywds, "|zi:setupterm", kwlist, &termstr, &fd)) {
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002005 return NULL;
2006 }
2007
2008 if (fd == -1) {
2009 PyObject* sys_stdout;
2010
2011 sys_stdout = PySys_GetObject("stdout");
2012
Christian Heimes2be03732007-11-15 02:26:46 +00002013 if (sys_stdout == NULL || sys_stdout == Py_None) {
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002014 PyErr_SetString(
2015 PyCursesError,
2016 "lost sys.stdout");
2017 return NULL;
2018 }
2019
2020 fd = PyObject_AsFileDescriptor(sys_stdout);
2021
2022 if (fd == -1) {
2023 return NULL;
2024 }
2025 }
2026
2027 if (setupterm(termstr,fd,&err) == ERR) {
2028 char* s = "setupterm: unknown error";
2029
2030 if (err == 0) {
2031 s = "setupterm: could not find terminal";
2032 } else if (err == -1) {
2033 s = "setupterm: could not find terminfo database";
2034 }
2035
2036 PyErr_SetString(PyCursesError,s);
2037 return NULL;
2038 }
2039
2040 initialised_setupterm = TRUE;
2041
2042 Py_INCREF(Py_None);
2043 return Py_None;
2044}
Guido van Rossumf6971e21994-08-30 12:25:20 +00002045
2046static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002047PyCurses_IntrFlush(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002048{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002049 int ch;
2050
2051 PyCursesInitialised
2052
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002053 switch(PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002054 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002055 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002056 break;
2057 default:
2058 PyErr_SetString(PyExc_TypeError, "intrflush requires 1 argument");
Guido van Rossum85738471995-02-17 13:50:17 +00002059 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002060 }
2061
2062 return PyCursesCheckERR(intrflush(NULL,ch), "intrflush");
2063}
2064
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002065#ifdef HAVE_CURSES_IS_TERM_RESIZED
2066static PyObject *
2067PyCurses_Is_Term_Resized(PyObject *self, PyObject *args)
2068{
2069 int lines;
2070 int columns;
2071 int result;
2072
2073 PyCursesInitialised
2074
2075 if (!PyArg_ParseTuple(args,"ii:is_term_resized", &lines, &columns))
2076 return NULL;
2077 result = is_term_resized(lines, columns);
2078 if (result == TRUE) {
2079 Py_INCREF(Py_True);
2080 return Py_True;
2081 } else {
2082 Py_INCREF(Py_False);
2083 return Py_False;
2084 }
2085}
2086#endif /* HAVE_CURSES_IS_TERM_RESIZED */
2087
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002088#if !defined(__NetBSD__)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002089static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002090PyCurses_KeyName(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002091{
2092 const char *knp;
2093 int ch;
2094
2095 PyCursesInitialised
2096
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002097 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002098
Andrew M. Kuchling7e23f002002-11-06 14:15:36 +00002099 if (ch < 0) {
2100 PyErr_SetString(PyExc_ValueError, "invalid key number");
2101 return NULL;
2102 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002103 knp = keyname(ch);
2104
2105 return PyString_FromString((knp == NULL) ? "" : (char *)knp);
2106}
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002107#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002108
2109static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002110PyCurses_KillChar(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002111{
2112 char ch;
2113
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002114 ch = killchar();
2115
Martin v. Löwis43f2dc62001-11-11 14:49:15 +00002116 return PyString_FromStringAndSize(&ch, 1);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002117}
2118
2119static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002120PyCurses_Meta(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002121{
2122 int ch;
2123
2124 PyCursesInitialised
2125
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002126 switch(PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002127 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002128 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002129 break;
2130 default:
2131 PyErr_SetString(PyExc_TypeError, "meta requires 1 argument");
2132 return NULL;
2133 }
2134
2135 return PyCursesCheckERR(meta(stdscr, ch), "meta");
2136}
2137
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002138#ifdef NCURSES_MOUSE_VERSION
2139static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002140PyCurses_MouseInterval(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002141{
2142 int interval;
2143 PyCursesInitialised
2144
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002145 if (!PyArg_ParseTuple(args,"i;interval",&interval))
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002146 return NULL;
2147 return PyCursesCheckERR(mouseinterval(interval), "mouseinterval");
2148}
2149
2150static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002151PyCurses_MouseMask(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002152{
Andrew M. Kuchling1a104002000-07-06 18:14:03 +00002153 int newmask;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002154 mmask_t oldmask, availmask;
2155
2156 PyCursesInitialised
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002157 if (!PyArg_ParseTuple(args,"i;mousemask",&newmask))
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002158 return NULL;
2159 availmask = mousemask(newmask, &oldmask);
2160 return Py_BuildValue("(ll)", (long)availmask, (long)oldmask);
2161}
2162#endif
2163
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002164static PyObject *
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002165PyCurses_Napms(PyObject *self, PyObject *args)
2166{
2167 int ms;
2168
2169 PyCursesInitialised
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002170 if (!PyArg_ParseTuple(args, "i;ms", &ms)) return NULL;
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002171
2172 return Py_BuildValue("i", napms(ms));
2173}
2174
2175
2176static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002177PyCurses_NewPad(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002178{
2179 WINDOW *win;
2180 int nlines, ncols;
2181
2182 PyCursesInitialised
2183
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002184 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002185
2186 win = newpad(nlines, ncols);
2187
2188 if (win == NULL) {
2189 PyErr_SetString(PyCursesError, catchall_NULL);
2190 return NULL;
2191 }
2192
2193 return (PyObject *)PyCursesWindow_New(win);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002194}
2195
2196static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002197PyCurses_NewWindow(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002198{
2199 WINDOW *win;
Andrew M. Kuchling5a76c442001-07-14 20:38:30 +00002200 int nlines, ncols, begin_y=0, begin_x=0;
Guido van Rossum85738471995-02-17 13:50:17 +00002201
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002202 PyCursesInitialised
2203
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002204 switch (PyTuple_Size(args)) {
Guido van Rossum85738471995-02-17 13:50:17 +00002205 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002206 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols))
Guido van Rossum85738471995-02-17 13:50:17 +00002207 return NULL;
2208 break;
2209 case 4:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002210 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
Guido van Rossumf6971e21994-08-30 12:25:20 +00002211 &nlines,&ncols,&begin_y,&begin_x))
Guido van Rossum85738471995-02-17 13:50:17 +00002212 return NULL;
2213 break;
2214 default:
2215 PyErr_SetString(PyExc_TypeError, "newwin requires 2 or 4 arguments");
2216 return NULL;
2217 }
2218
Andrew M. Kuchling5a76c442001-07-14 20:38:30 +00002219 win = newwin(nlines,ncols,begin_y,begin_x);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002220 if (win == NULL) {
Guido van Rossum85738471995-02-17 13:50:17 +00002221 PyErr_SetString(PyCursesError, catchall_NULL);
2222 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002223 }
Guido van Rossum85738471995-02-17 13:50:17 +00002224
Guido van Rossumf6971e21994-08-30 12:25:20 +00002225 return (PyObject *)PyCursesWindow_New(win);
2226}
2227
2228static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002229PyCurses_Pair_Content(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002230{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002231 short pair,f,b;
2232
2233 PyCursesInitialised
2234 PyCursesInitialisedColor
2235
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002236 switch(PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002237 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002238 if (!PyArg_ParseTuple(args, "h;pair", &pair)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002239 break;
2240 default:
2241 PyErr_SetString(PyExc_TypeError, "pair_content requires 1 argument");
Guido van Rossum85738471995-02-17 13:50:17 +00002242 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002243 }
2244
Andrew M. Kuchlingb5e7ff42005-06-15 18:46:50 +00002245 if (pair_content(pair, &f, &b)==ERR) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002246 PyErr_SetString(PyCursesError,
2247 "Argument 1 was out of range. (1..COLOR_PAIRS-1)");
2248 return NULL;
2249 }
2250
2251 return Py_BuildValue("(ii)", f, b);
2252}
2253
2254static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002255PyCurses_pair_number(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002256{
2257 int n;
2258
2259 PyCursesInitialised
2260 PyCursesInitialisedColor
2261
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002262 switch(PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002263 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002264 if (!PyArg_ParseTuple(args, "i;pairvalue", &n)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002265 break;
2266 default:
2267 PyErr_SetString(PyExc_TypeError,
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002268 "pair_number requires 1 argument");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002269 return NULL;
2270 }
2271
Christian Heimes217cfd12007-12-02 14:31:20 +00002272 return PyLong_FromLong((long) ((n & A_COLOR) >> 8));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002273}
2274
2275static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002276PyCurses_Putp(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002277{
2278 char *str;
2279
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002280 if (!PyArg_ParseTuple(args,"s;str", &str)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002281 return PyCursesCheckERR(putp(str), "putp");
2282}
2283
2284static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002285PyCurses_QiFlush(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002286{
2287 int flag = 0;
2288
2289 PyCursesInitialised
2290
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002291 switch(PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002292 case 0:
2293 qiflush();
2294 Py_INCREF(Py_None);
2295 return Py_None;
2296 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002297 if (!PyArg_ParseTuple(args, "i;True(1) or False(0)", &flag)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002298 if (flag) qiflush();
2299 else noqiflush();
2300 Py_INCREF(Py_None);
2301 return Py_None;
2302 default:
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002303 PyErr_SetString(PyExc_TypeError, "qiflush requires 0 or 1 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002304 return NULL;
2305 }
2306}
2307
Guido van Rossumd8faa362007-04-27 19:54:29 +00002308/* Internal helper used for updating curses.LINES, curses.COLS, _curses.LINES
2309 * and _curses.COLS */
2310static int
2311update_lines_cols(void)
2312{
2313 PyObject *o;
2314 PyObject *m = PyImport_ImportModule("curses");
2315
2316 if (!m)
2317 return 0;
2318
Christian Heimes217cfd12007-12-02 14:31:20 +00002319 o = PyLong_FromLong(LINES);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002320 if (!o) {
2321 Py_DECREF(m);
2322 return 0;
2323 }
2324 if (PyObject_SetAttrString(m, "LINES", o)) {
2325 Py_DECREF(m);
2326 Py_DECREF(o);
2327 return 0;
2328 }
2329 if (PyDict_SetItemString(ModDict, "LINES", o)) {
2330 Py_DECREF(m);
2331 Py_DECREF(o);
2332 return 0;
2333 }
2334 Py_DECREF(o);
Christian Heimes217cfd12007-12-02 14:31:20 +00002335 o = PyLong_FromLong(COLS);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002336 if (!o) {
2337 Py_DECREF(m);
2338 return 0;
2339 }
2340 if (PyObject_SetAttrString(m, "COLS", o)) {
2341 Py_DECREF(m);
2342 Py_DECREF(o);
2343 return 0;
2344 }
2345 if (PyDict_SetItemString(ModDict, "COLS", o)) {
2346 Py_DECREF(m);
2347 Py_DECREF(o);
2348 return 0;
2349 }
2350 Py_DECREF(o);
2351 Py_DECREF(m);
2352 return 1;
2353}
2354
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002355#ifdef HAVE_CURSES_RESIZETERM
2356static PyObject *
2357PyCurses_ResizeTerm(PyObject *self, PyObject *args)
2358{
2359 int lines;
2360 int columns;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002361 PyObject *result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002362
2363 PyCursesInitialised
2364
2365 if (!PyArg_ParseTuple(args,"ii:resizeterm", &lines, &columns))
2366 return NULL;
2367
Guido van Rossumd8faa362007-04-27 19:54:29 +00002368 result = PyCursesCheckERR(resizeterm(lines, columns), "resizeterm");
2369 if (!result)
2370 return NULL;
2371 if (!update_lines_cols())
2372 return NULL;
2373 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002374}
2375
2376#endif
2377
2378#ifdef HAVE_CURSES_RESIZE_TERM
2379static PyObject *
2380PyCurses_Resize_Term(PyObject *self, PyObject *args)
2381{
2382 int lines;
2383 int columns;
2384
Guido van Rossumd8faa362007-04-27 19:54:29 +00002385 PyObject *result;
2386
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002387 PyCursesInitialised
2388
2389 if (!PyArg_ParseTuple(args,"ii:resize_term", &lines, &columns))
2390 return NULL;
2391
Guido van Rossumd8faa362007-04-27 19:54:29 +00002392 result = PyCursesCheckERR(resize_term(lines, columns), "resize_term");
2393 if (!result)
2394 return NULL;
2395 if (!update_lines_cols())
2396 return NULL;
2397 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002398}
2399#endif /* HAVE_CURSES_RESIZE_TERM */
2400
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002401static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002402PyCurses_setsyx(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002403{
2404 int y,x;
2405
2406 PyCursesInitialised
2407
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002408 if (PyTuple_Size(args)!=2) {
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002409 PyErr_SetString(PyExc_TypeError, "setsyx requires 2 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002410 return NULL;
2411 }
2412
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002413 if (!PyArg_ParseTuple(args, "ii;y, x", &y, &x)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002414
2415 setsyx(y,x);
2416
Guido van Rossumf6971e21994-08-30 12:25:20 +00002417 Py_INCREF(Py_None);
Guido van Rossum85738471995-02-17 13:50:17 +00002418 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002419}
2420
2421static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002422PyCurses_Start_Color(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002423{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002424 int code;
2425 PyObject *c, *cp;
2426
2427 PyCursesInitialised
2428
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002429 code = start_color();
2430 if (code != ERR) {
2431 initialisedcolors = TRUE;
Christian Heimes217cfd12007-12-02 14:31:20 +00002432 c = PyLong_FromLong((long) COLORS);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002433 PyDict_SetItemString(ModDict, "COLORS", c);
2434 Py_DECREF(c);
Christian Heimes217cfd12007-12-02 14:31:20 +00002435 cp = PyLong_FromLong((long) COLOR_PAIRS);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002436 PyDict_SetItemString(ModDict, "COLOR_PAIRS", cp);
2437 Py_DECREF(cp);
2438 Py_INCREF(Py_None);
2439 return Py_None;
2440 } else {
2441 PyErr_SetString(PyCursesError, "start_color() returned ERR");
Guido van Rossum85738471995-02-17 13:50:17 +00002442 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002443 }
2444}
2445
2446static PyObject *
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002447PyCurses_tigetflag(PyObject *self, PyObject *args)
2448{
2449 char *capname;
2450
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002451 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002452
2453 if (!PyArg_ParseTuple(args, "z", &capname))
2454 return NULL;
2455
Christian Heimes217cfd12007-12-02 14:31:20 +00002456 return PyLong_FromLong( (long) tigetflag( capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002457}
2458
2459static PyObject *
2460PyCurses_tigetnum(PyObject *self, PyObject *args)
2461{
2462 char *capname;
2463
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002464 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002465
2466 if (!PyArg_ParseTuple(args, "z", &capname))
2467 return NULL;
2468
Christian Heimes217cfd12007-12-02 14:31:20 +00002469 return PyLong_FromLong( (long) tigetnum( capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002470}
2471
2472static PyObject *
2473PyCurses_tigetstr(PyObject *self, PyObject *args)
2474{
2475 char *capname;
2476
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002477 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002478
2479 if (!PyArg_ParseTuple(args, "z", &capname))
2480 return NULL;
2481
2482 capname = tigetstr( capname );
2483 if (capname == 0 || capname == (char*) -1) {
2484 Py_INCREF(Py_None);
2485 return Py_None;
2486 }
2487 return PyString_FromString( capname );
2488}
2489
2490static PyObject *
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00002491PyCurses_tparm(PyObject *self, PyObject *args)
2492{
2493 char* fmt;
2494 char* result = NULL;
Michael W. Hudson21007982002-11-21 14:17:51 +00002495 int i1=0,i2=0,i3=0,i4=0,i5=0,i6=0,i7=0,i8=0,i9=0;
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00002496
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002497 PyCursesSetupTermCalled;
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00002498
2499 if (!PyArg_ParseTuple(args, "s|iiiiiiiii:tparm",
2500 &fmt, &i1, &i2, &i3, &i4,
2501 &i5, &i6, &i7, &i8, &i9)) {
2502 return NULL;
2503 }
Michael W. Hudson21007982002-11-21 14:17:51 +00002504
Michael W. Hudson8f514602002-01-16 15:18:09 +00002505 result = tparm(fmt,i1,i2,i3,i4,i5,i6,i7,i8,i9);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002506 if (!result) {
2507 PyErr_SetString(PyCursesError, "tparm() returned NULL");
2508 return NULL;
2509 }
Michael W. Hudson21007982002-11-21 14:17:51 +00002510
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00002511 return PyString_FromString(result);
2512}
2513
2514static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002515PyCurses_TypeAhead(PyObject *self, PyObject *args)
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00002516{
Andrew M. Kuchling1a104002000-07-06 18:14:03 +00002517 int fd;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00002518
2519 PyCursesInitialised
2520
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002521 if (!PyArg_ParseTuple(args,"i;fd",&fd)) return NULL;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00002522
Michael W. Hudson7d6cc5b2004-08-04 14:33:28 +00002523 return PyCursesCheckERR(typeahead( fd ), "typeahead");
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00002524}
2525
2526static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002527PyCurses_UnCtrl(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002528{
2529 PyObject *temp;
2530 chtype ch;
2531
2532 PyCursesInitialised
2533
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002534 if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002535
Guido van Rossum6c95da32007-07-24 00:16:38 +00002536 if (!PyCurses_ConvertToChtype(temp, &ch)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002537 PyErr_SetString(PyExc_TypeError, "argument must be a ch or an int");
2538 return NULL;
2539 }
2540
2541 return PyString_FromString(unctrl(ch));
Guido van Rossumf6971e21994-08-30 12:25:20 +00002542}
2543
2544static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002545PyCurses_UngetCh(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002546{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002547 PyObject *temp;
Guido van Rossum6c95da32007-07-24 00:16:38 +00002548 chtype ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002549
2550 PyCursesInitialised
2551
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002552 if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002553
Guido van Rossum6c95da32007-07-24 00:16:38 +00002554 if (!PyCurses_ConvertToChtype(temp, &ch)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002555 PyErr_SetString(PyExc_TypeError, "argument must be a ch or an int");
Guido van Rossum85738471995-02-17 13:50:17 +00002556 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002557 }
2558
Guido van Rossum85738471995-02-17 13:50:17 +00002559 return PyCursesCheckERR(ungetch(ch), "ungetch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00002560}
2561
2562static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002563PyCurses_Use_Env(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002564{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002565 int flag;
2566
2567 PyCursesInitialised
2568
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002569 switch(PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002570 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002571 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&flag))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002572 return NULL;
2573 break;
2574 default:
2575 PyErr_SetString(PyExc_TypeError, "use_env requires 1 argument");
Guido van Rossum85738471995-02-17 13:50:17 +00002576 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002577 }
2578 use_env(flag);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002579 Py_INCREF(Py_None);
Guido van Rossum85738471995-02-17 13:50:17 +00002580 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002581}
2582
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00002583#ifndef STRICT_SYSV_CURSES
2584static PyObject *
2585PyCurses_Use_Default_Colors(PyObject *self)
2586{
2587 int code;
2588
2589 PyCursesInitialised
2590 PyCursesInitialisedColor
2591
2592 code = use_default_colors();
2593 if (code != ERR) {
2594 Py_INCREF(Py_None);
2595 return Py_None;
2596 } else {
2597 PyErr_SetString(PyCursesError, "use_default_colors() returned ERR");
2598 return NULL;
2599 }
2600}
2601#endif /* STRICT_SYSV_CURSES */
2602
Guido van Rossumf6971e21994-08-30 12:25:20 +00002603/* List of functions defined in the module */
2604
2605static PyMethodDef PyCurses_methods[] = {
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002606 {"baudrate", (PyCFunction)PyCurses_baudrate, METH_NOARGS},
2607 {"beep", (PyCFunction)PyCurses_beep, METH_NOARGS},
2608 {"can_change_color", (PyCFunction)PyCurses_can_change_color, METH_NOARGS},
2609 {"cbreak", (PyCFunction)PyCurses_cbreak, METH_VARARGS},
2610 {"color_content", (PyCFunction)PyCurses_Color_Content, METH_VARARGS},
2611 {"color_pair", (PyCFunction)PyCurses_color_pair, METH_VARARGS},
2612 {"curs_set", (PyCFunction)PyCurses_Curs_Set, METH_VARARGS},
2613 {"def_prog_mode", (PyCFunction)PyCurses_def_prog_mode, METH_NOARGS},
2614 {"def_shell_mode", (PyCFunction)PyCurses_def_shell_mode, METH_NOARGS},
2615 {"delay_output", (PyCFunction)PyCurses_Delay_Output, METH_VARARGS},
2616 {"doupdate", (PyCFunction)PyCurses_doupdate, METH_NOARGS},
2617 {"echo", (PyCFunction)PyCurses_echo, METH_VARARGS},
2618 {"endwin", (PyCFunction)PyCurses_endwin, METH_NOARGS},
2619 {"erasechar", (PyCFunction)PyCurses_EraseChar, METH_NOARGS},
2620 {"filter", (PyCFunction)PyCurses_filter, METH_NOARGS},
2621 {"flash", (PyCFunction)PyCurses_flash, METH_NOARGS},
2622 {"flushinp", (PyCFunction)PyCurses_flushinp, METH_NOARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002623#ifdef NCURSES_MOUSE_VERSION
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002624 {"getmouse", (PyCFunction)PyCurses_GetMouse, METH_NOARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002625 {"ungetmouse", (PyCFunction)PyCurses_UngetMouse, METH_VARARGS},
2626#endif
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002627 {"getsyx", (PyCFunction)PyCurses_getsyx, METH_NOARGS},
2628 {"getwin", (PyCFunction)PyCurses_GetWin, METH_O},
2629 {"has_colors", (PyCFunction)PyCurses_has_colors, METH_NOARGS},
2630 {"has_ic", (PyCFunction)PyCurses_has_ic, METH_NOARGS},
2631 {"has_il", (PyCFunction)PyCurses_has_il, METH_NOARGS},
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00002632#ifndef STRICT_SYSV_CURSES
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002633 {"has_key", (PyCFunction)PyCurses_has_key, METH_VARARGS},
Guido van Rossumf6971e21994-08-30 12:25:20 +00002634#endif
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002635 {"halfdelay", (PyCFunction)PyCurses_HalfDelay, METH_VARARGS},
2636 {"init_color", (PyCFunction)PyCurses_Init_Color, METH_VARARGS},
2637 {"init_pair", (PyCFunction)PyCurses_Init_Pair, METH_VARARGS},
2638 {"initscr", (PyCFunction)PyCurses_InitScr, METH_NOARGS},
2639 {"intrflush", (PyCFunction)PyCurses_IntrFlush, METH_VARARGS},
2640 {"isendwin", (PyCFunction)PyCurses_isendwin, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002641#ifdef HAVE_CURSES_IS_TERM_RESIZED
2642 {"is_term_resized", (PyCFunction)PyCurses_Is_Term_Resized, METH_VARARGS},
2643#endif
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002644#if !defined(__NetBSD__)
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002645 {"keyname", (PyCFunction)PyCurses_KeyName, METH_VARARGS},
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002646#endif
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002647 {"killchar", (PyCFunction)PyCurses_KillChar, METH_NOARGS},
2648 {"longname", (PyCFunction)PyCurses_longname, METH_NOARGS},
2649 {"meta", (PyCFunction)PyCurses_Meta, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002650#ifdef NCURSES_MOUSE_VERSION
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002651 {"mouseinterval", (PyCFunction)PyCurses_MouseInterval, METH_VARARGS},
2652 {"mousemask", (PyCFunction)PyCurses_MouseMask, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002653#endif
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002654 {"napms", (PyCFunction)PyCurses_Napms, METH_VARARGS},
2655 {"newpad", (PyCFunction)PyCurses_NewPad, METH_VARARGS},
2656 {"newwin", (PyCFunction)PyCurses_NewWindow, METH_VARARGS},
2657 {"nl", (PyCFunction)PyCurses_nl, METH_VARARGS},
2658 {"nocbreak", (PyCFunction)PyCurses_nocbreak, METH_NOARGS},
2659 {"noecho", (PyCFunction)PyCurses_noecho, METH_NOARGS},
2660 {"nonl", (PyCFunction)PyCurses_nonl, METH_NOARGS},
2661 {"noqiflush", (PyCFunction)PyCurses_noqiflush, METH_NOARGS},
2662 {"noraw", (PyCFunction)PyCurses_noraw, METH_NOARGS},
2663 {"pair_content", (PyCFunction)PyCurses_Pair_Content, METH_VARARGS},
2664 {"pair_number", (PyCFunction)PyCurses_pair_number, METH_VARARGS},
2665 {"putp", (PyCFunction)PyCurses_Putp, METH_VARARGS},
2666 {"qiflush", (PyCFunction)PyCurses_QiFlush, METH_VARARGS},
2667 {"raw", (PyCFunction)PyCurses_raw, METH_VARARGS},
2668 {"reset_prog_mode", (PyCFunction)PyCurses_reset_prog_mode, METH_NOARGS},
2669 {"reset_shell_mode", (PyCFunction)PyCurses_reset_shell_mode, METH_NOARGS},
2670 {"resetty", (PyCFunction)PyCurses_resetty, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002671#ifdef HAVE_CURSES_RESIZETERM
2672 {"resizeterm", (PyCFunction)PyCurses_ResizeTerm, METH_VARARGS},
2673#endif
2674#ifdef HAVE_CURSES_RESIZE_TERM
2675 {"resize_term", (PyCFunction)PyCurses_Resize_Term, METH_VARARGS},
2676#endif
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002677 {"savetty", (PyCFunction)PyCurses_savetty, METH_NOARGS},
2678 {"setsyx", (PyCFunction)PyCurses_setsyx, METH_VARARGS},
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +00002679 {"setupterm", (PyCFunction)PyCurses_setupterm,
2680 METH_VARARGS|METH_KEYWORDS},
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002681 {"start_color", (PyCFunction)PyCurses_Start_Color, METH_NOARGS},
2682 {"termattrs", (PyCFunction)PyCurses_termattrs, METH_NOARGS},
2683 {"termname", (PyCFunction)PyCurses_termname, METH_NOARGS},
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002684 {"tigetflag", (PyCFunction)PyCurses_tigetflag, METH_VARARGS},
2685 {"tigetnum", (PyCFunction)PyCurses_tigetnum, METH_VARARGS},
2686 {"tigetstr", (PyCFunction)PyCurses_tigetstr, METH_VARARGS},
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00002687 {"tparm", (PyCFunction)PyCurses_tparm, METH_VARARGS},
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002688 {"typeahead", (PyCFunction)PyCurses_TypeAhead, METH_VARARGS},
2689 {"unctrl", (PyCFunction)PyCurses_UnCtrl, METH_VARARGS},
2690 {"ungetch", (PyCFunction)PyCurses_UngetCh, METH_VARARGS},
2691 {"use_env", (PyCFunction)PyCurses_Use_Env, METH_VARARGS},
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00002692#ifndef STRICT_SYSV_CURSES
2693 {"use_default_colors", (PyCFunction)PyCurses_Use_Default_Colors, METH_NOARGS},
2694#endif
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +00002695 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002696};
2697
2698/* Initialization function for the module */
2699
Mark Hammondfe51c6d2002-08-02 02:27:13 +00002700PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002701init_curses(void)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002702{
Andrew M. Kuchling32552682000-12-22 21:52:27 +00002703 PyObject *m, *d, *v, *c_api_object;
2704 static void *PyCurses_API[PyCurses_API_pointers];
2705
Guido van Rossum6915c4d2001-01-19 00:28:08 +00002706 /* Initialize object type */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002707 Py_Type(&PyCursesWindow_Type) = &PyType_Type;
Guido van Rossum6915c4d2001-01-19 00:28:08 +00002708
Andrew M. Kuchling32552682000-12-22 21:52:27 +00002709 /* Initialize the C API pointer array */
2710 PyCurses_API[0] = (void *)&PyCursesWindow_Type;
2711 PyCurses_API[1] = (void *)func_PyCursesSetupTermCalled;
2712 PyCurses_API[2] = (void *)func_PyCursesInitialised;
2713 PyCurses_API[3] = (void *)func_PyCursesInitialisedColor;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002714
2715 /* Create the module and add the functions */
Andrew M. Kuchlingb7f198e2000-06-10 23:12:32 +00002716 m = Py_InitModule("_curses", PyCurses_methods);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00002717 if (m == NULL)
2718 return;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002719
Guido van Rossumf6971e21994-08-30 12:25:20 +00002720 /* Add some symbolic constants to the module */
2721 d = PyModule_GetDict(m);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002722 if (d == NULL)
2723 return;
Andrew M. Kuchling32552682000-12-22 21:52:27 +00002724 ModDict = d; /* For PyCurses_InitScr to use later */
2725
2726 /* Add a CObject for the C API */
2727 c_api_object = PyCObject_FromVoidPtr((void *)PyCurses_API, NULL);
2728 PyDict_SetItemString(d, "_C_API", c_api_object);
Martin v. Löwis00ff10c2001-11-11 14:24:05 +00002729 Py_DECREF(c_api_object);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00002730
Guido van Rossum85738471995-02-17 13:50:17 +00002731 /* For exception curses.error */
Fred Drake589c35b2000-07-06 19:38:49 +00002732 PyCursesError = PyErr_NewException("_curses.error", NULL, NULL);
Guido van Rossum85738471995-02-17 13:50:17 +00002733 PyDict_SetItemString(d, "error", PyCursesError);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00002734
Guido van Rossum85738471995-02-17 13:50:17 +00002735 /* Make the version available */
Guido van Rossum8fbf82b1995-02-17 13:54:04 +00002736 v = PyString_FromString(PyCursesVersion);
2737 PyDict_SetItemString(d, "version", v);
2738 PyDict_SetItemString(d, "__version__", v);
2739 Py_DECREF(v);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002740
Andrew M. Kuchlingcaefb372000-12-26 15:57:01 +00002741 SetDictInt("ERR", ERR);
2742 SetDictInt("OK", OK);
2743
Guido van Rossumf6971e21994-08-30 12:25:20 +00002744 /* Here are some attributes you can add to chars to print */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002745
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002746 SetDictInt("A_ATTRIBUTES", A_ATTRIBUTES);
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002747 SetDictInt("A_NORMAL", A_NORMAL);
2748 SetDictInt("A_STANDOUT", A_STANDOUT);
2749 SetDictInt("A_UNDERLINE", A_UNDERLINE);
2750 SetDictInt("A_REVERSE", A_REVERSE);
2751 SetDictInt("A_BLINK", A_BLINK);
2752 SetDictInt("A_DIM", A_DIM);
2753 SetDictInt("A_BOLD", A_BOLD);
2754 SetDictInt("A_ALTCHARSET", A_ALTCHARSET);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002755#if !defined(__NetBSD__)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002756 SetDictInt("A_INVIS", A_INVIS);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002757#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002758 SetDictInt("A_PROTECT", A_PROTECT);
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002759 SetDictInt("A_CHARTEXT", A_CHARTEXT);
2760 SetDictInt("A_COLOR", A_COLOR);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002761
2762 /* The following are never available with strict SYSV curses */
2763#ifdef A_HORIZONTAL
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002764 SetDictInt("A_HORIZONTAL", A_HORIZONTAL);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002765#endif
2766#ifdef A_LEFT
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002767 SetDictInt("A_LEFT", A_LEFT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002768#endif
2769#ifdef A_LOW
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002770 SetDictInt("A_LOW", A_LOW);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002771#endif
2772#ifdef A_RIGHT
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002773 SetDictInt("A_RIGHT", A_RIGHT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002774#endif
2775#ifdef A_TOP
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002776 SetDictInt("A_TOP", A_TOP);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002777#endif
2778#ifdef A_VERTICAL
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002779 SetDictInt("A_VERTICAL", A_VERTICAL);
2780#endif
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002781
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002782 SetDictInt("COLOR_BLACK", COLOR_BLACK);
2783 SetDictInt("COLOR_RED", COLOR_RED);
2784 SetDictInt("COLOR_GREEN", COLOR_GREEN);
2785 SetDictInt("COLOR_YELLOW", COLOR_YELLOW);
2786 SetDictInt("COLOR_BLUE", COLOR_BLUE);
2787 SetDictInt("COLOR_MAGENTA", COLOR_MAGENTA);
2788 SetDictInt("COLOR_CYAN", COLOR_CYAN);
2789 SetDictInt("COLOR_WHITE", COLOR_WHITE);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002790
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002791#ifdef NCURSES_MOUSE_VERSION
2792 /* Mouse-related constants */
2793 SetDictInt("BUTTON1_PRESSED", BUTTON1_PRESSED);
2794 SetDictInt("BUTTON1_RELEASED", BUTTON1_RELEASED);
2795 SetDictInt("BUTTON1_CLICKED", BUTTON1_CLICKED);
2796 SetDictInt("BUTTON1_DOUBLE_CLICKED", BUTTON1_DOUBLE_CLICKED);
2797 SetDictInt("BUTTON1_TRIPLE_CLICKED", BUTTON1_TRIPLE_CLICKED);
2798
2799 SetDictInt("BUTTON2_PRESSED", BUTTON2_PRESSED);
2800 SetDictInt("BUTTON2_RELEASED", BUTTON2_RELEASED);
2801 SetDictInt("BUTTON2_CLICKED", BUTTON2_CLICKED);
2802 SetDictInt("BUTTON2_DOUBLE_CLICKED", BUTTON2_DOUBLE_CLICKED);
2803 SetDictInt("BUTTON2_TRIPLE_CLICKED", BUTTON2_TRIPLE_CLICKED);
2804
2805 SetDictInt("BUTTON3_PRESSED", BUTTON3_PRESSED);
2806 SetDictInt("BUTTON3_RELEASED", BUTTON3_RELEASED);
2807 SetDictInt("BUTTON3_CLICKED", BUTTON3_CLICKED);
2808 SetDictInt("BUTTON3_DOUBLE_CLICKED", BUTTON3_DOUBLE_CLICKED);
2809 SetDictInt("BUTTON3_TRIPLE_CLICKED", BUTTON3_TRIPLE_CLICKED);
2810
2811 SetDictInt("BUTTON4_PRESSED", BUTTON4_PRESSED);
2812 SetDictInt("BUTTON4_RELEASED", BUTTON4_RELEASED);
2813 SetDictInt("BUTTON4_CLICKED", BUTTON4_CLICKED);
2814 SetDictInt("BUTTON4_DOUBLE_CLICKED", BUTTON4_DOUBLE_CLICKED);
2815 SetDictInt("BUTTON4_TRIPLE_CLICKED", BUTTON4_TRIPLE_CLICKED);
2816
2817 SetDictInt("BUTTON_SHIFT", BUTTON_SHIFT);
2818 SetDictInt("BUTTON_CTRL", BUTTON_CTRL);
2819 SetDictInt("BUTTON_ALT", BUTTON_ALT);
2820
2821 SetDictInt("ALL_MOUSE_EVENTS", ALL_MOUSE_EVENTS);
2822 SetDictInt("REPORT_MOUSE_POSITION", REPORT_MOUSE_POSITION);
2823#endif
Guido van Rossumf6971e21994-08-30 12:25:20 +00002824 /* Now set everything up for KEY_ variables */
2825 {
2826 int key;
2827 char *key_n;
2828 char *key_n2;
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002829#if !defined(__NetBSD__)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002830 for (key=KEY_MIN;key < KEY_MAX; key++) {
2831 key_n = (char *)keyname(key);
Guido van Rossumf5c6d471995-02-07 15:38:32 +00002832 if (key_n == NULL || strcmp(key_n,"UNKNOWN KEY")==0)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002833 continue;
2834 if (strncmp(key_n,"KEY_F(",6)==0) {
2835 char *p1, *p2;
2836 key_n2 = malloc(strlen(key_n)+1);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002837 if (!key_n2) {
2838 PyErr_NoMemory();
2839 break;
2840 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00002841 p1 = key_n;
2842 p2 = key_n2;
2843 while (*p1) {
2844 if (*p1 != '(' && *p1 != ')') {
2845 *p2 = *p1;
2846 p2++;
2847 }
2848 p1++;
2849 }
2850 *p2 = (char)0;
2851 } else
2852 key_n2 = key_n;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002853 SetDictInt(key_n2,key);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002854 if (key_n2 != key_n)
2855 free(key_n2);
2856 }
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002857#endif
Guido van Rossum85738471995-02-17 13:50:17 +00002858 SetDictInt("KEY_MIN", KEY_MIN);
2859 SetDictInt("KEY_MAX", KEY_MAX);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002860 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00002861}