blob: 659ebcee097fe264089abba42d1498df1b30cf49 [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)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000200 *ch = (chtype) PyInt_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
780 return PyInt_FromLong( wenclose(self->win,y,x) );
781}
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{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000787 return PyInt_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 }
Fred Drake0368bc42001-07-19 20:48:32 +0000813 return PyInt_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 }
Guido van Rossum85738471995-02-17 13:50:17 +00001015 return PyInt_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);
1302 return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
1303 }
1304 res = PyCursesCheckERR(putwin(self->win, fp), "putwin");
1305 if (res == NULL) {
1306 fclose(fp);
1307 return res;
1308 }
1309 fseek(fp, 0, 0);
1310 while (1) {
1311 char buf[BUFSIZ];
1312 int n = fread(buf, 1, BUFSIZ, fp);
1313 if (n <= 0)
1314 break;
1315 Py_DECREF(res);
1316 res = PyObject_CallMethod(stream, "write", "y#", buf, n);
1317 if (res == NULL)
1318 break;
1319 }
1320 fclose(fp);
1321 remove(fn);
1322 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001323}
1324
1325static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001326PyCursesWindow_RedrawLine(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001327{
1328 int beg, num;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001329 if (!PyArg_ParseTuple(args, "ii;beg,num", &beg, &num))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001330 return NULL;
1331 return PyCursesCheckERR(wredrawln(self->win,beg,num), "redrawln");
1332}
1333
1334static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001335PyCursesWindow_Refresh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001336{
1337 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001338 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001339
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001340#ifndef WINDOW_HAS_FLAGS
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001341 if (0) {
1342#else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001343 if (self->win->_flags & _ISPAD) {
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001344#endif
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001345 switch(PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001346 case 6:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001347 if (!PyArg_ParseTuple(args,
1348 "iiiiii;" \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001349 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1350 &pminrow, &pmincol, &sminrow,
1351 &smincol, &smaxrow, &smaxcol))
1352 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001353
1354 Py_BEGIN_ALLOW_THREADS
1355 rtn = prefresh(self->win,
1356 pminrow, pmincol, sminrow,
Andrew M. Kuchlingb6e46872000-06-27 15:01:10 +00001357 smincol, smaxrow, smaxcol);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001358 Py_END_ALLOW_THREADS
1359 return PyCursesCheckERR(rtn, "prefresh");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001360 default:
1361 PyErr_SetString(PyCursesError,
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001362 "refresh() for a pad requires 6 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001363 return NULL;
1364 }
1365 } else {
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001366 if (!PyArg_ParseTuple(args, ":refresh"))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001367 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001368 Py_BEGIN_ALLOW_THREADS
1369 rtn = wrefresh(self->win);
1370 Py_END_ALLOW_THREADS
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001371 return PyCursesCheckERR(rtn, "prefresh");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001372 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001373}
1374
1375static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001376PyCursesWindow_SetScrollRegion(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001377{
1378 int x, y;
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001379 if (!PyArg_ParseTuple(args,"ii;top, bottom",&y,&x))
Guido van Rossum85738471995-02-17 13:50:17 +00001380 return NULL;
1381 return PyCursesCheckERR(wsetscrreg(self->win,y,x), "wsetscrreg");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001382}
1383
1384static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001385PyCursesWindow_SubWin(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001386{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001387 WINDOW *win;
1388 int nlines, ncols, begin_y, begin_x;
1389
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001390 nlines = 0;
1391 ncols = 0;
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001392 switch (PyTuple_Size(args)) {
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001393 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001394 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001395 return NULL;
1396 break;
1397 case 4:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001398 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001399 &nlines,&ncols,&begin_y,&begin_x))
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001400 return NULL;
1401 break;
1402 default:
1403 PyErr_SetString(PyExc_TypeError, "subwin requires 2 or 4 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +00001404 return NULL;
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001405 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001406
Andrew M. Kuchling8353f622000-07-26 18:36:27 +00001407 /* printf("Subwin: %i %i %i %i \n", nlines, ncols, begin_y, begin_x); */
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001408#ifdef WINDOW_HAS_FLAGS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001409 if (self->win->_flags & _ISPAD)
1410 win = subpad(self->win, nlines, ncols, begin_y, begin_x);
1411 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001412#endif
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001413 win = subwin(self->win, nlines, ncols, begin_y, begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001414
1415 if (win == NULL) {
1416 PyErr_SetString(PyCursesError, catchall_NULL);
1417 return NULL;
1418 }
1419
1420 return (PyObject *)PyCursesWindow_New(win);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001421}
1422
1423static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001424PyCursesWindow_Scroll(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001425{
Andrew M. Kuchlinge1c43522001-01-29 20:31:29 +00001426 int nlines;
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001427 switch(PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001428 case 0:
1429 return PyCursesCheckERR(scroll(self->win), "scroll");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001430 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001431 if (!PyArg_ParseTuple(args, "i;nlines", &nlines))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001432 return NULL;
Andrew M. Kuchlinge1c43522001-01-29 20:31:29 +00001433 return PyCursesCheckERR(wscrl(self->win, nlines), "scroll");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001434 default:
1435 PyErr_SetString(PyExc_TypeError, "scroll requires 0 or 1 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +00001436 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001437 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001438}
1439
1440static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001441PyCursesWindow_TouchLine(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001442{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001443 int st, cnt, val;
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001444 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001445 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001446 if (!PyArg_ParseTuple(args,"ii;start,count",&st,&cnt))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001447 return NULL;
1448 return PyCursesCheckERR(touchline(self->win,st,cnt), "touchline");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001449 case 3:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001450 if (!PyArg_ParseTuple(args, "iii;start,count,val", &st, &cnt, &val))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001451 return NULL;
1452 return PyCursesCheckERR(wtouchln(self->win, st, cnt, val), "touchline");
1453 default:
1454 PyErr_SetString(PyExc_TypeError, "touchline requires 2 or 3 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +00001455 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001456 }
1457}
1458
1459static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001460PyCursesWindow_Vline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001461{
1462 PyObject *temp;
1463 chtype ch;
1464 int n, x, y, code = OK;
1465 attr_t attr = A_NORMAL;
1466
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001467 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001468 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001469 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001470 return NULL;
1471 break;
1472 case 3:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001473 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001474 return NULL;
1475 break;
1476 case 4:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001477 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001478 return NULL;
1479 code = wmove(self->win, y, x);
1480 break;
1481 case 5:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001482 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001483 &y, &x, &temp, &n, &attr))
1484 return NULL;
1485 code = wmove(self->win, y, x);
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +00001486 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001487 default:
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +00001488 PyErr_SetString(PyExc_TypeError, "vline requires 2 to 5 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001489 return NULL;
1490 }
1491
1492 if (code != ERR) {
1493 if (!PyCurses_ConvertToChtype(temp, &ch)) {
1494 PyErr_SetString(PyExc_TypeError,
1495 "argument 1 or 3 must be a ch or an int");
1496 return NULL;
1497 }
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001498 return PyCursesCheckERR(wvline(self->win, ch | attr, n), "vline");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001499 } else
1500 return PyCursesCheckERR(code, "wmove");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001501}
1502
1503static PyMethodDef PyCursesWindow_Methods[] = {
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001504 {"addch", (PyCFunction)PyCursesWindow_AddCh, METH_VARARGS},
1505 {"addnstr", (PyCFunction)PyCursesWindow_AddNStr, METH_VARARGS},
1506 {"addstr", (PyCFunction)PyCursesWindow_AddStr, METH_VARARGS},
1507 {"attroff", (PyCFunction)PyCursesWindow_wattroff, METH_VARARGS},
1508 {"attron", (PyCFunction)PyCursesWindow_wattron, METH_VARARGS},
1509 {"attrset", (PyCFunction)PyCursesWindow_wattrset, METH_VARARGS},
1510 {"bkgd", (PyCFunction)PyCursesWindow_Bkgd, METH_VARARGS},
Guido van Rossumd8faa362007-04-27 19:54:29 +00001511 {"chgat", (PyCFunction)PyCursesWindow_ChgAt, METH_VARARGS},
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001512 {"bkgdset", (PyCFunction)PyCursesWindow_BkgdSet, METH_VARARGS},
Sjoerd Mullender14ece161995-03-17 12:18:38 +00001513 {"border", (PyCFunction)PyCursesWindow_Border, METH_VARARGS},
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001514 {"box", (PyCFunction)PyCursesWindow_Box, METH_VARARGS},
1515 {"clear", (PyCFunction)PyCursesWindow_wclear, METH_NOARGS},
1516 {"clearok", (PyCFunction)PyCursesWindow_clearok, METH_VARARGS},
1517 {"clrtobot", (PyCFunction)PyCursesWindow_wclrtobot, METH_NOARGS},
1518 {"clrtoeol", (PyCFunction)PyCursesWindow_wclrtoeol, METH_NOARGS},
1519 {"cursyncup", (PyCFunction)PyCursesWindow_wcursyncup, METH_NOARGS},
1520 {"delch", (PyCFunction)PyCursesWindow_DelCh, METH_VARARGS},
1521 {"deleteln", (PyCFunction)PyCursesWindow_wdeleteln, METH_NOARGS},
1522 {"derwin", (PyCFunction)PyCursesWindow_DerWin, METH_VARARGS},
1523 {"echochar", (PyCFunction)PyCursesWindow_EchoChar, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001524#ifdef NCURSES_MOUSE_VERSION
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001525 {"enclose", (PyCFunction)PyCursesWindow_Enclose, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001526#endif
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001527 {"erase", (PyCFunction)PyCursesWindow_werase, METH_NOARGS},
1528 {"getbegyx", (PyCFunction)PyCursesWindow_getbegyx, METH_NOARGS},
1529 {"getbkgd", (PyCFunction)PyCursesWindow_GetBkgd, METH_NOARGS},
1530 {"getch", (PyCFunction)PyCursesWindow_GetCh, METH_VARARGS},
1531 {"getkey", (PyCFunction)PyCursesWindow_GetKey, METH_VARARGS},
1532 {"getmaxyx", (PyCFunction)PyCursesWindow_getmaxyx, METH_NOARGS},
1533 {"getparyx", (PyCFunction)PyCursesWindow_getparyx, METH_NOARGS},
1534 {"getstr", (PyCFunction)PyCursesWindow_GetStr, METH_VARARGS},
1535 {"getyx", (PyCFunction)PyCursesWindow_getyx, METH_NOARGS},
1536 {"hline", (PyCFunction)PyCursesWindow_Hline, METH_VARARGS},
1537 {"idcok", (PyCFunction)PyCursesWindow_idcok, METH_VARARGS},
1538 {"idlok", (PyCFunction)PyCursesWindow_idlok, METH_VARARGS},
1539 {"immedok", (PyCFunction)PyCursesWindow_immedok, METH_VARARGS},
1540 {"inch", (PyCFunction)PyCursesWindow_InCh, METH_VARARGS},
1541 {"insch", (PyCFunction)PyCursesWindow_InsCh, METH_VARARGS},
1542 {"insdelln", (PyCFunction)PyCursesWindow_winsdelln, METH_VARARGS},
1543 {"insertln", (PyCFunction)PyCursesWindow_winsertln, METH_NOARGS},
1544 {"insnstr", (PyCFunction)PyCursesWindow_InsNStr, METH_VARARGS},
1545 {"insstr", (PyCFunction)PyCursesWindow_InsStr, METH_VARARGS},
1546 {"instr", (PyCFunction)PyCursesWindow_InStr, METH_VARARGS},
1547 {"is_linetouched", (PyCFunction)PyCursesWindow_Is_LineTouched, METH_VARARGS},
1548 {"is_wintouched", (PyCFunction)PyCursesWindow_is_wintouched, METH_NOARGS},
1549 {"keypad", (PyCFunction)PyCursesWindow_keypad, METH_VARARGS},
1550 {"leaveok", (PyCFunction)PyCursesWindow_leaveok, METH_VARARGS},
1551 {"move", (PyCFunction)PyCursesWindow_wmove, METH_VARARGS},
1552 {"mvderwin", (PyCFunction)PyCursesWindow_mvderwin, METH_VARARGS},
1553 {"mvwin", (PyCFunction)PyCursesWindow_mvwin, METH_VARARGS},
1554 {"nodelay", (PyCFunction)PyCursesWindow_nodelay, METH_VARARGS},
1555 {"notimeout", (PyCFunction)PyCursesWindow_notimeout, METH_VARARGS},
1556 {"noutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh, METH_VARARGS},
1557 /* Backward compatibility alias -- remove in Python 2.3 */
1558 {"nooutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh, METH_VARARGS},
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +00001559 {"overlay", (PyCFunction)PyCursesWindow_Overlay, METH_VARARGS},
1560 {"overwrite", (PyCFunction)PyCursesWindow_Overwrite,
1561 METH_VARARGS},
Guido van Rossum6c95da32007-07-24 00:16:38 +00001562 {"putwin", (PyCFunction)PyCursesWindow_PutWin, METH_O},
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001563 {"redrawln", (PyCFunction)PyCursesWindow_RedrawLine, METH_VARARGS},
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001564 {"redrawwin", (PyCFunction)PyCursesWindow_redrawwin, METH_NOARGS},
1565 {"refresh", (PyCFunction)PyCursesWindow_Refresh, METH_VARARGS},
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00001566#ifndef STRICT_SYSV_CURSES
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001567 {"resize", (PyCFunction)PyCursesWindow_wresize, METH_VARARGS},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001568#endif
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001569 {"scroll", (PyCFunction)PyCursesWindow_Scroll, METH_VARARGS},
1570 {"scrollok", (PyCFunction)PyCursesWindow_scrollok, METH_VARARGS},
1571 {"setscrreg", (PyCFunction)PyCursesWindow_SetScrollRegion, METH_VARARGS},
1572 {"standend", (PyCFunction)PyCursesWindow_wstandend, METH_NOARGS},
1573 {"standout", (PyCFunction)PyCursesWindow_wstandout, METH_NOARGS},
1574 {"subpad", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
1575 {"subwin", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
1576 {"syncdown", (PyCFunction)PyCursesWindow_wsyncdown, METH_NOARGS},
1577 {"syncok", (PyCFunction)PyCursesWindow_syncok, METH_VARARGS},
1578 {"syncup", (PyCFunction)PyCursesWindow_wsyncup, METH_NOARGS},
1579 {"timeout", (PyCFunction)PyCursesWindow_wtimeout, METH_VARARGS},
1580 {"touchline", (PyCFunction)PyCursesWindow_TouchLine, METH_VARARGS},
1581 {"touchwin", (PyCFunction)PyCursesWindow_touchwin, METH_NOARGS},
1582 {"untouchwin", (PyCFunction)PyCursesWindow_untouchwin, METH_NOARGS},
1583 {"vline", (PyCFunction)PyCursesWindow_Vline, METH_VARARGS},
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +00001584 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00001585};
1586
1587static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001588PyCursesWindow_GetAttr(PyCursesWindowObject *self, char *name)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001589{
Guido van Rossuma597dde1995-01-10 20:56:29 +00001590 return Py_FindMethod(PyCursesWindow_Methods, (PyObject *)self, name);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001591}
1592
Guido van Rossumf6971e21994-08-30 12:25:20 +00001593/* -------------------------------------------------------*/
Guido van Rossum85738471995-02-17 13:50:17 +00001594
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001595PyTypeObject PyCursesWindow_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001596 PyVarObject_HEAD_INIT(NULL, 0)
Guido van Rossum14648392001-12-08 18:02:58 +00001597 "_curses.curses window", /*tp_name*/
Guido van Rossumf6971e21994-08-30 12:25:20 +00001598 sizeof(PyCursesWindowObject), /*tp_basicsize*/
1599 0, /*tp_itemsize*/
1600 /* methods */
1601 (destructor)PyCursesWindow_Dealloc, /*tp_dealloc*/
1602 0, /*tp_print*/
1603 (getattrfunc)PyCursesWindow_GetAttr, /*tp_getattr*/
1604 (setattrfunc)0, /*tp_setattr*/
1605 0, /*tp_compare*/
1606 0, /*tp_repr*/
1607 0, /*tp_as_number*/
1608 0, /*tp_as_sequence*/
1609 0, /*tp_as_mapping*/
1610 0, /*tp_hash*/
1611};
1612
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001613/*********************************************************************
1614 Global Functions
1615**********************************************************************/
Guido van Rossumf6971e21994-08-30 12:25:20 +00001616
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001617NoArgNoReturnFunction(beep)
1618NoArgNoReturnFunction(def_prog_mode)
1619NoArgNoReturnFunction(def_shell_mode)
1620NoArgNoReturnFunction(doupdate)
1621NoArgNoReturnFunction(endwin)
1622NoArgNoReturnFunction(flash)
1623NoArgNoReturnFunction(nocbreak)
1624NoArgNoReturnFunction(noecho)
1625NoArgNoReturnFunction(nonl)
1626NoArgNoReturnFunction(noraw)
1627NoArgNoReturnFunction(reset_prog_mode)
1628NoArgNoReturnFunction(reset_shell_mode)
1629NoArgNoReturnFunction(resetty)
1630NoArgNoReturnFunction(savetty)
1631
1632NoArgOrFlagNoReturnFunction(cbreak)
1633NoArgOrFlagNoReturnFunction(echo)
1634NoArgOrFlagNoReturnFunction(nl)
1635NoArgOrFlagNoReturnFunction(raw)
1636
1637NoArgReturnIntFunction(baudrate)
1638NoArgReturnIntFunction(termattrs)
1639
1640NoArgReturnStringFunction(termname)
1641NoArgReturnStringFunction(longname)
1642
1643NoArgTrueFalseFunction(can_change_color)
1644NoArgTrueFalseFunction(has_colors)
1645NoArgTrueFalseFunction(has_ic)
1646NoArgTrueFalseFunction(has_il)
1647NoArgTrueFalseFunction(isendwin)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001648NoArgNoReturnVoidFunction(filter)
1649NoArgNoReturnVoidFunction(flushinp)
1650NoArgNoReturnVoidFunction(noqiflush)
1651
1652static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001653PyCurses_Color_Content(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001654{
1655 short color,r,g,b;
1656
1657 PyCursesInitialised
1658 PyCursesInitialisedColor
1659
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001660 if (!PyArg_ParseTuple(args, "h:color_content", &color)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001661
1662 if (color_content(color, &r, &g, &b) != ERR)
1663 return Py_BuildValue("(iii)", r, g, b);
1664 else {
1665 PyErr_SetString(PyCursesError,
1666 "Argument 1 was out of range. Check value of COLORS.");
1667 return NULL;
1668 }
1669}
1670
1671static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001672PyCurses_color_pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001673{
1674 int n;
1675
1676 PyCursesInitialised
1677 PyCursesInitialisedColor
1678
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001679 if (!PyArg_ParseTuple(args, "i:color_pair", &n)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001680 return PyInt_FromLong((long) (n << 8));
1681}
1682
1683static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001684PyCurses_Curs_Set(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001685{
1686 int vis,erg;
1687
1688 PyCursesInitialised
1689
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001690 if (!PyArg_ParseTuple(args, "i:curs_set", &vis)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001691
1692 erg = curs_set(vis);
1693 if (erg == ERR) return PyCursesCheckERR(erg, "curs_set");
1694
1695 return PyInt_FromLong((long) erg);
1696}
1697
1698static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001699PyCurses_Delay_Output(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001700{
1701 int ms;
1702
1703 PyCursesInitialised
1704
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001705 if (!PyArg_ParseTuple(args, "i:delay_output", &ms)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001706
1707 return PyCursesCheckERR(delay_output(ms), "delay_output");
1708}
1709
1710static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001711PyCurses_EraseChar(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001712{
1713 char ch;
1714
1715 PyCursesInitialised
1716
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001717 ch = erasechar();
1718
Martin v. Löwis43f2dc62001-11-11 14:49:15 +00001719 return PyString_FromStringAndSize(&ch, 1);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001720}
1721
1722static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001723PyCurses_getsyx(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001724{
1725 int x,y;
1726
1727 PyCursesInitialised
1728
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001729 getsyx(y, x);
1730
1731 return Py_BuildValue("(ii)", y, x);
1732}
1733
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001734#ifdef NCURSES_MOUSE_VERSION
1735static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001736PyCurses_GetMouse(PyObject *self)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001737{
1738 int rtn;
1739 MEVENT event;
1740
1741 PyCursesInitialised
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001742
1743 rtn = getmouse( &event );
1744 if (rtn == ERR) {
1745 PyErr_SetString(PyCursesError, "getmouse() returned ERR");
1746 return NULL;
1747 }
1748 return Py_BuildValue("(hiiil)",
1749 (short)event.id,
1750 event.x, event.y, event.z,
1751 (long) event.bstate);
1752}
1753
1754static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001755PyCurses_UngetMouse(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001756{
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001757 MEVENT event;
1758
1759 PyCursesInitialised
Neal Norwitz88bbd732006-01-10 07:05:44 +00001760 if (!PyArg_ParseTuple(args, "hiiil",
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001761 &event.id,
1762 &event.x, &event.y, &event.z,
1763 (int *) &event.bstate))
1764 return NULL;
1765
1766 return PyCursesCheckERR(ungetmouse(&event), "ungetmouse");
1767}
1768#endif
1769
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001770static PyObject *
Guido van Rossum6c95da32007-07-24 00:16:38 +00001771PyCurses_GetWin(PyCursesWindowObject *self, PyObject *stream)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001772{
Guido van Rossum6c95da32007-07-24 00:16:38 +00001773 char fn[100];
1774 int fd;
1775 FILE *fp;
1776 PyObject *data;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001777 WINDOW *win;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001778
1779 PyCursesInitialised
1780
Guido van Rossum6c95da32007-07-24 00:16:38 +00001781 strcpy(fn, "/tmp/py.curses.getwin.XXXXXX");
1782 fd = mkstemp(fn);
1783 if (fd < 0)
1784 return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
1785 fp = fdopen(fd, "wb+");
1786 if (fp == NULL) {
1787 close(fd);
1788 return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
1789 }
1790 data = PyObject_CallMethod(stream, "read", "");
1791 if (data == NULL) {
1792 fclose(fp);
1793 return NULL;
1794 }
1795 if (!PyBytes_Check(data)) {
1796 PyErr_Format(PyExc_TypeError,
1797 "f.read() returned %.100s instead of bytes",
1798 data->ob_type->tp_name);
1799 Py_DECREF(data);
1800 fclose(fp);
1801 return NULL;
1802 }
1803 fwrite(PyBytes_AS_STRING(data), 1, PyBytes_GET_SIZE(data), fp);
1804 Py_DECREF(data);
1805 fseek(fp, 0, 0);
1806 win = getwin(fp);
1807 fclose(fp);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001808 if (win == NULL) {
1809 PyErr_SetString(PyCursesError, catchall_NULL);
1810 return NULL;
1811 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001812 return PyCursesWindow_New(win);
1813}
1814
1815static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001816PyCurses_HalfDelay(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001817{
1818 unsigned char tenths;
1819
1820 PyCursesInitialised
1821
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001822 if (!PyArg_ParseTuple(args, "b:halfdelay", &tenths)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001823
1824 return PyCursesCheckERR(halfdelay(tenths), "halfdelay");
1825}
1826
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00001827#ifndef STRICT_SYSV_CURSES
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001828 /* No has_key! */
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001829static PyObject * PyCurses_has_key(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001830{
1831 int ch;
1832
1833 PyCursesInitialised
1834
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001835 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001836
1837 if (has_key(ch) == FALSE) {
1838 Py_INCREF(Py_False);
1839 return Py_False;
1840 }
1841 Py_INCREF(Py_True);
1842 return Py_True;
1843}
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00001844#endif /* STRICT_SYSV_CURSES */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001845
1846static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001847PyCurses_Init_Color(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001848{
1849 short color, r, g, b;
1850
1851 PyCursesInitialised
1852 PyCursesInitialisedColor
1853
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001854 switch(PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001855 case 4:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001856 if (!PyArg_ParseTuple(args, "hhhh;color,r,g,b", &color, &r, &g, &b)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001857 break;
1858 default:
1859 PyErr_SetString(PyExc_TypeError, "init_color requires 4 arguments");
1860 return NULL;
1861 }
1862
1863 return PyCursesCheckERR(init_color(color, r, g, b), "init_color");
1864}
1865
1866static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001867PyCurses_Init_Pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001868{
1869 short pair, f, b;
1870
1871 PyCursesInitialised
1872 PyCursesInitialisedColor
1873
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001874 if (PyTuple_Size(args) != 3) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001875 PyErr_SetString(PyExc_TypeError, "init_pair requires 3 arguments");
1876 return NULL;
1877 }
1878
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001879 if (!PyArg_ParseTuple(args, "hhh;pair, f, b", &pair, &f, &b)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001880
1881 return PyCursesCheckERR(init_pair(pair, f, b), "init_pair");
1882}
1883
Andrew M. Kuchling32552682000-12-22 21:52:27 +00001884static PyObject *ModDict;
1885
Guido van Rossumf6971e21994-08-30 12:25:20 +00001886static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001887PyCurses_InitScr(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001888{
Guido van Rossum56bf2351994-08-31 22:06:24 +00001889 WINDOW *win;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001890
Guido van Rossum585c6dc1995-02-24 13:45:43 +00001891 if (initialised == TRUE) {
Guido van Rossumf6971e21994-08-30 12:25:20 +00001892 wrefresh(stdscr);
1893 return (PyObject *)PyCursesWindow_New(stdscr);
1894 }
Guido van Rossum56bf2351994-08-31 22:06:24 +00001895
1896 win = initscr();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001897
Guido van Rossum85738471995-02-17 13:50:17 +00001898 if (win == NULL) {
1899 PyErr_SetString(PyCursesError, catchall_NULL);
1900 return NULL;
1901 }
1902
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00001903 initialised = initialised_setupterm = TRUE;
Guido van Rossum56bf2351994-08-31 22:06:24 +00001904
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001905/* This was moved from initcurses() because it core dumped on SGI,
1906 where they're not defined until you've called initscr() */
1907#define SetDictInt(string,ch) \
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001908 do { \
1909 PyObject *o = PyInt_FromLong((long) (ch)); \
1910 if (o && PyDict_SetItemString(ModDict, string, o) == 0) { \
1911 Py_DECREF(o); \
1912 } \
1913 } while (0)
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001914
1915 /* Here are some graphic symbols you can use */
1916 SetDictInt("ACS_ULCORNER", (ACS_ULCORNER));
1917 SetDictInt("ACS_LLCORNER", (ACS_LLCORNER));
1918 SetDictInt("ACS_URCORNER", (ACS_URCORNER));
1919 SetDictInt("ACS_LRCORNER", (ACS_LRCORNER));
1920 SetDictInt("ACS_LTEE", (ACS_LTEE));
1921 SetDictInt("ACS_RTEE", (ACS_RTEE));
1922 SetDictInt("ACS_BTEE", (ACS_BTEE));
1923 SetDictInt("ACS_TTEE", (ACS_TTEE));
1924 SetDictInt("ACS_HLINE", (ACS_HLINE));
1925 SetDictInt("ACS_VLINE", (ACS_VLINE));
1926 SetDictInt("ACS_PLUS", (ACS_PLUS));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001927#if !defined(__hpux) || defined(HAVE_NCURSES_H)
1928 /* On HP/UX 11, these are of type cchar_t, which is not an
1929 integral type. If this is a problem on more platforms, a
1930 configure test should be added to determine whether ACS_S1
1931 is of integral type. */
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001932 SetDictInt("ACS_S1", (ACS_S1));
1933 SetDictInt("ACS_S9", (ACS_S9));
1934 SetDictInt("ACS_DIAMOND", (ACS_DIAMOND));
1935 SetDictInt("ACS_CKBOARD", (ACS_CKBOARD));
1936 SetDictInt("ACS_DEGREE", (ACS_DEGREE));
1937 SetDictInt("ACS_PLMINUS", (ACS_PLMINUS));
1938 SetDictInt("ACS_BULLET", (ACS_BULLET));
1939 SetDictInt("ACS_LARROW", (ACS_LARROW));
1940 SetDictInt("ACS_RARROW", (ACS_RARROW));
1941 SetDictInt("ACS_DARROW", (ACS_DARROW));
1942 SetDictInt("ACS_UARROW", (ACS_UARROW));
1943 SetDictInt("ACS_BOARD", (ACS_BOARD));
1944 SetDictInt("ACS_LANTERN", (ACS_LANTERN));
1945 SetDictInt("ACS_BLOCK", (ACS_BLOCK));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001946#endif
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001947 SetDictInt("ACS_BSSB", (ACS_ULCORNER));
1948 SetDictInt("ACS_SSBB", (ACS_LLCORNER));
1949 SetDictInt("ACS_BBSS", (ACS_URCORNER));
1950 SetDictInt("ACS_SBBS", (ACS_LRCORNER));
1951 SetDictInt("ACS_SBSS", (ACS_RTEE));
1952 SetDictInt("ACS_SSSB", (ACS_LTEE));
1953 SetDictInt("ACS_SSBS", (ACS_BTEE));
1954 SetDictInt("ACS_BSSS", (ACS_TTEE));
1955 SetDictInt("ACS_BSBS", (ACS_HLINE));
1956 SetDictInt("ACS_SBSB", (ACS_VLINE));
1957 SetDictInt("ACS_SSSS", (ACS_PLUS));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001958
1959 /* The following are never available with strict SYSV curses */
1960#ifdef ACS_S3
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001961 SetDictInt("ACS_S3", (ACS_S3));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001962#endif
1963#ifdef ACS_S7
1964 SetDictInt("ACS_S7", (ACS_S7));
1965#endif
1966#ifdef ACS_LEQUAL
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001967 SetDictInt("ACS_LEQUAL", (ACS_LEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001968#endif
1969#ifdef ACS_GEQUAL
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001970 SetDictInt("ACS_GEQUAL", (ACS_GEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001971#endif
1972#ifdef ACS_PI
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001973 SetDictInt("ACS_PI", (ACS_PI));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001974#endif
1975#ifdef ACS_NEQUAL
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001976 SetDictInt("ACS_NEQUAL", (ACS_NEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001977#endif
1978#ifdef ACS_STERLING
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001979 SetDictInt("ACS_STERLING", (ACS_STERLING));
1980#endif
1981
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001982 SetDictInt("LINES", LINES);
1983 SetDictInt("COLS", COLS);
Guido van Rossum56bf2351994-08-31 22:06:24 +00001984
1985 return (PyObject *)PyCursesWindow_New(win);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001986}
1987
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00001988static PyObject *
1989PyCurses_setupterm(PyObject* self, PyObject *args, PyObject* keywds)
1990{
1991 int fd = -1;
1992 int err;
1993 char* termstr = NULL;
1994
Martin v. Löwis15e62742006-02-27 16:46:16 +00001995 static char *kwlist[] = {"term", "fd", NULL};
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00001996
1997 if (!PyArg_ParseTupleAndKeywords(
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00001998 args, keywds, "|zi:setupterm", kwlist, &termstr, &fd)) {
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00001999 return NULL;
2000 }
2001
2002 if (fd == -1) {
2003 PyObject* sys_stdout;
2004
2005 sys_stdout = PySys_GetObject("stdout");
2006
2007 if (sys_stdout == NULL) {
2008 PyErr_SetString(
2009 PyCursesError,
2010 "lost sys.stdout");
2011 return NULL;
2012 }
2013
2014 fd = PyObject_AsFileDescriptor(sys_stdout);
2015
2016 if (fd == -1) {
2017 return NULL;
2018 }
2019 }
2020
2021 if (setupterm(termstr,fd,&err) == ERR) {
2022 char* s = "setupterm: unknown error";
2023
2024 if (err == 0) {
2025 s = "setupterm: could not find terminal";
2026 } else if (err == -1) {
2027 s = "setupterm: could not find terminfo database";
2028 }
2029
2030 PyErr_SetString(PyCursesError,s);
2031 return NULL;
2032 }
2033
2034 initialised_setupterm = TRUE;
2035
2036 Py_INCREF(Py_None);
2037 return Py_None;
2038}
Guido van Rossumf6971e21994-08-30 12:25:20 +00002039
2040static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002041PyCurses_IntrFlush(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002042{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002043 int ch;
2044
2045 PyCursesInitialised
2046
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002047 switch(PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002048 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002049 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002050 break;
2051 default:
2052 PyErr_SetString(PyExc_TypeError, "intrflush requires 1 argument");
Guido van Rossum85738471995-02-17 13:50:17 +00002053 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002054 }
2055
2056 return PyCursesCheckERR(intrflush(NULL,ch), "intrflush");
2057}
2058
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002059#ifdef HAVE_CURSES_IS_TERM_RESIZED
2060static PyObject *
2061PyCurses_Is_Term_Resized(PyObject *self, PyObject *args)
2062{
2063 int lines;
2064 int columns;
2065 int result;
2066
2067 PyCursesInitialised
2068
2069 if (!PyArg_ParseTuple(args,"ii:is_term_resized", &lines, &columns))
2070 return NULL;
2071 result = is_term_resized(lines, columns);
2072 if (result == TRUE) {
2073 Py_INCREF(Py_True);
2074 return Py_True;
2075 } else {
2076 Py_INCREF(Py_False);
2077 return Py_False;
2078 }
2079}
2080#endif /* HAVE_CURSES_IS_TERM_RESIZED */
2081
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002082#if !defined(__NetBSD__)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002083static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002084PyCurses_KeyName(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002085{
2086 const char *knp;
2087 int ch;
2088
2089 PyCursesInitialised
2090
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002091 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002092
Andrew M. Kuchling7e23f002002-11-06 14:15:36 +00002093 if (ch < 0) {
2094 PyErr_SetString(PyExc_ValueError, "invalid key number");
2095 return NULL;
2096 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002097 knp = keyname(ch);
2098
2099 return PyString_FromString((knp == NULL) ? "" : (char *)knp);
2100}
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002101#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002102
2103static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002104PyCurses_KillChar(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002105{
2106 char ch;
2107
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002108 ch = killchar();
2109
Martin v. Löwis43f2dc62001-11-11 14:49:15 +00002110 return PyString_FromStringAndSize(&ch, 1);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002111}
2112
2113static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002114PyCurses_Meta(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002115{
2116 int ch;
2117
2118 PyCursesInitialised
2119
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002120 switch(PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002121 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002122 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002123 break;
2124 default:
2125 PyErr_SetString(PyExc_TypeError, "meta requires 1 argument");
2126 return NULL;
2127 }
2128
2129 return PyCursesCheckERR(meta(stdscr, ch), "meta");
2130}
2131
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002132#ifdef NCURSES_MOUSE_VERSION
2133static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002134PyCurses_MouseInterval(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002135{
2136 int interval;
2137 PyCursesInitialised
2138
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002139 if (!PyArg_ParseTuple(args,"i;interval",&interval))
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002140 return NULL;
2141 return PyCursesCheckERR(mouseinterval(interval), "mouseinterval");
2142}
2143
2144static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002145PyCurses_MouseMask(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002146{
Andrew M. Kuchling1a104002000-07-06 18:14:03 +00002147 int newmask;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002148 mmask_t oldmask, availmask;
2149
2150 PyCursesInitialised
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002151 if (!PyArg_ParseTuple(args,"i;mousemask",&newmask))
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002152 return NULL;
2153 availmask = mousemask(newmask, &oldmask);
2154 return Py_BuildValue("(ll)", (long)availmask, (long)oldmask);
2155}
2156#endif
2157
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002158static PyObject *
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002159PyCurses_Napms(PyObject *self, PyObject *args)
2160{
2161 int ms;
2162
2163 PyCursesInitialised
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002164 if (!PyArg_ParseTuple(args, "i;ms", &ms)) return NULL;
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002165
2166 return Py_BuildValue("i", napms(ms));
2167}
2168
2169
2170static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002171PyCurses_NewPad(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002172{
2173 WINDOW *win;
2174 int nlines, ncols;
2175
2176 PyCursesInitialised
2177
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002178 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002179
2180 win = newpad(nlines, ncols);
2181
2182 if (win == NULL) {
2183 PyErr_SetString(PyCursesError, catchall_NULL);
2184 return NULL;
2185 }
2186
2187 return (PyObject *)PyCursesWindow_New(win);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002188}
2189
2190static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002191PyCurses_NewWindow(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002192{
2193 WINDOW *win;
Andrew M. Kuchling5a76c442001-07-14 20:38:30 +00002194 int nlines, ncols, begin_y=0, begin_x=0;
Guido van Rossum85738471995-02-17 13:50:17 +00002195
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002196 PyCursesInitialised
2197
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002198 switch (PyTuple_Size(args)) {
Guido van Rossum85738471995-02-17 13:50:17 +00002199 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002200 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols))
Guido van Rossum85738471995-02-17 13:50:17 +00002201 return NULL;
2202 break;
2203 case 4:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002204 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
Guido van Rossumf6971e21994-08-30 12:25:20 +00002205 &nlines,&ncols,&begin_y,&begin_x))
Guido van Rossum85738471995-02-17 13:50:17 +00002206 return NULL;
2207 break;
2208 default:
2209 PyErr_SetString(PyExc_TypeError, "newwin requires 2 or 4 arguments");
2210 return NULL;
2211 }
2212
Andrew M. Kuchling5a76c442001-07-14 20:38:30 +00002213 win = newwin(nlines,ncols,begin_y,begin_x);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002214 if (win == NULL) {
Guido van Rossum85738471995-02-17 13:50:17 +00002215 PyErr_SetString(PyCursesError, catchall_NULL);
2216 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002217 }
Guido van Rossum85738471995-02-17 13:50:17 +00002218
Guido van Rossumf6971e21994-08-30 12:25:20 +00002219 return (PyObject *)PyCursesWindow_New(win);
2220}
2221
2222static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002223PyCurses_Pair_Content(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002224{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002225 short pair,f,b;
2226
2227 PyCursesInitialised
2228 PyCursesInitialisedColor
2229
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002230 switch(PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002231 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002232 if (!PyArg_ParseTuple(args, "h;pair", &pair)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002233 break;
2234 default:
2235 PyErr_SetString(PyExc_TypeError, "pair_content requires 1 argument");
Guido van Rossum85738471995-02-17 13:50:17 +00002236 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002237 }
2238
Andrew M. Kuchlingb5e7ff42005-06-15 18:46:50 +00002239 if (pair_content(pair, &f, &b)==ERR) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002240 PyErr_SetString(PyCursesError,
2241 "Argument 1 was out of range. (1..COLOR_PAIRS-1)");
2242 return NULL;
2243 }
2244
2245 return Py_BuildValue("(ii)", f, b);
2246}
2247
2248static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002249PyCurses_pair_number(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002250{
2251 int n;
2252
2253 PyCursesInitialised
2254 PyCursesInitialisedColor
2255
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002256 switch(PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002257 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002258 if (!PyArg_ParseTuple(args, "i;pairvalue", &n)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002259 break;
2260 default:
2261 PyErr_SetString(PyExc_TypeError,
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002262 "pair_number requires 1 argument");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002263 return NULL;
2264 }
2265
2266 return PyInt_FromLong((long) ((n & A_COLOR) >> 8));
2267}
2268
2269static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002270PyCurses_Putp(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002271{
2272 char *str;
2273
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002274 if (!PyArg_ParseTuple(args,"s;str", &str)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002275 return PyCursesCheckERR(putp(str), "putp");
2276}
2277
2278static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002279PyCurses_QiFlush(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002280{
2281 int flag = 0;
2282
2283 PyCursesInitialised
2284
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002285 switch(PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002286 case 0:
2287 qiflush();
2288 Py_INCREF(Py_None);
2289 return Py_None;
2290 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002291 if (!PyArg_ParseTuple(args, "i;True(1) or False(0)", &flag)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002292 if (flag) qiflush();
2293 else noqiflush();
2294 Py_INCREF(Py_None);
2295 return Py_None;
2296 default:
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002297 PyErr_SetString(PyExc_TypeError, "qiflush requires 0 or 1 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002298 return NULL;
2299 }
2300}
2301
Guido van Rossumd8faa362007-04-27 19:54:29 +00002302/* Internal helper used for updating curses.LINES, curses.COLS, _curses.LINES
2303 * and _curses.COLS */
2304static int
2305update_lines_cols(void)
2306{
2307 PyObject *o;
2308 PyObject *m = PyImport_ImportModule("curses");
2309
2310 if (!m)
2311 return 0;
2312
2313 o = PyInt_FromLong(LINES);
2314 if (!o) {
2315 Py_DECREF(m);
2316 return 0;
2317 }
2318 if (PyObject_SetAttrString(m, "LINES", o)) {
2319 Py_DECREF(m);
2320 Py_DECREF(o);
2321 return 0;
2322 }
2323 if (PyDict_SetItemString(ModDict, "LINES", o)) {
2324 Py_DECREF(m);
2325 Py_DECREF(o);
2326 return 0;
2327 }
2328 Py_DECREF(o);
2329 o = PyInt_FromLong(COLS);
2330 if (!o) {
2331 Py_DECREF(m);
2332 return 0;
2333 }
2334 if (PyObject_SetAttrString(m, "COLS", o)) {
2335 Py_DECREF(m);
2336 Py_DECREF(o);
2337 return 0;
2338 }
2339 if (PyDict_SetItemString(ModDict, "COLS", o)) {
2340 Py_DECREF(m);
2341 Py_DECREF(o);
2342 return 0;
2343 }
2344 Py_DECREF(o);
2345 Py_DECREF(m);
2346 return 1;
2347}
2348
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002349#ifdef HAVE_CURSES_RESIZETERM
2350static PyObject *
2351PyCurses_ResizeTerm(PyObject *self, PyObject *args)
2352{
2353 int lines;
2354 int columns;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002355 PyObject *result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002356
2357 PyCursesInitialised
2358
2359 if (!PyArg_ParseTuple(args,"ii:resizeterm", &lines, &columns))
2360 return NULL;
2361
Guido van Rossumd8faa362007-04-27 19:54:29 +00002362 result = PyCursesCheckERR(resizeterm(lines, columns), "resizeterm");
2363 if (!result)
2364 return NULL;
2365 if (!update_lines_cols())
2366 return NULL;
2367 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002368}
2369
2370#endif
2371
2372#ifdef HAVE_CURSES_RESIZE_TERM
2373static PyObject *
2374PyCurses_Resize_Term(PyObject *self, PyObject *args)
2375{
2376 int lines;
2377 int columns;
2378
Guido van Rossumd8faa362007-04-27 19:54:29 +00002379 PyObject *result;
2380
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002381 PyCursesInitialised
2382
2383 if (!PyArg_ParseTuple(args,"ii:resize_term", &lines, &columns))
2384 return NULL;
2385
Guido van Rossumd8faa362007-04-27 19:54:29 +00002386 result = PyCursesCheckERR(resize_term(lines, columns), "resize_term");
2387 if (!result)
2388 return NULL;
2389 if (!update_lines_cols())
2390 return NULL;
2391 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002392}
2393#endif /* HAVE_CURSES_RESIZE_TERM */
2394
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002395static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002396PyCurses_setsyx(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002397{
2398 int y,x;
2399
2400 PyCursesInitialised
2401
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002402 if (PyTuple_Size(args)!=2) {
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002403 PyErr_SetString(PyExc_TypeError, "setsyx requires 2 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002404 return NULL;
2405 }
2406
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002407 if (!PyArg_ParseTuple(args, "ii;y, x", &y, &x)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002408
2409 setsyx(y,x);
2410
Guido van Rossumf6971e21994-08-30 12:25:20 +00002411 Py_INCREF(Py_None);
Guido van Rossum85738471995-02-17 13:50:17 +00002412 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002413}
2414
2415static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002416PyCurses_Start_Color(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002417{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002418 int code;
2419 PyObject *c, *cp;
2420
2421 PyCursesInitialised
2422
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002423 code = start_color();
2424 if (code != ERR) {
2425 initialisedcolors = TRUE;
2426 c = PyInt_FromLong((long) COLORS);
2427 PyDict_SetItemString(ModDict, "COLORS", c);
2428 Py_DECREF(c);
2429 cp = PyInt_FromLong((long) COLOR_PAIRS);
2430 PyDict_SetItemString(ModDict, "COLOR_PAIRS", cp);
2431 Py_DECREF(cp);
2432 Py_INCREF(Py_None);
2433 return Py_None;
2434 } else {
2435 PyErr_SetString(PyCursesError, "start_color() returned ERR");
Guido van Rossum85738471995-02-17 13:50:17 +00002436 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002437 }
2438}
2439
2440static PyObject *
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002441PyCurses_tigetflag(PyObject *self, PyObject *args)
2442{
2443 char *capname;
2444
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002445 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002446
2447 if (!PyArg_ParseTuple(args, "z", &capname))
2448 return NULL;
2449
2450 return PyInt_FromLong( (long) tigetflag( capname ) );
2451}
2452
2453static PyObject *
2454PyCurses_tigetnum(PyObject *self, PyObject *args)
2455{
2456 char *capname;
2457
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002458 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002459
2460 if (!PyArg_ParseTuple(args, "z", &capname))
2461 return NULL;
2462
2463 return PyInt_FromLong( (long) tigetnum( capname ) );
2464}
2465
2466static PyObject *
2467PyCurses_tigetstr(PyObject *self, PyObject *args)
2468{
2469 char *capname;
2470
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002471 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002472
2473 if (!PyArg_ParseTuple(args, "z", &capname))
2474 return NULL;
2475
2476 capname = tigetstr( capname );
2477 if (capname == 0 || capname == (char*) -1) {
2478 Py_INCREF(Py_None);
2479 return Py_None;
2480 }
2481 return PyString_FromString( capname );
2482}
2483
2484static PyObject *
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00002485PyCurses_tparm(PyObject *self, PyObject *args)
2486{
2487 char* fmt;
2488 char* result = NULL;
Michael W. Hudson21007982002-11-21 14:17:51 +00002489 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 +00002490
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002491 PyCursesSetupTermCalled;
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00002492
2493 if (!PyArg_ParseTuple(args, "s|iiiiiiiii:tparm",
2494 &fmt, &i1, &i2, &i3, &i4,
2495 &i5, &i6, &i7, &i8, &i9)) {
2496 return NULL;
2497 }
Michael W. Hudson21007982002-11-21 14:17:51 +00002498
Michael W. Hudson8f514602002-01-16 15:18:09 +00002499 result = tparm(fmt,i1,i2,i3,i4,i5,i6,i7,i8,i9);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002500 if (!result) {
2501 PyErr_SetString(PyCursesError, "tparm() returned NULL");
2502 return NULL;
2503 }
Michael W. Hudson21007982002-11-21 14:17:51 +00002504
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00002505 return PyString_FromString(result);
2506}
2507
2508static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002509PyCurses_TypeAhead(PyObject *self, PyObject *args)
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00002510{
Andrew M. Kuchling1a104002000-07-06 18:14:03 +00002511 int fd;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00002512
2513 PyCursesInitialised
2514
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002515 if (!PyArg_ParseTuple(args,"i;fd",&fd)) return NULL;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00002516
Michael W. Hudson7d6cc5b2004-08-04 14:33:28 +00002517 return PyCursesCheckERR(typeahead( fd ), "typeahead");
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00002518}
2519
2520static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002521PyCurses_UnCtrl(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002522{
2523 PyObject *temp;
2524 chtype ch;
2525
2526 PyCursesInitialised
2527
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002528 if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002529
Guido van Rossum6c95da32007-07-24 00:16:38 +00002530 if (!PyCurses_ConvertToChtype(temp, &ch)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002531 PyErr_SetString(PyExc_TypeError, "argument must be a ch or an int");
2532 return NULL;
2533 }
2534
2535 return PyString_FromString(unctrl(ch));
Guido van Rossumf6971e21994-08-30 12:25:20 +00002536}
2537
2538static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002539PyCurses_UngetCh(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002540{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002541 PyObject *temp;
Guido van Rossum6c95da32007-07-24 00:16:38 +00002542 chtype ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002543
2544 PyCursesInitialised
2545
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002546 if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002547
Guido van Rossum6c95da32007-07-24 00:16:38 +00002548 if (!PyCurses_ConvertToChtype(temp, &ch)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002549 PyErr_SetString(PyExc_TypeError, "argument must be a ch or an int");
Guido van Rossum85738471995-02-17 13:50:17 +00002550 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002551 }
2552
Guido van Rossum85738471995-02-17 13:50:17 +00002553 return PyCursesCheckERR(ungetch(ch), "ungetch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00002554}
2555
2556static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002557PyCurses_Use_Env(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002558{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002559 int flag;
2560
2561 PyCursesInitialised
2562
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002563 switch(PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002564 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002565 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&flag))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002566 return NULL;
2567 break;
2568 default:
2569 PyErr_SetString(PyExc_TypeError, "use_env requires 1 argument");
Guido van Rossum85738471995-02-17 13:50:17 +00002570 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002571 }
2572 use_env(flag);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002573 Py_INCREF(Py_None);
Guido van Rossum85738471995-02-17 13:50:17 +00002574 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002575}
2576
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00002577#ifndef STRICT_SYSV_CURSES
2578static PyObject *
2579PyCurses_Use_Default_Colors(PyObject *self)
2580{
2581 int code;
2582
2583 PyCursesInitialised
2584 PyCursesInitialisedColor
2585
2586 code = use_default_colors();
2587 if (code != ERR) {
2588 Py_INCREF(Py_None);
2589 return Py_None;
2590 } else {
2591 PyErr_SetString(PyCursesError, "use_default_colors() returned ERR");
2592 return NULL;
2593 }
2594}
2595#endif /* STRICT_SYSV_CURSES */
2596
Guido van Rossumf6971e21994-08-30 12:25:20 +00002597/* List of functions defined in the module */
2598
2599static PyMethodDef PyCurses_methods[] = {
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002600 {"baudrate", (PyCFunction)PyCurses_baudrate, METH_NOARGS},
2601 {"beep", (PyCFunction)PyCurses_beep, METH_NOARGS},
2602 {"can_change_color", (PyCFunction)PyCurses_can_change_color, METH_NOARGS},
2603 {"cbreak", (PyCFunction)PyCurses_cbreak, METH_VARARGS},
2604 {"color_content", (PyCFunction)PyCurses_Color_Content, METH_VARARGS},
2605 {"color_pair", (PyCFunction)PyCurses_color_pair, METH_VARARGS},
2606 {"curs_set", (PyCFunction)PyCurses_Curs_Set, METH_VARARGS},
2607 {"def_prog_mode", (PyCFunction)PyCurses_def_prog_mode, METH_NOARGS},
2608 {"def_shell_mode", (PyCFunction)PyCurses_def_shell_mode, METH_NOARGS},
2609 {"delay_output", (PyCFunction)PyCurses_Delay_Output, METH_VARARGS},
2610 {"doupdate", (PyCFunction)PyCurses_doupdate, METH_NOARGS},
2611 {"echo", (PyCFunction)PyCurses_echo, METH_VARARGS},
2612 {"endwin", (PyCFunction)PyCurses_endwin, METH_NOARGS},
2613 {"erasechar", (PyCFunction)PyCurses_EraseChar, METH_NOARGS},
2614 {"filter", (PyCFunction)PyCurses_filter, METH_NOARGS},
2615 {"flash", (PyCFunction)PyCurses_flash, METH_NOARGS},
2616 {"flushinp", (PyCFunction)PyCurses_flushinp, METH_NOARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002617#ifdef NCURSES_MOUSE_VERSION
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002618 {"getmouse", (PyCFunction)PyCurses_GetMouse, METH_NOARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002619 {"ungetmouse", (PyCFunction)PyCurses_UngetMouse, METH_VARARGS},
2620#endif
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002621 {"getsyx", (PyCFunction)PyCurses_getsyx, METH_NOARGS},
2622 {"getwin", (PyCFunction)PyCurses_GetWin, METH_O},
2623 {"has_colors", (PyCFunction)PyCurses_has_colors, METH_NOARGS},
2624 {"has_ic", (PyCFunction)PyCurses_has_ic, METH_NOARGS},
2625 {"has_il", (PyCFunction)PyCurses_has_il, METH_NOARGS},
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00002626#ifndef STRICT_SYSV_CURSES
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002627 {"has_key", (PyCFunction)PyCurses_has_key, METH_VARARGS},
Guido van Rossumf6971e21994-08-30 12:25:20 +00002628#endif
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002629 {"halfdelay", (PyCFunction)PyCurses_HalfDelay, METH_VARARGS},
2630 {"init_color", (PyCFunction)PyCurses_Init_Color, METH_VARARGS},
2631 {"init_pair", (PyCFunction)PyCurses_Init_Pair, METH_VARARGS},
2632 {"initscr", (PyCFunction)PyCurses_InitScr, METH_NOARGS},
2633 {"intrflush", (PyCFunction)PyCurses_IntrFlush, METH_VARARGS},
2634 {"isendwin", (PyCFunction)PyCurses_isendwin, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002635#ifdef HAVE_CURSES_IS_TERM_RESIZED
2636 {"is_term_resized", (PyCFunction)PyCurses_Is_Term_Resized, METH_VARARGS},
2637#endif
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002638#if !defined(__NetBSD__)
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002639 {"keyname", (PyCFunction)PyCurses_KeyName, METH_VARARGS},
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002640#endif
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002641 {"killchar", (PyCFunction)PyCurses_KillChar, METH_NOARGS},
2642 {"longname", (PyCFunction)PyCurses_longname, METH_NOARGS},
2643 {"meta", (PyCFunction)PyCurses_Meta, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002644#ifdef NCURSES_MOUSE_VERSION
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002645 {"mouseinterval", (PyCFunction)PyCurses_MouseInterval, METH_VARARGS},
2646 {"mousemask", (PyCFunction)PyCurses_MouseMask, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002647#endif
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002648 {"napms", (PyCFunction)PyCurses_Napms, METH_VARARGS},
2649 {"newpad", (PyCFunction)PyCurses_NewPad, METH_VARARGS},
2650 {"newwin", (PyCFunction)PyCurses_NewWindow, METH_VARARGS},
2651 {"nl", (PyCFunction)PyCurses_nl, METH_VARARGS},
2652 {"nocbreak", (PyCFunction)PyCurses_nocbreak, METH_NOARGS},
2653 {"noecho", (PyCFunction)PyCurses_noecho, METH_NOARGS},
2654 {"nonl", (PyCFunction)PyCurses_nonl, METH_NOARGS},
2655 {"noqiflush", (PyCFunction)PyCurses_noqiflush, METH_NOARGS},
2656 {"noraw", (PyCFunction)PyCurses_noraw, METH_NOARGS},
2657 {"pair_content", (PyCFunction)PyCurses_Pair_Content, METH_VARARGS},
2658 {"pair_number", (PyCFunction)PyCurses_pair_number, METH_VARARGS},
2659 {"putp", (PyCFunction)PyCurses_Putp, METH_VARARGS},
2660 {"qiflush", (PyCFunction)PyCurses_QiFlush, METH_VARARGS},
2661 {"raw", (PyCFunction)PyCurses_raw, METH_VARARGS},
2662 {"reset_prog_mode", (PyCFunction)PyCurses_reset_prog_mode, METH_NOARGS},
2663 {"reset_shell_mode", (PyCFunction)PyCurses_reset_shell_mode, METH_NOARGS},
2664 {"resetty", (PyCFunction)PyCurses_resetty, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002665#ifdef HAVE_CURSES_RESIZETERM
2666 {"resizeterm", (PyCFunction)PyCurses_ResizeTerm, METH_VARARGS},
2667#endif
2668#ifdef HAVE_CURSES_RESIZE_TERM
2669 {"resize_term", (PyCFunction)PyCurses_Resize_Term, METH_VARARGS},
2670#endif
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002671 {"savetty", (PyCFunction)PyCurses_savetty, METH_NOARGS},
2672 {"setsyx", (PyCFunction)PyCurses_setsyx, METH_VARARGS},
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +00002673 {"setupterm", (PyCFunction)PyCurses_setupterm,
2674 METH_VARARGS|METH_KEYWORDS},
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002675 {"start_color", (PyCFunction)PyCurses_Start_Color, METH_NOARGS},
2676 {"termattrs", (PyCFunction)PyCurses_termattrs, METH_NOARGS},
2677 {"termname", (PyCFunction)PyCurses_termname, METH_NOARGS},
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002678 {"tigetflag", (PyCFunction)PyCurses_tigetflag, METH_VARARGS},
2679 {"tigetnum", (PyCFunction)PyCurses_tigetnum, METH_VARARGS},
2680 {"tigetstr", (PyCFunction)PyCurses_tigetstr, METH_VARARGS},
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00002681 {"tparm", (PyCFunction)PyCurses_tparm, METH_VARARGS},
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002682 {"typeahead", (PyCFunction)PyCurses_TypeAhead, METH_VARARGS},
2683 {"unctrl", (PyCFunction)PyCurses_UnCtrl, METH_VARARGS},
2684 {"ungetch", (PyCFunction)PyCurses_UngetCh, METH_VARARGS},
2685 {"use_env", (PyCFunction)PyCurses_Use_Env, METH_VARARGS},
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00002686#ifndef STRICT_SYSV_CURSES
2687 {"use_default_colors", (PyCFunction)PyCurses_Use_Default_Colors, METH_NOARGS},
2688#endif
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +00002689 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002690};
2691
2692/* Initialization function for the module */
2693
Mark Hammondfe51c6d2002-08-02 02:27:13 +00002694PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002695init_curses(void)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002696{
Andrew M. Kuchling32552682000-12-22 21:52:27 +00002697 PyObject *m, *d, *v, *c_api_object;
2698 static void *PyCurses_API[PyCurses_API_pointers];
2699
Guido van Rossum6915c4d2001-01-19 00:28:08 +00002700 /* Initialize object type */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002701 Py_Type(&PyCursesWindow_Type) = &PyType_Type;
Guido van Rossum6915c4d2001-01-19 00:28:08 +00002702
Andrew M. Kuchling32552682000-12-22 21:52:27 +00002703 /* Initialize the C API pointer array */
2704 PyCurses_API[0] = (void *)&PyCursesWindow_Type;
2705 PyCurses_API[1] = (void *)func_PyCursesSetupTermCalled;
2706 PyCurses_API[2] = (void *)func_PyCursesInitialised;
2707 PyCurses_API[3] = (void *)func_PyCursesInitialisedColor;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002708
2709 /* Create the module and add the functions */
Andrew M. Kuchlingb7f198e2000-06-10 23:12:32 +00002710 m = Py_InitModule("_curses", PyCurses_methods);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00002711 if (m == NULL)
2712 return;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002713
Guido van Rossumf6971e21994-08-30 12:25:20 +00002714 /* Add some symbolic constants to the module */
2715 d = PyModule_GetDict(m);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002716 if (d == NULL)
2717 return;
Andrew M. Kuchling32552682000-12-22 21:52:27 +00002718 ModDict = d; /* For PyCurses_InitScr to use later */
2719
2720 /* Add a CObject for the C API */
2721 c_api_object = PyCObject_FromVoidPtr((void *)PyCurses_API, NULL);
2722 PyDict_SetItemString(d, "_C_API", c_api_object);
Martin v. Löwis00ff10c2001-11-11 14:24:05 +00002723 Py_DECREF(c_api_object);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00002724
Guido van Rossum85738471995-02-17 13:50:17 +00002725 /* For exception curses.error */
Fred Drake589c35b2000-07-06 19:38:49 +00002726 PyCursesError = PyErr_NewException("_curses.error", NULL, NULL);
Guido van Rossum85738471995-02-17 13:50:17 +00002727 PyDict_SetItemString(d, "error", PyCursesError);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00002728
Guido van Rossum85738471995-02-17 13:50:17 +00002729 /* Make the version available */
Guido van Rossum8fbf82b1995-02-17 13:54:04 +00002730 v = PyString_FromString(PyCursesVersion);
2731 PyDict_SetItemString(d, "version", v);
2732 PyDict_SetItemString(d, "__version__", v);
2733 Py_DECREF(v);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002734
Andrew M. Kuchlingcaefb372000-12-26 15:57:01 +00002735 SetDictInt("ERR", ERR);
2736 SetDictInt("OK", OK);
2737
Guido van Rossumf6971e21994-08-30 12:25:20 +00002738 /* Here are some attributes you can add to chars to print */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002739
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002740 SetDictInt("A_ATTRIBUTES", A_ATTRIBUTES);
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002741 SetDictInt("A_NORMAL", A_NORMAL);
2742 SetDictInt("A_STANDOUT", A_STANDOUT);
2743 SetDictInt("A_UNDERLINE", A_UNDERLINE);
2744 SetDictInt("A_REVERSE", A_REVERSE);
2745 SetDictInt("A_BLINK", A_BLINK);
2746 SetDictInt("A_DIM", A_DIM);
2747 SetDictInt("A_BOLD", A_BOLD);
2748 SetDictInt("A_ALTCHARSET", A_ALTCHARSET);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002749#if !defined(__NetBSD__)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002750 SetDictInt("A_INVIS", A_INVIS);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002751#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002752 SetDictInt("A_PROTECT", A_PROTECT);
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002753 SetDictInt("A_CHARTEXT", A_CHARTEXT);
2754 SetDictInt("A_COLOR", A_COLOR);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002755
2756 /* The following are never available with strict SYSV curses */
2757#ifdef A_HORIZONTAL
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002758 SetDictInt("A_HORIZONTAL", A_HORIZONTAL);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002759#endif
2760#ifdef A_LEFT
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002761 SetDictInt("A_LEFT", A_LEFT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002762#endif
2763#ifdef A_LOW
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002764 SetDictInt("A_LOW", A_LOW);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002765#endif
2766#ifdef A_RIGHT
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002767 SetDictInt("A_RIGHT", A_RIGHT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002768#endif
2769#ifdef A_TOP
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002770 SetDictInt("A_TOP", A_TOP);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002771#endif
2772#ifdef A_VERTICAL
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002773 SetDictInt("A_VERTICAL", A_VERTICAL);
2774#endif
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002775
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002776 SetDictInt("COLOR_BLACK", COLOR_BLACK);
2777 SetDictInt("COLOR_RED", COLOR_RED);
2778 SetDictInt("COLOR_GREEN", COLOR_GREEN);
2779 SetDictInt("COLOR_YELLOW", COLOR_YELLOW);
2780 SetDictInt("COLOR_BLUE", COLOR_BLUE);
2781 SetDictInt("COLOR_MAGENTA", COLOR_MAGENTA);
2782 SetDictInt("COLOR_CYAN", COLOR_CYAN);
2783 SetDictInt("COLOR_WHITE", COLOR_WHITE);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002784
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002785#ifdef NCURSES_MOUSE_VERSION
2786 /* Mouse-related constants */
2787 SetDictInt("BUTTON1_PRESSED", BUTTON1_PRESSED);
2788 SetDictInt("BUTTON1_RELEASED", BUTTON1_RELEASED);
2789 SetDictInt("BUTTON1_CLICKED", BUTTON1_CLICKED);
2790 SetDictInt("BUTTON1_DOUBLE_CLICKED", BUTTON1_DOUBLE_CLICKED);
2791 SetDictInt("BUTTON1_TRIPLE_CLICKED", BUTTON1_TRIPLE_CLICKED);
2792
2793 SetDictInt("BUTTON2_PRESSED", BUTTON2_PRESSED);
2794 SetDictInt("BUTTON2_RELEASED", BUTTON2_RELEASED);
2795 SetDictInt("BUTTON2_CLICKED", BUTTON2_CLICKED);
2796 SetDictInt("BUTTON2_DOUBLE_CLICKED", BUTTON2_DOUBLE_CLICKED);
2797 SetDictInt("BUTTON2_TRIPLE_CLICKED", BUTTON2_TRIPLE_CLICKED);
2798
2799 SetDictInt("BUTTON3_PRESSED", BUTTON3_PRESSED);
2800 SetDictInt("BUTTON3_RELEASED", BUTTON3_RELEASED);
2801 SetDictInt("BUTTON3_CLICKED", BUTTON3_CLICKED);
2802 SetDictInt("BUTTON3_DOUBLE_CLICKED", BUTTON3_DOUBLE_CLICKED);
2803 SetDictInt("BUTTON3_TRIPLE_CLICKED", BUTTON3_TRIPLE_CLICKED);
2804
2805 SetDictInt("BUTTON4_PRESSED", BUTTON4_PRESSED);
2806 SetDictInt("BUTTON4_RELEASED", BUTTON4_RELEASED);
2807 SetDictInt("BUTTON4_CLICKED", BUTTON4_CLICKED);
2808 SetDictInt("BUTTON4_DOUBLE_CLICKED", BUTTON4_DOUBLE_CLICKED);
2809 SetDictInt("BUTTON4_TRIPLE_CLICKED", BUTTON4_TRIPLE_CLICKED);
2810
2811 SetDictInt("BUTTON_SHIFT", BUTTON_SHIFT);
2812 SetDictInt("BUTTON_CTRL", BUTTON_CTRL);
2813 SetDictInt("BUTTON_ALT", BUTTON_ALT);
2814
2815 SetDictInt("ALL_MOUSE_EVENTS", ALL_MOUSE_EVENTS);
2816 SetDictInt("REPORT_MOUSE_POSITION", REPORT_MOUSE_POSITION);
2817#endif
Guido van Rossumf6971e21994-08-30 12:25:20 +00002818 /* Now set everything up for KEY_ variables */
2819 {
2820 int key;
2821 char *key_n;
2822 char *key_n2;
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002823#if !defined(__NetBSD__)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002824 for (key=KEY_MIN;key < KEY_MAX; key++) {
2825 key_n = (char *)keyname(key);
Guido van Rossumf5c6d471995-02-07 15:38:32 +00002826 if (key_n == NULL || strcmp(key_n,"UNKNOWN KEY")==0)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002827 continue;
2828 if (strncmp(key_n,"KEY_F(",6)==0) {
2829 char *p1, *p2;
2830 key_n2 = malloc(strlen(key_n)+1);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002831 if (!key_n2) {
2832 PyErr_NoMemory();
2833 break;
2834 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00002835 p1 = key_n;
2836 p2 = key_n2;
2837 while (*p1) {
2838 if (*p1 != '(' && *p1 != ')') {
2839 *p2 = *p1;
2840 p2++;
2841 }
2842 p1++;
2843 }
2844 *p2 = (char)0;
2845 } else
2846 key_n2 = key_n;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002847 SetDictInt(key_n2,key);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002848 if (key_n2 != key_n)
2849 free(key_n2);
2850 }
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002851#endif
Guido van Rossum85738471995-02-17 13:50:17 +00002852 SetDictInt("KEY_MIN", KEY_MIN);
2853 SetDictInt("KEY_MAX", KEY_MAX);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002854 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00002855}