blob: 7962936966906fffd405780e4956faeca0f2cff7 [file] [log] [blame]
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001/*
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002 * This is a curses module for Python.
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003 *
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00004 * Based on prior work by Lance Ellinghaus and Oliver Andrich
5 * Version 1.2 of this module: Copyright 1994 by Lance Ellinghouse,
6 * Cathedral City, California Republic, United States of America.
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00007 *
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00008 * Version 1.5b1, heavily extended for ncurses by Oliver Andrich:
9 * Copyright 1996,1997 by Oliver Andrich, Koblenz, Germany.
10 *
Andrew M. Kuchling3adefcc2002-10-30 21:08:34 +000011 * Tidied for Python 1.6, and currently maintained by <amk@amk.ca>.
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +000012 *
13 * Permission is hereby granted, free of charge, to any person obtaining
14 * a copy of this source file to use, copy, modify, merge, or publish it
15 * subject to the following conditions:
16 *
17 * The above copyright notice and this permission notice shall be included
18 * in all copies or in any new file that contains a substantial portion of
19 * this file.
20 *
21 * THE AUTHOR MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF
22 * THE SOFTWARE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT
23 * EXPRESS OR IMPLIED WARRANTY. THE AUTHOR DISCLAIMS ALL WARRANTIES
24 * WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
25 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 * NON-INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE
27 * AUTHOR BE LIABLE TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL,
28 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
29 * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE, STRICT LIABILITY OR
30 * ANY OTHER ACTION ARISING OUT OF OR IN CONNECTION WITH THE USE OR
31 * PERFORMANCE OF THIS SOFTWARE.
32 */
Guido van Rossumf6971e21994-08-30 12:25:20 +000033
Andrew M. Kuchlingfb6bbf52000-07-27 11:58:01 +000034/*
35
Victor Stinner26486ea2010-05-15 22:23:53 +000036 A number of SysV or ncurses functions don't have wrappers yet; if you
37 need a given function, add it and send a patch. See
38 http://www.python.org/dev/patches/ for instructions on how to submit
39 patches to Python.
Andrew M. Kuchlingfb6bbf52000-07-27 11:58:01 +000040
Victor Stinner26486ea2010-05-15 22:23:53 +000041 Here's a list of currently unsupported functions:
Guido van Rossumd8faa362007-04-27 19:54:29 +000042
Victor Stinner26486ea2010-05-15 22:23:53 +000043 addchnstr addchstr color_set define_key
44 del_curterm delscreen dupwin inchnstr inchstr innstr keyok
45 mcprint mvaddchnstr mvaddchstr mvcur mvinchnstr
46 mvinchstr mvinnstr mmvwaddchnstr mvwaddchstr
47 mvwinchnstr mvwinchstr mvwinnstr newterm
48 restartterm ripoffline scr_dump
49 scr_init scr_restore scr_set scrl set_curterm set_term setterm
50 tgetent tgetflag tgetnum tgetstr tgoto timeout tputs
51 vidattr vidputs waddchnstr waddchstr
52 wcolor_set winchnstr winchstr winnstr wmouse_trafo wscrl
Andrew M. Kuchlingfb6bbf52000-07-27 11:58:01 +000053
Victor Stinner26486ea2010-05-15 22:23:53 +000054 Low-priority:
55 slk_attr slk_attr_off slk_attr_on slk_attr_set slk_attroff
56 slk_attron slk_attrset slk_clear slk_color slk_init slk_label
57 slk_noutrefresh slk_refresh slk_restore slk_set slk_touch
Andrew M. Kuchlingfb6bbf52000-07-27 11:58:01 +000058
Victor Stinner26486ea2010-05-15 22:23:53 +000059 Menu extension (ncurses and probably SYSV):
60 current_item free_item free_menu item_count item_description
61 item_index item_init item_name item_opts item_opts_off
62 item_opts_on item_term item_userptr item_value item_visible
63 menu_back menu_driver menu_fore menu_format menu_grey
64 menu_init menu_items menu_mark menu_opts menu_opts_off
65 menu_opts_on menu_pad menu_pattern menu_request_by_name
66 menu_request_name menu_spacing menu_sub menu_term menu_userptr
67 menu_win new_item new_menu pos_menu_cursor post_menu
68 scale_menu set_current_item set_item_init set_item_opts
69 set_item_term set_item_userptr set_item_value set_menu_back
70 set_menu_fore set_menu_format set_menu_grey set_menu_init
71 set_menu_items set_menu_mark set_menu_opts set_menu_pad
72 set_menu_pattern set_menu_spacing set_menu_sub set_menu_term
73 set_menu_userptr set_menu_win set_top_row top_row unpost_menu
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +000074
Victor Stinner26486ea2010-05-15 22:23:53 +000075 Form extension (ncurses and probably SYSV):
76 current_field data_ahead data_behind dup_field
77 dynamic_fieldinfo field_arg field_back field_buffer
78 field_count field_fore field_index field_info field_init
79 field_just field_opts field_opts_off field_opts_on field_pad
80 field_status field_term field_type field_userptr form_driver
81 form_fields form_init form_opts form_opts_off form_opts_on
82 form_page form_request_by_name form_request_name form_sub
83 form_term form_userptr form_win free_field free_form
84 link_field link_fieldtype move_field new_field new_form
85 new_page pos_form_cursor post_form scale_form
86 set_current_field set_field_back set_field_buffer
87 set_field_fore set_field_init set_field_just set_field_opts
88 set_field_pad set_field_status set_field_term set_field_type
89 set_field_userptr set_fieldtype_arg set_fieldtype_choice
90 set_form_fields set_form_init set_form_opts set_form_page
91 set_form_sub set_form_term set_form_userptr set_form_win
92 set_max_field set_new_page unpost_form
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +000093
94
Victor Stinner26486ea2010-05-15 22:23:53 +000095*/
Andrew M. Kuchlingfb6bbf52000-07-27 11:58:01 +000096
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +000097/* Release Number */
Guido van Rossumf6971e21994-08-30 12:25:20 +000098
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +000099char *PyCursesVersion = "2.2";
Guido van Rossumf6971e21994-08-30 12:25:20 +0000100
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000101/* Includes */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000102
Mark Dickinsone047cfa2010-05-11 17:57:09 +0000103#define PY_SSIZE_T_CLEAN
104
Guido van Rossum602099a1994-09-14 13:32:22 +0000105#include "Python.h"
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000106
Benjamin Petersonb173f782009-05-05 22:31:58 +0000107
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000108#ifdef __hpux
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000109#define STRICT_SYSV_CURSES
110#endif
111
Guido van Rossum858ca0f2001-04-10 19:53:37 +0000112#define CURSES_MODULE
113#include "py_curses.h"
114
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{
Victor Stinner26486ea2010-05-15 22:23:53 +0000914 chtype ch1=0,ch2=0;
915 switch(PyTuple_Size(args)){
916 case 0: break;
917 default:
918 if (!PyArg_ParseTuple(args,"ll;vertint,horint", &ch1, &ch2))
919 return NULL;
920 }
921 box(self->win,ch1,ch2);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200922 Py_RETURN_NONE;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000923}
924
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000925#if defined(HAVE_NCURSES_H) || defined(MVWDELCH_IS_EXPRESSION)
926#define py_mvwdelch mvwdelch
927#else
928int py_mvwdelch(WINDOW *w, int y, int x)
929{
Victor Stinner26486ea2010-05-15 22:23:53 +0000930 mvwdelch(w,y,x);
931 /* On HP/UX, mvwdelch already returns. On other systems,
932 we may well run into this return statement. */
933 return 0;
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000934}
935#endif
936
Masayuki Yamamoto8bc7d632017-11-01 21:05:26 +0900937#if defined(HAVE_CURSES_IS_PAD)
938#define py_is_pad(win) is_pad(win)
939#elif defined(WINDOW_HAS_FLAGS)
940#define py_is_pad(win) ((win) ? ((win)->_flags & _ISPAD) != 0 : FALSE)
941#endif
942
Guido van Rossumd8faa362007-04-27 19:54:29 +0000943/* chgat, added by Fabian Kreutz <fabian.kreutz at gmx.net> */
Serhiy Storchaka894ebd02017-11-01 14:34:20 +0200944#ifdef HAVE_CURSES_WCHGAT
Guido van Rossumd8faa362007-04-27 19:54:29 +0000945static PyObject *
946PyCursesWindow_ChgAt(PyCursesWindowObject *self, PyObject *args)
947{
Victor Stinner26486ea2010-05-15 22:23:53 +0000948 int rtn;
949 int x, y;
950 int num = -1;
951 short color;
952 attr_t attr = A_NORMAL;
953 long lattr;
954 int use_xy = FALSE;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000955
Victor Stinner26486ea2010-05-15 22:23:53 +0000956 switch (PyTuple_Size(args)) {
957 case 1:
958 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
959 return NULL;
960 attr = lattr;
961 break;
962 case 2:
963 if (!PyArg_ParseTuple(args,"il;n,attr", &num, &lattr))
964 return NULL;
965 attr = lattr;
966 break;
967 case 3:
968 if (!PyArg_ParseTuple(args,"iil;int,int,attr", &y, &x, &lattr))
969 return NULL;
970 attr = lattr;
971 use_xy = TRUE;
972 break;
973 case 4:
974 if (!PyArg_ParseTuple(args,"iiil;int,int,n,attr", &y, &x, &num, &lattr))
975 return NULL;
976 attr = lattr;
977 use_xy = TRUE;
978 break;
979 default:
980 PyErr_SetString(PyExc_TypeError, "chgat requires 1 to 4 arguments");
981 return NULL;
982 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000983
Victor Stinner26486ea2010-05-15 22:23:53 +0000984 color = (short)((attr >> 8) & 0xff);
985 attr = attr - (color << 8);
Guido van Rossumd8faa362007-04-27 19:54:29 +0000986
Victor Stinner26486ea2010-05-15 22:23:53 +0000987 if (use_xy == TRUE) {
988 rtn = mvwchgat(self->win,y,x,num,attr,color,NULL);
989 touchline(self->win,y,1);
990 } else {
991 getyx(self->win,y,x);
992 rtn = wchgat(self->win,num,attr,color,NULL);
993 touchline(self->win,y,1);
994 }
995 return PyCursesCheckERR(rtn, "chgat");
Guido van Rossumd8faa362007-04-27 19:54:29 +0000996}
Serhiy Storchaka894ebd02017-11-01 14:34:20 +0200997#endif
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000998
Guido van Rossumf6971e21994-08-30 12:25:20 +0000999static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001000PyCursesWindow_DelCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001001{
Victor Stinner26486ea2010-05-15 22:23:53 +00001002 int rtn;
1003 int x, y;
Guido van Rossum85738471995-02-17 13:50:17 +00001004
Victor Stinner26486ea2010-05-15 22:23:53 +00001005 switch (PyTuple_Size(args)) {
1006 case 0:
1007 rtn = wdelch(self->win);
1008 break;
1009 case 2:
1010 if (!PyArg_ParseTuple(args,"ii;y,x", &y, &x))
1011 return NULL;
1012 rtn = py_mvwdelch(self->win,y,x);
1013 break;
1014 default:
1015 PyErr_SetString(PyExc_TypeError, "delch requires 0 or 2 arguments");
1016 return NULL;
1017 }
1018 return PyCursesCheckERR(rtn, "[mv]wdelch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001019}
1020
1021static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001022PyCursesWindow_DerWin(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001023{
Victor Stinner26486ea2010-05-15 22:23:53 +00001024 WINDOW *win;
1025 int nlines, ncols, begin_y, begin_x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001026
Victor Stinner26486ea2010-05-15 22:23:53 +00001027 nlines = 0;
1028 ncols = 0;
1029 switch (PyTuple_Size(args)) {
1030 case 2:
1031 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
1032 return NULL;
1033 break;
1034 case 4:
1035 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
1036 &nlines,&ncols,&begin_y,&begin_x))
1037 return NULL;
1038 break;
1039 default:
1040 PyErr_SetString(PyExc_TypeError, "derwin requires 2 or 4 arguments");
1041 return NULL;
1042 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001043
Victor Stinner26486ea2010-05-15 22:23:53 +00001044 win = derwin(self->win,nlines,ncols,begin_y,begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001045
Victor Stinner26486ea2010-05-15 22:23:53 +00001046 if (win == NULL) {
1047 PyErr_SetString(PyCursesError, catchall_NULL);
1048 return NULL;
1049 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001050
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001051 return (PyObject *)PyCursesWindow_New(win, NULL);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001052}
1053
1054static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001055PyCursesWindow_EchoChar(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001056{
Victor Stinner26486ea2010-05-15 22:23:53 +00001057 PyObject *temp;
1058 chtype ch;
1059 attr_t attr = A_NORMAL;
1060 long lattr;
Guido van Rossum85738471995-02-17 13:50:17 +00001061
Victor Stinner26486ea2010-05-15 22:23:53 +00001062 switch (PyTuple_Size(args)) {
1063 case 1:
1064 if (!PyArg_ParseTuple(args,"O;ch or int", &temp))
1065 return NULL;
1066 break;
1067 case 2:
1068 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
1069 return NULL;
1070 attr = lattr;
1071 break;
1072 default:
1073 PyErr_SetString(PyExc_TypeError, "echochar requires 1 or 2 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001074
1075
Victor Stinner26486ea2010-05-15 22:23:53 +00001076 return NULL;
1077 }
Guido van Rossum85738471995-02-17 13:50:17 +00001078
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001079 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001080 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001081
Masayuki Yamamoto8bc7d632017-11-01 21:05:26 +09001082#ifdef py_is_pad
1083 if (py_is_pad(self->win)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001084 return PyCursesCheckERR(pechochar(self->win, ch | attr),
1085 "echochar");
Masayuki Yamamoto8bc7d632017-11-01 21:05:26 +09001086 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001087 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001088#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001089 return PyCursesCheckERR(wechochar(self->win, ch | attr),
1090 "echochar");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001091}
1092
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001093#ifdef NCURSES_MOUSE_VERSION
1094static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001095PyCursesWindow_Enclose(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001096{
Victor Stinner26486ea2010-05-15 22:23:53 +00001097 int x, y;
1098 if (!PyArg_ParseTuple(args,"ii;y,x", &y, &x))
1099 return NULL;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001100
Victor Stinner26486ea2010-05-15 22:23:53 +00001101 return PyLong_FromLong( wenclose(self->win,y,x) );
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001102}
1103#endif
1104
Guido van Rossumf6971e21994-08-30 12:25:20 +00001105static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001106PyCursesWindow_GetBkgd(PyCursesWindowObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001107{
Victor Stinner26486ea2010-05-15 22:23:53 +00001108 return PyLong_FromLong((long) getbkgd(self->win));
Guido van Rossumf6971e21994-08-30 12:25:20 +00001109}
1110
1111static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001112PyCursesWindow_GetCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001113{
Victor Stinner26486ea2010-05-15 22:23:53 +00001114 int x, y;
1115 int rtn;
Guido van Rossum85738471995-02-17 13:50:17 +00001116
Victor Stinner26486ea2010-05-15 22:23:53 +00001117 switch (PyTuple_Size(args)) {
1118 case 0:
1119 Py_BEGIN_ALLOW_THREADS
1120 rtn = wgetch(self->win);
1121 Py_END_ALLOW_THREADS
1122 break;
1123 case 2:
1124 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1125 return NULL;
1126 Py_BEGIN_ALLOW_THREADS
1127 rtn = mvwgetch(self->win,y,x);
1128 Py_END_ALLOW_THREADS
1129 break;
1130 default:
1131 PyErr_SetString(PyExc_TypeError, "getch requires 0 or 2 arguments");
1132 return NULL;
1133 }
1134 return PyLong_FromLong((long)rtn);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001135}
Guido van Rossum85738471995-02-17 13:50:17 +00001136
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001137static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001138PyCursesWindow_GetKey(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001139{
Victor Stinner26486ea2010-05-15 22:23:53 +00001140 int x, y;
1141 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001142
Victor Stinner26486ea2010-05-15 22:23:53 +00001143 switch (PyTuple_Size(args)) {
1144 case 0:
1145 Py_BEGIN_ALLOW_THREADS
1146 rtn = wgetch(self->win);
1147 Py_END_ALLOW_THREADS
1148 break;
1149 case 2:
1150 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1151 return NULL;
1152 Py_BEGIN_ALLOW_THREADS
1153 rtn = mvwgetch(self->win,y,x);
1154 Py_END_ALLOW_THREADS
1155 break;
1156 default:
1157 PyErr_SetString(PyExc_TypeError, "getkey requires 0 or 2 arguments");
1158 return NULL;
1159 }
1160 if (rtn == ERR) {
1161 /* getch() returns ERR in nodelay mode */
R David Murrayf5d7cc22013-03-19 16:23:09 -04001162 PyErr_CheckSignals();
1163 if (!PyErr_Occurred())
1164 PyErr_SetString(PyCursesError, "no input");
Victor Stinner26486ea2010-05-15 22:23:53 +00001165 return NULL;
1166 } else if (rtn<=255) {
1167 return Py_BuildValue("C", rtn);
1168 } else {
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02001169 const char *knp = keyname(rtn);
Victor Stinner26486ea2010-05-15 22:23:53 +00001170 return PyUnicode_FromString((knp == NULL) ? "" : knp);
1171 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001172}
1173
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001174#ifdef HAVE_NCURSESW
Guido van Rossumf6971e21994-08-30 12:25:20 +00001175static PyObject *
Victor Stinnera7878b72011-07-14 23:07:44 +02001176PyCursesWindow_Get_WCh(PyCursesWindowObject *self, PyObject *args)
1177{
1178 int x, y;
1179 int ct;
1180 wint_t rtn;
1181
1182 switch (PyTuple_Size(args)) {
1183 case 0:
1184 Py_BEGIN_ALLOW_THREADS
1185 ct = wget_wch(self->win,&rtn);
1186 Py_END_ALLOW_THREADS
1187 break;
1188 case 2:
1189 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1190 return NULL;
1191 Py_BEGIN_ALLOW_THREADS
1192 ct = mvwget_wch(self->win,y,x,&rtn);
1193 Py_END_ALLOW_THREADS
1194 break;
1195 default:
1196 PyErr_SetString(PyExc_TypeError, "get_wch requires 0 or 2 arguments");
1197 return NULL;
1198 }
1199 if (ct == ERR) {
Victor Stinnerbd2d30c2013-03-21 12:21:06 +01001200 if (PyErr_CheckSignals())
1201 return NULL;
1202
Victor Stinnera7878b72011-07-14 23:07:44 +02001203 /* get_wch() returns ERR in nodelay mode */
1204 PyErr_SetString(PyCursesError, "no input");
1205 return NULL;
1206 }
Victor Stinner1d39cde2012-08-29 01:40:57 +02001207 if (ct == KEY_CODE_YES)
1208 return PyLong_FromLong(rtn);
1209 else
1210 return PyUnicode_FromOrdinal(rtn);
Victor Stinnera7878b72011-07-14 23:07:44 +02001211}
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001212#endif
Victor Stinnera7878b72011-07-14 23:07:44 +02001213
1214static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001215PyCursesWindow_GetStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001216{
Victor Stinner26486ea2010-05-15 22:23:53 +00001217 int x, y, n;
1218 char rtn[1024]; /* This should be big enough.. I hope */
1219 int rtn2;
Guido van Rossum85738471995-02-17 13:50:17 +00001220
Victor Stinner26486ea2010-05-15 22:23:53 +00001221 switch (PyTuple_Size(args)) {
1222 case 0:
1223 Py_BEGIN_ALLOW_THREADS
1224 rtn2 = wgetnstr(self->win,rtn, 1023);
1225 Py_END_ALLOW_THREADS
1226 break;
1227 case 1:
1228 if (!PyArg_ParseTuple(args,"i;n", &n))
1229 return NULL;
Benjamin Peterson40a77c32016-08-13 18:15:28 -07001230 if (n < 0) {
1231 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1232 return NULL;
1233 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001234 Py_BEGIN_ALLOW_THREADS
Victor Stinner640c35c2013-06-04 23:14:37 +02001235 rtn2 = wgetnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001236 Py_END_ALLOW_THREADS
1237 break;
1238 case 2:
1239 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1240 return NULL;
1241 Py_BEGIN_ALLOW_THREADS
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001242#ifdef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00001243 rtn2 = wmove(self->win,y,x)==ERR ? ERR : wgetnstr(self->win, rtn, 1023);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001244#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001245 rtn2 = mvwgetnstr(self->win,y,x,rtn, 1023);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001246#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001247 Py_END_ALLOW_THREADS
1248 break;
1249 case 3:
1250 if (!PyArg_ParseTuple(args,"iii;y,x,n", &y, &x, &n))
1251 return NULL;
Benjamin Peterson40a77c32016-08-13 18:15:28 -07001252 if (n < 0) {
1253 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1254 return NULL;
1255 }
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00001256#ifdef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00001257 Py_BEGIN_ALLOW_THREADS
1258 rtn2 = wmove(self->win,y,x)==ERR ? ERR :
Victor Stinner640c35c2013-06-04 23:14:37 +02001259 wgetnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001260 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001261#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001262 Py_BEGIN_ALLOW_THREADS
Victor Stinner640c35c2013-06-04 23:14:37 +02001263 rtn2 = mvwgetnstr(self->win, y, x, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001264 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001265#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001266 break;
1267 default:
1268 PyErr_SetString(PyExc_TypeError, "getstr requires 0 to 3 arguments");
1269 return NULL;
1270 }
1271 if (rtn2 == ERR)
1272 rtn[0] = 0;
1273 return PyBytes_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001274}
1275
1276static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001277PyCursesWindow_Hline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001278{
Victor Stinner26486ea2010-05-15 22:23:53 +00001279 PyObject *temp;
1280 chtype ch;
1281 int n, x, y, code = OK;
1282 attr_t attr = A_NORMAL;
1283 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001284
Victor Stinner26486ea2010-05-15 22:23:53 +00001285 switch (PyTuple_Size(args)) {
1286 case 2:
1287 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
1288 return NULL;
1289 break;
1290 case 3:
1291 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &lattr))
1292 return NULL;
1293 attr = lattr;
1294 break;
1295 case 4:
1296 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
1297 return NULL;
1298 code = wmove(self->win, y, x);
1299 break;
1300 case 5:
1301 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
1302 &y, &x, &temp, &n, &lattr))
1303 return NULL;
1304 attr = lattr;
1305 code = wmove(self->win, y, x);
1306 break;
1307 default:
1308 PyErr_SetString(PyExc_TypeError, "hline requires 2 to 5 arguments");
1309 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001310 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001311
1312 if (code != ERR) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001313 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001314 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001315 return PyCursesCheckERR(whline(self->win, ch | attr, n), "hline");
1316 } else
1317 return PyCursesCheckERR(code, "wmove");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001318}
1319
1320static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001321PyCursesWindow_InsCh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001322{
Victor Stinner26486ea2010-05-15 22:23:53 +00001323 int rtn, x, y, use_xy = FALSE;
1324 PyObject *temp;
1325 chtype ch = 0;
1326 attr_t attr = A_NORMAL;
1327 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001328
Victor Stinner26486ea2010-05-15 22:23:53 +00001329 switch (PyTuple_Size(args)) {
1330 case 1:
1331 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
1332 return NULL;
1333 break;
1334 case 2:
1335 if (!PyArg_ParseTuple(args, "Ol;ch or int,attr", &temp, &lattr))
1336 return NULL;
1337 attr = lattr;
1338 break;
1339 case 3:
1340 if (!PyArg_ParseTuple(args,"iiO;y,x,ch or int", &y, &x, &temp))
1341 return NULL;
1342 use_xy = TRUE;
1343 break;
1344 case 4:
1345 if (!PyArg_ParseTuple(args,"iiOl;y,x,ch or int, attr", &y, &x, &temp, &lattr))
1346 return NULL;
1347 attr = lattr;
1348 use_xy = TRUE;
1349 break;
1350 default:
1351 PyErr_SetString(PyExc_TypeError, "insch requires 1 or 4 arguments");
1352 return NULL;
1353 }
1354
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001355 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001356 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001357
1358 if (use_xy == TRUE)
1359 rtn = mvwinsch(self->win,y,x, ch | attr);
1360 else {
1361 rtn = winsch(self->win, ch | attr);
1362 }
1363 return PyCursesCheckERR(rtn, "insch");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001364}
1365
1366static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001367PyCursesWindow_InCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001368{
Christian Heimesabbc8ca2013-12-04 08:50:22 +01001369 int x, y;
1370 unsigned long rtn;
Guido van Rossum85738471995-02-17 13:50:17 +00001371
Victor Stinner26486ea2010-05-15 22:23:53 +00001372 switch (PyTuple_Size(args)) {
1373 case 0:
1374 rtn = winch(self->win);
1375 break;
1376 case 2:
1377 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1378 return NULL;
1379 rtn = mvwinch(self->win,y,x);
1380 break;
1381 default:
1382 PyErr_SetString(PyExc_TypeError, "inch requires 0 or 2 arguments");
1383 return NULL;
1384 }
Christian Heimesabbc8ca2013-12-04 08:50:22 +01001385 return PyLong_FromUnsignedLong(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001386}
1387
1388static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001389PyCursesWindow_InStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001390{
Victor Stinner26486ea2010-05-15 22:23:53 +00001391 int x, y, n;
1392 char rtn[1024]; /* This should be big enough.. I hope */
1393 int rtn2;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001394
Victor Stinner26486ea2010-05-15 22:23:53 +00001395 switch (PyTuple_Size(args)) {
1396 case 0:
1397 rtn2 = winnstr(self->win,rtn, 1023);
1398 break;
1399 case 1:
1400 if (!PyArg_ParseTuple(args,"i;n", &n))
1401 return NULL;
Benjamin Peterson432ea4f2016-08-15 21:40:14 -07001402 if (n < 0) {
1403 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1404 return NULL;
1405 }
Victor Stinner640c35c2013-06-04 23:14:37 +02001406 rtn2 = winnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001407 break;
1408 case 2:
1409 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1410 return NULL;
1411 rtn2 = mvwinnstr(self->win,y,x,rtn,1023);
1412 break;
1413 case 3:
1414 if (!PyArg_ParseTuple(args, "iii;y,x,n", &y, &x, &n))
1415 return NULL;
Benjamin Peterson432ea4f2016-08-15 21:40:14 -07001416 if (n < 0) {
1417 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1418 return NULL;
1419 }
Victor Stinner640c35c2013-06-04 23:14:37 +02001420 rtn2 = mvwinnstr(self->win, y, x, rtn, Py_MIN(n,1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001421 break;
1422 default:
1423 PyErr_SetString(PyExc_TypeError, "instr requires 0 or 3 arguments");
1424 return NULL;
1425 }
1426 if (rtn2 == ERR)
1427 rtn[0] = 0;
1428 return PyBytes_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001429}
1430
1431static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001432PyCursesWindow_InsStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001433{
Victor Stinner26486ea2010-05-15 22:23:53 +00001434 int rtn;
1435 int x, y;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001436 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -05001437 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001438#ifdef HAVE_NCURSESW
1439 wchar_t *wstr = NULL;
1440#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001441 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
1442 long lattr;
1443 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001444 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001445
Victor Stinner26486ea2010-05-15 22:23:53 +00001446 switch (PyTuple_Size(args)) {
1447 case 1:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001448 if (!PyArg_ParseTuple(args,"O;str", &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +00001449 return NULL;
1450 break;
1451 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001452 if (!PyArg_ParseTuple(args,"Ol;str,attr", &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001453 return NULL;
1454 attr = lattr;
1455 use_attr = TRUE;
1456 break;
1457 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001458 if (!PyArg_ParseTuple(args,"iiO;y,x,str", &y, &x, &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +00001459 return NULL;
1460 use_xy = TRUE;
1461 break;
1462 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001463 if (!PyArg_ParseTuple(args,"iiOl;y,x,str,attr", &y, &x, &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001464 return NULL;
1465 attr = lattr;
1466 use_xy = use_attr = TRUE;
1467 break;
1468 default:
1469 PyErr_SetString(PyExc_TypeError, "insstr requires 1 to 4 arguments");
1470 return NULL;
1471 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001472
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001473#ifdef HAVE_NCURSESW
1474 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
1475#else
1476 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
1477#endif
1478 if (strtype == 0)
1479 return NULL;
1480
Victor Stinner26486ea2010-05-15 22:23:53 +00001481 if (use_attr == TRUE) {
1482 attr_old = getattrs(self->win);
1483 (void)wattrset(self->win,attr);
1484 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001485#ifdef HAVE_NCURSESW
1486 if (strtype == 2) {
1487 funcname = "inswstr";
1488 if (use_xy == TRUE)
1489 rtn = mvwins_wstr(self->win,y,x,wstr);
1490 else
1491 rtn = wins_wstr(self->win,wstr);
1492 PyMem_Free(wstr);
1493 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001494 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001495#endif
1496 {
1497 char *str = PyBytes_AS_STRING(bytesobj);
1498 funcname = "insstr";
1499 if (use_xy == TRUE)
1500 rtn = mvwinsstr(self->win,y,x,str);
1501 else
1502 rtn = winsstr(self->win,str);
1503 Py_DECREF(bytesobj);
1504 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001505 if (use_attr == TRUE)
1506 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001507 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001508}
1509
1510static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001511PyCursesWindow_InsNStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001512{
Victor Stinner26486ea2010-05-15 22:23:53 +00001513 int rtn, x, y, n;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001514 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -05001515 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001516#ifdef HAVE_NCURSESW
1517 wchar_t *wstr = NULL;
1518#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001519 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
1520 long lattr;
1521 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001522 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001523
Victor Stinner26486ea2010-05-15 22:23:53 +00001524 switch (PyTuple_Size(args)) {
1525 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001526 if (!PyArg_ParseTuple(args,"Oi;str,n", &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +00001527 return NULL;
1528 break;
1529 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001530 if (!PyArg_ParseTuple(args,"Oil;str,n,attr", &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001531 return NULL;
1532 attr = lattr;
1533 use_attr = TRUE;
1534 break;
1535 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001536 if (!PyArg_ParseTuple(args,"iiOi;y,x,str,n", &y, &x, &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +00001537 return NULL;
1538 use_xy = TRUE;
1539 break;
1540 case 5:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001541 if (!PyArg_ParseTuple(args,"iiOil;y,x,str,n,attr", &y, &x, &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001542 return NULL;
1543 attr = lattr;
1544 use_xy = use_attr = TRUE;
1545 break;
1546 default:
1547 PyErr_SetString(PyExc_TypeError, "insnstr requires 2 to 5 arguments");
1548 return NULL;
1549 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001550
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001551#ifdef HAVE_NCURSESW
1552 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
1553#else
1554 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
1555#endif
1556 if (strtype == 0)
1557 return NULL;
1558
Victor Stinner26486ea2010-05-15 22:23:53 +00001559 if (use_attr == TRUE) {
1560 attr_old = getattrs(self->win);
1561 (void)wattrset(self->win,attr);
1562 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001563#ifdef HAVE_NCURSESW
1564 if (strtype == 2) {
1565 funcname = "insn_wstr";
1566 if (use_xy == TRUE)
1567 rtn = mvwins_nwstr(self->win,y,x,wstr,n);
1568 else
1569 rtn = wins_nwstr(self->win,wstr,n);
1570 PyMem_Free(wstr);
1571 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001572 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001573#endif
1574 {
1575 char *str = PyBytes_AS_STRING(bytesobj);
1576 funcname = "insnstr";
1577 if (use_xy == TRUE)
1578 rtn = mvwinsnstr(self->win,y,x,str,n);
1579 else
1580 rtn = winsnstr(self->win,str,n);
1581 Py_DECREF(bytesobj);
1582 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001583 if (use_attr == TRUE)
1584 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001585 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001586}
1587
1588static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001589PyCursesWindow_Is_LineTouched(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001590{
Victor Stinner26486ea2010-05-15 22:23:53 +00001591 int line, erg;
1592 if (!PyArg_ParseTuple(args,"i;line", &line))
1593 return NULL;
1594 erg = is_linetouched(self->win, line);
1595 if (erg == ERR) {
1596 PyErr_SetString(PyExc_TypeError,
1597 "is_linetouched: line number outside of boundaries");
1598 return NULL;
1599 } else
1600 if (erg == FALSE) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001601 Py_RETURN_FALSE;
Victor Stinner26486ea2010-05-15 22:23:53 +00001602 } else {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001603 Py_RETURN_TRUE;
Victor Stinner26486ea2010-05-15 22:23:53 +00001604 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001605}
1606
1607static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001608PyCursesWindow_NoOutRefresh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001609{
Victor Stinner26486ea2010-05-15 22:23:53 +00001610 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
1611 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001612
Masayuki Yamamoto8bc7d632017-11-01 21:05:26 +09001613#ifndef py_is_pad
Victor Stinner26486ea2010-05-15 22:23:53 +00001614 if (0)
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001615#else
Masayuki Yamamoto8bc7d632017-11-01 21:05:26 +09001616 if (py_is_pad(self->win))
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001617#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001618 {
1619 switch(PyTuple_Size(args)) {
1620 case 6:
1621 if (!PyArg_ParseTuple(args,
1622 "iiiiii;" \
1623 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1624 &pminrow, &pmincol, &sminrow,
1625 &smincol, &smaxrow, &smaxcol))
1626 return NULL;
1627 Py_BEGIN_ALLOW_THREADS
1628 rtn = pnoutrefresh(self->win,
1629 pminrow, pmincol, sminrow,
1630 smincol, smaxrow, smaxcol);
1631 Py_END_ALLOW_THREADS
1632 return PyCursesCheckERR(rtn, "pnoutrefresh");
1633 default:
1634 PyErr_SetString(PyCursesError,
1635 "noutrefresh() called for a pad "
1636 "requires 6 arguments");
1637 return NULL;
1638 }
1639 } else {
1640 if (!PyArg_ParseTuple(args, ":noutrefresh"))
1641 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001642
Victor Stinner26486ea2010-05-15 22:23:53 +00001643 Py_BEGIN_ALLOW_THREADS
1644 rtn = wnoutrefresh(self->win);
1645 Py_END_ALLOW_THREADS
1646 return PyCursesCheckERR(rtn, "wnoutrefresh");
1647 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001648}
1649
1650static PyObject *
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001651PyCursesWindow_Overlay(PyCursesWindowObject *self, PyObject *args)
1652{
1653 PyCursesWindowObject *temp;
1654 int use_copywin = FALSE;
1655 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1656 int rtn;
Victor Stinner26486ea2010-05-15 22:23:53 +00001657
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001658 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001659 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +00001660 if (!PyArg_ParseTuple(args, "O!;window object",
1661 &PyCursesWindow_Type, &temp))
1662 return NULL;
1663 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001664 case 7:
Victor Stinner26486ea2010-05-15 22:23:53 +00001665 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
1666 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1667 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1668 return NULL;
1669 use_copywin = TRUE;
1670 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001671 default:
Victor Stinner26486ea2010-05-15 22:23:53 +00001672 PyErr_SetString(PyExc_TypeError,
1673 "overlay requires one or seven arguments");
1674 return NULL;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001675 }
1676
1677 if (use_copywin == TRUE) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001678 rtn = copywin(self->win, temp->win, sminrow, smincol,
1679 dminrow, dmincol, dmaxrow, dmaxcol, TRUE);
1680 return PyCursesCheckERR(rtn, "copywin");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001681 }
1682 else {
Victor Stinner26486ea2010-05-15 22:23:53 +00001683 rtn = overlay(self->win, temp->win);
1684 return PyCursesCheckERR(rtn, "overlay");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001685 }
1686}
1687
1688static PyObject *
1689PyCursesWindow_Overwrite(PyCursesWindowObject *self, PyObject *args)
1690{
1691 PyCursesWindowObject *temp;
1692 int use_copywin = FALSE;
1693 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1694 int rtn;
Victor Stinner26486ea2010-05-15 22:23:53 +00001695
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001696 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001697 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +00001698 if (!PyArg_ParseTuple(args, "O!;window object",
1699 &PyCursesWindow_Type, &temp))
1700 return NULL;
1701 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001702 case 7:
Victor Stinner26486ea2010-05-15 22:23:53 +00001703 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
1704 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1705 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1706 return NULL;
1707 use_copywin = TRUE;
1708 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001709 default:
Victor Stinner26486ea2010-05-15 22:23:53 +00001710 PyErr_SetString(PyExc_TypeError,
1711 "overwrite requires one or seven arguments");
1712 return NULL;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001713 }
1714
1715 if (use_copywin == TRUE) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001716 rtn = copywin(self->win, temp->win, sminrow, smincol,
1717 dminrow, dmincol, dmaxrow, dmaxcol, FALSE);
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001718 return PyCursesCheckERR(rtn, "copywin");
1719 }
1720 else {
Victor Stinner26486ea2010-05-15 22:23:53 +00001721 rtn = overwrite(self->win, temp->win);
1722 return PyCursesCheckERR(rtn, "overwrite");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001723 }
1724}
1725
1726static PyObject *
Guido van Rossum6c95da32007-07-24 00:16:38 +00001727PyCursesWindow_PutWin(PyCursesWindowObject *self, PyObject *stream)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001728{
Victor Stinner26486ea2010-05-15 22:23:53 +00001729 /* We have to simulate this by writing to a temporary FILE*,
1730 then reading back, then writing to the argument stream. */
Christian Heimes2b221b72017-03-02 11:09:01 +01001731 FILE *fp;
Victor Stinnerdaf45552013-08-28 00:53:59 +02001732 PyObject *res = NULL;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00001733
Christian Heimes2b221b72017-03-02 11:09:01 +01001734 fp = tmpfile();
1735 if (fp == NULL)
1736 return PyErr_SetFromErrno(PyExc_OSError);
1737 if (_Py_set_inheritable(fileno(fp), 0, NULL) < 0)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001738 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001739 res = PyCursesCheckERR(putwin(self->win, fp), "putwin");
Victor Stinnerdaf45552013-08-28 00:53:59 +02001740 if (res == NULL)
1741 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001742 fseek(fp, 0, 0);
1743 while (1) {
1744 char buf[BUFSIZ];
1745 Py_ssize_t n = fread(buf, 1, BUFSIZ, fp);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001746 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001747
Victor Stinner26486ea2010-05-15 22:23:53 +00001748 if (n <= 0)
1749 break;
1750 Py_DECREF(res);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001751 res = _PyObject_CallMethodId(stream, &PyId_write, "y#", buf, n);
Victor Stinner26486ea2010-05-15 22:23:53 +00001752 if (res == NULL)
1753 break;
1754 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02001755
1756exit:
Christian Heimes2b221b72017-03-02 11:09:01 +01001757 fclose(fp);
Guido van Rossum6c95da32007-07-24 00:16:38 +00001758 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001759}
1760
1761static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001762PyCursesWindow_RedrawLine(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001763{
Victor Stinner26486ea2010-05-15 22:23:53 +00001764 int beg, num;
1765 if (!PyArg_ParseTuple(args, "ii;beg,num", &beg, &num))
1766 return NULL;
1767 return PyCursesCheckERR(wredrawln(self->win,beg,num), "redrawln");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001768}
1769
1770static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001771PyCursesWindow_Refresh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001772{
Victor Stinner26486ea2010-05-15 22:23:53 +00001773 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
1774 int rtn;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001775
Masayuki Yamamoto8bc7d632017-11-01 21:05:26 +09001776#ifndef py_is_pad
Victor Stinner26486ea2010-05-15 22:23:53 +00001777 if (0)
1778#else
Masayuki Yamamoto8bc7d632017-11-01 21:05:26 +09001779 if (py_is_pad(self->win))
Victor Stinner26486ea2010-05-15 22:23:53 +00001780#endif
1781 {
1782 switch(PyTuple_Size(args)) {
1783 case 6:
1784 if (!PyArg_ParseTuple(args,
1785 "iiiiii;" \
1786 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1787 &pminrow, &pmincol, &sminrow,
1788 &smincol, &smaxrow, &smaxcol))
1789 return NULL;
1790
1791 Py_BEGIN_ALLOW_THREADS
1792 rtn = prefresh(self->win,
1793 pminrow, pmincol, sminrow,
1794 smincol, smaxrow, smaxcol);
1795 Py_END_ALLOW_THREADS
1796 return PyCursesCheckERR(rtn, "prefresh");
1797 default:
1798 PyErr_SetString(PyCursesError,
1799 "refresh() for a pad requires 6 arguments");
1800 return NULL;
1801 }
1802 } else {
1803 if (!PyArg_ParseTuple(args, ":refresh"))
1804 return NULL;
1805 Py_BEGIN_ALLOW_THREADS
1806 rtn = wrefresh(self->win);
1807 Py_END_ALLOW_THREADS
1808 return PyCursesCheckERR(rtn, "prefresh");
1809 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001810}
1811
1812static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001813PyCursesWindow_SetScrollRegion(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001814{
Victor Stinner26486ea2010-05-15 22:23:53 +00001815 int x, y;
1816 if (!PyArg_ParseTuple(args,"ii;top, bottom",&y,&x))
1817 return NULL;
1818 return PyCursesCheckERR(wsetscrreg(self->win,y,x), "wsetscrreg");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001819}
1820
1821static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001822PyCursesWindow_SubWin(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001823{
Victor Stinner26486ea2010-05-15 22:23:53 +00001824 WINDOW *win;
1825 int nlines, ncols, begin_y, begin_x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001826
Victor Stinner26486ea2010-05-15 22:23:53 +00001827 nlines = 0;
1828 ncols = 0;
1829 switch (PyTuple_Size(args)) {
1830 case 2:
1831 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
1832 return NULL;
1833 break;
1834 case 4:
1835 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
1836 &nlines,&ncols,&begin_y,&begin_x))
1837 return NULL;
1838 break;
1839 default:
1840 PyErr_SetString(PyExc_TypeError, "subwin requires 2 or 4 arguments");
1841 return NULL;
1842 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001843
Victor Stinner26486ea2010-05-15 22:23:53 +00001844 /* printf("Subwin: %i %i %i %i \n", nlines, ncols, begin_y, begin_x); */
Masayuki Yamamoto8bc7d632017-11-01 21:05:26 +09001845#ifdef py_is_pad
1846 if (py_is_pad(self->win)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001847 win = subpad(self->win, nlines, ncols, begin_y, begin_x);
Masayuki Yamamoto8bc7d632017-11-01 21:05:26 +09001848 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001849 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001850#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001851 win = subwin(self->win, nlines, ncols, begin_y, begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001852
Victor Stinner26486ea2010-05-15 22:23:53 +00001853 if (win == NULL) {
1854 PyErr_SetString(PyCursesError, catchall_NULL);
1855 return NULL;
1856 }
1857
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001858 return (PyObject *)PyCursesWindow_New(win, self->encoding);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001859}
1860
1861static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001862PyCursesWindow_Scroll(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001863{
Victor Stinner26486ea2010-05-15 22:23:53 +00001864 int nlines;
1865 switch(PyTuple_Size(args)) {
1866 case 0:
1867 return PyCursesCheckERR(scroll(self->win), "scroll");
1868 case 1:
1869 if (!PyArg_ParseTuple(args, "i;nlines", &nlines))
1870 return NULL;
1871 return PyCursesCheckERR(wscrl(self->win, nlines), "scroll");
1872 default:
1873 PyErr_SetString(PyExc_TypeError, "scroll requires 0 or 1 arguments");
1874 return NULL;
1875 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001876}
1877
1878static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001879PyCursesWindow_TouchLine(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001880{
Victor Stinner26486ea2010-05-15 22:23:53 +00001881 int st, cnt, val;
1882 switch (PyTuple_Size(args)) {
1883 case 2:
1884 if (!PyArg_ParseTuple(args,"ii;start,count",&st,&cnt))
1885 return NULL;
1886 return PyCursesCheckERR(touchline(self->win,st,cnt), "touchline");
1887 case 3:
1888 if (!PyArg_ParseTuple(args, "iii;start,count,val", &st, &cnt, &val))
1889 return NULL;
1890 return PyCursesCheckERR(wtouchln(self->win, st, cnt, val), "touchline");
1891 default:
1892 PyErr_SetString(PyExc_TypeError, "touchline requires 2 or 3 arguments");
1893 return NULL;
1894 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001895}
1896
1897static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001898PyCursesWindow_Vline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001899{
Victor Stinner26486ea2010-05-15 22:23:53 +00001900 PyObject *temp;
1901 chtype ch;
1902 int n, x, y, code = OK;
1903 attr_t attr = A_NORMAL;
1904 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001905
Victor Stinner26486ea2010-05-15 22:23:53 +00001906 switch (PyTuple_Size(args)) {
1907 case 2:
1908 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
1909 return NULL;
1910 break;
1911 case 3:
1912 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &lattr))
1913 return NULL;
1914 attr = lattr;
1915 break;
1916 case 4:
1917 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
1918 return NULL;
1919 code = wmove(self->win, y, x);
1920 break;
1921 case 5:
1922 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
1923 &y, &x, &temp, &n, &lattr))
1924 return NULL;
1925 attr = lattr;
1926 code = wmove(self->win, y, x);
1927 break;
1928 default:
1929 PyErr_SetString(PyExc_TypeError, "vline requires 2 to 5 arguments");
1930 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001931 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001932
1933 if (code != ERR) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001934 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001935 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001936 return PyCursesCheckERR(wvline(self->win, ch | attr, n), "vline");
1937 } else
1938 return PyCursesCheckERR(code, "wmove");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001939}
1940
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001941static PyObject *
1942PyCursesWindow_get_encoding(PyCursesWindowObject *self, void *closure)
1943{
1944 return PyUnicode_FromString(self->encoding);
1945}
1946
1947static int
1948PyCursesWindow_set_encoding(PyCursesWindowObject *self, PyObject *value)
1949{
1950 PyObject *ascii;
1951 char *encoding;
1952
1953 /* It is illegal to del win.encoding */
1954 if (value == NULL) {
1955 PyErr_SetString(PyExc_TypeError,
1956 "encoding may not be deleted");
1957 return -1;
1958 }
1959
1960 if (!PyUnicode_Check(value)) {
1961 PyErr_SetString(PyExc_TypeError,
1962 "setting encoding to a non-string");
1963 return -1;
1964 }
1965 ascii = PyUnicode_AsASCIIString(value);
1966 if (ascii == NULL)
1967 return -1;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02001968 encoding = _PyMem_Strdup(PyBytes_AS_STRING(ascii));
Ross Lagerwall2dabaf62012-09-07 08:34:23 +02001969 Py_DECREF(ascii);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001970 if (encoding == NULL) {
1971 PyErr_NoMemory();
1972 return -1;
1973 }
Victor Stinner49fc8ec2013-07-07 23:30:24 +02001974 PyMem_Free(self->encoding);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001975 self->encoding = encoding;
1976 return 0;
1977}
1978
1979
Guido van Rossumf6971e21994-08-30 12:25:20 +00001980static PyMethodDef PyCursesWindow_Methods[] = {
Larry Hastings31826802013-10-19 00:09:25 -07001981 CURSES_WINDOW_ADDCH_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00001982 {"addnstr", (PyCFunction)PyCursesWindow_AddNStr, METH_VARARGS},
1983 {"addstr", (PyCFunction)PyCursesWindow_AddStr, METH_VARARGS},
1984 {"attroff", (PyCFunction)PyCursesWindow_AttrOff, METH_VARARGS},
1985 {"attron", (PyCFunction)PyCursesWindow_AttrOn, METH_VARARGS},
1986 {"attrset", (PyCFunction)PyCursesWindow_AttrSet, METH_VARARGS},
1987 {"bkgd", (PyCFunction)PyCursesWindow_Bkgd, METH_VARARGS},
Serhiy Storchaka894ebd02017-11-01 14:34:20 +02001988#ifdef HAVE_CURSES_WCHGAT
Victor Stinner26486ea2010-05-15 22:23:53 +00001989 {"chgat", (PyCFunction)PyCursesWindow_ChgAt, METH_VARARGS},
Serhiy Storchaka894ebd02017-11-01 14:34:20 +02001990#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001991 {"bkgdset", (PyCFunction)PyCursesWindow_BkgdSet, METH_VARARGS},
1992 {"border", (PyCFunction)PyCursesWindow_Border, METH_VARARGS},
1993 {"box", (PyCFunction)PyCursesWindow_Box, METH_VARARGS},
1994 {"clear", (PyCFunction)PyCursesWindow_wclear, METH_NOARGS},
1995 {"clearok", (PyCFunction)PyCursesWindow_clearok, METH_VARARGS},
1996 {"clrtobot", (PyCFunction)PyCursesWindow_wclrtobot, METH_NOARGS},
1997 {"clrtoeol", (PyCFunction)PyCursesWindow_wclrtoeol, METH_NOARGS},
1998 {"cursyncup", (PyCFunction)PyCursesWindow_wcursyncup, METH_NOARGS},
1999 {"delch", (PyCFunction)PyCursesWindow_DelCh, METH_VARARGS},
2000 {"deleteln", (PyCFunction)PyCursesWindow_wdeleteln, METH_NOARGS},
2001 {"derwin", (PyCFunction)PyCursesWindow_DerWin, METH_VARARGS},
2002 {"echochar", (PyCFunction)PyCursesWindow_EchoChar, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002003#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00002004 {"enclose", (PyCFunction)PyCursesWindow_Enclose, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002005#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002006 {"erase", (PyCFunction)PyCursesWindow_werase, METH_NOARGS},
2007 {"getbegyx", (PyCFunction)PyCursesWindow_getbegyx, METH_NOARGS},
2008 {"getbkgd", (PyCFunction)PyCursesWindow_GetBkgd, METH_NOARGS},
2009 {"getch", (PyCFunction)PyCursesWindow_GetCh, METH_VARARGS},
2010 {"getkey", (PyCFunction)PyCursesWindow_GetKey, METH_VARARGS},
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02002011#ifdef HAVE_NCURSESW
Victor Stinnera7878b72011-07-14 23:07:44 +02002012 {"get_wch", (PyCFunction)PyCursesWindow_Get_WCh, METH_VARARGS},
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02002013#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002014 {"getmaxyx", (PyCFunction)PyCursesWindow_getmaxyx, METH_NOARGS},
2015 {"getparyx", (PyCFunction)PyCursesWindow_getparyx, METH_NOARGS},
2016 {"getstr", (PyCFunction)PyCursesWindow_GetStr, METH_VARARGS},
2017 {"getyx", (PyCFunction)PyCursesWindow_getyx, METH_NOARGS},
2018 {"hline", (PyCFunction)PyCursesWindow_Hline, METH_VARARGS},
2019 {"idcok", (PyCFunction)PyCursesWindow_idcok, METH_VARARGS},
2020 {"idlok", (PyCFunction)PyCursesWindow_idlok, METH_VARARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002021#ifdef HAVE_CURSES_IMMEDOK
Victor Stinner26486ea2010-05-15 22:23:53 +00002022 {"immedok", (PyCFunction)PyCursesWindow_immedok, METH_VARARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002023#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002024 {"inch", (PyCFunction)PyCursesWindow_InCh, METH_VARARGS},
2025 {"insch", (PyCFunction)PyCursesWindow_InsCh, METH_VARARGS},
2026 {"insdelln", (PyCFunction)PyCursesWindow_winsdelln, METH_VARARGS},
2027 {"insertln", (PyCFunction)PyCursesWindow_winsertln, METH_NOARGS},
2028 {"insnstr", (PyCFunction)PyCursesWindow_InsNStr, METH_VARARGS},
2029 {"insstr", (PyCFunction)PyCursesWindow_InsStr, METH_VARARGS},
2030 {"instr", (PyCFunction)PyCursesWindow_InStr, METH_VARARGS},
2031 {"is_linetouched", (PyCFunction)PyCursesWindow_Is_LineTouched, METH_VARARGS},
2032 {"is_wintouched", (PyCFunction)PyCursesWindow_is_wintouched, METH_NOARGS},
2033 {"keypad", (PyCFunction)PyCursesWindow_keypad, METH_VARARGS},
2034 {"leaveok", (PyCFunction)PyCursesWindow_leaveok, METH_VARARGS},
2035 {"move", (PyCFunction)PyCursesWindow_wmove, METH_VARARGS},
2036 {"mvderwin", (PyCFunction)PyCursesWindow_mvderwin, METH_VARARGS},
2037 {"mvwin", (PyCFunction)PyCursesWindow_mvwin, METH_VARARGS},
2038 {"nodelay", (PyCFunction)PyCursesWindow_nodelay, METH_VARARGS},
2039 {"notimeout", (PyCFunction)PyCursesWindow_notimeout, METH_VARARGS},
2040 {"noutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh, METH_VARARGS},
Victor Stinner26486ea2010-05-15 22:23:53 +00002041 {"overlay", (PyCFunction)PyCursesWindow_Overlay, METH_VARARGS},
2042 {"overwrite", (PyCFunction)PyCursesWindow_Overwrite,
2043 METH_VARARGS},
2044 {"putwin", (PyCFunction)PyCursesWindow_PutWin, METH_O},
2045 {"redrawln", (PyCFunction)PyCursesWindow_RedrawLine, METH_VARARGS},
2046 {"redrawwin", (PyCFunction)PyCursesWindow_redrawwin, METH_NOARGS},
2047 {"refresh", (PyCFunction)PyCursesWindow_Refresh, METH_VARARGS},
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00002048#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00002049 {"resize", (PyCFunction)PyCursesWindow_wresize, METH_VARARGS},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002050#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002051 {"scroll", (PyCFunction)PyCursesWindow_Scroll, METH_VARARGS},
2052 {"scrollok", (PyCFunction)PyCursesWindow_scrollok, METH_VARARGS},
2053 {"setscrreg", (PyCFunction)PyCursesWindow_SetScrollRegion, METH_VARARGS},
2054 {"standend", (PyCFunction)PyCursesWindow_wstandend, METH_NOARGS},
2055 {"standout", (PyCFunction)PyCursesWindow_wstandout, METH_NOARGS},
2056 {"subpad", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
2057 {"subwin", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
2058 {"syncdown", (PyCFunction)PyCursesWindow_wsyncdown, METH_NOARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002059#ifdef HAVE_CURSES_SYNCOK
Victor Stinner26486ea2010-05-15 22:23:53 +00002060 {"syncok", (PyCFunction)PyCursesWindow_syncok, METH_VARARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002061#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002062 {"syncup", (PyCFunction)PyCursesWindow_wsyncup, METH_NOARGS},
2063 {"timeout", (PyCFunction)PyCursesWindow_wtimeout, METH_VARARGS},
2064 {"touchline", (PyCFunction)PyCursesWindow_TouchLine, METH_VARARGS},
2065 {"touchwin", (PyCFunction)PyCursesWindow_touchwin, METH_NOARGS},
2066 {"untouchwin", (PyCFunction)PyCursesWindow_untouchwin, METH_NOARGS},
2067 {"vline", (PyCFunction)PyCursesWindow_Vline, METH_VARARGS},
2068 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002069};
2070
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002071static PyGetSetDef PyCursesWindow_getsets[] = {
2072 {"encoding",
2073 (getter)PyCursesWindow_get_encoding,
2074 (setter)PyCursesWindow_set_encoding,
Ronald Oussoren2a7fe032012-01-17 16:53:20 +01002075 "the typecode character used to create the array"},
2076 {NULL, NULL, NULL, NULL } /* sentinel */
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002077};
2078
Guido van Rossumf6971e21994-08-30 12:25:20 +00002079/* -------------------------------------------------------*/
Guido van Rossum85738471995-02-17 13:50:17 +00002080
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002081PyTypeObject PyCursesWindow_Type = {
Victor Stinner26486ea2010-05-15 22:23:53 +00002082 PyVarObject_HEAD_INIT(NULL, 0)
Victor Stinner61e2bc72017-02-12 23:42:02 +01002083 "_curses.window", /*tp_name*/
Victor Stinner26486ea2010-05-15 22:23:53 +00002084 sizeof(PyCursesWindowObject), /*tp_basicsize*/
2085 0, /*tp_itemsize*/
2086 /* methods */
2087 (destructor)PyCursesWindow_Dealloc, /*tp_dealloc*/
2088 0, /*tp_print*/
2089 (getattrfunc)0, /*tp_getattr*/
2090 (setattrfunc)0, /*tp_setattr*/
2091 0, /*tp_reserved*/
2092 0, /*tp_repr*/
2093 0, /*tp_as_number*/
2094 0, /*tp_as_sequence*/
2095 0, /*tp_as_mapping*/
2096 0, /*tp_hash*/
2097 0, /*tp_call*/
2098 0, /*tp_str*/
2099 0, /*tp_getattro*/
2100 0, /*tp_setattro*/
2101 0, /*tp_as_buffer*/
2102 Py_TPFLAGS_DEFAULT, /*tp_flags*/
2103 0, /*tp_doc*/
2104 0, /*tp_traverse*/
2105 0, /*tp_clear*/
2106 0, /*tp_richcompare*/
2107 0, /*tp_weaklistoffset*/
2108 0, /*tp_iter*/
2109 0, /*tp_iternext*/
2110 PyCursesWindow_Methods, /*tp_methods*/
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002111 0, /* tp_members */
2112 PyCursesWindow_getsets, /* tp_getset */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002113};
2114
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002115/*********************************************************************
2116 Global Functions
2117**********************************************************************/
Guido van Rossumf6971e21994-08-30 12:25:20 +00002118
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002119NoArgNoReturnFunction(beep)
2120NoArgNoReturnFunction(def_prog_mode)
2121NoArgNoReturnFunction(def_shell_mode)
2122NoArgNoReturnFunction(doupdate)
2123NoArgNoReturnFunction(endwin)
2124NoArgNoReturnFunction(flash)
2125NoArgNoReturnFunction(nocbreak)
2126NoArgNoReturnFunction(noecho)
2127NoArgNoReturnFunction(nonl)
2128NoArgNoReturnFunction(noraw)
2129NoArgNoReturnFunction(reset_prog_mode)
2130NoArgNoReturnFunction(reset_shell_mode)
2131NoArgNoReturnFunction(resetty)
2132NoArgNoReturnFunction(savetty)
2133
2134NoArgOrFlagNoReturnFunction(cbreak)
2135NoArgOrFlagNoReturnFunction(echo)
2136NoArgOrFlagNoReturnFunction(nl)
2137NoArgOrFlagNoReturnFunction(raw)
2138
2139NoArgReturnIntFunction(baudrate)
2140NoArgReturnIntFunction(termattrs)
2141
2142NoArgReturnStringFunction(termname)
2143NoArgReturnStringFunction(longname)
2144
2145NoArgTrueFalseFunction(can_change_color)
2146NoArgTrueFalseFunction(has_colors)
2147NoArgTrueFalseFunction(has_ic)
2148NoArgTrueFalseFunction(has_il)
2149NoArgTrueFalseFunction(isendwin)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002150NoArgNoReturnVoidFunction(flushinp)
2151NoArgNoReturnVoidFunction(noqiflush)
2152
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002153#ifdef HAVE_CURSES_FILTER
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002154static PyObject *
Christian Heimesaf98da12008-01-27 15:18:18 +00002155PyCurses_filter(PyObject *self)
2156{
Victor Stinner26486ea2010-05-15 22:23:53 +00002157 /* not checking for PyCursesInitialised here since filter() must
2158 be called before initscr() */
2159 filter();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002160 Py_RETURN_NONE;
Christian Heimesaf98da12008-01-27 15:18:18 +00002161}
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002162#endif
Christian Heimesaf98da12008-01-27 15:18:18 +00002163
2164static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002165PyCurses_Color_Content(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002166{
Victor Stinner26486ea2010-05-15 22:23:53 +00002167 short color,r,g,b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002168
Victor Stinner26486ea2010-05-15 22:23:53 +00002169 PyCursesInitialised;
2170 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002171
Victor Stinner26486ea2010-05-15 22:23:53 +00002172 if (!PyArg_ParseTuple(args, "h:color_content", &color)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002173
Victor Stinner26486ea2010-05-15 22:23:53 +00002174 if (color_content(color, &r, &g, &b) != ERR)
2175 return Py_BuildValue("(iii)", r, g, b);
2176 else {
2177 PyErr_SetString(PyCursesError,
2178 "Argument 1 was out of range. Check value of COLORS.");
2179 return NULL;
2180 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002181}
2182
2183static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002184PyCurses_color_pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002185{
Victor Stinner26486ea2010-05-15 22:23:53 +00002186 int n;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002187
Victor Stinner26486ea2010-05-15 22:23:53 +00002188 PyCursesInitialised;
2189 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002190
Victor Stinner26486ea2010-05-15 22:23:53 +00002191 if (!PyArg_ParseTuple(args, "i:color_pair", &n)) return NULL;
2192 return PyLong_FromLong((long) (n << 8));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002193}
2194
2195static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002196PyCurses_Curs_Set(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002197{
Victor Stinner26486ea2010-05-15 22:23:53 +00002198 int vis,erg;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002199
Victor Stinner26486ea2010-05-15 22:23:53 +00002200 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002201
Victor Stinner26486ea2010-05-15 22:23:53 +00002202 if (!PyArg_ParseTuple(args, "i:curs_set", &vis)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002203
Victor Stinner26486ea2010-05-15 22:23:53 +00002204 erg = curs_set(vis);
2205 if (erg == ERR) return PyCursesCheckERR(erg, "curs_set");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002206
Victor Stinner26486ea2010-05-15 22:23:53 +00002207 return PyLong_FromLong((long) erg);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002208}
2209
2210static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002211PyCurses_Delay_Output(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002212{
Victor Stinner26486ea2010-05-15 22:23:53 +00002213 int ms;
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:delay_output", &ms)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002218
Victor Stinner26486ea2010-05-15 22:23:53 +00002219 return PyCursesCheckERR(delay_output(ms), "delay_output");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002220}
2221
2222static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002223PyCurses_EraseChar(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002224{
Victor Stinner26486ea2010-05-15 22:23:53 +00002225 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002226
Victor Stinner26486ea2010-05-15 22:23:53 +00002227 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002228
Victor Stinner26486ea2010-05-15 22:23:53 +00002229 ch = erasechar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002230
Victor Stinner26486ea2010-05-15 22:23:53 +00002231 return PyBytes_FromStringAndSize(&ch, 1);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002232}
2233
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002234#ifdef getsyx
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002235static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002236PyCurses_getsyx(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002237{
Victor Stinner26486ea2010-05-15 22:23:53 +00002238 int x = 0;
2239 int y = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002240
Victor Stinner26486ea2010-05-15 22:23:53 +00002241 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002242
Victor Stinner26486ea2010-05-15 22:23:53 +00002243 getsyx(y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002244
Victor Stinner26486ea2010-05-15 22:23:53 +00002245 return Py_BuildValue("(ii)", y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002246}
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002247#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002248
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002249#ifdef NCURSES_MOUSE_VERSION
2250static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002251PyCurses_GetMouse(PyObject *self)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002252{
Victor Stinner26486ea2010-05-15 22:23:53 +00002253 int rtn;
2254 MEVENT event;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002255
Victor Stinner26486ea2010-05-15 22:23:53 +00002256 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002257
Victor Stinner26486ea2010-05-15 22:23:53 +00002258 rtn = getmouse( &event );
2259 if (rtn == ERR) {
2260 PyErr_SetString(PyCursesError, "getmouse() returned ERR");
2261 return NULL;
2262 }
2263 return Py_BuildValue("(hiiil)",
2264 (short)event.id,
2265 event.x, event.y, event.z,
2266 (long) event.bstate);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002267}
2268
2269static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002270PyCurses_UngetMouse(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002271{
Victor Stinner26486ea2010-05-15 22:23:53 +00002272 MEVENT event;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002273
Victor Stinner26486ea2010-05-15 22:23:53 +00002274 PyCursesInitialised;
2275 if (!PyArg_ParseTuple(args, "hiiil",
2276 &event.id,
2277 &event.x, &event.y, &event.z,
2278 (int *) &event.bstate))
2279 return NULL;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002280
Victor Stinner26486ea2010-05-15 22:23:53 +00002281 return PyCursesCheckERR(ungetmouse(&event), "ungetmouse");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002282}
2283#endif
2284
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002285static PyObject *
Guido van Rossum6c95da32007-07-24 00:16:38 +00002286PyCurses_GetWin(PyCursesWindowObject *self, PyObject *stream)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002287{
Christian Heimes2b221b72017-03-02 11:09:01 +01002288 FILE *fp;
Victor Stinner26486ea2010-05-15 22:23:53 +00002289 PyObject *data;
2290 size_t datalen;
2291 WINDOW *win;
Benjamin Peterson18b71912013-05-16 15:29:44 -05002292 _Py_IDENTIFIER(read);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002293 PyObject *res = NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002294
Victor Stinner26486ea2010-05-15 22:23:53 +00002295 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002296
Christian Heimes2b221b72017-03-02 11:09:01 +01002297 fp = tmpfile();
2298 if (fp == NULL)
2299 return PyErr_SetFromErrno(PyExc_OSError);
2300
2301 if (_Py_set_inheritable(fileno(fp), 0, NULL) < 0)
Victor Stinnerdaf45552013-08-28 00:53:59 +02002302 goto error;
Christian Heimes2b221b72017-03-02 11:09:01 +01002303
Victor Stinnerdaf45552013-08-28 00:53:59 +02002304
Victor Stinner3466bde2016-09-05 18:16:01 -07002305 data = _PyObject_CallMethodId(stream, &PyId_read, NULL);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002306 if (data == NULL)
2307 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002308 if (!PyBytes_Check(data)) {
2309 PyErr_Format(PyExc_TypeError,
2310 "f.read() returned %.100s instead of bytes",
2311 data->ob_type->tp_name);
2312 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002313 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002314 }
2315 datalen = PyBytes_GET_SIZE(data);
2316 if (fwrite(PyBytes_AS_STRING(data), 1, datalen, fp) != datalen) {
2317 Py_DECREF(data);
Christian Heimes2b221b72017-03-02 11:09:01 +01002318 PyErr_SetFromErrno(PyExc_OSError);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002319 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002320 }
Guido van Rossum6c95da32007-07-24 00:16:38 +00002321 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002322
Victor Stinner26486ea2010-05-15 22:23:53 +00002323 fseek(fp, 0, 0);
2324 win = getwin(fp);
Victor Stinner26486ea2010-05-15 22:23:53 +00002325 if (win == NULL) {
2326 PyErr_SetString(PyCursesError, catchall_NULL);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002327 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002328 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02002329 res = PyCursesWindow_New(win, NULL);
2330
2331error:
Christian Heimes2b221b72017-03-02 11:09:01 +01002332 fclose(fp);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002333 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002334}
2335
2336static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002337PyCurses_HalfDelay(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002338{
Victor Stinner26486ea2010-05-15 22:23:53 +00002339 unsigned char tenths;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002340
Victor Stinner26486ea2010-05-15 22:23:53 +00002341 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002342
Victor Stinner26486ea2010-05-15 22:23:53 +00002343 if (!PyArg_ParseTuple(args, "b:halfdelay", &tenths)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002344
Victor Stinner26486ea2010-05-15 22:23:53 +00002345 return PyCursesCheckERR(halfdelay(tenths), "halfdelay");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002346}
2347
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002348#ifdef HAVE_CURSES_HAS_KEY
2349static PyObject *
2350PyCurses_has_key(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002351{
Victor Stinner26486ea2010-05-15 22:23:53 +00002352 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002353
Victor Stinner26486ea2010-05-15 22:23:53 +00002354 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002355
Victor Stinner26486ea2010-05-15 22:23:53 +00002356 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002357
Victor Stinner26486ea2010-05-15 22:23:53 +00002358 if (has_key(ch) == FALSE) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002359 Py_RETURN_FALSE;
Victor Stinner26486ea2010-05-15 22:23:53 +00002360 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002361 Py_RETURN_TRUE;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002362}
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002363#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002364
2365static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002366PyCurses_Init_Color(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002367{
Victor Stinner26486ea2010-05-15 22:23:53 +00002368 short color, r, g, b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002369
Victor Stinner26486ea2010-05-15 22:23:53 +00002370 PyCursesInitialised;
2371 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002372
Victor Stinner26486ea2010-05-15 22:23:53 +00002373 switch(PyTuple_Size(args)) {
2374 case 4:
2375 if (!PyArg_ParseTuple(args, "hhhh;color,r,g,b", &color, &r, &g, &b)) return NULL;
2376 break;
2377 default:
2378 PyErr_SetString(PyExc_TypeError, "init_color requires 4 arguments");
2379 return NULL;
2380 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002381
Victor Stinner26486ea2010-05-15 22:23:53 +00002382 return PyCursesCheckERR(init_color(color, r, g, b), "init_color");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002383}
2384
2385static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002386PyCurses_Init_Pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002387{
Victor Stinner26486ea2010-05-15 22:23:53 +00002388 short pair, f, b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002389
Victor Stinner26486ea2010-05-15 22:23:53 +00002390 PyCursesInitialised;
2391 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002392
Victor Stinner26486ea2010-05-15 22:23:53 +00002393 if (PyTuple_Size(args) != 3) {
2394 PyErr_SetString(PyExc_TypeError, "init_pair requires 3 arguments");
2395 return NULL;
2396 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002397
Victor Stinner26486ea2010-05-15 22:23:53 +00002398 if (!PyArg_ParseTuple(args, "hhh;pair, f, b", &pair, &f, &b)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002399
Victor Stinner26486ea2010-05-15 22:23:53 +00002400 return PyCursesCheckERR(init_pair(pair, f, b), "init_pair");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002401}
2402
Andrew M. Kuchling32552682000-12-22 21:52:27 +00002403static PyObject *ModDict;
2404
Victor Stinner26486ea2010-05-15 22:23:53 +00002405static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002406PyCurses_InitScr(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002407{
Victor Stinner26486ea2010-05-15 22:23:53 +00002408 WINDOW *win;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002409 PyCursesWindowObject *winobj;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002410
Victor Stinner26486ea2010-05-15 22:23:53 +00002411 if (initialised == TRUE) {
2412 wrefresh(stdscr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002413 return (PyObject *)PyCursesWindow_New(stdscr, NULL);
Victor Stinner26486ea2010-05-15 22:23:53 +00002414 }
Guido van Rossum56bf2351994-08-31 22:06:24 +00002415
Victor Stinner26486ea2010-05-15 22:23:53 +00002416 win = initscr();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002417
Victor Stinner26486ea2010-05-15 22:23:53 +00002418 if (win == NULL) {
2419 PyErr_SetString(PyCursesError, catchall_NULL);
2420 return NULL;
2421 }
Guido van Rossum85738471995-02-17 13:50:17 +00002422
Victor Stinner26486ea2010-05-15 22:23:53 +00002423 initialised = initialised_setupterm = TRUE;
Guido van Rossum56bf2351994-08-31 22:06:24 +00002424
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002425/* This was moved from initcurses() because it core dumped on SGI,
2426 where they're not defined until you've called initscr() */
Victor Stinner26486ea2010-05-15 22:23:53 +00002427#define SetDictInt(string,ch) \
2428 do { \
2429 PyObject *o = PyLong_FromLong((long) (ch)); \
2430 if (o && PyDict_SetItemString(ModDict, string, o) == 0) { \
2431 Py_DECREF(o); \
2432 } \
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002433 } while (0)
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002434
Victor Stinner26486ea2010-05-15 22:23:53 +00002435 /* Here are some graphic symbols you can use */
2436 SetDictInt("ACS_ULCORNER", (ACS_ULCORNER));
2437 SetDictInt("ACS_LLCORNER", (ACS_LLCORNER));
2438 SetDictInt("ACS_URCORNER", (ACS_URCORNER));
2439 SetDictInt("ACS_LRCORNER", (ACS_LRCORNER));
2440 SetDictInt("ACS_LTEE", (ACS_LTEE));
2441 SetDictInt("ACS_RTEE", (ACS_RTEE));
2442 SetDictInt("ACS_BTEE", (ACS_BTEE));
2443 SetDictInt("ACS_TTEE", (ACS_TTEE));
2444 SetDictInt("ACS_HLINE", (ACS_HLINE));
2445 SetDictInt("ACS_VLINE", (ACS_VLINE));
2446 SetDictInt("ACS_PLUS", (ACS_PLUS));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00002447#if !defined(__hpux) || defined(HAVE_NCURSES_H)
Victor Stinner26486ea2010-05-15 22:23:53 +00002448 /* On HP/UX 11, these are of type cchar_t, which is not an
2449 integral type. If this is a problem on more platforms, a
2450 configure test should be added to determine whether ACS_S1
2451 is of integral type. */
2452 SetDictInt("ACS_S1", (ACS_S1));
2453 SetDictInt("ACS_S9", (ACS_S9));
2454 SetDictInt("ACS_DIAMOND", (ACS_DIAMOND));
2455 SetDictInt("ACS_CKBOARD", (ACS_CKBOARD));
2456 SetDictInt("ACS_DEGREE", (ACS_DEGREE));
2457 SetDictInt("ACS_PLMINUS", (ACS_PLMINUS));
2458 SetDictInt("ACS_BULLET", (ACS_BULLET));
2459 SetDictInt("ACS_LARROW", (ACS_LARROW));
2460 SetDictInt("ACS_RARROW", (ACS_RARROW));
2461 SetDictInt("ACS_DARROW", (ACS_DARROW));
2462 SetDictInt("ACS_UARROW", (ACS_UARROW));
2463 SetDictInt("ACS_BOARD", (ACS_BOARD));
2464 SetDictInt("ACS_LANTERN", (ACS_LANTERN));
2465 SetDictInt("ACS_BLOCK", (ACS_BLOCK));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00002466#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002467 SetDictInt("ACS_BSSB", (ACS_ULCORNER));
2468 SetDictInt("ACS_SSBB", (ACS_LLCORNER));
2469 SetDictInt("ACS_BBSS", (ACS_URCORNER));
2470 SetDictInt("ACS_SBBS", (ACS_LRCORNER));
2471 SetDictInt("ACS_SBSS", (ACS_RTEE));
2472 SetDictInt("ACS_SSSB", (ACS_LTEE));
2473 SetDictInt("ACS_SSBS", (ACS_BTEE));
2474 SetDictInt("ACS_BSSS", (ACS_TTEE));
2475 SetDictInt("ACS_BSBS", (ACS_HLINE));
2476 SetDictInt("ACS_SBSB", (ACS_VLINE));
2477 SetDictInt("ACS_SSSS", (ACS_PLUS));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002478
Victor Stinner26486ea2010-05-15 22:23:53 +00002479 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002480#ifdef ACS_S3
Victor Stinner26486ea2010-05-15 22:23:53 +00002481 SetDictInt("ACS_S3", (ACS_S3));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002482#endif
2483#ifdef ACS_S7
Victor Stinner26486ea2010-05-15 22:23:53 +00002484 SetDictInt("ACS_S7", (ACS_S7));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002485#endif
2486#ifdef ACS_LEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002487 SetDictInt("ACS_LEQUAL", (ACS_LEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002488#endif
2489#ifdef ACS_GEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002490 SetDictInt("ACS_GEQUAL", (ACS_GEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002491#endif
2492#ifdef ACS_PI
Victor Stinner26486ea2010-05-15 22:23:53 +00002493 SetDictInt("ACS_PI", (ACS_PI));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002494#endif
2495#ifdef ACS_NEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002496 SetDictInt("ACS_NEQUAL", (ACS_NEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002497#endif
2498#ifdef ACS_STERLING
Victor Stinner26486ea2010-05-15 22:23:53 +00002499 SetDictInt("ACS_STERLING", (ACS_STERLING));
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002500#endif
2501
Victor Stinner26486ea2010-05-15 22:23:53 +00002502 SetDictInt("LINES", LINES);
2503 SetDictInt("COLS", COLS);
Guido van Rossum56bf2351994-08-31 22:06:24 +00002504
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002505 winobj = (PyCursesWindowObject *)PyCursesWindow_New(win, NULL);
2506 screen_encoding = winobj->encoding;
2507 return (PyObject *)winobj;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002508}
2509
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002510static PyObject *
2511PyCurses_setupterm(PyObject* self, PyObject *args, PyObject* keywds)
2512{
Victor Stinner26486ea2010-05-15 22:23:53 +00002513 int fd = -1;
2514 int err;
2515 char* termstr = NULL;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002516
Victor Stinner26486ea2010-05-15 22:23:53 +00002517 static char *kwlist[] = {"term", "fd", NULL};
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002518
Victor Stinner26486ea2010-05-15 22:23:53 +00002519 if (!PyArg_ParseTupleAndKeywords(
2520 args, keywds, "|zi:setupterm", kwlist, &termstr, &fd)) {
2521 return NULL;
2522 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002523
Victor Stinner26486ea2010-05-15 22:23:53 +00002524 if (fd == -1) {
2525 PyObject* sys_stdout;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002526
Victor Stinnerbd303c12013-11-07 23:07:29 +01002527 sys_stdout = PySys_GetObject("stdout");
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002528
Victor Stinner26486ea2010-05-15 22:23:53 +00002529 if (sys_stdout == NULL || sys_stdout == Py_None) {
2530 PyErr_SetString(
2531 PyCursesError,
2532 "lost sys.stdout");
2533 return NULL;
2534 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002535
Victor Stinner26486ea2010-05-15 22:23:53 +00002536 fd = PyObject_AsFileDescriptor(sys_stdout);
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002537
Victor Stinner26486ea2010-05-15 22:23:53 +00002538 if (fd == -1) {
2539 return NULL;
2540 }
2541 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002542
Matthias Klose635edd12010-07-30 21:40:57 +00002543 if (!initialised_setupterm && setupterm(termstr,fd,&err) == ERR) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002544 char* s = "setupterm: unknown error";
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002545
Victor Stinner26486ea2010-05-15 22:23:53 +00002546 if (err == 0) {
2547 s = "setupterm: could not find terminal";
2548 } else if (err == -1) {
2549 s = "setupterm: could not find terminfo database";
2550 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002551
Victor Stinner26486ea2010-05-15 22:23:53 +00002552 PyErr_SetString(PyCursesError,s);
2553 return NULL;
2554 }
2555
2556 initialised_setupterm = TRUE;
2557
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002558 Py_RETURN_NONE;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002559}
Guido van Rossumf6971e21994-08-30 12:25:20 +00002560
2561static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002562PyCurses_IntrFlush(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002563{
Victor Stinner26486ea2010-05-15 22:23:53 +00002564 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002565
Victor Stinner26486ea2010-05-15 22:23:53 +00002566 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002567
Victor Stinner26486ea2010-05-15 22:23:53 +00002568 switch(PyTuple_Size(args)) {
2569 case 1:
2570 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
2571 break;
2572 default:
2573 PyErr_SetString(PyExc_TypeError, "intrflush requires 1 argument");
2574 return NULL;
2575 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002576
Victor Stinner26486ea2010-05-15 22:23:53 +00002577 return PyCursesCheckERR(intrflush(NULL,ch), "intrflush");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002578}
2579
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002580#ifdef HAVE_CURSES_IS_TERM_RESIZED
2581static PyObject *
2582PyCurses_Is_Term_Resized(PyObject *self, PyObject *args)
2583{
Victor Stinner26486ea2010-05-15 22:23:53 +00002584 int lines;
2585 int columns;
2586 int result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002587
Victor Stinner26486ea2010-05-15 22:23:53 +00002588 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002589
Victor Stinner26486ea2010-05-15 22:23:53 +00002590 if (!PyArg_ParseTuple(args,"ii:is_term_resized", &lines, &columns))
2591 return NULL;
2592 result = is_term_resized(lines, columns);
2593 if (result == TRUE) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002594 Py_RETURN_TRUE;
Victor Stinner26486ea2010-05-15 22:23:53 +00002595 } else {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002596 Py_RETURN_FALSE;
Victor Stinner26486ea2010-05-15 22:23:53 +00002597 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002598}
2599#endif /* HAVE_CURSES_IS_TERM_RESIZED */
2600
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002601static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002602PyCurses_KeyName(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002603{
Victor Stinner26486ea2010-05-15 22:23:53 +00002604 const char *knp;
2605 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002606
Victor Stinner26486ea2010-05-15 22:23:53 +00002607 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002608
Victor Stinner26486ea2010-05-15 22:23:53 +00002609 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002610
Victor Stinner26486ea2010-05-15 22:23:53 +00002611 if (ch < 0) {
2612 PyErr_SetString(PyExc_ValueError, "invalid key number");
2613 return NULL;
2614 }
2615 knp = keyname(ch);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002616
Serhiy Storchaka20b39b22014-09-28 11:27:24 +03002617 return PyBytes_FromString((knp == NULL) ? "" : knp);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002618}
2619
Victor Stinner26486ea2010-05-15 22:23:53 +00002620static PyObject *
2621PyCurses_KillChar(PyObject *self)
2622{
2623 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002624
Victor Stinner26486ea2010-05-15 22:23:53 +00002625 ch = killchar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002626
Victor Stinner26486ea2010-05-15 22:23:53 +00002627 return PyBytes_FromStringAndSize(&ch, 1);
2628}
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002629
2630static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002631PyCurses_Meta(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002632{
Victor Stinner26486ea2010-05-15 22:23:53 +00002633 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002634
Victor Stinner26486ea2010-05-15 22:23:53 +00002635 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002636
Victor Stinner26486ea2010-05-15 22:23:53 +00002637 switch(PyTuple_Size(args)) {
2638 case 1:
2639 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
2640 break;
2641 default:
2642 PyErr_SetString(PyExc_TypeError, "meta requires 1 argument");
2643 return NULL;
2644 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002645
Victor Stinner26486ea2010-05-15 22:23:53 +00002646 return PyCursesCheckERR(meta(stdscr, ch), "meta");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002647}
2648
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002649#ifdef NCURSES_MOUSE_VERSION
2650static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002651PyCurses_MouseInterval(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002652{
Victor Stinner26486ea2010-05-15 22:23:53 +00002653 int interval;
2654 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002655
Victor Stinner26486ea2010-05-15 22:23:53 +00002656 if (!PyArg_ParseTuple(args,"i;interval",&interval))
2657 return NULL;
2658 return PyCursesCheckERR(mouseinterval(interval), "mouseinterval");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002659}
2660
2661static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002662PyCurses_MouseMask(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002663{
Victor Stinner26486ea2010-05-15 22:23:53 +00002664 int newmask;
2665 mmask_t oldmask, availmask;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002666
Victor Stinner26486ea2010-05-15 22:23:53 +00002667 PyCursesInitialised;
2668 if (!PyArg_ParseTuple(args,"i;mousemask",&newmask))
2669 return NULL;
2670 availmask = mousemask(newmask, &oldmask);
2671 return Py_BuildValue("(ll)", (long)availmask, (long)oldmask);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002672}
2673#endif
2674
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002675static PyObject *
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002676PyCurses_Napms(PyObject *self, PyObject *args)
2677{
2678 int ms;
2679
Andrew M. Kuchling2b146762010-05-10 23:30:25 +00002680 PyCursesInitialised;
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002681 if (!PyArg_ParseTuple(args, "i;ms", &ms)) return NULL;
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002682
2683 return Py_BuildValue("i", napms(ms));
2684}
2685
2686
2687static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002688PyCurses_NewPad(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002689{
Victor Stinner26486ea2010-05-15 22:23:53 +00002690 WINDOW *win;
2691 int nlines, ncols;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002692
Victor Stinner26486ea2010-05-15 22:23:53 +00002693 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002694
Victor Stinner26486ea2010-05-15 22:23:53 +00002695 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002696
Victor Stinner26486ea2010-05-15 22:23:53 +00002697 win = newpad(nlines, ncols);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002698
Victor Stinner26486ea2010-05-15 22:23:53 +00002699 if (win == NULL) {
2700 PyErr_SetString(PyCursesError, catchall_NULL);
2701 return NULL;
2702 }
2703
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002704 return (PyObject *)PyCursesWindow_New(win, NULL);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002705}
2706
2707static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002708PyCurses_NewWindow(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002709{
Victor Stinner26486ea2010-05-15 22:23:53 +00002710 WINDOW *win;
2711 int nlines, ncols, begin_y=0, begin_x=0;
Guido van Rossum85738471995-02-17 13:50:17 +00002712
Victor Stinner26486ea2010-05-15 22:23:53 +00002713 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002714
Victor Stinner26486ea2010-05-15 22:23:53 +00002715 switch (PyTuple_Size(args)) {
2716 case 2:
2717 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols))
2718 return NULL;
2719 break;
2720 case 4:
2721 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
2722 &nlines,&ncols,&begin_y,&begin_x))
2723 return NULL;
2724 break;
2725 default:
2726 PyErr_SetString(PyExc_TypeError, "newwin requires 2 or 4 arguments");
2727 return NULL;
2728 }
Guido van Rossum85738471995-02-17 13:50:17 +00002729
Victor Stinner26486ea2010-05-15 22:23:53 +00002730 win = newwin(nlines,ncols,begin_y,begin_x);
2731 if (win == NULL) {
2732 PyErr_SetString(PyCursesError, catchall_NULL);
2733 return NULL;
2734 }
Guido van Rossum85738471995-02-17 13:50:17 +00002735
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002736 return (PyObject *)PyCursesWindow_New(win, NULL);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002737}
2738
2739static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002740PyCurses_Pair_Content(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002741{
Victor Stinner26486ea2010-05-15 22:23:53 +00002742 short pair,f,b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002743
Victor Stinner26486ea2010-05-15 22:23:53 +00002744 PyCursesInitialised;
2745 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002746
Victor Stinner26486ea2010-05-15 22:23:53 +00002747 switch(PyTuple_Size(args)) {
2748 case 1:
2749 if (!PyArg_ParseTuple(args, "h;pair", &pair)) return NULL;
2750 break;
2751 default:
2752 PyErr_SetString(PyExc_TypeError, "pair_content requires 1 argument");
2753 return NULL;
2754 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002755
Victor Stinner26486ea2010-05-15 22:23:53 +00002756 if (pair_content(pair, &f, &b)==ERR) {
2757 PyErr_SetString(PyCursesError,
2758 "Argument 1 was out of range. (1..COLOR_PAIRS-1)");
2759 return NULL;
2760 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002761
Victor Stinner26486ea2010-05-15 22:23:53 +00002762 return Py_BuildValue("(ii)", f, b);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002763}
2764
2765static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002766PyCurses_pair_number(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002767{
Victor Stinner26486ea2010-05-15 22:23:53 +00002768 int n;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002769
Victor Stinner26486ea2010-05-15 22:23:53 +00002770 PyCursesInitialised;
2771 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002772
Victor Stinner26486ea2010-05-15 22:23:53 +00002773 switch(PyTuple_Size(args)) {
2774 case 1:
2775 if (!PyArg_ParseTuple(args, "i;pairvalue", &n)) return NULL;
2776 break;
2777 default:
2778 PyErr_SetString(PyExc_TypeError,
2779 "pair_number requires 1 argument");
2780 return NULL;
2781 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002782
Victor Stinner26486ea2010-05-15 22:23:53 +00002783 return PyLong_FromLong((long) ((n & A_COLOR) >> 8));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002784}
2785
2786static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002787PyCurses_Putp(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002788{
Victor Stinner26486ea2010-05-15 22:23:53 +00002789 char *str;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002790
Victor Stinnerb3bc7e72011-11-03 20:35:40 +01002791 if (!PyArg_ParseTuple(args,"y;str", &str))
2792 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002793 return PyCursesCheckERR(putp(str), "putp");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002794}
2795
2796static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002797PyCurses_QiFlush(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002798{
Victor Stinner26486ea2010-05-15 22:23:53 +00002799 int flag = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002800
Victor Stinner26486ea2010-05-15 22:23:53 +00002801 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002802
Victor Stinner26486ea2010-05-15 22:23:53 +00002803 switch(PyTuple_Size(args)) {
2804 case 0:
2805 qiflush();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002806 Py_RETURN_NONE;
Victor Stinner26486ea2010-05-15 22:23:53 +00002807 case 1:
2808 if (!PyArg_ParseTuple(args, "i;True(1) or False(0)", &flag)) return NULL;
2809 if (flag) qiflush();
2810 else noqiflush();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002811 Py_RETURN_NONE;
Victor Stinner26486ea2010-05-15 22:23:53 +00002812 default:
2813 PyErr_SetString(PyExc_TypeError, "qiflush requires 0 or 1 arguments");
2814 return NULL;
2815 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002816}
2817
Guido van Rossumd8faa362007-04-27 19:54:29 +00002818/* Internal helper used for updating curses.LINES, curses.COLS, _curses.LINES
2819 * and _curses.COLS */
Benjamin Petersonfea6a942008-07-02 16:11:42 +00002820#if defined(HAVE_CURSES_RESIZETERM) || defined(HAVE_CURSES_RESIZE_TERM)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002821static int
2822update_lines_cols(void)
2823{
Victor Stinner26486ea2010-05-15 22:23:53 +00002824 PyObject *o;
2825 PyObject *m = PyImport_ImportModuleNoBlock("curses");
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002826 _Py_IDENTIFIER(LINES);
2827 _Py_IDENTIFIER(COLS);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002828
Victor Stinner26486ea2010-05-15 22:23:53 +00002829 if (!m)
2830 return 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002831
Victor Stinner26486ea2010-05-15 22:23:53 +00002832 o = PyLong_FromLong(LINES);
2833 if (!o) {
2834 Py_DECREF(m);
2835 return 0;
2836 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002837 if (_PyObject_SetAttrId(m, &PyId_LINES, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002838 Py_DECREF(m);
2839 Py_DECREF(o);
2840 return 0;
2841 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002842 /* PyId_LINES.object will be initialized here. */
2843 if (PyDict_SetItem(ModDict, PyId_LINES.object, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002844 Py_DECREF(m);
2845 Py_DECREF(o);
2846 return 0;
2847 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002848 Py_DECREF(o);
Victor Stinner26486ea2010-05-15 22:23:53 +00002849 o = PyLong_FromLong(COLS);
2850 if (!o) {
2851 Py_DECREF(m);
2852 return 0;
2853 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002854 if (_PyObject_SetAttrId(m, &PyId_COLS, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002855 Py_DECREF(m);
2856 Py_DECREF(o);
2857 return 0;
2858 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002859 if (PyDict_SetItem(ModDict, PyId_COLS.object, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002860 Py_DECREF(m);
2861 Py_DECREF(o);
2862 return 0;
2863 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002864 Py_DECREF(o);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002865 Py_DECREF(m);
Victor Stinner26486ea2010-05-15 22:23:53 +00002866 return 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002867}
Steve Dowerd2bc3892015-04-15 18:06:05 -04002868
2869static PyObject *
2870PyCurses_update_lines_cols(PyObject *self)
2871{
2872 return PyLong_FromLong((long) update_lines_cols());
2873}
2874
Benjamin Petersonfea6a942008-07-02 16:11:42 +00002875#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00002876
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002877#ifdef HAVE_CURSES_RESIZETERM
2878static PyObject *
2879PyCurses_ResizeTerm(PyObject *self, PyObject *args)
2880{
Victor Stinner26486ea2010-05-15 22:23:53 +00002881 int lines;
2882 int columns;
2883 PyObject *result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002884
Victor Stinner26486ea2010-05-15 22:23:53 +00002885 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002886
Victor Stinner26486ea2010-05-15 22:23:53 +00002887 if (!PyArg_ParseTuple(args,"ii:resizeterm", &lines, &columns))
2888 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002889
Victor Stinner26486ea2010-05-15 22:23:53 +00002890 result = PyCursesCheckERR(resizeterm(lines, columns), "resizeterm");
2891 if (!result)
2892 return NULL;
2893 if (!update_lines_cols())
2894 return NULL;
2895 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002896}
2897
2898#endif
2899
2900#ifdef HAVE_CURSES_RESIZE_TERM
2901static PyObject *
2902PyCurses_Resize_Term(PyObject *self, PyObject *args)
2903{
Victor Stinner26486ea2010-05-15 22:23:53 +00002904 int lines;
2905 int columns;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002906
Victor Stinner26486ea2010-05-15 22:23:53 +00002907 PyObject *result;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002908
Victor Stinner26486ea2010-05-15 22:23:53 +00002909 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002910
Victor Stinner26486ea2010-05-15 22:23:53 +00002911 if (!PyArg_ParseTuple(args,"ii:resize_term", &lines, &columns))
2912 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002913
Victor Stinner26486ea2010-05-15 22:23:53 +00002914 result = PyCursesCheckERR(resize_term(lines, columns), "resize_term");
2915 if (!result)
2916 return NULL;
2917 if (!update_lines_cols())
2918 return NULL;
2919 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002920}
2921#endif /* HAVE_CURSES_RESIZE_TERM */
2922
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002923#ifdef getsyx
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002924static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002925PyCurses_setsyx(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002926{
Victor Stinner26486ea2010-05-15 22:23:53 +00002927 int y,x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002928
Victor Stinner26486ea2010-05-15 22:23:53 +00002929 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002930
Victor Stinner26486ea2010-05-15 22:23:53 +00002931 if (PyTuple_Size(args)!=2) {
2932 PyErr_SetString(PyExc_TypeError, "setsyx requires 2 arguments");
2933 return NULL;
2934 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002935
Victor Stinner26486ea2010-05-15 22:23:53 +00002936 if (!PyArg_ParseTuple(args, "ii;y, x", &y, &x)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002937
Victor Stinner26486ea2010-05-15 22:23:53 +00002938 setsyx(y,x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002939
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002940 Py_RETURN_NONE;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002941}
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002942#endif
Guido van Rossumf6971e21994-08-30 12:25:20 +00002943
2944static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002945PyCurses_Start_Color(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002946{
Victor Stinner26486ea2010-05-15 22:23:53 +00002947 int code;
2948 PyObject *c, *cp;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002949
Victor Stinner26486ea2010-05-15 22:23:53 +00002950 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002951
Victor Stinner26486ea2010-05-15 22:23:53 +00002952 code = start_color();
2953 if (code != ERR) {
2954 initialisedcolors = TRUE;
2955 c = PyLong_FromLong((long) COLORS);
Christian Heimesa956e642013-07-26 14:45:37 +02002956 if (c == NULL)
2957 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002958 PyDict_SetItemString(ModDict, "COLORS", c);
2959 Py_DECREF(c);
2960 cp = PyLong_FromLong((long) COLOR_PAIRS);
Christian Heimesa956e642013-07-26 14:45:37 +02002961 if (cp == NULL)
2962 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002963 PyDict_SetItemString(ModDict, "COLOR_PAIRS", cp);
2964 Py_DECREF(cp);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002965 Py_RETURN_NONE;
Victor Stinner26486ea2010-05-15 22:23:53 +00002966 } else {
2967 PyErr_SetString(PyCursesError, "start_color() returned ERR");
2968 return NULL;
2969 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002970}
2971
2972static PyObject *
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002973PyCurses_tigetflag(PyObject *self, PyObject *args)
2974{
Victor Stinner26486ea2010-05-15 22:23:53 +00002975 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002976
Victor Stinner26486ea2010-05-15 22:23:53 +00002977 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002978
Victor Stinner26486ea2010-05-15 22:23:53 +00002979 if (!PyArg_ParseTuple(args, "s", &capname))
2980 return NULL;
2981
2982 return PyLong_FromLong( (long) tigetflag( capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002983}
2984
2985static PyObject *
2986PyCurses_tigetnum(PyObject *self, PyObject *args)
2987{
Victor Stinner26486ea2010-05-15 22:23:53 +00002988 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002989
Victor Stinner26486ea2010-05-15 22:23:53 +00002990 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002991
Victor Stinner26486ea2010-05-15 22:23:53 +00002992 if (!PyArg_ParseTuple(args, "s", &capname))
2993 return NULL;
2994
2995 return PyLong_FromLong( (long) tigetnum( capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002996}
2997
2998static PyObject *
2999PyCurses_tigetstr(PyObject *self, PyObject *args)
3000{
Victor Stinner26486ea2010-05-15 22:23:53 +00003001 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003002
Victor Stinner26486ea2010-05-15 22:23:53 +00003003 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003004
Victor Stinner26486ea2010-05-15 22:23:53 +00003005 if (!PyArg_ParseTuple(args, "s", &capname))
3006 return NULL;
3007
3008 capname = tigetstr( capname );
Serhiy Storchaka0b3ec192017-03-23 17:53:47 +02003009 if (capname == NULL || capname == (char*) -1) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003010 Py_RETURN_NONE;
Victor Stinner26486ea2010-05-15 22:23:53 +00003011 }
3012 return PyBytes_FromString( capname );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003013}
3014
3015static PyObject *
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003016PyCurses_tparm(PyObject *self, PyObject *args)
3017{
Victor Stinner26486ea2010-05-15 22:23:53 +00003018 char* fmt;
3019 char* result = NULL;
3020 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 +00003021
Victor Stinner26486ea2010-05-15 22:23:53 +00003022 PyCursesSetupTermCalled;
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003023
Victor Stinner26621332011-11-02 23:45:29 +01003024 if (!PyArg_ParseTuple(args, "y|iiiiiiiii:tparm",
Victor Stinner26486ea2010-05-15 22:23:53 +00003025 &fmt, &i1, &i2, &i3, &i4,
3026 &i5, &i6, &i7, &i8, &i9)) {
3027 return NULL;
3028 }
Michael W. Hudson21007982002-11-21 14:17:51 +00003029
Victor Stinner26486ea2010-05-15 22:23:53 +00003030 result = tparm(fmt,i1,i2,i3,i4,i5,i6,i7,i8,i9);
3031 if (!result) {
3032 PyErr_SetString(PyCursesError, "tparm() returned NULL");
3033 return NULL;
3034 }
Michael W. Hudson21007982002-11-21 14:17:51 +00003035
Victor Stinner26486ea2010-05-15 22:23:53 +00003036 return PyBytes_FromString(result);
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003037}
3038
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003039#ifdef HAVE_CURSES_TYPEAHEAD
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003040static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003041PyCurses_TypeAhead(PyObject *self, PyObject *args)
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003042{
Victor Stinner26486ea2010-05-15 22:23:53 +00003043 int fd;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003044
Victor Stinner26486ea2010-05-15 22:23:53 +00003045 PyCursesInitialised;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003046
Victor Stinner26486ea2010-05-15 22:23:53 +00003047 if (!PyArg_ParseTuple(args,"i;fd",&fd)) return NULL;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003048
Victor Stinner26486ea2010-05-15 22:23:53 +00003049 return PyCursesCheckERR(typeahead( fd ), "typeahead");
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003050}
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003051#endif
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003052
3053static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003054PyCurses_UnCtrl(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003055{
Victor Stinner26486ea2010-05-15 22:23:53 +00003056 PyObject *temp;
3057 chtype ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003058
Victor Stinner26486ea2010-05-15 22:23:53 +00003059 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003060
Victor Stinner26486ea2010-05-15 22:23:53 +00003061 if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003062
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003063 if (!PyCurses_ConvertToChtype(NULL, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00003064 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003065
Victor Stinner26486ea2010-05-15 22:23:53 +00003066 return PyBytes_FromString(unctrl(ch));
Guido van Rossumf6971e21994-08-30 12:25:20 +00003067}
3068
3069static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003070PyCurses_UngetCh(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003071{
Victor Stinner26486ea2010-05-15 22:23:53 +00003072 PyObject *temp;
3073 chtype ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003074
Victor Stinner26486ea2010-05-15 22:23:53 +00003075 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003076
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003077 if (!PyArg_ParseTuple(args,"O;ch or int",&temp))
Victor Stinner26486ea2010-05-15 22:23:53 +00003078 return NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003079
3080 if (!PyCurses_ConvertToChtype(NULL, temp, &ch))
3081 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003082
Victor Stinner26486ea2010-05-15 22:23:53 +00003083 return PyCursesCheckERR(ungetch(ch), "ungetch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00003084}
3085
Victor Stinner71e44cb2011-09-06 01:53:03 +02003086#ifdef HAVE_NCURSESW
3087/* Convert an object to a character (wchar_t):
3088
3089 - int
3090 - str of length 1
3091
3092 Return 1 on success, 0 on error. */
3093static int
3094PyCurses_ConvertToWchar_t(PyObject *obj,
3095 wchar_t *wch)
3096{
3097 if (PyUnicode_Check(obj)) {
3098 wchar_t buffer[2];
3099 if (PyUnicode_AsWideChar(obj, buffer, 2) != 1) {
3100 PyErr_Format(PyExc_TypeError,
3101 "expect bytes or str of length 1, or int, "
3102 "got a str of length %zi",
Victor Stinnerc4f281e2011-10-11 22:11:42 +02003103 PyUnicode_GET_LENGTH(obj));
Victor Stinner71e44cb2011-09-06 01:53:03 +02003104 return 0;
3105 }
3106 *wch = buffer[0];
3107 return 2;
3108 }
3109 else if (PyLong_CheckExact(obj)) {
3110 long value;
3111 int overflow;
3112 value = PyLong_AsLongAndOverflow(obj, &overflow);
3113 if (overflow) {
3114 PyErr_SetString(PyExc_OverflowError,
3115 "int doesn't fit in long");
3116 return 0;
3117 }
3118 *wch = (wchar_t)value;
3119 if ((long)*wch != value) {
3120 PyErr_Format(PyExc_OverflowError,
3121 "character doesn't fit in wchar_t");
3122 return 0;
3123 }
3124 return 1;
3125 }
3126 else {
3127 PyErr_Format(PyExc_TypeError,
3128 "expect bytes or str of length 1, or int, got %s",
3129 Py_TYPE(obj)->tp_name);
3130 return 0;
3131 }
3132}
3133
3134static PyObject *
3135PyCurses_Unget_Wch(PyObject *self, PyObject *args)
3136{
3137 PyObject *obj;
3138 wchar_t wch;
3139
3140 PyCursesInitialised;
3141
3142 if (!PyArg_ParseTuple(args,"O", &obj))
3143 return NULL;
3144
3145 if (!PyCurses_ConvertToWchar_t(obj, &wch))
3146 return NULL;
3147 return PyCursesCheckERR(unget_wch(wch), "unget_wch");
3148}
3149#endif
3150
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003151#ifdef HAVE_CURSES_TYPEAHEAD
Guido van Rossumf6971e21994-08-30 12:25:20 +00003152static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003153PyCurses_Use_Env(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003154{
Victor Stinner26486ea2010-05-15 22:23:53 +00003155 int flag;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003156
Victor Stinner26486ea2010-05-15 22:23:53 +00003157 switch(PyTuple_Size(args)) {
3158 case 1:
3159 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&flag))
3160 return NULL;
3161 break;
3162 default:
3163 PyErr_SetString(PyExc_TypeError, "use_env requires 1 argument");
3164 return NULL;
3165 }
3166 use_env(flag);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003167 Py_RETURN_NONE;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003168}
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003169#endif
Guido van Rossumf6971e21994-08-30 12:25:20 +00003170
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003171#ifndef STRICT_SYSV_CURSES
3172static PyObject *
3173PyCurses_Use_Default_Colors(PyObject *self)
3174{
Victor Stinner26486ea2010-05-15 22:23:53 +00003175 int code;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003176
Victor Stinner26486ea2010-05-15 22:23:53 +00003177 PyCursesInitialised;
3178 PyCursesInitialisedColor;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003179
Victor Stinner26486ea2010-05-15 22:23:53 +00003180 code = use_default_colors();
3181 if (code != ERR) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003182 Py_RETURN_NONE;
Victor Stinner26486ea2010-05-15 22:23:53 +00003183 } else {
3184 PyErr_SetString(PyCursesError, "use_default_colors() returned ERR");
3185 return NULL;
3186 }
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003187}
3188#endif /* STRICT_SYSV_CURSES */
3189
Guido van Rossumf6971e21994-08-30 12:25:20 +00003190/* List of functions defined in the module */
3191
3192static PyMethodDef PyCurses_methods[] = {
Victor Stinner26486ea2010-05-15 22:23:53 +00003193 {"baudrate", (PyCFunction)PyCurses_baudrate, METH_NOARGS},
3194 {"beep", (PyCFunction)PyCurses_beep, METH_NOARGS},
3195 {"can_change_color", (PyCFunction)PyCurses_can_change_color, METH_NOARGS},
3196 {"cbreak", (PyCFunction)PyCurses_cbreak, METH_VARARGS},
3197 {"color_content", (PyCFunction)PyCurses_Color_Content, METH_VARARGS},
3198 {"color_pair", (PyCFunction)PyCurses_color_pair, METH_VARARGS},
3199 {"curs_set", (PyCFunction)PyCurses_Curs_Set, METH_VARARGS},
3200 {"def_prog_mode", (PyCFunction)PyCurses_def_prog_mode, METH_NOARGS},
3201 {"def_shell_mode", (PyCFunction)PyCurses_def_shell_mode, METH_NOARGS},
3202 {"delay_output", (PyCFunction)PyCurses_Delay_Output, METH_VARARGS},
3203 {"doupdate", (PyCFunction)PyCurses_doupdate, METH_NOARGS},
3204 {"echo", (PyCFunction)PyCurses_echo, METH_VARARGS},
3205 {"endwin", (PyCFunction)PyCurses_endwin, METH_NOARGS},
3206 {"erasechar", (PyCFunction)PyCurses_EraseChar, METH_NOARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003207#ifdef HAVE_CURSES_FILTER
Victor Stinner26486ea2010-05-15 22:23:53 +00003208 {"filter", (PyCFunction)PyCurses_filter, METH_NOARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003209#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003210 {"flash", (PyCFunction)PyCurses_flash, METH_NOARGS},
3211 {"flushinp", (PyCFunction)PyCurses_flushinp, METH_NOARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003212#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003213 {"getmouse", (PyCFunction)PyCurses_GetMouse, METH_NOARGS},
3214 {"ungetmouse", (PyCFunction)PyCurses_UngetMouse, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003215#endif
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003216#ifdef getsyx
Victor Stinner26486ea2010-05-15 22:23:53 +00003217 {"getsyx", (PyCFunction)PyCurses_getsyx, METH_NOARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003218#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003219 {"getwin", (PyCFunction)PyCurses_GetWin, METH_O},
3220 {"has_colors", (PyCFunction)PyCurses_has_colors, METH_NOARGS},
3221 {"has_ic", (PyCFunction)PyCurses_has_ic, METH_NOARGS},
3222 {"has_il", (PyCFunction)PyCurses_has_il, METH_NOARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003223#ifdef HAVE_CURSES_HAS_KEY
Victor Stinner26486ea2010-05-15 22:23:53 +00003224 {"has_key", (PyCFunction)PyCurses_has_key, METH_VARARGS},
Guido van Rossumf6971e21994-08-30 12:25:20 +00003225#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003226 {"halfdelay", (PyCFunction)PyCurses_HalfDelay, METH_VARARGS},
3227 {"init_color", (PyCFunction)PyCurses_Init_Color, METH_VARARGS},
3228 {"init_pair", (PyCFunction)PyCurses_Init_Pair, METH_VARARGS},
3229 {"initscr", (PyCFunction)PyCurses_InitScr, METH_NOARGS},
3230 {"intrflush", (PyCFunction)PyCurses_IntrFlush, METH_VARARGS},
3231 {"isendwin", (PyCFunction)PyCurses_isendwin, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003232#ifdef HAVE_CURSES_IS_TERM_RESIZED
Victor Stinner26486ea2010-05-15 22:23:53 +00003233 {"is_term_resized", (PyCFunction)PyCurses_Is_Term_Resized, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003234#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003235 {"keyname", (PyCFunction)PyCurses_KeyName, METH_VARARGS},
Victor Stinner26486ea2010-05-15 22:23:53 +00003236 {"killchar", (PyCFunction)PyCurses_KillChar, METH_NOARGS},
3237 {"longname", (PyCFunction)PyCurses_longname, METH_NOARGS},
3238 {"meta", (PyCFunction)PyCurses_Meta, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003239#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003240 {"mouseinterval", (PyCFunction)PyCurses_MouseInterval, METH_VARARGS},
3241 {"mousemask", (PyCFunction)PyCurses_MouseMask, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003242#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003243 {"napms", (PyCFunction)PyCurses_Napms, METH_VARARGS},
3244 {"newpad", (PyCFunction)PyCurses_NewPad, METH_VARARGS},
3245 {"newwin", (PyCFunction)PyCurses_NewWindow, METH_VARARGS},
3246 {"nl", (PyCFunction)PyCurses_nl, METH_VARARGS},
3247 {"nocbreak", (PyCFunction)PyCurses_nocbreak, METH_NOARGS},
3248 {"noecho", (PyCFunction)PyCurses_noecho, METH_NOARGS},
3249 {"nonl", (PyCFunction)PyCurses_nonl, METH_NOARGS},
3250 {"noqiflush", (PyCFunction)PyCurses_noqiflush, METH_NOARGS},
3251 {"noraw", (PyCFunction)PyCurses_noraw, METH_NOARGS},
3252 {"pair_content", (PyCFunction)PyCurses_Pair_Content, METH_VARARGS},
3253 {"pair_number", (PyCFunction)PyCurses_pair_number, METH_VARARGS},
3254 {"putp", (PyCFunction)PyCurses_Putp, METH_VARARGS},
3255 {"qiflush", (PyCFunction)PyCurses_QiFlush, METH_VARARGS},
3256 {"raw", (PyCFunction)PyCurses_raw, METH_VARARGS},
3257 {"reset_prog_mode", (PyCFunction)PyCurses_reset_prog_mode, METH_NOARGS},
3258 {"reset_shell_mode", (PyCFunction)PyCurses_reset_shell_mode, METH_NOARGS},
3259 {"resetty", (PyCFunction)PyCurses_resetty, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003260#ifdef HAVE_CURSES_RESIZETERM
Victor Stinner26486ea2010-05-15 22:23:53 +00003261 {"resizeterm", (PyCFunction)PyCurses_ResizeTerm, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003262#endif
3263#ifdef HAVE_CURSES_RESIZE_TERM
Victor Stinner26486ea2010-05-15 22:23:53 +00003264 {"resize_term", (PyCFunction)PyCurses_Resize_Term, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003265#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003266 {"savetty", (PyCFunction)PyCurses_savetty, METH_NOARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003267#ifdef getsyx
Victor Stinner26486ea2010-05-15 22:23:53 +00003268 {"setsyx", (PyCFunction)PyCurses_setsyx, METH_VARARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003269#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003270 {"setupterm", (PyCFunction)PyCurses_setupterm,
3271 METH_VARARGS|METH_KEYWORDS},
3272 {"start_color", (PyCFunction)PyCurses_Start_Color, METH_NOARGS},
3273 {"termattrs", (PyCFunction)PyCurses_termattrs, METH_NOARGS},
3274 {"termname", (PyCFunction)PyCurses_termname, METH_NOARGS},
3275 {"tigetflag", (PyCFunction)PyCurses_tigetflag, METH_VARARGS},
3276 {"tigetnum", (PyCFunction)PyCurses_tigetnum, METH_VARARGS},
3277 {"tigetstr", (PyCFunction)PyCurses_tigetstr, METH_VARARGS},
3278 {"tparm", (PyCFunction)PyCurses_tparm, METH_VARARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003279#ifdef HAVE_CURSES_TYPEAHEAD
Victor Stinner26486ea2010-05-15 22:23:53 +00003280 {"typeahead", (PyCFunction)PyCurses_TypeAhead, METH_VARARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003281#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003282 {"unctrl", (PyCFunction)PyCurses_UnCtrl, METH_VARARGS},
3283 {"ungetch", (PyCFunction)PyCurses_UngetCh, METH_VARARGS},
Steve Dowerd2bc3892015-04-15 18:06:05 -04003284#if defined(HAVE_CURSES_RESIZETERM) || defined(HAVE_CURSES_RESIZE_TERM)
3285 {"update_lines_cols", (PyCFunction)PyCurses_update_lines_cols, METH_NOARGS},
3286#endif
Victor Stinner71e44cb2011-09-06 01:53:03 +02003287#ifdef HAVE_NCURSESW
3288 {"unget_wch", (PyCFunction)PyCurses_Unget_Wch, METH_VARARGS},
3289#endif
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003290#ifdef HAVE_CURSES_USE_ENV
Victor Stinner26486ea2010-05-15 22:23:53 +00003291 {"use_env", (PyCFunction)PyCurses_Use_Env, METH_VARARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003292#endif
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003293#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00003294 {"use_default_colors", (PyCFunction)PyCurses_Use_Default_Colors, METH_NOARGS},
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003295#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003296 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00003297};
3298
3299/* Initialization function for the module */
3300
Martin v. Löwis1a214512008-06-11 05:26:20 +00003301
3302static struct PyModuleDef _cursesmodule = {
Victor Stinner26486ea2010-05-15 22:23:53 +00003303 PyModuleDef_HEAD_INIT,
3304 "_curses",
3305 NULL,
3306 -1,
3307 PyCurses_methods,
3308 NULL,
3309 NULL,
3310 NULL,
3311 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00003312};
3313
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003314PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00003315PyInit__curses(void)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003316{
Victor Stinner26486ea2010-05-15 22:23:53 +00003317 PyObject *m, *d, *v, *c_api_object;
3318 static void *PyCurses_API[PyCurses_API_pointers];
Andrew M. Kuchling32552682000-12-22 21:52:27 +00003319
Victor Stinner26486ea2010-05-15 22:23:53 +00003320 /* Initialize object type */
3321 if (PyType_Ready(&PyCursesWindow_Type) < 0)
3322 return NULL;
Guido van Rossum6915c4d2001-01-19 00:28:08 +00003323
Victor Stinner26486ea2010-05-15 22:23:53 +00003324 /* Initialize the C API pointer array */
3325 PyCurses_API[0] = (void *)&PyCursesWindow_Type;
3326 PyCurses_API[1] = (void *)func_PyCursesSetupTermCalled;
3327 PyCurses_API[2] = (void *)func_PyCursesInitialised;
3328 PyCurses_API[3] = (void *)func_PyCursesInitialisedColor;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003329
Victor Stinner26486ea2010-05-15 22:23:53 +00003330 /* Create the module and add the functions */
3331 m = PyModule_Create(&_cursesmodule);
3332 if (m == NULL)
3333 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003334
Victor Stinner26486ea2010-05-15 22:23:53 +00003335 /* Add some symbolic constants to the module */
3336 d = PyModule_GetDict(m);
3337 if (d == NULL)
3338 return NULL;
3339 ModDict = d; /* For PyCurses_InitScr to use later */
Andrew M. Kuchling32552682000-12-22 21:52:27 +00003340
Victor Stinner26486ea2010-05-15 22:23:53 +00003341 /* Add a capsule for the C API */
3342 c_api_object = PyCapsule_New(PyCurses_API, PyCurses_CAPSULE_NAME, NULL);
3343 PyDict_SetItemString(d, "_C_API", c_api_object);
3344 Py_DECREF(c_api_object);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00003345
Victor Stinner26486ea2010-05-15 22:23:53 +00003346 /* For exception curses.error */
3347 PyCursesError = PyErr_NewException("_curses.error", NULL, NULL);
3348 PyDict_SetItemString(d, "error", PyCursesError);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00003349
Victor Stinner26486ea2010-05-15 22:23:53 +00003350 /* Make the version available */
3351 v = PyBytes_FromString(PyCursesVersion);
3352 PyDict_SetItemString(d, "version", v);
3353 PyDict_SetItemString(d, "__version__", v);
3354 Py_DECREF(v);
Guido van Rossumf6971e21994-08-30 12:25:20 +00003355
Victor Stinner26486ea2010-05-15 22:23:53 +00003356 SetDictInt("ERR", ERR);
3357 SetDictInt("OK", OK);
Andrew M. Kuchlingcaefb372000-12-26 15:57:01 +00003358
Victor Stinner26486ea2010-05-15 22:23:53 +00003359 /* Here are some attributes you can add to chars to print */
3360
3361 SetDictInt("A_ATTRIBUTES", A_ATTRIBUTES);
3362 SetDictInt("A_NORMAL", A_NORMAL);
3363 SetDictInt("A_STANDOUT", A_STANDOUT);
3364 SetDictInt("A_UNDERLINE", A_UNDERLINE);
3365 SetDictInt("A_REVERSE", A_REVERSE);
3366 SetDictInt("A_BLINK", A_BLINK);
3367 SetDictInt("A_DIM", A_DIM);
3368 SetDictInt("A_BOLD", A_BOLD);
3369 SetDictInt("A_ALTCHARSET", A_ALTCHARSET);
Victor Stinner26486ea2010-05-15 22:23:53 +00003370 SetDictInt("A_INVIS", A_INVIS);
Victor Stinner26486ea2010-05-15 22:23:53 +00003371 SetDictInt("A_PROTECT", A_PROTECT);
3372 SetDictInt("A_CHARTEXT", A_CHARTEXT);
3373 SetDictInt("A_COLOR", A_COLOR);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003374
Victor Stinner26486ea2010-05-15 22:23:53 +00003375 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003376#ifdef A_HORIZONTAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003377 SetDictInt("A_HORIZONTAL", A_HORIZONTAL);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003378#endif
3379#ifdef A_LEFT
Victor Stinner26486ea2010-05-15 22:23:53 +00003380 SetDictInt("A_LEFT", A_LEFT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003381#endif
3382#ifdef A_LOW
Victor Stinner26486ea2010-05-15 22:23:53 +00003383 SetDictInt("A_LOW", A_LOW);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003384#endif
3385#ifdef A_RIGHT
Victor Stinner26486ea2010-05-15 22:23:53 +00003386 SetDictInt("A_RIGHT", A_RIGHT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003387#endif
3388#ifdef A_TOP
Victor Stinner26486ea2010-05-15 22:23:53 +00003389 SetDictInt("A_TOP", A_TOP);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003390#endif
3391#ifdef A_VERTICAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003392 SetDictInt("A_VERTICAL", A_VERTICAL);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003393#endif
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00003394
Xiang Zhang116dd5e2017-06-16 11:20:07 +08003395 /* ncurses extension */
3396#ifdef A_ITALIC
3397 SetDictInt("A_ITALIC", A_ITALIC);
3398#endif
3399
Victor Stinner26486ea2010-05-15 22:23:53 +00003400 SetDictInt("COLOR_BLACK", COLOR_BLACK);
3401 SetDictInt("COLOR_RED", COLOR_RED);
3402 SetDictInt("COLOR_GREEN", COLOR_GREEN);
3403 SetDictInt("COLOR_YELLOW", COLOR_YELLOW);
3404 SetDictInt("COLOR_BLUE", COLOR_BLUE);
3405 SetDictInt("COLOR_MAGENTA", COLOR_MAGENTA);
3406 SetDictInt("COLOR_CYAN", COLOR_CYAN);
3407 SetDictInt("COLOR_WHITE", COLOR_WHITE);
Guido van Rossumf6971e21994-08-30 12:25:20 +00003408
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003409#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003410 /* Mouse-related constants */
3411 SetDictInt("BUTTON1_PRESSED", BUTTON1_PRESSED);
3412 SetDictInt("BUTTON1_RELEASED", BUTTON1_RELEASED);
3413 SetDictInt("BUTTON1_CLICKED", BUTTON1_CLICKED);
3414 SetDictInt("BUTTON1_DOUBLE_CLICKED", BUTTON1_DOUBLE_CLICKED);
3415 SetDictInt("BUTTON1_TRIPLE_CLICKED", BUTTON1_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003416
Victor Stinner26486ea2010-05-15 22:23:53 +00003417 SetDictInt("BUTTON2_PRESSED", BUTTON2_PRESSED);
3418 SetDictInt("BUTTON2_RELEASED", BUTTON2_RELEASED);
3419 SetDictInt("BUTTON2_CLICKED", BUTTON2_CLICKED);
3420 SetDictInt("BUTTON2_DOUBLE_CLICKED", BUTTON2_DOUBLE_CLICKED);
3421 SetDictInt("BUTTON2_TRIPLE_CLICKED", BUTTON2_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003422
Victor Stinner26486ea2010-05-15 22:23:53 +00003423 SetDictInt("BUTTON3_PRESSED", BUTTON3_PRESSED);
3424 SetDictInt("BUTTON3_RELEASED", BUTTON3_RELEASED);
3425 SetDictInt("BUTTON3_CLICKED", BUTTON3_CLICKED);
3426 SetDictInt("BUTTON3_DOUBLE_CLICKED", BUTTON3_DOUBLE_CLICKED);
3427 SetDictInt("BUTTON3_TRIPLE_CLICKED", BUTTON3_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003428
Victor Stinner26486ea2010-05-15 22:23:53 +00003429 SetDictInt("BUTTON4_PRESSED", BUTTON4_PRESSED);
3430 SetDictInt("BUTTON4_RELEASED", BUTTON4_RELEASED);
3431 SetDictInt("BUTTON4_CLICKED", BUTTON4_CLICKED);
3432 SetDictInt("BUTTON4_DOUBLE_CLICKED", BUTTON4_DOUBLE_CLICKED);
3433 SetDictInt("BUTTON4_TRIPLE_CLICKED", BUTTON4_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003434
Victor Stinner26486ea2010-05-15 22:23:53 +00003435 SetDictInt("BUTTON_SHIFT", BUTTON_SHIFT);
3436 SetDictInt("BUTTON_CTRL", BUTTON_CTRL);
3437 SetDictInt("BUTTON_ALT", BUTTON_ALT);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003438
Victor Stinner26486ea2010-05-15 22:23:53 +00003439 SetDictInt("ALL_MOUSE_EVENTS", ALL_MOUSE_EVENTS);
3440 SetDictInt("REPORT_MOUSE_POSITION", REPORT_MOUSE_POSITION);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003441#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003442 /* Now set everything up for KEY_ variables */
3443 {
3444 int key;
3445 char *key_n;
3446 char *key_n2;
Victor Stinner26486ea2010-05-15 22:23:53 +00003447 for (key=KEY_MIN;key < KEY_MAX; key++) {
3448 key_n = (char *)keyname(key);
3449 if (key_n == NULL || strcmp(key_n,"UNKNOWN KEY")==0)
3450 continue;
3451 if (strncmp(key_n,"KEY_F(",6)==0) {
3452 char *p1, *p2;
Victor Stinnerb6404912013-07-07 16:21:41 +02003453 key_n2 = PyMem_Malloc(strlen(key_n)+1);
Victor Stinner26486ea2010-05-15 22:23:53 +00003454 if (!key_n2) {
3455 PyErr_NoMemory();
3456 break;
3457 }
3458 p1 = key_n;
3459 p2 = key_n2;
3460 while (*p1) {
3461 if (*p1 != '(' && *p1 != ')') {
3462 *p2 = *p1;
3463 p2++;
3464 }
3465 p1++;
3466 }
3467 *p2 = (char)0;
3468 } else
3469 key_n2 = key_n;
3470 SetDictInt(key_n2,key);
3471 if (key_n2 != key_n)
Victor Stinnerb6404912013-07-07 16:21:41 +02003472 PyMem_Free(key_n2);
Victor Stinner26486ea2010-05-15 22:23:53 +00003473 }
Victor Stinner26486ea2010-05-15 22:23:53 +00003474 SetDictInt("KEY_MIN", KEY_MIN);
3475 SetDictInt("KEY_MAX", KEY_MAX);
3476 }
3477 return m;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003478}