blob: fb51c43fe0ef4d6d1567add35bfb4d168c9bcbca [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. Kuchlingfb6bbf52000-07-27 11:58:01 +000034/*
35
Victor Stinnerfd2103e2010-05-15 22:19:27 +000036 A number of SysV or ncurses functions don't have wrappers yet; if you
37 need a given function, add it and send a patch. See
38 http://www.python.org/dev/patches/ for instructions on how to submit
39 patches to Python.
Andrew M. Kuchlinga6fbc1eab2007-04-11 13:42:25 +000040
Victor Stinnerfd2103e2010-05-15 22:19:27 +000041 Here's a list of currently unsupported functions:
Andrew M. Kuchlingfb6bbf52000-07-27 11:58:01 +000042
Victor Stinnerfd2103e2010-05-15 22:19:27 +000043 addchnstr addchstr color_set define_key
44 del_curterm delscreen dupwin inchnstr inchstr innstr keyok
45 mcprint mvaddchnstr mvaddchstr mvcur mvinchnstr
46 mvinchstr mvinnstr mmvwaddchnstr mvwaddchstr
47 mvwinchnstr mvwinchstr mvwinnstr newterm
48 restartterm ripoffline scr_dump
49 scr_init scr_restore scr_set scrl set_curterm set_term setterm
50 tgetent tgetflag tgetnum tgetstr tgoto timeout tputs
51 vidattr vidputs waddchnstr waddchstr
52 wcolor_set winchnstr winchstr winnstr wmouse_trafo wscrl
Andrew M. Kuchlingfb6bbf52000-07-27 11:58:01 +000053
Victor Stinnerfd2103e2010-05-15 22:19:27 +000054 Low-priority:
55 slk_attr slk_attr_off slk_attr_on slk_attr_set slk_attroff
56 slk_attron slk_attrset slk_clear slk_color slk_init slk_label
57 slk_noutrefresh slk_refresh slk_restore slk_set slk_touch
Andrew M. Kuchlingfb6bbf52000-07-27 11:58:01 +000058
Victor Stinnerfd2103e2010-05-15 22:19:27 +000059 Menu extension (ncurses and probably SYSV):
60 current_item free_item free_menu item_count item_description
61 item_index item_init item_name item_opts item_opts_off
62 item_opts_on item_term item_userptr item_value item_visible
63 menu_back menu_driver menu_fore menu_format menu_grey
64 menu_init menu_items menu_mark menu_opts menu_opts_off
65 menu_opts_on menu_pad menu_pattern menu_request_by_name
66 menu_request_name menu_spacing menu_sub menu_term menu_userptr
67 menu_win new_item new_menu pos_menu_cursor post_menu
68 scale_menu set_current_item set_item_init set_item_opts
69 set_item_term set_item_userptr set_item_value set_menu_back
70 set_menu_fore set_menu_format set_menu_grey set_menu_init
71 set_menu_items set_menu_mark set_menu_opts set_menu_pad
72 set_menu_pattern set_menu_spacing set_menu_sub set_menu_term
73 set_menu_userptr set_menu_win set_top_row top_row unpost_menu
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +000074
Victor Stinnerfd2103e2010-05-15 22:19:27 +000075 Form extension (ncurses and probably SYSV):
76 current_field data_ahead data_behind dup_field
77 dynamic_fieldinfo field_arg field_back field_buffer
78 field_count field_fore field_index field_info field_init
79 field_just field_opts field_opts_off field_opts_on field_pad
80 field_status field_term field_type field_userptr form_driver
81 form_fields form_init form_opts form_opts_off form_opts_on
82 form_page form_request_by_name form_request_name form_sub
83 form_term form_userptr form_win free_field free_form
84 link_field link_fieldtype move_field new_field new_form
85 new_page pos_form_cursor post_form scale_form
86 set_current_field set_field_back set_field_buffer
87 set_field_fore set_field_init set_field_just set_field_opts
88 set_field_pad set_field_status set_field_term set_field_type
89 set_field_userptr set_fieldtype_arg set_fieldtype_choice
90 set_form_fields set_form_init set_form_opts set_form_page
91 set_form_sub set_form_term set_form_userptr set_form_win
92 set_max_field set_new_page unpost_form
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +000093
94
Victor Stinnerfd2103e2010-05-15 22:19:27 +000095*/
Andrew M. Kuchlingfb6bbf52000-07-27 11:58:01 +000096
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +000097/* Release Number */
Guido van Rossumf6971e21994-08-30 12:25:20 +000098
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +000099char *PyCursesVersion = "2.2";
Guido van Rossumf6971e21994-08-30 12:25:20 +0000100
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000101/* Includes */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000102
Guido van Rossum602099a1994-09-14 13:32:22 +0000103#include "Python.h"
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000104
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000105#ifdef __osf__
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +0000106#define STRICT_SYSV_CURSES /* Don't use ncurses extensions */
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000107#endif
108
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000109#ifdef __hpux
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000110#define STRICT_SYSV_CURSES
111#endif
112
Guido van Rossum858ca0f2001-04-10 19:53:37 +0000113#define CURSES_MODULE
114#include "py_curses.h"
115
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200116#if defined(HAVE_TERM_H) || defined(__sgi)
117/* For termname, longname, putp, tigetflag, tigetnum, tigetstr, tparm
118 which are not declared in SysV curses and for setupterm. */
Fred Drake0368bc42001-07-19 20:48:32 +0000119#include <term.h>
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200120/* Including <term.h> #defines many common symbols. */
121#undef lines
122#undef columns
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +0000123#endif
124
Martin v. Löwis21ee4092002-09-30 16:19:48 +0000125#if !defined(HAVE_NCURSES_H) && (defined(sgi) || defined(__sun) || defined(SCO5))
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +0000126#define STRICT_SYSV_CURSES /* Don't use ncurses extensions */
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000127typedef chtype attr_t; /* No attr_t type is available */
Guido van Rossum1266a011996-02-25 04:50:31 +0000128#endif
Guido van Rossumf6971e21994-08-30 12:25:20 +0000129
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000130#if defined(_AIX)
131#define STRICT_SYSV_CURSES
132#endif
133
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000134/* Definition of exception curses.error */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000135
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000136static PyObject *PyCursesError;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000137
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +0000138/* Tells whether setupterm() has been called to initialise terminfo. */
139static int initialised_setupterm = FALSE;
140
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000141/* Tells whether initscr() has been called to initialise curses. */
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000142static int initialised = FALSE;
143
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000144/* Tells whether start_color() has been called to initialise color usage. */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000145static int initialisedcolors = FALSE;
146
147/* Utility Macros */
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000148#define PyCursesSetupTermCalled \
149 if (initialised_setupterm != TRUE) { \
150 PyErr_SetString(PyCursesError, \
151 "must call (at least) setupterm() first"); \
152 return 0; }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +0000153
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000154#define PyCursesInitialised \
155 if (initialised != TRUE) { \
156 PyErr_SetString(PyCursesError, \
157 "must call initscr() first"); \
158 return 0; }
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000159
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000160#define PyCursesInitialisedColor \
161 if (initialisedcolors != TRUE) { \
162 PyErr_SetString(PyCursesError, \
163 "must call start_color() first"); \
164 return 0; }
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000165
Andrew M. Kuchling52a14c32005-06-09 17:53:27 +0000166#ifndef MIN
167#define MIN(x,y) ((x) < (y) ? (x) : (y))
168#endif
169
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000170/* Utility Functions */
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000171
Guido van Rossum85738471995-02-17 13:50:17 +0000172/*
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000173 * Check the return code from a curses function and return None
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000174 * or raise an exception as appropriate. These are exported using the
Larry Hastings402b73f2010-03-25 00:54:54 +0000175 * capsule API.
Guido van Rossum85738471995-02-17 13:50:17 +0000176 */
177
178static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000179PyCursesCheckERR(int code, char *fname)
Guido van Rossum85738471995-02-17 13:50:17 +0000180{
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000181 if (code != ERR) {
182 Py_INCREF(Py_None);
183 return Py_None;
Guido van Rossum85738471995-02-17 13:50:17 +0000184 } else {
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000185 if (fname == NULL) {
186 PyErr_SetString(PyCursesError, catchall_ERR);
187 } else {
188 PyErr_Format(PyCursesError, "%s() returned ERR", fname);
189 }
190 return NULL;
Guido van Rossum85738471995-02-17 13:50:17 +0000191 }
Guido van Rossum85738471995-02-17 13:50:17 +0000192}
193
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000194static int
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000195PyCurses_ConvertToChtype(PyObject *obj, chtype *ch)
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000196{
Serhiy Storchaka994f04d2016-12-27 15:09:36 +0200197 if (PyInt_Check(obj) || PyLong_Check(obj)) {
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000198 *ch = (chtype) PyInt_AsLong(obj);
Serhiy Storchaka994f04d2016-12-27 15:09:36 +0200199 if (*ch == (chtype) -1 && PyErr_Occurred())
200 return 0;
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000201 } else if(PyString_Check(obj)
202 && (PyString_Size(obj) == 1)) {
203 *ch = (chtype) *PyString_AsString(obj);
204 } else {
205 return 0;
206 }
207 return 1;
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000208}
209
Andrew M. Kuchling72aae732010-02-22 18:38:23 +0000210/* Function versions of the 3 functions for testing whether curses has been
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000211 initialised or not. */
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000212
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000213static int func_PyCursesSetupTermCalled(void)
214{
215 PyCursesSetupTermCalled;
216 return 1;
217}
218
219static int func_PyCursesInitialised(void)
220{
221 PyCursesInitialised;
222 return 1;
223}
224
225static int func_PyCursesInitialisedColor(void)
226{
227 PyCursesInitialisedColor;
228 return 1;
229}
230
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000231/*****************************************************************************
232 The Window Object
233******************************************************************************/
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000234
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000235/* Definition of the window type */
Guido van Rossum85738471995-02-17 13:50:17 +0000236
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000237PyTypeObject PyCursesWindow_Type;
238
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000239/* Function prototype macros for Window object
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000240
241 X - function name
242 TYPE - parameter Type
243 ERGSTR - format string for construction of the return value
244 PARSESTR - format string for argument parsing
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000245*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000246
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000247#define Window_NoArgNoReturnFunction(X) \
248 static PyObject *PyCursesWindow_ ## X \
249 (PyCursesWindowObject *self, PyObject *args) \
250 { return PyCursesCheckERR(X(self->win), # X); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000251
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000252#define Window_NoArgTrueFalseFunction(X) \
253 static PyObject * PyCursesWindow_ ## X \
254 (PyCursesWindowObject *self) \
255 { \
256 if (X (self->win) == FALSE) { Py_INCREF(Py_False); return Py_False; } \
257 else { Py_INCREF(Py_True); return Py_True; } }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000258
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000259#define Window_NoArgNoReturnVoidFunction(X) \
260 static PyObject * PyCursesWindow_ ## X \
261 (PyCursesWindowObject *self) \
262 { \
263 X(self->win); Py_INCREF(Py_None); return Py_None; }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000264
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000265#define Window_NoArg2TupleReturnFunction(X, TYPE, ERGSTR) \
266 static PyObject * PyCursesWindow_ ## X \
267 (PyCursesWindowObject *self) \
268 { \
269 TYPE arg1, arg2; \
270 X(self->win,arg1,arg2); return Py_BuildValue(ERGSTR, arg1, arg2); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000271
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000272#define Window_OneArgNoReturnVoidFunction(X, TYPE, PARSESTR) \
273 static PyObject * PyCursesWindow_ ## X \
274 (PyCursesWindowObject *self, PyObject *args) \
275 { \
276 TYPE arg1; \
277 if (!PyArg_ParseTuple(args, PARSESTR, &arg1)) return NULL; \
278 X(self->win,arg1); Py_INCREF(Py_None); return Py_None; }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000279
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000280#define Window_OneArgNoReturnFunction(X, TYPE, PARSESTR) \
281 static PyObject * PyCursesWindow_ ## X \
282 (PyCursesWindowObject *self, PyObject *args) \
283 { \
284 TYPE arg1; \
285 if (!PyArg_ParseTuple(args,PARSESTR, &arg1)) return NULL; \
286 return PyCursesCheckERR(X(self->win, arg1), # X); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000287
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000288#define Window_TwoArgNoReturnFunction(X, TYPE, PARSESTR) \
289 static PyObject * PyCursesWindow_ ## X \
290 (PyCursesWindowObject *self, PyObject *args) \
291 { \
292 TYPE arg1, arg2; \
293 if (!PyArg_ParseTuple(args,PARSESTR, &arg1, &arg2)) return NULL; \
294 return PyCursesCheckERR(X(self->win, arg1, arg2), # X); }
Guido van Rossum85738471995-02-17 13:50:17 +0000295
Guido van Rossumf6971e21994-08-30 12:25:20 +0000296/* ------------- WINDOW routines --------------- */
Guido van Rossum85738471995-02-17 13:50:17 +0000297
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000298Window_NoArgNoReturnFunction(untouchwin)
299Window_NoArgNoReturnFunction(touchwin)
300Window_NoArgNoReturnFunction(redrawwin)
301Window_NoArgNoReturnFunction(winsertln)
302Window_NoArgNoReturnFunction(werase)
303Window_NoArgNoReturnFunction(wdeleteln)
304
305Window_NoArgTrueFalseFunction(is_wintouched)
306
307Window_NoArgNoReturnVoidFunction(wsyncup)
308Window_NoArgNoReturnVoidFunction(wsyncdown)
309Window_NoArgNoReturnVoidFunction(wstandend)
310Window_NoArgNoReturnVoidFunction(wstandout)
311Window_NoArgNoReturnVoidFunction(wcursyncup)
312Window_NoArgNoReturnVoidFunction(wclrtoeol)
313Window_NoArgNoReturnVoidFunction(wclrtobot)
314Window_NoArgNoReturnVoidFunction(wclear)
315
316Window_OneArgNoReturnVoidFunction(idcok, int, "i;True(1) or False(0)")
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200317#ifdef HAVE_CURSES_IMMEDOK
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000318Window_OneArgNoReturnVoidFunction(immedok, int, "i;True(1) or False(0)")
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200319#endif
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +0000320Window_OneArgNoReturnVoidFunction(wtimeout, int, "i;delay")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000321
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000322Window_NoArg2TupleReturnFunction(getyx, int, "ii")
323Window_NoArg2TupleReturnFunction(getbegyx, int, "ii")
324Window_NoArg2TupleReturnFunction(getmaxyx, int, "ii")
325Window_NoArg2TupleReturnFunction(getparyx, int, "ii")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000326
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000327Window_OneArgNoReturnFunction(clearok, int, "i;True(1) or False(0)")
328Window_OneArgNoReturnFunction(idlok, int, "i;True(1) or False(0)")
329Window_OneArgNoReturnFunction(keypad, int, "i;True(1) or False(0)")
330Window_OneArgNoReturnFunction(leaveok, int, "i;True(1) or False(0)")
331Window_OneArgNoReturnFunction(nodelay, int, "i;True(1) or False(0)")
332Window_OneArgNoReturnFunction(notimeout, int, "i;True(1) or False(0)")
333Window_OneArgNoReturnFunction(scrollok, int, "i;True(1) or False(0)")
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000334Window_OneArgNoReturnFunction(winsdelln, int, "i;nlines")
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200335#ifdef HAVE_CURSES_SYNCOK
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000336Window_OneArgNoReturnFunction(syncok, int, "i;True(1) or False(0)")
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200337#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000338
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000339Window_TwoArgNoReturnFunction(mvwin, int, "ii;y,x")
340Window_TwoArgNoReturnFunction(mvderwin, int, "ii;y,x")
341Window_TwoArgNoReturnFunction(wmove, int, "ii;y,x")
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000342#ifndef STRICT_SYSV_CURSES
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000343Window_TwoArgNoReturnFunction(wresize, int, "ii;lines,columns")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000344#endif
345
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000346/* Allocation and deallocation of Window Objects */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000347
Guido van Rossumf6971e21994-08-30 12:25:20 +0000348static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000349PyCursesWindow_New(WINDOW *win)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000350{
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000351 PyCursesWindowObject *wo;
Guido van Rossum85738471995-02-17 13:50:17 +0000352
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000353 wo = PyObject_NEW(PyCursesWindowObject, &PyCursesWindow_Type);
354 if (wo == NULL) return NULL;
355 wo->win = win;
356 return (PyObject *)wo;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000357}
358
359static void
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000360PyCursesWindow_Dealloc(PyCursesWindowObject *wo)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000361{
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000362 if (wo->win != stdscr) delwin(wo->win);
363 PyObject_DEL(wo);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000364}
365
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000366/* Addch, Addstr, Addnstr */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000367
368static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000369PyCursesWindow_AddCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000370{
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000371 int rtn, x, y, use_xy = FALSE;
372 PyObject *temp;
373 chtype ch = 0;
374 attr_t attr = A_NORMAL;
375 long lattr;
Guido van Rossum85738471995-02-17 13:50:17 +0000376
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000377 switch (PyTuple_Size(args)) {
378 case 1:
379 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
380 return NULL;
381 break;
382 case 2:
383 if (!PyArg_ParseTuple(args, "Ol;ch or int,attr", &temp, &lattr))
384 return NULL;
385 attr = lattr;
386 break;
387 case 3:
388 if (!PyArg_ParseTuple(args,"iiO;y,x,ch or int", &y, &x, &temp))
389 return NULL;
390 use_xy = TRUE;
391 break;
392 case 4:
393 if (!PyArg_ParseTuple(args,"iiOl;y,x,ch or int, attr",
394 &y, &x, &temp, &lattr))
395 return NULL;
396 attr = lattr;
397 use_xy = TRUE;
398 break;
399 default:
400 PyErr_SetString(PyExc_TypeError, "addch requires 1 to 4 arguments");
401 return NULL;
402 }
403
404 if (!PyCurses_ConvertToChtype(temp, &ch)) {
405 PyErr_SetString(PyExc_TypeError, "argument 1 or 3 must be a ch or an int");
406 return NULL;
407 }
408
409 if (use_xy == TRUE)
410 rtn = mvwaddch(self->win,y,x, ch | attr);
411 else {
412 rtn = waddch(self->win, ch | attr);
413 }
414 return PyCursesCheckERR(rtn, "addch");
Guido van Rossumf6971e21994-08-30 12:25:20 +0000415}
416
417static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000418PyCursesWindow_AddStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000419{
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000420 int rtn;
421 int x, y;
422 char *str;
423 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
424 long lattr;
425 int use_xy = FALSE, use_attr = FALSE;
Guido van Rossum85738471995-02-17 13:50:17 +0000426
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000427 switch (PyTuple_Size(args)) {
428 case 1:
429 if (!PyArg_ParseTuple(args,"s;str", &str))
430 return NULL;
431 break;
432 case 2:
433 if (!PyArg_ParseTuple(args,"sl;str,attr", &str, &lattr))
434 return NULL;
435 attr = lattr;
436 use_attr = TRUE;
437 break;
438 case 3:
439 if (!PyArg_ParseTuple(args,"iis;int,int,str", &y, &x, &str))
440 return NULL;
441 use_xy = TRUE;
442 break;
443 case 4:
444 if (!PyArg_ParseTuple(args,"iisl;int,int,str,attr", &y, &x, &str, &lattr))
445 return NULL;
446 attr = lattr;
447 use_xy = use_attr = TRUE;
448 break;
449 default:
450 PyErr_SetString(PyExc_TypeError, "addstr requires 1 to 4 arguments");
451 return NULL;
452 }
Guido van Rossum85738471995-02-17 13:50:17 +0000453
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000454 if (use_attr == TRUE) {
455 attr_old = getattrs(self->win);
456 (void)wattrset(self->win,attr);
457 }
458 if (use_xy == TRUE)
459 rtn = mvwaddstr(self->win,y,x,str);
460 else
461 rtn = waddstr(self->win,str);
462 if (use_attr == TRUE)
463 (void)wattrset(self->win,attr_old);
464 return PyCursesCheckERR(rtn, "addstr");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000465}
Guido van Rossum85738471995-02-17 13:50:17 +0000466
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000467static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000468PyCursesWindow_AddNStr(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000469{
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000470 int rtn, x, y, n;
471 char *str;
472 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
473 long lattr;
474 int use_xy = FALSE, use_attr = FALSE;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000475
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000476 switch (PyTuple_Size(args)) {
477 case 2:
478 if (!PyArg_ParseTuple(args,"si;str,n", &str, &n))
479 return NULL;
480 break;
481 case 3:
482 if (!PyArg_ParseTuple(args,"sil;str,n,attr", &str, &n, &lattr))
483 return NULL;
484 attr = lattr;
485 use_attr = TRUE;
486 break;
487 case 4:
488 if (!PyArg_ParseTuple(args,"iisi;y,x,str,n", &y, &x, &str, &n))
489 return NULL;
490 use_xy = TRUE;
491 break;
492 case 5:
493 if (!PyArg_ParseTuple(args,"iisil;y,x,str,n,attr", &y, &x, &str, &n, &lattr))
494 return NULL;
495 attr = lattr;
496 use_xy = use_attr = TRUE;
497 break;
498 default:
499 PyErr_SetString(PyExc_TypeError, "addnstr requires 2 to 5 arguments");
500 return NULL;
501 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000502
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000503 if (use_attr == TRUE) {
504 attr_old = getattrs(self->win);
505 (void)wattrset(self->win,attr);
506 }
507 if (use_xy == TRUE)
508 rtn = mvwaddnstr(self->win,y,x,str,n);
509 else
510 rtn = waddnstr(self->win,str,n);
511 if (use_attr == TRUE)
512 (void)wattrset(self->win,attr_old);
513 return PyCursesCheckERR(rtn, "addnstr");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000514}
515
516static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000517PyCursesWindow_Bkgd(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000518{
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000519 PyObject *temp;
520 chtype bkgd;
521 attr_t attr = A_NORMAL;
522 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000523
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000524 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000525 case 1:
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000526 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
527 return NULL;
528 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000529 case 2:
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000530 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
531 return NULL;
532 attr = lattr;
533 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000534 default:
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000535 PyErr_SetString(PyExc_TypeError, "bkgd requires 1 or 2 arguments");
536 return NULL;
537 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000538
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000539 if (!PyCurses_ConvertToChtype(temp, &bkgd)) {
540 PyErr_SetString(PyExc_TypeError, "argument 1 or 3 must be a ch or an int");
541 return NULL;
542 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000543
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000544 return PyCursesCheckERR(wbkgd(self->win, bkgd | attr), "bkgd");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000545}
546
547static PyObject *
Andrew M. Kuchling62182c82008-01-08 14:56:02 +0000548PyCursesWindow_AttrOff(PyCursesWindowObject *self, PyObject *args)
549{
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000550 long lattr;
551 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
552 return NULL;
553 return PyCursesCheckERR(wattroff(self->win, (attr_t)lattr), "attroff");
Andrew M. Kuchling62182c82008-01-08 14:56:02 +0000554}
555
556static PyObject *
557PyCursesWindow_AttrOn(PyCursesWindowObject *self, PyObject *args)
558{
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000559 long lattr;
560 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
561 return NULL;
562 return PyCursesCheckERR(wattron(self->win, (attr_t)lattr), "attron");
Andrew M. Kuchling62182c82008-01-08 14:56:02 +0000563}
564
565static PyObject *
566PyCursesWindow_AttrSet(PyCursesWindowObject *self, PyObject *args)
567{
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000568 long lattr;
569 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
570 return NULL;
571 return PyCursesCheckERR(wattrset(self->win, (attr_t)lattr), "attrset");
Andrew M. Kuchling62182c82008-01-08 14:56:02 +0000572}
573
574static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000575PyCursesWindow_BkgdSet(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000576{
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000577 PyObject *temp;
578 chtype bkgd;
579 attr_t attr = A_NORMAL;
580 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000581
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000582 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000583 case 1:
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000584 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
585 return NULL;
586 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000587 case 2:
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000588 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
589 return NULL;
590 attr = lattr;
591 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000592 default:
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000593 PyErr_SetString(PyExc_TypeError, "bkgdset requires 1 or 2 arguments");
594 return NULL;
595 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000596
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000597 if (!PyCurses_ConvertToChtype(temp, &bkgd)) {
598 PyErr_SetString(PyExc_TypeError, "argument 1 must be a ch or an int");
599 return NULL;
600 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000601
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000602 wbkgdset(self->win, bkgd | attr);
603 return PyCursesCheckERR(0, "bkgdset");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000604}
605
606static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000607PyCursesWindow_Border(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000608{
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000609 PyObject *temp[8];
610 chtype ch[8];
611 int i;
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000612
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000613 /* Clear the array of parameters */
614 for(i=0; i<8; i++) {
615 temp[i] = NULL;
616 ch[i] = 0;
617 }
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000618
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000619 if (!PyArg_ParseTuple(args,"|OOOOOOOO;ls,rs,ts,bs,tl,tr,bl,br",
620 &temp[0], &temp[1], &temp[2], &temp[3],
621 &temp[4], &temp[5], &temp[6], &temp[7]))
622 return NULL;
623
624 for(i=0; i<8; i++) {
625 if (temp[i] != NULL && !PyCurses_ConvertToChtype(temp[i], &ch[i])) {
626 PyErr_Format(PyExc_TypeError,
627 "argument %i must be a ch or an int", i+1);
628 return NULL;
629 }
630 }
631
632 wborder(self->win,
633 ch[0], ch[1], ch[2], ch[3],
634 ch[4], ch[5], ch[6], ch[7]);
635 Py_INCREF(Py_None);
636 return Py_None;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000637}
638
639static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000640PyCursesWindow_Box(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000641{
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000642 chtype ch1=0,ch2=0;
643 switch(PyTuple_Size(args)){
644 case 0: break;
645 default:
646 if (!PyArg_ParseTuple(args,"ll;vertint,horint", &ch1, &ch2))
647 return NULL;
648 }
649 box(self->win,ch1,ch2);
650 Py_INCREF(Py_None);
651 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000652}
653
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000654#if defined(HAVE_NCURSES_H) || defined(MVWDELCH_IS_EXPRESSION)
655#define py_mvwdelch mvwdelch
656#else
657int py_mvwdelch(WINDOW *w, int y, int x)
658{
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000659 mvwdelch(w,y,x);
660 /* On HP/UX, mvwdelch already returns. On other systems,
661 we may well run into this return statement. */
662 return 0;
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000663}
664#endif
665
Andrew M. Kuchling400a49b2007-04-11 13:39:00 +0000666/* chgat, added by Fabian Kreutz <fabian.kreutz at gmx.net> */
667
668static PyObject *
669PyCursesWindow_ChgAt(PyCursesWindowObject *self, PyObject *args)
670{
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000671 int rtn;
672 int x, y;
673 int num = -1;
674 short color;
675 attr_t attr = A_NORMAL;
676 long lattr;
677 int use_xy = FALSE;
Andrew M. Kuchling400a49b2007-04-11 13:39:00 +0000678
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000679 switch (PyTuple_Size(args)) {
680 case 1:
681 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
682 return NULL;
683 attr = lattr;
684 break;
685 case 2:
686 if (!PyArg_ParseTuple(args,"il;n,attr", &num, &lattr))
687 return NULL;
688 attr = lattr;
689 break;
690 case 3:
691 if (!PyArg_ParseTuple(args,"iil;int,int,attr", &y, &x, &lattr))
692 return NULL;
693 attr = lattr;
694 use_xy = TRUE;
695 break;
696 case 4:
697 if (!PyArg_ParseTuple(args,"iiil;int,int,n,attr", &y, &x, &num, &lattr))
698 return NULL;
699 attr = lattr;
700 use_xy = TRUE;
701 break;
702 default:
703 PyErr_SetString(PyExc_TypeError, "chgat requires 1 to 4 arguments");
704 return NULL;
705 }
Andrew M. Kuchling400a49b2007-04-11 13:39:00 +0000706
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000707 color = (short)((attr >> 8) & 0xff);
708 attr = attr - (color << 8);
Andrew M. Kuchling400a49b2007-04-11 13:39:00 +0000709
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000710 if (use_xy == TRUE) {
711 rtn = mvwchgat(self->win,y,x,num,attr,color,NULL);
712 touchline(self->win,y,1);
713 } else {
714 getyx(self->win,y,x);
715 rtn = wchgat(self->win,num,attr,color,NULL);
716 touchline(self->win,y,1);
717 }
718 return PyCursesCheckERR(rtn, "chgat");
Andrew M. Kuchling400a49b2007-04-11 13:39:00 +0000719}
720
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000721
Guido van Rossumf6971e21994-08-30 12:25:20 +0000722static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000723PyCursesWindow_DelCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000724{
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000725 int rtn;
726 int x, y;
Guido van Rossum85738471995-02-17 13:50:17 +0000727
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000728 switch (PyTuple_Size(args)) {
729 case 0:
730 rtn = wdelch(self->win);
731 break;
732 case 2:
733 if (!PyArg_ParseTuple(args,"ii;y,x", &y, &x))
734 return NULL;
735 rtn = py_mvwdelch(self->win,y,x);
736 break;
737 default:
738 PyErr_SetString(PyExc_TypeError, "delch requires 0 or 2 arguments");
739 return NULL;
740 }
741 return PyCursesCheckERR(rtn, "[mv]wdelch");
Guido van Rossumf6971e21994-08-30 12:25:20 +0000742}
743
744static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000745PyCursesWindow_DerWin(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000746{
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000747 WINDOW *win;
748 int nlines, ncols, begin_y, begin_x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000749
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000750 nlines = 0;
751 ncols = 0;
752 switch (PyTuple_Size(args)) {
753 case 2:
754 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
755 return NULL;
756 break;
757 case 4:
758 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
759 &nlines,&ncols,&begin_y,&begin_x))
760 return NULL;
761 break;
762 default:
763 PyErr_SetString(PyExc_TypeError, "derwin requires 2 or 4 arguments");
764 return NULL;
765 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000766
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000767 win = derwin(self->win,nlines,ncols,begin_y,begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000768
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000769 if (win == NULL) {
770 PyErr_SetString(PyCursesError, catchall_NULL);
771 return NULL;
772 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000773
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000774 return (PyObject *)PyCursesWindow_New(win);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000775}
776
777static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000778PyCursesWindow_EchoChar(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000779{
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000780 PyObject *temp;
781 chtype ch;
782 attr_t attr = A_NORMAL;
783 long lattr;
Guido van Rossum85738471995-02-17 13:50:17 +0000784
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000785 switch (PyTuple_Size(args)) {
786 case 1:
787 if (!PyArg_ParseTuple(args,"O;ch or int", &temp))
788 return NULL;
789 break;
790 case 2:
791 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
792 return NULL;
793 attr = lattr;
794 break;
795 default:
796 PyErr_SetString(PyExc_TypeError, "echochar requires 1 or 2 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000797
798
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000799 return NULL;
800 }
Guido van Rossum85738471995-02-17 13:50:17 +0000801
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000802 if (!PyCurses_ConvertToChtype(temp, &ch)) {
803 PyErr_SetString(PyExc_TypeError, "argument 1 must be a ch or an int");
804 return NULL;
805 }
806
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000807#ifdef WINDOW_HAS_FLAGS
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000808 if (self->win->_flags & _ISPAD)
809 return PyCursesCheckERR(pechochar(self->win, ch | attr),
810 "echochar");
811 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000812#endif
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000813 return PyCursesCheckERR(wechochar(self->win, ch | attr),
814 "echochar");
Guido van Rossumf6971e21994-08-30 12:25:20 +0000815}
816
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +0000817#ifdef NCURSES_MOUSE_VERSION
818static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000819PyCursesWindow_Enclose(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +0000820{
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000821 int x, y;
822 if (!PyArg_ParseTuple(args,"ii;y,x", &y, &x))
823 return NULL;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +0000824
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000825 return PyInt_FromLong( wenclose(self->win,y,x) );
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +0000826}
827#endif
828
Guido van Rossumf6971e21994-08-30 12:25:20 +0000829static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000830PyCursesWindow_GetBkgd(PyCursesWindowObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000831{
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000832 return PyInt_FromLong((long) getbkgd(self->win));
Guido van Rossumf6971e21994-08-30 12:25:20 +0000833}
834
835static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000836PyCursesWindow_GetCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000837{
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000838 int x, y;
839 int rtn;
Guido van Rossum85738471995-02-17 13:50:17 +0000840
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000841 switch (PyTuple_Size(args)) {
842 case 0:
843 Py_BEGIN_ALLOW_THREADS
844 rtn = wgetch(self->win);
845 Py_END_ALLOW_THREADS
846 break;
847 case 2:
848 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
849 return NULL;
850 Py_BEGIN_ALLOW_THREADS
851 rtn = mvwgetch(self->win,y,x);
852 Py_END_ALLOW_THREADS
853 break;
854 default:
855 PyErr_SetString(PyExc_TypeError, "getch requires 0 or 2 arguments");
856 return NULL;
857 }
858 return PyInt_FromLong((long)rtn);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000859}
Guido van Rossum85738471995-02-17 13:50:17 +0000860
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000861static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000862PyCursesWindow_GetKey(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000863{
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000864 int x, y;
865 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000866
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000867 switch (PyTuple_Size(args)) {
868 case 0:
869 Py_BEGIN_ALLOW_THREADS
870 rtn = wgetch(self->win);
871 Py_END_ALLOW_THREADS
872 break;
873 case 2:
874 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
875 return NULL;
876 Py_BEGIN_ALLOW_THREADS
877 rtn = mvwgetch(self->win,y,x);
878 Py_END_ALLOW_THREADS
879 break;
880 default:
881 PyErr_SetString(PyExc_TypeError, "getkey requires 0 or 2 arguments");
882 return NULL;
883 }
884 if (rtn == ERR) {
885 /* getch() returns ERR in nodelay mode */
R David Murraya39c47a2013-03-19 16:26:53 -0400886 PyErr_CheckSignals();
887 if (!PyErr_Occurred())
888 PyErr_SetString(PyCursesError, "no input");
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000889 return NULL;
890 } else if (rtn<=255) {
891 return Py_BuildValue("c", rtn);
892 } else {
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +0200893 const char *knp = keyname(rtn);
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000894 return PyString_FromString((knp == NULL) ? "" : knp);
895 }
Guido van Rossumf6971e21994-08-30 12:25:20 +0000896}
897
898static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000899PyCursesWindow_GetStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000900{
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000901 int x, y, n;
902 char rtn[1024]; /* This should be big enough.. I hope */
903 int rtn2;
Guido van Rossum85738471995-02-17 13:50:17 +0000904
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000905 switch (PyTuple_Size(args)) {
906 case 0:
907 Py_BEGIN_ALLOW_THREADS
908 rtn2 = wgetnstr(self->win,rtn, 1023);
909 Py_END_ALLOW_THREADS
910 break;
911 case 1:
912 if (!PyArg_ParseTuple(args,"i;n", &n))
913 return NULL;
Benjamin Petersonf6701202016-08-13 18:15:28 -0700914 if (n < 0) {
915 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
916 return NULL;
917 }
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000918 Py_BEGIN_ALLOW_THREADS
919 rtn2 = wgetnstr(self->win,rtn,MIN(n, 1023));
920 Py_END_ALLOW_THREADS
921 break;
922 case 2:
923 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
924 return NULL;
925 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling55b0a0e2006-07-26 17:16:52 +0000926#ifdef STRICT_SYSV_CURSES
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000927 rtn2 = wmove(self->win,y,x)==ERR ? ERR : wgetnstr(self->win, rtn, 1023);
Andrew M. Kuchling55b0a0e2006-07-26 17:16:52 +0000928#else
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000929 rtn2 = mvwgetnstr(self->win,y,x,rtn, 1023);
Andrew M. Kuchling55b0a0e2006-07-26 17:16:52 +0000930#endif
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000931 Py_END_ALLOW_THREADS
932 break;
933 case 3:
934 if (!PyArg_ParseTuple(args,"iii;y,x,n", &y, &x, &n))
935 return NULL;
Benjamin Petersonf6701202016-08-13 18:15:28 -0700936 if (n < 0) {
937 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
938 return NULL;
939 }
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000940#ifdef STRICT_SYSV_CURSES
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000941 Py_BEGIN_ALLOW_THREADS
942 rtn2 = wmove(self->win,y,x)==ERR ? ERR :
943 wgetnstr(self->win, rtn, MIN(n, 1023));
944 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000945#else
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000946 Py_BEGIN_ALLOW_THREADS
947 rtn2 = mvwgetnstr(self->win, y, x, rtn, MIN(n, 1023));
948 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000949#endif
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000950 break;
951 default:
952 PyErr_SetString(PyExc_TypeError, "getstr requires 0 to 3 arguments");
953 return NULL;
954 }
955 if (rtn2 == ERR)
956 rtn[0] = 0;
957 return PyString_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000958}
959
960static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000961PyCursesWindow_Hline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000962{
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000963 PyObject *temp;
964 chtype ch;
965 int n, x, y, code = OK;
966 attr_t attr = A_NORMAL;
967 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000968
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000969 switch (PyTuple_Size(args)) {
970 case 2:
971 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
972 return NULL;
973 break;
974 case 3:
975 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &lattr))
976 return NULL;
977 attr = lattr;
978 break;
979 case 4:
980 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
981 return NULL;
982 code = wmove(self->win, y, x);
983 break;
984 case 5:
985 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
986 &y, &x, &temp, &n, &lattr))
987 return NULL;
988 attr = lattr;
989 code = wmove(self->win, y, x);
990 break;
991 default:
992 PyErr_SetString(PyExc_TypeError, "hline requires 2 to 5 arguments");
993 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000994 }
Victor Stinnerfd2103e2010-05-15 22:19:27 +0000995
996 if (code != ERR) {
997 if (!PyCurses_ConvertToChtype(temp, &ch)) {
998 PyErr_SetString(PyExc_TypeError,
999 "argument 1 or 3 must be a ch or an int");
1000 return NULL;
1001 }
1002 return PyCursesCheckERR(whline(self->win, ch | attr, n), "hline");
1003 } else
1004 return PyCursesCheckERR(code, "wmove");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001005}
1006
1007static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001008PyCursesWindow_InsCh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001009{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001010 int rtn, x, y, use_xy = FALSE;
1011 PyObject *temp;
1012 chtype ch = 0;
1013 attr_t attr = A_NORMAL;
1014 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001015
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001016 switch (PyTuple_Size(args)) {
1017 case 1:
1018 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
1019 return NULL;
1020 break;
1021 case 2:
1022 if (!PyArg_ParseTuple(args, "Ol;ch or int,attr", &temp, &lattr))
1023 return NULL;
1024 attr = lattr;
1025 break;
1026 case 3:
1027 if (!PyArg_ParseTuple(args,"iiO;y,x,ch or int", &y, &x, &temp))
1028 return NULL;
1029 use_xy = TRUE;
1030 break;
1031 case 4:
1032 if (!PyArg_ParseTuple(args,"iiOl;y,x,ch or int, attr", &y, &x, &temp, &lattr))
1033 return NULL;
1034 attr = lattr;
1035 use_xy = TRUE;
1036 break;
1037 default:
1038 PyErr_SetString(PyExc_TypeError, "insch requires 1 or 4 arguments");
1039 return NULL;
1040 }
1041
1042 if (!PyCurses_ConvertToChtype(temp, &ch)) {
1043 PyErr_SetString(PyExc_TypeError,
1044 "argument 1 or 3 must be a ch or an int");
1045 return NULL;
1046 }
1047
1048 if (use_xy == TRUE)
1049 rtn = mvwinsch(self->win,y,x, ch | attr);
1050 else {
1051 rtn = winsch(self->win, ch | attr);
1052 }
1053 return PyCursesCheckERR(rtn, "insch");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001054}
1055
1056static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001057PyCursesWindow_InCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001058{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001059 int x, y, rtn;
Guido van Rossum85738471995-02-17 13:50:17 +00001060
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001061 switch (PyTuple_Size(args)) {
1062 case 0:
1063 rtn = winch(self->win);
1064 break;
1065 case 2:
1066 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1067 return NULL;
1068 rtn = mvwinch(self->win,y,x);
1069 break;
1070 default:
1071 PyErr_SetString(PyExc_TypeError, "inch requires 0 or 2 arguments");
1072 return NULL;
1073 }
1074 return PyInt_FromLong((long) rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001075}
1076
1077static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001078PyCursesWindow_InStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001079{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001080 int x, y, n;
1081 char rtn[1024]; /* This should be big enough.. I hope */
1082 int rtn2;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001083
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001084 switch (PyTuple_Size(args)) {
1085 case 0:
1086 rtn2 = winnstr(self->win,rtn, 1023);
1087 break;
1088 case 1:
1089 if (!PyArg_ParseTuple(args,"i;n", &n))
1090 return NULL;
Benjamin Peterson505989c2016-08-15 21:40:14 -07001091 if (n < 0) {
1092 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1093 return NULL;
1094 }
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001095 rtn2 = winnstr(self->win,rtn,MIN(n,1023));
1096 break;
1097 case 2:
1098 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1099 return NULL;
1100 rtn2 = mvwinnstr(self->win,y,x,rtn,1023);
1101 break;
1102 case 3:
1103 if (!PyArg_ParseTuple(args, "iii;y,x,n", &y, &x, &n))
1104 return NULL;
Benjamin Peterson505989c2016-08-15 21:40:14 -07001105 if (n < 0) {
1106 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1107 return NULL;
1108 }
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001109 rtn2 = mvwinnstr(self->win, y, x, rtn, MIN(n,1023));
1110 break;
1111 default:
1112 PyErr_SetString(PyExc_TypeError, "instr requires 0 or 3 arguments");
1113 return NULL;
1114 }
1115 if (rtn2 == ERR)
1116 rtn[0] = 0;
1117 return PyString_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001118}
1119
1120static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001121PyCursesWindow_InsStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001122{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001123 int rtn;
1124 int x, y;
1125 char *str;
1126 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
1127 long lattr;
1128 int use_xy = FALSE, use_attr = FALSE;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001129
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001130 switch (PyTuple_Size(args)) {
1131 case 1:
1132 if (!PyArg_ParseTuple(args,"s;str", &str))
1133 return NULL;
1134 break;
1135 case 2:
1136 if (!PyArg_ParseTuple(args,"sl;str,attr", &str, &lattr))
1137 return NULL;
1138 attr = lattr;
1139 use_attr = TRUE;
1140 break;
1141 case 3:
1142 if (!PyArg_ParseTuple(args,"iis;y,x,str", &y, &x, &str))
1143 return NULL;
1144 use_xy = TRUE;
1145 break;
1146 case 4:
1147 if (!PyArg_ParseTuple(args,"iisl;y,x,str,attr", &y, &x, &str, &lattr))
1148 return NULL;
1149 attr = lattr;
1150 use_xy = use_attr = TRUE;
1151 break;
1152 default:
1153 PyErr_SetString(PyExc_TypeError, "insstr requires 1 to 4 arguments");
1154 return NULL;
1155 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001156
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001157 if (use_attr == TRUE) {
1158 attr_old = getattrs(self->win);
1159 (void)wattrset(self->win,attr);
1160 }
1161 if (use_xy == TRUE)
1162 rtn = mvwinsstr(self->win,y,x,str);
1163 else
1164 rtn = winsstr(self->win,str);
1165 if (use_attr == TRUE)
1166 (void)wattrset(self->win,attr_old);
1167 return PyCursesCheckERR(rtn, "insstr");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001168}
1169
1170static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001171PyCursesWindow_InsNStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001172{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001173 int rtn, x, y, n;
1174 char *str;
1175 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
1176 long lattr;
1177 int use_xy = FALSE, use_attr = FALSE;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001178
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001179 switch (PyTuple_Size(args)) {
1180 case 2:
1181 if (!PyArg_ParseTuple(args,"si;str,n", &str, &n))
1182 return NULL;
1183 break;
1184 case 3:
1185 if (!PyArg_ParseTuple(args,"sil;str,n,attr", &str, &n, &lattr))
1186 return NULL;
1187 attr = lattr;
1188 use_attr = TRUE;
1189 break;
1190 case 4:
1191 if (!PyArg_ParseTuple(args,"iisi;y,x,str,n", &y, &x, &str, &n))
1192 return NULL;
1193 use_xy = TRUE;
1194 break;
1195 case 5:
1196 if (!PyArg_ParseTuple(args,"iisil;y,x,str,n,attr", &y, &x, &str, &n, &lattr))
1197 return NULL;
1198 attr = lattr;
1199 use_xy = use_attr = TRUE;
1200 break;
1201 default:
1202 PyErr_SetString(PyExc_TypeError, "insnstr requires 2 to 5 arguments");
1203 return NULL;
1204 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001205
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001206 if (use_attr == TRUE) {
1207 attr_old = getattrs(self->win);
1208 (void)wattrset(self->win,attr);
1209 }
1210 if (use_xy == TRUE)
1211 rtn = mvwinsnstr(self->win,y,x,str,n);
1212 else
1213 rtn = winsnstr(self->win,str,n);
1214 if (use_attr == TRUE)
1215 (void)wattrset(self->win,attr_old);
1216 return PyCursesCheckERR(rtn, "insnstr");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001217}
1218
1219static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001220PyCursesWindow_Is_LineTouched(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001221{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001222 int line, erg;
1223 if (!PyArg_ParseTuple(args,"i;line", &line))
1224 return NULL;
1225 erg = is_linetouched(self->win, line);
1226 if (erg == ERR) {
1227 PyErr_SetString(PyExc_TypeError,
1228 "is_linetouched: line number outside of boundaries");
1229 return NULL;
1230 } else
1231 if (erg == FALSE) {
1232 Py_INCREF(Py_False);
1233 return Py_False;
1234 } else {
1235 Py_INCREF(Py_True);
1236 return Py_True;
1237 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001238}
1239
1240static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001241PyCursesWindow_NoOutRefresh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001242{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001243 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
1244 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001245
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001246#ifndef WINDOW_HAS_FLAGS
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001247 if (0)
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001248#else
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001249 if (self->win->_flags & _ISPAD)
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001250#endif
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001251 {
1252 switch(PyTuple_Size(args)) {
1253 case 6:
1254 if (!PyArg_ParseTuple(args,
1255 "iiiiii;" \
1256 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1257 &pminrow, &pmincol, &sminrow,
1258 &smincol, &smaxrow, &smaxcol))
1259 return NULL;
1260 Py_BEGIN_ALLOW_THREADS
1261 rtn = pnoutrefresh(self->win,
1262 pminrow, pmincol, sminrow,
1263 smincol, smaxrow, smaxcol);
1264 Py_END_ALLOW_THREADS
1265 return PyCursesCheckERR(rtn, "pnoutrefresh");
1266 default:
1267 PyErr_SetString(PyCursesError,
1268 "noutrefresh() called for a pad "
1269 "requires 6 arguments");
1270 return NULL;
1271 }
1272 } else {
1273 if (!PyArg_ParseTuple(args, ":noutrefresh"))
1274 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001275
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001276 Py_BEGIN_ALLOW_THREADS
1277 rtn = wnoutrefresh(self->win);
1278 Py_END_ALLOW_THREADS
1279 return PyCursesCheckERR(rtn, "wnoutrefresh");
1280 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001281}
1282
1283static PyObject *
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001284PyCursesWindow_Overlay(PyCursesWindowObject *self, PyObject *args)
1285{
1286 PyCursesWindowObject *temp;
1287 int use_copywin = FALSE;
1288 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1289 int rtn;
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001290
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001291 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001292 case 1:
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001293 if (!PyArg_ParseTuple(args, "O!;window object",
1294 &PyCursesWindow_Type, &temp))
1295 return NULL;
1296 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001297 case 7:
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001298 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
1299 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1300 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1301 return NULL;
1302 use_copywin = TRUE;
1303 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001304 default:
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001305 PyErr_SetString(PyExc_TypeError,
1306 "overlay requires one or seven arguments");
1307 return NULL;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001308 }
1309
1310 if (use_copywin == TRUE) {
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001311 rtn = copywin(self->win, temp->win, sminrow, smincol,
1312 dminrow, dmincol, dmaxrow, dmaxcol, TRUE);
1313 return PyCursesCheckERR(rtn, "copywin");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001314 }
1315 else {
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001316 rtn = overlay(self->win, temp->win);
1317 return PyCursesCheckERR(rtn, "overlay");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001318 }
1319}
1320
1321static PyObject *
1322PyCursesWindow_Overwrite(PyCursesWindowObject *self, PyObject *args)
1323{
1324 PyCursesWindowObject *temp;
1325 int use_copywin = FALSE;
1326 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1327 int rtn;
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001328
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001329 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001330 case 1:
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001331 if (!PyArg_ParseTuple(args, "O!;window object",
1332 &PyCursesWindow_Type, &temp))
1333 return NULL;
1334 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001335 case 7:
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001336 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
1337 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1338 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1339 return NULL;
1340 use_copywin = TRUE;
1341 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001342 default:
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001343 PyErr_SetString(PyExc_TypeError,
1344 "overwrite requires one or seven arguments");
1345 return NULL;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001346 }
1347
1348 if (use_copywin == TRUE) {
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001349 rtn = copywin(self->win, temp->win, sminrow, smincol,
1350 dminrow, dmincol, dmaxrow, dmaxcol, FALSE);
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001351 return PyCursesCheckERR(rtn, "copywin");
1352 }
1353 else {
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001354 rtn = overwrite(self->win, temp->win);
1355 return PyCursesCheckERR(rtn, "overwrite");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001356 }
1357}
1358
1359static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001360PyCursesWindow_PutWin(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001361{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001362 PyObject *temp;
1363
1364 if (!PyArg_ParseTuple(args, "O;fileobj", &temp))
1365 return NULL;
1366 if (!PyFile_Check(temp)) {
1367 PyErr_SetString(PyExc_TypeError, "argument must be a file object");
1368 return NULL;
1369 }
1370 return PyCursesCheckERR(putwin(self->win, PyFile_AsFile(temp)),
1371 "putwin");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001372}
1373
1374static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001375PyCursesWindow_RedrawLine(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001376{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001377 int beg, num;
1378 if (!PyArg_ParseTuple(args, "ii;beg,num", &beg, &num))
1379 return NULL;
1380 return PyCursesCheckERR(wredrawln(self->win,beg,num), "redrawln");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001381}
1382
1383static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001384PyCursesWindow_Refresh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001385{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001386 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
1387 int rtn;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001388
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001389#ifndef WINDOW_HAS_FLAGS
1390 if (0)
1391#else
1392 if (self->win->_flags & _ISPAD)
1393#endif
1394 {
1395 switch(PyTuple_Size(args)) {
1396 case 6:
1397 if (!PyArg_ParseTuple(args,
1398 "iiiiii;" \
1399 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1400 &pminrow, &pmincol, &sminrow,
1401 &smincol, &smaxrow, &smaxcol))
1402 return NULL;
1403
1404 Py_BEGIN_ALLOW_THREADS
1405 rtn = prefresh(self->win,
1406 pminrow, pmincol, sminrow,
1407 smincol, smaxrow, smaxcol);
1408 Py_END_ALLOW_THREADS
1409 return PyCursesCheckERR(rtn, "prefresh");
1410 default:
1411 PyErr_SetString(PyCursesError,
1412 "refresh() for a pad requires 6 arguments");
1413 return NULL;
1414 }
1415 } else {
1416 if (!PyArg_ParseTuple(args, ":refresh"))
1417 return NULL;
1418 Py_BEGIN_ALLOW_THREADS
1419 rtn = wrefresh(self->win);
1420 Py_END_ALLOW_THREADS
1421 return PyCursesCheckERR(rtn, "prefresh");
1422 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001423}
1424
1425static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001426PyCursesWindow_SetScrollRegion(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001427{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001428 int x, y;
1429 if (!PyArg_ParseTuple(args,"ii;top, bottom",&y,&x))
1430 return NULL;
1431 return PyCursesCheckERR(wsetscrreg(self->win,y,x), "wsetscrreg");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001432}
1433
1434static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001435PyCursesWindow_SubWin(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001436{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001437 WINDOW *win;
1438 int nlines, ncols, begin_y, begin_x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001439
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001440 nlines = 0;
1441 ncols = 0;
1442 switch (PyTuple_Size(args)) {
1443 case 2:
1444 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
1445 return NULL;
1446 break;
1447 case 4:
1448 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
1449 &nlines,&ncols,&begin_y,&begin_x))
1450 return NULL;
1451 break;
1452 default:
1453 PyErr_SetString(PyExc_TypeError, "subwin requires 2 or 4 arguments");
1454 return NULL;
1455 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001456
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001457 /* printf("Subwin: %i %i %i %i \n", nlines, ncols, begin_y, begin_x); */
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001458#ifdef WINDOW_HAS_FLAGS
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001459 if (self->win->_flags & _ISPAD)
1460 win = subpad(self->win, nlines, ncols, begin_y, begin_x);
1461 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001462#endif
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001463 win = subwin(self->win, nlines, ncols, begin_y, begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001464
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001465 if (win == NULL) {
1466 PyErr_SetString(PyCursesError, catchall_NULL);
1467 return NULL;
1468 }
1469
1470 return (PyObject *)PyCursesWindow_New(win);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001471}
1472
1473static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001474PyCursesWindow_Scroll(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001475{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001476 int nlines;
1477 switch(PyTuple_Size(args)) {
1478 case 0:
1479 return PyCursesCheckERR(scroll(self->win), "scroll");
1480 case 1:
1481 if (!PyArg_ParseTuple(args, "i;nlines", &nlines))
1482 return NULL;
1483 return PyCursesCheckERR(wscrl(self->win, nlines), "scroll");
1484 default:
1485 PyErr_SetString(PyExc_TypeError, "scroll requires 0 or 1 arguments");
1486 return NULL;
1487 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001488}
1489
1490static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001491PyCursesWindow_TouchLine(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001492{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001493 int st, cnt, val;
1494 switch (PyTuple_Size(args)) {
1495 case 2:
1496 if (!PyArg_ParseTuple(args,"ii;start,count",&st,&cnt))
1497 return NULL;
1498 return PyCursesCheckERR(touchline(self->win,st,cnt), "touchline");
1499 case 3:
1500 if (!PyArg_ParseTuple(args, "iii;start,count,val", &st, &cnt, &val))
1501 return NULL;
1502 return PyCursesCheckERR(wtouchln(self->win, st, cnt, val), "touchline");
1503 default:
1504 PyErr_SetString(PyExc_TypeError, "touchline requires 2 or 3 arguments");
1505 return NULL;
1506 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001507}
1508
1509static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001510PyCursesWindow_Vline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001511{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001512 PyObject *temp;
1513 chtype ch;
1514 int n, x, y, code = OK;
1515 attr_t attr = A_NORMAL;
1516 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001517
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001518 switch (PyTuple_Size(args)) {
1519 case 2:
1520 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
1521 return NULL;
1522 break;
1523 case 3:
1524 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &lattr))
1525 return NULL;
1526 attr = lattr;
1527 break;
1528 case 4:
1529 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
1530 return NULL;
1531 code = wmove(self->win, y, x);
1532 break;
1533 case 5:
1534 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
1535 &y, &x, &temp, &n, &lattr))
1536 return NULL;
1537 attr = lattr;
1538 code = wmove(self->win, y, x);
1539 break;
1540 default:
1541 PyErr_SetString(PyExc_TypeError, "vline requires 2 to 5 arguments");
1542 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001543 }
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001544
1545 if (code != ERR) {
1546 if (!PyCurses_ConvertToChtype(temp, &ch)) {
1547 PyErr_SetString(PyExc_TypeError,
1548 "argument 1 or 3 must be a ch or an int");
1549 return NULL;
1550 }
1551 return PyCursesCheckERR(wvline(self->win, ch | attr, n), "vline");
1552 } else
1553 return PyCursesCheckERR(code, "wmove");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001554}
1555
1556static PyMethodDef PyCursesWindow_Methods[] = {
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001557 {"addch", (PyCFunction)PyCursesWindow_AddCh, METH_VARARGS},
1558 {"addnstr", (PyCFunction)PyCursesWindow_AddNStr, METH_VARARGS},
1559 {"addstr", (PyCFunction)PyCursesWindow_AddStr, METH_VARARGS},
1560 {"attroff", (PyCFunction)PyCursesWindow_AttrOff, METH_VARARGS},
1561 {"attron", (PyCFunction)PyCursesWindow_AttrOn, METH_VARARGS},
1562 {"attrset", (PyCFunction)PyCursesWindow_AttrSet, METH_VARARGS},
1563 {"bkgd", (PyCFunction)PyCursesWindow_Bkgd, METH_VARARGS},
1564 {"chgat", (PyCFunction)PyCursesWindow_ChgAt, METH_VARARGS},
1565 {"bkgdset", (PyCFunction)PyCursesWindow_BkgdSet, METH_VARARGS},
1566 {"border", (PyCFunction)PyCursesWindow_Border, METH_VARARGS},
1567 {"box", (PyCFunction)PyCursesWindow_Box, METH_VARARGS},
1568 {"clear", (PyCFunction)PyCursesWindow_wclear, METH_NOARGS},
1569 {"clearok", (PyCFunction)PyCursesWindow_clearok, METH_VARARGS},
1570 {"clrtobot", (PyCFunction)PyCursesWindow_wclrtobot, METH_NOARGS},
1571 {"clrtoeol", (PyCFunction)PyCursesWindow_wclrtoeol, METH_NOARGS},
1572 {"cursyncup", (PyCFunction)PyCursesWindow_wcursyncup, METH_NOARGS},
1573 {"delch", (PyCFunction)PyCursesWindow_DelCh, METH_VARARGS},
1574 {"deleteln", (PyCFunction)PyCursesWindow_wdeleteln, METH_NOARGS},
1575 {"derwin", (PyCFunction)PyCursesWindow_DerWin, METH_VARARGS},
1576 {"echochar", (PyCFunction)PyCursesWindow_EchoChar, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001577#ifdef NCURSES_MOUSE_VERSION
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001578 {"enclose", (PyCFunction)PyCursesWindow_Enclose, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001579#endif
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001580 {"erase", (PyCFunction)PyCursesWindow_werase, METH_NOARGS},
1581 {"getbegyx", (PyCFunction)PyCursesWindow_getbegyx, METH_NOARGS},
1582 {"getbkgd", (PyCFunction)PyCursesWindow_GetBkgd, METH_NOARGS},
1583 {"getch", (PyCFunction)PyCursesWindow_GetCh, METH_VARARGS},
1584 {"getkey", (PyCFunction)PyCursesWindow_GetKey, METH_VARARGS},
1585 {"getmaxyx", (PyCFunction)PyCursesWindow_getmaxyx, METH_NOARGS},
1586 {"getparyx", (PyCFunction)PyCursesWindow_getparyx, METH_NOARGS},
1587 {"getstr", (PyCFunction)PyCursesWindow_GetStr, METH_VARARGS},
1588 {"getyx", (PyCFunction)PyCursesWindow_getyx, METH_NOARGS},
1589 {"hline", (PyCFunction)PyCursesWindow_Hline, METH_VARARGS},
1590 {"idcok", (PyCFunction)PyCursesWindow_idcok, METH_VARARGS},
1591 {"idlok", (PyCFunction)PyCursesWindow_idlok, METH_VARARGS},
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +02001592#ifdef HAVE_CURSES_IMMEDOK
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001593 {"immedok", (PyCFunction)PyCursesWindow_immedok, METH_VARARGS},
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +02001594#endif
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001595 {"inch", (PyCFunction)PyCursesWindow_InCh, METH_VARARGS},
1596 {"insch", (PyCFunction)PyCursesWindow_InsCh, METH_VARARGS},
1597 {"insdelln", (PyCFunction)PyCursesWindow_winsdelln, METH_VARARGS},
1598 {"insertln", (PyCFunction)PyCursesWindow_winsertln, METH_NOARGS},
1599 {"insnstr", (PyCFunction)PyCursesWindow_InsNStr, METH_VARARGS},
1600 {"insstr", (PyCFunction)PyCursesWindow_InsStr, METH_VARARGS},
1601 {"instr", (PyCFunction)PyCursesWindow_InStr, METH_VARARGS},
1602 {"is_linetouched", (PyCFunction)PyCursesWindow_Is_LineTouched, METH_VARARGS},
1603 {"is_wintouched", (PyCFunction)PyCursesWindow_is_wintouched, METH_NOARGS},
1604 {"keypad", (PyCFunction)PyCursesWindow_keypad, METH_VARARGS},
1605 {"leaveok", (PyCFunction)PyCursesWindow_leaveok, METH_VARARGS},
1606 {"move", (PyCFunction)PyCursesWindow_wmove, METH_VARARGS},
1607 {"mvderwin", (PyCFunction)PyCursesWindow_mvderwin, METH_VARARGS},
1608 {"mvwin", (PyCFunction)PyCursesWindow_mvwin, METH_VARARGS},
1609 {"nodelay", (PyCFunction)PyCursesWindow_nodelay, METH_VARARGS},
1610 {"notimeout", (PyCFunction)PyCursesWindow_notimeout, METH_VARARGS},
1611 {"noutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh, METH_VARARGS},
1612 /* Backward compatibility alias -- remove in Python 2.3 */
1613 {"nooutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh, METH_VARARGS},
1614 {"overlay", (PyCFunction)PyCursesWindow_Overlay, METH_VARARGS},
1615 {"overwrite", (PyCFunction)PyCursesWindow_Overwrite,
1616 METH_VARARGS},
1617 {"putwin", (PyCFunction)PyCursesWindow_PutWin, METH_VARARGS},
1618 {"redrawln", (PyCFunction)PyCursesWindow_RedrawLine, METH_VARARGS},
1619 {"redrawwin", (PyCFunction)PyCursesWindow_redrawwin, METH_NOARGS},
1620 {"refresh", (PyCFunction)PyCursesWindow_Refresh, METH_VARARGS},
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00001621#ifndef STRICT_SYSV_CURSES
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001622 {"resize", (PyCFunction)PyCursesWindow_wresize, METH_VARARGS},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001623#endif
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001624 {"scroll", (PyCFunction)PyCursesWindow_Scroll, METH_VARARGS},
1625 {"scrollok", (PyCFunction)PyCursesWindow_scrollok, METH_VARARGS},
1626 {"setscrreg", (PyCFunction)PyCursesWindow_SetScrollRegion, METH_VARARGS},
1627 {"standend", (PyCFunction)PyCursesWindow_wstandend, METH_NOARGS},
1628 {"standout", (PyCFunction)PyCursesWindow_wstandout, METH_NOARGS},
1629 {"subpad", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
1630 {"subwin", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
1631 {"syncdown", (PyCFunction)PyCursesWindow_wsyncdown, METH_NOARGS},
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +02001632#ifdef HAVE_CURSES_SYNCOK
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001633 {"syncok", (PyCFunction)PyCursesWindow_syncok, METH_VARARGS},
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +02001634#endif
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001635 {"syncup", (PyCFunction)PyCursesWindow_wsyncup, METH_NOARGS},
1636 {"timeout", (PyCFunction)PyCursesWindow_wtimeout, METH_VARARGS},
1637 {"touchline", (PyCFunction)PyCursesWindow_TouchLine, METH_VARARGS},
1638 {"touchwin", (PyCFunction)PyCursesWindow_touchwin, METH_NOARGS},
1639 {"untouchwin", (PyCFunction)PyCursesWindow_untouchwin, METH_NOARGS},
1640 {"vline", (PyCFunction)PyCursesWindow_Vline, METH_VARARGS},
1641 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00001642};
1643
1644static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001645PyCursesWindow_GetAttr(PyCursesWindowObject *self, char *name)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001646{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001647 return Py_FindMethod(PyCursesWindow_Methods, (PyObject *)self, name);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001648}
1649
Guido van Rossumf6971e21994-08-30 12:25:20 +00001650/* -------------------------------------------------------*/
Guido van Rossum85738471995-02-17 13:50:17 +00001651
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001652PyTypeObject PyCursesWindow_Type = {
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001653 PyVarObject_HEAD_INIT(NULL, 0)
1654 "_curses.curses window", /*tp_name*/
1655 sizeof(PyCursesWindowObject), /*tp_basicsize*/
1656 0, /*tp_itemsize*/
1657 /* methods */
1658 (destructor)PyCursesWindow_Dealloc, /*tp_dealloc*/
1659 0, /*tp_print*/
1660 (getattrfunc)PyCursesWindow_GetAttr, /*tp_getattr*/
1661 (setattrfunc)0, /*tp_setattr*/
1662 0, /*tp_compare*/
1663 0, /*tp_repr*/
1664 0, /*tp_as_number*/
1665 0, /*tp_as_sequence*/
1666 0, /*tp_as_mapping*/
1667 0, /*tp_hash*/
Guido van Rossumf6971e21994-08-30 12:25:20 +00001668};
1669
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001670/*********************************************************************
1671 Global Functions
1672**********************************************************************/
Guido van Rossumf6971e21994-08-30 12:25:20 +00001673
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001674NoArgNoReturnFunction(beep)
1675NoArgNoReturnFunction(def_prog_mode)
1676NoArgNoReturnFunction(def_shell_mode)
1677NoArgNoReturnFunction(doupdate)
1678NoArgNoReturnFunction(endwin)
1679NoArgNoReturnFunction(flash)
1680NoArgNoReturnFunction(nocbreak)
1681NoArgNoReturnFunction(noecho)
1682NoArgNoReturnFunction(nonl)
1683NoArgNoReturnFunction(noraw)
1684NoArgNoReturnFunction(reset_prog_mode)
1685NoArgNoReturnFunction(reset_shell_mode)
1686NoArgNoReturnFunction(resetty)
1687NoArgNoReturnFunction(savetty)
1688
1689NoArgOrFlagNoReturnFunction(cbreak)
1690NoArgOrFlagNoReturnFunction(echo)
1691NoArgOrFlagNoReturnFunction(nl)
1692NoArgOrFlagNoReturnFunction(raw)
1693
1694NoArgReturnIntFunction(baudrate)
1695NoArgReturnIntFunction(termattrs)
1696
1697NoArgReturnStringFunction(termname)
1698NoArgReturnStringFunction(longname)
1699
1700NoArgTrueFalseFunction(can_change_color)
1701NoArgTrueFalseFunction(has_colors)
1702NoArgTrueFalseFunction(has_ic)
1703NoArgTrueFalseFunction(has_il)
1704NoArgTrueFalseFunction(isendwin)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001705NoArgNoReturnVoidFunction(flushinp)
1706NoArgNoReturnVoidFunction(noqiflush)
1707
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +02001708#ifdef HAVE_CURSES_FILTER
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001709static PyObject *
Georg Brandl29604a12008-01-26 14:03:47 +00001710PyCurses_filter(PyObject *self)
1711{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001712 /* not checking for PyCursesInitialised here since filter() must
1713 be called before initscr() */
1714 filter();
1715 Py_INCREF(Py_None);
1716 return Py_None;
Georg Brandl29604a12008-01-26 14:03:47 +00001717}
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +02001718#endif
Georg Brandl29604a12008-01-26 14:03:47 +00001719
1720static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001721PyCurses_Color_Content(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001722{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001723 short color,r,g,b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001724
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001725 PyCursesInitialised;
1726 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001727
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001728 if (!PyArg_ParseTuple(args, "h:color_content", &color)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001729
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001730 if (color_content(color, &r, &g, &b) != ERR)
1731 return Py_BuildValue("(iii)", r, g, b);
1732 else {
1733 PyErr_SetString(PyCursesError,
1734 "Argument 1 was out of range. Check value of COLORS.");
1735 return NULL;
1736 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001737}
1738
1739static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001740PyCurses_color_pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001741{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001742 int n;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001743
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001744 PyCursesInitialised;
1745 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001746
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001747 if (!PyArg_ParseTuple(args, "i:color_pair", &n)) return NULL;
1748 return PyInt_FromLong((long) (n << 8));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001749}
1750
1751static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001752PyCurses_Curs_Set(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001753{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001754 int vis,erg;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001755
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001756 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001757
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001758 if (!PyArg_ParseTuple(args, "i:curs_set", &vis)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001759
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001760 erg = curs_set(vis);
1761 if (erg == ERR) return PyCursesCheckERR(erg, "curs_set");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001762
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001763 return PyInt_FromLong((long) erg);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001764}
1765
1766static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001767PyCurses_Delay_Output(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001768{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001769 int ms;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001770
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001771 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001772
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001773 if (!PyArg_ParseTuple(args, "i:delay_output", &ms)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001774
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001775 return PyCursesCheckERR(delay_output(ms), "delay_output");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001776}
1777
1778static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001779PyCurses_EraseChar(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001780{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001781 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001782
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001783 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001784
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001785 ch = erasechar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001786
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001787 return PyString_FromStringAndSize(&ch, 1);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001788}
1789
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +02001790#ifdef getsyx
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001791static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001792PyCurses_getsyx(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001793{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001794 int x = 0;
1795 int y = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001796
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001797 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001798
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001799 getsyx(y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001800
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001801 return Py_BuildValue("(ii)", y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001802}
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +02001803#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001804
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001805#ifdef NCURSES_MOUSE_VERSION
1806static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001807PyCurses_GetMouse(PyObject *self)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001808{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001809 int rtn;
1810 MEVENT event;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001811
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001812 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001813
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001814 rtn = getmouse( &event );
1815 if (rtn == ERR) {
1816 PyErr_SetString(PyCursesError, "getmouse() returned ERR");
1817 return NULL;
1818 }
1819 return Py_BuildValue("(hiiil)",
1820 (short)event.id,
1821 event.x, event.y, event.z,
1822 (long) event.bstate);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001823}
1824
1825static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001826PyCurses_UngetMouse(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001827{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001828 MEVENT event;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001829
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001830 PyCursesInitialised;
1831 if (!PyArg_ParseTuple(args, "hiiil",
1832 &event.id,
1833 &event.x, &event.y, &event.z,
1834 (int *) &event.bstate))
1835 return NULL;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001836
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001837 return PyCursesCheckERR(ungetmouse(&event), "ungetmouse");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001838}
1839#endif
1840
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001841static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001842PyCurses_GetWin(PyCursesWindowObject *self, PyObject *temp)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001843{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001844 WINDOW *win;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001845
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001846 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001847
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001848 if (!PyFile_Check(temp)) {
1849 PyErr_SetString(PyExc_TypeError, "argument must be a file object");
1850 return NULL;
1851 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001852
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001853 win = getwin(PyFile_AsFile(temp));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001854
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001855 if (win == NULL) {
1856 PyErr_SetString(PyCursesError, catchall_NULL);
1857 return NULL;
1858 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001859
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001860 return PyCursesWindow_New(win);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001861}
1862
1863static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001864PyCurses_HalfDelay(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001865{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001866 unsigned char tenths;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001867
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001868 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001869
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001870 if (!PyArg_ParseTuple(args, "b:halfdelay", &tenths)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001871
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001872 return PyCursesCheckERR(halfdelay(tenths), "halfdelay");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001873}
1874
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +02001875#ifdef HAVE_CURSES_HAS_KEY
1876static PyObject *
1877PyCurses_has_key(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001878{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001879 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001880
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001881 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001882
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001883 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001884
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001885 if (has_key(ch) == FALSE) {
1886 Py_INCREF(Py_False);
1887 return Py_False;
1888 }
1889 Py_INCREF(Py_True);
1890 return Py_True;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001891}
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +02001892#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001893
1894static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001895PyCurses_Init_Color(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001896{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001897 short color, r, g, b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001898
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001899 PyCursesInitialised;
1900 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001901
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001902 switch(PyTuple_Size(args)) {
1903 case 4:
1904 if (!PyArg_ParseTuple(args, "hhhh;color,r,g,b", &color, &r, &g, &b)) return NULL;
1905 break;
1906 default:
1907 PyErr_SetString(PyExc_TypeError, "init_color requires 4 arguments");
1908 return NULL;
1909 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001910
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001911 return PyCursesCheckERR(init_color(color, r, g, b), "init_color");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001912}
1913
1914static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001915PyCurses_Init_Pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001916{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001917 short pair, f, b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001918
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001919 PyCursesInitialised;
1920 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001921
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001922 if (PyTuple_Size(args) != 3) {
1923 PyErr_SetString(PyExc_TypeError, "init_pair requires 3 arguments");
1924 return NULL;
1925 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001926
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001927 if (!PyArg_ParseTuple(args, "hhh;pair, f, b", &pair, &f, &b)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001928
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001929 return PyCursesCheckERR(init_pair(pair, f, b), "init_pair");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001930}
1931
Andrew M. Kuchling32552682000-12-22 21:52:27 +00001932static PyObject *ModDict;
1933
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001934static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001935PyCurses_InitScr(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001936{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001937 WINDOW *win;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001938
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001939 if (initialised == TRUE) {
1940 wrefresh(stdscr);
1941 return (PyObject *)PyCursesWindow_New(stdscr);
1942 }
Guido van Rossum56bf2351994-08-31 22:06:24 +00001943
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001944 win = initscr();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001945
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001946 if (win == NULL) {
1947 PyErr_SetString(PyCursesError, catchall_NULL);
1948 return NULL;
1949 }
Guido van Rossum85738471995-02-17 13:50:17 +00001950
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001951 initialised = initialised_setupterm = TRUE;
Guido van Rossum56bf2351994-08-31 22:06:24 +00001952
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001953/* This was moved from initcurses() because it core dumped on SGI,
1954 where they're not defined until you've called initscr() */
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001955#define SetDictInt(string,ch) \
1956 do { \
1957 PyObject *o = PyInt_FromLong((long) (ch)); \
1958 if (o && PyDict_SetItemString(ModDict, string, o) == 0) { \
1959 Py_DECREF(o); \
1960 } \
Neal Norwitz20745b12006-08-13 18:12:45 +00001961 } while (0)
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001962
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001963 /* Here are some graphic symbols you can use */
1964 SetDictInt("ACS_ULCORNER", (ACS_ULCORNER));
1965 SetDictInt("ACS_LLCORNER", (ACS_LLCORNER));
1966 SetDictInt("ACS_URCORNER", (ACS_URCORNER));
1967 SetDictInt("ACS_LRCORNER", (ACS_LRCORNER));
1968 SetDictInt("ACS_LTEE", (ACS_LTEE));
1969 SetDictInt("ACS_RTEE", (ACS_RTEE));
1970 SetDictInt("ACS_BTEE", (ACS_BTEE));
1971 SetDictInt("ACS_TTEE", (ACS_TTEE));
1972 SetDictInt("ACS_HLINE", (ACS_HLINE));
1973 SetDictInt("ACS_VLINE", (ACS_VLINE));
1974 SetDictInt("ACS_PLUS", (ACS_PLUS));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001975#if !defined(__hpux) || defined(HAVE_NCURSES_H)
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001976 /* On HP/UX 11, these are of type cchar_t, which is not an
1977 integral type. If this is a problem on more platforms, a
1978 configure test should be added to determine whether ACS_S1
1979 is of integral type. */
1980 SetDictInt("ACS_S1", (ACS_S1));
1981 SetDictInt("ACS_S9", (ACS_S9));
1982 SetDictInt("ACS_DIAMOND", (ACS_DIAMOND));
1983 SetDictInt("ACS_CKBOARD", (ACS_CKBOARD));
1984 SetDictInt("ACS_DEGREE", (ACS_DEGREE));
1985 SetDictInt("ACS_PLMINUS", (ACS_PLMINUS));
1986 SetDictInt("ACS_BULLET", (ACS_BULLET));
1987 SetDictInt("ACS_LARROW", (ACS_LARROW));
1988 SetDictInt("ACS_RARROW", (ACS_RARROW));
1989 SetDictInt("ACS_DARROW", (ACS_DARROW));
1990 SetDictInt("ACS_UARROW", (ACS_UARROW));
1991 SetDictInt("ACS_BOARD", (ACS_BOARD));
1992 SetDictInt("ACS_LANTERN", (ACS_LANTERN));
1993 SetDictInt("ACS_BLOCK", (ACS_BLOCK));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001994#endif
Victor Stinnerfd2103e2010-05-15 22:19:27 +00001995 SetDictInt("ACS_BSSB", (ACS_ULCORNER));
1996 SetDictInt("ACS_SSBB", (ACS_LLCORNER));
1997 SetDictInt("ACS_BBSS", (ACS_URCORNER));
1998 SetDictInt("ACS_SBBS", (ACS_LRCORNER));
1999 SetDictInt("ACS_SBSS", (ACS_RTEE));
2000 SetDictInt("ACS_SSSB", (ACS_LTEE));
2001 SetDictInt("ACS_SSBS", (ACS_BTEE));
2002 SetDictInt("ACS_BSSS", (ACS_TTEE));
2003 SetDictInt("ACS_BSBS", (ACS_HLINE));
2004 SetDictInt("ACS_SBSB", (ACS_VLINE));
2005 SetDictInt("ACS_SSSS", (ACS_PLUS));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002006
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002007 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002008#ifdef ACS_S3
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002009 SetDictInt("ACS_S3", (ACS_S3));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002010#endif
2011#ifdef ACS_S7
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002012 SetDictInt("ACS_S7", (ACS_S7));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002013#endif
2014#ifdef ACS_LEQUAL
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002015 SetDictInt("ACS_LEQUAL", (ACS_LEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002016#endif
2017#ifdef ACS_GEQUAL
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002018 SetDictInt("ACS_GEQUAL", (ACS_GEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002019#endif
2020#ifdef ACS_PI
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002021 SetDictInt("ACS_PI", (ACS_PI));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002022#endif
2023#ifdef ACS_NEQUAL
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002024 SetDictInt("ACS_NEQUAL", (ACS_NEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002025#endif
2026#ifdef ACS_STERLING
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002027 SetDictInt("ACS_STERLING", (ACS_STERLING));
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002028#endif
2029
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002030 SetDictInt("LINES", LINES);
2031 SetDictInt("COLS", COLS);
Guido van Rossum56bf2351994-08-31 22:06:24 +00002032
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002033 return (PyObject *)PyCursesWindow_New(win);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002034}
2035
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002036static PyObject *
2037PyCurses_setupterm(PyObject* self, PyObject *args, PyObject* keywds)
2038{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002039 int fd = -1;
2040 int err;
2041 char* termstr = NULL;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002042
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002043 static char *kwlist[] = {"term", "fd", NULL};
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002044
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002045 if (!PyArg_ParseTupleAndKeywords(
2046 args, keywds, "|zi:setupterm", kwlist, &termstr, &fd)) {
2047 return NULL;
2048 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002049
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002050 if (fd == -1) {
2051 PyObject* sys_stdout;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002052
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002053 sys_stdout = PySys_GetObject("stdout");
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002054
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002055 if (sys_stdout == NULL) {
2056 PyErr_SetString(
2057 PyCursesError,
2058 "lost sys.stdout");
2059 return NULL;
2060 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002061
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002062 fd = PyObject_AsFileDescriptor(sys_stdout);
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002063
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002064 if (fd == -1) {
2065 return NULL;
2066 }
2067 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002068
Matthias Klose6e86bf72010-07-30 21:27:18 +00002069 if (!initialised_setupterm && setupterm(termstr,fd,&err) == ERR) {
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002070 char* s = "setupterm: unknown error";
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002071
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002072 if (err == 0) {
2073 s = "setupterm: could not find terminal";
2074 } else if (err == -1) {
2075 s = "setupterm: could not find terminfo database";
2076 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002077
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002078 PyErr_SetString(PyCursesError,s);
2079 return NULL;
2080 }
2081
2082 initialised_setupterm = TRUE;
2083
2084 Py_INCREF(Py_None);
2085 return Py_None;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002086}
Guido van Rossumf6971e21994-08-30 12:25:20 +00002087
2088static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002089PyCurses_IntrFlush(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002090{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002091 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002092
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002093 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002094
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002095 switch(PyTuple_Size(args)) {
2096 case 1:
2097 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
2098 break;
2099 default:
2100 PyErr_SetString(PyExc_TypeError, "intrflush requires 1 argument");
2101 return NULL;
2102 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002103
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002104 return PyCursesCheckERR(intrflush(NULL,ch), "intrflush");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002105}
2106
Walter Dörwald4994d952006-06-19 08:07:50 +00002107#ifdef HAVE_CURSES_IS_TERM_RESIZED
2108static PyObject *
2109PyCurses_Is_Term_Resized(PyObject *self, PyObject *args)
2110{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002111 int lines;
2112 int columns;
2113 int result;
Walter Dörwald4994d952006-06-19 08:07:50 +00002114
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002115 PyCursesInitialised;
Walter Dörwald4994d952006-06-19 08:07:50 +00002116
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002117 if (!PyArg_ParseTuple(args,"ii:is_term_resized", &lines, &columns))
2118 return NULL;
2119 result = is_term_resized(lines, columns);
2120 if (result == TRUE) {
2121 Py_INCREF(Py_True);
2122 return Py_True;
2123 } else {
2124 Py_INCREF(Py_False);
2125 return Py_False;
2126 }
Walter Dörwald4994d952006-06-19 08:07:50 +00002127}
2128#endif /* HAVE_CURSES_IS_TERM_RESIZED */
2129
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002130static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002131PyCurses_KeyName(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002132{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002133 const char *knp;
2134 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002135
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002136 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002137
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002138 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002139
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002140 if (ch < 0) {
2141 PyErr_SetString(PyExc_ValueError, "invalid key number");
2142 return NULL;
2143 }
2144 knp = keyname(ch);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002145
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002146 return PyString_FromString((knp == NULL) ? "" : (char *)knp);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002147}
2148
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002149static PyObject *
2150PyCurses_KillChar(PyObject *self)
2151{
2152 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002153
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002154 ch = killchar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002155
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002156 return PyString_FromStringAndSize(&ch, 1);
2157}
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002158
2159static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002160PyCurses_Meta(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002161{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002162 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002163
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002164 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002165
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002166 switch(PyTuple_Size(args)) {
2167 case 1:
2168 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
2169 break;
2170 default:
2171 PyErr_SetString(PyExc_TypeError, "meta requires 1 argument");
2172 return NULL;
2173 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002174
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002175 return PyCursesCheckERR(meta(stdscr, ch), "meta");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002176}
2177
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002178#ifdef NCURSES_MOUSE_VERSION
2179static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002180PyCurses_MouseInterval(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002181{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002182 int interval;
2183 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002184
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002185 if (!PyArg_ParseTuple(args,"i;interval",&interval))
2186 return NULL;
2187 return PyCursesCheckERR(mouseinterval(interval), "mouseinterval");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002188}
2189
2190static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002191PyCurses_MouseMask(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002192{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002193 int newmask;
2194 mmask_t oldmask, availmask;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002195
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002196 PyCursesInitialised;
2197 if (!PyArg_ParseTuple(args,"i;mousemask",&newmask))
2198 return NULL;
2199 availmask = mousemask(newmask, &oldmask);
2200 return Py_BuildValue("(ll)", (long)availmask, (long)oldmask);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002201}
2202#endif
2203
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002204static PyObject *
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002205PyCurses_Napms(PyObject *self, PyObject *args)
2206{
2207 int ms;
2208
Andrew M. Kuchling035fbba2010-05-10 23:27:01 +00002209 PyCursesInitialised;
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002210 if (!PyArg_ParseTuple(args, "i;ms", &ms)) return NULL;
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002211
2212 return Py_BuildValue("i", napms(ms));
2213}
2214
2215
2216static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002217PyCurses_NewPad(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002218{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002219 WINDOW *win;
2220 int nlines, ncols;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002221
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002222 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002223
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002224 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002225
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002226 win = newpad(nlines, ncols);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002227
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002228 if (win == NULL) {
2229 PyErr_SetString(PyCursesError, catchall_NULL);
2230 return NULL;
2231 }
2232
2233 return (PyObject *)PyCursesWindow_New(win);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002234}
2235
2236static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002237PyCurses_NewWindow(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002238{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002239 WINDOW *win;
2240 int nlines, ncols, begin_y=0, begin_x=0;
Guido van Rossum85738471995-02-17 13:50:17 +00002241
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002242 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002243
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002244 switch (PyTuple_Size(args)) {
2245 case 2:
2246 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols))
2247 return NULL;
2248 break;
2249 case 4:
2250 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
2251 &nlines,&ncols,&begin_y,&begin_x))
2252 return NULL;
2253 break;
2254 default:
2255 PyErr_SetString(PyExc_TypeError, "newwin requires 2 or 4 arguments");
2256 return NULL;
2257 }
Guido van Rossum85738471995-02-17 13:50:17 +00002258
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002259 win = newwin(nlines,ncols,begin_y,begin_x);
2260 if (win == NULL) {
2261 PyErr_SetString(PyCursesError, catchall_NULL);
2262 return NULL;
2263 }
Guido van Rossum85738471995-02-17 13:50:17 +00002264
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002265 return (PyObject *)PyCursesWindow_New(win);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002266}
2267
2268static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002269PyCurses_Pair_Content(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002270{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002271 short pair,f,b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002272
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002273 PyCursesInitialised;
2274 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002275
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002276 switch(PyTuple_Size(args)) {
2277 case 1:
2278 if (!PyArg_ParseTuple(args, "h;pair", &pair)) return NULL;
2279 break;
2280 default:
2281 PyErr_SetString(PyExc_TypeError, "pair_content requires 1 argument");
2282 return NULL;
2283 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002284
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002285 if (pair_content(pair, &f, &b)==ERR) {
2286 PyErr_SetString(PyCursesError,
2287 "Argument 1 was out of range. (1..COLOR_PAIRS-1)");
2288 return NULL;
2289 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002290
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002291 return Py_BuildValue("(ii)", f, b);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002292}
2293
2294static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002295PyCurses_pair_number(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002296{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002297 int n;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002298
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002299 PyCursesInitialised;
2300 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002301
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002302 switch(PyTuple_Size(args)) {
2303 case 1:
2304 if (!PyArg_ParseTuple(args, "i;pairvalue", &n)) return NULL;
2305 break;
2306 default:
2307 PyErr_SetString(PyExc_TypeError,
2308 "pair_number requires 1 argument");
2309 return NULL;
2310 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002311
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002312 return PyInt_FromLong((long) ((n & A_COLOR) >> 8));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002313}
2314
2315static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002316PyCurses_Putp(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002317{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002318 char *str;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002319
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002320 if (!PyArg_ParseTuple(args,"s;str", &str)) return NULL;
2321 return PyCursesCheckERR(putp(str), "putp");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002322}
2323
2324static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002325PyCurses_QiFlush(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002326{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002327 int flag = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002328
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002329 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002330
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002331 switch(PyTuple_Size(args)) {
2332 case 0:
2333 qiflush();
2334 Py_INCREF(Py_None);
2335 return Py_None;
2336 case 1:
2337 if (!PyArg_ParseTuple(args, "i;True(1) or False(0)", &flag)) return NULL;
2338 if (flag) qiflush();
2339 else noqiflush();
2340 Py_INCREF(Py_None);
2341 return Py_None;
2342 default:
2343 PyErr_SetString(PyExc_TypeError, "qiflush requires 0 or 1 arguments");
2344 return NULL;
2345 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002346}
2347
Walter Dörwaldd391f082007-03-06 20:38:57 +00002348/* Internal helper used for updating curses.LINES, curses.COLS, _curses.LINES
2349 * and _curses.COLS */
Andrew M. Kuchling3d8f8c12008-06-19 14:02:30 +00002350#if defined(HAVE_CURSES_RESIZETERM) || defined(HAVE_CURSES_RESIZE_TERM)
Walter Dörwaldd391f082007-03-06 20:38:57 +00002351static int
2352update_lines_cols(void)
2353{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002354 PyObject *o;
2355 PyObject *m = PyImport_ImportModuleNoBlock("curses");
Walter Dörwaldd391f082007-03-06 20:38:57 +00002356
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002357 if (!m)
2358 return 0;
Walter Dörwaldd391f082007-03-06 20:38:57 +00002359
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002360 o = PyInt_FromLong(LINES);
2361 if (!o) {
2362 Py_DECREF(m);
2363 return 0;
2364 }
2365 if (PyObject_SetAttrString(m, "LINES", o)) {
2366 Py_DECREF(m);
2367 Py_DECREF(o);
2368 return 0;
2369 }
2370 if (PyDict_SetItemString(ModDict, "LINES", o)) {
2371 Py_DECREF(m);
2372 Py_DECREF(o);
2373 return 0;
2374 }
Walter Dörwaldd391f082007-03-06 20:38:57 +00002375 Py_DECREF(o);
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002376 o = PyInt_FromLong(COLS);
2377 if (!o) {
2378 Py_DECREF(m);
2379 return 0;
2380 }
2381 if (PyObject_SetAttrString(m, "COLS", o)) {
2382 Py_DECREF(m);
2383 Py_DECREF(o);
2384 return 0;
2385 }
2386 if (PyDict_SetItemString(ModDict, "COLS", o)) {
2387 Py_DECREF(m);
2388 Py_DECREF(o);
2389 return 0;
2390 }
Walter Dörwaldd391f082007-03-06 20:38:57 +00002391 Py_DECREF(o);
Walter Dörwaldd391f082007-03-06 20:38:57 +00002392 Py_DECREF(m);
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002393 return 1;
Walter Dörwaldd391f082007-03-06 20:38:57 +00002394}
Andrew M. Kuchling3d8f8c12008-06-19 14:02:30 +00002395#endif
Walter Dörwaldd391f082007-03-06 20:38:57 +00002396
Walter Dörwald4994d952006-06-19 08:07:50 +00002397#ifdef HAVE_CURSES_RESIZETERM
2398static PyObject *
2399PyCurses_ResizeTerm(PyObject *self, PyObject *args)
2400{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002401 int lines;
2402 int columns;
2403 PyObject *result;
Walter Dörwald4994d952006-06-19 08:07:50 +00002404
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002405 PyCursesInitialised;
Walter Dörwald4994d952006-06-19 08:07:50 +00002406
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002407 if (!PyArg_ParseTuple(args,"ii:resizeterm", &lines, &columns))
2408 return NULL;
Walter Dörwald4994d952006-06-19 08:07:50 +00002409
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002410 result = PyCursesCheckERR(resizeterm(lines, columns), "resizeterm");
2411 if (!result)
2412 return NULL;
2413 if (!update_lines_cols())
2414 return NULL;
2415 return result;
Walter Dörwald4994d952006-06-19 08:07:50 +00002416}
2417
2418#endif
2419
2420#ifdef HAVE_CURSES_RESIZE_TERM
2421static PyObject *
2422PyCurses_Resize_Term(PyObject *self, PyObject *args)
2423{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002424 int lines;
2425 int columns;
Walter Dörwald4994d952006-06-19 08:07:50 +00002426
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002427 PyObject *result;
Walter Dörwaldd391f082007-03-06 20:38:57 +00002428
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002429 PyCursesInitialised;
Walter Dörwald4994d952006-06-19 08:07:50 +00002430
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002431 if (!PyArg_ParseTuple(args,"ii:resize_term", &lines, &columns))
2432 return NULL;
Walter Dörwald4994d952006-06-19 08:07:50 +00002433
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002434 result = PyCursesCheckERR(resize_term(lines, columns), "resize_term");
2435 if (!result)
2436 return NULL;
2437 if (!update_lines_cols())
2438 return NULL;
2439 return result;
Walter Dörwald4994d952006-06-19 08:07:50 +00002440}
2441#endif /* HAVE_CURSES_RESIZE_TERM */
2442
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +02002443#ifdef getsyx
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002444static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002445PyCurses_setsyx(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002446{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002447 int y,x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002448
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002449 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002450
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002451 if (PyTuple_Size(args)!=2) {
2452 PyErr_SetString(PyExc_TypeError, "setsyx requires 2 arguments");
2453 return NULL;
2454 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002455
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002456 if (!PyArg_ParseTuple(args, "ii;y, x", &y, &x)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002457
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002458 setsyx(y,x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002459
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002460 Py_INCREF(Py_None);
2461 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002462}
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +02002463#endif
Guido van Rossumf6971e21994-08-30 12:25:20 +00002464
2465static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002466PyCurses_Start_Color(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002467{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002468 int code;
2469 PyObject *c, *cp;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002470
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002471 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002472
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002473 code = start_color();
2474 if (code != ERR) {
2475 initialisedcolors = TRUE;
2476 c = PyInt_FromLong((long) COLORS);
2477 PyDict_SetItemString(ModDict, "COLORS", c);
2478 Py_DECREF(c);
2479 cp = PyInt_FromLong((long) COLOR_PAIRS);
2480 PyDict_SetItemString(ModDict, "COLOR_PAIRS", cp);
2481 Py_DECREF(cp);
2482 Py_INCREF(Py_None);
2483 return Py_None;
2484 } else {
2485 PyErr_SetString(PyCursesError, "start_color() returned ERR");
2486 return NULL;
2487 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002488}
2489
2490static PyObject *
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002491PyCurses_tigetflag(PyObject *self, PyObject *args)
2492{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002493 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002494
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002495 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002496
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002497 if (!PyArg_ParseTuple(args, "s", &capname))
2498 return NULL;
2499
2500 return PyInt_FromLong( (long) tigetflag( capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002501}
2502
2503static PyObject *
2504PyCurses_tigetnum(PyObject *self, PyObject *args)
2505{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002506 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002507
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002508 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002509
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002510 if (!PyArg_ParseTuple(args, "s", &capname))
2511 return NULL;
2512
2513 return PyInt_FromLong( (long) tigetnum( capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002514}
2515
2516static PyObject *
2517PyCurses_tigetstr(PyObject *self, PyObject *args)
2518{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002519 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002520
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002521 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002522
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002523 if (!PyArg_ParseTuple(args, "s", &capname))
2524 return NULL;
2525
2526 capname = tigetstr( capname );
2527 if (capname == 0 || capname == (char*) -1) {
2528 Py_INCREF(Py_None);
2529 return Py_None;
2530 }
2531 return PyString_FromString( capname );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002532}
2533
2534static PyObject *
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00002535PyCurses_tparm(PyObject *self, PyObject *args)
2536{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002537 char* fmt;
2538 char* result = NULL;
2539 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 +00002540
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002541 PyCursesSetupTermCalled;
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00002542
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002543 if (!PyArg_ParseTuple(args, "s|iiiiiiiii:tparm",
2544 &fmt, &i1, &i2, &i3, &i4,
2545 &i5, &i6, &i7, &i8, &i9)) {
2546 return NULL;
2547 }
Michael W. Hudson21007982002-11-21 14:17:51 +00002548
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002549 result = tparm(fmt,i1,i2,i3,i4,i5,i6,i7,i8,i9);
2550 if (!result) {
2551 PyErr_SetString(PyCursesError, "tparm() returned NULL");
2552 return NULL;
2553 }
Michael W. Hudson21007982002-11-21 14:17:51 +00002554
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002555 return PyString_FromString(result);
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00002556}
2557
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +02002558#ifdef HAVE_CURSES_TYPEAHEAD
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00002559static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002560PyCurses_TypeAhead(PyObject *self, PyObject *args)
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00002561{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002562 int fd;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00002563
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002564 PyCursesInitialised;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00002565
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002566 if (!PyArg_ParseTuple(args,"i;fd",&fd)) return NULL;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00002567
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002568 return PyCursesCheckERR(typeahead( fd ), "typeahead");
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00002569}
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +02002570#endif
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00002571
2572static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002573PyCurses_UnCtrl(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002574{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002575 PyObject *temp;
2576 chtype ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002577
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002578 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002579
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002580 if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002581
Serhiy Storchaka994f04d2016-12-27 15:09:36 +02002582 if (PyInt_Check(temp) || PyLong_Check(temp)) {
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002583 ch = (chtype) PyInt_AsLong(temp);
Serhiy Storchaka994f04d2016-12-27 15:09:36 +02002584 if (ch == (chtype) -1 && PyErr_Occurred())
2585 return NULL;
2586 }
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002587 else if (PyString_Check(temp))
2588 ch = (chtype) *PyString_AsString(temp);
2589 else {
2590 PyErr_SetString(PyExc_TypeError, "argument must be a ch or an int");
2591 return NULL;
2592 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002593
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002594 return PyString_FromString(unctrl(ch));
Guido van Rossumf6971e21994-08-30 12:25:20 +00002595}
2596
2597static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002598PyCurses_UngetCh(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002599{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002600 PyObject *temp;
2601 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002602
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002603 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002604
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002605 if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002606
Serhiy Storchaka994f04d2016-12-27 15:09:36 +02002607 if (PyInt_Check(temp) || PyLong_Check(temp)) {
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002608 ch = (int) PyInt_AsLong(temp);
Serhiy Storchaka994f04d2016-12-27 15:09:36 +02002609 if (ch == -1 && PyErr_Occurred())
2610 return NULL;
2611 }
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002612 else if (PyString_Check(temp))
2613 ch = (int) *PyString_AsString(temp);
2614 else {
2615 PyErr_SetString(PyExc_TypeError, "argument must be a ch or an int");
2616 return NULL;
2617 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002618
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002619 return PyCursesCheckERR(ungetch(ch), "ungetch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00002620}
2621
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +02002622#ifdef HAVE_CURSES_TYPEAHEAD
Guido van Rossumf6971e21994-08-30 12:25:20 +00002623static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002624PyCurses_Use_Env(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002625{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002626 int flag;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002627
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002628 switch(PyTuple_Size(args)) {
2629 case 1:
2630 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&flag))
2631 return NULL;
2632 break;
2633 default:
2634 PyErr_SetString(PyExc_TypeError, "use_env requires 1 argument");
2635 return NULL;
2636 }
2637 use_env(flag);
2638 Py_INCREF(Py_None);
2639 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002640}
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +02002641#endif
Guido van Rossumf6971e21994-08-30 12:25:20 +00002642
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00002643#ifndef STRICT_SYSV_CURSES
2644static PyObject *
2645PyCurses_Use_Default_Colors(PyObject *self)
2646{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002647 int code;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00002648
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002649 PyCursesInitialised;
2650 PyCursesInitialisedColor;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00002651
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002652 code = use_default_colors();
2653 if (code != ERR) {
2654 Py_INCREF(Py_None);
2655 return Py_None;
2656 } else {
2657 PyErr_SetString(PyCursesError, "use_default_colors() returned ERR");
2658 return NULL;
2659 }
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00002660}
2661#endif /* STRICT_SYSV_CURSES */
2662
Guido van Rossumf6971e21994-08-30 12:25:20 +00002663/* List of functions defined in the module */
2664
2665static PyMethodDef PyCurses_methods[] = {
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002666 {"baudrate", (PyCFunction)PyCurses_baudrate, METH_NOARGS},
2667 {"beep", (PyCFunction)PyCurses_beep, METH_NOARGS},
2668 {"can_change_color", (PyCFunction)PyCurses_can_change_color, METH_NOARGS},
2669 {"cbreak", (PyCFunction)PyCurses_cbreak, METH_VARARGS},
2670 {"color_content", (PyCFunction)PyCurses_Color_Content, METH_VARARGS},
2671 {"color_pair", (PyCFunction)PyCurses_color_pair, METH_VARARGS},
2672 {"curs_set", (PyCFunction)PyCurses_Curs_Set, METH_VARARGS},
2673 {"def_prog_mode", (PyCFunction)PyCurses_def_prog_mode, METH_NOARGS},
2674 {"def_shell_mode", (PyCFunction)PyCurses_def_shell_mode, METH_NOARGS},
2675 {"delay_output", (PyCFunction)PyCurses_Delay_Output, METH_VARARGS},
2676 {"doupdate", (PyCFunction)PyCurses_doupdate, METH_NOARGS},
2677 {"echo", (PyCFunction)PyCurses_echo, METH_VARARGS},
2678 {"endwin", (PyCFunction)PyCurses_endwin, METH_NOARGS},
2679 {"erasechar", (PyCFunction)PyCurses_EraseChar, METH_NOARGS},
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +02002680#ifdef HAVE_CURSES_FILTER
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002681 {"filter", (PyCFunction)PyCurses_filter, METH_NOARGS},
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +02002682#endif
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002683 {"flash", (PyCFunction)PyCurses_flash, METH_NOARGS},
2684 {"flushinp", (PyCFunction)PyCurses_flushinp, METH_NOARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002685#ifdef NCURSES_MOUSE_VERSION
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002686 {"getmouse", (PyCFunction)PyCurses_GetMouse, METH_NOARGS},
2687 {"ungetmouse", (PyCFunction)PyCurses_UngetMouse, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002688#endif
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +02002689#ifdef getsyx
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002690 {"getsyx", (PyCFunction)PyCurses_getsyx, METH_NOARGS},
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +02002691#endif
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002692 {"getwin", (PyCFunction)PyCurses_GetWin, METH_O},
2693 {"has_colors", (PyCFunction)PyCurses_has_colors, METH_NOARGS},
2694 {"has_ic", (PyCFunction)PyCurses_has_ic, METH_NOARGS},
2695 {"has_il", (PyCFunction)PyCurses_has_il, METH_NOARGS},
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +02002696#ifdef HAVE_CURSES_HAS_KEY
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002697 {"has_key", (PyCFunction)PyCurses_has_key, METH_VARARGS},
Guido van Rossumf6971e21994-08-30 12:25:20 +00002698#endif
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002699 {"halfdelay", (PyCFunction)PyCurses_HalfDelay, METH_VARARGS},
2700 {"init_color", (PyCFunction)PyCurses_Init_Color, METH_VARARGS},
2701 {"init_pair", (PyCFunction)PyCurses_Init_Pair, METH_VARARGS},
2702 {"initscr", (PyCFunction)PyCurses_InitScr, METH_NOARGS},
2703 {"intrflush", (PyCFunction)PyCurses_IntrFlush, METH_VARARGS},
2704 {"isendwin", (PyCFunction)PyCurses_isendwin, METH_NOARGS},
Walter Dörwald4994d952006-06-19 08:07:50 +00002705#ifdef HAVE_CURSES_IS_TERM_RESIZED
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002706 {"is_term_resized", (PyCFunction)PyCurses_Is_Term_Resized, METH_VARARGS},
Walter Dörwald4994d952006-06-19 08:07:50 +00002707#endif
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002708 {"keyname", (PyCFunction)PyCurses_KeyName, METH_VARARGS},
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002709 {"killchar", (PyCFunction)PyCurses_KillChar, METH_NOARGS},
2710 {"longname", (PyCFunction)PyCurses_longname, METH_NOARGS},
2711 {"meta", (PyCFunction)PyCurses_Meta, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002712#ifdef NCURSES_MOUSE_VERSION
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002713 {"mouseinterval", (PyCFunction)PyCurses_MouseInterval, METH_VARARGS},
2714 {"mousemask", (PyCFunction)PyCurses_MouseMask, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002715#endif
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002716 {"napms", (PyCFunction)PyCurses_Napms, METH_VARARGS},
2717 {"newpad", (PyCFunction)PyCurses_NewPad, METH_VARARGS},
2718 {"newwin", (PyCFunction)PyCurses_NewWindow, METH_VARARGS},
2719 {"nl", (PyCFunction)PyCurses_nl, METH_VARARGS},
2720 {"nocbreak", (PyCFunction)PyCurses_nocbreak, METH_NOARGS},
2721 {"noecho", (PyCFunction)PyCurses_noecho, METH_NOARGS},
2722 {"nonl", (PyCFunction)PyCurses_nonl, METH_NOARGS},
2723 {"noqiflush", (PyCFunction)PyCurses_noqiflush, METH_NOARGS},
2724 {"noraw", (PyCFunction)PyCurses_noraw, METH_NOARGS},
2725 {"pair_content", (PyCFunction)PyCurses_Pair_Content, METH_VARARGS},
2726 {"pair_number", (PyCFunction)PyCurses_pair_number, METH_VARARGS},
2727 {"putp", (PyCFunction)PyCurses_Putp, METH_VARARGS},
2728 {"qiflush", (PyCFunction)PyCurses_QiFlush, METH_VARARGS},
2729 {"raw", (PyCFunction)PyCurses_raw, METH_VARARGS},
2730 {"reset_prog_mode", (PyCFunction)PyCurses_reset_prog_mode, METH_NOARGS},
2731 {"reset_shell_mode", (PyCFunction)PyCurses_reset_shell_mode, METH_NOARGS},
2732 {"resetty", (PyCFunction)PyCurses_resetty, METH_NOARGS},
Walter Dörwald4994d952006-06-19 08:07:50 +00002733#ifdef HAVE_CURSES_RESIZETERM
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002734 {"resizeterm", (PyCFunction)PyCurses_ResizeTerm, METH_VARARGS},
Walter Dörwald4994d952006-06-19 08:07:50 +00002735#endif
2736#ifdef HAVE_CURSES_RESIZE_TERM
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002737 {"resize_term", (PyCFunction)PyCurses_Resize_Term, METH_VARARGS},
Walter Dörwald4994d952006-06-19 08:07:50 +00002738#endif
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002739 {"savetty", (PyCFunction)PyCurses_savetty, METH_NOARGS},
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +02002740#ifdef getsyx
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002741 {"setsyx", (PyCFunction)PyCurses_setsyx, METH_VARARGS},
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +02002742#endif
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002743 {"setupterm", (PyCFunction)PyCurses_setupterm,
2744 METH_VARARGS|METH_KEYWORDS},
2745 {"start_color", (PyCFunction)PyCurses_Start_Color, METH_NOARGS},
2746 {"termattrs", (PyCFunction)PyCurses_termattrs, METH_NOARGS},
2747 {"termname", (PyCFunction)PyCurses_termname, METH_NOARGS},
2748 {"tigetflag", (PyCFunction)PyCurses_tigetflag, METH_VARARGS},
2749 {"tigetnum", (PyCFunction)PyCurses_tigetnum, METH_VARARGS},
2750 {"tigetstr", (PyCFunction)PyCurses_tigetstr, METH_VARARGS},
2751 {"tparm", (PyCFunction)PyCurses_tparm, METH_VARARGS},
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +02002752#ifdef HAVE_CURSES_TYPEAHEAD
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002753 {"typeahead", (PyCFunction)PyCurses_TypeAhead, METH_VARARGS},
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +02002754#endif
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002755 {"unctrl", (PyCFunction)PyCurses_UnCtrl, METH_VARARGS},
2756 {"ungetch", (PyCFunction)PyCurses_UngetCh, METH_VARARGS},
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +02002757#ifdef HAVE_CURSES_USE_ENV
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002758 {"use_env", (PyCFunction)PyCurses_Use_Env, METH_VARARGS},
Serhiy Storchakae0fc1af2017-10-31 16:12:35 +02002759#endif
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00002760#ifndef STRICT_SYSV_CURSES
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002761 {"use_default_colors", (PyCFunction)PyCurses_Use_Default_Colors, METH_NOARGS},
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00002762#endif
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002763 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002764};
2765
2766/* Initialization function for the module */
2767
Mark Hammondfe51c6d2002-08-02 02:27:13 +00002768PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002769init_curses(void)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002770{
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002771 PyObject *m, *d, *v, *c_api_object;
2772 static void *PyCurses_API[PyCurses_API_pointers];
Andrew M. Kuchling32552682000-12-22 21:52:27 +00002773
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002774 /* Initialize object type */
2775 Py_TYPE(&PyCursesWindow_Type) = &PyType_Type;
Guido van Rossum6915c4d2001-01-19 00:28:08 +00002776
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002777 /* Initialize the C API pointer array */
2778 PyCurses_API[0] = (void *)&PyCursesWindow_Type;
2779 PyCurses_API[1] = (void *)func_PyCursesSetupTermCalled;
2780 PyCurses_API[2] = (void *)func_PyCursesInitialised;
2781 PyCurses_API[3] = (void *)func_PyCursesInitialisedColor;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002782
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002783 /* Create the module and add the functions */
2784 m = Py_InitModule("_curses", PyCurses_methods);
2785 if (m == NULL)
2786 return;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002787
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002788 /* Add some symbolic constants to the module */
2789 d = PyModule_GetDict(m);
2790 if (d == NULL)
2791 return;
2792 ModDict = d; /* For PyCurses_InitScr to use later */
Andrew M. Kuchling32552682000-12-22 21:52:27 +00002793
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002794 /* Add a capsule for the C API */
2795 c_api_object = PyCapsule_New(PyCurses_API, PyCurses_CAPSULE_NAME, NULL);
2796 PyDict_SetItemString(d, "_C_API", c_api_object);
2797 Py_DECREF(c_api_object);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00002798
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002799 /* For exception curses.error */
2800 PyCursesError = PyErr_NewException("_curses.error", NULL, NULL);
2801 PyDict_SetItemString(d, "error", PyCursesError);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00002802
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002803 /* Make the version available */
2804 v = PyString_FromString(PyCursesVersion);
2805 PyDict_SetItemString(d, "version", v);
2806 PyDict_SetItemString(d, "__version__", v);
2807 Py_DECREF(v);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002808
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002809 SetDictInt("ERR", ERR);
2810 SetDictInt("OK", OK);
Andrew M. Kuchlingcaefb372000-12-26 15:57:01 +00002811
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002812 /* Here are some attributes you can add to chars to print */
2813
2814 SetDictInt("A_ATTRIBUTES", A_ATTRIBUTES);
2815 SetDictInt("A_NORMAL", A_NORMAL);
2816 SetDictInt("A_STANDOUT", A_STANDOUT);
2817 SetDictInt("A_UNDERLINE", A_UNDERLINE);
2818 SetDictInt("A_REVERSE", A_REVERSE);
2819 SetDictInt("A_BLINK", A_BLINK);
2820 SetDictInt("A_DIM", A_DIM);
2821 SetDictInt("A_BOLD", A_BOLD);
2822 SetDictInt("A_ALTCHARSET", A_ALTCHARSET);
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002823 SetDictInt("A_INVIS", A_INVIS);
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002824 SetDictInt("A_PROTECT", A_PROTECT);
2825 SetDictInt("A_CHARTEXT", A_CHARTEXT);
2826 SetDictInt("A_COLOR", A_COLOR);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002827
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002828 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002829#ifdef A_HORIZONTAL
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002830 SetDictInt("A_HORIZONTAL", A_HORIZONTAL);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002831#endif
2832#ifdef A_LEFT
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002833 SetDictInt("A_LEFT", A_LEFT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002834#endif
2835#ifdef A_LOW
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002836 SetDictInt("A_LOW", A_LOW);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002837#endif
2838#ifdef A_RIGHT
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002839 SetDictInt("A_RIGHT", A_RIGHT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002840#endif
2841#ifdef A_TOP
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002842 SetDictInt("A_TOP", A_TOP);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002843#endif
2844#ifdef A_VERTICAL
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002845 SetDictInt("A_VERTICAL", A_VERTICAL);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002846#endif
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002847
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002848 SetDictInt("COLOR_BLACK", COLOR_BLACK);
2849 SetDictInt("COLOR_RED", COLOR_RED);
2850 SetDictInt("COLOR_GREEN", COLOR_GREEN);
2851 SetDictInt("COLOR_YELLOW", COLOR_YELLOW);
2852 SetDictInt("COLOR_BLUE", COLOR_BLUE);
2853 SetDictInt("COLOR_MAGENTA", COLOR_MAGENTA);
2854 SetDictInt("COLOR_CYAN", COLOR_CYAN);
2855 SetDictInt("COLOR_WHITE", COLOR_WHITE);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002856
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002857#ifdef NCURSES_MOUSE_VERSION
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002858 /* Mouse-related constants */
2859 SetDictInt("BUTTON1_PRESSED", BUTTON1_PRESSED);
2860 SetDictInt("BUTTON1_RELEASED", BUTTON1_RELEASED);
2861 SetDictInt("BUTTON1_CLICKED", BUTTON1_CLICKED);
2862 SetDictInt("BUTTON1_DOUBLE_CLICKED", BUTTON1_DOUBLE_CLICKED);
2863 SetDictInt("BUTTON1_TRIPLE_CLICKED", BUTTON1_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002864
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002865 SetDictInt("BUTTON2_PRESSED", BUTTON2_PRESSED);
2866 SetDictInt("BUTTON2_RELEASED", BUTTON2_RELEASED);
2867 SetDictInt("BUTTON2_CLICKED", BUTTON2_CLICKED);
2868 SetDictInt("BUTTON2_DOUBLE_CLICKED", BUTTON2_DOUBLE_CLICKED);
2869 SetDictInt("BUTTON2_TRIPLE_CLICKED", BUTTON2_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002870
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002871 SetDictInt("BUTTON3_PRESSED", BUTTON3_PRESSED);
2872 SetDictInt("BUTTON3_RELEASED", BUTTON3_RELEASED);
2873 SetDictInt("BUTTON3_CLICKED", BUTTON3_CLICKED);
2874 SetDictInt("BUTTON3_DOUBLE_CLICKED", BUTTON3_DOUBLE_CLICKED);
2875 SetDictInt("BUTTON3_TRIPLE_CLICKED", BUTTON3_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002876
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002877 SetDictInt("BUTTON4_PRESSED", BUTTON4_PRESSED);
2878 SetDictInt("BUTTON4_RELEASED", BUTTON4_RELEASED);
2879 SetDictInt("BUTTON4_CLICKED", BUTTON4_CLICKED);
2880 SetDictInt("BUTTON4_DOUBLE_CLICKED", BUTTON4_DOUBLE_CLICKED);
2881 SetDictInt("BUTTON4_TRIPLE_CLICKED", BUTTON4_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002882
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002883 SetDictInt("BUTTON_SHIFT", BUTTON_SHIFT);
2884 SetDictInt("BUTTON_CTRL", BUTTON_CTRL);
2885 SetDictInt("BUTTON_ALT", BUTTON_ALT);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002886
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002887 SetDictInt("ALL_MOUSE_EVENTS", ALL_MOUSE_EVENTS);
2888 SetDictInt("REPORT_MOUSE_POSITION", REPORT_MOUSE_POSITION);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002889#endif
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002890 /* Now set everything up for KEY_ variables */
2891 {
2892 int key;
2893 char *key_n;
2894 char *key_n2;
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002895 for (key=KEY_MIN;key < KEY_MAX; key++) {
2896 key_n = (char *)keyname(key);
2897 if (key_n == NULL || strcmp(key_n,"UNKNOWN KEY")==0)
2898 continue;
2899 if (strncmp(key_n,"KEY_F(",6)==0) {
2900 char *p1, *p2;
2901 key_n2 = malloc(strlen(key_n)+1);
2902 if (!key_n2) {
2903 PyErr_NoMemory();
2904 break;
2905 }
2906 p1 = key_n;
2907 p2 = key_n2;
2908 while (*p1) {
2909 if (*p1 != '(' && *p1 != ')') {
2910 *p2 = *p1;
2911 p2++;
2912 }
2913 p1++;
2914 }
2915 *p2 = (char)0;
2916 } else
2917 key_n2 = key_n;
2918 SetDictInt(key_n2,key);
2919 if (key_n2 != key_n)
2920 free(key_n2);
2921 }
Victor Stinnerfd2103e2010-05-15 22:19:27 +00002922 SetDictInt("KEY_MIN", KEY_MIN);
2923 SetDictInt("KEY_MAX", KEY_MAX);
2924 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00002925}