blob: 42f4a85e356c44c8efb2ef8fcfff01931693f054 [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
Serhiy Storchakae2f92de2017-11-11 13:06:26 +020099static const char 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
Serhiy Storchakabaac01e2017-10-31 13:56:44 +0200115#if defined(HAVE_TERM_H) || defined(__sgi)
116/* For termname, longname, putp, tigetflag, tigetnum, tigetstr, tparm
117 which are not declared in SysV curses and for setupterm. */
Fred Drake0368bc42001-07-19 20:48:32 +0000118#include <term.h>
Serhiy Storchakabaac01e2017-10-31 13:56:44 +0200119/* Including <term.h> #defines many common symbols. */
120#undef lines
121#undef columns
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) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200191 Py_RETURN_NONE;
Guido van Rossum85738471995-02-17 13:50:17 +0000192 } else {
Victor Stinner26486ea2010-05-15 22:23:53 +0000193 if (fname == NULL) {
194 PyErr_SetString(PyCursesError, catchall_ERR);
195 } else {
196 PyErr_Format(PyCursesError, "%s() returned ERR", fname);
197 }
198 return NULL;
Guido van Rossum85738471995-02-17 13:50:17 +0000199 }
Guido van Rossum85738471995-02-17 13:50:17 +0000200}
201
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100202/* Convert an object to a byte (an integer of type chtype):
203
204 - int
205 - bytes of length 1
206 - str of length 1
207
208 Return 1 on success, 0 on error (invalid type or integer overflow). */
Victor Stinner26486ea2010-05-15 22:23:53 +0000209static int
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100210PyCurses_ConvertToChtype(PyCursesWindowObject *win, PyObject *obj, chtype *ch)
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000211{
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100212 long value;
213 if(PyBytes_Check(obj) && PyBytes_Size(obj) == 1) {
214 value = (unsigned char)PyBytes_AsString(obj)[0];
215 }
216 else if (PyUnicode_Check(obj)) {
217 if (PyUnicode_GetLength(obj) != 1) {
218 PyErr_Format(PyExc_TypeError,
219 "expect bytes or str of length 1, or int, "
220 "got a str of length %zi",
221 PyUnicode_GET_LENGTH(obj));
Victor Stinner26486ea2010-05-15 22:23:53 +0000222 return 0;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100223 }
224 value = PyUnicode_READ_CHAR(obj, 0);
225 if (128 < value) {
226 PyObject *bytes;
227 const char *encoding;
228 if (win)
229 encoding = win->encoding;
230 else
231 encoding = screen_encoding;
Serhiy Storchakab29cee42016-10-27 19:31:49 +0300232 bytes = PyUnicode_AsEncodedString(obj, encoding, NULL);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100233 if (bytes == NULL)
234 return 0;
235 if (PyBytes_GET_SIZE(bytes) == 1)
236 value = (unsigned char)PyBytes_AS_STRING(bytes)[0];
237 else
238 value = -1;
239 Py_DECREF(bytes);
240 if (value < 0)
241 goto overflow;
242 }
243 }
244 else if (PyLong_CheckExact(obj)) {
245 int long_overflow;
246 value = PyLong_AsLongAndOverflow(obj, &long_overflow);
247 if (long_overflow)
248 goto overflow;
249 }
250 else {
251 PyErr_Format(PyExc_TypeError,
252 "expect bytes or str of length 1, or int, got %s",
253 Py_TYPE(obj)->tp_name);
Victor Stinner26486ea2010-05-15 22:23:53 +0000254 return 0;
255 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100256 *ch = (chtype)value;
257 if ((long)*ch != value)
258 goto overflow;
Victor Stinner26486ea2010-05-15 22:23:53 +0000259 return 1;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100260
261overflow:
262 PyErr_SetString(PyExc_OverflowError,
263 "byte doesn't fit in chtype");
264 return 0;
265}
266
267/* Convert an object to a byte (chtype) or a character (cchar_t):
268
269 - int
270 - bytes of length 1
271 - str of length 1
272
273 Return:
274
275 - 2 if obj is a character (written into *wch)
276 - 1 if obj is a byte (written into *ch)
277 - 0 on error: raise an exception */
278static int
279PyCurses_ConvertToCchar_t(PyCursesWindowObject *win, PyObject *obj,
280 chtype *ch
281#ifdef HAVE_NCURSESW
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200282 , wchar_t *wch
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100283#endif
284 )
285{
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100286 long value;
287#ifdef HAVE_NCURSESW
288 wchar_t buffer[2];
289#endif
290
291 if (PyUnicode_Check(obj)) {
292#ifdef HAVE_NCURSESW
293 if (PyUnicode_AsWideChar(obj, buffer, 2) != 1) {
294 PyErr_Format(PyExc_TypeError,
295 "expect bytes or str of length 1, or int, "
296 "got a str of length %zi",
297 PyUnicode_GET_LENGTH(obj));
298 return 0;
299 }
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200300 *wch = buffer[0];
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100301 return 2;
302#else
303 return PyCurses_ConvertToChtype(win, obj, ch);
304#endif
305 }
306 else if(PyBytes_Check(obj) && PyBytes_Size(obj) == 1) {
307 value = (unsigned char)PyBytes_AsString(obj)[0];
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100308 }
309 else if (PyLong_CheckExact(obj)) {
310 int overflow;
311 value = PyLong_AsLongAndOverflow(obj, &overflow);
312 if (overflow) {
313 PyErr_SetString(PyExc_OverflowError,
314 "int doesn't fit in long");
315 return 0;
316 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100317 }
318 else {
319 PyErr_Format(PyExc_TypeError,
320 "expect bytes or str of length 1, or int, got %s",
321 Py_TYPE(obj)->tp_name);
322 return 0;
323 }
Victor Stinner9f16e442012-09-01 15:00:34 +0200324
325 *ch = (chtype)value;
326 if ((long)*ch != value) {
327 PyErr_Format(PyExc_OverflowError,
328 "byte doesn't fit in chtype");
329 return 0;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100330 }
Victor Stinner9f16e442012-09-01 15:00:34 +0200331 return 1;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100332}
333
334/* Convert an object to a byte string (char*) or a wide character string
335 (wchar_t*). Return:
336
337 - 2 if obj is a character string (written into *wch)
338 - 1 if obj is a byte string (written into *bytes)
339 - 0 on error: raise an exception */
340static int
341PyCurses_ConvertToString(PyCursesWindowObject *win, PyObject *obj,
342 PyObject **bytes, wchar_t **wstr)
343{
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +0300344 char *str;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100345 if (PyUnicode_Check(obj)) {
346#ifdef HAVE_NCURSESW
347 assert (wstr != NULL);
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +0300348
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100349 *wstr = PyUnicode_AsWideCharString(obj, NULL);
350 if (*wstr == NULL)
351 return 0;
352 return 2;
353#else
354 assert (wstr == NULL);
Serhiy Storchakab29cee42016-10-27 19:31:49 +0300355 *bytes = PyUnicode_AsEncodedString(obj, win->encoding, NULL);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100356 if (*bytes == NULL)
357 return 0;
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +0300358 /* check for embedded null bytes */
359 if (PyBytes_AsStringAndSize(*bytes, &str, NULL) < 0) {
360 return 0;
361 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100362 return 1;
363#endif
364 }
365 else if (PyBytes_Check(obj)) {
366 Py_INCREF(obj);
367 *bytes = obj;
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +0300368 /* check for embedded null bytes */
369 if (PyBytes_AsStringAndSize(*bytes, &str, NULL) < 0) {
370 return 0;
371 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100372 return 1;
373 }
374
375 PyErr_Format(PyExc_TypeError, "expect bytes or str, got %s",
376 Py_TYPE(obj)->tp_name);
377 return 0;
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000378}
379
Benjamin Peterson21896a32010-03-21 22:03:03 +0000380/* Function versions of the 3 functions for testing whether curses has been
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000381 initialised or not. */
Victor Stinner26486ea2010-05-15 22:23:53 +0000382
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000383static int func_PyCursesSetupTermCalled(void)
384{
385 PyCursesSetupTermCalled;
386 return 1;
387}
388
389static int func_PyCursesInitialised(void)
390{
391 PyCursesInitialised;
392 return 1;
393}
394
395static int func_PyCursesInitialisedColor(void)
396{
397 PyCursesInitialisedColor;
398 return 1;
399}
400
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000401/*****************************************************************************
402 The Window Object
403******************************************************************************/
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000404
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000405/* Definition of the window type */
Guido van Rossum85738471995-02-17 13:50:17 +0000406
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000407PyTypeObject PyCursesWindow_Type;
408
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000409/* Function prototype macros for Window object
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000410
411 X - function name
412 TYPE - parameter Type
413 ERGSTR - format string for construction of the return value
414 PARSESTR - format string for argument parsing
Victor Stinner26486ea2010-05-15 22:23:53 +0000415*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000416
Victor Stinner26486ea2010-05-15 22:23:53 +0000417#define Window_NoArgNoReturnFunction(X) \
418 static PyObject *PyCursesWindow_ ## X \
419 (PyCursesWindowObject *self, PyObject *args) \
420 { return PyCursesCheckERR(X(self->win), # X); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000421
Victor Stinner26486ea2010-05-15 22:23:53 +0000422#define Window_NoArgTrueFalseFunction(X) \
423 static PyObject * PyCursesWindow_ ## X \
424 (PyCursesWindowObject *self) \
425 { \
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200426 if (X (self->win) == FALSE) { Py_RETURN_FALSE; } \
427 else { Py_RETURN_TRUE; } }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000428
Victor Stinner26486ea2010-05-15 22:23:53 +0000429#define Window_NoArgNoReturnVoidFunction(X) \
430 static PyObject * PyCursesWindow_ ## X \
431 (PyCursesWindowObject *self) \
432 { \
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200433 X(self->win); Py_RETURN_NONE; }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000434
Victor Stinner26486ea2010-05-15 22:23:53 +0000435#define Window_NoArg2TupleReturnFunction(X, TYPE, ERGSTR) \
436 static PyObject * PyCursesWindow_ ## X \
437 (PyCursesWindowObject *self) \
438 { \
439 TYPE arg1, arg2; \
440 X(self->win,arg1,arg2); return Py_BuildValue(ERGSTR, arg1, arg2); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000441
Victor Stinner26486ea2010-05-15 22:23:53 +0000442#define Window_OneArgNoReturnVoidFunction(X, TYPE, PARSESTR) \
443 static PyObject * PyCursesWindow_ ## X \
444 (PyCursesWindowObject *self, PyObject *args) \
445 { \
446 TYPE arg1; \
447 if (!PyArg_ParseTuple(args, PARSESTR, &arg1)) return NULL; \
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200448 X(self->win,arg1); Py_RETURN_NONE; }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000449
Victor Stinner26486ea2010-05-15 22:23:53 +0000450#define Window_OneArgNoReturnFunction(X, TYPE, PARSESTR) \
451 static PyObject * PyCursesWindow_ ## X \
452 (PyCursesWindowObject *self, PyObject *args) \
453 { \
454 TYPE arg1; \
455 if (!PyArg_ParseTuple(args,PARSESTR, &arg1)) return NULL; \
456 return PyCursesCheckERR(X(self->win, arg1), # X); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000457
Victor Stinner26486ea2010-05-15 22:23:53 +0000458#define Window_TwoArgNoReturnFunction(X, TYPE, PARSESTR) \
459 static PyObject * PyCursesWindow_ ## X \
460 (PyCursesWindowObject *self, PyObject *args) \
461 { \
462 TYPE arg1, arg2; \
463 if (!PyArg_ParseTuple(args,PARSESTR, &arg1, &arg2)) return NULL; \
464 return PyCursesCheckERR(X(self->win, arg1, arg2), # X); }
Guido van Rossum85738471995-02-17 13:50:17 +0000465
Guido van Rossumf6971e21994-08-30 12:25:20 +0000466/* ------------- WINDOW routines --------------- */
Guido van Rossum85738471995-02-17 13:50:17 +0000467
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000468Window_NoArgNoReturnFunction(untouchwin)
469Window_NoArgNoReturnFunction(touchwin)
470Window_NoArgNoReturnFunction(redrawwin)
471Window_NoArgNoReturnFunction(winsertln)
472Window_NoArgNoReturnFunction(werase)
473Window_NoArgNoReturnFunction(wdeleteln)
474
475Window_NoArgTrueFalseFunction(is_wintouched)
476
477Window_NoArgNoReturnVoidFunction(wsyncup)
478Window_NoArgNoReturnVoidFunction(wsyncdown)
479Window_NoArgNoReturnVoidFunction(wstandend)
480Window_NoArgNoReturnVoidFunction(wstandout)
481Window_NoArgNoReturnVoidFunction(wcursyncup)
482Window_NoArgNoReturnVoidFunction(wclrtoeol)
483Window_NoArgNoReturnVoidFunction(wclrtobot)
484Window_NoArgNoReturnVoidFunction(wclear)
485
486Window_OneArgNoReturnVoidFunction(idcok, int, "i;True(1) or False(0)")
Serhiy Storchakabaac01e2017-10-31 13:56:44 +0200487#ifdef HAVE_CURSES_IMMEDOK
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000488Window_OneArgNoReturnVoidFunction(immedok, int, "i;True(1) or False(0)")
Serhiy Storchakabaac01e2017-10-31 13:56:44 +0200489#endif
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +0000490Window_OneArgNoReturnVoidFunction(wtimeout, int, "i;delay")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000491
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000492Window_NoArg2TupleReturnFunction(getyx, int, "ii")
493Window_NoArg2TupleReturnFunction(getbegyx, int, "ii")
494Window_NoArg2TupleReturnFunction(getmaxyx, int, "ii")
495Window_NoArg2TupleReturnFunction(getparyx, int, "ii")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000496
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000497Window_OneArgNoReturnFunction(clearok, int, "i;True(1) or False(0)")
498Window_OneArgNoReturnFunction(idlok, int, "i;True(1) or False(0)")
499Window_OneArgNoReturnFunction(keypad, int, "i;True(1) or False(0)")
500Window_OneArgNoReturnFunction(leaveok, int, "i;True(1) or False(0)")
501Window_OneArgNoReturnFunction(nodelay, int, "i;True(1) or False(0)")
502Window_OneArgNoReturnFunction(notimeout, int, "i;True(1) or False(0)")
503Window_OneArgNoReturnFunction(scrollok, int, "i;True(1) or False(0)")
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000504Window_OneArgNoReturnFunction(winsdelln, int, "i;nlines")
Serhiy Storchakabaac01e2017-10-31 13:56:44 +0200505#ifdef HAVE_CURSES_SYNCOK
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000506Window_OneArgNoReturnFunction(syncok, int, "i;True(1) or False(0)")
Serhiy Storchakabaac01e2017-10-31 13:56:44 +0200507#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000508
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000509Window_TwoArgNoReturnFunction(mvwin, int, "ii;y,x")
510Window_TwoArgNoReturnFunction(mvderwin, int, "ii;y,x")
511Window_TwoArgNoReturnFunction(wmove, int, "ii;y,x")
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000512#ifndef STRICT_SYSV_CURSES
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000513Window_TwoArgNoReturnFunction(wresize, int, "ii;lines,columns")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000514#endif
515
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000516/* Allocation and deallocation of Window Objects */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000517
Guido van Rossumf6971e21994-08-30 12:25:20 +0000518static PyObject *
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100519PyCursesWindow_New(WINDOW *win, const char *encoding)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000520{
Victor Stinner26486ea2010-05-15 22:23:53 +0000521 PyCursesWindowObject *wo;
Guido van Rossum85738471995-02-17 13:50:17 +0000522
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100523 if (encoding == NULL) {
524#if defined(MS_WINDOWS)
525 char *buffer[100];
526 UINT cp;
527 cp = GetConsoleOutputCP();
528 if (cp != 0) {
529 PyOS_snprintf(buffer, sizeof(buffer), "cp%u", cp);
530 encoding = buffer;
531 }
532#elif defined(CODESET)
533 const char *codeset = nl_langinfo(CODESET);
534 if (codeset != NULL && codeset[0] != 0)
535 encoding = codeset;
536#endif
537 if (encoding == NULL)
538 encoding = "utf-8";
539 }
540
Victor Stinner26486ea2010-05-15 22:23:53 +0000541 wo = PyObject_NEW(PyCursesWindowObject, &PyCursesWindow_Type);
542 if (wo == NULL) return NULL;
543 wo->win = win;
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200544 wo->encoding = _PyMem_Strdup(encoding);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100545 if (wo->encoding == NULL) {
546 Py_DECREF(wo);
547 PyErr_NoMemory();
548 return NULL;
549 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000550 return (PyObject *)wo;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000551}
552
553static void
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000554PyCursesWindow_Dealloc(PyCursesWindowObject *wo)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000555{
Victor Stinner26486ea2010-05-15 22:23:53 +0000556 if (wo->win != stdscr) delwin(wo->win);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100557 if (wo->encoding != NULL)
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200558 PyMem_Free(wo->encoding);
Victor Stinner26486ea2010-05-15 22:23:53 +0000559 PyObject_DEL(wo);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000560}
561
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000562/* Addch, Addstr, Addnstr */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000563
Larry Hastings61272b72014-01-07 12:41:53 -0800564/*[clinic input]
Larry Hastings31826802013-10-19 00:09:25 -0700565
566curses.window.addch
567
568 [
Larry Hastings31826802013-10-19 00:09:25 -0700569 y: int
570 Y-coordinate.
Larry Hastings9147a962014-05-04 04:41:18 -0700571 x: int
572 X-coordinate.
Larry Hastings31826802013-10-19 00:09:25 -0700573 ]
574
575 ch: object
576 Character to add.
577
578 [
579 attr: long
580 Attributes for the character.
581 ]
582 /
583
584Paint character ch at (y, x) with attributes attr.
585
586Paint character ch at (y, x) with attributes attr,
587overwriting any character previously painted at that location.
588By default, the character position and attributes are the
589current settings for the window object.
Larry Hastings61272b72014-01-07 12:41:53 -0800590[clinic start generated code]*/
Larry Hastings31826802013-10-19 00:09:25 -0700591
Larry Hastings31826802013-10-19 00:09:25 -0700592static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -0400593curses_window_addch_impl(PyCursesWindowObject *self, int group_left_1, int y,
594 int x, PyObject *ch, int group_right_1, long attr)
595/*[clinic end generated code: output=99f7f85078ec06c3 input=5a41efb34a2de338]*/
Larry Hastings31826802013-10-19 00:09:25 -0700596{
597 PyCursesWindowObject *cwself = (PyCursesWindowObject *)self;
598 int coordinates_group = group_left_1;
599 int attr_group = group_right_1;
600 int rtn;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100601 int type;
Victor Stinnerb110dad2016-12-09 17:06:43 +0100602 chtype cch = 0;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100603#ifdef HAVE_NCURSESW
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200604 wchar_t wstr[2];
605 cchar_t wcval;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100606#endif
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100607 const char *funcname;
Guido van Rossum85738471995-02-17 13:50:17 +0000608
Larry Hastings31826802013-10-19 00:09:25 -0700609 if (!attr_group)
610 attr = A_NORMAL;
Victor Stinner26486ea2010-05-15 22:23:53 +0000611
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100612#ifdef HAVE_NCURSESW
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200613 type = PyCurses_ConvertToCchar_t(cwself, ch, &cch, wstr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100614 if (type == 2) {
615 funcname = "add_wch";
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200616 wstr[1] = L'\0';
617 setcchar(&wcval, wstr, attr, 0, NULL);
Larry Hastings31826802013-10-19 00:09:25 -0700618 if (coordinates_group)
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200619 rtn = mvwadd_wch(cwself->win,y,x, &wcval);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100620 else {
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200621 rtn = wadd_wch(cwself->win, &wcval);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100622 }
623 }
624 else
625#else
Serhiy Storchakaa412f762013-10-19 10:45:48 +0300626 type = PyCurses_ConvertToCchar_t(cwself, ch, &cch);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100627#endif
628 if (type == 1) {
629 funcname = "addch";
Larry Hastings31826802013-10-19 00:09:25 -0700630 if (coordinates_group)
631 rtn = mvwaddch(cwself->win,y,x, cch | attr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100632 else {
Larry Hastings31826802013-10-19 00:09:25 -0700633 rtn = waddch(cwself->win, cch | attr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100634 }
635 }
636 else {
Victor Stinner26486ea2010-05-15 22:23:53 +0000637 return NULL;
638 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100639 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000640}
641
642static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000643PyCursesWindow_AddStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000644{
Victor Stinner26486ea2010-05-15 22:23:53 +0000645 int rtn;
646 int x, y;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100647 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -0500648 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100649#ifdef HAVE_NCURSESW
650 wchar_t *wstr = NULL;
651#endif
Victor Stinner26486ea2010-05-15 22:23:53 +0000652 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
653 long lattr;
654 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100655 const char *funcname;
Guido van Rossum85738471995-02-17 13:50:17 +0000656
Victor Stinner26486ea2010-05-15 22:23:53 +0000657 switch (PyTuple_Size(args)) {
658 case 1:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100659 if (!PyArg_ParseTuple(args,"O;str", &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +0000660 return NULL;
661 break;
662 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100663 if (!PyArg_ParseTuple(args,"Ol;str,attr", &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000664 return NULL;
665 attr = lattr;
666 use_attr = TRUE;
667 break;
668 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100669 if (!PyArg_ParseTuple(args,"iiO;int,int,str", &y, &x, &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +0000670 return NULL;
671 use_xy = TRUE;
672 break;
673 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100674 if (!PyArg_ParseTuple(args,"iiOl;int,int,str,attr", &y, &x, &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000675 return NULL;
676 attr = lattr;
677 use_xy = use_attr = TRUE;
678 break;
679 default:
680 PyErr_SetString(PyExc_TypeError, "addstr requires 1 to 4 arguments");
681 return NULL;
682 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100683#ifdef HAVE_NCURSESW
684 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
685#else
686 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
687#endif
688 if (strtype == 0)
689 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +0000690 if (use_attr == TRUE) {
691 attr_old = getattrs(self->win);
692 (void)wattrset(self->win,attr);
693 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100694#ifdef HAVE_NCURSESW
695 if (strtype == 2) {
696 funcname = "addwstr";
697 if (use_xy == TRUE)
698 rtn = mvwaddwstr(self->win,y,x,wstr);
699 else
700 rtn = waddwstr(self->win,wstr);
701 PyMem_Free(wstr);
702 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000703 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100704#endif
705 {
706 char *str = PyBytes_AS_STRING(bytesobj);
707 funcname = "addstr";
708 if (use_xy == TRUE)
709 rtn = mvwaddstr(self->win,y,x,str);
710 else
711 rtn = waddstr(self->win,str);
712 Py_DECREF(bytesobj);
713 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000714 if (use_attr == TRUE)
715 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100716 return PyCursesCheckERR(rtn, funcname);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000717}
Guido van Rossum85738471995-02-17 13:50:17 +0000718
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000719static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000720PyCursesWindow_AddNStr(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000721{
Victor Stinner26486ea2010-05-15 22:23:53 +0000722 int rtn, x, y, n;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100723 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -0500724 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100725#ifdef HAVE_NCURSESW
726 wchar_t *wstr = NULL;
727#endif
Victor Stinner26486ea2010-05-15 22:23:53 +0000728 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
729 long lattr;
730 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100731 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000732
Victor Stinner26486ea2010-05-15 22:23:53 +0000733 switch (PyTuple_Size(args)) {
734 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100735 if (!PyArg_ParseTuple(args,"Oi;str,n", &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +0000736 return NULL;
737 break;
738 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100739 if (!PyArg_ParseTuple(args,"Oil;str,n,attr", &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000740 return NULL;
741 attr = lattr;
742 use_attr = TRUE;
743 break;
744 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100745 if (!PyArg_ParseTuple(args,"iiOi;y,x,str,n", &y, &x, &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +0000746 return NULL;
747 use_xy = TRUE;
748 break;
749 case 5:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100750 if (!PyArg_ParseTuple(args,"iiOil;y,x,str,n,attr", &y, &x, &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000751 return NULL;
752 attr = lattr;
753 use_xy = use_attr = TRUE;
754 break;
755 default:
756 PyErr_SetString(PyExc_TypeError, "addnstr requires 2 to 5 arguments");
757 return NULL;
758 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100759#ifdef HAVE_NCURSESW
760 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
761#else
762 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
763#endif
764 if (strtype == 0)
765 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000766
Victor Stinner26486ea2010-05-15 22:23:53 +0000767 if (use_attr == TRUE) {
768 attr_old = getattrs(self->win);
769 (void)wattrset(self->win,attr);
770 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100771#ifdef HAVE_NCURSESW
772 if (strtype == 2) {
773 funcname = "addnwstr";
774 if (use_xy == TRUE)
775 rtn = mvwaddnwstr(self->win,y,x,wstr,n);
776 else
777 rtn = waddnwstr(self->win,wstr,n);
778 PyMem_Free(wstr);
779 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000780 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100781#endif
782 {
783 char *str = PyBytes_AS_STRING(bytesobj);
784 funcname = "addnstr";
785 if (use_xy == TRUE)
786 rtn = mvwaddnstr(self->win,y,x,str,n);
787 else
788 rtn = waddnstr(self->win,str,n);
789 Py_DECREF(bytesobj);
790 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000791 if (use_attr == TRUE)
792 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100793 return PyCursesCheckERR(rtn, funcname);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000794}
795
796static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000797PyCursesWindow_Bkgd(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000798{
Victor Stinner26486ea2010-05-15 22:23:53 +0000799 PyObject *temp;
800 chtype bkgd;
801 attr_t attr = A_NORMAL;
802 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000803
Victor Stinner26486ea2010-05-15 22:23:53 +0000804 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000805 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +0000806 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
807 return NULL;
808 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000809 case 2:
Victor Stinner26486ea2010-05-15 22:23:53 +0000810 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
811 return NULL;
812 attr = lattr;
813 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000814 default:
Victor Stinner26486ea2010-05-15 22:23:53 +0000815 PyErr_SetString(PyExc_TypeError, "bkgd requires 1 or 2 arguments");
816 return NULL;
817 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000818
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100819 if (!PyCurses_ConvertToChtype(self, temp, &bkgd))
Victor Stinner26486ea2010-05-15 22:23:53 +0000820 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000821
Victor Stinner26486ea2010-05-15 22:23:53 +0000822 return PyCursesCheckERR(wbkgd(self->win, bkgd | attr), "bkgd");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000823}
824
825static PyObject *
Christian Heimes2380ac72008-01-09 00:17:24 +0000826PyCursesWindow_AttrOff(PyCursesWindowObject *self, PyObject *args)
827{
Victor Stinner26486ea2010-05-15 22:23:53 +0000828 long lattr;
829 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
830 return NULL;
831 return PyCursesCheckERR(wattroff(self->win, (attr_t)lattr), "attroff");
Christian Heimes2380ac72008-01-09 00:17:24 +0000832}
833
834static PyObject *
835PyCursesWindow_AttrOn(PyCursesWindowObject *self, PyObject *args)
836{
Victor Stinner26486ea2010-05-15 22:23:53 +0000837 long lattr;
838 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
839 return NULL;
840 return PyCursesCheckERR(wattron(self->win, (attr_t)lattr), "attron");
Christian Heimes2380ac72008-01-09 00:17:24 +0000841}
842
843static PyObject *
844PyCursesWindow_AttrSet(PyCursesWindowObject *self, PyObject *args)
845{
Victor Stinner26486ea2010-05-15 22:23:53 +0000846 long lattr;
847 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
848 return NULL;
849 return PyCursesCheckERR(wattrset(self->win, (attr_t)lattr), "attrset");
Christian Heimes2380ac72008-01-09 00:17:24 +0000850}
851
852static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000853PyCursesWindow_BkgdSet(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000854{
Victor Stinner26486ea2010-05-15 22:23:53 +0000855 PyObject *temp;
856 chtype bkgd;
857 attr_t attr = A_NORMAL;
858 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000859
Victor Stinner26486ea2010-05-15 22:23:53 +0000860 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000861 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +0000862 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
863 return NULL;
864 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000865 case 2:
Victor Stinner26486ea2010-05-15 22:23:53 +0000866 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
867 return NULL;
868 attr = lattr;
869 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000870 default:
Victor Stinner26486ea2010-05-15 22:23:53 +0000871 PyErr_SetString(PyExc_TypeError, "bkgdset requires 1 or 2 arguments");
872 return NULL;
873 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000874
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100875 if (!PyCurses_ConvertToChtype(self, temp, &bkgd))
Victor Stinner26486ea2010-05-15 22:23:53 +0000876 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000877
Victor Stinner26486ea2010-05-15 22:23:53 +0000878 wbkgdset(self->win, bkgd | attr);
879 return PyCursesCheckERR(0, "bkgdset");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000880}
881
882static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000883PyCursesWindow_Border(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000884{
Victor Stinner26486ea2010-05-15 22:23:53 +0000885 PyObject *temp[8];
886 chtype ch[8];
887 int i;
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000888
Victor Stinner26486ea2010-05-15 22:23:53 +0000889 /* Clear the array of parameters */
890 for(i=0; i<8; i++) {
891 temp[i] = NULL;
892 ch[i] = 0;
893 }
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000894
Victor Stinner26486ea2010-05-15 22:23:53 +0000895 if (!PyArg_ParseTuple(args,"|OOOOOOOO;ls,rs,ts,bs,tl,tr,bl,br",
896 &temp[0], &temp[1], &temp[2], &temp[3],
897 &temp[4], &temp[5], &temp[6], &temp[7]))
898 return NULL;
899
900 for(i=0; i<8; i++) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100901 if (temp[i] != NULL && !PyCurses_ConvertToChtype(self, temp[i], &ch[i]))
Victor Stinner26486ea2010-05-15 22:23:53 +0000902 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +0000903 }
904
905 wborder(self->win,
906 ch[0], ch[1], ch[2], ch[3],
907 ch[4], ch[5], ch[6], ch[7]);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200908 Py_RETURN_NONE;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000909}
910
911static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000912PyCursesWindow_Box(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000913{
Serhiy Storchaka4f469c02017-11-01 20:48:49 +0200914 PyObject *temp1, *temp2;
Victor Stinner26486ea2010-05-15 22:23:53 +0000915 chtype ch1=0,ch2=0;
916 switch(PyTuple_Size(args)){
917 case 0: break;
918 default:
Serhiy Storchaka4f469c02017-11-01 20:48:49 +0200919 if (!PyArg_ParseTuple(args,"OO;verch,horch", &temp1, &temp2))
Victor Stinner26486ea2010-05-15 22:23:53 +0000920 return NULL;
Serhiy Storchaka4f469c02017-11-01 20:48:49 +0200921 if (!PyCurses_ConvertToChtype(self, temp1, &ch1)) {
922 return NULL;
923 }
924 if (!PyCurses_ConvertToChtype(self, temp2, &ch2)) {
925 return NULL;
926 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000927 }
928 box(self->win,ch1,ch2);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200929 Py_RETURN_NONE;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000930}
931
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000932#if defined(HAVE_NCURSES_H) || defined(MVWDELCH_IS_EXPRESSION)
933#define py_mvwdelch mvwdelch
934#else
935int py_mvwdelch(WINDOW *w, int y, int x)
936{
Victor Stinner26486ea2010-05-15 22:23:53 +0000937 mvwdelch(w,y,x);
938 /* On HP/UX, mvwdelch already returns. On other systems,
939 we may well run into this return statement. */
940 return 0;
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000941}
942#endif
943
Masayuki Yamamoto8bc7d632017-11-01 21:05:26 +0900944#if defined(HAVE_CURSES_IS_PAD)
945#define py_is_pad(win) is_pad(win)
946#elif defined(WINDOW_HAS_FLAGS)
947#define py_is_pad(win) ((win) ? ((win)->_flags & _ISPAD) != 0 : FALSE)
948#endif
949
Guido van Rossumd8faa362007-04-27 19:54:29 +0000950/* chgat, added by Fabian Kreutz <fabian.kreutz at gmx.net> */
Serhiy Storchaka894ebd02017-11-01 14:34:20 +0200951#ifdef HAVE_CURSES_WCHGAT
Guido van Rossumd8faa362007-04-27 19:54:29 +0000952static PyObject *
953PyCursesWindow_ChgAt(PyCursesWindowObject *self, PyObject *args)
954{
Victor Stinner26486ea2010-05-15 22:23:53 +0000955 int rtn;
956 int x, y;
957 int num = -1;
958 short color;
959 attr_t attr = A_NORMAL;
960 long lattr;
961 int use_xy = FALSE;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000962
Victor Stinner26486ea2010-05-15 22:23:53 +0000963 switch (PyTuple_Size(args)) {
964 case 1:
965 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
966 return NULL;
967 attr = lattr;
968 break;
969 case 2:
970 if (!PyArg_ParseTuple(args,"il;n,attr", &num, &lattr))
971 return NULL;
972 attr = lattr;
973 break;
974 case 3:
975 if (!PyArg_ParseTuple(args,"iil;int,int,attr", &y, &x, &lattr))
976 return NULL;
977 attr = lattr;
978 use_xy = TRUE;
979 break;
980 case 4:
981 if (!PyArg_ParseTuple(args,"iiil;int,int,n,attr", &y, &x, &num, &lattr))
982 return NULL;
983 attr = lattr;
984 use_xy = TRUE;
985 break;
986 default:
987 PyErr_SetString(PyExc_TypeError, "chgat requires 1 to 4 arguments");
988 return NULL;
989 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000990
Victor Stinner26486ea2010-05-15 22:23:53 +0000991 color = (short)((attr >> 8) & 0xff);
992 attr = attr - (color << 8);
Guido van Rossumd8faa362007-04-27 19:54:29 +0000993
Victor Stinner26486ea2010-05-15 22:23:53 +0000994 if (use_xy == TRUE) {
995 rtn = mvwchgat(self->win,y,x,num,attr,color,NULL);
996 touchline(self->win,y,1);
997 } else {
998 getyx(self->win,y,x);
999 rtn = wchgat(self->win,num,attr,color,NULL);
1000 touchline(self->win,y,1);
1001 }
1002 return PyCursesCheckERR(rtn, "chgat");
Guido van Rossumd8faa362007-04-27 19:54:29 +00001003}
Serhiy Storchaka894ebd02017-11-01 14:34:20 +02001004#endif
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001005
Guido van Rossumf6971e21994-08-30 12:25:20 +00001006static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001007PyCursesWindow_DelCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001008{
Victor Stinner26486ea2010-05-15 22:23:53 +00001009 int rtn;
1010 int x, y;
Guido van Rossum85738471995-02-17 13:50:17 +00001011
Victor Stinner26486ea2010-05-15 22:23:53 +00001012 switch (PyTuple_Size(args)) {
1013 case 0:
1014 rtn = wdelch(self->win);
1015 break;
1016 case 2:
1017 if (!PyArg_ParseTuple(args,"ii;y,x", &y, &x))
1018 return NULL;
1019 rtn = py_mvwdelch(self->win,y,x);
1020 break;
1021 default:
1022 PyErr_SetString(PyExc_TypeError, "delch requires 0 or 2 arguments");
1023 return NULL;
1024 }
1025 return PyCursesCheckERR(rtn, "[mv]wdelch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001026}
1027
1028static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001029PyCursesWindow_DerWin(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001030{
Victor Stinner26486ea2010-05-15 22:23:53 +00001031 WINDOW *win;
1032 int nlines, ncols, begin_y, begin_x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001033
Victor Stinner26486ea2010-05-15 22:23:53 +00001034 nlines = 0;
1035 ncols = 0;
1036 switch (PyTuple_Size(args)) {
1037 case 2:
1038 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
1039 return NULL;
1040 break;
1041 case 4:
1042 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
1043 &nlines,&ncols,&begin_y,&begin_x))
1044 return NULL;
1045 break;
1046 default:
1047 PyErr_SetString(PyExc_TypeError, "derwin requires 2 or 4 arguments");
1048 return NULL;
1049 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001050
Victor Stinner26486ea2010-05-15 22:23:53 +00001051 win = derwin(self->win,nlines,ncols,begin_y,begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001052
Victor Stinner26486ea2010-05-15 22:23:53 +00001053 if (win == NULL) {
1054 PyErr_SetString(PyCursesError, catchall_NULL);
1055 return NULL;
1056 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001057
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001058 return (PyObject *)PyCursesWindow_New(win, NULL);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001059}
1060
1061static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001062PyCursesWindow_EchoChar(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001063{
Victor Stinner26486ea2010-05-15 22:23:53 +00001064 PyObject *temp;
1065 chtype ch;
1066 attr_t attr = A_NORMAL;
1067 long lattr;
Guido van Rossum85738471995-02-17 13:50:17 +00001068
Victor Stinner26486ea2010-05-15 22:23:53 +00001069 switch (PyTuple_Size(args)) {
1070 case 1:
1071 if (!PyArg_ParseTuple(args,"O;ch or int", &temp))
1072 return NULL;
1073 break;
1074 case 2:
1075 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
1076 return NULL;
1077 attr = lattr;
1078 break;
1079 default:
1080 PyErr_SetString(PyExc_TypeError, "echochar requires 1 or 2 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001081
1082
Victor Stinner26486ea2010-05-15 22:23:53 +00001083 return NULL;
1084 }
Guido van Rossum85738471995-02-17 13:50:17 +00001085
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001086 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001087 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001088
Masayuki Yamamoto8bc7d632017-11-01 21:05:26 +09001089#ifdef py_is_pad
1090 if (py_is_pad(self->win)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001091 return PyCursesCheckERR(pechochar(self->win, ch | attr),
1092 "echochar");
Masayuki Yamamoto8bc7d632017-11-01 21:05:26 +09001093 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001094 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001095#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001096 return PyCursesCheckERR(wechochar(self->win, ch | attr),
1097 "echochar");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001098}
1099
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001100#ifdef NCURSES_MOUSE_VERSION
1101static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001102PyCursesWindow_Enclose(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001103{
Victor Stinner26486ea2010-05-15 22:23:53 +00001104 int x, y;
1105 if (!PyArg_ParseTuple(args,"ii;y,x", &y, &x))
1106 return NULL;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001107
Victor Stinner26486ea2010-05-15 22:23:53 +00001108 return PyLong_FromLong( wenclose(self->win,y,x) );
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001109}
1110#endif
1111
Guido van Rossumf6971e21994-08-30 12:25:20 +00001112static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001113PyCursesWindow_GetBkgd(PyCursesWindowObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001114{
Victor Stinner26486ea2010-05-15 22:23:53 +00001115 return PyLong_FromLong((long) getbkgd(self->win));
Guido van Rossumf6971e21994-08-30 12:25:20 +00001116}
1117
1118static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001119PyCursesWindow_GetCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001120{
Victor Stinner26486ea2010-05-15 22:23:53 +00001121 int x, y;
1122 int rtn;
Guido van Rossum85738471995-02-17 13:50:17 +00001123
Victor Stinner26486ea2010-05-15 22:23:53 +00001124 switch (PyTuple_Size(args)) {
1125 case 0:
1126 Py_BEGIN_ALLOW_THREADS
1127 rtn = wgetch(self->win);
1128 Py_END_ALLOW_THREADS
1129 break;
1130 case 2:
1131 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1132 return NULL;
1133 Py_BEGIN_ALLOW_THREADS
1134 rtn = mvwgetch(self->win,y,x);
1135 Py_END_ALLOW_THREADS
1136 break;
1137 default:
1138 PyErr_SetString(PyExc_TypeError, "getch requires 0 or 2 arguments");
1139 return NULL;
1140 }
1141 return PyLong_FromLong((long)rtn);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001142}
Guido van Rossum85738471995-02-17 13:50:17 +00001143
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001144static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001145PyCursesWindow_GetKey(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001146{
Victor Stinner26486ea2010-05-15 22:23:53 +00001147 int x, y;
1148 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001149
Victor Stinner26486ea2010-05-15 22:23:53 +00001150 switch (PyTuple_Size(args)) {
1151 case 0:
1152 Py_BEGIN_ALLOW_THREADS
1153 rtn = wgetch(self->win);
1154 Py_END_ALLOW_THREADS
1155 break;
1156 case 2:
1157 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1158 return NULL;
1159 Py_BEGIN_ALLOW_THREADS
1160 rtn = mvwgetch(self->win,y,x);
1161 Py_END_ALLOW_THREADS
1162 break;
1163 default:
1164 PyErr_SetString(PyExc_TypeError, "getkey requires 0 or 2 arguments");
1165 return NULL;
1166 }
1167 if (rtn == ERR) {
1168 /* getch() returns ERR in nodelay mode */
R David Murrayf5d7cc22013-03-19 16:23:09 -04001169 PyErr_CheckSignals();
1170 if (!PyErr_Occurred())
1171 PyErr_SetString(PyCursesError, "no input");
Victor Stinner26486ea2010-05-15 22:23:53 +00001172 return NULL;
Serhiy Storchaka7e687902017-11-01 16:03:40 +02001173 } else if (rtn <= 255) {
1174#ifdef NCURSES_VERSION_MAJOR
1175#if NCURSES_VERSION_MAJOR*100+NCURSES_VERSION_MINOR <= 507
1176 /* Work around a bug in ncurses 5.7 and earlier */
1177 if (rtn < 0) {
1178 rtn += 256;
1179 }
1180#endif
1181#endif
1182 return PyUnicode_FromOrdinal(rtn);
Victor Stinner26486ea2010-05-15 22:23:53 +00001183 } else {
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02001184 const char *knp = keyname(rtn);
Victor Stinner26486ea2010-05-15 22:23:53 +00001185 return PyUnicode_FromString((knp == NULL) ? "" : knp);
1186 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001187}
1188
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001189#ifdef HAVE_NCURSESW
Guido van Rossumf6971e21994-08-30 12:25:20 +00001190static PyObject *
Victor Stinnera7878b72011-07-14 23:07:44 +02001191PyCursesWindow_Get_WCh(PyCursesWindowObject *self, PyObject *args)
1192{
1193 int x, y;
1194 int ct;
1195 wint_t rtn;
1196
1197 switch (PyTuple_Size(args)) {
1198 case 0:
1199 Py_BEGIN_ALLOW_THREADS
1200 ct = wget_wch(self->win,&rtn);
1201 Py_END_ALLOW_THREADS
1202 break;
1203 case 2:
1204 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1205 return NULL;
1206 Py_BEGIN_ALLOW_THREADS
1207 ct = mvwget_wch(self->win,y,x,&rtn);
1208 Py_END_ALLOW_THREADS
1209 break;
1210 default:
1211 PyErr_SetString(PyExc_TypeError, "get_wch requires 0 or 2 arguments");
1212 return NULL;
1213 }
1214 if (ct == ERR) {
Victor Stinnerbd2d30c2013-03-21 12:21:06 +01001215 if (PyErr_CheckSignals())
1216 return NULL;
1217
Victor Stinnera7878b72011-07-14 23:07:44 +02001218 /* get_wch() returns ERR in nodelay mode */
1219 PyErr_SetString(PyCursesError, "no input");
1220 return NULL;
1221 }
Victor Stinner1d39cde2012-08-29 01:40:57 +02001222 if (ct == KEY_CODE_YES)
1223 return PyLong_FromLong(rtn);
1224 else
1225 return PyUnicode_FromOrdinal(rtn);
Victor Stinnera7878b72011-07-14 23:07:44 +02001226}
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001227#endif
Victor Stinnera7878b72011-07-14 23:07:44 +02001228
1229static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001230PyCursesWindow_GetStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001231{
Victor Stinner26486ea2010-05-15 22:23:53 +00001232 int x, y, n;
1233 char rtn[1024]; /* This should be big enough.. I hope */
1234 int rtn2;
Guido van Rossum85738471995-02-17 13:50:17 +00001235
Victor Stinner26486ea2010-05-15 22:23:53 +00001236 switch (PyTuple_Size(args)) {
1237 case 0:
1238 Py_BEGIN_ALLOW_THREADS
1239 rtn2 = wgetnstr(self->win,rtn, 1023);
1240 Py_END_ALLOW_THREADS
1241 break;
1242 case 1:
1243 if (!PyArg_ParseTuple(args,"i;n", &n))
1244 return NULL;
Benjamin Peterson40a77c32016-08-13 18:15:28 -07001245 if (n < 0) {
1246 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1247 return NULL;
1248 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001249 Py_BEGIN_ALLOW_THREADS
Victor Stinner640c35c2013-06-04 23:14:37 +02001250 rtn2 = wgetnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001251 Py_END_ALLOW_THREADS
1252 break;
1253 case 2:
1254 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1255 return NULL;
1256 Py_BEGIN_ALLOW_THREADS
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001257#ifdef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00001258 rtn2 = wmove(self->win,y,x)==ERR ? ERR : wgetnstr(self->win, rtn, 1023);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001259#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001260 rtn2 = mvwgetnstr(self->win,y,x,rtn, 1023);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001261#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001262 Py_END_ALLOW_THREADS
1263 break;
1264 case 3:
1265 if (!PyArg_ParseTuple(args,"iii;y,x,n", &y, &x, &n))
1266 return NULL;
Benjamin Peterson40a77c32016-08-13 18:15:28 -07001267 if (n < 0) {
1268 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1269 return NULL;
1270 }
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00001271#ifdef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00001272 Py_BEGIN_ALLOW_THREADS
1273 rtn2 = wmove(self->win,y,x)==ERR ? ERR :
Victor Stinner640c35c2013-06-04 23:14:37 +02001274 wgetnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001275 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001276#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001277 Py_BEGIN_ALLOW_THREADS
Victor Stinner640c35c2013-06-04 23:14:37 +02001278 rtn2 = mvwgetnstr(self->win, y, x, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001279 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001280#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001281 break;
1282 default:
1283 PyErr_SetString(PyExc_TypeError, "getstr requires 0 to 3 arguments");
1284 return NULL;
1285 }
1286 if (rtn2 == ERR)
1287 rtn[0] = 0;
1288 return PyBytes_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001289}
1290
1291static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001292PyCursesWindow_Hline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001293{
Victor Stinner26486ea2010-05-15 22:23:53 +00001294 PyObject *temp;
1295 chtype ch;
1296 int n, x, y, code = OK;
1297 attr_t attr = A_NORMAL;
1298 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001299
Victor Stinner26486ea2010-05-15 22:23:53 +00001300 switch (PyTuple_Size(args)) {
1301 case 2:
1302 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
1303 return NULL;
1304 break;
1305 case 3:
1306 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &lattr))
1307 return NULL;
1308 attr = lattr;
1309 break;
1310 case 4:
1311 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
1312 return NULL;
1313 code = wmove(self->win, y, x);
1314 break;
1315 case 5:
1316 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
1317 &y, &x, &temp, &n, &lattr))
1318 return NULL;
1319 attr = lattr;
1320 code = wmove(self->win, y, x);
1321 break;
1322 default:
1323 PyErr_SetString(PyExc_TypeError, "hline requires 2 to 5 arguments");
1324 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001325 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001326
1327 if (code != ERR) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001328 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001329 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001330 return PyCursesCheckERR(whline(self->win, ch | attr, n), "hline");
1331 } else
1332 return PyCursesCheckERR(code, "wmove");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001333}
1334
1335static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001336PyCursesWindow_InsCh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001337{
Victor Stinner26486ea2010-05-15 22:23:53 +00001338 int rtn, x, y, use_xy = FALSE;
1339 PyObject *temp;
1340 chtype ch = 0;
1341 attr_t attr = A_NORMAL;
1342 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001343
Victor Stinner26486ea2010-05-15 22:23:53 +00001344 switch (PyTuple_Size(args)) {
1345 case 1:
1346 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
1347 return NULL;
1348 break;
1349 case 2:
1350 if (!PyArg_ParseTuple(args, "Ol;ch or int,attr", &temp, &lattr))
1351 return NULL;
1352 attr = lattr;
1353 break;
1354 case 3:
1355 if (!PyArg_ParseTuple(args,"iiO;y,x,ch or int", &y, &x, &temp))
1356 return NULL;
1357 use_xy = TRUE;
1358 break;
1359 case 4:
1360 if (!PyArg_ParseTuple(args,"iiOl;y,x,ch or int, attr", &y, &x, &temp, &lattr))
1361 return NULL;
1362 attr = lattr;
1363 use_xy = TRUE;
1364 break;
1365 default:
1366 PyErr_SetString(PyExc_TypeError, "insch requires 1 or 4 arguments");
1367 return NULL;
1368 }
1369
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001370 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001371 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001372
1373 if (use_xy == TRUE)
1374 rtn = mvwinsch(self->win,y,x, ch | attr);
1375 else {
1376 rtn = winsch(self->win, ch | attr);
1377 }
1378 return PyCursesCheckERR(rtn, "insch");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001379}
1380
1381static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001382PyCursesWindow_InCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001383{
Christian Heimesabbc8ca2013-12-04 08:50:22 +01001384 int x, y;
1385 unsigned long rtn;
Guido van Rossum85738471995-02-17 13:50:17 +00001386
Victor Stinner26486ea2010-05-15 22:23:53 +00001387 switch (PyTuple_Size(args)) {
1388 case 0:
1389 rtn = winch(self->win);
1390 break;
1391 case 2:
1392 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1393 return NULL;
1394 rtn = mvwinch(self->win,y,x);
1395 break;
1396 default:
1397 PyErr_SetString(PyExc_TypeError, "inch requires 0 or 2 arguments");
1398 return NULL;
1399 }
Christian Heimesabbc8ca2013-12-04 08:50:22 +01001400 return PyLong_FromUnsignedLong(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001401}
1402
1403static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001404PyCursesWindow_InStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001405{
Victor Stinner26486ea2010-05-15 22:23:53 +00001406 int x, y, n;
1407 char rtn[1024]; /* This should be big enough.. I hope */
1408 int rtn2;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001409
Victor Stinner26486ea2010-05-15 22:23:53 +00001410 switch (PyTuple_Size(args)) {
1411 case 0:
1412 rtn2 = winnstr(self->win,rtn, 1023);
1413 break;
1414 case 1:
1415 if (!PyArg_ParseTuple(args,"i;n", &n))
1416 return NULL;
Benjamin Peterson432ea4f2016-08-15 21:40:14 -07001417 if (n < 0) {
1418 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1419 return NULL;
1420 }
Victor Stinner640c35c2013-06-04 23:14:37 +02001421 rtn2 = winnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001422 break;
1423 case 2:
1424 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1425 return NULL;
1426 rtn2 = mvwinnstr(self->win,y,x,rtn,1023);
1427 break;
1428 case 3:
1429 if (!PyArg_ParseTuple(args, "iii;y,x,n", &y, &x, &n))
1430 return NULL;
Benjamin Peterson432ea4f2016-08-15 21:40:14 -07001431 if (n < 0) {
1432 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1433 return NULL;
1434 }
Victor Stinner640c35c2013-06-04 23:14:37 +02001435 rtn2 = mvwinnstr(self->win, y, x, rtn, Py_MIN(n,1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001436 break;
1437 default:
1438 PyErr_SetString(PyExc_TypeError, "instr requires 0 or 3 arguments");
1439 return NULL;
1440 }
1441 if (rtn2 == ERR)
1442 rtn[0] = 0;
1443 return PyBytes_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001444}
1445
1446static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001447PyCursesWindow_InsStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001448{
Victor Stinner26486ea2010-05-15 22:23:53 +00001449 int rtn;
1450 int x, y;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001451 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -05001452 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001453#ifdef HAVE_NCURSESW
1454 wchar_t *wstr = NULL;
1455#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001456 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
1457 long lattr;
1458 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001459 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001460
Victor Stinner26486ea2010-05-15 22:23:53 +00001461 switch (PyTuple_Size(args)) {
1462 case 1:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001463 if (!PyArg_ParseTuple(args,"O;str", &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +00001464 return NULL;
1465 break;
1466 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001467 if (!PyArg_ParseTuple(args,"Ol;str,attr", &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001468 return NULL;
1469 attr = lattr;
1470 use_attr = TRUE;
1471 break;
1472 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001473 if (!PyArg_ParseTuple(args,"iiO;y,x,str", &y, &x, &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +00001474 return NULL;
1475 use_xy = TRUE;
1476 break;
1477 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001478 if (!PyArg_ParseTuple(args,"iiOl;y,x,str,attr", &y, &x, &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001479 return NULL;
1480 attr = lattr;
1481 use_xy = use_attr = TRUE;
1482 break;
1483 default:
1484 PyErr_SetString(PyExc_TypeError, "insstr requires 1 to 4 arguments");
1485 return NULL;
1486 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001487
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001488#ifdef HAVE_NCURSESW
1489 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
1490#else
1491 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
1492#endif
1493 if (strtype == 0)
1494 return NULL;
1495
Victor Stinner26486ea2010-05-15 22:23:53 +00001496 if (use_attr == TRUE) {
1497 attr_old = getattrs(self->win);
1498 (void)wattrset(self->win,attr);
1499 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001500#ifdef HAVE_NCURSESW
1501 if (strtype == 2) {
1502 funcname = "inswstr";
1503 if (use_xy == TRUE)
1504 rtn = mvwins_wstr(self->win,y,x,wstr);
1505 else
1506 rtn = wins_wstr(self->win,wstr);
1507 PyMem_Free(wstr);
1508 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001509 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001510#endif
1511 {
1512 char *str = PyBytes_AS_STRING(bytesobj);
1513 funcname = "insstr";
1514 if (use_xy == TRUE)
1515 rtn = mvwinsstr(self->win,y,x,str);
1516 else
1517 rtn = winsstr(self->win,str);
1518 Py_DECREF(bytesobj);
1519 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001520 if (use_attr == TRUE)
1521 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001522 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001523}
1524
1525static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001526PyCursesWindow_InsNStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001527{
Victor Stinner26486ea2010-05-15 22:23:53 +00001528 int rtn, x, y, n;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001529 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -05001530 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001531#ifdef HAVE_NCURSESW
1532 wchar_t *wstr = NULL;
1533#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001534 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
1535 long lattr;
1536 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001537 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001538
Victor Stinner26486ea2010-05-15 22:23:53 +00001539 switch (PyTuple_Size(args)) {
1540 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001541 if (!PyArg_ParseTuple(args,"Oi;str,n", &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +00001542 return NULL;
1543 break;
1544 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001545 if (!PyArg_ParseTuple(args,"Oil;str,n,attr", &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001546 return NULL;
1547 attr = lattr;
1548 use_attr = TRUE;
1549 break;
1550 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001551 if (!PyArg_ParseTuple(args,"iiOi;y,x,str,n", &y, &x, &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +00001552 return NULL;
1553 use_xy = TRUE;
1554 break;
1555 case 5:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001556 if (!PyArg_ParseTuple(args,"iiOil;y,x,str,n,attr", &y, &x, &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001557 return NULL;
1558 attr = lattr;
1559 use_xy = use_attr = TRUE;
1560 break;
1561 default:
1562 PyErr_SetString(PyExc_TypeError, "insnstr requires 2 to 5 arguments");
1563 return NULL;
1564 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001565
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001566#ifdef HAVE_NCURSESW
1567 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
1568#else
1569 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
1570#endif
1571 if (strtype == 0)
1572 return NULL;
1573
Victor Stinner26486ea2010-05-15 22:23:53 +00001574 if (use_attr == TRUE) {
1575 attr_old = getattrs(self->win);
1576 (void)wattrset(self->win,attr);
1577 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001578#ifdef HAVE_NCURSESW
1579 if (strtype == 2) {
1580 funcname = "insn_wstr";
1581 if (use_xy == TRUE)
1582 rtn = mvwins_nwstr(self->win,y,x,wstr,n);
1583 else
1584 rtn = wins_nwstr(self->win,wstr,n);
1585 PyMem_Free(wstr);
1586 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001587 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001588#endif
1589 {
1590 char *str = PyBytes_AS_STRING(bytesobj);
1591 funcname = "insnstr";
1592 if (use_xy == TRUE)
1593 rtn = mvwinsnstr(self->win,y,x,str,n);
1594 else
1595 rtn = winsnstr(self->win,str,n);
1596 Py_DECREF(bytesobj);
1597 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001598 if (use_attr == TRUE)
1599 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001600 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001601}
1602
1603static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001604PyCursesWindow_Is_LineTouched(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001605{
Victor Stinner26486ea2010-05-15 22:23:53 +00001606 int line, erg;
1607 if (!PyArg_ParseTuple(args,"i;line", &line))
1608 return NULL;
1609 erg = is_linetouched(self->win, line);
1610 if (erg == ERR) {
1611 PyErr_SetString(PyExc_TypeError,
1612 "is_linetouched: line number outside of boundaries");
1613 return NULL;
1614 } else
1615 if (erg == FALSE) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001616 Py_RETURN_FALSE;
Victor Stinner26486ea2010-05-15 22:23:53 +00001617 } else {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001618 Py_RETURN_TRUE;
Victor Stinner26486ea2010-05-15 22:23:53 +00001619 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001620}
1621
1622static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001623PyCursesWindow_NoOutRefresh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001624{
Victor Stinner26486ea2010-05-15 22:23:53 +00001625 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
1626 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001627
Masayuki Yamamoto8bc7d632017-11-01 21:05:26 +09001628#ifndef py_is_pad
Victor Stinner26486ea2010-05-15 22:23:53 +00001629 if (0)
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001630#else
Masayuki Yamamoto8bc7d632017-11-01 21:05:26 +09001631 if (py_is_pad(self->win))
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001632#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001633 {
1634 switch(PyTuple_Size(args)) {
1635 case 6:
1636 if (!PyArg_ParseTuple(args,
1637 "iiiiii;" \
1638 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1639 &pminrow, &pmincol, &sminrow,
1640 &smincol, &smaxrow, &smaxcol))
1641 return NULL;
1642 Py_BEGIN_ALLOW_THREADS
1643 rtn = pnoutrefresh(self->win,
1644 pminrow, pmincol, sminrow,
1645 smincol, smaxrow, smaxcol);
1646 Py_END_ALLOW_THREADS
1647 return PyCursesCheckERR(rtn, "pnoutrefresh");
1648 default:
1649 PyErr_SetString(PyCursesError,
1650 "noutrefresh() called for a pad "
1651 "requires 6 arguments");
1652 return NULL;
1653 }
1654 } else {
1655 if (!PyArg_ParseTuple(args, ":noutrefresh"))
1656 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001657
Victor Stinner26486ea2010-05-15 22:23:53 +00001658 Py_BEGIN_ALLOW_THREADS
1659 rtn = wnoutrefresh(self->win);
1660 Py_END_ALLOW_THREADS
1661 return PyCursesCheckERR(rtn, "wnoutrefresh");
1662 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001663}
1664
1665static PyObject *
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001666PyCursesWindow_Overlay(PyCursesWindowObject *self, PyObject *args)
1667{
1668 PyCursesWindowObject *temp;
1669 int use_copywin = FALSE;
1670 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1671 int rtn;
Victor Stinner26486ea2010-05-15 22:23:53 +00001672
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001673 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001674 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +00001675 if (!PyArg_ParseTuple(args, "O!;window object",
1676 &PyCursesWindow_Type, &temp))
1677 return NULL;
1678 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001679 case 7:
Victor Stinner26486ea2010-05-15 22:23:53 +00001680 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
1681 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1682 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1683 return NULL;
1684 use_copywin = TRUE;
1685 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001686 default:
Victor Stinner26486ea2010-05-15 22:23:53 +00001687 PyErr_SetString(PyExc_TypeError,
1688 "overlay requires one or seven arguments");
1689 return NULL;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001690 }
1691
1692 if (use_copywin == TRUE) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001693 rtn = copywin(self->win, temp->win, sminrow, smincol,
1694 dminrow, dmincol, dmaxrow, dmaxcol, TRUE);
1695 return PyCursesCheckERR(rtn, "copywin");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001696 }
1697 else {
Victor Stinner26486ea2010-05-15 22:23:53 +00001698 rtn = overlay(self->win, temp->win);
1699 return PyCursesCheckERR(rtn, "overlay");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001700 }
1701}
1702
1703static PyObject *
1704PyCursesWindow_Overwrite(PyCursesWindowObject *self, PyObject *args)
1705{
1706 PyCursesWindowObject *temp;
1707 int use_copywin = FALSE;
1708 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1709 int rtn;
Victor Stinner26486ea2010-05-15 22:23:53 +00001710
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001711 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001712 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +00001713 if (!PyArg_ParseTuple(args, "O!;window object",
1714 &PyCursesWindow_Type, &temp))
1715 return NULL;
1716 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001717 case 7:
Victor Stinner26486ea2010-05-15 22:23:53 +00001718 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
1719 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1720 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1721 return NULL;
1722 use_copywin = TRUE;
1723 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001724 default:
Victor Stinner26486ea2010-05-15 22:23:53 +00001725 PyErr_SetString(PyExc_TypeError,
1726 "overwrite requires one or seven arguments");
1727 return NULL;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001728 }
1729
1730 if (use_copywin == TRUE) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001731 rtn = copywin(self->win, temp->win, sminrow, smincol,
1732 dminrow, dmincol, dmaxrow, dmaxcol, FALSE);
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001733 return PyCursesCheckERR(rtn, "copywin");
1734 }
1735 else {
Victor Stinner26486ea2010-05-15 22:23:53 +00001736 rtn = overwrite(self->win, temp->win);
1737 return PyCursesCheckERR(rtn, "overwrite");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001738 }
1739}
1740
1741static PyObject *
Guido van Rossum6c95da32007-07-24 00:16:38 +00001742PyCursesWindow_PutWin(PyCursesWindowObject *self, PyObject *stream)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001743{
Victor Stinner26486ea2010-05-15 22:23:53 +00001744 /* We have to simulate this by writing to a temporary FILE*,
1745 then reading back, then writing to the argument stream. */
Christian Heimes2b221b72017-03-02 11:09:01 +01001746 FILE *fp;
Victor Stinnerdaf45552013-08-28 00:53:59 +02001747 PyObject *res = NULL;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00001748
Christian Heimes2b221b72017-03-02 11:09:01 +01001749 fp = tmpfile();
1750 if (fp == NULL)
1751 return PyErr_SetFromErrno(PyExc_OSError);
1752 if (_Py_set_inheritable(fileno(fp), 0, NULL) < 0)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001753 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001754 res = PyCursesCheckERR(putwin(self->win, fp), "putwin");
Victor Stinnerdaf45552013-08-28 00:53:59 +02001755 if (res == NULL)
1756 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001757 fseek(fp, 0, 0);
1758 while (1) {
1759 char buf[BUFSIZ];
1760 Py_ssize_t n = fread(buf, 1, BUFSIZ, fp);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001761 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001762
Victor Stinner26486ea2010-05-15 22:23:53 +00001763 if (n <= 0)
1764 break;
1765 Py_DECREF(res);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001766 res = _PyObject_CallMethodId(stream, &PyId_write, "y#", buf, n);
Victor Stinner26486ea2010-05-15 22:23:53 +00001767 if (res == NULL)
1768 break;
1769 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02001770
1771exit:
Christian Heimes2b221b72017-03-02 11:09:01 +01001772 fclose(fp);
Guido van Rossum6c95da32007-07-24 00:16:38 +00001773 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001774}
1775
1776static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001777PyCursesWindow_RedrawLine(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001778{
Victor Stinner26486ea2010-05-15 22:23:53 +00001779 int beg, num;
1780 if (!PyArg_ParseTuple(args, "ii;beg,num", &beg, &num))
1781 return NULL;
1782 return PyCursesCheckERR(wredrawln(self->win,beg,num), "redrawln");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001783}
1784
1785static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001786PyCursesWindow_Refresh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001787{
Victor Stinner26486ea2010-05-15 22:23:53 +00001788 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
1789 int rtn;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001790
Masayuki Yamamoto8bc7d632017-11-01 21:05:26 +09001791#ifndef py_is_pad
Victor Stinner26486ea2010-05-15 22:23:53 +00001792 if (0)
1793#else
Masayuki Yamamoto8bc7d632017-11-01 21:05:26 +09001794 if (py_is_pad(self->win))
Victor Stinner26486ea2010-05-15 22:23:53 +00001795#endif
1796 {
1797 switch(PyTuple_Size(args)) {
1798 case 6:
1799 if (!PyArg_ParseTuple(args,
1800 "iiiiii;" \
1801 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1802 &pminrow, &pmincol, &sminrow,
1803 &smincol, &smaxrow, &smaxcol))
1804 return NULL;
1805
1806 Py_BEGIN_ALLOW_THREADS
1807 rtn = prefresh(self->win,
1808 pminrow, pmincol, sminrow,
1809 smincol, smaxrow, smaxcol);
1810 Py_END_ALLOW_THREADS
1811 return PyCursesCheckERR(rtn, "prefresh");
1812 default:
1813 PyErr_SetString(PyCursesError,
1814 "refresh() for a pad requires 6 arguments");
1815 return NULL;
1816 }
1817 } else {
1818 if (!PyArg_ParseTuple(args, ":refresh"))
1819 return NULL;
1820 Py_BEGIN_ALLOW_THREADS
1821 rtn = wrefresh(self->win);
1822 Py_END_ALLOW_THREADS
1823 return PyCursesCheckERR(rtn, "prefresh");
1824 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001825}
1826
1827static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001828PyCursesWindow_SetScrollRegion(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001829{
Victor Stinner26486ea2010-05-15 22:23:53 +00001830 int x, y;
1831 if (!PyArg_ParseTuple(args,"ii;top, bottom",&y,&x))
1832 return NULL;
1833 return PyCursesCheckERR(wsetscrreg(self->win,y,x), "wsetscrreg");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001834}
1835
1836static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001837PyCursesWindow_SubWin(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001838{
Victor Stinner26486ea2010-05-15 22:23:53 +00001839 WINDOW *win;
1840 int nlines, ncols, begin_y, begin_x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001841
Victor Stinner26486ea2010-05-15 22:23:53 +00001842 nlines = 0;
1843 ncols = 0;
1844 switch (PyTuple_Size(args)) {
1845 case 2:
1846 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
1847 return NULL;
1848 break;
1849 case 4:
1850 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
1851 &nlines,&ncols,&begin_y,&begin_x))
1852 return NULL;
1853 break;
1854 default:
1855 PyErr_SetString(PyExc_TypeError, "subwin requires 2 or 4 arguments");
1856 return NULL;
1857 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001858
Victor Stinner26486ea2010-05-15 22:23:53 +00001859 /* printf("Subwin: %i %i %i %i \n", nlines, ncols, begin_y, begin_x); */
Masayuki Yamamoto8bc7d632017-11-01 21:05:26 +09001860#ifdef py_is_pad
1861 if (py_is_pad(self->win)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001862 win = subpad(self->win, nlines, ncols, begin_y, begin_x);
Masayuki Yamamoto8bc7d632017-11-01 21:05:26 +09001863 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001864 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001865#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001866 win = subwin(self->win, nlines, ncols, begin_y, begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001867
Victor Stinner26486ea2010-05-15 22:23:53 +00001868 if (win == NULL) {
1869 PyErr_SetString(PyCursesError, catchall_NULL);
1870 return NULL;
1871 }
1872
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001873 return (PyObject *)PyCursesWindow_New(win, self->encoding);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001874}
1875
1876static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001877PyCursesWindow_Scroll(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001878{
Victor Stinner26486ea2010-05-15 22:23:53 +00001879 int nlines;
1880 switch(PyTuple_Size(args)) {
1881 case 0:
1882 return PyCursesCheckERR(scroll(self->win), "scroll");
1883 case 1:
1884 if (!PyArg_ParseTuple(args, "i;nlines", &nlines))
1885 return NULL;
1886 return PyCursesCheckERR(wscrl(self->win, nlines), "scroll");
1887 default:
1888 PyErr_SetString(PyExc_TypeError, "scroll requires 0 or 1 arguments");
1889 return NULL;
1890 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001891}
1892
1893static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001894PyCursesWindow_TouchLine(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001895{
Victor Stinner26486ea2010-05-15 22:23:53 +00001896 int st, cnt, val;
1897 switch (PyTuple_Size(args)) {
1898 case 2:
1899 if (!PyArg_ParseTuple(args,"ii;start,count",&st,&cnt))
1900 return NULL;
1901 return PyCursesCheckERR(touchline(self->win,st,cnt), "touchline");
1902 case 3:
1903 if (!PyArg_ParseTuple(args, "iii;start,count,val", &st, &cnt, &val))
1904 return NULL;
1905 return PyCursesCheckERR(wtouchln(self->win, st, cnt, val), "touchline");
1906 default:
1907 PyErr_SetString(PyExc_TypeError, "touchline requires 2 or 3 arguments");
1908 return NULL;
1909 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001910}
1911
1912static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001913PyCursesWindow_Vline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001914{
Victor Stinner26486ea2010-05-15 22:23:53 +00001915 PyObject *temp;
1916 chtype ch;
1917 int n, x, y, code = OK;
1918 attr_t attr = A_NORMAL;
1919 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001920
Victor Stinner26486ea2010-05-15 22:23:53 +00001921 switch (PyTuple_Size(args)) {
1922 case 2:
1923 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
1924 return NULL;
1925 break;
1926 case 3:
1927 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &lattr))
1928 return NULL;
1929 attr = lattr;
1930 break;
1931 case 4:
1932 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
1933 return NULL;
1934 code = wmove(self->win, y, x);
1935 break;
1936 case 5:
1937 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
1938 &y, &x, &temp, &n, &lattr))
1939 return NULL;
1940 attr = lattr;
1941 code = wmove(self->win, y, x);
1942 break;
1943 default:
1944 PyErr_SetString(PyExc_TypeError, "vline requires 2 to 5 arguments");
1945 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001946 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001947
1948 if (code != ERR) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001949 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001950 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001951 return PyCursesCheckERR(wvline(self->win, ch | attr, n), "vline");
1952 } else
1953 return PyCursesCheckERR(code, "wmove");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001954}
1955
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001956static PyObject *
1957PyCursesWindow_get_encoding(PyCursesWindowObject *self, void *closure)
1958{
1959 return PyUnicode_FromString(self->encoding);
1960}
1961
1962static int
1963PyCursesWindow_set_encoding(PyCursesWindowObject *self, PyObject *value)
1964{
1965 PyObject *ascii;
1966 char *encoding;
1967
1968 /* It is illegal to del win.encoding */
1969 if (value == NULL) {
1970 PyErr_SetString(PyExc_TypeError,
1971 "encoding may not be deleted");
1972 return -1;
1973 }
1974
1975 if (!PyUnicode_Check(value)) {
1976 PyErr_SetString(PyExc_TypeError,
1977 "setting encoding to a non-string");
1978 return -1;
1979 }
1980 ascii = PyUnicode_AsASCIIString(value);
1981 if (ascii == NULL)
1982 return -1;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02001983 encoding = _PyMem_Strdup(PyBytes_AS_STRING(ascii));
Ross Lagerwall2dabaf62012-09-07 08:34:23 +02001984 Py_DECREF(ascii);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001985 if (encoding == NULL) {
1986 PyErr_NoMemory();
1987 return -1;
1988 }
Victor Stinner49fc8ec2013-07-07 23:30:24 +02001989 PyMem_Free(self->encoding);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001990 self->encoding = encoding;
1991 return 0;
1992}
1993
1994
Guido van Rossumf6971e21994-08-30 12:25:20 +00001995static PyMethodDef PyCursesWindow_Methods[] = {
Larry Hastings31826802013-10-19 00:09:25 -07001996 CURSES_WINDOW_ADDCH_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00001997 {"addnstr", (PyCFunction)PyCursesWindow_AddNStr, METH_VARARGS},
1998 {"addstr", (PyCFunction)PyCursesWindow_AddStr, METH_VARARGS},
1999 {"attroff", (PyCFunction)PyCursesWindow_AttrOff, METH_VARARGS},
2000 {"attron", (PyCFunction)PyCursesWindow_AttrOn, METH_VARARGS},
2001 {"attrset", (PyCFunction)PyCursesWindow_AttrSet, METH_VARARGS},
2002 {"bkgd", (PyCFunction)PyCursesWindow_Bkgd, METH_VARARGS},
Serhiy Storchaka894ebd02017-11-01 14:34:20 +02002003#ifdef HAVE_CURSES_WCHGAT
Victor Stinner26486ea2010-05-15 22:23:53 +00002004 {"chgat", (PyCFunction)PyCursesWindow_ChgAt, METH_VARARGS},
Serhiy Storchaka894ebd02017-11-01 14:34:20 +02002005#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002006 {"bkgdset", (PyCFunction)PyCursesWindow_BkgdSet, METH_VARARGS},
2007 {"border", (PyCFunction)PyCursesWindow_Border, METH_VARARGS},
2008 {"box", (PyCFunction)PyCursesWindow_Box, METH_VARARGS},
2009 {"clear", (PyCFunction)PyCursesWindow_wclear, METH_NOARGS},
2010 {"clearok", (PyCFunction)PyCursesWindow_clearok, METH_VARARGS},
2011 {"clrtobot", (PyCFunction)PyCursesWindow_wclrtobot, METH_NOARGS},
2012 {"clrtoeol", (PyCFunction)PyCursesWindow_wclrtoeol, METH_NOARGS},
2013 {"cursyncup", (PyCFunction)PyCursesWindow_wcursyncup, METH_NOARGS},
2014 {"delch", (PyCFunction)PyCursesWindow_DelCh, METH_VARARGS},
2015 {"deleteln", (PyCFunction)PyCursesWindow_wdeleteln, METH_NOARGS},
2016 {"derwin", (PyCFunction)PyCursesWindow_DerWin, METH_VARARGS},
2017 {"echochar", (PyCFunction)PyCursesWindow_EchoChar, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002018#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00002019 {"enclose", (PyCFunction)PyCursesWindow_Enclose, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002020#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002021 {"erase", (PyCFunction)PyCursesWindow_werase, METH_NOARGS},
2022 {"getbegyx", (PyCFunction)PyCursesWindow_getbegyx, METH_NOARGS},
2023 {"getbkgd", (PyCFunction)PyCursesWindow_GetBkgd, METH_NOARGS},
2024 {"getch", (PyCFunction)PyCursesWindow_GetCh, METH_VARARGS},
2025 {"getkey", (PyCFunction)PyCursesWindow_GetKey, METH_VARARGS},
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02002026#ifdef HAVE_NCURSESW
Victor Stinnera7878b72011-07-14 23:07:44 +02002027 {"get_wch", (PyCFunction)PyCursesWindow_Get_WCh, METH_VARARGS},
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02002028#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002029 {"getmaxyx", (PyCFunction)PyCursesWindow_getmaxyx, METH_NOARGS},
2030 {"getparyx", (PyCFunction)PyCursesWindow_getparyx, METH_NOARGS},
2031 {"getstr", (PyCFunction)PyCursesWindow_GetStr, METH_VARARGS},
2032 {"getyx", (PyCFunction)PyCursesWindow_getyx, METH_NOARGS},
2033 {"hline", (PyCFunction)PyCursesWindow_Hline, METH_VARARGS},
2034 {"idcok", (PyCFunction)PyCursesWindow_idcok, METH_VARARGS},
2035 {"idlok", (PyCFunction)PyCursesWindow_idlok, METH_VARARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002036#ifdef HAVE_CURSES_IMMEDOK
Victor Stinner26486ea2010-05-15 22:23:53 +00002037 {"immedok", (PyCFunction)PyCursesWindow_immedok, METH_VARARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002038#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002039 {"inch", (PyCFunction)PyCursesWindow_InCh, METH_VARARGS},
2040 {"insch", (PyCFunction)PyCursesWindow_InsCh, METH_VARARGS},
2041 {"insdelln", (PyCFunction)PyCursesWindow_winsdelln, METH_VARARGS},
2042 {"insertln", (PyCFunction)PyCursesWindow_winsertln, METH_NOARGS},
2043 {"insnstr", (PyCFunction)PyCursesWindow_InsNStr, METH_VARARGS},
2044 {"insstr", (PyCFunction)PyCursesWindow_InsStr, METH_VARARGS},
2045 {"instr", (PyCFunction)PyCursesWindow_InStr, METH_VARARGS},
2046 {"is_linetouched", (PyCFunction)PyCursesWindow_Is_LineTouched, METH_VARARGS},
2047 {"is_wintouched", (PyCFunction)PyCursesWindow_is_wintouched, METH_NOARGS},
2048 {"keypad", (PyCFunction)PyCursesWindow_keypad, METH_VARARGS},
2049 {"leaveok", (PyCFunction)PyCursesWindow_leaveok, METH_VARARGS},
2050 {"move", (PyCFunction)PyCursesWindow_wmove, METH_VARARGS},
2051 {"mvderwin", (PyCFunction)PyCursesWindow_mvderwin, METH_VARARGS},
2052 {"mvwin", (PyCFunction)PyCursesWindow_mvwin, METH_VARARGS},
2053 {"nodelay", (PyCFunction)PyCursesWindow_nodelay, METH_VARARGS},
2054 {"notimeout", (PyCFunction)PyCursesWindow_notimeout, METH_VARARGS},
2055 {"noutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh, METH_VARARGS},
Victor Stinner26486ea2010-05-15 22:23:53 +00002056 {"overlay", (PyCFunction)PyCursesWindow_Overlay, METH_VARARGS},
2057 {"overwrite", (PyCFunction)PyCursesWindow_Overwrite,
2058 METH_VARARGS},
2059 {"putwin", (PyCFunction)PyCursesWindow_PutWin, METH_O},
2060 {"redrawln", (PyCFunction)PyCursesWindow_RedrawLine, METH_VARARGS},
2061 {"redrawwin", (PyCFunction)PyCursesWindow_redrawwin, METH_NOARGS},
2062 {"refresh", (PyCFunction)PyCursesWindow_Refresh, METH_VARARGS},
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00002063#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00002064 {"resize", (PyCFunction)PyCursesWindow_wresize, METH_VARARGS},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002065#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002066 {"scroll", (PyCFunction)PyCursesWindow_Scroll, METH_VARARGS},
2067 {"scrollok", (PyCFunction)PyCursesWindow_scrollok, METH_VARARGS},
2068 {"setscrreg", (PyCFunction)PyCursesWindow_SetScrollRegion, METH_VARARGS},
2069 {"standend", (PyCFunction)PyCursesWindow_wstandend, METH_NOARGS},
2070 {"standout", (PyCFunction)PyCursesWindow_wstandout, METH_NOARGS},
2071 {"subpad", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
2072 {"subwin", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
2073 {"syncdown", (PyCFunction)PyCursesWindow_wsyncdown, METH_NOARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002074#ifdef HAVE_CURSES_SYNCOK
Victor Stinner26486ea2010-05-15 22:23:53 +00002075 {"syncok", (PyCFunction)PyCursesWindow_syncok, METH_VARARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002076#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002077 {"syncup", (PyCFunction)PyCursesWindow_wsyncup, METH_NOARGS},
2078 {"timeout", (PyCFunction)PyCursesWindow_wtimeout, METH_VARARGS},
2079 {"touchline", (PyCFunction)PyCursesWindow_TouchLine, METH_VARARGS},
2080 {"touchwin", (PyCFunction)PyCursesWindow_touchwin, METH_NOARGS},
2081 {"untouchwin", (PyCFunction)PyCursesWindow_untouchwin, METH_NOARGS},
2082 {"vline", (PyCFunction)PyCursesWindow_Vline, METH_VARARGS},
2083 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002084};
2085
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002086static PyGetSetDef PyCursesWindow_getsets[] = {
2087 {"encoding",
2088 (getter)PyCursesWindow_get_encoding,
2089 (setter)PyCursesWindow_set_encoding,
Ronald Oussoren2a7fe032012-01-17 16:53:20 +01002090 "the typecode character used to create the array"},
2091 {NULL, NULL, NULL, NULL } /* sentinel */
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002092};
2093
Guido van Rossumf6971e21994-08-30 12:25:20 +00002094/* -------------------------------------------------------*/
Guido van Rossum85738471995-02-17 13:50:17 +00002095
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002096PyTypeObject PyCursesWindow_Type = {
Victor Stinner26486ea2010-05-15 22:23:53 +00002097 PyVarObject_HEAD_INIT(NULL, 0)
Victor Stinner61e2bc72017-02-12 23:42:02 +01002098 "_curses.window", /*tp_name*/
Victor Stinner26486ea2010-05-15 22:23:53 +00002099 sizeof(PyCursesWindowObject), /*tp_basicsize*/
2100 0, /*tp_itemsize*/
2101 /* methods */
2102 (destructor)PyCursesWindow_Dealloc, /*tp_dealloc*/
2103 0, /*tp_print*/
2104 (getattrfunc)0, /*tp_getattr*/
2105 (setattrfunc)0, /*tp_setattr*/
2106 0, /*tp_reserved*/
2107 0, /*tp_repr*/
2108 0, /*tp_as_number*/
2109 0, /*tp_as_sequence*/
2110 0, /*tp_as_mapping*/
2111 0, /*tp_hash*/
2112 0, /*tp_call*/
2113 0, /*tp_str*/
2114 0, /*tp_getattro*/
2115 0, /*tp_setattro*/
2116 0, /*tp_as_buffer*/
2117 Py_TPFLAGS_DEFAULT, /*tp_flags*/
2118 0, /*tp_doc*/
2119 0, /*tp_traverse*/
2120 0, /*tp_clear*/
2121 0, /*tp_richcompare*/
2122 0, /*tp_weaklistoffset*/
2123 0, /*tp_iter*/
2124 0, /*tp_iternext*/
2125 PyCursesWindow_Methods, /*tp_methods*/
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002126 0, /* tp_members */
2127 PyCursesWindow_getsets, /* tp_getset */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002128};
2129
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002130/*********************************************************************
2131 Global Functions
2132**********************************************************************/
Guido van Rossumf6971e21994-08-30 12:25:20 +00002133
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002134NoArgNoReturnFunction(beep)
2135NoArgNoReturnFunction(def_prog_mode)
2136NoArgNoReturnFunction(def_shell_mode)
2137NoArgNoReturnFunction(doupdate)
2138NoArgNoReturnFunction(endwin)
2139NoArgNoReturnFunction(flash)
2140NoArgNoReturnFunction(nocbreak)
2141NoArgNoReturnFunction(noecho)
2142NoArgNoReturnFunction(nonl)
2143NoArgNoReturnFunction(noraw)
2144NoArgNoReturnFunction(reset_prog_mode)
2145NoArgNoReturnFunction(reset_shell_mode)
2146NoArgNoReturnFunction(resetty)
2147NoArgNoReturnFunction(savetty)
2148
2149NoArgOrFlagNoReturnFunction(cbreak)
2150NoArgOrFlagNoReturnFunction(echo)
2151NoArgOrFlagNoReturnFunction(nl)
2152NoArgOrFlagNoReturnFunction(raw)
2153
2154NoArgReturnIntFunction(baudrate)
2155NoArgReturnIntFunction(termattrs)
2156
2157NoArgReturnStringFunction(termname)
2158NoArgReturnStringFunction(longname)
2159
2160NoArgTrueFalseFunction(can_change_color)
2161NoArgTrueFalseFunction(has_colors)
2162NoArgTrueFalseFunction(has_ic)
2163NoArgTrueFalseFunction(has_il)
2164NoArgTrueFalseFunction(isendwin)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002165NoArgNoReturnVoidFunction(flushinp)
2166NoArgNoReturnVoidFunction(noqiflush)
2167
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002168#ifdef HAVE_CURSES_FILTER
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002169static PyObject *
Christian Heimesaf98da12008-01-27 15:18:18 +00002170PyCurses_filter(PyObject *self)
2171{
Victor Stinner26486ea2010-05-15 22:23:53 +00002172 /* not checking for PyCursesInitialised here since filter() must
2173 be called before initscr() */
2174 filter();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002175 Py_RETURN_NONE;
Christian Heimesaf98da12008-01-27 15:18:18 +00002176}
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002177#endif
Christian Heimesaf98da12008-01-27 15:18:18 +00002178
2179static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002180PyCurses_Color_Content(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002181{
Victor Stinner26486ea2010-05-15 22:23:53 +00002182 short color,r,g,b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002183
Victor Stinner26486ea2010-05-15 22:23:53 +00002184 PyCursesInitialised;
2185 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002186
Victor Stinner26486ea2010-05-15 22:23:53 +00002187 if (!PyArg_ParseTuple(args, "h:color_content", &color)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002188
Victor Stinner26486ea2010-05-15 22:23:53 +00002189 if (color_content(color, &r, &g, &b) != ERR)
2190 return Py_BuildValue("(iii)", r, g, b);
2191 else {
2192 PyErr_SetString(PyCursesError,
2193 "Argument 1 was out of range. Check value of COLORS.");
2194 return NULL;
2195 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002196}
2197
2198static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002199PyCurses_color_pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002200{
Victor Stinner26486ea2010-05-15 22:23:53 +00002201 int n;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002202
Victor Stinner26486ea2010-05-15 22:23:53 +00002203 PyCursesInitialised;
2204 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002205
Victor Stinner26486ea2010-05-15 22:23:53 +00002206 if (!PyArg_ParseTuple(args, "i:color_pair", &n)) return NULL;
2207 return PyLong_FromLong((long) (n << 8));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002208}
2209
2210static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002211PyCurses_Curs_Set(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002212{
Victor Stinner26486ea2010-05-15 22:23:53 +00002213 int vis,erg;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002214
Victor Stinner26486ea2010-05-15 22:23:53 +00002215 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002216
Victor Stinner26486ea2010-05-15 22:23:53 +00002217 if (!PyArg_ParseTuple(args, "i:curs_set", &vis)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002218
Victor Stinner26486ea2010-05-15 22:23:53 +00002219 erg = curs_set(vis);
2220 if (erg == ERR) return PyCursesCheckERR(erg, "curs_set");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002221
Victor Stinner26486ea2010-05-15 22:23:53 +00002222 return PyLong_FromLong((long) erg);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002223}
2224
2225static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002226PyCurses_Delay_Output(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002227{
Victor Stinner26486ea2010-05-15 22:23:53 +00002228 int ms;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002229
Victor Stinner26486ea2010-05-15 22:23:53 +00002230 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002231
Victor Stinner26486ea2010-05-15 22:23:53 +00002232 if (!PyArg_ParseTuple(args, "i:delay_output", &ms)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002233
Victor Stinner26486ea2010-05-15 22:23:53 +00002234 return PyCursesCheckERR(delay_output(ms), "delay_output");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002235}
2236
2237static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002238PyCurses_EraseChar(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002239{
Victor Stinner26486ea2010-05-15 22:23:53 +00002240 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002241
Victor Stinner26486ea2010-05-15 22:23:53 +00002242 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002243
Victor Stinner26486ea2010-05-15 22:23:53 +00002244 ch = erasechar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002245
Victor Stinner26486ea2010-05-15 22:23:53 +00002246 return PyBytes_FromStringAndSize(&ch, 1);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002247}
2248
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002249#ifdef getsyx
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002250static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002251PyCurses_getsyx(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002252{
Victor Stinner26486ea2010-05-15 22:23:53 +00002253 int x = 0;
2254 int y = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002255
Victor Stinner26486ea2010-05-15 22:23:53 +00002256 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002257
Victor Stinner26486ea2010-05-15 22:23:53 +00002258 getsyx(y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002259
Victor Stinner26486ea2010-05-15 22:23:53 +00002260 return Py_BuildValue("(ii)", y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002261}
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002262#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002263
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002264#ifdef NCURSES_MOUSE_VERSION
2265static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002266PyCurses_GetMouse(PyObject *self)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002267{
Victor Stinner26486ea2010-05-15 22:23:53 +00002268 int rtn;
2269 MEVENT event;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002270
Victor Stinner26486ea2010-05-15 22:23:53 +00002271 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002272
Victor Stinner26486ea2010-05-15 22:23:53 +00002273 rtn = getmouse( &event );
2274 if (rtn == ERR) {
2275 PyErr_SetString(PyCursesError, "getmouse() returned ERR");
2276 return NULL;
2277 }
Serhiy Storchaka4f469c02017-11-01 20:48:49 +02002278 return Py_BuildValue("(hiiik)",
Victor Stinner26486ea2010-05-15 22:23:53 +00002279 (short)event.id,
Serhiy Storchaka4f469c02017-11-01 20:48:49 +02002280 (int)event.x, (int)event.y, (int)event.z,
2281 (unsigned long) event.bstate);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002282}
2283
2284static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002285PyCurses_UngetMouse(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002286{
Victor Stinner26486ea2010-05-15 22:23:53 +00002287 MEVENT event;
Serhiy Storchaka4f469c02017-11-01 20:48:49 +02002288 short id;
2289 int x, y, z;
2290 unsigned long bstate;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002291
Victor Stinner26486ea2010-05-15 22:23:53 +00002292 PyCursesInitialised;
Serhiy Storchaka4f469c02017-11-01 20:48:49 +02002293 if (!PyArg_ParseTuple(args, "hiiik",
2294 &id, &x, &y, &z, &bstate))
Victor Stinner26486ea2010-05-15 22:23:53 +00002295 return NULL;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002296
Serhiy Storchaka4f469c02017-11-01 20:48:49 +02002297 event.id = id;
2298 event.x = x;
2299 event.y = y;
2300 event.z = z;
2301 event.bstate = bstate;
Victor Stinner26486ea2010-05-15 22:23:53 +00002302 return PyCursesCheckERR(ungetmouse(&event), "ungetmouse");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002303}
2304#endif
2305
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002306static PyObject *
Guido van Rossum6c95da32007-07-24 00:16:38 +00002307PyCurses_GetWin(PyCursesWindowObject *self, PyObject *stream)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002308{
Christian Heimes2b221b72017-03-02 11:09:01 +01002309 FILE *fp;
Victor Stinner26486ea2010-05-15 22:23:53 +00002310 PyObject *data;
2311 size_t datalen;
2312 WINDOW *win;
Benjamin Peterson18b71912013-05-16 15:29:44 -05002313 _Py_IDENTIFIER(read);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002314 PyObject *res = NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002315
Victor Stinner26486ea2010-05-15 22:23:53 +00002316 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002317
Christian Heimes2b221b72017-03-02 11:09:01 +01002318 fp = tmpfile();
2319 if (fp == NULL)
2320 return PyErr_SetFromErrno(PyExc_OSError);
2321
2322 if (_Py_set_inheritable(fileno(fp), 0, NULL) < 0)
Victor Stinnerdaf45552013-08-28 00:53:59 +02002323 goto error;
Christian Heimes2b221b72017-03-02 11:09:01 +01002324
Victor Stinnerdaf45552013-08-28 00:53:59 +02002325
Victor Stinner3466bde2016-09-05 18:16:01 -07002326 data = _PyObject_CallMethodId(stream, &PyId_read, NULL);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002327 if (data == NULL)
2328 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002329 if (!PyBytes_Check(data)) {
2330 PyErr_Format(PyExc_TypeError,
2331 "f.read() returned %.100s instead of bytes",
2332 data->ob_type->tp_name);
2333 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002334 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002335 }
2336 datalen = PyBytes_GET_SIZE(data);
2337 if (fwrite(PyBytes_AS_STRING(data), 1, datalen, fp) != datalen) {
2338 Py_DECREF(data);
Christian Heimes2b221b72017-03-02 11:09:01 +01002339 PyErr_SetFromErrno(PyExc_OSError);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002340 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002341 }
Guido van Rossum6c95da32007-07-24 00:16:38 +00002342 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002343
Victor Stinner26486ea2010-05-15 22:23:53 +00002344 fseek(fp, 0, 0);
2345 win = getwin(fp);
Victor Stinner26486ea2010-05-15 22:23:53 +00002346 if (win == NULL) {
2347 PyErr_SetString(PyCursesError, catchall_NULL);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002348 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002349 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02002350 res = PyCursesWindow_New(win, NULL);
2351
2352error:
Christian Heimes2b221b72017-03-02 11:09:01 +01002353 fclose(fp);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002354 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002355}
2356
2357static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002358PyCurses_HalfDelay(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002359{
Victor Stinner26486ea2010-05-15 22:23:53 +00002360 unsigned char tenths;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002361
Victor Stinner26486ea2010-05-15 22:23:53 +00002362 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002363
Victor Stinner26486ea2010-05-15 22:23:53 +00002364 if (!PyArg_ParseTuple(args, "b:halfdelay", &tenths)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002365
Victor Stinner26486ea2010-05-15 22:23:53 +00002366 return PyCursesCheckERR(halfdelay(tenths), "halfdelay");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002367}
2368
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002369#ifdef HAVE_CURSES_HAS_KEY
2370static PyObject *
2371PyCurses_has_key(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002372{
Victor Stinner26486ea2010-05-15 22:23:53 +00002373 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002374
Victor Stinner26486ea2010-05-15 22:23:53 +00002375 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002376
Victor Stinner26486ea2010-05-15 22:23:53 +00002377 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002378
Victor Stinner26486ea2010-05-15 22:23:53 +00002379 if (has_key(ch) == FALSE) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002380 Py_RETURN_FALSE;
Victor Stinner26486ea2010-05-15 22:23:53 +00002381 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002382 Py_RETURN_TRUE;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002383}
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002384#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002385
2386static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002387PyCurses_Init_Color(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002388{
Victor Stinner26486ea2010-05-15 22:23:53 +00002389 short color, r, g, b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002390
Victor Stinner26486ea2010-05-15 22:23:53 +00002391 PyCursesInitialised;
2392 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002393
Victor Stinner26486ea2010-05-15 22:23:53 +00002394 switch(PyTuple_Size(args)) {
2395 case 4:
2396 if (!PyArg_ParseTuple(args, "hhhh;color,r,g,b", &color, &r, &g, &b)) return NULL;
2397 break;
2398 default:
2399 PyErr_SetString(PyExc_TypeError, "init_color requires 4 arguments");
2400 return NULL;
2401 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002402
Victor Stinner26486ea2010-05-15 22:23:53 +00002403 return PyCursesCheckERR(init_color(color, r, g, b), "init_color");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002404}
2405
2406static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002407PyCurses_Init_Pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002408{
Victor Stinner26486ea2010-05-15 22:23:53 +00002409 short pair, f, b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002410
Victor Stinner26486ea2010-05-15 22:23:53 +00002411 PyCursesInitialised;
2412 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002413
Victor Stinner26486ea2010-05-15 22:23:53 +00002414 if (PyTuple_Size(args) != 3) {
2415 PyErr_SetString(PyExc_TypeError, "init_pair requires 3 arguments");
2416 return NULL;
2417 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002418
Victor Stinner26486ea2010-05-15 22:23:53 +00002419 if (!PyArg_ParseTuple(args, "hhh;pair, f, b", &pair, &f, &b)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002420
Victor Stinner26486ea2010-05-15 22:23:53 +00002421 return PyCursesCheckERR(init_pair(pair, f, b), "init_pair");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002422}
2423
Andrew M. Kuchling32552682000-12-22 21:52:27 +00002424static PyObject *ModDict;
2425
Victor Stinner26486ea2010-05-15 22:23:53 +00002426static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002427PyCurses_InitScr(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002428{
Victor Stinner26486ea2010-05-15 22:23:53 +00002429 WINDOW *win;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002430 PyCursesWindowObject *winobj;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002431
Victor Stinner26486ea2010-05-15 22:23:53 +00002432 if (initialised == TRUE) {
2433 wrefresh(stdscr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002434 return (PyObject *)PyCursesWindow_New(stdscr, NULL);
Victor Stinner26486ea2010-05-15 22:23:53 +00002435 }
Guido van Rossum56bf2351994-08-31 22:06:24 +00002436
Victor Stinner26486ea2010-05-15 22:23:53 +00002437 win = initscr();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002438
Victor Stinner26486ea2010-05-15 22:23:53 +00002439 if (win == NULL) {
2440 PyErr_SetString(PyCursesError, catchall_NULL);
2441 return NULL;
2442 }
Guido van Rossum85738471995-02-17 13:50:17 +00002443
Victor Stinner26486ea2010-05-15 22:23:53 +00002444 initialised = initialised_setupterm = TRUE;
Guido van Rossum56bf2351994-08-31 22:06:24 +00002445
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002446/* This was moved from initcurses() because it core dumped on SGI,
2447 where they're not defined until you've called initscr() */
Victor Stinner26486ea2010-05-15 22:23:53 +00002448#define SetDictInt(string,ch) \
2449 do { \
2450 PyObject *o = PyLong_FromLong((long) (ch)); \
2451 if (o && PyDict_SetItemString(ModDict, string, o) == 0) { \
2452 Py_DECREF(o); \
2453 } \
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002454 } while (0)
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002455
Victor Stinner26486ea2010-05-15 22:23:53 +00002456 /* Here are some graphic symbols you can use */
2457 SetDictInt("ACS_ULCORNER", (ACS_ULCORNER));
2458 SetDictInt("ACS_LLCORNER", (ACS_LLCORNER));
2459 SetDictInt("ACS_URCORNER", (ACS_URCORNER));
2460 SetDictInt("ACS_LRCORNER", (ACS_LRCORNER));
2461 SetDictInt("ACS_LTEE", (ACS_LTEE));
2462 SetDictInt("ACS_RTEE", (ACS_RTEE));
2463 SetDictInt("ACS_BTEE", (ACS_BTEE));
2464 SetDictInt("ACS_TTEE", (ACS_TTEE));
2465 SetDictInt("ACS_HLINE", (ACS_HLINE));
2466 SetDictInt("ACS_VLINE", (ACS_VLINE));
2467 SetDictInt("ACS_PLUS", (ACS_PLUS));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00002468#if !defined(__hpux) || defined(HAVE_NCURSES_H)
Victor Stinner26486ea2010-05-15 22:23:53 +00002469 /* On HP/UX 11, these are of type cchar_t, which is not an
2470 integral type. If this is a problem on more platforms, a
2471 configure test should be added to determine whether ACS_S1
2472 is of integral type. */
2473 SetDictInt("ACS_S1", (ACS_S1));
2474 SetDictInt("ACS_S9", (ACS_S9));
2475 SetDictInt("ACS_DIAMOND", (ACS_DIAMOND));
2476 SetDictInt("ACS_CKBOARD", (ACS_CKBOARD));
2477 SetDictInt("ACS_DEGREE", (ACS_DEGREE));
2478 SetDictInt("ACS_PLMINUS", (ACS_PLMINUS));
2479 SetDictInt("ACS_BULLET", (ACS_BULLET));
2480 SetDictInt("ACS_LARROW", (ACS_LARROW));
2481 SetDictInt("ACS_RARROW", (ACS_RARROW));
2482 SetDictInt("ACS_DARROW", (ACS_DARROW));
2483 SetDictInt("ACS_UARROW", (ACS_UARROW));
2484 SetDictInt("ACS_BOARD", (ACS_BOARD));
2485 SetDictInt("ACS_LANTERN", (ACS_LANTERN));
2486 SetDictInt("ACS_BLOCK", (ACS_BLOCK));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00002487#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002488 SetDictInt("ACS_BSSB", (ACS_ULCORNER));
2489 SetDictInt("ACS_SSBB", (ACS_LLCORNER));
2490 SetDictInt("ACS_BBSS", (ACS_URCORNER));
2491 SetDictInt("ACS_SBBS", (ACS_LRCORNER));
2492 SetDictInt("ACS_SBSS", (ACS_RTEE));
2493 SetDictInt("ACS_SSSB", (ACS_LTEE));
2494 SetDictInt("ACS_SSBS", (ACS_BTEE));
2495 SetDictInt("ACS_BSSS", (ACS_TTEE));
2496 SetDictInt("ACS_BSBS", (ACS_HLINE));
2497 SetDictInt("ACS_SBSB", (ACS_VLINE));
2498 SetDictInt("ACS_SSSS", (ACS_PLUS));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002499
Victor Stinner26486ea2010-05-15 22:23:53 +00002500 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002501#ifdef ACS_S3
Victor Stinner26486ea2010-05-15 22:23:53 +00002502 SetDictInt("ACS_S3", (ACS_S3));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002503#endif
2504#ifdef ACS_S7
Victor Stinner26486ea2010-05-15 22:23:53 +00002505 SetDictInt("ACS_S7", (ACS_S7));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002506#endif
2507#ifdef ACS_LEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002508 SetDictInt("ACS_LEQUAL", (ACS_LEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002509#endif
2510#ifdef ACS_GEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002511 SetDictInt("ACS_GEQUAL", (ACS_GEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002512#endif
2513#ifdef ACS_PI
Victor Stinner26486ea2010-05-15 22:23:53 +00002514 SetDictInt("ACS_PI", (ACS_PI));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002515#endif
2516#ifdef ACS_NEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002517 SetDictInt("ACS_NEQUAL", (ACS_NEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002518#endif
2519#ifdef ACS_STERLING
Victor Stinner26486ea2010-05-15 22:23:53 +00002520 SetDictInt("ACS_STERLING", (ACS_STERLING));
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002521#endif
2522
Victor Stinner26486ea2010-05-15 22:23:53 +00002523 SetDictInt("LINES", LINES);
2524 SetDictInt("COLS", COLS);
Guido van Rossum56bf2351994-08-31 22:06:24 +00002525
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002526 winobj = (PyCursesWindowObject *)PyCursesWindow_New(win, NULL);
2527 screen_encoding = winobj->encoding;
2528 return (PyObject *)winobj;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002529}
2530
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002531static PyObject *
2532PyCurses_setupterm(PyObject* self, PyObject *args, PyObject* keywds)
2533{
Victor Stinner26486ea2010-05-15 22:23:53 +00002534 int fd = -1;
2535 int err;
2536 char* termstr = NULL;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002537
Victor Stinner26486ea2010-05-15 22:23:53 +00002538 static char *kwlist[] = {"term", "fd", NULL};
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002539
Victor Stinner26486ea2010-05-15 22:23:53 +00002540 if (!PyArg_ParseTupleAndKeywords(
2541 args, keywds, "|zi:setupterm", kwlist, &termstr, &fd)) {
2542 return NULL;
2543 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002544
Victor Stinner26486ea2010-05-15 22:23:53 +00002545 if (fd == -1) {
2546 PyObject* sys_stdout;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002547
Victor Stinnerbd303c12013-11-07 23:07:29 +01002548 sys_stdout = PySys_GetObject("stdout");
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002549
Victor Stinner26486ea2010-05-15 22:23:53 +00002550 if (sys_stdout == NULL || sys_stdout == Py_None) {
2551 PyErr_SetString(
2552 PyCursesError,
2553 "lost sys.stdout");
2554 return NULL;
2555 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002556
Victor Stinner26486ea2010-05-15 22:23:53 +00002557 fd = PyObject_AsFileDescriptor(sys_stdout);
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002558
Victor Stinner26486ea2010-05-15 22:23:53 +00002559 if (fd == -1) {
2560 return NULL;
2561 }
2562 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002563
Matthias Klose635edd12010-07-30 21:40:57 +00002564 if (!initialised_setupterm && setupterm(termstr,fd,&err) == ERR) {
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02002565 const char* s = "setupterm: unknown error";
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002566
Victor Stinner26486ea2010-05-15 22:23:53 +00002567 if (err == 0) {
2568 s = "setupterm: could not find terminal";
2569 } else if (err == -1) {
2570 s = "setupterm: could not find terminfo database";
2571 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002572
Victor Stinner26486ea2010-05-15 22:23:53 +00002573 PyErr_SetString(PyCursesError,s);
2574 return NULL;
2575 }
2576
2577 initialised_setupterm = TRUE;
2578
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002579 Py_RETURN_NONE;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002580}
Guido van Rossumf6971e21994-08-30 12:25:20 +00002581
2582static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002583PyCurses_IntrFlush(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002584{
Victor Stinner26486ea2010-05-15 22:23:53 +00002585 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002586
Victor Stinner26486ea2010-05-15 22:23:53 +00002587 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002588
Victor Stinner26486ea2010-05-15 22:23:53 +00002589 switch(PyTuple_Size(args)) {
2590 case 1:
2591 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
2592 break;
2593 default:
2594 PyErr_SetString(PyExc_TypeError, "intrflush requires 1 argument");
2595 return NULL;
2596 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002597
Victor Stinner26486ea2010-05-15 22:23:53 +00002598 return PyCursesCheckERR(intrflush(NULL,ch), "intrflush");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002599}
2600
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002601#ifdef HAVE_CURSES_IS_TERM_RESIZED
2602static PyObject *
2603PyCurses_Is_Term_Resized(PyObject *self, PyObject *args)
2604{
Victor Stinner26486ea2010-05-15 22:23:53 +00002605 int lines;
2606 int columns;
2607 int result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002608
Victor Stinner26486ea2010-05-15 22:23:53 +00002609 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002610
Victor Stinner26486ea2010-05-15 22:23:53 +00002611 if (!PyArg_ParseTuple(args,"ii:is_term_resized", &lines, &columns))
2612 return NULL;
2613 result = is_term_resized(lines, columns);
2614 if (result == TRUE) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002615 Py_RETURN_TRUE;
Victor Stinner26486ea2010-05-15 22:23:53 +00002616 } else {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002617 Py_RETURN_FALSE;
Victor Stinner26486ea2010-05-15 22:23:53 +00002618 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002619}
2620#endif /* HAVE_CURSES_IS_TERM_RESIZED */
2621
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002622static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002623PyCurses_KeyName(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002624{
Victor Stinner26486ea2010-05-15 22:23:53 +00002625 const char *knp;
2626 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002627
Victor Stinner26486ea2010-05-15 22:23:53 +00002628 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002629
Victor Stinner26486ea2010-05-15 22:23:53 +00002630 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002631
Victor Stinner26486ea2010-05-15 22:23:53 +00002632 if (ch < 0) {
2633 PyErr_SetString(PyExc_ValueError, "invalid key number");
2634 return NULL;
2635 }
2636 knp = keyname(ch);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002637
Serhiy Storchaka20b39b22014-09-28 11:27:24 +03002638 return PyBytes_FromString((knp == NULL) ? "" : knp);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002639}
2640
Victor Stinner26486ea2010-05-15 22:23:53 +00002641static PyObject *
2642PyCurses_KillChar(PyObject *self)
2643{
2644 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002645
Victor Stinner26486ea2010-05-15 22:23:53 +00002646 ch = killchar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002647
Victor Stinner26486ea2010-05-15 22:23:53 +00002648 return PyBytes_FromStringAndSize(&ch, 1);
2649}
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002650
2651static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002652PyCurses_Meta(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002653{
Victor Stinner26486ea2010-05-15 22:23:53 +00002654 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002655
Victor Stinner26486ea2010-05-15 22:23:53 +00002656 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002657
Victor Stinner26486ea2010-05-15 22:23:53 +00002658 switch(PyTuple_Size(args)) {
2659 case 1:
2660 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
2661 break;
2662 default:
2663 PyErr_SetString(PyExc_TypeError, "meta requires 1 argument");
2664 return NULL;
2665 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002666
Victor Stinner26486ea2010-05-15 22:23:53 +00002667 return PyCursesCheckERR(meta(stdscr, ch), "meta");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002668}
2669
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002670#ifdef NCURSES_MOUSE_VERSION
2671static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002672PyCurses_MouseInterval(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002673{
Victor Stinner26486ea2010-05-15 22:23:53 +00002674 int interval;
2675 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002676
Victor Stinner26486ea2010-05-15 22:23:53 +00002677 if (!PyArg_ParseTuple(args,"i;interval",&interval))
2678 return NULL;
2679 return PyCursesCheckERR(mouseinterval(interval), "mouseinterval");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002680}
2681
2682static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002683PyCurses_MouseMask(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002684{
Serhiy Storchaka4f469c02017-11-01 20:48:49 +02002685 unsigned long newmask;
Victor Stinner26486ea2010-05-15 22:23:53 +00002686 mmask_t oldmask, availmask;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002687
Victor Stinner26486ea2010-05-15 22:23:53 +00002688 PyCursesInitialised;
Serhiy Storchaka4f469c02017-11-01 20:48:49 +02002689 if (!PyArg_ParseTuple(args,"k;mousemask",&newmask))
Victor Stinner26486ea2010-05-15 22:23:53 +00002690 return NULL;
Serhiy Storchaka4f469c02017-11-01 20:48:49 +02002691 availmask = mousemask((mmask_t)newmask, &oldmask);
2692 return Py_BuildValue("(kk)",
2693 (unsigned long)availmask, (unsigned long)oldmask);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002694}
2695#endif
2696
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002697static PyObject *
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002698PyCurses_Napms(PyObject *self, PyObject *args)
2699{
2700 int ms;
2701
Andrew M. Kuchling2b146762010-05-10 23:30:25 +00002702 PyCursesInitialised;
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002703 if (!PyArg_ParseTuple(args, "i;ms", &ms)) return NULL;
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002704
2705 return Py_BuildValue("i", napms(ms));
2706}
2707
2708
2709static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002710PyCurses_NewPad(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002711{
Victor Stinner26486ea2010-05-15 22:23:53 +00002712 WINDOW *win;
2713 int nlines, ncols;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002714
Victor Stinner26486ea2010-05-15 22:23:53 +00002715 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002716
Victor Stinner26486ea2010-05-15 22:23:53 +00002717 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002718
Victor Stinner26486ea2010-05-15 22:23:53 +00002719 win = newpad(nlines, ncols);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002720
Victor Stinner26486ea2010-05-15 22:23:53 +00002721 if (win == NULL) {
2722 PyErr_SetString(PyCursesError, catchall_NULL);
2723 return NULL;
2724 }
2725
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002726 return (PyObject *)PyCursesWindow_New(win, NULL);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002727}
2728
2729static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002730PyCurses_NewWindow(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002731{
Victor Stinner26486ea2010-05-15 22:23:53 +00002732 WINDOW *win;
2733 int nlines, ncols, begin_y=0, begin_x=0;
Guido van Rossum85738471995-02-17 13:50:17 +00002734
Victor Stinner26486ea2010-05-15 22:23:53 +00002735 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002736
Victor Stinner26486ea2010-05-15 22:23:53 +00002737 switch (PyTuple_Size(args)) {
2738 case 2:
2739 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols))
2740 return NULL;
2741 break;
2742 case 4:
2743 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
2744 &nlines,&ncols,&begin_y,&begin_x))
2745 return NULL;
2746 break;
2747 default:
2748 PyErr_SetString(PyExc_TypeError, "newwin requires 2 or 4 arguments");
2749 return NULL;
2750 }
Guido van Rossum85738471995-02-17 13:50:17 +00002751
Victor Stinner26486ea2010-05-15 22:23:53 +00002752 win = newwin(nlines,ncols,begin_y,begin_x);
2753 if (win == NULL) {
2754 PyErr_SetString(PyCursesError, catchall_NULL);
2755 return NULL;
2756 }
Guido van Rossum85738471995-02-17 13:50:17 +00002757
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002758 return (PyObject *)PyCursesWindow_New(win, NULL);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002759}
2760
2761static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002762PyCurses_Pair_Content(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002763{
Victor Stinner26486ea2010-05-15 22:23:53 +00002764 short pair,f,b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002765
Victor Stinner26486ea2010-05-15 22:23:53 +00002766 PyCursesInitialised;
2767 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002768
Victor Stinner26486ea2010-05-15 22:23:53 +00002769 switch(PyTuple_Size(args)) {
2770 case 1:
2771 if (!PyArg_ParseTuple(args, "h;pair", &pair)) return NULL;
2772 break;
2773 default:
2774 PyErr_SetString(PyExc_TypeError, "pair_content requires 1 argument");
2775 return NULL;
2776 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002777
Victor Stinner26486ea2010-05-15 22:23:53 +00002778 if (pair_content(pair, &f, &b)==ERR) {
2779 PyErr_SetString(PyCursesError,
2780 "Argument 1 was out of range. (1..COLOR_PAIRS-1)");
2781 return NULL;
2782 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002783
Victor Stinner26486ea2010-05-15 22:23:53 +00002784 return Py_BuildValue("(ii)", f, b);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002785}
2786
2787static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002788PyCurses_pair_number(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002789{
Victor Stinner26486ea2010-05-15 22:23:53 +00002790 int n;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002791
Victor Stinner26486ea2010-05-15 22:23:53 +00002792 PyCursesInitialised;
2793 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002794
Victor Stinner26486ea2010-05-15 22:23:53 +00002795 switch(PyTuple_Size(args)) {
2796 case 1:
2797 if (!PyArg_ParseTuple(args, "i;pairvalue", &n)) return NULL;
2798 break;
2799 default:
2800 PyErr_SetString(PyExc_TypeError,
2801 "pair_number requires 1 argument");
2802 return NULL;
2803 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002804
Victor Stinner26486ea2010-05-15 22:23:53 +00002805 return PyLong_FromLong((long) ((n & A_COLOR) >> 8));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002806}
2807
2808static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002809PyCurses_Putp(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002810{
Victor Stinner26486ea2010-05-15 22:23:53 +00002811 char *str;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002812
Victor Stinnerb3bc7e72011-11-03 20:35:40 +01002813 if (!PyArg_ParseTuple(args,"y;str", &str))
2814 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002815 return PyCursesCheckERR(putp(str), "putp");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002816}
2817
2818static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002819PyCurses_QiFlush(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002820{
Victor Stinner26486ea2010-05-15 22:23:53 +00002821 int flag = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002822
Victor Stinner26486ea2010-05-15 22:23:53 +00002823 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002824
Victor Stinner26486ea2010-05-15 22:23:53 +00002825 switch(PyTuple_Size(args)) {
2826 case 0:
2827 qiflush();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002828 Py_RETURN_NONE;
Victor Stinner26486ea2010-05-15 22:23:53 +00002829 case 1:
2830 if (!PyArg_ParseTuple(args, "i;True(1) or False(0)", &flag)) return NULL;
2831 if (flag) qiflush();
2832 else noqiflush();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002833 Py_RETURN_NONE;
Victor Stinner26486ea2010-05-15 22:23:53 +00002834 default:
2835 PyErr_SetString(PyExc_TypeError, "qiflush requires 0 or 1 arguments");
2836 return NULL;
2837 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002838}
2839
Guido van Rossumd8faa362007-04-27 19:54:29 +00002840/* Internal helper used for updating curses.LINES, curses.COLS, _curses.LINES
2841 * and _curses.COLS */
Benjamin Petersonfea6a942008-07-02 16:11:42 +00002842#if defined(HAVE_CURSES_RESIZETERM) || defined(HAVE_CURSES_RESIZE_TERM)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002843static int
2844update_lines_cols(void)
2845{
Victor Stinner26486ea2010-05-15 22:23:53 +00002846 PyObject *o;
2847 PyObject *m = PyImport_ImportModuleNoBlock("curses");
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002848 _Py_IDENTIFIER(LINES);
2849 _Py_IDENTIFIER(COLS);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002850
Victor Stinner26486ea2010-05-15 22:23:53 +00002851 if (!m)
2852 return 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002853
Victor Stinner26486ea2010-05-15 22:23:53 +00002854 o = PyLong_FromLong(LINES);
2855 if (!o) {
2856 Py_DECREF(m);
2857 return 0;
2858 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002859 if (_PyObject_SetAttrId(m, &PyId_LINES, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002860 Py_DECREF(m);
2861 Py_DECREF(o);
2862 return 0;
2863 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002864 /* PyId_LINES.object will be initialized here. */
2865 if (PyDict_SetItem(ModDict, PyId_LINES.object, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002866 Py_DECREF(m);
2867 Py_DECREF(o);
2868 return 0;
2869 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002870 Py_DECREF(o);
Victor Stinner26486ea2010-05-15 22:23:53 +00002871 o = PyLong_FromLong(COLS);
2872 if (!o) {
2873 Py_DECREF(m);
2874 return 0;
2875 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002876 if (_PyObject_SetAttrId(m, &PyId_COLS, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002877 Py_DECREF(m);
2878 Py_DECREF(o);
2879 return 0;
2880 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002881 if (PyDict_SetItem(ModDict, PyId_COLS.object, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002882 Py_DECREF(m);
2883 Py_DECREF(o);
2884 return 0;
2885 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002886 Py_DECREF(o);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002887 Py_DECREF(m);
Victor Stinner26486ea2010-05-15 22:23:53 +00002888 return 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002889}
Steve Dowerd2bc3892015-04-15 18:06:05 -04002890
2891static PyObject *
2892PyCurses_update_lines_cols(PyObject *self)
2893{
2894 return PyLong_FromLong((long) update_lines_cols());
2895}
2896
Benjamin Petersonfea6a942008-07-02 16:11:42 +00002897#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00002898
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002899#ifdef HAVE_CURSES_RESIZETERM
2900static PyObject *
2901PyCurses_ResizeTerm(PyObject *self, PyObject *args)
2902{
Victor Stinner26486ea2010-05-15 22:23:53 +00002903 int lines;
2904 int columns;
2905 PyObject *result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002906
Victor Stinner26486ea2010-05-15 22:23:53 +00002907 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002908
Victor Stinner26486ea2010-05-15 22:23:53 +00002909 if (!PyArg_ParseTuple(args,"ii:resizeterm", &lines, &columns))
2910 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002911
Victor Stinner26486ea2010-05-15 22:23:53 +00002912 result = PyCursesCheckERR(resizeterm(lines, columns), "resizeterm");
2913 if (!result)
2914 return NULL;
2915 if (!update_lines_cols())
2916 return NULL;
2917 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002918}
2919
2920#endif
2921
2922#ifdef HAVE_CURSES_RESIZE_TERM
2923static PyObject *
2924PyCurses_Resize_Term(PyObject *self, PyObject *args)
2925{
Victor Stinner26486ea2010-05-15 22:23:53 +00002926 int lines;
2927 int columns;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002928
Victor Stinner26486ea2010-05-15 22:23:53 +00002929 PyObject *result;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002930
Victor Stinner26486ea2010-05-15 22:23:53 +00002931 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002932
Victor Stinner26486ea2010-05-15 22:23:53 +00002933 if (!PyArg_ParseTuple(args,"ii:resize_term", &lines, &columns))
2934 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002935
Victor Stinner26486ea2010-05-15 22:23:53 +00002936 result = PyCursesCheckERR(resize_term(lines, columns), "resize_term");
2937 if (!result)
2938 return NULL;
2939 if (!update_lines_cols())
2940 return NULL;
2941 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002942}
2943#endif /* HAVE_CURSES_RESIZE_TERM */
2944
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002945#ifdef getsyx
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002946static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002947PyCurses_setsyx(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002948{
Victor Stinner26486ea2010-05-15 22:23:53 +00002949 int y,x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002950
Victor Stinner26486ea2010-05-15 22:23:53 +00002951 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002952
Victor Stinner26486ea2010-05-15 22:23:53 +00002953 if (PyTuple_Size(args)!=2) {
2954 PyErr_SetString(PyExc_TypeError, "setsyx requires 2 arguments");
2955 return NULL;
2956 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002957
Victor Stinner26486ea2010-05-15 22:23:53 +00002958 if (!PyArg_ParseTuple(args, "ii;y, x", &y, &x)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002959
Victor Stinner26486ea2010-05-15 22:23:53 +00002960 setsyx(y,x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002961
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002962 Py_RETURN_NONE;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002963}
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002964#endif
Guido van Rossumf6971e21994-08-30 12:25:20 +00002965
2966static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002967PyCurses_Start_Color(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002968{
Victor Stinner26486ea2010-05-15 22:23:53 +00002969 int code;
2970 PyObject *c, *cp;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002971
Victor Stinner26486ea2010-05-15 22:23:53 +00002972 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002973
Victor Stinner26486ea2010-05-15 22:23:53 +00002974 code = start_color();
2975 if (code != ERR) {
2976 initialisedcolors = TRUE;
2977 c = PyLong_FromLong((long) COLORS);
Christian Heimesa956e642013-07-26 14:45:37 +02002978 if (c == NULL)
2979 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002980 PyDict_SetItemString(ModDict, "COLORS", c);
2981 Py_DECREF(c);
2982 cp = PyLong_FromLong((long) COLOR_PAIRS);
Christian Heimesa956e642013-07-26 14:45:37 +02002983 if (cp == NULL)
2984 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002985 PyDict_SetItemString(ModDict, "COLOR_PAIRS", cp);
2986 Py_DECREF(cp);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002987 Py_RETURN_NONE;
Victor Stinner26486ea2010-05-15 22:23:53 +00002988 } else {
2989 PyErr_SetString(PyCursesError, "start_color() returned ERR");
2990 return NULL;
2991 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002992}
2993
2994static PyObject *
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002995PyCurses_tigetflag(PyObject *self, PyObject *args)
2996{
Victor Stinner26486ea2010-05-15 22:23:53 +00002997 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002998
Victor Stinner26486ea2010-05-15 22:23:53 +00002999 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003000
Victor Stinner26486ea2010-05-15 22:23:53 +00003001 if (!PyArg_ParseTuple(args, "s", &capname))
3002 return NULL;
3003
3004 return PyLong_FromLong( (long) tigetflag( capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003005}
3006
3007static PyObject *
3008PyCurses_tigetnum(PyObject *self, PyObject *args)
3009{
Victor Stinner26486ea2010-05-15 22:23:53 +00003010 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003011
Victor Stinner26486ea2010-05-15 22:23:53 +00003012 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003013
Victor Stinner26486ea2010-05-15 22:23:53 +00003014 if (!PyArg_ParseTuple(args, "s", &capname))
3015 return NULL;
3016
3017 return PyLong_FromLong( (long) tigetnum( capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003018}
3019
3020static PyObject *
3021PyCurses_tigetstr(PyObject *self, PyObject *args)
3022{
Victor Stinner26486ea2010-05-15 22:23:53 +00003023 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003024
Victor Stinner26486ea2010-05-15 22:23:53 +00003025 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003026
Victor Stinner26486ea2010-05-15 22:23:53 +00003027 if (!PyArg_ParseTuple(args, "s", &capname))
3028 return NULL;
3029
3030 capname = tigetstr( capname );
Serhiy Storchaka0b3ec192017-03-23 17:53:47 +02003031 if (capname == NULL || capname == (char*) -1) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003032 Py_RETURN_NONE;
Victor Stinner26486ea2010-05-15 22:23:53 +00003033 }
3034 return PyBytes_FromString( capname );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003035}
3036
3037static PyObject *
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003038PyCurses_tparm(PyObject *self, PyObject *args)
3039{
Victor Stinner26486ea2010-05-15 22:23:53 +00003040 char* fmt;
3041 char* result = NULL;
3042 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 +00003043
Victor Stinner26486ea2010-05-15 22:23:53 +00003044 PyCursesSetupTermCalled;
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003045
Victor Stinner26621332011-11-02 23:45:29 +01003046 if (!PyArg_ParseTuple(args, "y|iiiiiiiii:tparm",
Victor Stinner26486ea2010-05-15 22:23:53 +00003047 &fmt, &i1, &i2, &i3, &i4,
3048 &i5, &i6, &i7, &i8, &i9)) {
3049 return NULL;
3050 }
Michael W. Hudson21007982002-11-21 14:17:51 +00003051
Victor Stinner26486ea2010-05-15 22:23:53 +00003052 result = tparm(fmt,i1,i2,i3,i4,i5,i6,i7,i8,i9);
3053 if (!result) {
3054 PyErr_SetString(PyCursesError, "tparm() returned NULL");
3055 return NULL;
3056 }
Michael W. Hudson21007982002-11-21 14:17:51 +00003057
Victor Stinner26486ea2010-05-15 22:23:53 +00003058 return PyBytes_FromString(result);
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003059}
3060
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003061#ifdef HAVE_CURSES_TYPEAHEAD
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003062static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003063PyCurses_TypeAhead(PyObject *self, PyObject *args)
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003064{
Victor Stinner26486ea2010-05-15 22:23:53 +00003065 int fd;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003066
Victor Stinner26486ea2010-05-15 22:23:53 +00003067 PyCursesInitialised;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003068
Victor Stinner26486ea2010-05-15 22:23:53 +00003069 if (!PyArg_ParseTuple(args,"i;fd",&fd)) return NULL;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003070
Victor Stinner26486ea2010-05-15 22:23:53 +00003071 return PyCursesCheckERR(typeahead( fd ), "typeahead");
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003072}
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003073#endif
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003074
3075static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003076PyCurses_UnCtrl(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003077{
Victor Stinner26486ea2010-05-15 22:23:53 +00003078 PyObject *temp;
3079 chtype ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003080
Victor Stinner26486ea2010-05-15 22:23:53 +00003081 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003082
Victor Stinner26486ea2010-05-15 22:23:53 +00003083 if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003084
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003085 if (!PyCurses_ConvertToChtype(NULL, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00003086 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003087
Victor Stinner26486ea2010-05-15 22:23:53 +00003088 return PyBytes_FromString(unctrl(ch));
Guido van Rossumf6971e21994-08-30 12:25:20 +00003089}
3090
3091static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003092PyCurses_UngetCh(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003093{
Victor Stinner26486ea2010-05-15 22:23:53 +00003094 PyObject *temp;
3095 chtype ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003096
Victor Stinner26486ea2010-05-15 22:23:53 +00003097 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003098
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003099 if (!PyArg_ParseTuple(args,"O;ch or int",&temp))
Victor Stinner26486ea2010-05-15 22:23:53 +00003100 return NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003101
3102 if (!PyCurses_ConvertToChtype(NULL, temp, &ch))
3103 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003104
Victor Stinner26486ea2010-05-15 22:23:53 +00003105 return PyCursesCheckERR(ungetch(ch), "ungetch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00003106}
3107
Victor Stinner71e44cb2011-09-06 01:53:03 +02003108#ifdef HAVE_NCURSESW
3109/* Convert an object to a character (wchar_t):
3110
3111 - int
3112 - str of length 1
3113
3114 Return 1 on success, 0 on error. */
3115static int
3116PyCurses_ConvertToWchar_t(PyObject *obj,
3117 wchar_t *wch)
3118{
3119 if (PyUnicode_Check(obj)) {
3120 wchar_t buffer[2];
3121 if (PyUnicode_AsWideChar(obj, buffer, 2) != 1) {
3122 PyErr_Format(PyExc_TypeError,
3123 "expect bytes or str of length 1, or int, "
3124 "got a str of length %zi",
Victor Stinnerc4f281e2011-10-11 22:11:42 +02003125 PyUnicode_GET_LENGTH(obj));
Victor Stinner71e44cb2011-09-06 01:53:03 +02003126 return 0;
3127 }
3128 *wch = buffer[0];
3129 return 2;
3130 }
3131 else if (PyLong_CheckExact(obj)) {
3132 long value;
3133 int overflow;
3134 value = PyLong_AsLongAndOverflow(obj, &overflow);
3135 if (overflow) {
3136 PyErr_SetString(PyExc_OverflowError,
3137 "int doesn't fit in long");
3138 return 0;
3139 }
3140 *wch = (wchar_t)value;
3141 if ((long)*wch != value) {
3142 PyErr_Format(PyExc_OverflowError,
3143 "character doesn't fit in wchar_t");
3144 return 0;
3145 }
3146 return 1;
3147 }
3148 else {
3149 PyErr_Format(PyExc_TypeError,
3150 "expect bytes or str of length 1, or int, got %s",
3151 Py_TYPE(obj)->tp_name);
3152 return 0;
3153 }
3154}
3155
3156static PyObject *
3157PyCurses_Unget_Wch(PyObject *self, PyObject *args)
3158{
3159 PyObject *obj;
3160 wchar_t wch;
3161
3162 PyCursesInitialised;
3163
3164 if (!PyArg_ParseTuple(args,"O", &obj))
3165 return NULL;
3166
3167 if (!PyCurses_ConvertToWchar_t(obj, &wch))
3168 return NULL;
3169 return PyCursesCheckERR(unget_wch(wch), "unget_wch");
3170}
3171#endif
3172
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003173#ifdef HAVE_CURSES_TYPEAHEAD
Guido van Rossumf6971e21994-08-30 12:25:20 +00003174static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003175PyCurses_Use_Env(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003176{
Victor Stinner26486ea2010-05-15 22:23:53 +00003177 int flag;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003178
Victor Stinner26486ea2010-05-15 22:23:53 +00003179 switch(PyTuple_Size(args)) {
3180 case 1:
3181 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&flag))
3182 return NULL;
3183 break;
3184 default:
3185 PyErr_SetString(PyExc_TypeError, "use_env requires 1 argument");
3186 return NULL;
3187 }
3188 use_env(flag);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003189 Py_RETURN_NONE;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003190}
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003191#endif
Guido van Rossumf6971e21994-08-30 12:25:20 +00003192
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003193#ifndef STRICT_SYSV_CURSES
3194static PyObject *
3195PyCurses_Use_Default_Colors(PyObject *self)
3196{
Victor Stinner26486ea2010-05-15 22:23:53 +00003197 int code;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003198
Victor Stinner26486ea2010-05-15 22:23:53 +00003199 PyCursesInitialised;
3200 PyCursesInitialisedColor;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003201
Victor Stinner26486ea2010-05-15 22:23:53 +00003202 code = use_default_colors();
3203 if (code != ERR) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003204 Py_RETURN_NONE;
Victor Stinner26486ea2010-05-15 22:23:53 +00003205 } else {
3206 PyErr_SetString(PyCursesError, "use_default_colors() returned ERR");
3207 return NULL;
3208 }
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003209}
3210#endif /* STRICT_SYSV_CURSES */
3211
Guido van Rossumf6971e21994-08-30 12:25:20 +00003212/* List of functions defined in the module */
3213
3214static PyMethodDef PyCurses_methods[] = {
Victor Stinner26486ea2010-05-15 22:23:53 +00003215 {"baudrate", (PyCFunction)PyCurses_baudrate, METH_NOARGS},
3216 {"beep", (PyCFunction)PyCurses_beep, METH_NOARGS},
3217 {"can_change_color", (PyCFunction)PyCurses_can_change_color, METH_NOARGS},
3218 {"cbreak", (PyCFunction)PyCurses_cbreak, METH_VARARGS},
3219 {"color_content", (PyCFunction)PyCurses_Color_Content, METH_VARARGS},
3220 {"color_pair", (PyCFunction)PyCurses_color_pair, METH_VARARGS},
3221 {"curs_set", (PyCFunction)PyCurses_Curs_Set, METH_VARARGS},
3222 {"def_prog_mode", (PyCFunction)PyCurses_def_prog_mode, METH_NOARGS},
3223 {"def_shell_mode", (PyCFunction)PyCurses_def_shell_mode, METH_NOARGS},
3224 {"delay_output", (PyCFunction)PyCurses_Delay_Output, METH_VARARGS},
3225 {"doupdate", (PyCFunction)PyCurses_doupdate, METH_NOARGS},
3226 {"echo", (PyCFunction)PyCurses_echo, METH_VARARGS},
3227 {"endwin", (PyCFunction)PyCurses_endwin, METH_NOARGS},
3228 {"erasechar", (PyCFunction)PyCurses_EraseChar, METH_NOARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003229#ifdef HAVE_CURSES_FILTER
Victor Stinner26486ea2010-05-15 22:23:53 +00003230 {"filter", (PyCFunction)PyCurses_filter, METH_NOARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003231#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003232 {"flash", (PyCFunction)PyCurses_flash, METH_NOARGS},
3233 {"flushinp", (PyCFunction)PyCurses_flushinp, METH_NOARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003234#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003235 {"getmouse", (PyCFunction)PyCurses_GetMouse, METH_NOARGS},
3236 {"ungetmouse", (PyCFunction)PyCurses_UngetMouse, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003237#endif
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003238#ifdef getsyx
Victor Stinner26486ea2010-05-15 22:23:53 +00003239 {"getsyx", (PyCFunction)PyCurses_getsyx, METH_NOARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003240#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003241 {"getwin", (PyCFunction)PyCurses_GetWin, METH_O},
3242 {"has_colors", (PyCFunction)PyCurses_has_colors, METH_NOARGS},
3243 {"has_ic", (PyCFunction)PyCurses_has_ic, METH_NOARGS},
3244 {"has_il", (PyCFunction)PyCurses_has_il, METH_NOARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003245#ifdef HAVE_CURSES_HAS_KEY
Victor Stinner26486ea2010-05-15 22:23:53 +00003246 {"has_key", (PyCFunction)PyCurses_has_key, METH_VARARGS},
Guido van Rossumf6971e21994-08-30 12:25:20 +00003247#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003248 {"halfdelay", (PyCFunction)PyCurses_HalfDelay, METH_VARARGS},
3249 {"init_color", (PyCFunction)PyCurses_Init_Color, METH_VARARGS},
3250 {"init_pair", (PyCFunction)PyCurses_Init_Pair, METH_VARARGS},
3251 {"initscr", (PyCFunction)PyCurses_InitScr, METH_NOARGS},
3252 {"intrflush", (PyCFunction)PyCurses_IntrFlush, METH_VARARGS},
3253 {"isendwin", (PyCFunction)PyCurses_isendwin, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003254#ifdef HAVE_CURSES_IS_TERM_RESIZED
Victor Stinner26486ea2010-05-15 22:23:53 +00003255 {"is_term_resized", (PyCFunction)PyCurses_Is_Term_Resized, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003256#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003257 {"keyname", (PyCFunction)PyCurses_KeyName, METH_VARARGS},
Victor Stinner26486ea2010-05-15 22:23:53 +00003258 {"killchar", (PyCFunction)PyCurses_KillChar, METH_NOARGS},
3259 {"longname", (PyCFunction)PyCurses_longname, METH_NOARGS},
3260 {"meta", (PyCFunction)PyCurses_Meta, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003261#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003262 {"mouseinterval", (PyCFunction)PyCurses_MouseInterval, METH_VARARGS},
3263 {"mousemask", (PyCFunction)PyCurses_MouseMask, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003264#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003265 {"napms", (PyCFunction)PyCurses_Napms, METH_VARARGS},
3266 {"newpad", (PyCFunction)PyCurses_NewPad, METH_VARARGS},
3267 {"newwin", (PyCFunction)PyCurses_NewWindow, METH_VARARGS},
3268 {"nl", (PyCFunction)PyCurses_nl, METH_VARARGS},
3269 {"nocbreak", (PyCFunction)PyCurses_nocbreak, METH_NOARGS},
3270 {"noecho", (PyCFunction)PyCurses_noecho, METH_NOARGS},
3271 {"nonl", (PyCFunction)PyCurses_nonl, METH_NOARGS},
3272 {"noqiflush", (PyCFunction)PyCurses_noqiflush, METH_NOARGS},
3273 {"noraw", (PyCFunction)PyCurses_noraw, METH_NOARGS},
3274 {"pair_content", (PyCFunction)PyCurses_Pair_Content, METH_VARARGS},
3275 {"pair_number", (PyCFunction)PyCurses_pair_number, METH_VARARGS},
3276 {"putp", (PyCFunction)PyCurses_Putp, METH_VARARGS},
3277 {"qiflush", (PyCFunction)PyCurses_QiFlush, METH_VARARGS},
3278 {"raw", (PyCFunction)PyCurses_raw, METH_VARARGS},
3279 {"reset_prog_mode", (PyCFunction)PyCurses_reset_prog_mode, METH_NOARGS},
3280 {"reset_shell_mode", (PyCFunction)PyCurses_reset_shell_mode, METH_NOARGS},
3281 {"resetty", (PyCFunction)PyCurses_resetty, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003282#ifdef HAVE_CURSES_RESIZETERM
Victor Stinner26486ea2010-05-15 22:23:53 +00003283 {"resizeterm", (PyCFunction)PyCurses_ResizeTerm, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003284#endif
3285#ifdef HAVE_CURSES_RESIZE_TERM
Victor Stinner26486ea2010-05-15 22:23:53 +00003286 {"resize_term", (PyCFunction)PyCurses_Resize_Term, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003287#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003288 {"savetty", (PyCFunction)PyCurses_savetty, METH_NOARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003289#ifdef getsyx
Victor Stinner26486ea2010-05-15 22:23:53 +00003290 {"setsyx", (PyCFunction)PyCurses_setsyx, METH_VARARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003291#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003292 {"setupterm", (PyCFunction)PyCurses_setupterm,
3293 METH_VARARGS|METH_KEYWORDS},
3294 {"start_color", (PyCFunction)PyCurses_Start_Color, METH_NOARGS},
3295 {"termattrs", (PyCFunction)PyCurses_termattrs, METH_NOARGS},
3296 {"termname", (PyCFunction)PyCurses_termname, METH_NOARGS},
3297 {"tigetflag", (PyCFunction)PyCurses_tigetflag, METH_VARARGS},
3298 {"tigetnum", (PyCFunction)PyCurses_tigetnum, METH_VARARGS},
3299 {"tigetstr", (PyCFunction)PyCurses_tigetstr, METH_VARARGS},
3300 {"tparm", (PyCFunction)PyCurses_tparm, METH_VARARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003301#ifdef HAVE_CURSES_TYPEAHEAD
Victor Stinner26486ea2010-05-15 22:23:53 +00003302 {"typeahead", (PyCFunction)PyCurses_TypeAhead, METH_VARARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003303#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003304 {"unctrl", (PyCFunction)PyCurses_UnCtrl, METH_VARARGS},
3305 {"ungetch", (PyCFunction)PyCurses_UngetCh, METH_VARARGS},
Steve Dowerd2bc3892015-04-15 18:06:05 -04003306#if defined(HAVE_CURSES_RESIZETERM) || defined(HAVE_CURSES_RESIZE_TERM)
3307 {"update_lines_cols", (PyCFunction)PyCurses_update_lines_cols, METH_NOARGS},
3308#endif
Victor Stinner71e44cb2011-09-06 01:53:03 +02003309#ifdef HAVE_NCURSESW
3310 {"unget_wch", (PyCFunction)PyCurses_Unget_Wch, METH_VARARGS},
3311#endif
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003312#ifdef HAVE_CURSES_USE_ENV
Victor Stinner26486ea2010-05-15 22:23:53 +00003313 {"use_env", (PyCFunction)PyCurses_Use_Env, METH_VARARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003314#endif
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003315#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00003316 {"use_default_colors", (PyCFunction)PyCurses_Use_Default_Colors, METH_NOARGS},
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003317#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003318 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00003319};
3320
3321/* Initialization function for the module */
3322
Martin v. Löwis1a214512008-06-11 05:26:20 +00003323
3324static struct PyModuleDef _cursesmodule = {
Victor Stinner26486ea2010-05-15 22:23:53 +00003325 PyModuleDef_HEAD_INIT,
3326 "_curses",
3327 NULL,
3328 -1,
3329 PyCurses_methods,
3330 NULL,
3331 NULL,
3332 NULL,
3333 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00003334};
3335
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003336PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00003337PyInit__curses(void)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003338{
Victor Stinner26486ea2010-05-15 22:23:53 +00003339 PyObject *m, *d, *v, *c_api_object;
3340 static void *PyCurses_API[PyCurses_API_pointers];
Andrew M. Kuchling32552682000-12-22 21:52:27 +00003341
Victor Stinner26486ea2010-05-15 22:23:53 +00003342 /* Initialize object type */
3343 if (PyType_Ready(&PyCursesWindow_Type) < 0)
3344 return NULL;
Guido van Rossum6915c4d2001-01-19 00:28:08 +00003345
Victor Stinner26486ea2010-05-15 22:23:53 +00003346 /* Initialize the C API pointer array */
3347 PyCurses_API[0] = (void *)&PyCursesWindow_Type;
3348 PyCurses_API[1] = (void *)func_PyCursesSetupTermCalled;
3349 PyCurses_API[2] = (void *)func_PyCursesInitialised;
3350 PyCurses_API[3] = (void *)func_PyCursesInitialisedColor;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003351
Victor Stinner26486ea2010-05-15 22:23:53 +00003352 /* Create the module and add the functions */
3353 m = PyModule_Create(&_cursesmodule);
3354 if (m == NULL)
3355 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003356
Victor Stinner26486ea2010-05-15 22:23:53 +00003357 /* Add some symbolic constants to the module */
3358 d = PyModule_GetDict(m);
3359 if (d == NULL)
3360 return NULL;
3361 ModDict = d; /* For PyCurses_InitScr to use later */
Andrew M. Kuchling32552682000-12-22 21:52:27 +00003362
Victor Stinner26486ea2010-05-15 22:23:53 +00003363 /* Add a capsule for the C API */
3364 c_api_object = PyCapsule_New(PyCurses_API, PyCurses_CAPSULE_NAME, NULL);
3365 PyDict_SetItemString(d, "_C_API", c_api_object);
3366 Py_DECREF(c_api_object);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00003367
Victor Stinner26486ea2010-05-15 22:23:53 +00003368 /* For exception curses.error */
3369 PyCursesError = PyErr_NewException("_curses.error", NULL, NULL);
3370 PyDict_SetItemString(d, "error", PyCursesError);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00003371
Victor Stinner26486ea2010-05-15 22:23:53 +00003372 /* Make the version available */
3373 v = PyBytes_FromString(PyCursesVersion);
3374 PyDict_SetItemString(d, "version", v);
3375 PyDict_SetItemString(d, "__version__", v);
3376 Py_DECREF(v);
Guido van Rossumf6971e21994-08-30 12:25:20 +00003377
Victor Stinner26486ea2010-05-15 22:23:53 +00003378 SetDictInt("ERR", ERR);
3379 SetDictInt("OK", OK);
Andrew M. Kuchlingcaefb372000-12-26 15:57:01 +00003380
Victor Stinner26486ea2010-05-15 22:23:53 +00003381 /* Here are some attributes you can add to chars to print */
3382
3383 SetDictInt("A_ATTRIBUTES", A_ATTRIBUTES);
3384 SetDictInt("A_NORMAL", A_NORMAL);
3385 SetDictInt("A_STANDOUT", A_STANDOUT);
3386 SetDictInt("A_UNDERLINE", A_UNDERLINE);
3387 SetDictInt("A_REVERSE", A_REVERSE);
3388 SetDictInt("A_BLINK", A_BLINK);
3389 SetDictInt("A_DIM", A_DIM);
3390 SetDictInt("A_BOLD", A_BOLD);
3391 SetDictInt("A_ALTCHARSET", A_ALTCHARSET);
Victor Stinner26486ea2010-05-15 22:23:53 +00003392 SetDictInt("A_INVIS", A_INVIS);
Victor Stinner26486ea2010-05-15 22:23:53 +00003393 SetDictInt("A_PROTECT", A_PROTECT);
3394 SetDictInt("A_CHARTEXT", A_CHARTEXT);
3395 SetDictInt("A_COLOR", A_COLOR);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003396
Victor Stinner26486ea2010-05-15 22:23:53 +00003397 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003398#ifdef A_HORIZONTAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003399 SetDictInt("A_HORIZONTAL", A_HORIZONTAL);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003400#endif
3401#ifdef A_LEFT
Victor Stinner26486ea2010-05-15 22:23:53 +00003402 SetDictInt("A_LEFT", A_LEFT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003403#endif
3404#ifdef A_LOW
Victor Stinner26486ea2010-05-15 22:23:53 +00003405 SetDictInt("A_LOW", A_LOW);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003406#endif
3407#ifdef A_RIGHT
Victor Stinner26486ea2010-05-15 22:23:53 +00003408 SetDictInt("A_RIGHT", A_RIGHT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003409#endif
3410#ifdef A_TOP
Victor Stinner26486ea2010-05-15 22:23:53 +00003411 SetDictInt("A_TOP", A_TOP);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003412#endif
3413#ifdef A_VERTICAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003414 SetDictInt("A_VERTICAL", A_VERTICAL);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003415#endif
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00003416
Xiang Zhang116dd5e2017-06-16 11:20:07 +08003417 /* ncurses extension */
3418#ifdef A_ITALIC
3419 SetDictInt("A_ITALIC", A_ITALIC);
3420#endif
3421
Victor Stinner26486ea2010-05-15 22:23:53 +00003422 SetDictInt("COLOR_BLACK", COLOR_BLACK);
3423 SetDictInt("COLOR_RED", COLOR_RED);
3424 SetDictInt("COLOR_GREEN", COLOR_GREEN);
3425 SetDictInt("COLOR_YELLOW", COLOR_YELLOW);
3426 SetDictInt("COLOR_BLUE", COLOR_BLUE);
3427 SetDictInt("COLOR_MAGENTA", COLOR_MAGENTA);
3428 SetDictInt("COLOR_CYAN", COLOR_CYAN);
3429 SetDictInt("COLOR_WHITE", COLOR_WHITE);
Guido van Rossumf6971e21994-08-30 12:25:20 +00003430
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003431#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003432 /* Mouse-related constants */
3433 SetDictInt("BUTTON1_PRESSED", BUTTON1_PRESSED);
3434 SetDictInt("BUTTON1_RELEASED", BUTTON1_RELEASED);
3435 SetDictInt("BUTTON1_CLICKED", BUTTON1_CLICKED);
3436 SetDictInt("BUTTON1_DOUBLE_CLICKED", BUTTON1_DOUBLE_CLICKED);
3437 SetDictInt("BUTTON1_TRIPLE_CLICKED", BUTTON1_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003438
Victor Stinner26486ea2010-05-15 22:23:53 +00003439 SetDictInt("BUTTON2_PRESSED", BUTTON2_PRESSED);
3440 SetDictInt("BUTTON2_RELEASED", BUTTON2_RELEASED);
3441 SetDictInt("BUTTON2_CLICKED", BUTTON2_CLICKED);
3442 SetDictInt("BUTTON2_DOUBLE_CLICKED", BUTTON2_DOUBLE_CLICKED);
3443 SetDictInt("BUTTON2_TRIPLE_CLICKED", BUTTON2_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003444
Victor Stinner26486ea2010-05-15 22:23:53 +00003445 SetDictInt("BUTTON3_PRESSED", BUTTON3_PRESSED);
3446 SetDictInt("BUTTON3_RELEASED", BUTTON3_RELEASED);
3447 SetDictInt("BUTTON3_CLICKED", BUTTON3_CLICKED);
3448 SetDictInt("BUTTON3_DOUBLE_CLICKED", BUTTON3_DOUBLE_CLICKED);
3449 SetDictInt("BUTTON3_TRIPLE_CLICKED", BUTTON3_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003450
Victor Stinner26486ea2010-05-15 22:23:53 +00003451 SetDictInt("BUTTON4_PRESSED", BUTTON4_PRESSED);
3452 SetDictInt("BUTTON4_RELEASED", BUTTON4_RELEASED);
3453 SetDictInt("BUTTON4_CLICKED", BUTTON4_CLICKED);
3454 SetDictInt("BUTTON4_DOUBLE_CLICKED", BUTTON4_DOUBLE_CLICKED);
3455 SetDictInt("BUTTON4_TRIPLE_CLICKED", BUTTON4_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003456
Victor Stinner26486ea2010-05-15 22:23:53 +00003457 SetDictInt("BUTTON_SHIFT", BUTTON_SHIFT);
3458 SetDictInt("BUTTON_CTRL", BUTTON_CTRL);
3459 SetDictInt("BUTTON_ALT", BUTTON_ALT);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003460
Victor Stinner26486ea2010-05-15 22:23:53 +00003461 SetDictInt("ALL_MOUSE_EVENTS", ALL_MOUSE_EVENTS);
3462 SetDictInt("REPORT_MOUSE_POSITION", REPORT_MOUSE_POSITION);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003463#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003464 /* Now set everything up for KEY_ variables */
3465 {
3466 int key;
3467 char *key_n;
3468 char *key_n2;
Victor Stinner26486ea2010-05-15 22:23:53 +00003469 for (key=KEY_MIN;key < KEY_MAX; key++) {
3470 key_n = (char *)keyname(key);
3471 if (key_n == NULL || strcmp(key_n,"UNKNOWN KEY")==0)
3472 continue;
3473 if (strncmp(key_n,"KEY_F(",6)==0) {
3474 char *p1, *p2;
Victor Stinnerb6404912013-07-07 16:21:41 +02003475 key_n2 = PyMem_Malloc(strlen(key_n)+1);
Victor Stinner26486ea2010-05-15 22:23:53 +00003476 if (!key_n2) {
3477 PyErr_NoMemory();
3478 break;
3479 }
3480 p1 = key_n;
3481 p2 = key_n2;
3482 while (*p1) {
3483 if (*p1 != '(' && *p1 != ')') {
3484 *p2 = *p1;
3485 p2++;
3486 }
3487 p1++;
3488 }
3489 *p2 = (char)0;
3490 } else
3491 key_n2 = key_n;
3492 SetDictInt(key_n2,key);
3493 if (key_n2 != key_n)
Victor Stinnerb6404912013-07-07 16:21:41 +02003494 PyMem_Free(key_n2);
Victor Stinner26486ea2010-05-15 22:23:53 +00003495 }
Victor Stinner26486ea2010-05-15 22:23:53 +00003496 SetDictInt("KEY_MIN", KEY_MIN);
3497 SetDictInt("KEY_MAX", KEY_MAX);
3498 }
3499 return m;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003500}