blob: 3bf2ca7ce15392d5c04975a3cb067c73c69b5489 [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 Stinner26486ea2010-05-15 22:23:53 +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. Kuchlingfb6bbf52000-07-27 11:58:01 +000040
Victor Stinner26486ea2010-05-15 22:23:53 +000041 Here's a list of currently unsupported functions:
Guido van Rossumd8faa362007-04-27 19:54:29 +000042
Victor Stinner26486ea2010-05-15 22:23:53 +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 Stinner26486ea2010-05-15 22:23:53 +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 Stinner26486ea2010-05-15 22:23:53 +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 Stinner26486ea2010-05-15 22:23:53 +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 Stinner26486ea2010-05-15 22:23:53 +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
Mark Dickinsone047cfa2010-05-11 17:57:09 +0000103#define PY_SSIZE_T_CLEAN
104
Guido van Rossum602099a1994-09-14 13:32:22 +0000105#include "Python.h"
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000106
Benjamin Petersonb173f782009-05-05 22:31:58 +0000107
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000108#ifdef __hpux
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000109#define STRICT_SYSV_CURSES
110#endif
111
Guido van Rossum858ca0f2001-04-10 19:53:37 +0000112#define CURSES_MODULE
113#include "py_curses.h"
114
Victor Stinner26486ea2010-05-15 22:23:53 +0000115/* These prototypes are in <term.h>, but including this header
116 #defines many common symbols (such as "lines") which breaks the
117 curses module in other ways. So the code will just specify
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +0000118 explicit prototypes here. */
119extern int setupterm(char *,int,int *);
Fred Drake0368bc42001-07-19 20:48:32 +0000120#ifdef __sgi
121#include <term.h>
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +0000122#endif
123
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100124#ifdef HAVE_LANGINFO_H
125#include <langinfo.h>
126#endif
127
Martin v. Löwis21ee4092002-09-30 16:19:48 +0000128#if !defined(HAVE_NCURSES_H) && (defined(sgi) || defined(__sun) || defined(SCO5))
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +0000129#define STRICT_SYSV_CURSES /* Don't use ncurses extensions */
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000130typedef chtype attr_t; /* No attr_t type is available */
Guido van Rossum1266a011996-02-25 04:50:31 +0000131#endif
Guido van Rossumf6971e21994-08-30 12:25:20 +0000132
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000133#if defined(_AIX)
134#define STRICT_SYSV_CURSES
135#endif
136
Larry Hastings61272b72014-01-07 12:41:53 -0800137/*[clinic input]
Larry Hastings44e2eaa2013-11-23 15:37:55 -0800138module curses
Larry Hastingsc2047262014-01-25 20:43:29 -0800139class curses.window "PyCursesWindowObject *" "&PyCursesWindow_Type"
Larry Hastings61272b72014-01-07 12:41:53 -0800140[clinic start generated code]*/
Larry Hastings581ee362014-01-28 05:00:08 -0800141/*[clinic end generated code: output=da39a3ee5e6b4b0d input=88c860abdbb50e0c]*/
Larry Hastings44e2eaa2013-11-23 15:37:55 -0800142
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300143#include "clinic/_cursesmodule.c.h"
144
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000145/* Definition of exception curses.error */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000146
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000147static PyObject *PyCursesError;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000148
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +0000149/* Tells whether setupterm() has been called to initialise terminfo. */
150static int initialised_setupterm = FALSE;
151
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000152/* Tells whether initscr() has been called to initialise curses. */
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000153static int initialised = FALSE;
154
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000155/* Tells whether start_color() has been called to initialise color usage. */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000156static int initialisedcolors = FALSE;
157
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100158static char *screen_encoding = NULL;
159
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000160/* Utility Macros */
Victor Stinner26486ea2010-05-15 22:23:53 +0000161#define PyCursesSetupTermCalled \
162 if (initialised_setupterm != TRUE) { \
163 PyErr_SetString(PyCursesError, \
164 "must call (at least) setupterm() first"); \
165 return 0; }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +0000166
Victor Stinner26486ea2010-05-15 22:23:53 +0000167#define PyCursesInitialised \
168 if (initialised != TRUE) { \
169 PyErr_SetString(PyCursesError, \
170 "must call initscr() first"); \
171 return 0; }
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000172
Victor Stinner26486ea2010-05-15 22:23:53 +0000173#define PyCursesInitialisedColor \
174 if (initialisedcolors != TRUE) { \
175 PyErr_SetString(PyCursesError, \
176 "must call start_color() first"); \
177 return 0; }
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000178
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000179/* Utility Functions */
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000180
Guido van Rossum85738471995-02-17 13:50:17 +0000181/*
Victor Stinner26486ea2010-05-15 22:23:53 +0000182 * Check the return code from a curses function and return None
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000183 * or raise an exception as appropriate. These are exported using the
Victor Stinner26486ea2010-05-15 22:23:53 +0000184 * capsule API.
Guido van Rossum85738471995-02-17 13:50:17 +0000185 */
186
187static PyObject *
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100188PyCursesCheckERR(int code, const char *fname)
Guido van Rossum85738471995-02-17 13:50:17 +0000189{
Victor Stinner26486ea2010-05-15 22:23:53 +0000190 if (code != ERR) {
191 Py_INCREF(Py_None);
192 return Py_None;
Guido van Rossum85738471995-02-17 13:50:17 +0000193 } else {
Victor Stinner26486ea2010-05-15 22:23:53 +0000194 if (fname == NULL) {
195 PyErr_SetString(PyCursesError, catchall_ERR);
196 } else {
197 PyErr_Format(PyCursesError, "%s() returned ERR", fname);
198 }
199 return NULL;
Guido van Rossum85738471995-02-17 13:50:17 +0000200 }
Guido van Rossum85738471995-02-17 13:50:17 +0000201}
202
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100203/* Convert an object to a byte (an integer of type chtype):
204
205 - int
206 - bytes of length 1
207 - str of length 1
208
209 Return 1 on success, 0 on error (invalid type or integer overflow). */
Victor Stinner26486ea2010-05-15 22:23:53 +0000210static int
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100211PyCurses_ConvertToChtype(PyCursesWindowObject *win, PyObject *obj, chtype *ch)
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000212{
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100213 long value;
214 if(PyBytes_Check(obj) && PyBytes_Size(obj) == 1) {
215 value = (unsigned char)PyBytes_AsString(obj)[0];
216 }
217 else if (PyUnicode_Check(obj)) {
218 if (PyUnicode_GetLength(obj) != 1) {
219 PyErr_Format(PyExc_TypeError,
220 "expect bytes or str of length 1, or int, "
221 "got a str of length %zi",
222 PyUnicode_GET_LENGTH(obj));
Victor Stinner26486ea2010-05-15 22:23:53 +0000223 return 0;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100224 }
225 value = PyUnicode_READ_CHAR(obj, 0);
226 if (128 < value) {
227 PyObject *bytes;
228 const char *encoding;
229 if (win)
230 encoding = win->encoding;
231 else
232 encoding = screen_encoding;
Serhiy Storchakab29cee42016-10-27 19:31:49 +0300233 bytes = PyUnicode_AsEncodedString(obj, encoding, NULL);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100234 if (bytes == NULL)
235 return 0;
236 if (PyBytes_GET_SIZE(bytes) == 1)
237 value = (unsigned char)PyBytes_AS_STRING(bytes)[0];
238 else
239 value = -1;
240 Py_DECREF(bytes);
241 if (value < 0)
242 goto overflow;
243 }
244 }
245 else if (PyLong_CheckExact(obj)) {
246 int long_overflow;
247 value = PyLong_AsLongAndOverflow(obj, &long_overflow);
248 if (long_overflow)
249 goto overflow;
250 }
251 else {
252 PyErr_Format(PyExc_TypeError,
253 "expect bytes or str of length 1, or int, got %s",
254 Py_TYPE(obj)->tp_name);
Victor Stinner26486ea2010-05-15 22:23:53 +0000255 return 0;
256 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100257 *ch = (chtype)value;
258 if ((long)*ch != value)
259 goto overflow;
Victor Stinner26486ea2010-05-15 22:23:53 +0000260 return 1;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100261
262overflow:
263 PyErr_SetString(PyExc_OverflowError,
264 "byte doesn't fit in chtype");
265 return 0;
266}
267
268/* Convert an object to a byte (chtype) or a character (cchar_t):
269
270 - int
271 - bytes of length 1
272 - str of length 1
273
274 Return:
275
276 - 2 if obj is a character (written into *wch)
277 - 1 if obj is a byte (written into *ch)
278 - 0 on error: raise an exception */
279static int
280PyCurses_ConvertToCchar_t(PyCursesWindowObject *win, PyObject *obj,
281 chtype *ch
282#ifdef HAVE_NCURSESW
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200283 , wchar_t *wch
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100284#endif
285 )
286{
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100287 long value;
288#ifdef HAVE_NCURSESW
289 wchar_t buffer[2];
290#endif
291
292 if (PyUnicode_Check(obj)) {
293#ifdef HAVE_NCURSESW
294 if (PyUnicode_AsWideChar(obj, buffer, 2) != 1) {
295 PyErr_Format(PyExc_TypeError,
296 "expect bytes or str of length 1, or int, "
297 "got a str of length %zi",
298 PyUnicode_GET_LENGTH(obj));
299 return 0;
300 }
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200301 *wch = buffer[0];
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100302 return 2;
303#else
304 return PyCurses_ConvertToChtype(win, obj, ch);
305#endif
306 }
307 else if(PyBytes_Check(obj) && PyBytes_Size(obj) == 1) {
308 value = (unsigned char)PyBytes_AsString(obj)[0];
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100309 }
310 else if (PyLong_CheckExact(obj)) {
311 int overflow;
312 value = PyLong_AsLongAndOverflow(obj, &overflow);
313 if (overflow) {
314 PyErr_SetString(PyExc_OverflowError,
315 "int doesn't fit in long");
316 return 0;
317 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100318 }
319 else {
320 PyErr_Format(PyExc_TypeError,
321 "expect bytes or str of length 1, or int, got %s",
322 Py_TYPE(obj)->tp_name);
323 return 0;
324 }
Victor Stinner9f16e442012-09-01 15:00:34 +0200325
326 *ch = (chtype)value;
327 if ((long)*ch != value) {
328 PyErr_Format(PyExc_OverflowError,
329 "byte doesn't fit in chtype");
330 return 0;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100331 }
Victor Stinner9f16e442012-09-01 15:00:34 +0200332 return 1;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100333}
334
335/* Convert an object to a byte string (char*) or a wide character string
336 (wchar_t*). Return:
337
338 - 2 if obj is a character string (written into *wch)
339 - 1 if obj is a byte string (written into *bytes)
340 - 0 on error: raise an exception */
341static int
342PyCurses_ConvertToString(PyCursesWindowObject *win, PyObject *obj,
343 PyObject **bytes, wchar_t **wstr)
344{
345 if (PyUnicode_Check(obj)) {
346#ifdef HAVE_NCURSESW
347 assert (wstr != NULL);
348 *wstr = PyUnicode_AsWideCharString(obj, NULL);
349 if (*wstr == NULL)
350 return 0;
351 return 2;
352#else
353 assert (wstr == NULL);
Serhiy Storchakab29cee42016-10-27 19:31:49 +0300354 *bytes = PyUnicode_AsEncodedString(obj, win->encoding, NULL);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100355 if (*bytes == NULL)
356 return 0;
357 return 1;
358#endif
359 }
360 else if (PyBytes_Check(obj)) {
361 Py_INCREF(obj);
362 *bytes = obj;
363 return 1;
364 }
365
366 PyErr_Format(PyExc_TypeError, "expect bytes or str, got %s",
367 Py_TYPE(obj)->tp_name);
368 return 0;
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000369}
370
Benjamin Peterson21896a32010-03-21 22:03:03 +0000371/* Function versions of the 3 functions for testing whether curses has been
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000372 initialised or not. */
Victor Stinner26486ea2010-05-15 22:23:53 +0000373
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000374static int func_PyCursesSetupTermCalled(void)
375{
376 PyCursesSetupTermCalled;
377 return 1;
378}
379
380static int func_PyCursesInitialised(void)
381{
382 PyCursesInitialised;
383 return 1;
384}
385
386static int func_PyCursesInitialisedColor(void)
387{
388 PyCursesInitialisedColor;
389 return 1;
390}
391
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000392/*****************************************************************************
393 The Window Object
394******************************************************************************/
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000395
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000396/* Definition of the window type */
Guido van Rossum85738471995-02-17 13:50:17 +0000397
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000398PyTypeObject PyCursesWindow_Type;
399
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000400/* Function prototype macros for Window object
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000401
402 X - function name
403 TYPE - parameter Type
404 ERGSTR - format string for construction of the return value
405 PARSESTR - format string for argument parsing
Victor Stinner26486ea2010-05-15 22:23:53 +0000406*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000407
Victor Stinner26486ea2010-05-15 22:23:53 +0000408#define Window_NoArgNoReturnFunction(X) \
409 static PyObject *PyCursesWindow_ ## X \
410 (PyCursesWindowObject *self, PyObject *args) \
411 { return PyCursesCheckERR(X(self->win), # X); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000412
Victor Stinner26486ea2010-05-15 22:23:53 +0000413#define Window_NoArgTrueFalseFunction(X) \
414 static PyObject * PyCursesWindow_ ## X \
415 (PyCursesWindowObject *self) \
416 { \
417 if (X (self->win) == FALSE) { Py_INCREF(Py_False); return Py_False; } \
418 else { Py_INCREF(Py_True); return Py_True; } }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000419
Victor Stinner26486ea2010-05-15 22:23:53 +0000420#define Window_NoArgNoReturnVoidFunction(X) \
421 static PyObject * PyCursesWindow_ ## X \
422 (PyCursesWindowObject *self) \
423 { \
424 X(self->win); Py_INCREF(Py_None); return Py_None; }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000425
Victor Stinner26486ea2010-05-15 22:23:53 +0000426#define Window_NoArg2TupleReturnFunction(X, TYPE, ERGSTR) \
427 static PyObject * PyCursesWindow_ ## X \
428 (PyCursesWindowObject *self) \
429 { \
430 TYPE arg1, arg2; \
431 X(self->win,arg1,arg2); return Py_BuildValue(ERGSTR, arg1, arg2); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000432
Victor Stinner26486ea2010-05-15 22:23:53 +0000433#define Window_OneArgNoReturnVoidFunction(X, TYPE, PARSESTR) \
434 static PyObject * PyCursesWindow_ ## X \
435 (PyCursesWindowObject *self, PyObject *args) \
436 { \
437 TYPE arg1; \
438 if (!PyArg_ParseTuple(args, PARSESTR, &arg1)) return NULL; \
439 X(self->win,arg1); Py_INCREF(Py_None); return Py_None; }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000440
Victor Stinner26486ea2010-05-15 22:23:53 +0000441#define Window_OneArgNoReturnFunction(X, TYPE, PARSESTR) \
442 static PyObject * PyCursesWindow_ ## X \
443 (PyCursesWindowObject *self, PyObject *args) \
444 { \
445 TYPE arg1; \
446 if (!PyArg_ParseTuple(args,PARSESTR, &arg1)) return NULL; \
447 return PyCursesCheckERR(X(self->win, arg1), # X); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000448
Victor Stinner26486ea2010-05-15 22:23:53 +0000449#define Window_TwoArgNoReturnFunction(X, TYPE, PARSESTR) \
450 static PyObject * PyCursesWindow_ ## X \
451 (PyCursesWindowObject *self, PyObject *args) \
452 { \
453 TYPE arg1, arg2; \
454 if (!PyArg_ParseTuple(args,PARSESTR, &arg1, &arg2)) return NULL; \
455 return PyCursesCheckERR(X(self->win, arg1, arg2), # X); }
Guido van Rossum85738471995-02-17 13:50:17 +0000456
Guido van Rossumf6971e21994-08-30 12:25:20 +0000457/* ------------- WINDOW routines --------------- */
Guido van Rossum85738471995-02-17 13:50:17 +0000458
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000459Window_NoArgNoReturnFunction(untouchwin)
460Window_NoArgNoReturnFunction(touchwin)
461Window_NoArgNoReturnFunction(redrawwin)
462Window_NoArgNoReturnFunction(winsertln)
463Window_NoArgNoReturnFunction(werase)
464Window_NoArgNoReturnFunction(wdeleteln)
465
466Window_NoArgTrueFalseFunction(is_wintouched)
467
468Window_NoArgNoReturnVoidFunction(wsyncup)
469Window_NoArgNoReturnVoidFunction(wsyncdown)
470Window_NoArgNoReturnVoidFunction(wstandend)
471Window_NoArgNoReturnVoidFunction(wstandout)
472Window_NoArgNoReturnVoidFunction(wcursyncup)
473Window_NoArgNoReturnVoidFunction(wclrtoeol)
474Window_NoArgNoReturnVoidFunction(wclrtobot)
475Window_NoArgNoReturnVoidFunction(wclear)
476
477Window_OneArgNoReturnVoidFunction(idcok, int, "i;True(1) or False(0)")
478Window_OneArgNoReturnVoidFunction(immedok, int, "i;True(1) or False(0)")
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +0000479Window_OneArgNoReturnVoidFunction(wtimeout, int, "i;delay")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000480
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000481Window_NoArg2TupleReturnFunction(getyx, int, "ii")
482Window_NoArg2TupleReturnFunction(getbegyx, int, "ii")
483Window_NoArg2TupleReturnFunction(getmaxyx, int, "ii")
484Window_NoArg2TupleReturnFunction(getparyx, int, "ii")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000485
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000486Window_OneArgNoReturnFunction(clearok, int, "i;True(1) or False(0)")
487Window_OneArgNoReturnFunction(idlok, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000488#if defined(__NetBSD__)
489Window_OneArgNoReturnVoidFunction(keypad, int, "i;True(1) or False(0)")
490#else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000491Window_OneArgNoReturnFunction(keypad, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000492#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000493Window_OneArgNoReturnFunction(leaveok, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000494#if defined(__NetBSD__)
495Window_OneArgNoReturnVoidFunction(nodelay, int, "i;True(1) or False(0)")
496#else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000497Window_OneArgNoReturnFunction(nodelay, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000498#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000499Window_OneArgNoReturnFunction(notimeout, int, "i;True(1) or False(0)")
500Window_OneArgNoReturnFunction(scrollok, int, "i;True(1) or False(0)")
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000501Window_OneArgNoReturnFunction(winsdelln, int, "i;nlines")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000502Window_OneArgNoReturnFunction(syncok, int, "i;True(1) or False(0)")
503
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000504Window_TwoArgNoReturnFunction(mvwin, int, "ii;y,x")
505Window_TwoArgNoReturnFunction(mvderwin, int, "ii;y,x")
506Window_TwoArgNoReturnFunction(wmove, int, "ii;y,x")
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000507#ifndef STRICT_SYSV_CURSES
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000508Window_TwoArgNoReturnFunction(wresize, int, "ii;lines,columns")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000509#endif
510
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000511/* Allocation and deallocation of Window Objects */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000512
Guido van Rossumf6971e21994-08-30 12:25:20 +0000513static PyObject *
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100514PyCursesWindow_New(WINDOW *win, const char *encoding)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000515{
Victor Stinner26486ea2010-05-15 22:23:53 +0000516 PyCursesWindowObject *wo;
Guido van Rossum85738471995-02-17 13:50:17 +0000517
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100518 if (encoding == NULL) {
519#if defined(MS_WINDOWS)
520 char *buffer[100];
521 UINT cp;
522 cp = GetConsoleOutputCP();
523 if (cp != 0) {
524 PyOS_snprintf(buffer, sizeof(buffer), "cp%u", cp);
525 encoding = buffer;
526 }
527#elif defined(CODESET)
528 const char *codeset = nl_langinfo(CODESET);
529 if (codeset != NULL && codeset[0] != 0)
530 encoding = codeset;
531#endif
532 if (encoding == NULL)
533 encoding = "utf-8";
534 }
535
Victor Stinner26486ea2010-05-15 22:23:53 +0000536 wo = PyObject_NEW(PyCursesWindowObject, &PyCursesWindow_Type);
537 if (wo == NULL) return NULL;
538 wo->win = win;
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200539 wo->encoding = _PyMem_Strdup(encoding);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100540 if (wo->encoding == NULL) {
541 Py_DECREF(wo);
542 PyErr_NoMemory();
543 return NULL;
544 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000545 return (PyObject *)wo;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000546}
547
548static void
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000549PyCursesWindow_Dealloc(PyCursesWindowObject *wo)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000550{
Victor Stinner26486ea2010-05-15 22:23:53 +0000551 if (wo->win != stdscr) delwin(wo->win);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100552 if (wo->encoding != NULL)
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200553 PyMem_Free(wo->encoding);
Victor Stinner26486ea2010-05-15 22:23:53 +0000554 PyObject_DEL(wo);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000555}
556
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000557/* Addch, Addstr, Addnstr */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000558
Larry Hastings61272b72014-01-07 12:41:53 -0800559/*[clinic input]
Larry Hastings31826802013-10-19 00:09:25 -0700560
561curses.window.addch
562
563 [
Larry Hastings31826802013-10-19 00:09:25 -0700564 y: int
565 Y-coordinate.
Larry Hastings9147a962014-05-04 04:41:18 -0700566 x: int
567 X-coordinate.
Larry Hastings31826802013-10-19 00:09:25 -0700568 ]
569
570 ch: object
571 Character to add.
572
573 [
574 attr: long
575 Attributes for the character.
576 ]
577 /
578
579Paint character ch at (y, x) with attributes attr.
580
581Paint character ch at (y, x) with attributes attr,
582overwriting any character previously painted at that location.
583By default, the character position and attributes are the
584current settings for the window object.
Larry Hastings61272b72014-01-07 12:41:53 -0800585[clinic start generated code]*/
Larry Hastings31826802013-10-19 00:09:25 -0700586
Larry Hastings31826802013-10-19 00:09:25 -0700587static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -0400588curses_window_addch_impl(PyCursesWindowObject *self, int group_left_1, int y,
589 int x, PyObject *ch, int group_right_1, long attr)
590/*[clinic end generated code: output=99f7f85078ec06c3 input=5a41efb34a2de338]*/
Larry Hastings31826802013-10-19 00:09:25 -0700591{
592 PyCursesWindowObject *cwself = (PyCursesWindowObject *)self;
593 int coordinates_group = group_left_1;
594 int attr_group = group_right_1;
595 int rtn;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100596 int type;
Larry Hastings31826802013-10-19 00:09:25 -0700597 chtype cch;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100598#ifdef HAVE_NCURSESW
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200599 wchar_t wstr[2];
600 cchar_t wcval;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100601#endif
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100602 const char *funcname;
Guido van Rossum85738471995-02-17 13:50:17 +0000603
Larry Hastings31826802013-10-19 00:09:25 -0700604 if (!attr_group)
605 attr = A_NORMAL;
Victor Stinner26486ea2010-05-15 22:23:53 +0000606
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100607#ifdef HAVE_NCURSESW
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200608 type = PyCurses_ConvertToCchar_t(cwself, ch, &cch, wstr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100609 if (type == 2) {
610 funcname = "add_wch";
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200611 wstr[1] = L'\0';
612 setcchar(&wcval, wstr, attr, 0, NULL);
Larry Hastings31826802013-10-19 00:09:25 -0700613 if (coordinates_group)
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200614 rtn = mvwadd_wch(cwself->win,y,x, &wcval);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100615 else {
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200616 rtn = wadd_wch(cwself->win, &wcval);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100617 }
618 }
619 else
620#else
Serhiy Storchakaa412f762013-10-19 10:45:48 +0300621 type = PyCurses_ConvertToCchar_t(cwself, ch, &cch);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100622#endif
623 if (type == 1) {
624 funcname = "addch";
Larry Hastings31826802013-10-19 00:09:25 -0700625 if (coordinates_group)
626 rtn = mvwaddch(cwself->win,y,x, cch | attr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100627 else {
Larry Hastings31826802013-10-19 00:09:25 -0700628 rtn = waddch(cwself->win, cch | attr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100629 }
630 }
631 else {
Victor Stinner26486ea2010-05-15 22:23:53 +0000632 return NULL;
633 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100634 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000635}
636
637static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000638PyCursesWindow_AddStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000639{
Victor Stinner26486ea2010-05-15 22:23:53 +0000640 int rtn;
641 int x, y;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100642 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -0500643 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100644#ifdef HAVE_NCURSESW
645 wchar_t *wstr = NULL;
646#endif
Victor Stinner26486ea2010-05-15 22:23:53 +0000647 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
648 long lattr;
649 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100650 const char *funcname;
Guido van Rossum85738471995-02-17 13:50:17 +0000651
Victor Stinner26486ea2010-05-15 22:23:53 +0000652 switch (PyTuple_Size(args)) {
653 case 1:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100654 if (!PyArg_ParseTuple(args,"O;str", &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +0000655 return NULL;
656 break;
657 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100658 if (!PyArg_ParseTuple(args,"Ol;str,attr", &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000659 return NULL;
660 attr = lattr;
661 use_attr = TRUE;
662 break;
663 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100664 if (!PyArg_ParseTuple(args,"iiO;int,int,str", &y, &x, &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +0000665 return NULL;
666 use_xy = TRUE;
667 break;
668 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100669 if (!PyArg_ParseTuple(args,"iiOl;int,int,str,attr", &y, &x, &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000670 return NULL;
671 attr = lattr;
672 use_xy = use_attr = TRUE;
673 break;
674 default:
675 PyErr_SetString(PyExc_TypeError, "addstr requires 1 to 4 arguments");
676 return NULL;
677 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100678#ifdef HAVE_NCURSESW
679 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
680#else
681 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
682#endif
683 if (strtype == 0)
684 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +0000685 if (use_attr == TRUE) {
686 attr_old = getattrs(self->win);
687 (void)wattrset(self->win,attr);
688 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100689#ifdef HAVE_NCURSESW
690 if (strtype == 2) {
691 funcname = "addwstr";
692 if (use_xy == TRUE)
693 rtn = mvwaddwstr(self->win,y,x,wstr);
694 else
695 rtn = waddwstr(self->win,wstr);
696 PyMem_Free(wstr);
697 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000698 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100699#endif
700 {
701 char *str = PyBytes_AS_STRING(bytesobj);
702 funcname = "addstr";
703 if (use_xy == TRUE)
704 rtn = mvwaddstr(self->win,y,x,str);
705 else
706 rtn = waddstr(self->win,str);
707 Py_DECREF(bytesobj);
708 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000709 if (use_attr == TRUE)
710 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100711 return PyCursesCheckERR(rtn, funcname);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000712}
Guido van Rossum85738471995-02-17 13:50:17 +0000713
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000714static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000715PyCursesWindow_AddNStr(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000716{
Victor Stinner26486ea2010-05-15 22:23:53 +0000717 int rtn, x, y, n;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100718 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -0500719 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100720#ifdef HAVE_NCURSESW
721 wchar_t *wstr = NULL;
722#endif
Victor Stinner26486ea2010-05-15 22:23:53 +0000723 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
724 long lattr;
725 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100726 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000727
Victor Stinner26486ea2010-05-15 22:23:53 +0000728 switch (PyTuple_Size(args)) {
729 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100730 if (!PyArg_ParseTuple(args,"Oi;str,n", &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +0000731 return NULL;
732 break;
733 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100734 if (!PyArg_ParseTuple(args,"Oil;str,n,attr", &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000735 return NULL;
736 attr = lattr;
737 use_attr = TRUE;
738 break;
739 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100740 if (!PyArg_ParseTuple(args,"iiOi;y,x,str,n", &y, &x, &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +0000741 return NULL;
742 use_xy = TRUE;
743 break;
744 case 5:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100745 if (!PyArg_ParseTuple(args,"iiOil;y,x,str,n,attr", &y, &x, &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000746 return NULL;
747 attr = lattr;
748 use_xy = use_attr = TRUE;
749 break;
750 default:
751 PyErr_SetString(PyExc_TypeError, "addnstr requires 2 to 5 arguments");
752 return NULL;
753 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100754#ifdef HAVE_NCURSESW
755 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
756#else
757 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
758#endif
759 if (strtype == 0)
760 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000761
Victor Stinner26486ea2010-05-15 22:23:53 +0000762 if (use_attr == TRUE) {
763 attr_old = getattrs(self->win);
764 (void)wattrset(self->win,attr);
765 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100766#ifdef HAVE_NCURSESW
767 if (strtype == 2) {
768 funcname = "addnwstr";
769 if (use_xy == TRUE)
770 rtn = mvwaddnwstr(self->win,y,x,wstr,n);
771 else
772 rtn = waddnwstr(self->win,wstr,n);
773 PyMem_Free(wstr);
774 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000775 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100776#endif
777 {
778 char *str = PyBytes_AS_STRING(bytesobj);
779 funcname = "addnstr";
780 if (use_xy == TRUE)
781 rtn = mvwaddnstr(self->win,y,x,str,n);
782 else
783 rtn = waddnstr(self->win,str,n);
784 Py_DECREF(bytesobj);
785 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000786 if (use_attr == TRUE)
787 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100788 return PyCursesCheckERR(rtn, funcname);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000789}
790
791static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000792PyCursesWindow_Bkgd(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000793{
Victor Stinner26486ea2010-05-15 22:23:53 +0000794 PyObject *temp;
795 chtype bkgd;
796 attr_t attr = A_NORMAL;
797 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000798
Victor Stinner26486ea2010-05-15 22:23:53 +0000799 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000800 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +0000801 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
802 return NULL;
803 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000804 case 2:
Victor Stinner26486ea2010-05-15 22:23:53 +0000805 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
806 return NULL;
807 attr = lattr;
808 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000809 default:
Victor Stinner26486ea2010-05-15 22:23:53 +0000810 PyErr_SetString(PyExc_TypeError, "bkgd requires 1 or 2 arguments");
811 return NULL;
812 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000813
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100814 if (!PyCurses_ConvertToChtype(self, temp, &bkgd))
Victor Stinner26486ea2010-05-15 22:23:53 +0000815 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000816
Victor Stinner26486ea2010-05-15 22:23:53 +0000817 return PyCursesCheckERR(wbkgd(self->win, bkgd | attr), "bkgd");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000818}
819
820static PyObject *
Christian Heimes2380ac72008-01-09 00:17:24 +0000821PyCursesWindow_AttrOff(PyCursesWindowObject *self, PyObject *args)
822{
Victor Stinner26486ea2010-05-15 22:23:53 +0000823 long lattr;
824 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
825 return NULL;
826 return PyCursesCheckERR(wattroff(self->win, (attr_t)lattr), "attroff");
Christian Heimes2380ac72008-01-09 00:17:24 +0000827}
828
829static PyObject *
830PyCursesWindow_AttrOn(PyCursesWindowObject *self, PyObject *args)
831{
Victor Stinner26486ea2010-05-15 22:23:53 +0000832 long lattr;
833 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
834 return NULL;
835 return PyCursesCheckERR(wattron(self->win, (attr_t)lattr), "attron");
Christian Heimes2380ac72008-01-09 00:17:24 +0000836}
837
838static PyObject *
839PyCursesWindow_AttrSet(PyCursesWindowObject *self, PyObject *args)
840{
Victor Stinner26486ea2010-05-15 22:23:53 +0000841 long lattr;
842 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
843 return NULL;
844 return PyCursesCheckERR(wattrset(self->win, (attr_t)lattr), "attrset");
Christian Heimes2380ac72008-01-09 00:17:24 +0000845}
846
847static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000848PyCursesWindow_BkgdSet(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000849{
Victor Stinner26486ea2010-05-15 22:23:53 +0000850 PyObject *temp;
851 chtype bkgd;
852 attr_t attr = A_NORMAL;
853 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000854
Victor Stinner26486ea2010-05-15 22:23:53 +0000855 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000856 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +0000857 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
858 return NULL;
859 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000860 case 2:
Victor Stinner26486ea2010-05-15 22:23:53 +0000861 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
862 return NULL;
863 attr = lattr;
864 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000865 default:
Victor Stinner26486ea2010-05-15 22:23:53 +0000866 PyErr_SetString(PyExc_TypeError, "bkgdset requires 1 or 2 arguments");
867 return NULL;
868 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000869
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100870 if (!PyCurses_ConvertToChtype(self, temp, &bkgd))
Victor Stinner26486ea2010-05-15 22:23:53 +0000871 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000872
Victor Stinner26486ea2010-05-15 22:23:53 +0000873 wbkgdset(self->win, bkgd | attr);
874 return PyCursesCheckERR(0, "bkgdset");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000875}
876
877static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000878PyCursesWindow_Border(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000879{
Victor Stinner26486ea2010-05-15 22:23:53 +0000880 PyObject *temp[8];
881 chtype ch[8];
882 int i;
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000883
Victor Stinner26486ea2010-05-15 22:23:53 +0000884 /* Clear the array of parameters */
885 for(i=0; i<8; i++) {
886 temp[i] = NULL;
887 ch[i] = 0;
888 }
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000889
Victor Stinner26486ea2010-05-15 22:23:53 +0000890 if (!PyArg_ParseTuple(args,"|OOOOOOOO;ls,rs,ts,bs,tl,tr,bl,br",
891 &temp[0], &temp[1], &temp[2], &temp[3],
892 &temp[4], &temp[5], &temp[6], &temp[7]))
893 return NULL;
894
895 for(i=0; i<8; i++) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100896 if (temp[i] != NULL && !PyCurses_ConvertToChtype(self, temp[i], &ch[i]))
Victor Stinner26486ea2010-05-15 22:23:53 +0000897 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +0000898 }
899
900 wborder(self->win,
901 ch[0], ch[1], ch[2], ch[3],
902 ch[4], ch[5], ch[6], ch[7]);
903 Py_INCREF(Py_None);
904 return Py_None;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000905}
906
907static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000908PyCursesWindow_Box(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000909{
Victor Stinner26486ea2010-05-15 22:23:53 +0000910 chtype ch1=0,ch2=0;
911 switch(PyTuple_Size(args)){
912 case 0: break;
913 default:
914 if (!PyArg_ParseTuple(args,"ll;vertint,horint", &ch1, &ch2))
915 return NULL;
916 }
917 box(self->win,ch1,ch2);
918 Py_INCREF(Py_None);
919 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000920}
921
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000922#if defined(HAVE_NCURSES_H) || defined(MVWDELCH_IS_EXPRESSION)
923#define py_mvwdelch mvwdelch
924#else
925int py_mvwdelch(WINDOW *w, int y, int x)
926{
Victor Stinner26486ea2010-05-15 22:23:53 +0000927 mvwdelch(w,y,x);
928 /* On HP/UX, mvwdelch already returns. On other systems,
929 we may well run into this return statement. */
930 return 0;
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000931}
932#endif
933
Guido van Rossumd8faa362007-04-27 19:54:29 +0000934/* chgat, added by Fabian Kreutz <fabian.kreutz at gmx.net> */
935
936static PyObject *
937PyCursesWindow_ChgAt(PyCursesWindowObject *self, PyObject *args)
938{
Victor Stinner26486ea2010-05-15 22:23:53 +0000939 int rtn;
940 int x, y;
941 int num = -1;
942 short color;
943 attr_t attr = A_NORMAL;
944 long lattr;
945 int use_xy = FALSE;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000946
Victor Stinner26486ea2010-05-15 22:23:53 +0000947 switch (PyTuple_Size(args)) {
948 case 1:
949 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
950 return NULL;
951 attr = lattr;
952 break;
953 case 2:
954 if (!PyArg_ParseTuple(args,"il;n,attr", &num, &lattr))
955 return NULL;
956 attr = lattr;
957 break;
958 case 3:
959 if (!PyArg_ParseTuple(args,"iil;int,int,attr", &y, &x, &lattr))
960 return NULL;
961 attr = lattr;
962 use_xy = TRUE;
963 break;
964 case 4:
965 if (!PyArg_ParseTuple(args,"iiil;int,int,n,attr", &y, &x, &num, &lattr))
966 return NULL;
967 attr = lattr;
968 use_xy = TRUE;
969 break;
970 default:
971 PyErr_SetString(PyExc_TypeError, "chgat requires 1 to 4 arguments");
972 return NULL;
973 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000974
Victor Stinner26486ea2010-05-15 22:23:53 +0000975 color = (short)((attr >> 8) & 0xff);
976 attr = attr - (color << 8);
Guido van Rossumd8faa362007-04-27 19:54:29 +0000977
Victor Stinner26486ea2010-05-15 22:23:53 +0000978 if (use_xy == TRUE) {
979 rtn = mvwchgat(self->win,y,x,num,attr,color,NULL);
980 touchline(self->win,y,1);
981 } else {
982 getyx(self->win,y,x);
983 rtn = wchgat(self->win,num,attr,color,NULL);
984 touchline(self->win,y,1);
985 }
986 return PyCursesCheckERR(rtn, "chgat");
Guido van Rossumd8faa362007-04-27 19:54:29 +0000987}
988
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000989
Guido van Rossumf6971e21994-08-30 12:25:20 +0000990static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000991PyCursesWindow_DelCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000992{
Victor Stinner26486ea2010-05-15 22:23:53 +0000993 int rtn;
994 int x, y;
Guido van Rossum85738471995-02-17 13:50:17 +0000995
Victor Stinner26486ea2010-05-15 22:23:53 +0000996 switch (PyTuple_Size(args)) {
997 case 0:
998 rtn = wdelch(self->win);
999 break;
1000 case 2:
1001 if (!PyArg_ParseTuple(args,"ii;y,x", &y, &x))
1002 return NULL;
1003 rtn = py_mvwdelch(self->win,y,x);
1004 break;
1005 default:
1006 PyErr_SetString(PyExc_TypeError, "delch requires 0 or 2 arguments");
1007 return NULL;
1008 }
1009 return PyCursesCheckERR(rtn, "[mv]wdelch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001010}
1011
1012static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001013PyCursesWindow_DerWin(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001014{
Victor Stinner26486ea2010-05-15 22:23:53 +00001015 WINDOW *win;
1016 int nlines, ncols, begin_y, begin_x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001017
Victor Stinner26486ea2010-05-15 22:23:53 +00001018 nlines = 0;
1019 ncols = 0;
1020 switch (PyTuple_Size(args)) {
1021 case 2:
1022 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
1023 return NULL;
1024 break;
1025 case 4:
1026 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
1027 &nlines,&ncols,&begin_y,&begin_x))
1028 return NULL;
1029 break;
1030 default:
1031 PyErr_SetString(PyExc_TypeError, "derwin requires 2 or 4 arguments");
1032 return NULL;
1033 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001034
Victor Stinner26486ea2010-05-15 22:23:53 +00001035 win = derwin(self->win,nlines,ncols,begin_y,begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001036
Victor Stinner26486ea2010-05-15 22:23:53 +00001037 if (win == NULL) {
1038 PyErr_SetString(PyCursesError, catchall_NULL);
1039 return NULL;
1040 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001041
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001042 return (PyObject *)PyCursesWindow_New(win, NULL);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001043}
1044
1045static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001046PyCursesWindow_EchoChar(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001047{
Victor Stinner26486ea2010-05-15 22:23:53 +00001048 PyObject *temp;
1049 chtype ch;
1050 attr_t attr = A_NORMAL;
1051 long lattr;
Guido van Rossum85738471995-02-17 13:50:17 +00001052
Victor Stinner26486ea2010-05-15 22:23:53 +00001053 switch (PyTuple_Size(args)) {
1054 case 1:
1055 if (!PyArg_ParseTuple(args,"O;ch or int", &temp))
1056 return NULL;
1057 break;
1058 case 2:
1059 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
1060 return NULL;
1061 attr = lattr;
1062 break;
1063 default:
1064 PyErr_SetString(PyExc_TypeError, "echochar requires 1 or 2 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001065
1066
Victor Stinner26486ea2010-05-15 22:23:53 +00001067 return NULL;
1068 }
Guido van Rossum85738471995-02-17 13:50:17 +00001069
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001070 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001071 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001072
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001073#ifdef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001074 if (self->win->_flags & _ISPAD)
1075 return PyCursesCheckERR(pechochar(self->win, ch | attr),
1076 "echochar");
1077 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001078#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001079 return PyCursesCheckERR(wechochar(self->win, ch | attr),
1080 "echochar");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001081}
1082
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001083#ifdef NCURSES_MOUSE_VERSION
1084static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001085PyCursesWindow_Enclose(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001086{
Victor Stinner26486ea2010-05-15 22:23:53 +00001087 int x, y;
1088 if (!PyArg_ParseTuple(args,"ii;y,x", &y, &x))
1089 return NULL;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001090
Victor Stinner26486ea2010-05-15 22:23:53 +00001091 return PyLong_FromLong( wenclose(self->win,y,x) );
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001092}
1093#endif
1094
Guido van Rossumf6971e21994-08-30 12:25:20 +00001095static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001096PyCursesWindow_GetBkgd(PyCursesWindowObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001097{
Victor Stinner26486ea2010-05-15 22:23:53 +00001098 return PyLong_FromLong((long) getbkgd(self->win));
Guido van Rossumf6971e21994-08-30 12:25:20 +00001099}
1100
1101static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001102PyCursesWindow_GetCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001103{
Victor Stinner26486ea2010-05-15 22:23:53 +00001104 int x, y;
1105 int rtn;
Guido van Rossum85738471995-02-17 13:50:17 +00001106
Victor Stinner26486ea2010-05-15 22:23:53 +00001107 switch (PyTuple_Size(args)) {
1108 case 0:
1109 Py_BEGIN_ALLOW_THREADS
1110 rtn = wgetch(self->win);
1111 Py_END_ALLOW_THREADS
1112 break;
1113 case 2:
1114 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1115 return NULL;
1116 Py_BEGIN_ALLOW_THREADS
1117 rtn = mvwgetch(self->win,y,x);
1118 Py_END_ALLOW_THREADS
1119 break;
1120 default:
1121 PyErr_SetString(PyExc_TypeError, "getch requires 0 or 2 arguments");
1122 return NULL;
1123 }
1124 return PyLong_FromLong((long)rtn);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001125}
Guido van Rossum85738471995-02-17 13:50:17 +00001126
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001127static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001128PyCursesWindow_GetKey(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001129{
Victor Stinner26486ea2010-05-15 22:23:53 +00001130 int x, y;
1131 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001132
Victor Stinner26486ea2010-05-15 22:23:53 +00001133 switch (PyTuple_Size(args)) {
1134 case 0:
1135 Py_BEGIN_ALLOW_THREADS
1136 rtn = wgetch(self->win);
1137 Py_END_ALLOW_THREADS
1138 break;
1139 case 2:
1140 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1141 return NULL;
1142 Py_BEGIN_ALLOW_THREADS
1143 rtn = mvwgetch(self->win,y,x);
1144 Py_END_ALLOW_THREADS
1145 break;
1146 default:
1147 PyErr_SetString(PyExc_TypeError, "getkey requires 0 or 2 arguments");
1148 return NULL;
1149 }
1150 if (rtn == ERR) {
1151 /* getch() returns ERR in nodelay mode */
R David Murrayf5d7cc22013-03-19 16:23:09 -04001152 PyErr_CheckSignals();
1153 if (!PyErr_Occurred())
1154 PyErr_SetString(PyCursesError, "no input");
Victor Stinner26486ea2010-05-15 22:23:53 +00001155 return NULL;
1156 } else if (rtn<=255) {
1157 return Py_BuildValue("C", rtn);
1158 } else {
1159 const char *knp;
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001160#if defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00001161 knp = unctrl(rtn);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001162#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001163 knp = keyname(rtn);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001164#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001165 return PyUnicode_FromString((knp == NULL) ? "" : knp);
1166 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001167}
1168
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001169#ifdef HAVE_NCURSESW
Guido van Rossumf6971e21994-08-30 12:25:20 +00001170static PyObject *
Victor Stinnera7878b72011-07-14 23:07:44 +02001171PyCursesWindow_Get_WCh(PyCursesWindowObject *self, PyObject *args)
1172{
1173 int x, y;
1174 int ct;
1175 wint_t rtn;
1176
1177 switch (PyTuple_Size(args)) {
1178 case 0:
1179 Py_BEGIN_ALLOW_THREADS
1180 ct = wget_wch(self->win,&rtn);
1181 Py_END_ALLOW_THREADS
1182 break;
1183 case 2:
1184 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1185 return NULL;
1186 Py_BEGIN_ALLOW_THREADS
1187 ct = mvwget_wch(self->win,y,x,&rtn);
1188 Py_END_ALLOW_THREADS
1189 break;
1190 default:
1191 PyErr_SetString(PyExc_TypeError, "get_wch requires 0 or 2 arguments");
1192 return NULL;
1193 }
1194 if (ct == ERR) {
Victor Stinnerbd2d30c2013-03-21 12:21:06 +01001195 if (PyErr_CheckSignals())
1196 return NULL;
1197
Victor Stinnera7878b72011-07-14 23:07:44 +02001198 /* get_wch() returns ERR in nodelay mode */
1199 PyErr_SetString(PyCursesError, "no input");
1200 return NULL;
1201 }
Victor Stinner1d39cde2012-08-29 01:40:57 +02001202 if (ct == KEY_CODE_YES)
1203 return PyLong_FromLong(rtn);
1204 else
1205 return PyUnicode_FromOrdinal(rtn);
Victor Stinnera7878b72011-07-14 23:07:44 +02001206}
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001207#endif
Victor Stinnera7878b72011-07-14 23:07:44 +02001208
1209static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001210PyCursesWindow_GetStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001211{
Victor Stinner26486ea2010-05-15 22:23:53 +00001212 int x, y, n;
1213 char rtn[1024]; /* This should be big enough.. I hope */
1214 int rtn2;
Guido van Rossum85738471995-02-17 13:50:17 +00001215
Victor Stinner26486ea2010-05-15 22:23:53 +00001216 switch (PyTuple_Size(args)) {
1217 case 0:
1218 Py_BEGIN_ALLOW_THREADS
1219 rtn2 = wgetnstr(self->win,rtn, 1023);
1220 Py_END_ALLOW_THREADS
1221 break;
1222 case 1:
1223 if (!PyArg_ParseTuple(args,"i;n", &n))
1224 return NULL;
Benjamin Peterson40a77c32016-08-13 18:15:28 -07001225 if (n < 0) {
1226 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1227 return NULL;
1228 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001229 Py_BEGIN_ALLOW_THREADS
Victor Stinner640c35c2013-06-04 23:14:37 +02001230 rtn2 = wgetnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001231 Py_END_ALLOW_THREADS
1232 break;
1233 case 2:
1234 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1235 return NULL;
1236 Py_BEGIN_ALLOW_THREADS
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001237#ifdef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00001238 rtn2 = wmove(self->win,y,x)==ERR ? ERR : wgetnstr(self->win, rtn, 1023);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001239#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001240 rtn2 = mvwgetnstr(self->win,y,x,rtn, 1023);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001241#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001242 Py_END_ALLOW_THREADS
1243 break;
1244 case 3:
1245 if (!PyArg_ParseTuple(args,"iii;y,x,n", &y, &x, &n))
1246 return NULL;
Benjamin Peterson40a77c32016-08-13 18:15:28 -07001247 if (n < 0) {
1248 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1249 return NULL;
1250 }
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00001251#ifdef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00001252 Py_BEGIN_ALLOW_THREADS
1253 rtn2 = wmove(self->win,y,x)==ERR ? ERR :
Victor Stinner640c35c2013-06-04 23:14:37 +02001254 wgetnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001255 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001256#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001257 Py_BEGIN_ALLOW_THREADS
Victor Stinner640c35c2013-06-04 23:14:37 +02001258 rtn2 = mvwgetnstr(self->win, y, x, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001259 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001260#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001261 break;
1262 default:
1263 PyErr_SetString(PyExc_TypeError, "getstr requires 0 to 3 arguments");
1264 return NULL;
1265 }
1266 if (rtn2 == ERR)
1267 rtn[0] = 0;
1268 return PyBytes_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001269}
1270
1271static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001272PyCursesWindow_Hline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001273{
Victor Stinner26486ea2010-05-15 22:23:53 +00001274 PyObject *temp;
1275 chtype ch;
1276 int n, x, y, code = OK;
1277 attr_t attr = A_NORMAL;
1278 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001279
Victor Stinner26486ea2010-05-15 22:23:53 +00001280 switch (PyTuple_Size(args)) {
1281 case 2:
1282 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
1283 return NULL;
1284 break;
1285 case 3:
1286 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &lattr))
1287 return NULL;
1288 attr = lattr;
1289 break;
1290 case 4:
1291 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
1292 return NULL;
1293 code = wmove(self->win, y, x);
1294 break;
1295 case 5:
1296 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
1297 &y, &x, &temp, &n, &lattr))
1298 return NULL;
1299 attr = lattr;
1300 code = wmove(self->win, y, x);
1301 break;
1302 default:
1303 PyErr_SetString(PyExc_TypeError, "hline requires 2 to 5 arguments");
1304 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001305 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001306
1307 if (code != ERR) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001308 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001309 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001310 return PyCursesCheckERR(whline(self->win, ch | attr, n), "hline");
1311 } else
1312 return PyCursesCheckERR(code, "wmove");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001313}
1314
1315static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001316PyCursesWindow_InsCh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001317{
Victor Stinner26486ea2010-05-15 22:23:53 +00001318 int rtn, x, y, use_xy = FALSE;
1319 PyObject *temp;
1320 chtype ch = 0;
1321 attr_t attr = A_NORMAL;
1322 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001323
Victor Stinner26486ea2010-05-15 22:23:53 +00001324 switch (PyTuple_Size(args)) {
1325 case 1:
1326 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
1327 return NULL;
1328 break;
1329 case 2:
1330 if (!PyArg_ParseTuple(args, "Ol;ch or int,attr", &temp, &lattr))
1331 return NULL;
1332 attr = lattr;
1333 break;
1334 case 3:
1335 if (!PyArg_ParseTuple(args,"iiO;y,x,ch or int", &y, &x, &temp))
1336 return NULL;
1337 use_xy = TRUE;
1338 break;
1339 case 4:
1340 if (!PyArg_ParseTuple(args,"iiOl;y,x,ch or int, attr", &y, &x, &temp, &lattr))
1341 return NULL;
1342 attr = lattr;
1343 use_xy = TRUE;
1344 break;
1345 default:
1346 PyErr_SetString(PyExc_TypeError, "insch requires 1 or 4 arguments");
1347 return NULL;
1348 }
1349
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001350 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001351 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001352
1353 if (use_xy == TRUE)
1354 rtn = mvwinsch(self->win,y,x, ch | attr);
1355 else {
1356 rtn = winsch(self->win, ch | attr);
1357 }
1358 return PyCursesCheckERR(rtn, "insch");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001359}
1360
1361static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001362PyCursesWindow_InCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001363{
Christian Heimesabbc8ca2013-12-04 08:50:22 +01001364 int x, y;
1365 unsigned long rtn;
Guido van Rossum85738471995-02-17 13:50:17 +00001366
Victor Stinner26486ea2010-05-15 22:23:53 +00001367 switch (PyTuple_Size(args)) {
1368 case 0:
1369 rtn = winch(self->win);
1370 break;
1371 case 2:
1372 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1373 return NULL;
1374 rtn = mvwinch(self->win,y,x);
1375 break;
1376 default:
1377 PyErr_SetString(PyExc_TypeError, "inch requires 0 or 2 arguments");
1378 return NULL;
1379 }
Christian Heimesabbc8ca2013-12-04 08:50:22 +01001380 return PyLong_FromUnsignedLong(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001381}
1382
1383static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001384PyCursesWindow_InStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001385{
Victor Stinner26486ea2010-05-15 22:23:53 +00001386 int x, y, n;
1387 char rtn[1024]; /* This should be big enough.. I hope */
1388 int rtn2;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001389
Victor Stinner26486ea2010-05-15 22:23:53 +00001390 switch (PyTuple_Size(args)) {
1391 case 0:
1392 rtn2 = winnstr(self->win,rtn, 1023);
1393 break;
1394 case 1:
1395 if (!PyArg_ParseTuple(args,"i;n", &n))
1396 return NULL;
Benjamin Peterson432ea4f2016-08-15 21:40:14 -07001397 if (n < 0) {
1398 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1399 return NULL;
1400 }
Victor Stinner640c35c2013-06-04 23:14:37 +02001401 rtn2 = winnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001402 break;
1403 case 2:
1404 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1405 return NULL;
1406 rtn2 = mvwinnstr(self->win,y,x,rtn,1023);
1407 break;
1408 case 3:
1409 if (!PyArg_ParseTuple(args, "iii;y,x,n", &y, &x, &n))
1410 return NULL;
Benjamin Peterson432ea4f2016-08-15 21:40:14 -07001411 if (n < 0) {
1412 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1413 return NULL;
1414 }
Victor Stinner640c35c2013-06-04 23:14:37 +02001415 rtn2 = mvwinnstr(self->win, y, x, rtn, Py_MIN(n,1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001416 break;
1417 default:
1418 PyErr_SetString(PyExc_TypeError, "instr requires 0 or 3 arguments");
1419 return NULL;
1420 }
1421 if (rtn2 == ERR)
1422 rtn[0] = 0;
1423 return PyBytes_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001424}
1425
1426static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001427PyCursesWindow_InsStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001428{
Victor Stinner26486ea2010-05-15 22:23:53 +00001429 int rtn;
1430 int x, y;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001431 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -05001432 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001433#ifdef HAVE_NCURSESW
1434 wchar_t *wstr = NULL;
1435#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001436 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
1437 long lattr;
1438 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001439 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001440
Victor Stinner26486ea2010-05-15 22:23:53 +00001441 switch (PyTuple_Size(args)) {
1442 case 1:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001443 if (!PyArg_ParseTuple(args,"O;str", &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +00001444 return NULL;
1445 break;
1446 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001447 if (!PyArg_ParseTuple(args,"Ol;str,attr", &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001448 return NULL;
1449 attr = lattr;
1450 use_attr = TRUE;
1451 break;
1452 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001453 if (!PyArg_ParseTuple(args,"iiO;y,x,str", &y, &x, &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +00001454 return NULL;
1455 use_xy = TRUE;
1456 break;
1457 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001458 if (!PyArg_ParseTuple(args,"iiOl;y,x,str,attr", &y, &x, &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001459 return NULL;
1460 attr = lattr;
1461 use_xy = use_attr = TRUE;
1462 break;
1463 default:
1464 PyErr_SetString(PyExc_TypeError, "insstr requires 1 to 4 arguments");
1465 return NULL;
1466 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001467
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001468#ifdef HAVE_NCURSESW
1469 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
1470#else
1471 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
1472#endif
1473 if (strtype == 0)
1474 return NULL;
1475
Victor Stinner26486ea2010-05-15 22:23:53 +00001476 if (use_attr == TRUE) {
1477 attr_old = getattrs(self->win);
1478 (void)wattrset(self->win,attr);
1479 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001480#ifdef HAVE_NCURSESW
1481 if (strtype == 2) {
1482 funcname = "inswstr";
1483 if (use_xy == TRUE)
1484 rtn = mvwins_wstr(self->win,y,x,wstr);
1485 else
1486 rtn = wins_wstr(self->win,wstr);
1487 PyMem_Free(wstr);
1488 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001489 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001490#endif
1491 {
1492 char *str = PyBytes_AS_STRING(bytesobj);
1493 funcname = "insstr";
1494 if (use_xy == TRUE)
1495 rtn = mvwinsstr(self->win,y,x,str);
1496 else
1497 rtn = winsstr(self->win,str);
1498 Py_DECREF(bytesobj);
1499 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001500 if (use_attr == TRUE)
1501 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001502 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001503}
1504
1505static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001506PyCursesWindow_InsNStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001507{
Victor Stinner26486ea2010-05-15 22:23:53 +00001508 int rtn, x, y, n;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001509 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -05001510 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001511#ifdef HAVE_NCURSESW
1512 wchar_t *wstr = NULL;
1513#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001514 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
1515 long lattr;
1516 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001517 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001518
Victor Stinner26486ea2010-05-15 22:23:53 +00001519 switch (PyTuple_Size(args)) {
1520 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001521 if (!PyArg_ParseTuple(args,"Oi;str,n", &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +00001522 return NULL;
1523 break;
1524 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001525 if (!PyArg_ParseTuple(args,"Oil;str,n,attr", &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001526 return NULL;
1527 attr = lattr;
1528 use_attr = TRUE;
1529 break;
1530 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001531 if (!PyArg_ParseTuple(args,"iiOi;y,x,str,n", &y, &x, &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +00001532 return NULL;
1533 use_xy = TRUE;
1534 break;
1535 case 5:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001536 if (!PyArg_ParseTuple(args,"iiOil;y,x,str,n,attr", &y, &x, &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001537 return NULL;
1538 attr = lattr;
1539 use_xy = use_attr = TRUE;
1540 break;
1541 default:
1542 PyErr_SetString(PyExc_TypeError, "insnstr requires 2 to 5 arguments");
1543 return NULL;
1544 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001545
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001546#ifdef HAVE_NCURSESW
1547 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
1548#else
1549 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
1550#endif
1551 if (strtype == 0)
1552 return NULL;
1553
Victor Stinner26486ea2010-05-15 22:23:53 +00001554 if (use_attr == TRUE) {
1555 attr_old = getattrs(self->win);
1556 (void)wattrset(self->win,attr);
1557 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001558#ifdef HAVE_NCURSESW
1559 if (strtype == 2) {
1560 funcname = "insn_wstr";
1561 if (use_xy == TRUE)
1562 rtn = mvwins_nwstr(self->win,y,x,wstr,n);
1563 else
1564 rtn = wins_nwstr(self->win,wstr,n);
1565 PyMem_Free(wstr);
1566 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001567 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001568#endif
1569 {
1570 char *str = PyBytes_AS_STRING(bytesobj);
1571 funcname = "insnstr";
1572 if (use_xy == TRUE)
1573 rtn = mvwinsnstr(self->win,y,x,str,n);
1574 else
1575 rtn = winsnstr(self->win,str,n);
1576 Py_DECREF(bytesobj);
1577 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001578 if (use_attr == TRUE)
1579 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001580 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001581}
1582
1583static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001584PyCursesWindow_Is_LineTouched(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001585{
Victor Stinner26486ea2010-05-15 22:23:53 +00001586 int line, erg;
1587 if (!PyArg_ParseTuple(args,"i;line", &line))
1588 return NULL;
1589 erg = is_linetouched(self->win, line);
1590 if (erg == ERR) {
1591 PyErr_SetString(PyExc_TypeError,
1592 "is_linetouched: line number outside of boundaries");
1593 return NULL;
1594 } else
1595 if (erg == FALSE) {
1596 Py_INCREF(Py_False);
1597 return Py_False;
1598 } else {
1599 Py_INCREF(Py_True);
1600 return Py_True;
1601 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001602}
1603
1604static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001605PyCursesWindow_NoOutRefresh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001606{
Victor Stinner26486ea2010-05-15 22:23:53 +00001607 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
1608 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001609
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001610#ifndef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001611 if (0)
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001612#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001613 if (self->win->_flags & _ISPAD)
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001614#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001615 {
1616 switch(PyTuple_Size(args)) {
1617 case 6:
1618 if (!PyArg_ParseTuple(args,
1619 "iiiiii;" \
1620 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1621 &pminrow, &pmincol, &sminrow,
1622 &smincol, &smaxrow, &smaxcol))
1623 return NULL;
1624 Py_BEGIN_ALLOW_THREADS
1625 rtn = pnoutrefresh(self->win,
1626 pminrow, pmincol, sminrow,
1627 smincol, smaxrow, smaxcol);
1628 Py_END_ALLOW_THREADS
1629 return PyCursesCheckERR(rtn, "pnoutrefresh");
1630 default:
1631 PyErr_SetString(PyCursesError,
1632 "noutrefresh() called for a pad "
1633 "requires 6 arguments");
1634 return NULL;
1635 }
1636 } else {
1637 if (!PyArg_ParseTuple(args, ":noutrefresh"))
1638 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001639
Victor Stinner26486ea2010-05-15 22:23:53 +00001640 Py_BEGIN_ALLOW_THREADS
1641 rtn = wnoutrefresh(self->win);
1642 Py_END_ALLOW_THREADS
1643 return PyCursesCheckERR(rtn, "wnoutrefresh");
1644 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001645}
1646
1647static PyObject *
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001648PyCursesWindow_Overlay(PyCursesWindowObject *self, PyObject *args)
1649{
1650 PyCursesWindowObject *temp;
1651 int use_copywin = FALSE;
1652 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1653 int rtn;
Victor Stinner26486ea2010-05-15 22:23:53 +00001654
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001655 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001656 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +00001657 if (!PyArg_ParseTuple(args, "O!;window object",
1658 &PyCursesWindow_Type, &temp))
1659 return NULL;
1660 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001661 case 7:
Victor Stinner26486ea2010-05-15 22:23:53 +00001662 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
1663 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1664 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1665 return NULL;
1666 use_copywin = TRUE;
1667 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001668 default:
Victor Stinner26486ea2010-05-15 22:23:53 +00001669 PyErr_SetString(PyExc_TypeError,
1670 "overlay requires one or seven arguments");
1671 return NULL;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001672 }
1673
1674 if (use_copywin == TRUE) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001675 rtn = copywin(self->win, temp->win, sminrow, smincol,
1676 dminrow, dmincol, dmaxrow, dmaxcol, TRUE);
1677 return PyCursesCheckERR(rtn, "copywin");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001678 }
1679 else {
Victor Stinner26486ea2010-05-15 22:23:53 +00001680 rtn = overlay(self->win, temp->win);
1681 return PyCursesCheckERR(rtn, "overlay");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001682 }
1683}
1684
1685static PyObject *
1686PyCursesWindow_Overwrite(PyCursesWindowObject *self, PyObject *args)
1687{
1688 PyCursesWindowObject *temp;
1689 int use_copywin = FALSE;
1690 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1691 int rtn;
Victor Stinner26486ea2010-05-15 22:23:53 +00001692
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001693 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001694 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +00001695 if (!PyArg_ParseTuple(args, "O!;window object",
1696 &PyCursesWindow_Type, &temp))
1697 return NULL;
1698 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001699 case 7:
Victor Stinner26486ea2010-05-15 22:23:53 +00001700 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
1701 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1702 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1703 return NULL;
1704 use_copywin = TRUE;
1705 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001706 default:
Victor Stinner26486ea2010-05-15 22:23:53 +00001707 PyErr_SetString(PyExc_TypeError,
1708 "overwrite requires one or seven arguments");
1709 return NULL;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001710 }
1711
1712 if (use_copywin == TRUE) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001713 rtn = copywin(self->win, temp->win, sminrow, smincol,
1714 dminrow, dmincol, dmaxrow, dmaxcol, FALSE);
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001715 return PyCursesCheckERR(rtn, "copywin");
1716 }
1717 else {
Victor Stinner26486ea2010-05-15 22:23:53 +00001718 rtn = overwrite(self->win, temp->win);
1719 return PyCursesCheckERR(rtn, "overwrite");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001720 }
1721}
1722
1723static PyObject *
Guido van Rossum6c95da32007-07-24 00:16:38 +00001724PyCursesWindow_PutWin(PyCursesWindowObject *self, PyObject *stream)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001725{
Victor Stinner26486ea2010-05-15 22:23:53 +00001726 /* We have to simulate this by writing to a temporary FILE*,
1727 then reading back, then writing to the argument stream. */
1728 char fn[100];
Victor Stinnerdaf45552013-08-28 00:53:59 +02001729 int fd = -1;
1730 FILE *fp = NULL;
1731 PyObject *res = NULL;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00001732
Victor Stinner26486ea2010-05-15 22:23:53 +00001733 strcpy(fn, "/tmp/py.curses.putwin.XXXXXX");
1734 fd = mkstemp(fn);
1735 if (fd < 0)
1736 return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
Victor Stinnerdaf45552013-08-28 00:53:59 +02001737 if (_Py_set_inheritable(fd, 0, NULL) < 0)
1738 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001739 fp = fdopen(fd, "wb+");
1740 if (fp == NULL) {
Victor Stinnerdaf45552013-08-28 00:53:59 +02001741 PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
1742 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001743 }
1744 res = PyCursesCheckERR(putwin(self->win, fp), "putwin");
Victor Stinnerdaf45552013-08-28 00:53:59 +02001745 if (res == NULL)
1746 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001747 fseek(fp, 0, 0);
1748 while (1) {
1749 char buf[BUFSIZ];
1750 Py_ssize_t n = fread(buf, 1, BUFSIZ, fp);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001751 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001752
Victor Stinner26486ea2010-05-15 22:23:53 +00001753 if (n <= 0)
1754 break;
1755 Py_DECREF(res);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001756 res = _PyObject_CallMethodId(stream, &PyId_write, "y#", buf, n);
Victor Stinner26486ea2010-05-15 22:23:53 +00001757 if (res == NULL)
1758 break;
1759 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02001760
1761exit:
1762 if (fp != NULL)
1763 fclose(fp);
1764 else if (fd != -1)
1765 close(fd);
Guido van Rossum150b7d72007-08-30 23:34:01 +00001766 remove(fn);
Guido van Rossum6c95da32007-07-24 00:16:38 +00001767 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001768}
1769
1770static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001771PyCursesWindow_RedrawLine(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001772{
Victor Stinner26486ea2010-05-15 22:23:53 +00001773 int beg, num;
1774 if (!PyArg_ParseTuple(args, "ii;beg,num", &beg, &num))
1775 return NULL;
1776 return PyCursesCheckERR(wredrawln(self->win,beg,num), "redrawln");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001777}
1778
1779static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001780PyCursesWindow_Refresh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001781{
Victor Stinner26486ea2010-05-15 22:23:53 +00001782 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
1783 int rtn;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001784
Victor Stinner26486ea2010-05-15 22:23:53 +00001785#ifndef WINDOW_HAS_FLAGS
1786 if (0)
1787#else
1788 if (self->win->_flags & _ISPAD)
1789#endif
1790 {
1791 switch(PyTuple_Size(args)) {
1792 case 6:
1793 if (!PyArg_ParseTuple(args,
1794 "iiiiii;" \
1795 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1796 &pminrow, &pmincol, &sminrow,
1797 &smincol, &smaxrow, &smaxcol))
1798 return NULL;
1799
1800 Py_BEGIN_ALLOW_THREADS
1801 rtn = prefresh(self->win,
1802 pminrow, pmincol, sminrow,
1803 smincol, smaxrow, smaxcol);
1804 Py_END_ALLOW_THREADS
1805 return PyCursesCheckERR(rtn, "prefresh");
1806 default:
1807 PyErr_SetString(PyCursesError,
1808 "refresh() for a pad requires 6 arguments");
1809 return NULL;
1810 }
1811 } else {
1812 if (!PyArg_ParseTuple(args, ":refresh"))
1813 return NULL;
1814 Py_BEGIN_ALLOW_THREADS
1815 rtn = wrefresh(self->win);
1816 Py_END_ALLOW_THREADS
1817 return PyCursesCheckERR(rtn, "prefresh");
1818 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001819}
1820
1821static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001822PyCursesWindow_SetScrollRegion(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001823{
Victor Stinner26486ea2010-05-15 22:23:53 +00001824 int x, y;
1825 if (!PyArg_ParseTuple(args,"ii;top, bottom",&y,&x))
1826 return NULL;
1827 return PyCursesCheckERR(wsetscrreg(self->win,y,x), "wsetscrreg");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001828}
1829
1830static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001831PyCursesWindow_SubWin(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001832{
Victor Stinner26486ea2010-05-15 22:23:53 +00001833 WINDOW *win;
1834 int nlines, ncols, begin_y, begin_x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001835
Victor Stinner26486ea2010-05-15 22:23:53 +00001836 nlines = 0;
1837 ncols = 0;
1838 switch (PyTuple_Size(args)) {
1839 case 2:
1840 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
1841 return NULL;
1842 break;
1843 case 4:
1844 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
1845 &nlines,&ncols,&begin_y,&begin_x))
1846 return NULL;
1847 break;
1848 default:
1849 PyErr_SetString(PyExc_TypeError, "subwin requires 2 or 4 arguments");
1850 return NULL;
1851 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001852
Victor Stinner26486ea2010-05-15 22:23:53 +00001853 /* printf("Subwin: %i %i %i %i \n", nlines, ncols, begin_y, begin_x); */
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001854#ifdef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001855 if (self->win->_flags & _ISPAD)
1856 win = subpad(self->win, nlines, ncols, begin_y, begin_x);
1857 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001858#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001859 win = subwin(self->win, nlines, ncols, begin_y, begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001860
Victor Stinner26486ea2010-05-15 22:23:53 +00001861 if (win == NULL) {
1862 PyErr_SetString(PyCursesError, catchall_NULL);
1863 return NULL;
1864 }
1865
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001866 return (PyObject *)PyCursesWindow_New(win, self->encoding);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001867}
1868
1869static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001870PyCursesWindow_Scroll(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001871{
Victor Stinner26486ea2010-05-15 22:23:53 +00001872 int nlines;
1873 switch(PyTuple_Size(args)) {
1874 case 0:
1875 return PyCursesCheckERR(scroll(self->win), "scroll");
1876 case 1:
1877 if (!PyArg_ParseTuple(args, "i;nlines", &nlines))
1878 return NULL;
1879 return PyCursesCheckERR(wscrl(self->win, nlines), "scroll");
1880 default:
1881 PyErr_SetString(PyExc_TypeError, "scroll requires 0 or 1 arguments");
1882 return NULL;
1883 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001884}
1885
1886static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001887PyCursesWindow_TouchLine(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001888{
Victor Stinner26486ea2010-05-15 22:23:53 +00001889 int st, cnt, val;
1890 switch (PyTuple_Size(args)) {
1891 case 2:
1892 if (!PyArg_ParseTuple(args,"ii;start,count",&st,&cnt))
1893 return NULL;
1894 return PyCursesCheckERR(touchline(self->win,st,cnt), "touchline");
1895 case 3:
1896 if (!PyArg_ParseTuple(args, "iii;start,count,val", &st, &cnt, &val))
1897 return NULL;
1898 return PyCursesCheckERR(wtouchln(self->win, st, cnt, val), "touchline");
1899 default:
1900 PyErr_SetString(PyExc_TypeError, "touchline requires 2 or 3 arguments");
1901 return NULL;
1902 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001903}
1904
1905static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001906PyCursesWindow_Vline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001907{
Victor Stinner26486ea2010-05-15 22:23:53 +00001908 PyObject *temp;
1909 chtype ch;
1910 int n, x, y, code = OK;
1911 attr_t attr = A_NORMAL;
1912 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001913
Victor Stinner26486ea2010-05-15 22:23:53 +00001914 switch (PyTuple_Size(args)) {
1915 case 2:
1916 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
1917 return NULL;
1918 break;
1919 case 3:
1920 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &lattr))
1921 return NULL;
1922 attr = lattr;
1923 break;
1924 case 4:
1925 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
1926 return NULL;
1927 code = wmove(self->win, y, x);
1928 break;
1929 case 5:
1930 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
1931 &y, &x, &temp, &n, &lattr))
1932 return NULL;
1933 attr = lattr;
1934 code = wmove(self->win, y, x);
1935 break;
1936 default:
1937 PyErr_SetString(PyExc_TypeError, "vline requires 2 to 5 arguments");
1938 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001939 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001940
1941 if (code != ERR) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001942 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001943 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001944 return PyCursesCheckERR(wvline(self->win, ch | attr, n), "vline");
1945 } else
1946 return PyCursesCheckERR(code, "wmove");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001947}
1948
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001949static PyObject *
1950PyCursesWindow_get_encoding(PyCursesWindowObject *self, void *closure)
1951{
1952 return PyUnicode_FromString(self->encoding);
1953}
1954
1955static int
1956PyCursesWindow_set_encoding(PyCursesWindowObject *self, PyObject *value)
1957{
1958 PyObject *ascii;
1959 char *encoding;
1960
1961 /* It is illegal to del win.encoding */
1962 if (value == NULL) {
1963 PyErr_SetString(PyExc_TypeError,
1964 "encoding may not be deleted");
1965 return -1;
1966 }
1967
1968 if (!PyUnicode_Check(value)) {
1969 PyErr_SetString(PyExc_TypeError,
1970 "setting encoding to a non-string");
1971 return -1;
1972 }
1973 ascii = PyUnicode_AsASCIIString(value);
1974 if (ascii == NULL)
1975 return -1;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02001976 encoding = _PyMem_Strdup(PyBytes_AS_STRING(ascii));
Ross Lagerwall2dabaf62012-09-07 08:34:23 +02001977 Py_DECREF(ascii);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001978 if (encoding == NULL) {
1979 PyErr_NoMemory();
1980 return -1;
1981 }
Victor Stinner49fc8ec2013-07-07 23:30:24 +02001982 PyMem_Free(self->encoding);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001983 self->encoding = encoding;
1984 return 0;
1985}
1986
1987
Guido van Rossumf6971e21994-08-30 12:25:20 +00001988static PyMethodDef PyCursesWindow_Methods[] = {
Larry Hastings31826802013-10-19 00:09:25 -07001989 CURSES_WINDOW_ADDCH_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00001990 {"addnstr", (PyCFunction)PyCursesWindow_AddNStr, METH_VARARGS},
1991 {"addstr", (PyCFunction)PyCursesWindow_AddStr, METH_VARARGS},
1992 {"attroff", (PyCFunction)PyCursesWindow_AttrOff, METH_VARARGS},
1993 {"attron", (PyCFunction)PyCursesWindow_AttrOn, METH_VARARGS},
1994 {"attrset", (PyCFunction)PyCursesWindow_AttrSet, METH_VARARGS},
1995 {"bkgd", (PyCFunction)PyCursesWindow_Bkgd, METH_VARARGS},
1996 {"chgat", (PyCFunction)PyCursesWindow_ChgAt, METH_VARARGS},
1997 {"bkgdset", (PyCFunction)PyCursesWindow_BkgdSet, METH_VARARGS},
1998 {"border", (PyCFunction)PyCursesWindow_Border, METH_VARARGS},
1999 {"box", (PyCFunction)PyCursesWindow_Box, METH_VARARGS},
2000 {"clear", (PyCFunction)PyCursesWindow_wclear, METH_NOARGS},
2001 {"clearok", (PyCFunction)PyCursesWindow_clearok, METH_VARARGS},
2002 {"clrtobot", (PyCFunction)PyCursesWindow_wclrtobot, METH_NOARGS},
2003 {"clrtoeol", (PyCFunction)PyCursesWindow_wclrtoeol, METH_NOARGS},
2004 {"cursyncup", (PyCFunction)PyCursesWindow_wcursyncup, METH_NOARGS},
2005 {"delch", (PyCFunction)PyCursesWindow_DelCh, METH_VARARGS},
2006 {"deleteln", (PyCFunction)PyCursesWindow_wdeleteln, METH_NOARGS},
2007 {"derwin", (PyCFunction)PyCursesWindow_DerWin, METH_VARARGS},
2008 {"echochar", (PyCFunction)PyCursesWindow_EchoChar, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002009#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00002010 {"enclose", (PyCFunction)PyCursesWindow_Enclose, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002011#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002012 {"erase", (PyCFunction)PyCursesWindow_werase, METH_NOARGS},
2013 {"getbegyx", (PyCFunction)PyCursesWindow_getbegyx, METH_NOARGS},
2014 {"getbkgd", (PyCFunction)PyCursesWindow_GetBkgd, METH_NOARGS},
2015 {"getch", (PyCFunction)PyCursesWindow_GetCh, METH_VARARGS},
2016 {"getkey", (PyCFunction)PyCursesWindow_GetKey, METH_VARARGS},
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02002017#ifdef HAVE_NCURSESW
Victor Stinnera7878b72011-07-14 23:07:44 +02002018 {"get_wch", (PyCFunction)PyCursesWindow_Get_WCh, METH_VARARGS},
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02002019#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002020 {"getmaxyx", (PyCFunction)PyCursesWindow_getmaxyx, METH_NOARGS},
2021 {"getparyx", (PyCFunction)PyCursesWindow_getparyx, METH_NOARGS},
2022 {"getstr", (PyCFunction)PyCursesWindow_GetStr, METH_VARARGS},
2023 {"getyx", (PyCFunction)PyCursesWindow_getyx, METH_NOARGS},
2024 {"hline", (PyCFunction)PyCursesWindow_Hline, METH_VARARGS},
2025 {"idcok", (PyCFunction)PyCursesWindow_idcok, METH_VARARGS},
2026 {"idlok", (PyCFunction)PyCursesWindow_idlok, METH_VARARGS},
2027 {"immedok", (PyCFunction)PyCursesWindow_immedok, METH_VARARGS},
2028 {"inch", (PyCFunction)PyCursesWindow_InCh, METH_VARARGS},
2029 {"insch", (PyCFunction)PyCursesWindow_InsCh, METH_VARARGS},
2030 {"insdelln", (PyCFunction)PyCursesWindow_winsdelln, METH_VARARGS},
2031 {"insertln", (PyCFunction)PyCursesWindow_winsertln, METH_NOARGS},
2032 {"insnstr", (PyCFunction)PyCursesWindow_InsNStr, METH_VARARGS},
2033 {"insstr", (PyCFunction)PyCursesWindow_InsStr, METH_VARARGS},
2034 {"instr", (PyCFunction)PyCursesWindow_InStr, METH_VARARGS},
2035 {"is_linetouched", (PyCFunction)PyCursesWindow_Is_LineTouched, METH_VARARGS},
2036 {"is_wintouched", (PyCFunction)PyCursesWindow_is_wintouched, METH_NOARGS},
2037 {"keypad", (PyCFunction)PyCursesWindow_keypad, METH_VARARGS},
2038 {"leaveok", (PyCFunction)PyCursesWindow_leaveok, METH_VARARGS},
2039 {"move", (PyCFunction)PyCursesWindow_wmove, METH_VARARGS},
2040 {"mvderwin", (PyCFunction)PyCursesWindow_mvderwin, METH_VARARGS},
2041 {"mvwin", (PyCFunction)PyCursesWindow_mvwin, METH_VARARGS},
2042 {"nodelay", (PyCFunction)PyCursesWindow_nodelay, METH_VARARGS},
2043 {"notimeout", (PyCFunction)PyCursesWindow_notimeout, METH_VARARGS},
2044 {"noutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh, METH_VARARGS},
Victor Stinner26486ea2010-05-15 22:23:53 +00002045 {"overlay", (PyCFunction)PyCursesWindow_Overlay, METH_VARARGS},
2046 {"overwrite", (PyCFunction)PyCursesWindow_Overwrite,
2047 METH_VARARGS},
2048 {"putwin", (PyCFunction)PyCursesWindow_PutWin, METH_O},
2049 {"redrawln", (PyCFunction)PyCursesWindow_RedrawLine, METH_VARARGS},
2050 {"redrawwin", (PyCFunction)PyCursesWindow_redrawwin, METH_NOARGS},
2051 {"refresh", (PyCFunction)PyCursesWindow_Refresh, METH_VARARGS},
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00002052#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00002053 {"resize", (PyCFunction)PyCursesWindow_wresize, METH_VARARGS},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002054#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002055 {"scroll", (PyCFunction)PyCursesWindow_Scroll, METH_VARARGS},
2056 {"scrollok", (PyCFunction)PyCursesWindow_scrollok, METH_VARARGS},
2057 {"setscrreg", (PyCFunction)PyCursesWindow_SetScrollRegion, METH_VARARGS},
2058 {"standend", (PyCFunction)PyCursesWindow_wstandend, METH_NOARGS},
2059 {"standout", (PyCFunction)PyCursesWindow_wstandout, METH_NOARGS},
2060 {"subpad", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
2061 {"subwin", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
2062 {"syncdown", (PyCFunction)PyCursesWindow_wsyncdown, METH_NOARGS},
2063 {"syncok", (PyCFunction)PyCursesWindow_syncok, METH_VARARGS},
2064 {"syncup", (PyCFunction)PyCursesWindow_wsyncup, METH_NOARGS},
2065 {"timeout", (PyCFunction)PyCursesWindow_wtimeout, METH_VARARGS},
2066 {"touchline", (PyCFunction)PyCursesWindow_TouchLine, METH_VARARGS},
2067 {"touchwin", (PyCFunction)PyCursesWindow_touchwin, METH_NOARGS},
2068 {"untouchwin", (PyCFunction)PyCursesWindow_untouchwin, METH_NOARGS},
2069 {"vline", (PyCFunction)PyCursesWindow_Vline, METH_VARARGS},
2070 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002071};
2072
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002073static PyGetSetDef PyCursesWindow_getsets[] = {
2074 {"encoding",
2075 (getter)PyCursesWindow_get_encoding,
2076 (setter)PyCursesWindow_set_encoding,
Ronald Oussoren2a7fe032012-01-17 16:53:20 +01002077 "the typecode character used to create the array"},
2078 {NULL, NULL, NULL, NULL } /* sentinel */
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002079};
2080
Guido van Rossumf6971e21994-08-30 12:25:20 +00002081/* -------------------------------------------------------*/
Guido van Rossum85738471995-02-17 13:50:17 +00002082
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002083PyTypeObject PyCursesWindow_Type = {
Victor Stinner26486ea2010-05-15 22:23:53 +00002084 PyVarObject_HEAD_INIT(NULL, 0)
2085 "_curses.curses window", /*tp_name*/
2086 sizeof(PyCursesWindowObject), /*tp_basicsize*/
2087 0, /*tp_itemsize*/
2088 /* methods */
2089 (destructor)PyCursesWindow_Dealloc, /*tp_dealloc*/
2090 0, /*tp_print*/
2091 (getattrfunc)0, /*tp_getattr*/
2092 (setattrfunc)0, /*tp_setattr*/
2093 0, /*tp_reserved*/
2094 0, /*tp_repr*/
2095 0, /*tp_as_number*/
2096 0, /*tp_as_sequence*/
2097 0, /*tp_as_mapping*/
2098 0, /*tp_hash*/
2099 0, /*tp_call*/
2100 0, /*tp_str*/
2101 0, /*tp_getattro*/
2102 0, /*tp_setattro*/
2103 0, /*tp_as_buffer*/
2104 Py_TPFLAGS_DEFAULT, /*tp_flags*/
2105 0, /*tp_doc*/
2106 0, /*tp_traverse*/
2107 0, /*tp_clear*/
2108 0, /*tp_richcompare*/
2109 0, /*tp_weaklistoffset*/
2110 0, /*tp_iter*/
2111 0, /*tp_iternext*/
2112 PyCursesWindow_Methods, /*tp_methods*/
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002113 0, /* tp_members */
2114 PyCursesWindow_getsets, /* tp_getset */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002115};
2116
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002117/*********************************************************************
2118 Global Functions
2119**********************************************************************/
Guido van Rossumf6971e21994-08-30 12:25:20 +00002120
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002121NoArgNoReturnFunction(beep)
2122NoArgNoReturnFunction(def_prog_mode)
2123NoArgNoReturnFunction(def_shell_mode)
2124NoArgNoReturnFunction(doupdate)
2125NoArgNoReturnFunction(endwin)
2126NoArgNoReturnFunction(flash)
2127NoArgNoReturnFunction(nocbreak)
2128NoArgNoReturnFunction(noecho)
2129NoArgNoReturnFunction(nonl)
2130NoArgNoReturnFunction(noraw)
2131NoArgNoReturnFunction(reset_prog_mode)
2132NoArgNoReturnFunction(reset_shell_mode)
2133NoArgNoReturnFunction(resetty)
2134NoArgNoReturnFunction(savetty)
2135
2136NoArgOrFlagNoReturnFunction(cbreak)
2137NoArgOrFlagNoReturnFunction(echo)
2138NoArgOrFlagNoReturnFunction(nl)
2139NoArgOrFlagNoReturnFunction(raw)
2140
2141NoArgReturnIntFunction(baudrate)
2142NoArgReturnIntFunction(termattrs)
2143
2144NoArgReturnStringFunction(termname)
2145NoArgReturnStringFunction(longname)
2146
2147NoArgTrueFalseFunction(can_change_color)
2148NoArgTrueFalseFunction(has_colors)
2149NoArgTrueFalseFunction(has_ic)
2150NoArgTrueFalseFunction(has_il)
2151NoArgTrueFalseFunction(isendwin)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002152NoArgNoReturnVoidFunction(flushinp)
2153NoArgNoReturnVoidFunction(noqiflush)
2154
2155static PyObject *
Christian Heimesaf98da12008-01-27 15:18:18 +00002156PyCurses_filter(PyObject *self)
2157{
Victor Stinner26486ea2010-05-15 22:23:53 +00002158 /* not checking for PyCursesInitialised here since filter() must
2159 be called before initscr() */
2160 filter();
2161 Py_INCREF(Py_None);
2162 return Py_None;
Christian Heimesaf98da12008-01-27 15:18:18 +00002163}
2164
2165static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002166PyCurses_Color_Content(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002167{
Victor Stinner26486ea2010-05-15 22:23:53 +00002168 short color,r,g,b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002169
Victor Stinner26486ea2010-05-15 22:23:53 +00002170 PyCursesInitialised;
2171 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002172
Victor Stinner26486ea2010-05-15 22:23:53 +00002173 if (!PyArg_ParseTuple(args, "h:color_content", &color)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002174
Victor Stinner26486ea2010-05-15 22:23:53 +00002175 if (color_content(color, &r, &g, &b) != ERR)
2176 return Py_BuildValue("(iii)", r, g, b);
2177 else {
2178 PyErr_SetString(PyCursesError,
2179 "Argument 1 was out of range. Check value of COLORS.");
2180 return NULL;
2181 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002182}
2183
2184static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002185PyCurses_color_pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002186{
Victor Stinner26486ea2010-05-15 22:23:53 +00002187 int n;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002188
Victor Stinner26486ea2010-05-15 22:23:53 +00002189 PyCursesInitialised;
2190 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002191
Victor Stinner26486ea2010-05-15 22:23:53 +00002192 if (!PyArg_ParseTuple(args, "i:color_pair", &n)) return NULL;
2193 return PyLong_FromLong((long) (n << 8));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002194}
2195
2196static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002197PyCurses_Curs_Set(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002198{
Victor Stinner26486ea2010-05-15 22:23:53 +00002199 int vis,erg;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002200
Victor Stinner26486ea2010-05-15 22:23:53 +00002201 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002202
Victor Stinner26486ea2010-05-15 22:23:53 +00002203 if (!PyArg_ParseTuple(args, "i:curs_set", &vis)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002204
Victor Stinner26486ea2010-05-15 22:23:53 +00002205 erg = curs_set(vis);
2206 if (erg == ERR) return PyCursesCheckERR(erg, "curs_set");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002207
Victor Stinner26486ea2010-05-15 22:23:53 +00002208 return PyLong_FromLong((long) erg);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002209}
2210
2211static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002212PyCurses_Delay_Output(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002213{
Victor Stinner26486ea2010-05-15 22:23:53 +00002214 int ms;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002215
Victor Stinner26486ea2010-05-15 22:23:53 +00002216 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002217
Victor Stinner26486ea2010-05-15 22:23:53 +00002218 if (!PyArg_ParseTuple(args, "i:delay_output", &ms)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002219
Victor Stinner26486ea2010-05-15 22:23:53 +00002220 return PyCursesCheckERR(delay_output(ms), "delay_output");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002221}
2222
2223static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002224PyCurses_EraseChar(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002225{
Victor Stinner26486ea2010-05-15 22:23:53 +00002226 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002227
Victor Stinner26486ea2010-05-15 22:23:53 +00002228 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002229
Victor Stinner26486ea2010-05-15 22:23:53 +00002230 ch = erasechar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002231
Victor Stinner26486ea2010-05-15 22:23:53 +00002232 return PyBytes_FromStringAndSize(&ch, 1);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002233}
2234
2235static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002236PyCurses_getsyx(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002237{
Victor Stinner26486ea2010-05-15 22:23:53 +00002238 int x = 0;
2239 int y = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002240
Victor Stinner26486ea2010-05-15 22:23:53 +00002241 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002242
Victor Stinner26486ea2010-05-15 22:23:53 +00002243 getsyx(y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002244
Victor Stinner26486ea2010-05-15 22:23:53 +00002245 return Py_BuildValue("(ii)", y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002246}
2247
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002248#ifdef NCURSES_MOUSE_VERSION
2249static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002250PyCurses_GetMouse(PyObject *self)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002251{
Victor Stinner26486ea2010-05-15 22:23:53 +00002252 int rtn;
2253 MEVENT event;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002254
Victor Stinner26486ea2010-05-15 22:23:53 +00002255 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002256
Victor Stinner26486ea2010-05-15 22:23:53 +00002257 rtn = getmouse( &event );
2258 if (rtn == ERR) {
2259 PyErr_SetString(PyCursesError, "getmouse() returned ERR");
2260 return NULL;
2261 }
2262 return Py_BuildValue("(hiiil)",
2263 (short)event.id,
2264 event.x, event.y, event.z,
2265 (long) event.bstate);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002266}
2267
2268static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002269PyCurses_UngetMouse(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002270{
Victor Stinner26486ea2010-05-15 22:23:53 +00002271 MEVENT event;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002272
Victor Stinner26486ea2010-05-15 22:23:53 +00002273 PyCursesInitialised;
2274 if (!PyArg_ParseTuple(args, "hiiil",
2275 &event.id,
2276 &event.x, &event.y, &event.z,
2277 (int *) &event.bstate))
2278 return NULL;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002279
Victor Stinner26486ea2010-05-15 22:23:53 +00002280 return PyCursesCheckERR(ungetmouse(&event), "ungetmouse");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002281}
2282#endif
2283
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002284static PyObject *
Guido van Rossum6c95da32007-07-24 00:16:38 +00002285PyCurses_GetWin(PyCursesWindowObject *self, PyObject *stream)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002286{
Victor Stinner26486ea2010-05-15 22:23:53 +00002287 char fn[100];
Victor Stinnerdaf45552013-08-28 00:53:59 +02002288 int fd = -1;
2289 FILE *fp = NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002290 PyObject *data;
2291 size_t datalen;
2292 WINDOW *win;
Benjamin Peterson18b71912013-05-16 15:29:44 -05002293 _Py_IDENTIFIER(read);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002294 PyObject *res = NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002295
Victor Stinner26486ea2010-05-15 22:23:53 +00002296 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002297
Victor Stinner26486ea2010-05-15 22:23:53 +00002298 strcpy(fn, "/tmp/py.curses.getwin.XXXXXX");
2299 fd = mkstemp(fn);
2300 if (fd < 0)
2301 return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002302 if (_Py_set_inheritable(fd, 0, NULL) < 0)
2303 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002304 fp = fdopen(fd, "wb+");
2305 if (fp == NULL) {
Victor Stinnerdaf45552013-08-28 00:53:59 +02002306 PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
2307 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002308 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02002309
Victor Stinner3466bde2016-09-05 18:16:01 -07002310 data = _PyObject_CallMethodId(stream, &PyId_read, NULL);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002311 if (data == NULL)
2312 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002313 if (!PyBytes_Check(data)) {
2314 PyErr_Format(PyExc_TypeError,
2315 "f.read() returned %.100s instead of bytes",
2316 data->ob_type->tp_name);
2317 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002318 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002319 }
2320 datalen = PyBytes_GET_SIZE(data);
2321 if (fwrite(PyBytes_AS_STRING(data), 1, datalen, fp) != datalen) {
2322 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002323 PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
2324 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002325 }
Guido van Rossum6c95da32007-07-24 00:16:38 +00002326 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002327
Victor Stinner26486ea2010-05-15 22:23:53 +00002328 fseek(fp, 0, 0);
2329 win = getwin(fp);
Victor Stinner26486ea2010-05-15 22:23:53 +00002330 if (win == NULL) {
2331 PyErr_SetString(PyCursesError, catchall_NULL);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002332 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002333 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02002334 res = PyCursesWindow_New(win, NULL);
2335
2336error:
2337 if (fp != NULL)
2338 fclose(fp);
2339 else if (fd != -1)
2340 close(fd);
2341 remove(fn);
2342 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002343}
2344
2345static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002346PyCurses_HalfDelay(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002347{
Victor Stinner26486ea2010-05-15 22:23:53 +00002348 unsigned char tenths;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002349
Victor Stinner26486ea2010-05-15 22:23:53 +00002350 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002351
Victor Stinner26486ea2010-05-15 22:23:53 +00002352 if (!PyArg_ParseTuple(args, "b:halfdelay", &tenths)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002353
Victor Stinner26486ea2010-05-15 22:23:53 +00002354 return PyCursesCheckERR(halfdelay(tenths), "halfdelay");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002355}
2356
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00002357#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00002358/* No has_key! */
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002359static PyObject * PyCurses_has_key(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002360{
Victor Stinner26486ea2010-05-15 22:23:53 +00002361 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002362
Victor Stinner26486ea2010-05-15 22:23:53 +00002363 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002364
Victor Stinner26486ea2010-05-15 22:23:53 +00002365 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002366
Victor Stinner26486ea2010-05-15 22:23:53 +00002367 if (has_key(ch) == FALSE) {
2368 Py_INCREF(Py_False);
2369 return Py_False;
2370 }
2371 Py_INCREF(Py_True);
2372 return Py_True;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002373}
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00002374#endif /* STRICT_SYSV_CURSES */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002375
2376static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002377PyCurses_Init_Color(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002378{
Victor Stinner26486ea2010-05-15 22:23:53 +00002379 short color, r, g, b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002380
Victor Stinner26486ea2010-05-15 22:23:53 +00002381 PyCursesInitialised;
2382 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002383
Victor Stinner26486ea2010-05-15 22:23:53 +00002384 switch(PyTuple_Size(args)) {
2385 case 4:
2386 if (!PyArg_ParseTuple(args, "hhhh;color,r,g,b", &color, &r, &g, &b)) return NULL;
2387 break;
2388 default:
2389 PyErr_SetString(PyExc_TypeError, "init_color requires 4 arguments");
2390 return NULL;
2391 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002392
Victor Stinner26486ea2010-05-15 22:23:53 +00002393 return PyCursesCheckERR(init_color(color, r, g, b), "init_color");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002394}
2395
2396static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002397PyCurses_Init_Pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002398{
Victor Stinner26486ea2010-05-15 22:23:53 +00002399 short pair, f, b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002400
Victor Stinner26486ea2010-05-15 22:23:53 +00002401 PyCursesInitialised;
2402 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002403
Victor Stinner26486ea2010-05-15 22:23:53 +00002404 if (PyTuple_Size(args) != 3) {
2405 PyErr_SetString(PyExc_TypeError, "init_pair requires 3 arguments");
2406 return NULL;
2407 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002408
Victor Stinner26486ea2010-05-15 22:23:53 +00002409 if (!PyArg_ParseTuple(args, "hhh;pair, f, b", &pair, &f, &b)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002410
Victor Stinner26486ea2010-05-15 22:23:53 +00002411 return PyCursesCheckERR(init_pair(pair, f, b), "init_pair");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002412}
2413
Andrew M. Kuchling32552682000-12-22 21:52:27 +00002414static PyObject *ModDict;
2415
Victor Stinner26486ea2010-05-15 22:23:53 +00002416static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002417PyCurses_InitScr(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002418{
Victor Stinner26486ea2010-05-15 22:23:53 +00002419 WINDOW *win;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002420 PyCursesWindowObject *winobj;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002421
Victor Stinner26486ea2010-05-15 22:23:53 +00002422 if (initialised == TRUE) {
2423 wrefresh(stdscr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002424 return (PyObject *)PyCursesWindow_New(stdscr, NULL);
Victor Stinner26486ea2010-05-15 22:23:53 +00002425 }
Guido van Rossum56bf2351994-08-31 22:06:24 +00002426
Victor Stinner26486ea2010-05-15 22:23:53 +00002427 win = initscr();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002428
Victor Stinner26486ea2010-05-15 22:23:53 +00002429 if (win == NULL) {
2430 PyErr_SetString(PyCursesError, catchall_NULL);
2431 return NULL;
2432 }
Guido van Rossum85738471995-02-17 13:50:17 +00002433
Victor Stinner26486ea2010-05-15 22:23:53 +00002434 initialised = initialised_setupterm = TRUE;
Guido van Rossum56bf2351994-08-31 22:06:24 +00002435
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002436/* This was moved from initcurses() because it core dumped on SGI,
2437 where they're not defined until you've called initscr() */
Victor Stinner26486ea2010-05-15 22:23:53 +00002438#define SetDictInt(string,ch) \
2439 do { \
2440 PyObject *o = PyLong_FromLong((long) (ch)); \
2441 if (o && PyDict_SetItemString(ModDict, string, o) == 0) { \
2442 Py_DECREF(o); \
2443 } \
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002444 } while (0)
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002445
Victor Stinner26486ea2010-05-15 22:23:53 +00002446 /* Here are some graphic symbols you can use */
2447 SetDictInt("ACS_ULCORNER", (ACS_ULCORNER));
2448 SetDictInt("ACS_LLCORNER", (ACS_LLCORNER));
2449 SetDictInt("ACS_URCORNER", (ACS_URCORNER));
2450 SetDictInt("ACS_LRCORNER", (ACS_LRCORNER));
2451 SetDictInt("ACS_LTEE", (ACS_LTEE));
2452 SetDictInt("ACS_RTEE", (ACS_RTEE));
2453 SetDictInt("ACS_BTEE", (ACS_BTEE));
2454 SetDictInt("ACS_TTEE", (ACS_TTEE));
2455 SetDictInt("ACS_HLINE", (ACS_HLINE));
2456 SetDictInt("ACS_VLINE", (ACS_VLINE));
2457 SetDictInt("ACS_PLUS", (ACS_PLUS));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00002458#if !defined(__hpux) || defined(HAVE_NCURSES_H)
Victor Stinner26486ea2010-05-15 22:23:53 +00002459 /* On HP/UX 11, these are of type cchar_t, which is not an
2460 integral type. If this is a problem on more platforms, a
2461 configure test should be added to determine whether ACS_S1
2462 is of integral type. */
2463 SetDictInt("ACS_S1", (ACS_S1));
2464 SetDictInt("ACS_S9", (ACS_S9));
2465 SetDictInt("ACS_DIAMOND", (ACS_DIAMOND));
2466 SetDictInt("ACS_CKBOARD", (ACS_CKBOARD));
2467 SetDictInt("ACS_DEGREE", (ACS_DEGREE));
2468 SetDictInt("ACS_PLMINUS", (ACS_PLMINUS));
2469 SetDictInt("ACS_BULLET", (ACS_BULLET));
2470 SetDictInt("ACS_LARROW", (ACS_LARROW));
2471 SetDictInt("ACS_RARROW", (ACS_RARROW));
2472 SetDictInt("ACS_DARROW", (ACS_DARROW));
2473 SetDictInt("ACS_UARROW", (ACS_UARROW));
2474 SetDictInt("ACS_BOARD", (ACS_BOARD));
2475 SetDictInt("ACS_LANTERN", (ACS_LANTERN));
2476 SetDictInt("ACS_BLOCK", (ACS_BLOCK));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00002477#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002478 SetDictInt("ACS_BSSB", (ACS_ULCORNER));
2479 SetDictInt("ACS_SSBB", (ACS_LLCORNER));
2480 SetDictInt("ACS_BBSS", (ACS_URCORNER));
2481 SetDictInt("ACS_SBBS", (ACS_LRCORNER));
2482 SetDictInt("ACS_SBSS", (ACS_RTEE));
2483 SetDictInt("ACS_SSSB", (ACS_LTEE));
2484 SetDictInt("ACS_SSBS", (ACS_BTEE));
2485 SetDictInt("ACS_BSSS", (ACS_TTEE));
2486 SetDictInt("ACS_BSBS", (ACS_HLINE));
2487 SetDictInt("ACS_SBSB", (ACS_VLINE));
2488 SetDictInt("ACS_SSSS", (ACS_PLUS));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002489
Victor Stinner26486ea2010-05-15 22:23:53 +00002490 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002491#ifdef ACS_S3
Victor Stinner26486ea2010-05-15 22:23:53 +00002492 SetDictInt("ACS_S3", (ACS_S3));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002493#endif
2494#ifdef ACS_S7
Victor Stinner26486ea2010-05-15 22:23:53 +00002495 SetDictInt("ACS_S7", (ACS_S7));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002496#endif
2497#ifdef ACS_LEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002498 SetDictInt("ACS_LEQUAL", (ACS_LEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002499#endif
2500#ifdef ACS_GEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002501 SetDictInt("ACS_GEQUAL", (ACS_GEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002502#endif
2503#ifdef ACS_PI
Victor Stinner26486ea2010-05-15 22:23:53 +00002504 SetDictInt("ACS_PI", (ACS_PI));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002505#endif
2506#ifdef ACS_NEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002507 SetDictInt("ACS_NEQUAL", (ACS_NEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002508#endif
2509#ifdef ACS_STERLING
Victor Stinner26486ea2010-05-15 22:23:53 +00002510 SetDictInt("ACS_STERLING", (ACS_STERLING));
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002511#endif
2512
Victor Stinner26486ea2010-05-15 22:23:53 +00002513 SetDictInt("LINES", LINES);
2514 SetDictInt("COLS", COLS);
Guido van Rossum56bf2351994-08-31 22:06:24 +00002515
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002516 winobj = (PyCursesWindowObject *)PyCursesWindow_New(win, NULL);
2517 screen_encoding = winobj->encoding;
2518 return (PyObject *)winobj;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002519}
2520
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002521static PyObject *
2522PyCurses_setupterm(PyObject* self, PyObject *args, PyObject* keywds)
2523{
Victor Stinner26486ea2010-05-15 22:23:53 +00002524 int fd = -1;
2525 int err;
2526 char* termstr = NULL;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002527
Victor Stinner26486ea2010-05-15 22:23:53 +00002528 static char *kwlist[] = {"term", "fd", NULL};
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002529
Victor Stinner26486ea2010-05-15 22:23:53 +00002530 if (!PyArg_ParseTupleAndKeywords(
2531 args, keywds, "|zi:setupterm", kwlist, &termstr, &fd)) {
2532 return NULL;
2533 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002534
Victor Stinner26486ea2010-05-15 22:23:53 +00002535 if (fd == -1) {
2536 PyObject* sys_stdout;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002537
Victor Stinnerbd303c12013-11-07 23:07:29 +01002538 sys_stdout = PySys_GetObject("stdout");
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002539
Victor Stinner26486ea2010-05-15 22:23:53 +00002540 if (sys_stdout == NULL || sys_stdout == Py_None) {
2541 PyErr_SetString(
2542 PyCursesError,
2543 "lost sys.stdout");
2544 return NULL;
2545 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002546
Victor Stinner26486ea2010-05-15 22:23:53 +00002547 fd = PyObject_AsFileDescriptor(sys_stdout);
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002548
Victor Stinner26486ea2010-05-15 22:23:53 +00002549 if (fd == -1) {
2550 return NULL;
2551 }
2552 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002553
Matthias Klose635edd12010-07-30 21:40:57 +00002554 if (!initialised_setupterm && setupterm(termstr,fd,&err) == ERR) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002555 char* s = "setupterm: unknown error";
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002556
Victor Stinner26486ea2010-05-15 22:23:53 +00002557 if (err == 0) {
2558 s = "setupterm: could not find terminal";
2559 } else if (err == -1) {
2560 s = "setupterm: could not find terminfo database";
2561 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002562
Victor Stinner26486ea2010-05-15 22:23:53 +00002563 PyErr_SetString(PyCursesError,s);
2564 return NULL;
2565 }
2566
2567 initialised_setupterm = TRUE;
2568
2569 Py_INCREF(Py_None);
2570 return Py_None;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002571}
Guido van Rossumf6971e21994-08-30 12:25:20 +00002572
2573static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002574PyCurses_IntrFlush(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002575{
Victor Stinner26486ea2010-05-15 22:23:53 +00002576 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002577
Victor Stinner26486ea2010-05-15 22:23:53 +00002578 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002579
Victor Stinner26486ea2010-05-15 22:23:53 +00002580 switch(PyTuple_Size(args)) {
2581 case 1:
2582 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
2583 break;
2584 default:
2585 PyErr_SetString(PyExc_TypeError, "intrflush requires 1 argument");
2586 return NULL;
2587 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002588
Victor Stinner26486ea2010-05-15 22:23:53 +00002589 return PyCursesCheckERR(intrflush(NULL,ch), "intrflush");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002590}
2591
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002592#ifdef HAVE_CURSES_IS_TERM_RESIZED
2593static PyObject *
2594PyCurses_Is_Term_Resized(PyObject *self, PyObject *args)
2595{
Victor Stinner26486ea2010-05-15 22:23:53 +00002596 int lines;
2597 int columns;
2598 int result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002599
Victor Stinner26486ea2010-05-15 22:23:53 +00002600 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002601
Victor Stinner26486ea2010-05-15 22:23:53 +00002602 if (!PyArg_ParseTuple(args,"ii:is_term_resized", &lines, &columns))
2603 return NULL;
2604 result = is_term_resized(lines, columns);
2605 if (result == TRUE) {
2606 Py_INCREF(Py_True);
2607 return Py_True;
2608 } else {
2609 Py_INCREF(Py_False);
2610 return Py_False;
2611 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002612}
2613#endif /* HAVE_CURSES_IS_TERM_RESIZED */
2614
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002615#if !defined(__NetBSD__)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002616static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002617PyCurses_KeyName(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002618{
Victor Stinner26486ea2010-05-15 22:23:53 +00002619 const char *knp;
2620 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002621
Victor Stinner26486ea2010-05-15 22:23:53 +00002622 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002623
Victor Stinner26486ea2010-05-15 22:23:53 +00002624 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002625
Victor Stinner26486ea2010-05-15 22:23:53 +00002626 if (ch < 0) {
2627 PyErr_SetString(PyExc_ValueError, "invalid key number");
2628 return NULL;
2629 }
2630 knp = keyname(ch);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002631
Serhiy Storchaka20b39b22014-09-28 11:27:24 +03002632 return PyBytes_FromString((knp == NULL) ? "" : knp);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002633}
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002634#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002635
Victor Stinner26486ea2010-05-15 22:23:53 +00002636static PyObject *
2637PyCurses_KillChar(PyObject *self)
2638{
2639 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002640
Victor Stinner26486ea2010-05-15 22:23:53 +00002641 ch = killchar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002642
Victor Stinner26486ea2010-05-15 22:23:53 +00002643 return PyBytes_FromStringAndSize(&ch, 1);
2644}
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002645
2646static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002647PyCurses_Meta(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002648{
Victor Stinner26486ea2010-05-15 22:23:53 +00002649 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002650
Victor Stinner26486ea2010-05-15 22:23:53 +00002651 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002652
Victor Stinner26486ea2010-05-15 22:23:53 +00002653 switch(PyTuple_Size(args)) {
2654 case 1:
2655 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
2656 break;
2657 default:
2658 PyErr_SetString(PyExc_TypeError, "meta requires 1 argument");
2659 return NULL;
2660 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002661
Victor Stinner26486ea2010-05-15 22:23:53 +00002662 return PyCursesCheckERR(meta(stdscr, ch), "meta");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002663}
2664
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002665#ifdef NCURSES_MOUSE_VERSION
2666static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002667PyCurses_MouseInterval(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002668{
Victor Stinner26486ea2010-05-15 22:23:53 +00002669 int interval;
2670 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002671
Victor Stinner26486ea2010-05-15 22:23:53 +00002672 if (!PyArg_ParseTuple(args,"i;interval",&interval))
2673 return NULL;
2674 return PyCursesCheckERR(mouseinterval(interval), "mouseinterval");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002675}
2676
2677static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002678PyCurses_MouseMask(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002679{
Victor Stinner26486ea2010-05-15 22:23:53 +00002680 int newmask;
2681 mmask_t oldmask, availmask;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002682
Victor Stinner26486ea2010-05-15 22:23:53 +00002683 PyCursesInitialised;
2684 if (!PyArg_ParseTuple(args,"i;mousemask",&newmask))
2685 return NULL;
2686 availmask = mousemask(newmask, &oldmask);
2687 return Py_BuildValue("(ll)", (long)availmask, (long)oldmask);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002688}
2689#endif
2690
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002691static PyObject *
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002692PyCurses_Napms(PyObject *self, PyObject *args)
2693{
2694 int ms;
2695
Andrew M. Kuchling2b146762010-05-10 23:30:25 +00002696 PyCursesInitialised;
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002697 if (!PyArg_ParseTuple(args, "i;ms", &ms)) return NULL;
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002698
2699 return Py_BuildValue("i", napms(ms));
2700}
2701
2702
2703static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002704PyCurses_NewPad(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002705{
Victor Stinner26486ea2010-05-15 22:23:53 +00002706 WINDOW *win;
2707 int nlines, ncols;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002708
Victor Stinner26486ea2010-05-15 22:23:53 +00002709 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002710
Victor Stinner26486ea2010-05-15 22:23:53 +00002711 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002712
Victor Stinner26486ea2010-05-15 22:23:53 +00002713 win = newpad(nlines, ncols);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002714
Victor Stinner26486ea2010-05-15 22:23:53 +00002715 if (win == NULL) {
2716 PyErr_SetString(PyCursesError, catchall_NULL);
2717 return NULL;
2718 }
2719
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002720 return (PyObject *)PyCursesWindow_New(win, NULL);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002721}
2722
2723static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002724PyCurses_NewWindow(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002725{
Victor Stinner26486ea2010-05-15 22:23:53 +00002726 WINDOW *win;
2727 int nlines, ncols, begin_y=0, begin_x=0;
Guido van Rossum85738471995-02-17 13:50:17 +00002728
Victor Stinner26486ea2010-05-15 22:23:53 +00002729 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002730
Victor Stinner26486ea2010-05-15 22:23:53 +00002731 switch (PyTuple_Size(args)) {
2732 case 2:
2733 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols))
2734 return NULL;
2735 break;
2736 case 4:
2737 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
2738 &nlines,&ncols,&begin_y,&begin_x))
2739 return NULL;
2740 break;
2741 default:
2742 PyErr_SetString(PyExc_TypeError, "newwin requires 2 or 4 arguments");
2743 return NULL;
2744 }
Guido van Rossum85738471995-02-17 13:50:17 +00002745
Victor Stinner26486ea2010-05-15 22:23:53 +00002746 win = newwin(nlines,ncols,begin_y,begin_x);
2747 if (win == NULL) {
2748 PyErr_SetString(PyCursesError, catchall_NULL);
2749 return NULL;
2750 }
Guido van Rossum85738471995-02-17 13:50:17 +00002751
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002752 return (PyObject *)PyCursesWindow_New(win, NULL);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002753}
2754
2755static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002756PyCurses_Pair_Content(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002757{
Victor Stinner26486ea2010-05-15 22:23:53 +00002758 short pair,f,b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002759
Victor Stinner26486ea2010-05-15 22:23:53 +00002760 PyCursesInitialised;
2761 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002762
Victor Stinner26486ea2010-05-15 22:23:53 +00002763 switch(PyTuple_Size(args)) {
2764 case 1:
2765 if (!PyArg_ParseTuple(args, "h;pair", &pair)) return NULL;
2766 break;
2767 default:
2768 PyErr_SetString(PyExc_TypeError, "pair_content requires 1 argument");
2769 return NULL;
2770 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002771
Victor Stinner26486ea2010-05-15 22:23:53 +00002772 if (pair_content(pair, &f, &b)==ERR) {
2773 PyErr_SetString(PyCursesError,
2774 "Argument 1 was out of range. (1..COLOR_PAIRS-1)");
2775 return NULL;
2776 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002777
Victor Stinner26486ea2010-05-15 22:23:53 +00002778 return Py_BuildValue("(ii)", f, b);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002779}
2780
2781static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002782PyCurses_pair_number(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002783{
Victor Stinner26486ea2010-05-15 22:23:53 +00002784 int n;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002785
Victor Stinner26486ea2010-05-15 22:23:53 +00002786 PyCursesInitialised;
2787 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002788
Victor Stinner26486ea2010-05-15 22:23:53 +00002789 switch(PyTuple_Size(args)) {
2790 case 1:
2791 if (!PyArg_ParseTuple(args, "i;pairvalue", &n)) return NULL;
2792 break;
2793 default:
2794 PyErr_SetString(PyExc_TypeError,
2795 "pair_number requires 1 argument");
2796 return NULL;
2797 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002798
Victor Stinner26486ea2010-05-15 22:23:53 +00002799 return PyLong_FromLong((long) ((n & A_COLOR) >> 8));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002800}
2801
2802static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002803PyCurses_Putp(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002804{
Victor Stinner26486ea2010-05-15 22:23:53 +00002805 char *str;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002806
Victor Stinnerb3bc7e72011-11-03 20:35:40 +01002807 if (!PyArg_ParseTuple(args,"y;str", &str))
2808 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002809 return PyCursesCheckERR(putp(str), "putp");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002810}
2811
2812static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002813PyCurses_QiFlush(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002814{
Victor Stinner26486ea2010-05-15 22:23:53 +00002815 int flag = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002816
Victor Stinner26486ea2010-05-15 22:23:53 +00002817 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002818
Victor Stinner26486ea2010-05-15 22:23:53 +00002819 switch(PyTuple_Size(args)) {
2820 case 0:
2821 qiflush();
2822 Py_INCREF(Py_None);
2823 return Py_None;
2824 case 1:
2825 if (!PyArg_ParseTuple(args, "i;True(1) or False(0)", &flag)) return NULL;
2826 if (flag) qiflush();
2827 else noqiflush();
2828 Py_INCREF(Py_None);
2829 return Py_None;
2830 default:
2831 PyErr_SetString(PyExc_TypeError, "qiflush requires 0 or 1 arguments");
2832 return NULL;
2833 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002834}
2835
Guido van Rossumd8faa362007-04-27 19:54:29 +00002836/* Internal helper used for updating curses.LINES, curses.COLS, _curses.LINES
2837 * and _curses.COLS */
Benjamin Petersonfea6a942008-07-02 16:11:42 +00002838#if defined(HAVE_CURSES_RESIZETERM) || defined(HAVE_CURSES_RESIZE_TERM)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002839static int
2840update_lines_cols(void)
2841{
Victor Stinner26486ea2010-05-15 22:23:53 +00002842 PyObject *o;
2843 PyObject *m = PyImport_ImportModuleNoBlock("curses");
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002844 _Py_IDENTIFIER(LINES);
2845 _Py_IDENTIFIER(COLS);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002846
Victor Stinner26486ea2010-05-15 22:23:53 +00002847 if (!m)
2848 return 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002849
Victor Stinner26486ea2010-05-15 22:23:53 +00002850 o = PyLong_FromLong(LINES);
2851 if (!o) {
2852 Py_DECREF(m);
2853 return 0;
2854 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002855 if (_PyObject_SetAttrId(m, &PyId_LINES, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002856 Py_DECREF(m);
2857 Py_DECREF(o);
2858 return 0;
2859 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002860 /* PyId_LINES.object will be initialized here. */
2861 if (PyDict_SetItem(ModDict, PyId_LINES.object, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002862 Py_DECREF(m);
2863 Py_DECREF(o);
2864 return 0;
2865 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002866 Py_DECREF(o);
Victor Stinner26486ea2010-05-15 22:23:53 +00002867 o = PyLong_FromLong(COLS);
2868 if (!o) {
2869 Py_DECREF(m);
2870 return 0;
2871 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002872 if (_PyObject_SetAttrId(m, &PyId_COLS, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002873 Py_DECREF(m);
2874 Py_DECREF(o);
2875 return 0;
2876 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002877 if (PyDict_SetItem(ModDict, PyId_COLS.object, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002878 Py_DECREF(m);
2879 Py_DECREF(o);
2880 return 0;
2881 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002882 Py_DECREF(o);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002883 Py_DECREF(m);
Victor Stinner26486ea2010-05-15 22:23:53 +00002884 return 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002885}
Steve Dowerd2bc3892015-04-15 18:06:05 -04002886
2887static PyObject *
2888PyCurses_update_lines_cols(PyObject *self)
2889{
2890 return PyLong_FromLong((long) update_lines_cols());
2891}
2892
Benjamin Petersonfea6a942008-07-02 16:11:42 +00002893#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00002894
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002895#ifdef HAVE_CURSES_RESIZETERM
2896static PyObject *
2897PyCurses_ResizeTerm(PyObject *self, PyObject *args)
2898{
Victor Stinner26486ea2010-05-15 22:23:53 +00002899 int lines;
2900 int columns;
2901 PyObject *result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002902
Victor Stinner26486ea2010-05-15 22:23:53 +00002903 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002904
Victor Stinner26486ea2010-05-15 22:23:53 +00002905 if (!PyArg_ParseTuple(args,"ii:resizeterm", &lines, &columns))
2906 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002907
Victor Stinner26486ea2010-05-15 22:23:53 +00002908 result = PyCursesCheckERR(resizeterm(lines, columns), "resizeterm");
2909 if (!result)
2910 return NULL;
2911 if (!update_lines_cols())
2912 return NULL;
2913 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002914}
2915
2916#endif
2917
2918#ifdef HAVE_CURSES_RESIZE_TERM
2919static PyObject *
2920PyCurses_Resize_Term(PyObject *self, PyObject *args)
2921{
Victor Stinner26486ea2010-05-15 22:23:53 +00002922 int lines;
2923 int columns;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002924
Victor Stinner26486ea2010-05-15 22:23:53 +00002925 PyObject *result;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002926
Victor Stinner26486ea2010-05-15 22:23:53 +00002927 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002928
Victor Stinner26486ea2010-05-15 22:23:53 +00002929 if (!PyArg_ParseTuple(args,"ii:resize_term", &lines, &columns))
2930 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002931
Victor Stinner26486ea2010-05-15 22:23:53 +00002932 result = PyCursesCheckERR(resize_term(lines, columns), "resize_term");
2933 if (!result)
2934 return NULL;
2935 if (!update_lines_cols())
2936 return NULL;
2937 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002938}
2939#endif /* HAVE_CURSES_RESIZE_TERM */
2940
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002941static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002942PyCurses_setsyx(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002943{
Victor Stinner26486ea2010-05-15 22:23:53 +00002944 int y,x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002945
Victor Stinner26486ea2010-05-15 22:23:53 +00002946 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002947
Victor Stinner26486ea2010-05-15 22:23:53 +00002948 if (PyTuple_Size(args)!=2) {
2949 PyErr_SetString(PyExc_TypeError, "setsyx requires 2 arguments");
2950 return NULL;
2951 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002952
Victor Stinner26486ea2010-05-15 22:23:53 +00002953 if (!PyArg_ParseTuple(args, "ii;y, x", &y, &x)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002954
Victor Stinner26486ea2010-05-15 22:23:53 +00002955 setsyx(y,x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002956
Victor Stinner26486ea2010-05-15 22:23:53 +00002957 Py_INCREF(Py_None);
2958 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002959}
2960
2961static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002962PyCurses_Start_Color(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002963{
Victor Stinner26486ea2010-05-15 22:23:53 +00002964 int code;
2965 PyObject *c, *cp;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002966
Victor Stinner26486ea2010-05-15 22:23:53 +00002967 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002968
Victor Stinner26486ea2010-05-15 22:23:53 +00002969 code = start_color();
2970 if (code != ERR) {
2971 initialisedcolors = TRUE;
2972 c = PyLong_FromLong((long) COLORS);
Christian Heimesa956e642013-07-26 14:45:37 +02002973 if (c == NULL)
2974 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002975 PyDict_SetItemString(ModDict, "COLORS", c);
2976 Py_DECREF(c);
2977 cp = PyLong_FromLong((long) COLOR_PAIRS);
Christian Heimesa956e642013-07-26 14:45:37 +02002978 if (cp == NULL)
2979 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002980 PyDict_SetItemString(ModDict, "COLOR_PAIRS", cp);
2981 Py_DECREF(cp);
2982 Py_INCREF(Py_None);
2983 return Py_None;
2984 } else {
2985 PyErr_SetString(PyCursesError, "start_color() returned ERR");
2986 return NULL;
2987 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002988}
2989
2990static PyObject *
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002991PyCurses_tigetflag(PyObject *self, PyObject *args)
2992{
Victor Stinner26486ea2010-05-15 22:23:53 +00002993 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002994
Victor Stinner26486ea2010-05-15 22:23:53 +00002995 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002996
Victor Stinner26486ea2010-05-15 22:23:53 +00002997 if (!PyArg_ParseTuple(args, "s", &capname))
2998 return NULL;
2999
3000 return PyLong_FromLong( (long) tigetflag( capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003001}
3002
3003static PyObject *
3004PyCurses_tigetnum(PyObject *self, PyObject *args)
3005{
Victor Stinner26486ea2010-05-15 22:23:53 +00003006 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003007
Victor Stinner26486ea2010-05-15 22:23:53 +00003008 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003009
Victor Stinner26486ea2010-05-15 22:23:53 +00003010 if (!PyArg_ParseTuple(args, "s", &capname))
3011 return NULL;
3012
3013 return PyLong_FromLong( (long) tigetnum( capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003014}
3015
3016static PyObject *
3017PyCurses_tigetstr(PyObject *self, PyObject *args)
3018{
Victor Stinner26486ea2010-05-15 22:23:53 +00003019 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003020
Victor Stinner26486ea2010-05-15 22:23:53 +00003021 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003022
Victor Stinner26486ea2010-05-15 22:23:53 +00003023 if (!PyArg_ParseTuple(args, "s", &capname))
3024 return NULL;
3025
3026 capname = tigetstr( capname );
3027 if (capname == 0 || capname == (char*) -1) {
3028 Py_INCREF(Py_None);
3029 return Py_None;
3030 }
3031 return PyBytes_FromString( capname );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003032}
3033
3034static PyObject *
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003035PyCurses_tparm(PyObject *self, PyObject *args)
3036{
Victor Stinner26486ea2010-05-15 22:23:53 +00003037 char* fmt;
3038 char* result = NULL;
3039 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 +00003040
Victor Stinner26486ea2010-05-15 22:23:53 +00003041 PyCursesSetupTermCalled;
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003042
Victor Stinner26621332011-11-02 23:45:29 +01003043 if (!PyArg_ParseTuple(args, "y|iiiiiiiii:tparm",
Victor Stinner26486ea2010-05-15 22:23:53 +00003044 &fmt, &i1, &i2, &i3, &i4,
3045 &i5, &i6, &i7, &i8, &i9)) {
3046 return NULL;
3047 }
Michael W. Hudson21007982002-11-21 14:17:51 +00003048
Victor Stinner26486ea2010-05-15 22:23:53 +00003049 result = tparm(fmt,i1,i2,i3,i4,i5,i6,i7,i8,i9);
3050 if (!result) {
3051 PyErr_SetString(PyCursesError, "tparm() returned NULL");
3052 return NULL;
3053 }
Michael W. Hudson21007982002-11-21 14:17:51 +00003054
Victor Stinner26486ea2010-05-15 22:23:53 +00003055 return PyBytes_FromString(result);
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003056}
3057
3058static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003059PyCurses_TypeAhead(PyObject *self, PyObject *args)
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003060{
Victor Stinner26486ea2010-05-15 22:23:53 +00003061 int fd;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003062
Victor Stinner26486ea2010-05-15 22:23:53 +00003063 PyCursesInitialised;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003064
Victor Stinner26486ea2010-05-15 22:23:53 +00003065 if (!PyArg_ParseTuple(args,"i;fd",&fd)) return NULL;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003066
Victor Stinner26486ea2010-05-15 22:23:53 +00003067 return PyCursesCheckERR(typeahead( fd ), "typeahead");
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003068}
3069
3070static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003071PyCurses_UnCtrl(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003072{
Victor Stinner26486ea2010-05-15 22:23:53 +00003073 PyObject *temp;
3074 chtype ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003075
Victor Stinner26486ea2010-05-15 22:23:53 +00003076 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003077
Victor Stinner26486ea2010-05-15 22:23:53 +00003078 if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003079
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003080 if (!PyCurses_ConvertToChtype(NULL, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00003081 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003082
Victor Stinner26486ea2010-05-15 22:23:53 +00003083 return PyBytes_FromString(unctrl(ch));
Guido van Rossumf6971e21994-08-30 12:25:20 +00003084}
3085
3086static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003087PyCurses_UngetCh(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003088{
Victor Stinner26486ea2010-05-15 22:23:53 +00003089 PyObject *temp;
3090 chtype ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003091
Victor Stinner26486ea2010-05-15 22:23:53 +00003092 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003093
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003094 if (!PyArg_ParseTuple(args,"O;ch or int",&temp))
Victor Stinner26486ea2010-05-15 22:23:53 +00003095 return NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003096
3097 if (!PyCurses_ConvertToChtype(NULL, temp, &ch))
3098 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003099
Victor Stinner26486ea2010-05-15 22:23:53 +00003100 return PyCursesCheckERR(ungetch(ch), "ungetch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00003101}
3102
Victor Stinner71e44cb2011-09-06 01:53:03 +02003103#ifdef HAVE_NCURSESW
3104/* Convert an object to a character (wchar_t):
3105
3106 - int
3107 - str of length 1
3108
3109 Return 1 on success, 0 on error. */
3110static int
3111PyCurses_ConvertToWchar_t(PyObject *obj,
3112 wchar_t *wch)
3113{
3114 if (PyUnicode_Check(obj)) {
3115 wchar_t buffer[2];
3116 if (PyUnicode_AsWideChar(obj, buffer, 2) != 1) {
3117 PyErr_Format(PyExc_TypeError,
3118 "expect bytes or str of length 1, or int, "
3119 "got a str of length %zi",
Victor Stinnerc4f281e2011-10-11 22:11:42 +02003120 PyUnicode_GET_LENGTH(obj));
Victor Stinner71e44cb2011-09-06 01:53:03 +02003121 return 0;
3122 }
3123 *wch = buffer[0];
3124 return 2;
3125 }
3126 else if (PyLong_CheckExact(obj)) {
3127 long value;
3128 int overflow;
3129 value = PyLong_AsLongAndOverflow(obj, &overflow);
3130 if (overflow) {
3131 PyErr_SetString(PyExc_OverflowError,
3132 "int doesn't fit in long");
3133 return 0;
3134 }
3135 *wch = (wchar_t)value;
3136 if ((long)*wch != value) {
3137 PyErr_Format(PyExc_OverflowError,
3138 "character doesn't fit in wchar_t");
3139 return 0;
3140 }
3141 return 1;
3142 }
3143 else {
3144 PyErr_Format(PyExc_TypeError,
3145 "expect bytes or str of length 1, or int, got %s",
3146 Py_TYPE(obj)->tp_name);
3147 return 0;
3148 }
3149}
3150
3151static PyObject *
3152PyCurses_Unget_Wch(PyObject *self, PyObject *args)
3153{
3154 PyObject *obj;
3155 wchar_t wch;
3156
3157 PyCursesInitialised;
3158
3159 if (!PyArg_ParseTuple(args,"O", &obj))
3160 return NULL;
3161
3162 if (!PyCurses_ConvertToWchar_t(obj, &wch))
3163 return NULL;
3164 return PyCursesCheckERR(unget_wch(wch), "unget_wch");
3165}
3166#endif
3167
Guido van Rossumf6971e21994-08-30 12:25:20 +00003168static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003169PyCurses_Use_Env(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003170{
Victor Stinner26486ea2010-05-15 22:23:53 +00003171 int flag;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003172
Victor Stinner26486ea2010-05-15 22:23:53 +00003173 switch(PyTuple_Size(args)) {
3174 case 1:
3175 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&flag))
3176 return NULL;
3177 break;
3178 default:
3179 PyErr_SetString(PyExc_TypeError, "use_env requires 1 argument");
3180 return NULL;
3181 }
3182 use_env(flag);
3183 Py_INCREF(Py_None);
3184 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003185}
3186
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003187#ifndef STRICT_SYSV_CURSES
3188static PyObject *
3189PyCurses_Use_Default_Colors(PyObject *self)
3190{
Victor Stinner26486ea2010-05-15 22:23:53 +00003191 int code;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003192
Victor Stinner26486ea2010-05-15 22:23:53 +00003193 PyCursesInitialised;
3194 PyCursesInitialisedColor;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003195
Victor Stinner26486ea2010-05-15 22:23:53 +00003196 code = use_default_colors();
3197 if (code != ERR) {
3198 Py_INCREF(Py_None);
3199 return Py_None;
3200 } else {
3201 PyErr_SetString(PyCursesError, "use_default_colors() returned ERR");
3202 return NULL;
3203 }
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003204}
3205#endif /* STRICT_SYSV_CURSES */
3206
Guido van Rossumf6971e21994-08-30 12:25:20 +00003207/* List of functions defined in the module */
3208
3209static PyMethodDef PyCurses_methods[] = {
Victor Stinner26486ea2010-05-15 22:23:53 +00003210 {"baudrate", (PyCFunction)PyCurses_baudrate, METH_NOARGS},
3211 {"beep", (PyCFunction)PyCurses_beep, METH_NOARGS},
3212 {"can_change_color", (PyCFunction)PyCurses_can_change_color, METH_NOARGS},
3213 {"cbreak", (PyCFunction)PyCurses_cbreak, METH_VARARGS},
3214 {"color_content", (PyCFunction)PyCurses_Color_Content, METH_VARARGS},
3215 {"color_pair", (PyCFunction)PyCurses_color_pair, METH_VARARGS},
3216 {"curs_set", (PyCFunction)PyCurses_Curs_Set, METH_VARARGS},
3217 {"def_prog_mode", (PyCFunction)PyCurses_def_prog_mode, METH_NOARGS},
3218 {"def_shell_mode", (PyCFunction)PyCurses_def_shell_mode, METH_NOARGS},
3219 {"delay_output", (PyCFunction)PyCurses_Delay_Output, METH_VARARGS},
3220 {"doupdate", (PyCFunction)PyCurses_doupdate, METH_NOARGS},
3221 {"echo", (PyCFunction)PyCurses_echo, METH_VARARGS},
3222 {"endwin", (PyCFunction)PyCurses_endwin, METH_NOARGS},
3223 {"erasechar", (PyCFunction)PyCurses_EraseChar, METH_NOARGS},
3224 {"filter", (PyCFunction)PyCurses_filter, METH_NOARGS},
3225 {"flash", (PyCFunction)PyCurses_flash, METH_NOARGS},
3226 {"flushinp", (PyCFunction)PyCurses_flushinp, METH_NOARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003227#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003228 {"getmouse", (PyCFunction)PyCurses_GetMouse, METH_NOARGS},
3229 {"ungetmouse", (PyCFunction)PyCurses_UngetMouse, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003230#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003231 {"getsyx", (PyCFunction)PyCurses_getsyx, METH_NOARGS},
3232 {"getwin", (PyCFunction)PyCurses_GetWin, METH_O},
3233 {"has_colors", (PyCFunction)PyCurses_has_colors, METH_NOARGS},
3234 {"has_ic", (PyCFunction)PyCurses_has_ic, METH_NOARGS},
3235 {"has_il", (PyCFunction)PyCurses_has_il, METH_NOARGS},
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00003236#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00003237 {"has_key", (PyCFunction)PyCurses_has_key, METH_VARARGS},
Guido van Rossumf6971e21994-08-30 12:25:20 +00003238#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003239 {"halfdelay", (PyCFunction)PyCurses_HalfDelay, METH_VARARGS},
3240 {"init_color", (PyCFunction)PyCurses_Init_Color, METH_VARARGS},
3241 {"init_pair", (PyCFunction)PyCurses_Init_Pair, METH_VARARGS},
3242 {"initscr", (PyCFunction)PyCurses_InitScr, METH_NOARGS},
3243 {"intrflush", (PyCFunction)PyCurses_IntrFlush, METH_VARARGS},
3244 {"isendwin", (PyCFunction)PyCurses_isendwin, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003245#ifdef HAVE_CURSES_IS_TERM_RESIZED
Victor Stinner26486ea2010-05-15 22:23:53 +00003246 {"is_term_resized", (PyCFunction)PyCurses_Is_Term_Resized, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003247#endif
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003248#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003249 {"keyname", (PyCFunction)PyCurses_KeyName, METH_VARARGS},
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003250#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003251 {"killchar", (PyCFunction)PyCurses_KillChar, METH_NOARGS},
3252 {"longname", (PyCFunction)PyCurses_longname, METH_NOARGS},
3253 {"meta", (PyCFunction)PyCurses_Meta, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003254#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003255 {"mouseinterval", (PyCFunction)PyCurses_MouseInterval, METH_VARARGS},
3256 {"mousemask", (PyCFunction)PyCurses_MouseMask, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003257#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003258 {"napms", (PyCFunction)PyCurses_Napms, METH_VARARGS},
3259 {"newpad", (PyCFunction)PyCurses_NewPad, METH_VARARGS},
3260 {"newwin", (PyCFunction)PyCurses_NewWindow, METH_VARARGS},
3261 {"nl", (PyCFunction)PyCurses_nl, METH_VARARGS},
3262 {"nocbreak", (PyCFunction)PyCurses_nocbreak, METH_NOARGS},
3263 {"noecho", (PyCFunction)PyCurses_noecho, METH_NOARGS},
3264 {"nonl", (PyCFunction)PyCurses_nonl, METH_NOARGS},
3265 {"noqiflush", (PyCFunction)PyCurses_noqiflush, METH_NOARGS},
3266 {"noraw", (PyCFunction)PyCurses_noraw, METH_NOARGS},
3267 {"pair_content", (PyCFunction)PyCurses_Pair_Content, METH_VARARGS},
3268 {"pair_number", (PyCFunction)PyCurses_pair_number, METH_VARARGS},
3269 {"putp", (PyCFunction)PyCurses_Putp, METH_VARARGS},
3270 {"qiflush", (PyCFunction)PyCurses_QiFlush, METH_VARARGS},
3271 {"raw", (PyCFunction)PyCurses_raw, METH_VARARGS},
3272 {"reset_prog_mode", (PyCFunction)PyCurses_reset_prog_mode, METH_NOARGS},
3273 {"reset_shell_mode", (PyCFunction)PyCurses_reset_shell_mode, METH_NOARGS},
3274 {"resetty", (PyCFunction)PyCurses_resetty, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003275#ifdef HAVE_CURSES_RESIZETERM
Victor Stinner26486ea2010-05-15 22:23:53 +00003276 {"resizeterm", (PyCFunction)PyCurses_ResizeTerm, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003277#endif
3278#ifdef HAVE_CURSES_RESIZE_TERM
Victor Stinner26486ea2010-05-15 22:23:53 +00003279 {"resize_term", (PyCFunction)PyCurses_Resize_Term, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003280#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003281 {"savetty", (PyCFunction)PyCurses_savetty, METH_NOARGS},
3282 {"setsyx", (PyCFunction)PyCurses_setsyx, METH_VARARGS},
3283 {"setupterm", (PyCFunction)PyCurses_setupterm,
3284 METH_VARARGS|METH_KEYWORDS},
3285 {"start_color", (PyCFunction)PyCurses_Start_Color, METH_NOARGS},
3286 {"termattrs", (PyCFunction)PyCurses_termattrs, METH_NOARGS},
3287 {"termname", (PyCFunction)PyCurses_termname, METH_NOARGS},
3288 {"tigetflag", (PyCFunction)PyCurses_tigetflag, METH_VARARGS},
3289 {"tigetnum", (PyCFunction)PyCurses_tigetnum, METH_VARARGS},
3290 {"tigetstr", (PyCFunction)PyCurses_tigetstr, METH_VARARGS},
3291 {"tparm", (PyCFunction)PyCurses_tparm, METH_VARARGS},
3292 {"typeahead", (PyCFunction)PyCurses_TypeAhead, METH_VARARGS},
3293 {"unctrl", (PyCFunction)PyCurses_UnCtrl, METH_VARARGS},
3294 {"ungetch", (PyCFunction)PyCurses_UngetCh, METH_VARARGS},
Steve Dowerd2bc3892015-04-15 18:06:05 -04003295#if defined(HAVE_CURSES_RESIZETERM) || defined(HAVE_CURSES_RESIZE_TERM)
3296 {"update_lines_cols", (PyCFunction)PyCurses_update_lines_cols, METH_NOARGS},
3297#endif
Victor Stinner71e44cb2011-09-06 01:53:03 +02003298#ifdef HAVE_NCURSESW
3299 {"unget_wch", (PyCFunction)PyCurses_Unget_Wch, METH_VARARGS},
3300#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003301 {"use_env", (PyCFunction)PyCurses_Use_Env, METH_VARARGS},
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003302#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00003303 {"use_default_colors", (PyCFunction)PyCurses_Use_Default_Colors, METH_NOARGS},
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003304#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003305 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00003306};
3307
3308/* Initialization function for the module */
3309
Martin v. Löwis1a214512008-06-11 05:26:20 +00003310
3311static struct PyModuleDef _cursesmodule = {
Victor Stinner26486ea2010-05-15 22:23:53 +00003312 PyModuleDef_HEAD_INIT,
3313 "_curses",
3314 NULL,
3315 -1,
3316 PyCurses_methods,
3317 NULL,
3318 NULL,
3319 NULL,
3320 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00003321};
3322
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003323PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00003324PyInit__curses(void)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003325{
Victor Stinner26486ea2010-05-15 22:23:53 +00003326 PyObject *m, *d, *v, *c_api_object;
3327 static void *PyCurses_API[PyCurses_API_pointers];
Andrew M. Kuchling32552682000-12-22 21:52:27 +00003328
Victor Stinner26486ea2010-05-15 22:23:53 +00003329 /* Initialize object type */
3330 if (PyType_Ready(&PyCursesWindow_Type) < 0)
3331 return NULL;
Guido van Rossum6915c4d2001-01-19 00:28:08 +00003332
Victor Stinner26486ea2010-05-15 22:23:53 +00003333 /* Initialize the C API pointer array */
3334 PyCurses_API[0] = (void *)&PyCursesWindow_Type;
3335 PyCurses_API[1] = (void *)func_PyCursesSetupTermCalled;
3336 PyCurses_API[2] = (void *)func_PyCursesInitialised;
3337 PyCurses_API[3] = (void *)func_PyCursesInitialisedColor;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003338
Victor Stinner26486ea2010-05-15 22:23:53 +00003339 /* Create the module and add the functions */
3340 m = PyModule_Create(&_cursesmodule);
3341 if (m == NULL)
3342 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003343
Victor Stinner26486ea2010-05-15 22:23:53 +00003344 /* Add some symbolic constants to the module */
3345 d = PyModule_GetDict(m);
3346 if (d == NULL)
3347 return NULL;
3348 ModDict = d; /* For PyCurses_InitScr to use later */
Andrew M. Kuchling32552682000-12-22 21:52:27 +00003349
Victor Stinner26486ea2010-05-15 22:23:53 +00003350 /* Add a capsule for the C API */
3351 c_api_object = PyCapsule_New(PyCurses_API, PyCurses_CAPSULE_NAME, NULL);
3352 PyDict_SetItemString(d, "_C_API", c_api_object);
3353 Py_DECREF(c_api_object);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00003354
Victor Stinner26486ea2010-05-15 22:23:53 +00003355 /* For exception curses.error */
3356 PyCursesError = PyErr_NewException("_curses.error", NULL, NULL);
3357 PyDict_SetItemString(d, "error", PyCursesError);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00003358
Victor Stinner26486ea2010-05-15 22:23:53 +00003359 /* Make the version available */
3360 v = PyBytes_FromString(PyCursesVersion);
3361 PyDict_SetItemString(d, "version", v);
3362 PyDict_SetItemString(d, "__version__", v);
3363 Py_DECREF(v);
Guido van Rossumf6971e21994-08-30 12:25:20 +00003364
Victor Stinner26486ea2010-05-15 22:23:53 +00003365 SetDictInt("ERR", ERR);
3366 SetDictInt("OK", OK);
Andrew M. Kuchlingcaefb372000-12-26 15:57:01 +00003367
Victor Stinner26486ea2010-05-15 22:23:53 +00003368 /* Here are some attributes you can add to chars to print */
3369
3370 SetDictInt("A_ATTRIBUTES", A_ATTRIBUTES);
3371 SetDictInt("A_NORMAL", A_NORMAL);
3372 SetDictInt("A_STANDOUT", A_STANDOUT);
3373 SetDictInt("A_UNDERLINE", A_UNDERLINE);
3374 SetDictInt("A_REVERSE", A_REVERSE);
3375 SetDictInt("A_BLINK", A_BLINK);
3376 SetDictInt("A_DIM", A_DIM);
3377 SetDictInt("A_BOLD", A_BOLD);
3378 SetDictInt("A_ALTCHARSET", A_ALTCHARSET);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003379#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003380 SetDictInt("A_INVIS", A_INVIS);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003381#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003382 SetDictInt("A_PROTECT", A_PROTECT);
3383 SetDictInt("A_CHARTEXT", A_CHARTEXT);
3384 SetDictInt("A_COLOR", A_COLOR);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003385
Victor Stinner26486ea2010-05-15 22:23:53 +00003386 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003387#ifdef A_HORIZONTAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003388 SetDictInt("A_HORIZONTAL", A_HORIZONTAL);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003389#endif
3390#ifdef A_LEFT
Victor Stinner26486ea2010-05-15 22:23:53 +00003391 SetDictInt("A_LEFT", A_LEFT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003392#endif
3393#ifdef A_LOW
Victor Stinner26486ea2010-05-15 22:23:53 +00003394 SetDictInt("A_LOW", A_LOW);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003395#endif
3396#ifdef A_RIGHT
Victor Stinner26486ea2010-05-15 22:23:53 +00003397 SetDictInt("A_RIGHT", A_RIGHT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003398#endif
3399#ifdef A_TOP
Victor Stinner26486ea2010-05-15 22:23:53 +00003400 SetDictInt("A_TOP", A_TOP);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003401#endif
3402#ifdef A_VERTICAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003403 SetDictInt("A_VERTICAL", A_VERTICAL);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003404#endif
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00003405
Victor Stinner26486ea2010-05-15 22:23:53 +00003406 SetDictInt("COLOR_BLACK", COLOR_BLACK);
3407 SetDictInt("COLOR_RED", COLOR_RED);
3408 SetDictInt("COLOR_GREEN", COLOR_GREEN);
3409 SetDictInt("COLOR_YELLOW", COLOR_YELLOW);
3410 SetDictInt("COLOR_BLUE", COLOR_BLUE);
3411 SetDictInt("COLOR_MAGENTA", COLOR_MAGENTA);
3412 SetDictInt("COLOR_CYAN", COLOR_CYAN);
3413 SetDictInt("COLOR_WHITE", COLOR_WHITE);
Guido van Rossumf6971e21994-08-30 12:25:20 +00003414
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003415#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003416 /* Mouse-related constants */
3417 SetDictInt("BUTTON1_PRESSED", BUTTON1_PRESSED);
3418 SetDictInt("BUTTON1_RELEASED", BUTTON1_RELEASED);
3419 SetDictInt("BUTTON1_CLICKED", BUTTON1_CLICKED);
3420 SetDictInt("BUTTON1_DOUBLE_CLICKED", BUTTON1_DOUBLE_CLICKED);
3421 SetDictInt("BUTTON1_TRIPLE_CLICKED", BUTTON1_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003422
Victor Stinner26486ea2010-05-15 22:23:53 +00003423 SetDictInt("BUTTON2_PRESSED", BUTTON2_PRESSED);
3424 SetDictInt("BUTTON2_RELEASED", BUTTON2_RELEASED);
3425 SetDictInt("BUTTON2_CLICKED", BUTTON2_CLICKED);
3426 SetDictInt("BUTTON2_DOUBLE_CLICKED", BUTTON2_DOUBLE_CLICKED);
3427 SetDictInt("BUTTON2_TRIPLE_CLICKED", BUTTON2_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003428
Victor Stinner26486ea2010-05-15 22:23:53 +00003429 SetDictInt("BUTTON3_PRESSED", BUTTON3_PRESSED);
3430 SetDictInt("BUTTON3_RELEASED", BUTTON3_RELEASED);
3431 SetDictInt("BUTTON3_CLICKED", BUTTON3_CLICKED);
3432 SetDictInt("BUTTON3_DOUBLE_CLICKED", BUTTON3_DOUBLE_CLICKED);
3433 SetDictInt("BUTTON3_TRIPLE_CLICKED", BUTTON3_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003434
Victor Stinner26486ea2010-05-15 22:23:53 +00003435 SetDictInt("BUTTON4_PRESSED", BUTTON4_PRESSED);
3436 SetDictInt("BUTTON4_RELEASED", BUTTON4_RELEASED);
3437 SetDictInt("BUTTON4_CLICKED", BUTTON4_CLICKED);
3438 SetDictInt("BUTTON4_DOUBLE_CLICKED", BUTTON4_DOUBLE_CLICKED);
3439 SetDictInt("BUTTON4_TRIPLE_CLICKED", BUTTON4_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003440
Victor Stinner26486ea2010-05-15 22:23:53 +00003441 SetDictInt("BUTTON_SHIFT", BUTTON_SHIFT);
3442 SetDictInt("BUTTON_CTRL", BUTTON_CTRL);
3443 SetDictInt("BUTTON_ALT", BUTTON_ALT);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003444
Victor Stinner26486ea2010-05-15 22:23:53 +00003445 SetDictInt("ALL_MOUSE_EVENTS", ALL_MOUSE_EVENTS);
3446 SetDictInt("REPORT_MOUSE_POSITION", REPORT_MOUSE_POSITION);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003447#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003448 /* Now set everything up for KEY_ variables */
3449 {
3450 int key;
3451 char *key_n;
3452 char *key_n2;
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003453#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003454 for (key=KEY_MIN;key < KEY_MAX; key++) {
3455 key_n = (char *)keyname(key);
3456 if (key_n == NULL || strcmp(key_n,"UNKNOWN KEY")==0)
3457 continue;
3458 if (strncmp(key_n,"KEY_F(",6)==0) {
3459 char *p1, *p2;
Victor Stinnerb6404912013-07-07 16:21:41 +02003460 key_n2 = PyMem_Malloc(strlen(key_n)+1);
Victor Stinner26486ea2010-05-15 22:23:53 +00003461 if (!key_n2) {
3462 PyErr_NoMemory();
3463 break;
3464 }
3465 p1 = key_n;
3466 p2 = key_n2;
3467 while (*p1) {
3468 if (*p1 != '(' && *p1 != ')') {
3469 *p2 = *p1;
3470 p2++;
3471 }
3472 p1++;
3473 }
3474 *p2 = (char)0;
3475 } else
3476 key_n2 = key_n;
3477 SetDictInt(key_n2,key);
3478 if (key_n2 != key_n)
Victor Stinnerb6404912013-07-07 16:21:41 +02003479 PyMem_Free(key_n2);
Victor Stinner26486ea2010-05-15 22:23:53 +00003480 }
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003481#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003482 SetDictInt("KEY_MIN", KEY_MIN);
3483 SetDictInt("KEY_MAX", KEY_MAX);
3484 }
3485 return m;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003486}